code wiki / _hdl_build / nx_pkg.nx
nx_pkg.nx source
↩ module page · 99 lines · 7213 B
1// nx_pkg.nx -- SOVEREIGN PACKAGE MANAGER (OS gap: PACKAGE-MGMT). Composes what we built: dependency RESOLUTION via
2// topological sort (Kahn, as nx_init) + per-package INTEGRITY via sha/checksum (as nx_blockfs/the publisher).
3// install(target) = transitive-dep closure -> dep-ordered install order -> verify each package's sha -> install.
4// T1 install 'shell' -> needed set = only its transitive deps, order deps-before-dependents.
5// T2 every package verifies (sha matches the manifest). T3 teeth: a sha MISMATCH is rejected (supply-chain integrity).
6// T4 teeth: a dependency CYCLE is detected.
7// HONEST BEHIND vs apt/npm/pip: no version-constraint solving / remote repos / scale (asterisk).
8// expect_exit: 0 Sovereign: nx_syscalls. NEVER-BRICK: installs userspace packages, writes 0 firmware.
9import "nx_syscalls.nx"
10import "nx_itoa_lib.nx" // shared MSB-first emitter (zero-alloc)
11import "nx_g_puts_lib.nx"
12
13// MIGRATED to the shared emitter (debt 1785563586). The old body mmapped a scratch buffer
14// per call and never freed it. At PAGE granularity that is 4096B leaked PER CALL -- the
15// defect that took 28.5GB of a 36GB host in nx_ts_lumadiff (2MB input, ~3.66M calls).
16// nxi_* is MSB-first, allocates NOTHING, and emits identical bytes including the sign.
17func g_pn(v: i64) -> i64 { nxi_out(v); return 0 }
18func ck(name: *u8, c: i64) -> i64 { if c==1 { g_puts(" PASS " as *u8) } else { g_puts(" FAIL " as *u8) } g_puts(name); g_puts("\n" as *u8); return c }
19func slen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n }
20func psum(s: *u8) -> i64 { var acc: i64=0; var i: i64=0; while s[i]!=(0 as u8){ acc=acc+(s[i] as i64); i=i+1 } return acc } // content checksum
21
22const MAXD: i64 = 4
23
24// transitive-dependency closure of `target` (fixpoint mark). fills needed[].
25func pkg_needed(target: i64, ndep: *i64, dep: *i64, N: i64, needed: *i64) -> i64 {
26 var i: i64=0; while i<N { needed[i]=0; i=i+1 }
27 needed[target]=1; var changed: i64=1
28 while changed==1 { changed=0; var u: i64=0; while u<N { if needed[u]==1 { var k: i64=0; while k<ndep[u] { let dpk: i64=dep[u*MAXD+k]; if needed[dpk]==0 { needed[dpk]=1; changed=1 } k=k+1 } } u=u+1 } }
29 return 0
30}
31// topo-sort (Kahn) over all N; returns count ordered (==N if acyclic). order[] = global dependency order.
32func pkg_topo(ndep: *i64, dep: *i64, N: i64, order: *i64) -> i64 {
33 let indeg: *i64 = sys_mmap(N*8) as *i64; let done: *i64 = sys_mmap(N*8) as *i64
34 var i: i64=0; while i<N { indeg[i]=ndep[i]; done[i]=0; i=i+1 }
35 var oc: i64=0; var changed: i64=1
36 while changed==1 { changed=0; var u: i64=0
37 while u<N { if done[u]==0 { if indeg[u]==0 {
38 order[oc]=u; oc=oc+1; done[u]=1; changed=1
39 var v: i64=0; while v<N { if done[v]==0 { var k: i64=0; while k<ndep[v] { if dep[v*MAXD+k]==u { indeg[v]=indeg[v]-1 } k=k+1 } } v=v+1 } } }
40 u=u+1 } }
41 return oc
42}
43func pkg_verify(content: *u8, expected: i64) -> i64 { if psum(content)==expected { return 1 } return 0 }
44
45func main() -> i64 {
46 g_puts("nx_pkg (SOVEREIGN package manager: dep-resolved + sha-verified install)\n" as *u8)
47 var pass: i64=0; var total: i64=0
48 // registry: 0 syscalls | 1 alloc<-0 | 2 net<-0 | 3 blockfs<-1,0 | 4 tls<-2 | 5 shell<-3,1
49 let N: i64=6
50 let ndep: *i64 = sys_mmap(N*8) as *i64; let dep: *i64 = sys_mmap(N*MAXD*8) as *i64
51 let nm: *i64 = sys_mmap(N*8) as *i64; let ct: *i64 = sys_mmap(N*8) as *i64; let sha: *i64 = sys_mmap(N*8) as *i64
52 nm[0]=("syscalls" as *u8) as i64; nm[1]=("alloc" as *u8) as i64; nm[2]=("net" as *u8) as i64; nm[3]=("blockfs" as *u8) as i64; nm[4]=("tls" as *u8) as i64; nm[5]=("shell" as *u8) as i64
53 ct[0]=("pkg:syscalls:v1:payload" as *u8) as i64; ct[1]=("pkg:alloc:v1:payload" as *u8) as i64; ct[2]=("pkg:net:v1:payload" as *u8) as i64; ct[3]=("pkg:blockfs:v1:payload" as *u8) as i64; ct[4]=("pkg:tls:v1:payload" as *u8) as i64; ct[5]=("pkg:shell:v1:payload" as *u8) as i64
54 ndep[0]=0
55 ndep[1]=1; dep[1*MAXD+0]=0
56 ndep[2]=1; dep[2*MAXD+0]=0
57 ndep[3]=2; dep[3*MAXD+0]=1; dep[3*MAXD+1]=0
58 ndep[4]=1; dep[4*MAXD+0]=2
59 ndep[5]=2; dep[5*MAXD+0]=3; dep[5*MAXD+1]=1
60 var i: i64=0; while i<N { sha[i]=psum(ct[i] as *u8); i=i+1 } // manifest sha = trusted content checksum
61
62 // install "shell" (index 5): needed closure + dep-ordered install
63 let needed: *i64 = sys_mmap(N*8) as *i64; pkg_needed(5, ndep, dep, N, needed)
64 let order: *i64 = sys_mmap(N*8) as *i64; let oc: i64 = pkg_topo(ndep, dep, N, order)
65 g_puts(" install shell -> order: "); var nneed: i64=0; var ii: i64=0
66 while ii<oc { if needed[order[ii]]==1 { g_puts(nm[order[ii]] as *u8); g_puts(" " as *u8); nneed=nneed+1 } ii=ii+1 } g_puts("\n" as *u8)
67 // verify: needed = {syscalls,alloc,blockfs,shell}=4 (NOT net,tls); deps precede in the filtered order
68 let posneeded: *i64 = sys_mmap(N*8) as *i64; var pp: i64=0; var seq: i64=0
69 while pp<oc { if needed[order[pp]]==1 { posneeded[order[pp]]=seq; seq=seq+1 } pp=pp+1 }
70 var depok: i64=1; var u: i64=0
71 while u<N { if needed[u]==1 { var k: i64=0; while k<ndep[u] { if posneeded[dep[u*MAXD+k]] >= posneeded[u] { depok=0 } k=k+1 } } u=u+1 }
72 var t1: i64=0; if nneed==4 { if needed[2]==0 { if needed[4]==0 { if depok==1 { t1=1 } } } }
73 pass=pass+ck("T1: install 'shell' -> only transitive deps needed (4: syscalls/alloc/blockfs/shell), deps-ordered" as *u8, t1); total=total+1
74
75 // T2: every package verifies against its manifest sha
76 var allok: i64=1; i=0; while i<N { if pkg_verify(ct[i] as *u8, sha[i])==0 { allok=0 } i=i+1 }
77 var t2: i64=0; if allok==1 { t2=1 }
78 pass=pass+ck("T2: every package verifies (content sha == manifest sha)" as *u8, t2); total=total+1
79
80 // T3 teeth: a sha MISMATCH (tampered manifest/content) is rejected
81 var t3: i64=0; if pkg_verify(ct[3] as *u8, sha[3] ^ 0x55)==0 { if pkg_verify(ct[3] as *u8, sha[3])==1 { t3=1 } }
82 pass=pass+ck("T3 (teeth): a sha MISMATCH is rejected (supply-chain integrity) while the true sha passes" as *u8, t3); total=total+1
83
84 // T4 teeth: a dependency cycle is detected
85 let cn: i64=2; let cnd: *i64 = sys_mmap(cn*8) as *i64; let cdp: *i64 = sys_mmap(cn*MAXD*8) as *i64; let cord: *i64 = sys_mmap(cn*8) as *i64
86 cnd[0]=1; cdp[0*MAXD+0]=1; cnd[1]=1; cdp[1*MAXD+0]=0
87 let coc: i64 = pkg_topo(cnd, cdp, cn, cord)
88 var t4: i64=0; if coc<cn { t4=1 }
89 pass=pass+ck("T4 (teeth): a dependency cycle is detected (cannot resolve install order)" as *u8, t4); total=total+1
90
91 var okall: i64=0; if pass==total { okall=1 }
92 g_puts("---- nx_pkg: passed "); g_pn(pass); g_puts(" / "); g_pn(total); g_puts(" ----\n" as *u8)
93 if okall==1 {
94 let logf: i64=sys_openat_append("knowledge/status/pkg.log" as *u8, 420)
95 if logf>=0 { let z: i64=sys_write(logf,"NXPKG GREEN: dep-resolved (transitive closure + topo) + sha-verified install; mismatch+cycle rejected\n" as *u8,98); sys_close(logf) }
96 g_puts("verdict=GREEN (sovereign package manager: dep-resolved transitive install order, sha-verified integrity, mismatch+cycle rejected; the PACKAGE-MGMT gap)\n" as *u8); sys_exit(0); return 0
97 }
98 g_puts("verdict=RED\n" as *u8); sys_exit(1); return 1
99}