nx_sign_ceremony.nx source
↩ module page · 50 lines · 2295 B
1// nx_sign_ceremony.nx -- Nishi Sign ceremony (F504) CLI/MCP organ: self-verifying demo
2// over nx_sign_ceremony_lib. Proves live: consent-gated signing (UETA), multi-signer
3// chain, refused-without-consent, sealed completion certificate. license_tier: ORIGINAL
4
5import "nx_sign_ceremony_lib.nx"
6const K_MAGIC_3000: i64 = 3000
7const K_MAGIC_3100: i64 = 3100
8const K_MAGIC_3200: i64 = 3200
9const K_MAGIC_2048: i64 = 2048
10
11func main() -> i64 {
12 let g: *u8 = sys_mmap(40)
13 se_genesis(g)
14 let doc: *u8 = "nxc1-doc00000000" as *u8
15 let h1: *u8 = sys_mmap(40)
16 let h2: *u8 = sys_mmap(40)
17 // Alice consents + signs
18 if sc_sign("ENV-A" as *u8, 0, "Alice Adams" as *u8, K_MAGIC_3000, "yes" as *u8, g, h1) != 1 { return __syscall(93, 51, 0, 0, 0, 0, 0) }
19 // Bob consents + signs (chains from Alice's head)
20 if sc_sign("ENV-A" as *u8, 1, "Bob Baker" as *u8, K_MAGIC_3100, "yes" as *u8, h1, h2) != 1 { return __syscall(93, 52, 0, 0, 0, 0, 0) }
21 // Mallory does NOT consent -> sign MUST be refused (UETA intent/consent)
22 let hx: *u8 = sys_mmap(40)
23 if sc_sign("ENV-A" as *u8, 2, "Mallory" as *u8, K_MAGIC_3200, "no" as *u8, h2, hx) != 0 { return __syscall(93, 53, 0, 0, 0, 0, 0) }
24 // head must have advanced twice (each signature changes the audit head)
25 if se_eq32(g, h2) == 1 { return __syscall(93, 54, 0, 0, 0, 0, 0) }
26 // completion certificate over 2 signed
27 let headhex: *u8 = sys_mmap(80)
28 se_hex(h2, headhex)
29 let cnt: *u8 = sys_mmap(16)
30 var co: i64 = se_catn(cnt, 0, 2)
31 cnt[co] = 0 as u8
32 let cert: *u8 = sys_mmap(K_MAGIC_2048)
33 let cl: i64 = sc_cert("ENV-A" as *u8, doc, cnt, headhex, cert)
34 let cid: *u8 = sys_mmap(80)
35 cid_of(cert, cl, cid)
36 sc_cert_put("/tmp/nx_ceremony_demo-" as *u8, "ENV-A" as *u8, cert, cl)
37
38 let out: *u8 = sys_mmap(512)
39 var o: i64 = 0
40 o = se_catcopy(out, o, "NISHI-SIGN-CEREMONY OK env=ENV-A matter=M1 signers=2/2 consent=UETA-OK no-consent-sign=REFUSED audit_head=" as *u8)
41 var z: i64 = 0
42 while z < 64 { out[o] = headhex[z]; o = o + 1; z = z + 1 }
43 o = se_catcopy(out, o, " cert_cid=" as *u8)
44 z = 0
45 while z < 69 { out[o] = cid[z]; o = o + 1; z = z + 1 }
46 out[o] = 10 as u8
47 o = o + 1
48 sys_write(1, out, o)
49 return __syscall(93, 0, 0, 0, 0, 0, 0)
50}