code wiki / _hdl_build / nx_deploy_stage_gate.nx
nx_deploy_stage_gate.nx source
↩ module page · 66 lines · 3839 B
1// nx_deploy_stage_gate.nx -- D001 gate (gv-verdict anchored) for the deploy rename-gap closer.
2// Proves the copy is byte-exact + SAFE BY CONSTRUCTION: refuses a non-.new dst (can't clobber a live binary),
3// refuses a non-ELF src, and stages a valid ELF byte-identically with a size-verified landing.
4// license_tier: ORIGINAL expect_exit: 0
5import "nx_deploy_stage_lib.nx"
6import "nx_gate_verdict.nx"
7
8func main() -> i64 {
9 let ctr: *i64 = gv_ctr()
10 gv_head("nx_deploy_stage_gate -- sovereign build->deploy rename-gap closer: byte-exact + safe-by-construction" as *u8)
11
12 // T1: .new suffix guard discriminates
13 var t1: i64 = 0
14 if ds_dst_is_new("sites.elf.new" as *u8) == 1 { if ds_dst_is_new("sites.elf" as *u8) == 0 { if ds_dst_is_new("x.new" as *u8) == 1 { if ds_dst_is_new("neww" as *u8) == 0 { t1 = 1 } } } }
15 gv_check("T1 dst .new guard: sites.elf.new ok, sites.elf refused, boundary correct" as *u8, t1, ctr)
16
17 // build a fixture ELF
18 let fx: *u8 = sys_mmap(4096)
19 fx[0]=127 as u8; fx[1]=69 as u8; fx[2]=76 as u8; fx[3]=70 as u8
20 var i: i64 = 4
21 while i < 1500 { fx[i] = (48 + (i % 40)) as u8; i = i + 1 }
22 let wf: i64 = sys_openat_wr("dsg_src.elf" as *u8, 420)
23 sys_write(wf, fx, 1500); sys_close(wf)
24
25 // T2: stage a valid ELF -> rc 0
26 let rc: i64 = ds_stage("dsg_src.elf" as *u8, "dsg_dst.elf.new" as *u8)
27 var t2: i64 = 0
28 if rc == 0 { t2 = 1 }
29 gv_check("T2 valid ELF stages -> rc 0" as *u8, t2, ctr)
30
31 // T3: landed bytes are byte-identical
32 var t3: i64 = 0
33 let vf: i64 = sys_openat_rd("dsg_dst.elf.new" as *u8)
34 if vf >= 0 {
35 let vb: *u8 = sys_mmap(4096)
36 let vn: i64 = sys_read(vf, vb, 4096)
37 sys_close(vf)
38 if vn == 1500 {
39 var mism: i64 = 0; var j: i64 = 0
40 while j < 1500 { if vb[j] != fx[j] { mism = 1; j = 1500 } else { j = j + 1 } }
41 if mism == 0 { t3 = 1 }
42 }
43 }
44 gv_check("T3 landed artifact is BYTE-IDENTICAL to source (1500B)" as *u8, t3, ctr)
45
46 // T4: refuse non-.new dst (cannot clobber a live binary) -> rc -2
47 var t4: i64 = 0
48 if ds_stage("dsg_src.elf" as *u8, "dsg_live.elf" as *u8) == (0 - 2) { t4 = 1 }
49 gv_check("T4 non-.new dst REFUSED rc=-2 (never overwrites a live binary -- safe by construction)" as *u8, t4, ctr)
50
51 // T5: refuse non-ELF src
52 let bf: i64 = sys_openat_wr("dsg_bad.txt" as *u8, 420)
53 sys_write(bf, "plain text not elf, but padded well over one kilobyte.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................." as *u8, 1100); sys_close(bf)
54 var t5: i64 = 0
55 if ds_stage("dsg_bad.txt" as *u8, "dsg_bad.elf.new" as *u8) == (0 - 4) { t5 = 1 }
56 gv_check("T5 non-ELF src REFUSED rc=-4 (bad magic) -- truncated/garbage stage cannot deploy" as *u8, t5, ctr)
57
58 // T6: embedded selftest (the CLI --kat contract)
59 var t6: i64 = 0
60 if ds_selftest() == 0 { t6 = 1 }
61 gv_check("T6 embedded selftest (CLI --kat contract) 0 fails" as *u8, t6, ctr)
62
63 let rcx: i64 = gv_verdict("DEPLOY-STAGE-GATE" as *u8, ctr, "byte-exact ELF copy into a .new slot; refuses non-.new dst + non-ELF src; safe-by-construction rename-gap closer" as *u8)
64 sys_exit(rcx)
65 return rcx
66}