code wiki / _hdl_build / nx_vault_auth_test.nx

nx_vault_auth_test.nx source

↩ module page · 65 lines · 4830 B

1// nx_vault_auth_test.nx -- AUTHGATE: proves multi-auth methods end-to-end. Principals: a token, a userpass 2// user, an approle role -- each mapped to a policy. GREEN iff: each method logs in to its correct policy; 3// wrong secret / wrong method / unknown id all DENY; and the issued session is BOTH lease-bound (valid in 4// ttl, expired after -- composes nx_vault_lease) AND policy-bound (its ACL policy actually gates a path -- 5// composes nx_vault_acl). exit 0 on 7/7. 6import "nx_vault_auth.nx" 7import "nx_vault_acl.nx" 8import "nx_syscalls.nx" 9 10func ug_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 11func ug_num(v: i64) -> i64 { let b: *u8 = sys_mmap(28); var m: i64=v; if m<0 {m=0-m;sys_write(1,"-" as *u8,1)}; 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 } 12 13func main() -> i64 { 14 ug_puts("=== SOVEREIGN MULTI-AUTH (token / userpass / approle -> policy+lease-bound session) ===\n" as *u8) 15 let n: i64 = 3 16 let methods: *i64 = sys_mmap(24) as *i64 17 let id_h: *i64 = sys_mmap(24) as *i64 18 let sec_h: *i64 = sys_mmap(24) as *i64 19 let policy: *i64 = sys_mmap(24) as *i64 20 methods[0] = AM_TOKEN; id_h[0] = 0; sec_h[0] = 700001; policy[0] = 10 21 methods[1] = AM_USERPASS; id_h[1] = 800002; sec_h[1] = 800003; policy[1] = 20 22 methods[2] = AM_APPROLE; id_h[2] = 900004; sec_h[2] = 900005; policy[2] = 30 23 24 let lt: i64 = auth_login(methods, id_h, sec_h, policy, n, AM_TOKEN, 0, 700001) // token ok -> 10 25 let lu: i64 = auth_login(methods, id_h, sec_h, policy, n, AM_USERPASS, 800002, 800003) // userpass ok -> 20 26 let la: i64 = auth_login(methods, id_h, sec_h, policy, n, AM_APPROLE, 900004, 900005) // approle ok -> 30 27 let bad_sec: i64 = auth_login(methods, id_h, sec_h, policy, n, AM_USERPASS, 800002, 999999) // wrong pass -> -1 28 let bad_mth: i64 = auth_login(methods, id_h, sec_h, policy, n, AM_APPROLE, 800002, 800003) // userpass creds as approle -> -1 29 let bad_id: i64 = auth_login(methods, id_h, sec_h, policy, n, AM_USERPASS, 111111, 800003) // unknown user -> -1 30 31 // session for the token login: issued 2000, ttl 50 32 let sv_mid: i64 = auth_session_valid(2030, 2000, 50) // within ttl 33 let sv_exp: i64 = auth_session_valid(2100, 2000, 50) // after ttl 34 35 // policy 10 (the token's policy) ruleset: grants READ on kv/ -> prove the session's policy gates a path 36 let p10p: *i64 = sys_mmap(8) as *i64 37 let p10l: *i64 = sys_mmap(8) as *i64 38 let p10d: *i64 = sys_mmap(8) as *i64 39 let p10c: *i64 = sys_mmap(8) as *i64 40 p10p[0] = ("kv/" as *u8) as i64; p10l[0] = 3; p10d[0] = 0; p10c[0] = CAP_READ 41 let acl_read: i64 = acl_eval(p10p, p10l, p10d, p10c, 1, "kv/secret" as *u8, 9, CAP_READ) // allow 42 let acl_write: i64 = acl_eval(p10p, p10l, p10d, p10c, 1, "kv/secret" as *u8, 9, CAP_WRITE) // deny 43 44 ug_puts(" token->" as *u8); ug_num(lt); ug_puts(" userpass->" as *u8); ug_num(lu); ug_puts(" approle->" as *u8); ug_num(la) 45 ug_puts(" | wrong_sec=" as *u8); ug_num(bad_sec); ug_puts(" wrong_method=" as *u8); ug_num(bad_mth); ug_puts(" unknown_id=" as *u8); ug_num(bad_id) 46 ug_puts(" | session valid@2030=" as *u8); ug_num(sv_mid); ug_puts(" @2100=" as *u8); ug_num(sv_exp); ug_puts("\n" as *u8) 47 48 let r: *i64 = sys_mmap(8*8) as *i64 49 r[0] = 0; if lt == 10 { r[0] = 1 } // token -> its policy 50 r[1] = 0; if lu == 20 { r[1] = 1 } // userpass -> its policy 51 r[2] = 0; if la == 30 { r[2] = 1 } // approle -> its policy 52 r[3] = 0; if bad_sec == (0 - 1) { r[3] = 1 } // wrong secret denied 53 r[4] = 0; if bad_mth == (0 - 1) { r[4] = 1 } // wrong method denied 54 r[5] = 0; if bad_id == (0 - 1) { r[5] = 1 } // unknown id denied 55 r[6] = 0; if sv_mid == 1 { if sv_exp == 0 { if acl_read == 1 { if acl_write == 0 { r[6] = 1 } } } } // session lease+policy bound 56 57 var pass: i64 = 0; var i: i64 = 0 58 while i < 7 { pass = pass + r[i]; i = i + 1 } 59 ug_puts("----\n passed " as *u8); ug_num(pass); ug_puts("/7\n" as *u8) 60 if pass == 7 { 61 ug_puts("AUTHGATE methods=token+userpass+approle policy_bound=1 lease_bound=1 wrong_secret_denied=1 wrong_method_denied=1 unknown_id_denied=1 exceed[sovereign auth methods -> session bound to ACL policy (nx_vault_acl) + lease (nx_vault_lease) = HashiCorp auth-methods-class; prod hashes via nx_sha256] verdict=GREEN\n" as *u8) 62 sys_exit(0); return 0 63 } 64 ug_puts("AUTHGATE verdict=RED\n" as *u8); sys_exit(1); return 1 65}