code wiki / _hdl_build / nx_fw_capsule_gate.nx
nx_fw_capsule_gate.nx source
↩ module page · 87 lines · 3712 B
1// nx_fw_capsule_gate.nx -- proves the signed capsule = Secure-Boot-grade integrity.
2//
3// T1 authentic-verifies : a capsule signed by the platform key -> cap_verify == 1
4// N1 corrupted-rejected : flip a payload byte (signature no longer matches)-> cap_verify == 0
5// N2 FORGED-rejected : signed with a DIFFERENT key (forgery) -> cap_verify == 0
6// N3 garbage-rejected : a too-short / non-capsule blob -> cap_verify == 0
7//
8// N2 is the capability sha256 LACKS: a forger can recompute a hash, but cannot forge a signature
9// without the platform private key. GREEN only if all four hold. Evidence -> knowledge/status/fw_capsule_gate.log.
10// Sovereign: imports nx_fw_capsule (-> nx_ed25519) + nx_framed_append + nx_syscalls. license_tier: ORIGINAL
11import "nx_fw_capsule.nx"
12import "nx_framed_append.nx"
13import "nx_syscalls.nx"
14
15const CGC_LOG: *u8 = "knowledge/status/fw_capsule_gate.log"
16const CGC_PAY: *u8 = "NISHI-fw-capsule-gate-payload-image"
17
18func cgc_len(s: *u8) -> i64 { var i: i64 = 0; while s[i] != 0 as u8 { i = i + 1 } return i }
19func cgc_row(name: *u8, pass: i64) -> i64 {
20 let buf: *u8 = sys_mmap(528)
21 var o: i64 = 0
22 o = cp_cat(buf, o, "CAPG row=\x00" as *u8)
23 o = cp_cat(buf, o, name)
24 if pass == 1 { o = cp_cat(buf, o, " verdict=PASS\x00" as *u8) } else { o = cp_cat(buf, o, " verdict=FAIL\x00" as *u8) }
25 buf[o] = 0 as u8
26 fa_appendz(CGC_LOG, buf, 512)
27 cp_puts(" "); cp_puts(name)
28 if pass == 1 { cp_puts(" PASS\n") } else { cp_puts(" FAIL\n") }
29 return 0
30}
31
32func main() -> i64 {
33 cp_puts("fw-capsule gate (Secure-Boot-grade: authentic / corrupted / FORGED / garbage)\n")
34 let e: i64 = sys_now_realtime_sec()
35 let p: i64 = __syscall(39, 0, 0, 0, 0, 0, 0)
36 let pl: i64 = cgc_len(CGC_PAY)
37 let plat: *u8 = sys_mmap(32); cap_plat_seed(plat)
38 let forged: *u8 = sys_mmap(32); var i: i64 = 0; while i < 32 { forged[i] = ((i * 3 + 99) & 0xff) as u8; i = i + 1 }
39 let cap: *u8 = sys_mmap(256)
40
41 // T1 authentic
42 cap_path(cap, "/tmp/capg_t1." as *u8, e, p)
43 cap_make(cap, CGC_PAY, pl, plat)
44 var t1: i64 = 0; if cap_verify(cap) == 1 { t1 = 1 }
45
46 // N1 corrupted
47 cap_path(cap, "/tmp/capg_n1." as *u8, e, p)
48 cap_make(cap, CGC_PAY, pl, plat)
49 cap_corrupt(cap)
50 var n1: i64 = 0; if cap_verify(cap) == 0 { n1 = 1 }
51
52 // N2 forged (different key)
53 cap_path(cap, "/tmp/capg_n2." as *u8, e, p)
54 cap_make(cap, CGC_PAY, pl, forged)
55 var n2: i64 = 0; if cap_verify(cap) == 0 { n2 = 1 }
56
57 // N3 garbage / too short
58 cap_path(cap, "/tmp/capg_n3." as *u8, e, p)
59 let g: *u8 = sys_mmap(32); var j: i64 = 0; while j < 16 { g[j] = 0xff as u8; j = j + 1 }
60 cp_write(cap, g, 16)
61 var n3: i64 = 0; if cap_verify(cap) == 0 { n3 = 1 }
62
63 var passes: i64 = 0
64 if t1 == 1 { passes = passes + 1 }
65 if n1 == 1 { passes = passes + 1 }
66 if n2 == 1 { passes = passes + 1 }
67 if n3 == 1 { passes = passes + 1 }
68 var green: i64 = 0
69 if passes == 4 { green = 1 }
70
71 cgc_row("T1-authentic-verifies \x00" as *u8, t1)
72 cgc_row("N1-corrupted-rejected \x00" as *u8, n1)
73 cgc_row("N2-FORGED-rejected \x00" as *u8, n2)
74 cgc_row("N3-garbage-rejected \x00" as *u8, n3)
75
76 let vb: *u8 = sys_mmap(528)
77 var o: i64 = 0
78 o = cp_cat(vb, o, "FW-CAPSULE verdict=\x00" as *u8)
79 if green == 1 { o = cp_cat(vb, o, "GREEN\x00" as *u8) } else { o = cp_cat(vb, o, "RED\x00" as *u8) }
80 o = cp_cat(vb, o, " passes=\x00" as *u8); o = cp_catn(vb, o, passes); o = cp_cat(vb, o, "/4 END\x00" as *u8)
81 vb[o] = 0 as u8
82 fa_appendz(CGC_LOG, vb, 512)
83 cp_puts(vb); cp_puts("\n")
84
85 if green == 1 { return 0 }
86 return 1
87}