nx_sign_envelope_gate.nx source
↩ module page · 123 lines · 5210 B
1// nx_sign_envelope_gate.nx -- INDEPENDENT gate for the Nishi Sign core lib (imports the SAME
2// shipped code the organ runs -- validation edge in the atlas, not a copy). Stronger than the
3// organ's self-test: tamper at EVERY chain position, truncation-tamper, cross-envelope
4// separation, persist round-trip. SELF-PUBLISHES its receipt to
5// knowledge/status/office_sign_gate.log (the ecomat live-derive evidence pointer; needle
6// "VERDICT=") -- evidence generated by the gate itself on the hub, never hand-asserted.
7// license_tier: ORIGINAL
8
9import "nx_sign_envelope_lib.nx"
10
11// chained head over the 3 canonical events
12func sg_head3(g: *u8, e0: *u8, l0: i64, e1: *u8, l1: i64, e2: *u8, l2: i64, out: *u8) -> i64 {
13 let a: *u8 = sys_mmap(40)
14 let b: *u8 = sys_mmap(40)
15 se_chain(g, e0, l0, a)
16 se_chain(a, e1, l1, b)
17 se_chain(b, e2, l2, out)
18 return 0
19}
20
21func main() -> i64 {
22 var pass: i64 = 0
23 let e0: *u8 = sys_mmap(SE_EVT_CAP)
24 let e1: *u8 = sys_mmap(SE_EVT_CAP)
25 let e2: *u8 = sys_mmap(SE_EVT_CAP)
26 let l0: i64 = se_event_encode("ENV-G" as *u8, 0, "alice@firm" as *u8, "created" as *u8, 2000, e0)
27 let l1: i64 = se_event_encode("ENV-G" as *u8, 1, "bob@client" as *u8, "signed" as *u8, 2100, e1)
28 let l2: i64 = se_event_encode("ENV-G" as *u8, 2, "alice@firm" as *u8, "completed" as *u8, 2200, e2)
29 let g: *u8 = sys_mmap(40)
30 se_genesis(g)
31 let head: *u8 = sys_mmap(40)
32 sg_head3(g, e0, l0, e1, l1, e2, l2, head)
33
34 // T1 determinism: identical recompute -> identical head
35 let rh: *u8 = sys_mmap(40)
36 sg_head3(g, e0, l0, e1, l1, e2, l2, rh)
37 if se_eq32(head, rh) == 1 { pass = pass + 1 }
38
39 // T2/T3/T4 tamper at EVERY position: flip one byte of event i -> head must differ
40 let tb: *u8 = sys_mmap(SE_EVT_CAP)
41 let th: *u8 = sys_mmap(40)
42 var ti: i64 = 0
43 while ti < 3 {
44 var sl: i64 = l0
45 var sp: *u8 = e0
46 if ti == 1 { sl = l1 sp = e1 }
47 if ti == 2 { sl = l2 sp = e2 }
48 var c: i64 = 0
49 while c < sl { tb[c] = sp[c]; c = c + 1 }
50 tb[sl / 2] = (tb[sl / 2] + 1) as u8
51 if ti == 0 { sg_head3(g, tb, l0, e1, l1, e2, l2, th) }
52 if ti == 1 { sg_head3(g, e0, l0, tb, l1, e2, l2, th) }
53 if ti == 2 { sg_head3(g, e0, l0, e1, l1, tb, l2, th) }
54 if se_eq32(head, th) == 0 { pass = pass + 1 }
55 ti = ti + 1
56 }
57
58 // T5 truncation-tamper: dropping the last event changes the head
59 let t2: *u8 = sys_mmap(40)
60 let t2b: *u8 = sys_mmap(40)
61 se_chain(g, e0, l0, t2)
62 se_chain(t2, e1, l1, t2b)
63 if se_eq32(head, t2b) == 0 { pass = pass + 1 }
64
65 // T6 cross-envelope separation: same signers/actions, different env id -> different head
66 let f0: *u8 = sys_mmap(SE_EVT_CAP)
67 let f1: *u8 = sys_mmap(SE_EVT_CAP)
68 let f2: *u8 = sys_mmap(SE_EVT_CAP)
69 let m0: i64 = se_event_encode("ENV-H" as *u8, 0, "alice@firm" as *u8, "created" as *u8, 2000, f0)
70 let m1: i64 = se_event_encode("ENV-H" as *u8, 1, "bob@client" as *u8, "signed" as *u8, 2100, f1)
71 let m2: i64 = se_event_encode("ENV-H" as *u8, 2, "alice@firm" as *u8, "completed" as *u8, 2200, f2)
72 let oh: *u8 = sys_mmap(40)
73 sg_head3(g, f0, m0, f1, m1, f2, m2, oh)
74 if se_eq32(head, oh) == 0 { pass = pass + 1 }
75
76 // T7 persist round-trip on the seg_store (byte-exact)
77 let hhex: *u8 = sys_mmap(80)
78 se_hex(head, hhex)
79 let ek: *i64 = sys_mmap(8 * 3) as *i64
80 let ev: *i64 = sys_mmap(8 * 3) as *i64
81 ek[0] = ("env" as *u8) as i64
82 ev[0] = ("ENV-G" as *u8) as i64
83 ek[1] = ("status" as *u8) as i64
84 ev[1] = ("completed" as *u8) as i64
85 ek[2] = ("audit_head" as *u8) as i64
86 ev[2] = hhex as i64
87 let rec: *u8 = sys_mmap(4096)
88 let rl: i64 = canon_encode(ek, ev, 3, rec)
89 let prefix: *u8 = "/tmp/nx_sign_gate-" as *u8
90 reg_put(prefix, "env:" as *u8, "env:__idx__" as *u8, "ENV-G" as *u8, rec, rl)
91 let po: *i64 = sys_mmap(16) as *i64
92 let lo: *i64 = sys_mmap(16) as *i64
93 var t7: i64 = 0
94 if reg_get(prefix, "env:" as *u8, "ENV-G" as *u8, po, lo) == 1 {
95 if lo[0] == rl {
96 let src: *u8 = po[0] as *u8
97 var eq: i64 = 1
98 var y: i64 = 0
99 while y < rl { if src[y] != rec[y] { eq = 0 } y = y + 1 }
100 if eq == 1 { t7 = 1 }
101 }
102 }
103 if t7 == 1 { pass = pass + 1 }
104
105 // ---- receipt (stdout + self-published evidence log) ----
106 let out: *u8 = sys_mmap(512)
107 var o: i64 = 0
108 o = se_catcopy(out, o, "OFFICE-SIGN-GATE tests=7 pass=" as *u8)
109 o = se_catn(out, o, pass)
110 o = se_catcopy(out, o, " tamper-all-positions+truncation+separation+persist head=" as *u8)
111 var z: i64 = 0
112 while z < 64 { out[o] = hhex[z]; o = o + 1; z = z + 1 }
113 o = se_catcopy(out, o, " VERDICT=" as *u8)
114 if pass == 7 { o = se_catcopy(out, o, "GREEN" as *u8) }
115 if pass != 7 { o = se_catcopy(out, o, "RED" as *u8) }
116 out[o] = 10 as u8
117 o = o + 1
118 let wrc: i64 = ss_writefile("knowledge/status/office_sign_gate.log" as *u8, out, o)
119 sys_write(1, out, o)
120 if wrc < 0 { sys_write(1, "logwrite=FAILED\n" as *u8, 16) }
121 if pass == 7 { return __syscall(93, 0, 0, 0, 0, 0, 0) }
122 return __syscall(93, 30 + pass, 0, 0, 0, 0, 0)
123}