code wiki / (root) / nx_sign_envelope_gate.nx

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}