code wiki / _hdl_build / nx_vault_acl_test.nx

nx_vault_acl_test.nx source

↩ module page · 54 lines · 4003 B

1// nx_vault_acl_test.nx -- ACLGATE: proves the path-based policy engine. Rules: secret/ -> READ; 2// secret/prod/ -> READ+WRITE; secret/prod/db -> EXPLICIT DENY; config/ -> READ+LIST. GREEN iff: 3// read on secret/dev allowed; write on secret/dev DENIED (not granted at that prefix); write on secret/prod 4// allowed (longest-prefix grant); secret/prod/db DENIED despite prod/ granting write (explicit-deny-wins); 5// unknown path DENIED (deny-by-default); list on config allowed; longest-prefix selection correct. 7/7. 6import "nx_vault_acl.nx" 7import "nx_syscalls.nx" 8 9func ag_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 10func ag_num(v: i64) -> i64 { let b: *u8 = sys_mmap(28); var m: i64=v; if m<0 {m=0-m}; let t: *u8 = sys_mmap(28); var k: i64=0; if m==0 {t[0]=48;k=1}; while m>0 {t[k]=48+(m%10); m=m/10; k=k+1}; var i: i64=0; while i<k {b[i]=t[k-1-i]; i=i+1}; sys_write(1,b,k); return 0 } 11 12func main() -> i64 { 13 ag_puts("=== SOVEREIGN ACL POLICY (deny-by-default, explicit-deny-wins, longest-prefix) ===\n" as *u8) 14 let n: i64 = 4 15 let paths: *i64 = sys_mmap(32) as *i64 16 let lens: *i64 = sys_mmap(32) as *i64 17 let deny: *i64 = sys_mmap(32) as *i64 18 let caps: *i64 = sys_mmap(32) as *i64 19 paths[0] = ("secret/" as *u8) as i64; lens[0] = 7; deny[0] = 0; caps[0] = CAP_READ 20 paths[1] = ("secret/prod/" as *u8) as i64; lens[1] = 12; deny[1] = 0; caps[1] = CAP_READ | CAP_WRITE 21 paths[2] = ("secret/prod/db" as *u8) as i64; lens[2] = 14; deny[2] = 1; caps[2] = 0 22 paths[3] = ("config/" as *u8) as i64; lens[3] = 7; deny[3] = 0; caps[3] = CAP_READ | CAP_LIST 23 24 let k1: i64 = acl_eval(paths, lens, deny, caps, n, "secret/dev/x" as *u8, 12, CAP_READ) 25 let k2: i64 = acl_eval(paths, lens, deny, caps, n, "secret/dev/x" as *u8, 12, CAP_WRITE) 26 let k3: i64 = acl_eval(paths, lens, deny, caps, n, "secret/prod/x" as *u8, 13, CAP_WRITE) 27 let k4: i64 = acl_eval(paths, lens, deny, caps, n, "secret/prod/db" as *u8, 14, CAP_READ) 28 let k5: i64 = acl_eval(paths, lens, deny, caps, n, "other/thing" as *u8, 11, CAP_READ) 29 let k6: i64 = acl_eval(paths, lens, deny, caps, n, "config/app" as *u8, 10, CAP_LIST) 30 let k7a: i64 = acl_eval(paths, lens, deny, caps, n, "secret/prod/x" as *u8, 13, CAP_WRITE) 31 let k7b: i64 = acl_eval(paths, lens, deny, caps, n, "secret/dev/x" as *u8, 12, CAP_WRITE) 32 33 ag_puts(" read@secret/dev=" as *u8); ag_num(k1); ag_puts(" write@secret/dev=" as *u8); ag_num(k2) 34 ag_puts(" write@secret/prod=" as *u8); ag_num(k3); ag_puts(" read@secret/prod/db(deny)=" as *u8); ag_num(k4) 35 ag_puts(" read@other(default)=" as *u8); ag_num(k5); ag_puts(" list@config=" as *u8); ag_num(k6); ag_puts("\n" as *u8) 36 37 let r: *i64 = sys_mmap(8*8) as *i64 38 r[0] = 0; if k1 == 1 { r[0] = 1 } // read allowed at secret/ 39 r[1] = 0; if k2 == 0 { r[1] = 1 } // write NOT granted at secret/ 40 r[2] = 0; if k3 == 1 { r[2] = 1 } // write allowed via longest-prefix secret/prod/ 41 r[3] = 0; if k4 == 0 { r[3] = 1 } // explicit deny wins over prod/ grant 42 r[4] = 0; if k5 == 0 { r[4] = 1 } // deny by default (no matching rule) 43 r[5] = 0; if k6 == 1 { r[5] = 1 } // list allowed at config/ 44 r[6] = 0; if k7a == 1 { if k7b == 0 { r[6] = 1 } } // longest-prefix selection is real 45 46 var pass: i64 = 0; var i: i64 = 0 47 while i < 7 { pass = pass + r[i]; i = i + 1 } 48 ag_puts("----\n passed " as *u8); ag_num(pass); ag_puts("/7\n" as *u8) 49 if pass == 7 { 50 ag_puts("ACLGATE deny_by_default=1 explicit_deny_wins=1 longest_prefix_grant=1 cap_bitmask=1 exceed[sovereign least-privilege path policy = HashiCorp policies-class; real string-prefix match, order-independent eval] verdict=GREEN\n" as *u8) 51 sys_exit(0); return 0 52 } 53 ag_puts("ACLGATE verdict=RED\n" as *u8); sys_exit(1); return 1 54}