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}