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}