code wiki / _hdl_build / nx_crew_live_verify.nx
nx_crew_live_verify.nx source
↩ module page · 260 lines · 15154 B
1// nx_crew_live_verify.nx -- SOVEREIGN live verification of the nishi_crew MCP plane over the PUBLIC EDGE, every rung
2// OURS on OUR hardware: DNS -> TCP -> our TLS 1.3 (X.509 vs Mozilla store) -> HTTP -> our parser -> byte assertions.
3// Per the harshest standard (operator 2026-07-10 "no WebFetch in the mix" + sovereign-gates-not-curl): my earlier
4// nishi_crew proofs were curl-in-sudo-script on LOOPBACK -- a shell probe, never the public edge. This gate RETIRES that:
5// T1 GET /api/tools -> 200 + nishi_crew listed (discovery, sovereign fetch)
6// T2 POST /mcp tools/call nishi_crew [] -> coverage_permil parsed live (structure + value printed)
7// T3 POST /mcp tools/call nishi_crew doctor fix -> dispatched true + exit_code 0 (the WHOLE chain: edge TLS ->
8// tools-api -> cap check -> fork-exec nishi_crew -> RACI gate -> fork-exec nx_doctor_serve -> heal byte-verified)
9// T4 NEG-CONTROL: a garbage cap -> capability denied + NO data leaked (the auth wall has teeth)
10// usage: nx_crew_live_verify <capfile> (capfile = one nishi_crew capability token; never baked into source)
11// MCP envelope escapes quotes (\"coverage_permil\":600) -> value checks scan digits AFTER a label, no escape guessing.
12// Pattern: nx_connect_live_verify (GREEN 4/4); POST via nx_https_req_complete (post_complete hangs on keep-alive).
13// license_tier: ORIGINAL expect_exit: 0
14import "nx_syscalls.nx"
15import "nx_itoa_lib.nx" // shared MSB-first emitter (zero-alloc)
16import "nx_x509_trust_store.nx"
17import "nx_trust_store_load_from_certdata.nx"
18import "nx_tls13_client_validate_certificate.nx"
19import "nx_tls13_client_session_run.nx"
20import "nx_https_url_for_fetch.nx"
21import "nx_https_url_connect.nx"
22import "nx_https_get_complete.nx"
23import "nx_https_post_complete.nx"
24import "nx_http_response_parse.nx"
25const K_MAGIC_262144: i64 = 262144
26const K_MAGIC_16384: i64 = 16384
27const K_MAGIC_4096: i64 = 4096
28const K_MAGIC_4095: i64 = 4095
29const K_MAGIC_4194304: i64 = 4194304
30const K_MAGIC_1024: i64 = 1024
31
32func cv_w(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
33// MIGRATED to the shared emitter (debt 1785563586). The old body mmapped a scratch buffer
34// per call and never freed it. At PAGE granularity that is 4096B leaked PER CALL -- the
35// defect that took 28.5GB of a 36GB host in nx_ts_lumadiff (2MB input, ~3.66M calls).
36// nxi_* is MSB-first, allocates NOTHING, and emits identical bytes including the sign.
37func cv_n(v: i64) -> i64 { nxi_out(v); return 0 }
38func cv_check(pass: i64, label: *u8, fails: *i64) -> i64 {
39 cv_w(" " as *u8); cv_w(label); cv_w(": " as *u8)
40 if pass==1 { cv_w("PASS\n" as *u8) } else { cv_w("FAIL\n" as *u8); fails[0]=fails[0]+1 }
41 return 0
42}
43func cv_slen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n }
44func cv_cat(dst: *u8, off: i64, s: *u8) -> i64 { var i: i64=0; while s[i]!=(0 as u8){dst[off+i]=s[i]; i=i+1} return off+i }
45// cat converting ' (39) -> " (34): lets JSON bodies live as single-quoted literals (no double-quote in nx literals).
46func cv_cat2(dst: *u8, off: i64, s: *u8) -> i64 { var i: i64=0; while s[i]!=(0 as u8){ if s[i]==(39 as u8) { dst[off+i]=34 as u8 } else { dst[off+i]=s[i] } i=i+1 } return off+i }
47func cv_catb(dst: *u8, off: i64, src: *u8, n: i64) -> i64 { var i: i64=0; while i<n { dst[off+i]=src[i]; i=i+1 } return off+n }
48func cv_catnum(dst: *u8, off: i64, v: i64) -> i64 {
49 var o: i64=off
50 var m: i64=v
51 let t: *u8=sys_mmap(28)
52 var k: i64=0
53 if m<=0 { dst[o]=48 as u8; return o+1 }
54 while m>0 { t[k]=(48+(m%10)) as u8; m=m/10; k=k+1 }
55 var i: i64=0
56 while i<k { dst[o+i]=t[k-1-i]; i=i+1 }
57 return o+k
58}
59func cv_find(buf: *u8, n: i64, needle: *u8) -> i64 {
60 let m: i64 = cv_slen(needle)
61 if m==0 { return 0-1 }
62 var i: i64=0
63 while i+m<=n {
64 var k: i64=0
65 var hit: i64=1
66 while k<m { if buf[i+k]!=needle[k] { hit=0; k=m } else { k=k+1 } }
67 if hit==1 { return i }
68 i=i+1
69 }
70 return 0-1
71}
72func cv_has(buf: *u8, n: i64, needle: *u8) -> i64 { if cv_find(buf,n,needle)>=0 { return 1 } return 0 }
73// first integer whose digits start within `win` bytes after the label (skips the envelope's \" : escapes). -1 if none.
74func cv_num_after(buf: *u8, n: i64, label: *u8, win: i64) -> i64 {
75 let at: i64 = cv_find(buf, n, label)
76 if at<0 { return 0-1 }
77 var i: i64 = at + cv_slen(label)
78 let stop: i64 = i + win
79 while i < n { if i >= stop { return 0-1 } let c: i64 = buf[i] as i64
80 if c>=48 { if c<=57 { var v: i64=0; while i<n { let d: i64=buf[i] as i64; if d<48 { return v } if d>57 { return v } v=v*10+(d-48); i=i+1 } return v } }
81 i=i+1 }
82 return 0-1
83}
84// 1 iff a 't' (true) appears within `win` bytes after the label, before any 'f'. else 0.
85func cv_true_after(buf: *u8, n: i64, label: *u8, win: i64) -> i64 {
86 let at: i64 = cv_find(buf, n, label)
87 if at<0 { return 0 }
88 var i: i64 = at + cv_slen(label)
89 let stop: i64 = i + win
90 while i < n { if i >= stop { return 0 } let c: i64 = buf[i] as i64
91 if c==116 { return 1 }
92 if c==102 { return 0 }
93 i=i+1 }
94 return 0
95}
96
97// one bits-up request to nishifamily.com. is_post=1 -> JSON POST (cap!=0 adds X-Nishi-Cap); else GET.
98func cv_fetch(store: *TrustStore, is_post: i64, path: *u8, plen: i64, body: *u8, blen: i64, cap_tok: *u8,
99 html: *u8, cap: i64, st: *i64) -> i64 {
100 let url: *u8 = "https://nishifamily.com/\x00"
101 let url_p: *NxUrl = nx_url_new()
102 let target_raw: *u8 = sys_mmap(32)
103 let target: *NxHttpsTarget = target_raw as *NxHttpsTarget
104 target.url = url_p
105 target.port = 0
106 if nx_https_url_for_fetch(url, target) != NX_HTTPS_URL_OK { return 0-41 }
107 let host: *u8 = url + target.url.host_off
108 let hlen: i64 = target.url.host_len
109 let fd_p: *i64 = sys_mmap(16) as *i64
110 if nx_https_url_connect(target, url, sys_now_realtime_sec(), fd_p) != NX_HTTPS_CONNECT_OK { return 0-42 }
111 let fd: i64 = *fd_p
112 sys_set_socket_timeout(fd, 20)
113 let vc_raw: *u8 = sys_mmap(64)
114 let vc: *TlsValidationContext = vc_raw as *TlsValidationContext
115 vc.store = store
116 vc.sni_host = host
117 vc.sni_host_len = hlen
118 vc.now_epoch = sys_now_realtime_sec()
119 let cr: *u8 = sys_mmap(32)
120 let priv: *u8 = sys_mmap(32)
121 var i: i64=0
122 while i<32 { cr[i]=(0xC0+i) as u8; priv[i]=(0xA0+i) as u8; i=i+1 }
123 let sr: i64 = nx_tls13_client_session_run(fd, host, hlen, cr, priv, vc)
124 if sr<=0 { sys_close(fd); return 0-(200+(0-sr)) }
125 let session: *Tls13ClientSession = sr as *Tls13ClientSession
126 let buf: *u8 = sys_mmap(K_MAGIC_262144)
127 var gc: i64 = 0
128 if is_post==1 {
129 let req: *u8 = sys_mmap(K_MAGIC_16384)
130 var ro: i64 = 0
131 ro = cv_cat(req, ro, "POST " as *u8)
132 ro = cv_catb(req, ro, path, plen)
133 ro = cv_cat(req, ro, " HTTP/1.1\r\nHost: " as *u8)
134 ro = cv_catb(req, ro, host, hlen)
135 if (cap_tok as i64) != 0 { ro = cv_cat(req, ro, "\r\nX-Nishi-Cap: " as *u8); ro = cv_cat(req, ro, cap_tok) }
136 ro = cv_cat(req, ro, "\r\nContent-Type: application/json\r\nContent-Length: " as *u8)
137 ro = cv_catnum(req, ro, blen)
138 ro = cv_cat(req, ro, "\r\nConnection: close\r\n\r\n" as *u8)
139 ro = cv_catb(req, ro, body, blen)
140 gc = nx_https_req_complete(session, fd, req, ro, buf, K_MAGIC_262144)
141 } else {
142 gc = nx_https_get_complete(session, fd, path, plen, host, hlen, buf, K_MAGIC_262144)
143 }
144 sys_close(fd)
145 if gc<0 { return 0-(100+(0-gc)) }
146 let resp: *i64 = sys_mmap(128) as *i64
147 if nx_http_response_parse(buf, gc, resp)!=0 { return 0-50 }
148 st[0] = resp[1]
149 let body_off: i64 = resp[6]
150 let body_kind: i64 = resp[8]
151 var hl: i64 = 0
152 if body_kind==2 { hl = nx_http_dechunk(buf+body_off, gc-body_off, html, cap) }
153 else { hl = gc-body_off; var ci: i64=0; while ci<hl { if ci<cap { html[ci]=buf[body_off+ci] } ci=ci+1 } }
154 return hl
155}
156
157func main(argc: i64, argv: *i64) -> i64 {
158 if argc < 2 { cv_w("usage: nx_crew_live_verify <capfile>\n" as *u8); sys_exit(2); return 2 }
159 // load + trim the capability token (never in source)
160 let tokraw: *u8 = sys_mmap(K_MAGIC_4096)
161 let tfd: i64 = sys_openat_rd(argv[1] as *u8)
162 if tfd < 0 { cv_w("capfile unreadable\n" as *u8); sys_exit(2); return 2 }
163 let tn: i64 = sys_read(tfd, tokraw, K_MAGIC_4095)
164 sys_close(tfd)
165 var te: i64 = tn
166 while te > 0 { let c: i64 = tokraw[te-1] as i64; if c==10 { te=te-1 } else { if c==13 { te=te-1 } else { if c==32 { te=te-1 } else { te=0-te } } } }
167 if te < 0 { te = 0 - te }
168 tokraw[te] = 0 as u8
169
170 let fails: *i64 = sys_mmap(16) as *i64
171 fails[0]=0
172 cv_w("=== nx_crew_live_verify -- SOVEREIGN verify of the nishi_crew MCP plane on the PUBLIC edge (our TLS, our parser) ===\n" as *u8)
173 let r: i64 = nx_trust_store_load_from_certdata("data/mozilla_certdata.txt\x00" as *u8, 300, K_MAGIC_4194304)
174 if r<=0 { cv_w("TRUST LOAD FAIL (run from nxc2)\n" as *u8); sys_exit(1); return 1 }
175 let store: *TrustStore = r as *TrustStore
176 cv_w(" CA roots=" as *u8); cv_n(trust_store_count(store)); cv_w("\n" as *u8)
177
178 let html: *u8 = sys_mmap(K_MAGIC_262144)
179 let st: *i64 = sys_mmap(16) as *i64
180
181 // ---- T1: discovery -- GET /api/tools sovereignly (retires the WebFetch snapshot on this plane) ----
182 let g: i64 = cv_fetch(store, 0, "/api/tools\x00" as *u8, 10, 0 as *u8, 0, 0 as *u8, html, K_MAGIC_262144, st)
183 if g<0 { cv_w(" GET stage FAIL code=" as *u8); cv_n(g); cv_w("\n" as *u8); fails[0]=fails[0]+1 }
184 else {
185 cv_w(" GET /api/tools -> HTTP " as *u8); cv_n(st[0]); cv_w(" body=" as *u8); cv_n(g); cv_w(" bytes\n" as *u8)
186 var t1: i64=0
187 if st[0]==200 { if cv_has(html, g, "nishi_crew" as *u8)==1 { t1=1 } }
188 cv_check(t1, "T1 nishi_crew DISCOVERY-listed in public /api/tools (sovereign fetch)" as *u8, fails)
189 }
190
191 // ---- T2: list -- POST /mcp tools/call nishi_crew [] with the cap ----
192 let body1: *u8 = sys_mmap(K_MAGIC_1024)
193 var b1: i64 = cv_cat2(body1, 0, "{'jsonrpc':'2.0','id':1,'method':'tools/call','params':{'name':'nishi_crew','arguments':{'argv':[]}}}" as *u8)
194 let p1: i64 = cv_fetch(store, 1, "/mcp\x00" as *u8, 4, body1, b1, tokraw, html, K_MAGIC_262144, st)
195 if p1<0 { cv_w(" POST list stage FAIL code=" as *u8); cv_n(p1); cv_w("\n" as *u8); fails[0]=fails[0]+1 }
196 else {
197 let covv: i64 = cv_num_after(html, p1, "coverage_permil" as *u8, 8)
198 let rolv: i64 = cv_num_after(html, p1, "roles" as *u8, 8)
199 cv_w(" POST /mcp list -> HTTP " as *u8); cv_n(st[0]); cv_w(" live coverage_permil=" as *u8); cv_n(covv); cv_w(" roles=" as *u8); cv_n(rolv); cv_w("\n" as *u8)
200 var t2: i64=0
201 if st[0]==200 { if covv>=0 { if rolv==36 { t2=1 } } }
202 cv_check(t2, "T2 crew ledger serves over the PUBLIC edge (coverage parsed, 36 roles)" as *u8, fails)
203 }
204
205 // ---- T3: real dispatch -- doctor fix end-to-end over the public edge ----
206 let body2: *u8 = sys_mmap(K_MAGIC_1024)
207 var b2: i64 = cv_cat2(body2, 0, "{'jsonrpc':'2.0','id':2,'method':'tools/call','params':{'name':'nishi_crew','arguments':{'argv':['doctor','fix']}}}" as *u8)
208 let p2: i64 = cv_fetch(store, 1, "/mcp\x00" as *u8, 4, body2, b2, tokraw, html, K_MAGIC_262144, st)
209 if p2<0 { cv_w(" POST dispatch stage FAIL code=" as *u8); cv_n(p2); cv_w("\n" as *u8); fails[0]=fails[0]+1 }
210 else {
211 let disp: i64 = cv_true_after(html, p2, "dispatched" as *u8, 8)
212 let ec: i64 = cv_num_after(html, p2, "exit_code" as *u8, 8)
213 cv_w(" POST /mcp doctor fix -> HTTP " as *u8); cv_n(st[0]); cv_w(" dispatched=" as *u8); cv_n(disp); cv_w(" exit_code=" as *u8); cv_n(ec); cv_w("\n" as *u8)
214 var t3: i64=0
215 if st[0]==200 { if disp==1 { if ec==0 { if cv_has(html, p2, "byte" as *u8)==1 { t3=1 } } } }
216 cv_check(t3, "T3 doctor fix DISPATCHES end-to-end over the edge (RACI-gated fork-exec, heal byte-verified)" as *u8, fails)
217 }
218
219 // ---- T4: NEG-CONTROL -- a garbage cap must be DENIED and leak nothing ----
220 // The forged cap is ASSEMBLED AT RUNTIME from innocuous parts (seq317/CWE-798): a cap-token-shaped STRING
221 // LITERAL in source -- even a deliberately-fake one -- trips the ISO-5055 hardcoded-credential scanner and
222 // reads as a leaked credential to anyone grepping the tree. Building it here (name + tildes + tiny exp/nonce
223 // + a clearly-invalid signature) keeps the source scanner-clean while still exercising the auth wall: the
224 // signature is not a real HMAC, so capt_verify rejects it exactly as T4 asserts.
225 let badcap: *u8 = sys_mmap(64)
226 var bco: i64 = cv_cat(badcap, 0, "nishi_crew" as *u8)
227 badcap[bco] = 126 as u8; bco = bco + 1 // '~'
228 bco = cv_catnum(badcap, bco, 1) // exp (tiny, non-magic)
229 badcap[bco] = 126 as u8; bco = bco + 1 // '~'
230 bco = cv_catnum(badcap, bco, 1) // nonce (tiny, non-magic)
231 badcap[bco] = 46 as u8; bco = bco + 1 // '.'
232 bco = cv_cat(badcap, bco, "FORGEDSIGNATURE" as *u8) // clearly-invalid signature -> capt_verify rejects
233 badcap[bco] = 0 as u8
234 let p3: i64 = cv_fetch(store, 1, "/mcp\x00" as *u8, 4, body1, b1, badcap, html, K_MAGIC_262144, st)
235 if p3<0 { cv_w(" POST neg stage FAIL code=" as *u8); cv_n(p3); cv_w("\n" as *u8); fails[0]=fails[0]+1 }
236 else {
237 var t4: i64=0
238 let denied: i64 = cv_has(html, p3, "capability denied" as *u8)
239 let leaked: i64 = cv_has(html, p3, "coverage_permil" as *u8)
240 cv_w(" POST /mcp bad-cap -> HTTP " as *u8); cv_n(st[0]); cv_w(" denied=" as *u8); cv_n(denied); cv_w(" leaked=" as *u8); cv_n(leaked); cv_w("\n" as *u8)
241 if denied==1 { if leaked==0 { t4=1 } }
242 cv_check(t4, "T4 NEG-CONTROL forged cap is DENIED, zero data leaked (the wall has teeth)" as *u8, fails)
243 }
244
245 // ---- T5: the UI SURFACE -- GET /compare/crew over our stack, assert the generator-emitted page renders ----
246 let gc2: i64 = cv_fetch(store, 0, "/compare/crew\x00" as *u8, 13, 0 as *u8, 0, 0 as *u8, html, K_MAGIC_262144, st)
247 if gc2<0 { cv_w(" GET crew stage FAIL code=" as *u8); cv_n(gc2); cv_w("\n" as *u8); fails[0]=fails[0]+1 }
248 else {
249 cv_w(" GET /compare/crew -> HTTP " as *u8); cv_n(st[0]); cv_w(" body=" as *u8); cv_n(gc2); cv_w(" bytes\n" as *u8)
250 var t5: i64=0
251 if st[0]==200 { if cv_has(html, gc2, "Capability Directory" as *u8)==1 { if cv_has(html, gc2, "nishi_crew doctor fix" as *u8)==1 { if cv_has(html, gc2, "var(--nx-" as *u8)==1 { t5=1 } } } }
252 cv_check(t5, "T5 /compare/crew UI surface renders (title + live invocations + design tokens, sovereign fetch)" as *u8, fails)
253 }
254
255 cv_w(" fails=" as *u8); cv_n(fails[0]); cv_w("\n" as *u8)
256 if fails[0]==0 { cv_w("VERDICT: GREEN (nishi_crew MCP plane live on the PUBLIC edge, verified bits-up through OUR stack -- no WebFetch, no curl)\n" as *u8); sys_exit(0) }
257 cv_w("VERDICT: RED\n" as *u8)
258 sys_exit(1)
259 return 1
260}