code wiki / _hdl_build / nx_cmos_signed_gate.nx
nx_cmos_signed_gate.nx source
↩ module page · 100 lines · 4670 B
1// nx_cmos_signed_gate.nx -- proves authenticated CMOS config recovery.
2//
3// T0 golden-capsule-verifies : a platform-signed CMOS golden capsule verifies
4// T1 restore-authentic : restoring from the signed golden recovers a checksum-valid CMOS
5// N1 tampered-golden-refused : a byte-tampered golden capsule -> restore REFUSED (signature fails)
6// N2 forged-golden-refused : a golden signed by a DIFFERENT key -> restore REFUSED
7// N3 signed-but-invalid-refused: a validly-signed capsule whose payload is a BAD CMOS -> REFUSED (defense-in-depth)
8//
9// GREEN only if all five hold. ed25519 signs minimized. Evidence -> knowledge/status/cmos_signed_gate.log.
10// Sovereign: imports nx_cmos_signed (-> nx_cmos + nx_fw_capsule -> nx_ed25519) + nx_framed_append + nx_syscalls. license_tier: ORIGINAL
11import "nx_cmos_signed.nx"
12import "nx_framed_append.nx"
13import "nx_syscalls.nx"
14
15const CSG_LOG: *u8 = "knowledge/status/cmos_signed_gate.log"
16
17func cs_copy(src: *u8, dst: *u8) -> i64 {
18 let lb: *i64 = sys_mmap(16) as *i64; lb[0] = 0
19 let b: *u8 = cp_read(src, lb)
20 if (b as i64) == 0 { return 0 - 1 }
21 cp_write(dst, b, lb[0])
22 return 0
23}
24func csg_row(name: *u8, pass: i64) -> i64 {
25 let buf: *u8 = sys_mmap(528)
26 var o: i64 = 0
27 o = cp_cat(buf, o, "CMSG row=\x00" as *u8)
28 o = cp_cat(buf, o, name)
29 if pass == 1 { o = cp_cat(buf, o, " verdict=PASS\x00" as *u8) } else { o = cp_cat(buf, o, " verdict=FAIL\x00" as *u8) }
30 buf[o] = 0 as u8
31 fa_appendz(CSG_LOG, buf, 512)
32 c_puts(" "); c_puts(name)
33 if pass == 1 { c_puts(" PASS\n") } else { c_puts(" FAIL\n") }
34 return 0
35}
36
37func main() -> i64 {
38 c_puts("cmos-signed gate (authenticated config recovery)\n")
39 let e: i64 = sys_now_realtime_sec()
40 let p: i64 = __syscall(39, 0, 0, 0, 0, 0, 0)
41 let plat: *u8 = sys_mmap(32); cap_plat_seed(plat)
42 let forged: *u8 = sys_mmap(32); var i: i64 = 0; while i < 32 { forged[i] = ((i * 3 + 99) & 0xff) as u8; i = i + 1 }
43 let img: *u8 = sys_mmap(CMOS_SIZE + 16); cmos_golden(img)
44 let bad: *u8 = sys_mmap(CMOS_SIZE + 16); cmos_golden(bad); cmos_corrupt_raw(bad, 20) // signed-but-invalid CMOS
45 let work: *u8 = sys_mmap(CMOS_SIZE + 16)
46
47 let gcap: *u8 = sys_mmap(256); cap_path(gcap, "/tmp/cmsg_g." as *u8, e, p); cmos_golden_capsule(gcap, img, plat)
48 let fcap: *u8 = sys_mmap(256); cap_path(fcap, "/tmp/cmsg_f." as *u8, e, p); cmos_golden_capsule(fcap, img, forged)
49 let bcap: *u8 = sys_mmap(256); cap_path(bcap, "/tmp/cmsg_b." as *u8, e, p); cmos_golden_capsule(bcap, bad, plat)
50 let tcap: *u8 = sys_mmap(256); cap_path(tcap, "/tmp/cmsg_t." as *u8, e, p); cs_copy(gcap, tcap); cap_corrupt(tcap)
51
52 // T0 golden capsule verifies
53 var t0: i64 = 0; if cap_verify(gcap) == 1 { t0 = 1 }
54
55 // T1 restore from authentic golden recovers a valid CMOS
56 cmos_golden(work); cmos_corrupt_raw(work, 20)
57 let r1: i64 = cmos_restore_signed(work, gcap)
58 var t1: i64 = 0; if r1 == 0 { if cmos_valid(work) == 1 { t1 = 1 } }
59
60 // N1 tampered golden refused (and working left untouched/invalid)
61 cmos_golden(work); cmos_corrupt_raw(work, 20)
62 let r2: i64 = cmos_restore_signed(work, tcap)
63 var n1: i64 = 0; if r2 == CS_REFUSED { if cmos_valid(work) == 0 { n1 = 1 } }
64
65 // N2 forged golden refused
66 cmos_golden(work); cmos_corrupt_raw(work, 20)
67 let r3: i64 = cmos_restore_signed(work, fcap)
68 var n2: i64 = 0; if r3 == CS_REFUSED { n2 = 1 }
69
70 // N3 signed-but-invalid-CMOS refused (defense in depth: signature OK, but bad config)
71 var n3: i64 = 0
72 if cap_verify(bcap) == 1 { if cmos_restore_signed(work, bcap) == CS_REFUSED { n3 = 1 } }
73
74 var passes: i64 = 0
75 if t0 == 1 { passes = passes + 1 }
76 if t1 == 1 { passes = passes + 1 }
77 if n1 == 1 { passes = passes + 1 }
78 if n2 == 1 { passes = passes + 1 }
79 if n3 == 1 { passes = passes + 1 }
80 var green: i64 = 0
81 if passes == 5 { green = 1 }
82
83 csg_row("T0-golden-capsule-verifies\x00" as *u8, t0)
84 csg_row("T1-restore-authentic-valid\x00" as *u8, t1)
85 csg_row("N1-tampered-golden-refused\x00" as *u8, n1)
86 csg_row("N2-forged-golden-refused \x00" as *u8, n2)
87 csg_row("N3-signed-bad-cmos-refused\x00" as *u8, n3)
88
89 let vb: *u8 = sys_mmap(528)
90 var o: i64 = 0
91 o = cp_cat(vb, o, "CMOS-SIGNED verdict=\x00" as *u8)
92 if green == 1 { o = cp_cat(vb, o, "GREEN\x00" as *u8) } else { o = cp_cat(vb, o, "RED\x00" as *u8) }
93 o = cp_cat(vb, o, " passes=\x00" as *u8); o = cp_catn(vb, o, passes); o = cp_cat(vb, o, "/5 END\x00" as *u8)
94 vb[o] = 0 as u8
95 fa_appendz(CSG_LOG, vb, 512)
96 c_puts(vb); c_puts("\n")
97
98 if green == 1 { return 0 }
99 return 1
100}