code wiki / _hdl_build / nx_nbk_gate.nx
nx_nbk_gate.nx source
↩ module page · 100 lines · 6523 B
1// nx_nbk_gate.nx -- liar-kill gate for the sovereign Nishi container (.nbk), the owned media format every lock-in
2// format migrates into. Asserts:
3// MIGRATE : an EPUB book -> .nbk; nbk_get("book.json") round-trips the manifest (title intact).
4// INTEGRITY : nbk_check passes on the packed file; flipping ONE byte -> nbk_check FAILS (content-addressed CID
5// + per-entry hashes DETECT corruption -- which MOBI/EPUB cannot).
6// DETERMINISM: packing the same inputs twice -> BYTE-IDENTICAL .nbk (reproducible CID).
7// CONVERGE : a MOBI book ALSO -> .nbk (format=mobi in the packed manifest) -- one owned format, many inputs.
8// GREEN = lock-in formats migrate into one self-contained, integrity-verified, deterministic file we own. expect_exit:0
9import "nx_syscalls.nx"
10import "nx_nbk.nx"
11
12func gp(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
13func gnum(v0: i64) -> i64 { var v: i64=v0; if v<0 { sys_write(1,"-" as *u8,1); v=0-v } let b: *u8=sys_mmap(24); var k: i64=0; if v==0 {b[0]=48 as u8;k=1} while v>0 {b[k]=(48+(v%10)) as u8; v=v/10; k=k+1} let o: *u8=sys_mmap(24); var j: i64=0; while j<k {o[j]=b[k-1-j];j=j+1} sys_write(1,o,k); return 0 }
14
15func spawn(path: *u8, a0: *u8, a1: *u8, redir: *u8) -> i64 {
16 let pid: i64 = sys_fork()
17 if pid == 0 {
18 let fd: i64 = sys_openat_wr(redir, 420)
19 if fd >= 0 { sys_dup3(fd, 1, 0); sys_dup3(fd, 2, 0) }
20 let argv: *i64 = sys_mmap(64) as *i64
21 var n: i64 = 0
22 argv[0] = path as i64; n = 1
23 if (a0 as i64) != 0 { argv[n] = a0 as i64; n = n + 1 }
24 if (a1 as i64) != 0 { argv[n] = a1 as i64; n = n + 1 }
25 argv[n] = 0
26 let envp: *i64 = sys_mmap(16) as *i64
27 envp[0] = "PATH=/usr/bin:/bin\x00" as *u8 as i64; envp[1] = 0
28 sys_execve(path, argv, envp)
29 sys_exit(127)
30 }
31 let st: *i64 = sys_mmap(16) as *i64
32 sys_wait4(pid, st, 0)
33 return (st[0] >> 8) & 0xff
34}
35func ghas(hay: *u8, hl: i64, needle: *u8) -> i64 {
36 var nl: i64=0; while needle[nl]!=(0 as u8){nl=nl+1}
37 if nl == 0 { return 0 }
38 var i: i64 = 0
39 while i + nl <= hl { var k: i64=0; var hit: i64=1; while k<nl { if hay[i+k]!=needle[k]{hit=0;k=nl}else{k=k+1} } if hit==1 {return 1} i=i+1 }
40 return 0
41}
42
43func main() -> i64 {
44 gp("=== nx_nbk_gate: sovereign Nishi container (.nbk) -- the owned format lock-in formats migrate into ===\n" as *u8)
45 let RUNNER: *u8 = "_offc/nx_sov_build_run.elf\x00" as *u8
46 let SCRATCH: *u8 = "knowledge/status/nbk_gate_scratch.log\x00" as *u8
47
48 // ---- EPUB -> reader/nishi_fixture/ -> .nbk (twice, for determinism) ----
49 spawn(RUNNER, "nx_epub_fixture_build\x00" as *u8, 0 as *u8, SCRATCH)
50 spawn("_offc/nx_epub_book.elf\x00" as *u8, "knowledge/fixtures/nishi_fixture.epub\x00" as *u8, "nishi_fixture\x00" as *u8, SCRATCH)
51 spawn(RUNNER, "nx_nbk_pack\x00" as *u8, 0 as *u8, SCRATCH) // refreshes _offc twin + packs nishi_fixture
52 let l1: *i64 = sys_mmap(8) as *i64; l1[0]=0
53 let b1: *u8 = sys_read_file("knowledge/staging/media/nbk/nishi_fixture.nbk\x00" as *u8, l1)
54 let n1: i64 = l1[0]
55 spawn(RUNNER, "nx_nbk_pack\x00" as *u8, 0 as *u8, SCRATCH) // pack again (determinism)
56 let l2: *i64 = sys_mmap(8) as *i64; l2[0]=0
57 let b2: *u8 = sys_read_file("knowledge/staging/media/nbk/nishi_fixture.nbk\x00" as *u8, l2)
58 let n2: i64 = l2[0]
59
60 // ---- MOBI -> reader/nishi_mobi_fixture/ -> .nbk (convergence) ----
61 spawn(RUNNER, "nx_mobi_fixture_build\x00" as *u8, 0 as *u8, SCRATCH)
62 spawn(RUNNER, "nx_mobi_book\x00" as *u8, 0 as *u8, SCRATCH) // decode default nishi_mobi_fixture
63 spawn("_offc/nx_nbk_pack.elf\x00" as *u8, "nishi_mobi_fixture\x00" as *u8, 0 as *u8, SCRATCH)
64 let lm: *i64 = sys_mmap(8) as *i64; lm[0]=0
65 let bm: *u8 = sys_read_file("knowledge/staging/media/nbk/nishi_mobi_fixture.nbk\x00" as *u8, lm)
66 let nm: i64 = lm[0]
67
68 if (b1 as i64)==0 { gp("NBK-GATE verdict=RED reason=epub-nbk-missing\n" as *u8); sys_exit(1); return 1 }
69
70 // recover book.json from the .nbk + integrity checks
71 let bjout: *u8 = sys_mmap(1048576)
72 let glen: i64 = nbk_get(b1, n1, "book.json\x00" as *u8, bjout, 1048576)
73 let chk_ok: i64 = nbk_check(b1, n1)
74 // determinism: byte-identical across the two packs
75 var det: i64 = 1
76 if n1 != n2 { det = 0 } else { var i: i64=0; while i<n1 { if b1[i]!=b2[i] { det=0; i=n1 } else { i=i+1 } } }
77 // tamper: flip a payload byte -> CID/hash mismatch must be DETECTED
78 if n1 > 40 { b1[40] = (b1[40] ^ (1 as u8)) as u8 }
79 let chk_tampered: i64 = nbk_check(b1, n1)
80
81 gp(" epub.nbk bytes=" as *u8); gnum(n1); gp(" entries-roundtrip book.json bytes=" as *u8); gnum(glen)
82 gp(" check_ok=" as *u8); gnum(chk_ok); gp(" deterministic=" as *u8); gnum(det); gp(" check_after_tamper=" as *u8); gnum(chk_tampered); gp("\n" as *u8)
83 gp(" mobi.nbk bytes=" as *u8); gnum(nm); gp("\n" as *u8)
84
85 var pass: i64 = 0; var fail: i64 = 0
86 if glen > 0 { pass=pass+1 } else { fail=fail+1; gp(" FAIL book.json-not-in-nbk\n" as *u8) }
87 if ghas(bjout, glen, "\"title\":\"Alice (Nishi Fixture)\"" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL manifest-not-round-tripped\n" as *u8) }
88 if chk_ok == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL integrity-check-failed-on-good-file\n" as *u8) }
89 if det == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL not-deterministic\n" as *u8) }
90 if chk_tampered == 0 { pass=pass+1 } else { fail=fail+1; gp(" FAIL tamper-NOT-detected (integrity is fake)\n" as *u8) }
91 // MOBI convergence: a Kindle-format book ALSO lands in the owned format
92 if (bm as i64) != 0 { if nbk_check(bm, nm) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL mobi-nbk-integrity\n" as *u8) } } else { fail=fail+1; gp(" FAIL mobi-nbk-missing\n" as *u8) }
93 let mjout: *u8 = sys_mmap(1048576)
94 let mglen: i64 = nbk_get(bm, nm, "book.json\x00" as *u8, mjout, 1048576)
95 if mglen > 0 { if ghas(mjout, mglen, "\"format\":\"mobi\"" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL mobi-format-not-in-nbk\n" as *u8) } } else { fail=fail+1; gp(" FAIL mobi-book.json-not-in-nbk\n" as *u8) }
96
97 gp("NBK-GATE pass=" as *u8); gnum(pass); gp(" fail=" as *u8); gnum(fail)
98 if fail == 0 { gp(" verdict=GREEN (EPUB + MOBI migrated into ONE owned, content-addressed, integrity-verified, deterministic file)\n" as *u8); sys_exit(0); return 0 }
99 gp(" verdict=RED\n" as *u8); sys_exit(1); return 1
100}