code wiki / _hdl_build / nx_lane_attest_gate.nx

nx_lane_attest_gate.nx source

↩ module page · 154 lines · 5878 B

1// nx_lane_attest_gate.nx -- GATE for the closure attestor (5 teeth, 3 negative controls). 2// PREREQ: stage _offc/nx_lane_attest.elf. Run from nxc2 root. One attestor fork per tooth via 3// SELF-EXEC CHAIN (argv = [self] [stage] [pass]). 4// T1 fresh+complete+over-min ledger ATTESTED | T2 NEG stale ledger (rows older than maxage) 5// REFUSED | T3 NEG missing-episode REFUSED | T4 NEG below-min REFUSED | T5 empty ledger REFUSED. 6// license_tier: ORIGINAL No hw writes (Rule 26). 7import "nx_seat_drive_lib.nx" 8import "nx_seg_store.nx" 9import "nx_deploy_lib.nx" 10import "nx_syscalls.nx" 11 12func lg_atoi(s: *u8) -> i64 { 13 var v: i64 = 0 14 var i: i64 = 0 15 while s[i] != (0 as u8) { 16 let c: i64 = s[i] as i64 17 if c >= 48 { if c <= 57 { v = v * 10 + (c - 48) } } 18 i = i + 1 19 } 20 return v 21} 22 23func lg_itoa(dst: *u8, v: i64) -> i64 { 24 var m: i64 = v 25 let t: *u8 = sys_mmap(24) 26 var k: i64 = 0 27 if m == 0 { t[0] = 48 as u8; k = 1 } 28 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 29 var i: i64 = 0 30 while i < k { dst[i] = t[k - 1 - i]; i = i + 1 } 31 dst[k] = 0 as u8 32 return k 33} 34 35func lg_len(s: *u8) -> i64 { 36 var n: i64 = 0 37 while s[n] != (0 as u8) { n = n + 1 } 38 return n 39} 40 41// build a 2-row ledger with the given ts into path 42func lg_mkledger(path: *u8, ts: i64, rows: i64) -> i64 { 43 let b: *u8 = sys_mmap(4096) 44 var o: i64 = 0 45 if rows >= 1 { 46 o = sd_cat(b, o, "AUTOFIX-AUTO ts=" as *u8) 47 o = sd_num(b, o, ts) 48 o = sd_cat(b, o, " cand=ep_alpha located=f attempts=1 maker=GREEN revert=1 symj=GREEN\n" as *u8) 49 } 50 if rows >= 2 { 51 o = sd_cat(b, o, "AUTOFIX-AUTO ts=" as *u8) 52 o = sd_num(b, o, ts) 53 o = sd_cat(b, o, " cand=ep_bravo located=g attempts=1 maker=GREEN revert=1 symj=GREEN\n" as *u8) 54 } 55 ss_writefile(path, b, o) 56 return 0 57} 58 59func lg_mkconf(path: *u8, ledger: *u8, minv: i64) -> i64 { 60 let b: *u8 = sys_mmap(2048) 61 var o: i64 = 0 62 o = sd_cat(b, o, "ledger=" as *u8) 63 o = sd_cat(b, o, ledger) 64 o = sd_cat(b, o, "\nmanifest=/tmp/lag_man.txt\nmin=" as *u8) 65 o = sd_num(b, o, minv) 66 o = sd_cat(b, o, "\nmaxage=3600\n" as *u8) 67 ss_writefile(path, b, o) 68 return 0 69} 70 71func lg_run(confp: *u8, outp: *u8) -> i64 { 72 let av: *i64 = sys_mmap(32) as *i64 73 av[0] = confp as i64 74 return dep_run_capture("_offc/nx_lane_attest.elf" as *u8, av, 1, outp) 75} 76 77func main(argc: i64, argv: *i64) -> i64 { 78 var stage: i64 = 1 79 var pass: i64 = 0 80 if argc >= 2 { let ss1: *u8 = argv[1] as *u8; stage = lg_atoi(ss1) } 81 if argc >= 3 { let ps: *u8 = argv[2] as *u8; pass = lg_atoi(ps) } 82 if stage < 1 { stage = 1 } 83 let now: i64 = sys_now_realtime_sec() 84 let man: *u8 = "ep_alpha|runtime/ep_alpha.nx\nep_bravo|runtime/ep_bravo.nx\n" as *u8 85 ss_writefile("/tmp/lag_man.txt" as *u8, man, lg_len(man)) 86 87 if stage == 1 { 88 lg_mkledger("/tmp/lag_l1.ledger" as *u8, now - 10, 2) 89 lg_mkconf("/tmp/lag_t1.conf" as *u8, "/tmp/lag_l1.ledger" as *u8, 2) 90 let rc: i64 = lg_run("/tmp/lag_t1.conf" as *u8, "/tmp/lag_t1.out" as *u8) 91 if rc == 0 { sd_w("T1 fresh-complete-attested PASS\n" as *u8); pass = pass + 1 } else { sd_w("T1 fresh-complete-attested FAIL\n" as *u8) } 92 } 93 if stage == 2 { 94 lg_mkledger("/tmp/lag_l2.ledger" as *u8, now - 8000, 2) 95 lg_mkconf("/tmp/lag_t2.conf" as *u8, "/tmp/lag_l2.ledger" as *u8, 2) 96 let rc: i64 = lg_run("/tmp/lag_t2.conf" as *u8, "/tmp/lag_t2.out" as *u8) 97 if rc == 1 { sd_w("T2 neg-stale-refused PASS\n" as *u8); pass = pass + 1 } else { sd_w("T2 neg-stale-refused FAIL\n" as *u8) } 98 } 99 if stage == 3 { 100 lg_mkledger("/tmp/lag_l3.ledger" as *u8, now - 10, 1) 101 lg_mkconf("/tmp/lag_t3.conf" as *u8, "/tmp/lag_l3.ledger" as *u8, 1) 102 let rc: i64 = lg_run("/tmp/lag_t3.conf" as *u8, "/tmp/lag_t3.out" as *u8) 103 let out: *u8 = sys_mmap(65536) 104 let n: i64 = dp_read("/tmp/lag_t3.out" as *u8, out, 65536) 105 var ok: i64 = 0 106 if rc == 1 { if sd_count(out, n, "MISSING-EPISODE cand=ep_bravo" as *u8) == 1 { ok = 1 } } 107 if ok == 1 { sd_w("T3 neg-missing-episode-refused PASS\n" as *u8); pass = pass + 1 } else { sd_w("T3 neg-missing-episode-refused FAIL\n" as *u8) } 108 } 109 if stage == 4 { 110 lg_mkledger("/tmp/lag_l4.ledger" as *u8, now - 10, 2) 111 lg_mkconf("/tmp/lag_t4.conf" as *u8, "/tmp/lag_l4.ledger" as *u8, 3) 112 let rc: i64 = lg_run("/tmp/lag_t4.conf" as *u8, "/tmp/lag_t4.out" as *u8) 113 if rc == 1 { sd_w("T4 neg-below-min-refused PASS\n" as *u8); pass = pass + 1 } else { sd_w("T4 neg-below-min-refused FAIL\n" as *u8) } 114 } 115 if stage == 5 { 116 sys_unlinkat("/tmp/lag_l5.ledger" as *u8) 117 lg_mkconf("/tmp/lag_t5.conf" as *u8, "/tmp/lag_l5.ledger" as *u8, 1) 118 let rc: i64 = lg_run("/tmp/lag_t5.conf" as *u8, "/tmp/lag_t5.out" as *u8) 119 if rc == 1 { sd_w("T5 empty-ledger-refused PASS\n" as *u8); pass = pass + 1 } else { sd_w("T5 empty-ledger-refused FAIL\n" as *u8) } 120 } 121 122 if stage >= 5 { 123 sd_w("NX-LANE-ATTEST-GATE pass=" as *u8) 124 let pb: *u8 = sys_mmap(8) 125 pb[0] = (48 + pass) as u8 126 pb[1] = 0 as u8 127 sd_w(pb) 128 if pass == 5 { 129 sd_w("/5 verdict=GREEN\n" as *u8) 130 sys_exit(0) 131 return 0 132 } 133 sd_w("/5 verdict=RED\n" as *u8) 134 sys_exit(1) 135 return 1 136 } 137 138 let self: *u8 = argv[0] as *u8 139 let sb: *u8 = sys_mmap(24) 140 lg_itoa(sb, stage + 1) 141 let pb2: *u8 = sys_mmap(24) 142 lg_itoa(pb2, pass) 143 let nav: *i64 = sys_mmap(40) as *i64 144 nav[0] = self as i64 145 nav[1] = sb as i64 146 nav[2] = pb2 as i64 147 nav[3] = 0 148 let envp: *i64 = sys_mmap(16) as *i64 149 envp[0] = 0 150 sys_execve(self, nav, envp) 151 sd_w("LAG-EXEC-FAIL\n" as *u8) 152 sys_exit(1) 153 return 1 154}