code wiki / _hdl_build / nx_room_key_gate.nx
nx_room_key_gate.nx source
↩ module page · 84 lines · 4056 B
1import "nx_gate_base.nx"
2// nx_room_key_gate.nx -- adversarial gate for room capability tokens. Determinism, lane-strip, query
3// parsing, list matching, hostile refusal. license_tier: ORIGINAL
4import "nx_syscalls.nx"
5import "nx_room_key.nx"
6
7func grow(name: *u8, ok: i64) -> i64 { if ok==1 { gw(" PASS " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw("
8" as *u8); return ok }
9func gn(v: i64) -> i64 {
10 let b: *u8=sys_mmap(28); var m: i64=v; if m<0{sys_write(1,"-" as *u8,1);m=0-m}
11 let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48 as u8;k=1} while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1}
12 var i: i64=0; while i<k{b[i]=t[k-1-i];i=i+1} sys_write(1,b,k); return 0 }
13func ck(name: *u8, ok: i64, p: *i64, t: *i64) -> i64 {
14 t[0]=t[0]+1
15 gw(" " as *u8); gw(name)
16 if ok==1 { gw(" PASS\n" as *u8); p[0]=p[0]+1 } else { gw(" FAIL\n" as *u8) }
17 return 0 }
18func eqn(a: *u8, b: *u8, n: i64) -> i64 { var i: i64=0; while i<n { if a[i]!=b[i]{return 0} i=i+1 } return 1 }
19
20func main() -> i64 {
21 gw("=== nx_room_key_gate ===\n" as *u8)
22 let p: *i64 = sys_mmap(16) as *i64; let t: *i64 = sys_mmap(16) as *i64
23 var ok: i64 = 1
24
25 // T1 token: deterministic, room-sensitive, secret-sensitive, 16 lowercase-hex chars.
26 let o1: *u8 = sys_mmap(64); let o2: *u8 = sys_mmap(64); let o3: *u8 = sys_mmap(64); let o4: *u8 = sys_mmap(64)
27 rk_token("vault" as *u8, 5, "s3cr3t" as *u8, 6, o1)
28 rk_token("vault" as *u8, 5, "s3cr3t" as *u8, 6, o2)
29 rk_token("vault2" as *u8, 6, "s3cr3t" as *u8, 6, o3)
30 rk_token("vault" as *u8, 5, "OTHER" as *u8, 5, o4)
31 if eqn(o1, o2, 16) != 1 { ok = 0 }
32 if eqn(o1, o3, 16) == 1 { ok = 0 }
33 if eqn(o1, o4, 16) == 1 { ok = 0 }
34 var hx: i64 = 1
35 var i: i64 = 0
36 while i < 16 {
37 var c: i64 = o1[i] & 0xff
38 var good: i64 = 0
39 if c >= 48 { if c <= 57 { good = 1 } }
40 if c >= 97 { if c <= 102 { good = 1 } }
41 if good == 0 { hx = 0 }
42 i = i + 1
43 }
44 if hx != 1 { ok = 0 }
45 ck("T1 token deterministic + input-sensitive + hex16 \x00" as *u8, ok, p, t)
46
47 // T2 lane-strip: one key covers vault, vault#1, vault#2.
48 ok = 1
49 if rk_base_len("vault" as *u8, 5) != 5 { ok = 0 }
50 if rk_base_len("vault#1" as *u8, 7) != 5 { ok = 0 }
51 if rk_base_len("vault#2" as *u8, 7) != 5 { ok = 0 }
52 let o5: *u8 = sys_mmap(64)
53 rk_token("vault#1" as *u8, rk_base_len("vault#1" as *u8, 7), "s3cr3t" as *u8, 6, o5)
54 if eqn(o1, o5, 16) != 1 { ok = 0 }
55 ck("T2 lane suffix stripped: one key, all lanes \x00" as *u8, ok, p, t)
56
57 // T3 query parse: ?k= extracted; identity excludes query; missing/empty -> -1.
58 ok = 1
59 let pth: *u8 = "/signal/vault?k=abc123" as *u8
60 let ko: *u8 = sys_mmap(64)
61 if rk_parse_k(pth, 22, ko, 32) != 6 { ok = 0 }
62 if eqn(ko, "abc123" as *u8, 6) != 1 { ok = 0 }
63 if rk_path_no_query(pth, 22) != 13 { ok = 0 }
64 if rk_path_no_query("/signal/open" as *u8, 12) != 12 { ok = 0 }
65 if rk_parse_k("/signal/open" as *u8, 12, ko, 32) != (0-1) { ok = 0 }
66 if rk_parse_k("/signal/x?k=" as *u8, 12, ko, 32) != (0-1) { ok = 0 }
67 ck("T3 query parse + identity excludes query \x00" as *u8, ok, p, t)
68
69 // T4 protected list: exact-line match, CRLF-tolerant, no substring false-positives.
70 ok = 1
71 let lst: *u8 = "family\r\nvault\nops\n" as *u8
72 if rk_protected(lst, 18, "vault" as *u8, 5) != 1 { ok = 0 }
73 if rk_protected(lst, 18, "family" as *u8, 6) != 1 { ok = 0 }
74 if rk_protected(lst, 18, "ops" as *u8, 3) != 1 { ok = 0 }
75 if rk_protected(lst, 18, "vaul" as *u8, 4) != 0 { ok = 0 }
76 if rk_protected(lst, 18, "vaultx" as *u8, 6) != 0 { ok = 0 }
77 if rk_protected(lst, 18, "am" as *u8, 2) != 0 { ok = 0 }
78 if rk_protected(lst, 0, "vault" as *u8, 5) != 0 { ok = 0 } // empty list = everything open
79 ck("T4 protected list exact-match, CRLF, no-substr \x00" as *u8, ok, p, t)
80
81 gw("ROOM-KEY: " as *u8); gn(p[0]); gw("/" as *u8); gn(t[0])
82 if p[0]==t[0] { gw(" ALL GREEN\n" as *u8); return 0 }
83 gw(" RED\n" as *u8)
84 return 1 }