code wiki / _hdl_build / nx_realm_isolation_gate.nx
nx_realm_isolation_gate.nx source
↩ module page · 91 lines · 5343 B
1// nx_realm_isolation_gate.nx -- PROVES per-site OPAQUE realm isolation (operator 2026-06-17: "don't allow
2// andelinwest.com to share the same as nishifamily.com -- each site a SEPARATE opaque login"). Arms TWO
3// realms with SEPARATE keys + stores + realm_ids (nishifamily, andelinwest), registers + logs in a user in
4// each via the REAL Modern Auth (OPAQUE-3DH), then CROSS-VALIDATES: a token minted for one realm MUST be
5// rejected by the other. This is the multi-tenant separation property: no token crosses site boundaries.
6// T1 nishifamily token on nishifamily ctx -> OK
7// T2 nishifamily token on andelinwest ctx -> DENY (isolation: a family token is useless on the law firm)
8// T3 andelinwest token on andelinwest ctx -> OK
9// T4 andelinwest token on nishifamily ctx -> DENY (isolation: a client/lawyer token is useless on the family hub)
10// Sovereign: nx_modern_auth_flow + nx_syscalls. license_tier: ORIGINAL
11import "hub/nx_modern_auth_flow.nx"
12import "nx_syscalls.nx"
13
14func ri_w(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
15func ri_len(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n }
16func ri_row(name: *u8, ok: i64) -> i64 { if ok==1 { ri_w(" PASS " as *u8) } else { ri_w(" FAIL " as *u8) } ri_w(name); ri_w("\n" as *u8); return ok }
17func ri_trunc(path: *u8) -> i64 { let fd: i64 = sys_openat_wr(path, 0x180); if fd >= 0 { sys_close(fd) } return 0 }
18
19// arm a realm (own keys+store), register the user, log in -> token. returns 1 on success (ctx + tok filled).
20func ri_arm(keys: *u8, store: *u8, realm: *u8, handle: *u8, pass: *u8, ctx: *NxAuthContext, tok: *u8, tokn: *i64) -> i64 {
21 let realm_n: i64 = ri_len(realm)
22 let h_n: i64 = ri_len(handle)
23 let p_n: i64 = ri_len(pass)
24 let oprf: *u8 = sys_mmap(32)
25 let akp: *u8 = sys_mmap(32)
26 let akb: *u8 = sys_mmap(33)
27 let edp: *u8 = sys_mmap(32)
28 let edb: *u8 = sys_mmap(32)
29 if nx_uas_server_keys_load_or_init(keys, oprf, akp, akb, edp, edb) != NX_UAS_OK { return 0 }
30 if nx_auth_context_init(ctx, realm, realm_n, realm, realm_n, store as i64, oprf, edp, edb, 900, 8192, 1, 1, 5, 1) != NX_MAUTH_OK { return 0 }
31 let mn: *u8 = sys_mmap(512)
32 let mnn: *i64 = sys_mmap(8) as *i64
33 if nx_modern_auth_register(ctx, handle, h_n, pass, p_n, mn, 512, mnn) != NX_MAUTH_OK { return 0 }
34 tokn[0] = 0
35 if nx_modern_auth_login(ctx, handle, h_n, pass, p_n, tok, NX_MAUTH_SESSION_TOKEN_BYTES, tokn) != NX_MAUTH_OK { return 0 }
36 return 1
37}
38
39func ri_validate(ctx: *NxAuthContext, tok: *u8, tok_n: i64, now_s: i64) -> i64 {
40 let uh: *i64 = sys_mmap(8) as *i64
41 uh[0] = 0
42 return nx_modern_auth_validate_session(ctx, tok, tok_n, now_s, 0 as *u8, 0, uh)
43}
44
45func main() -> i64 {
46 ri_w("realm-isolation gate: separate OPAQUE realms per site (nishifamily vs andelinwest)\n" as *u8)
47 ri_trunc("/tmp/nx_ri_nf_keys.log" as *u8)
48 ri_trunc("/tmp/nx_ri_nf_store.log" as *u8)
49 ri_trunc("/tmp/nx_ri_aw_keys.log" as *u8)
50 ri_trunc("/tmp/nx_ri_aw_store.log" as *u8)
51
52 let ctx_nf: *NxAuthContext = sys_mmap(256) as *NxAuthContext
53 let tok_nf: *u8 = sys_mmap(NX_MAUTH_SESSION_TOKEN_BYTES)
54 let tokn_nf: *i64 = sys_mmap(8) as *i64
55 if ri_arm("/tmp/nx_ri_nf_keys.log" as *u8, "/tmp/nx_ri_nf_store.log" as *u8, "nishifamily" as *u8, "elder" as *u8, "nishifamily-secret-passphrase" as *u8, ctx_nf, tok_nf, tokn_nf) != 1 { ri_w("ARM nishifamily FAIL\n" as *u8); sys_exit(1) }
56
57 let ctx_aw: *NxAuthContext = sys_mmap(256) as *NxAuthContext
58 let tok_aw: *u8 = sys_mmap(NX_MAUTH_SESSION_TOKEN_BYTES)
59 let tokn_aw: *i64 = sys_mmap(8) as *i64
60 if ri_arm("/tmp/nx_ri_aw_keys.log" as *u8, "/tmp/nx_ri_aw_store.log" as *u8, "andelinwest" as *u8, "lawyer" as *u8, "andelinwest-secret-passphrase" as *u8, ctx_aw, tok_aw, tokn_aw) != 1 { ri_w("ARM andelinwest FAIL\n" as *u8); sys_exit(1) }
61
62 let now_s: i64 = sys_now_realtime_sec()
63 var pass: i64 = 0
64
65 let v1: i64 = ri_validate(ctx_nf, tok_nf, tokn_nf[0], now_s)
66 var t1: i64 = 0; if v1 == NX_MAUTH_OK { t1 = 1 }
67 pass = pass + ri_row("T1 nishifamily token on nishifamily realm -> OK\x00" as *u8, t1)
68
69 let v2: i64 = ri_validate(ctx_aw, tok_nf, tokn_nf[0], now_s)
70 var t2: i64 = 0; if v2 != NX_MAUTH_OK { t2 = 1 }
71 pass = pass + ri_row("T2 nishifamily token on andelinwest realm -> DENY (isolation)\x00" as *u8, t2)
72
73 let v3: i64 = ri_validate(ctx_aw, tok_aw, tokn_aw[0], now_s)
74 var t3: i64 = 0; if v3 == NX_MAUTH_OK { t3 = 1 }
75 pass = pass + ri_row("T3 andelinwest token on andelinwest realm -> OK\x00" as *u8, t3)
76
77 let v4: i64 = ri_validate(ctx_nf, tok_aw, tokn_aw[0], now_s)
78 var t4: i64 = 0; if v4 != NX_MAUTH_OK { t4 = 1 }
79 pass = pass + ri_row("T4 andelinwest token on nishifamily realm -> DENY (isolation)\x00" as *u8, t4)
80
81 if pass == 4 {
82 let line: *u8 = "CMSGATE row=nx_realm_isolation per-site-opaque-realms rows=4 pass=4 verdict=PASS\n" as *u8
83 let gf: i64 = sys_openat_append("knowledge/status/cms_gate.log" as *u8, 0x1a4)
84 if gf >= 0 { sys_write(gf, line, ri_len(line)); sys_close(gf) }
85 ri_w("REALM-ISOLATION GATE GREEN 4/4 (each site a separate OPAQUE realm; no token crosses site boundaries)\n" as *u8)
86 sys_exit(0)
87 }
88 ri_w("REALM-ISOLATION GATE RED\n" as *u8)
89 sys_exit(1)
90 return 1
91}