code wiki / _hdl_build / nx_shard_rbac_gate.nx
nx_shard_rbac_gate.nx source
↩ module page · 93 lines · 6606 B
1import "nx_gate_gn.nx"
2// nx_shard_rbac_gate.nx -- PROOF of the s-class-exceed cross-shard federation (R2), the model that RETIRES the
3// dual-realm hack. It composes exactly what ma_level_of will wire: resolve a request's shard -> that shard's roles
4// file (nx_shard_registry.sr_roles_of) -> the session's level in it (nx_access_lib.ag_uid_to_level). ONE identity
5// realm; authority is scoped by PER-SHARD roles files. Proven with negative controls:
6// T1 operator manages shard A (level 3) T2 operator manages shard B too (level 3, one login spans shards)
7// T3 tenant owner manages THEIR shard (3) T4 (NEG) tenant owner CANNOT manage another shard (0) -- isolation
8// T5 (NEG) unknown session -> 0 everywhere (deny-by-default)
9// This is AWS delegated-admin / GCP folder-scoped IAM expressed as one TSV row per shard, no cross-realm validation.
10// Sovereign: nx_syscalls + nx_shard_registry + nx_access_lib. license_tier: ORIGINAL expect_exit: 0
11import "nx_syscalls.nx"
12import "nx_shard_registry.nx"
13import "nx_access_lib.nx"
14
15func gp(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
16func g_app(buf: *u8, off: i64, s: *u8) -> i64 { var i: i64 = 0; while s[i] != (0 as u8) { buf[off + i] = s[i]; i = i + 1 } return off + i }
17func g_slen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
18func g_write_file(path: *u8, buf: *u8, n: i64) -> i64 {
19 let fd: i64 = sys_openat_wr(path, 0x1a4)
20 if fd < 0 { return 0 - 1 }
21 sys_write(fd, buf, n); sys_close(fd)
22 return n
23}
24func g_shard(buf: *u8, off: i64, id: *u8, dom: *u8, svc: *u8, port: *u8, realm: *u8, keys: *u8, store: *u8, roles: *u8, health: *u8) -> i64 {
25 var o: i64 = g_app(buf, off, id); buf[o]=9 as u8; o=o+1
26 o = g_app(buf, o, dom); buf[o]=9 as u8; o=o+1
27 o = g_app(buf, o, svc); buf[o]=9 as u8; o=o+1
28 o = g_app(buf, o, port); buf[o]=9 as u8; o=o+1
29 o = g_app(buf, o, realm); buf[o]=9 as u8; o=o+1
30 o = g_app(buf, o, keys); buf[o]=9 as u8; o=o+1
31 o = g_app(buf, o, store); buf[o]=9 as u8; o=o+1
32 o = g_app(buf, o, roles); buf[o]=9 as u8; o=o+1
33 o = g_app(buf, o, health); buf[o]=10 as u8; o=o+1
34 return o
35}
36
37// the R2 composition, verbatim what ma_level_of does: shard-id -> that shard's roles file -> the session's level.
38func resolve(reg: *u8, rn: i64, idx_path: *u8, uid: *u8, uidn: i64, shard: *u8, slen: i64) -> i64 {
39 let roles: *u8 = sys_mmap(256)
40 if sr_roles_of(reg, rn, shard, slen, roles, 256) <= 0 { return 0 } // no such shard -> deny
41 return ag_uid_to_level(uid, uidn, idx_path, roles)
42}
43
44func main(argc: i64, argv: *i64) -> i64 {
45 gp("=== nx_shard_rbac_gate (PROVE cross-shard federation: one realm, per-shard roles, isolation) ===\n" as *u8)
46
47 // fixture uid->handle index: uid 0xAA -> elderwesto (operator), 0xBB -> adw_owner (a tenant owner)
48 let idx: *u8 = sys_mmap(256); var ix: i64 = 0
49 ix = g_app(idx, ix, "aa" as *u8); idx[ix]=9 as u8; ix=ix+1; ix = g_app(idx, ix, "elderwesto" as *u8); idx[ix]=10 as u8; ix=ix+1
50 ix = g_app(idx, ix, "bb" as *u8); idx[ix]=9 as u8; ix=ix+1; ix = g_app(idx, ix, "adw_owner" as *u8); idx[ix]=10 as u8; ix=ix+1
51 g_write_file("/tmp/sr_idx.tsv" as *u8, idx, ix)
52
53 // per-shard roles: nishifamily has ONLY the operator; andelinwest has the operator AND its owner.
54 let rnf: *u8 = sys_mmap(128); var rnfn: i64 = 0
55 rnfn = g_app(rnf, rnfn, "elderwesto" as *u8); rnf[rnfn]=9 as u8; rnfn=rnfn+1; rnf[rnfn]=51 as u8; rnfn=rnfn+1; rnf[rnfn]=10 as u8; rnfn=rnfn+1
56 g_write_file("/tmp/sr_roles_nf.tsv" as *u8, rnf, rnfn)
57 let radw: *u8 = sys_mmap(128); var radwn: i64 = 0
58 radwn = g_app(radw, radwn, "elderwesto" as *u8); radw[radwn]=9 as u8; radwn=radwn+1; radw[radwn]=51 as u8; radwn=radwn+1; radw[radwn]=10 as u8; radwn=radwn+1
59 radwn = g_app(radw, radwn, "adw_owner" as *u8); radw[radwn]=9 as u8; radwn=radwn+1; radw[radwn]=51 as u8; radwn=radwn+1; radw[radwn]=10 as u8; radwn=radwn+1
60 g_write_file("/tmp/sr_roles_adw.tsv" as *u8, radw, radwn)
61
62 // fixture shards registry pointing each shard at its per-shard roles file
63 let reg: *u8 = sys_mmap(4096); var rn: i64 = 0
64 rn = g_shard(reg, rn, "nishifamily-mgmt" as *u8, "nishifamily.com" as *u8, "mgmt" as *u8, "18098" as *u8, "nishi_site_admin" as *u8, "k" as *u8, "s" as *u8, "/tmp/sr_roles_nf.tsv" as *u8, "api" as *u8)
65 rn = g_shard(reg, rn, "andelinwest-portal" as *u8, "andelinwest.com" as *u8, "docportal" as *u8, "18456" as *u8, "andelinwest_docportal" as *u8, "k" as *u8, "s" as *u8, "/tmp/sr_roles_adw.tsv" as *u8, "andelinwest" as *u8)
66
67 let uid_op: *u8 = sys_mmap(8); uid_op[0]=0xaa as u8 // operator session uid
68 let uid_tn: *u8 = sys_mmap(8); uid_tn[0]=0xbb as u8 // tenant-owner session uid
69 let uid_gh: *u8 = sys_mmap(8); uid_gh[0]=0xcc as u8 // unknown session uid
70 let SM: *u8 = "nishifamily-mgmt" as *u8; let SMn: i64 = g_slen(SM)
71 let SA: *u8 = "andelinwest-portal" as *u8; let SAn: i64 = g_slen(SA)
72 let IDX: *u8 = "/tmp/sr_idx.tsv" as *u8
73 var pass: i64 = 0; var fail: i64 = 0
74
75 let a1: i64 = resolve(reg, rn, IDX, uid_op, 1, SM, SMn)
76 if a1 == 3 { pass=pass+1; gp(" T1 operator manages nishifamily-mgmt (lvl 3) PASS\n" as *u8) } else { fail=fail+1; gp(" T1 FAIL lvl=" as *u8); gn(a1); gp("\n" as *u8) }
77
78 let a2: i64 = resolve(reg, rn, IDX, uid_op, 1, SA, SAn)
79 if a2 == 3 { pass=pass+1; gp(" T2 operator manages andelinwest-portal too (one login spans shards, lvl 3) PASS\n" as *u8) } else { fail=fail+1; gp(" T2 FAIL lvl=" as *u8); gn(a2); gp("\n" as *u8) }
80
81 let a3: i64 = resolve(reg, rn, IDX, uid_tn, 1, SA, SAn)
82 if a3 == 3 { pass=pass+1; gp(" T3 tenant owner manages THEIR shard (lvl 3) PASS\n" as *u8) } else { fail=fail+1; gp(" T3 FAIL lvl=" as *u8); gn(a3); gp("\n" as *u8) }
83
84 let a4: i64 = resolve(reg, rn, IDX, uid_tn, 1, SM, SMn)
85 if a4 == 0 { pass=pass+1; gp(" T4 tenant owner CANNOT manage nishifamily (lvl 0 -- cross-shard ISOLATION) PASS\n" as *u8) } else { fail=fail+1; gp(" T4 FAIL lvl=" as *u8); gn(a4); gp("\n" as *u8) }
86
87 let a5: i64 = resolve(reg, rn, IDX, uid_gh, 1, SA, SAn)
88 if a5 == 0 { pass=pass+1; gp(" T5 unknown session -> 0 (deny-by-default) PASS\n" as *u8) } else { fail=fail+1; gp(" T5 FAIL lvl=" as *u8); gn(a5); gp("\n" as *u8) }
89
90 gp("RESULT pass=" as *u8); gn(pass); gp(" fail=" as *u8); gn(fail)
91 if fail == 0 { gp(" verdict=GREEN (federation proven: one realm, per-shard authority, isolation)\n" as *u8); sys_exit(0); return 0 }
92 gp(" verdict=RED\n" as *u8); sys_exit(1); return 1
93}