code wiki / _hdl_build / nx_spore_germ_gate.nx
nx_spore_germ_gate.nx source
↩ module page · 203 lines · 9791 B
1// nx_spore_germ_gate.nx -- V-SPORE-1 PROOF (X-SEED-002): germinate ONE ecosystem piece
2// from its content-addressed manifest entry and prove it by BEHAVIOR (KAT exit code).
3// A tampered piece is rejected on the INTEGRITY gate and is NEVER built or run.
4//
5// Per NISHI_SPORE_SEED_PORTABILITY_CHARTER germination loop (1:1 PROOF, KAT-as-oracle):
6// 1. PACK -- manifest entry = FNV-1a(canonical piece bytes) + kat_expect exit code.
7// 2. INTEGRITY -- received bytes FNV-1a == manifest hash, else REJECT (never run).
8// 3. MATERIALIZE-- write the VERIFIED bytes to runtime/_germ_scratch_<piece>.nx so the
9// piece's imports resolve via the normal runtime/ tree exactly as the
10// canonical organ's do. Fully isolated-dir germination needs explicit
11// import closures (charter [F2]) = the named follow-on V-SPORE-1b.
12// 4. REBUILD -- the SOVEREIGN toolchain rebuilds the materialized bytes via
13// _offc/nx_sov_build_run.elf (nx_cc_sovereign + nxasm, empty-.s guard).
14// 5. BEHAVIOR -- fork/exec the rebuilt ELF; exit code == manifest kat_expect = 1:1 proof.
15// ADMIT iff INTEGRITY-clean AND rebuild rc==0 AND kat_exit==kat_expect.
16//
17// Controls: POSITIVE = intact nx_exit42 piece -> ADMITTED (kat_exit 42).
18// NEGATIVE = same piece, one byte flipped -> INTEGRITY mismatch -> REJECTED,
19// build+run NEVER reached (admitted count must remain exactly 1).
20//
21// RUN FROM the nxc2 cwd (relative _offc/ runtime/ knowledge/ paths).
22// Build: _offc/nx_sov_build_run.elf nx_spore_germ_gate -> /tmp/nx_spore_germ_gate.sov.elf
23// Verdict line is appended to knowledge/status/spore_germ.log.
24//
25// genealogy_id: nishi_spore_seed_portability_charter_2026-05-28 (X-SEED-002 / V-SPORE-1)
26// lineage_id: spore_germ_proof_v1
27
28import "nx_syscalls.nx"
29
30// ---- FNV-1a over a byte buffer (inlined; matches nx_germinate_test, compiles clean) ----
31const GERM_FNV_OFFSET: i64 = 0 - 3750763034362895579 // 0xcbf29ce484222325
32const GERM_FNV_PRIME: i64 = 1099511628211 // 0x100000001b3
33
34func germ_hash(buf: *u8, len: i64) -> i64 {
35 var h: i64 = GERM_FNV_OFFSET
36 var i: i64 = 0
37 while i < len {
38 h = h ^ (buf[i] as i64)
39 h = h * GERM_FNV_PRIME
40 i = i + 1
41 }
42 return h
43}
44
45func germ_slen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
46func germ_puts(s: *u8) -> i64 { sys_write(1, s, germ_slen(s)); return 0 }
47func germ_puts_fd(fd: i64, s: *u8) -> i64 { sys_write(fd, s, germ_slen(s)); return 0 }
48
49// decimal print to fd (matches sbr_putn spine)
50func germ_putn_fd(fd: i64, v: i64) -> i64 {
51 let bb: *u8 = sys_mmap(28)
52 var m: i64 = v
53 if m < 0 { m = 0 - m; sys_write(fd, "-" as *u8, 1) }
54 let t: *u8 = sys_mmap(28)
55 var k: i64 = 0
56 if m == 0 { t[0] = 48; k = 1 }
57 while m > 0 { t[k] = 48 + (m % 10); m = m / 10; k = k + 1 }
58 var i: i64 = 0
59 while i < k { bb[i] = t[k - 1 - i]; i = i + 1 }
60 sys_write(fd, bb, k)
61 return 0
62}
63
64// hex print of an i64 (16 nibbles, MSB first) -- the content address, measured
65func germ_puthex_fd(fd: i64, v: i64) -> i64 {
66 let hx: *u8 = sys_mmap(20)
67 let digits: *u8 = "0123456789abcdef" as *u8
68 var i: i64 = 0
69 while i < 16 {
70 let shift: i64 = 60 - (i * 4)
71 let nib: i64 = (v >> shift) & 0xf
72 hx[i] = digits[nib]
73 i = i + 1
74 }
75 sys_write(fd, hx, 16)
76 return 0
77}
78
79// fork + optional stdout/stderr redirect + execve; parent waits; returns child's WEXITSTATUS,
80// OR 128+signal if the child died to a signal -- NO silent fake-success on a segfaulted tool
81// (replicates the nx_sov_build_run sbr_run evidence-driven runner spine).
82func germ_run(path: *u8, argv: *i64, envp: *i64, redir_out: i64, redir_err: i64) -> i64 {
83 let pid: i64 = sys_fork()
84 if pid == 0 {
85 if redir_out >= 0 { sys_dup3(redir_out, 1, 0) }
86 if redir_err >= 0 { sys_dup3(redir_err, 2, 0) }
87 sys_execve(path, argv, envp)
88 sys_exit(127)
89 }
90 let st: *i64 = sys_mmap(16) as *i64
91 sys_wait4(pid, st, 0)
92 let sig: i64 = st[0] & 0x7f
93 if sig != 0 { return 128 + sig }
94 return (st[0] >> 8) & 0xff
95}
96
97func main() -> i64 {
98 germ_puts("================================================================\n" as *u8)
99 germ_puts(" V-SPORE-1 GERMINATION PROOF -- one piece, content-addressed,\n" as *u8)
100 germ_puts(" rebuilt by the sovereign toolchain, proven by KAT (exit code).\n" as *u8)
101 germ_puts("================================================================\n" as *u8)
102
103 // ---- PACK: manifest entry computed from the canonical piece bytes ----
104 let src_path: *u8 = "runtime/nx_exit42.nx" as *u8
105 let lenp: *i64 = sys_mmap(8) as *i64
106 let bytes: *u8 = sys_read_file(src_path, lenp)
107 let n: i64 = *lenp
108 if (bytes as i64) == 0 { germ_puts(" FAIL: canary source unreadable\n" as *u8); sys_exit(10); return 10 }
109 if n <= 0 { germ_puts(" FAIL: canary source empty\n" as *u8); sys_exit(10); return 10 }
110 let expect_hash: i64 = germ_hash(bytes, n)
111 let kat_expect: i64 = 42
112
113 germ_puts(" piece=nx_exit42 bytes=" as *u8); germ_putn_fd(1, n)
114 germ_puts(" expect_hash=" as *u8); germ_puthex_fd(1, expect_hash); germ_puts("\n" as *u8)
115
116 var admitted: i64 = 0
117 var neg_reject: i64 = 0
118 var build_rc: i64 = 0 - 1
119 var kat_exit: i64 = 0 - 1
120
121 // ---- POSITIVE control: intact piece -> integrity ok -> materialize -> rebuild -> KAT ----
122 germ_puts("\n [+] POSITIVE: intact piece\n" as *u8)
123 let recv_hash: i64 = germ_hash(bytes, n)
124 if recv_hash != expect_hash {
125 germ_puts(" INTEGRITY mismatch on intact piece -- impossible; abort\n" as *u8)
126 sys_exit(11); return 11
127 }
128 germ_puts(" integrity: hash MATCH -> materialize\n" as *u8)
129
130 // MATERIALIZE the verified bytes into runtime/ (imports resolve via the normal tree)
131 let scratch_src: *u8 = "runtime/_germ_scratch_exit42.nx" as *u8
132 let wfd: i64 = sys_openat_wr(scratch_src, 0x1a4)
133 if wfd < 0 { germ_puts(" FAIL: cannot materialize scratch source\n" as *u8); sys_exit(12); return 12 }
134 sys_write(wfd, bytes, n)
135 sys_close(wfd)
136 germ_puts(" materialized -> runtime/_germ_scratch_exit42.nx\n" as *u8)
137
138 // REBUILD + BEHAVIOR via the sovereign build/run lane in ONE step: nx_sov_build_run
139 // compiles the materialized source (nx_cc -> nxasm, with the empty-.s nondeterminism
140 // guard) AND runs the result, propagating the program's run-exit as its own exit code.
141 // The canary's KAT exit (42) is deliberately distinct from the lane's build-fail codes
142 // (2/3/4), exec-fail (127), and signal deaths (128+sig) -- so germ_rc==42 unambiguously
143 // means: rebuilt clean AND KAT proven (1:1 PROOF, KAT-as-oracle). Reusing the proven
144 // lane (DRY) beats re-implementing cc->asm->run + its nondeterminism handling.
145 let builder: *u8 = "_offc/nx_sov_build_run.elf" as *u8
146 let b1: *u8 = "_germ_scratch_exit42" as *u8
147 let bargv: *i64 = sys_mmap(32) as *i64
148 bargv[0] = builder as i64
149 bargv[1] = b1 as i64
150 bargv[2] = 0
151 build_rc = germ_run(builder, bargv, 0 as *i64, 0 - 1, 0 - 1)
152 kat_exit = build_rc
153 germ_puts(" rebuild+run: germ_rc=" as *u8); germ_putn_fd(1, build_rc)
154 germ_puts(" (kat_expect=" as *u8); germ_putn_fd(1, kat_expect); germ_puts(")\n" as *u8)
155 if kat_exit == kat_expect {
156 admitted = admitted + 1
157 germ_puts(" -> ADMITTED (integrity-clean, rebuilt by sovereign toolchain, KAT proven)\n" as *u8)
158 } else {
159 germ_puts(" -> REJECT: build-fail or KAT mismatch (liar caught)\n" as *u8)
160 }
161
162 // ---- NEGATIVE control: tampered piece -> integrity mismatch -> NEVER built/run ----
163 germ_puts("\n [-] NEGATIVE: one byte flipped in transit\n" as *u8)
164 let cor: *u8 = sys_mmap(n + 16)
165 var c: i64 = 0
166 while c < n { cor[c] = bytes[c]; c = c + 1 }
167 cor[0] = (cor[0] ^ 1) as u8
168 let cor_hash: i64 = germ_hash(cor, n)
169 if cor_hash != expect_hash {
170 neg_reject = neg_reject + 1
171 germ_puts(" integrity: hash MISMATCH -> REJECTED, build+run never reached\n" as *u8)
172 } else {
173 germ_puts(" integrity: collision?! tampered piece passed -- gate broken\n" as *u8)
174 }
175
176 // ---- VERDICT (sealed): GREEN iff exactly the known answer ----
177 var green: i64 = 1
178 if admitted != 1 { green = 0 }
179 if neg_reject != 1 { green = 0 }
180 if kat_exit != kat_expect { green = 0 }
181
182 let lfd: i64 = sys_openat_append("knowledge/status/spore_germ.log" as *u8, 0x1a4)
183 if lfd >= 0 {
184 germ_puts_fd(lfd, "SPOREGERM-GATE epoch=" as *u8); germ_putn_fd(lfd, sys_now_realtime_sec())
185 germ_puts_fd(lfd, " piece=nx_exit42 bytes=" as *u8); germ_putn_fd(lfd, n)
186 germ_puts_fd(lfd, " expect_hash=" as *u8); germ_puthex_fd(lfd, expect_hash)
187 germ_puts_fd(lfd, " pos_integrity=1 germ_rc=" as *u8); germ_putn_fd(lfd, build_rc)
188 germ_puts_fd(lfd, " kat_expect=" as *u8); germ_putn_fd(lfd, kat_expect)
189 germ_puts_fd(lfd, " admitted=" as *u8); germ_putn_fd(lfd, admitted)
190 germ_puts_fd(lfd, " neg_integrity_reject=" as *u8); germ_putn_fd(lfd, neg_reject)
191 if green == 1 { germ_puts_fd(lfd, " verdict=GREEN\n" as *u8) } else { germ_puts_fd(lfd, " verdict=RED\n" as *u8) }
192 sys_close(lfd)
193 }
194
195 germ_puts("----------------------------------------------------------------\n" as *u8)
196 if green == 1 {
197 germ_puts(" verdict=GREEN -- a content-addressed piece germinated and proved out;\n" as *u8)
198 germ_puts(" the tampered piece was rejected before it could build or run.\n" as *u8)
199 sys_exit(0); return 0
200 }
201 germ_puts(" verdict=RED -- see fields above\n" as *u8)
202 sys_exit(1); return 1
203}