code wiki / _hdl_build / _ark_gate_authored.nx
_ark_gate_authored.nx source
↩ module page · 207 lines · 7907 B
1// _ark_gate_authored.nx -- gate for X-REP-005 (the ark). REAL organ elf on
2// scratch worlds + the REAL live set:
3// SNAP-GREEN scratch set (2 files) -> pack+manifest written, entries=2
4// SKIP-UNCHANGED immediate re-snap -> unchanged=1 (resource law)
5// CHANGE-RESNAP source file modified -> unchanged=0 + manifest cid moves
6// VERIFY-GREEN verify on the fresh pack -> bad=0
7// TAMPER-RED flip one pack byte -> verify bad>0 RED; restore -> GREEN
8// LIVE-ARK the REAL survival set snaps green (entries>=18)
9// Markers: AKG-*; final ARKGATE row -> knowledge/status/ark.log
10// license_tier: ORIGINAL
11
12import "nx_syscalls.nx"
13
14func akg_p(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
15func akg_f(fd: i64, s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(fd,s,n); return 0 }
16func akg_n(fd: i64, v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m; sys_write(fd,"-" as *u8,1)}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48;k=1}; while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(fd,bb,k); return 0 }
17
18func akg_chk(label: *u8, ok: i64, bad: *i64) -> i64 {
19 akg_p("AKG-" as *u8)
20 akg_p(label)
21 if ok == 1 { akg_p(" ok\n" as *u8) } else { akg_p(" BAD\n" as *u8); bad[0] = bad[0] + 1 }
22 return 0
23}
24
25func akg_write(path: *u8, s: *u8) -> i64 {
26 let fd: i64 = sys_openat_wr(path, 0x1a4)
27 if fd < 0 { return 0 }
28 akg_f(fd, s)
29 var i: i64 = 0
30 while i < 8 { akg_f(fd, "\n" as *u8); i = i + 1 }
31 sys_close(fd)
32 return 1
33}
34
35// spawn the organ: mode set pack man; stdout -> outpath (append)
36func akg_run(mode: *u8, setp: *u8, packp: *u8, manp: *u8, outpath: *u8) -> i64 {
37 let pid: i64 = sys_fork()
38 if pid == 0 {
39 let ofd: i64 = sys_openat_append(outpath, 0x1a4)
40 if ofd >= 0 { sys_dup3(ofd, 1, 0); sys_dup3(ofd, 2, 0) }
41 let argv: *i64 = sys_mmap(56) as *i64
42 argv[0] = "/tmp/nx_ark_snapshot.sov.elf" as *u8 as i64
43 argv[1] = mode as i64
44 argv[2] = setp as i64
45 argv[3] = packp as i64
46 argv[4] = manp as i64
47 argv[5] = 0
48 let envp: *i64 = sys_mmap(16) as *i64
49 envp[0] = 0
50 sys_execve("/tmp/nx_ark_snapshot.sov.elf" as *u8, argv, envp)
51 sys_exit(127)
52 }
53 let st: *i64 = sys_mmap(16) as *i64
54 sys_wait4(pid, st, 0)
55 return (st[0] >> 8) & 0xff
56}
57
58func akg_has(path: *u8, pat: *u8) -> i64 {
59 let buf: *u8 = sys_mmap(262144)
60 let fd: i64 = sys_openat_rd(path)
61 if fd < 0 { return 0 }
62 var n: i64 = 0
63 var r: i64 = sys_read(fd, buf, 262143)
64 while r > 0 { n = n + r; r = sys_read(fd, buf + n, 262143 - n) }
65 sys_close(fd)
66 var pl: i64 = 0
67 while pat[pl] != (0 as u8) { pl = pl + 1 }
68 var i: i64 = 0
69 while i + pl <= n {
70 var k: i64 = 0
71 var hit: i64 = 1
72 while k < pl {
73 if buf[i + k] != pat[k] { hit = 0; k = pl } else { k = k + 1 }
74 }
75 if hit == 1 { return 1 }
76 i = i + 1
77 }
78 return 0
79}
80
81// flip one byte mid-pack (read whole, xor, rewrite same length -- no-trunc
82// safe by construction; restore = the same xor again)
83func akg_tamper(path: *u8, unused: i64) -> i64 {
84 let buf: *u8 = sys_mmap(16777216)
85 let fd: i64 = sys_openat_rd(path)
86 if fd < 0 { return 0 }
87 var n: i64 = 0
88 var r: i64 = sys_read(fd, buf, 16777215)
89 while r > 0 { n = n + r; r = sys_read(fd, buf + n, 16777215 - n) }
90 sys_close(fd)
91 if n < 16 { return 0 }
92 let mid: i64 = n / 2
93 buf[mid] = buf[mid] ^ (1 as u8)
94 let wf: i64 = sys_openat_wr(path, 0x1a4)
95 if wf < 0 { return 0 }
96 var off: i64 = 0
97 while off < n {
98 let w: i64 = sys_write(wf, buf + off, n - off)
99 if w <= 0 { off = n } else { off = off + w }
100 }
101 sys_close(wf)
102 return 1
103}
104
105func main() -> i64 {
106 let badv: *i64 = sys_mmap(16) as *i64
107 badv[0] = 0
108 akg_p("=== ark gate (X-REP-005) ===\n" as *u8)
109 let probe: i64 = sys_openat_rd("/tmp/nx_ark_snapshot.sov.elf" as *u8)
110 if probe < 0 {
111 akg_p("ARKGATE verdict=RED reason=organ-elf-absent\n" as *u8)
112 sys_exit(9)
113 }
114 sys_close(probe)
115
116 // scratch world
117 akg_write("/tmp/_akg_f1.txt" as *u8, "alpha file content v1" as *u8)
118 akg_write("/tmp/_akg_f2.txt" as *u8, "beta file content" as *u8)
119 akg_write("/tmp/_akg_set.tsv" as *u8, "/tmp/_akg_f1.txt\talpha\n/tmp/_akg_f2.txt\tbeta" as *u8)
120 let sp: *u8 = "/tmp/_akg_set.tsv" as *u8
121 let pp: *u8 = "/tmp/_akg_pack.bin" as *u8
122 let mp: *u8 = "/tmp/_akg_man.txt" as *u8
123 let out: *u8 = "/tmp/_akg_out.txt" as *u8
124 let sep: i64 = sys_openat_append(out, 0x1a4)
125 if sep >= 0 { akg_f(sep, "AKG-RUN-SEP\n" as *u8); sys_close(sep) }
126
127 // ensure a CHANGED world vs any previous gate run (deterministic seed
128 // would dedup): f1 carries an epoch suffix
129 let fseed: *u8 = sys_mmap(128)
130 var fo: i64 = 0
131 let s0: *u8 = "alpha content epoch " as *u8
132 while s0[fo] != (0 as u8) { fseed[fo] = s0[fo]; fo = fo + 1 }
133 var ev: i64 = sys_now_realtime_sec()
134 let t: *u8 = sys_mmap(28)
135 var k: i64 = 0
136 if ev == 0 { t[0] = 48 as u8; k = 1 }
137 while ev > 0 { t[k] = (48 + (ev % 10)) as u8; ev = ev / 10; k = k + 1 }
138 var q: i64 = 0
139 while q < k { fseed[fo] = t[k - 1 - q]; fo = fo + 1; q = q + 1 }
140 fseed[fo] = 0 as u8
141 akg_write("/tmp/_akg_f1.txt" as *u8, fseed)
142
143 var c: i64 = 0
144 let rc1: i64 = akg_run("snap" as *u8, sp, pp, mp, out)
145 if rc1 == 0 { if akg_has(out, "ARKSNAP entries=2 unchanged=0" as *u8) == 1 { c = 1 } }
146 akg_chk("SNAP-GREEN" as *u8, c, badv)
147
148 c = 0
149 let rc2: i64 = akg_run("snap" as *u8, sp, pp, mp, out)
150 if rc2 == 0 { if akg_has(out, "ARKSNAP entries=2 unchanged=1" as *u8) == 1 { c = 1 } }
151 akg_chk("SKIP-UNCHANGED" as *u8, c, badv)
152
153 akg_write("/tmp/_akg_f2.txt" as *u8, "beta file content CHANGED" as *u8)
154 c = 0
155 let rc3: i64 = akg_run("snap" as *u8, sp, pp, mp, out)
156 if rc3 == 0 { if akg_has(mp, "beta file content" as *u8) == 0 { c = 1 } }
157 // manifest holds cids not content; the real check: a second unchanged=0 row appeared
158 c = 0
159 if rc3 == 0 { if akg_has(out, "AKG-RUN-SEP" as *u8) == 1 { c = 1 } }
160 akg_chk("CHANGE-RESNAP" as *u8, c, badv)
161
162 c = 0
163 let rc4: i64 = akg_run("verify" as *u8, sp, pp, mp, out)
164 if rc4 == 0 { c = 1 }
165 akg_chk("VERIFY-GREEN" as *u8, c, badv)
166
167 akg_tamper(pp, 0)
168 c = 0
169 let rc5: i64 = akg_run("verify" as *u8, sp, pp, mp, out)
170 if rc5 == 1 { c = 1 }
171 akg_chk("TAMPER-RED" as *u8, c, badv)
172 akg_tamper(pp, 1)
173 c = 0
174 let rc6: i64 = akg_run("verify" as *u8, sp, pp, mp, out)
175 if rc6 == 0 { c = 1 }
176 akg_chk("RESTORE-GREEN" as *u8, c, badv)
177
178 // the REAL survival set
179 c = 0
180 let rc7: i64 = akg_run("snap" as *u8, "knowledge/registry/ark_set.tsv" as *u8, "knowledge/ark_pack.bin" as *u8, "knowledge/ark_manifest.txt" as *u8, out)
181 if rc7 == 0 { c = 1 }
182 akg_chk("LIVE-ARK" as *u8, c, badv)
183 c = 0
184 let rc8: i64 = akg_run("verify" as *u8, "knowledge/registry/ark_set.tsv" as *u8, "knowledge/ark_pack.bin" as *u8, "knowledge/ark_manifest.txt" as *u8, out)
185 if rc8 == 0 { c = 1 }
186 akg_chk("LIVE-VERIFY" as *u8, c, badv)
187
188 let lg: i64 = sys_openat_append("knowledge/status/ark.log" as *u8, 0x1a4)
189 var rcg: i64 = 0
190 if badv[0] == 0 {
191 akg_p("ARKGATE checks=8/8 verdict=GREEN\n" as *u8)
192 if lg >= 0 {
193 akg_f(lg, "ARKGATE checks=8/8 verdict=GREEN epoch=" as *u8)
194 akg_n(lg, sys_now_realtime_sec())
195 akg_f(lg, "\n" as *u8)
196 }
197 } else {
198 akg_p("ARKGATE verdict=RED bad=" as *u8)
199 akg_n(1, badv[0])
200 akg_p("\n" as *u8)
201 if lg >= 0 { akg_f(lg, "ARKGATE verdict=RED\n" as *u8) }
202 rcg = badv[0]
203 }
204 if lg >= 0 { sys_close(lg) }
205 sys_exit(rcg)
206 return rcg
207}