code wiki / _hdl_build / nx_vault_dynamic_test.nx
nx_vault_dynamic_test.nx source
↩ module page · 51 lines · 3425 B
1// nx_vault_dynamic_test.nx -- DYNGATE: proves dynamic secrets. GREEN iff: two issues yield DISTINCT creds;
2// the issued cred is valid within its ttl and AUTO-EXPIRES after (lease-bound); revoke invalidates
3// immediately; the generator is reproducible (deterministic for replay) AND depends on both seed and role
4// (so creds aren't guessable from the counter alone). exit 0 on 7/7.
5import "nx_vault_dynamic.nx"
6import "nx_syscalls.nx"
7
8func dg_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
9func dg_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 }
10
11func main() -> i64 {
12 dg_puts("=== SOVEREIGN DYNAMIC SECRETS (generate-on-demand, lease-bound) ===\n" as *u8)
13 let role: i64 = 42
14 let role2: i64 = 99
15 let seed: i64 = 51966 // 0xCAFE
16 let seed2: i64 = 48879 // 0xBEEF
17
18 let cred0: i64 = dyn_gen_cred(role, 0, seed)
19 let cred1: i64 = dyn_gen_cred(role, 1, seed)
20 let cred0b: i64 = dyn_gen_cred(role, 0, seed) // reproduce same inputs
21 let cred0_seed2: i64 = dyn_gen_cred(role, 0, seed2) // different seed
22 let cred0_role2: i64 = dyn_gen_cred(role2, 0, seed) // different role
23
24 // lease for the issued cred: issued at 1000, ttl 60, max_ttl 120
25 let v_mid: i64 = dyn_valid(1030, 1000, 60, 0) // within ttl
26 let v_exp: i64 = dyn_valid(1100, 1000, 60, 0) // after ttl -> auto-expired
27 let v_rev: i64 = dyn_valid(1030, 1000, 60, 1) // revoked -> invalid despite time
28 let rem: i64 = dyn_remaining(1030, 1000, 60, 0) // 30 left
29
30 dg_puts(" cred0!=cred1: " as *u8); dg_num(cred0); dg_puts(" / " as *u8); dg_num(cred1); dg_puts("\n" as *u8)
31 dg_puts(" valid@1030=" as *u8); dg_num(v_mid); dg_puts(" expired@1100=" as *u8); dg_num(v_exp)
32 dg_puts(" valid-when-revoked=" as *u8); dg_num(v_rev); dg_puts(" remaining@1030=" as *u8); dg_num(rem); dg_puts("\n" as *u8)
33
34 let r: *i64 = sys_mmap(8*8) as *i64
35 r[0] = 0; if cred0 != cred1 { r[0] = 1 } // distinct per issue
36 r[1] = 0; if v_mid == 1 { r[1] = 1 } // valid within ttl
37 r[2] = 0; if v_exp == 0 { r[2] = 1 } // auto-expires (lease-bound)
38 r[3] = 0; if v_rev == 0 { r[3] = 1 } // revoke invalidates immediately
39 r[4] = 0; if cred0b == cred0 { r[4] = 1 } // reproducible (deterministic for replay)
40 r[5] = 0; if cred0_seed2 != cred0 { r[5] = 1 } // seed-dependent (not counter-guessable)
41 r[6] = 0; if cred0_role2 != cred0 { if rem == 30 { r[6] = 1 } } // role-dependent + remaining correct
42
43 var pass: i64 = 0; var i: i64 = 0
44 while i < 7 { pass = pass + r[i]; i = i + 1 }
45 dg_puts("----\n passed " as *u8); dg_num(pass); dg_puts("/7\n" as *u8)
46 if pass == 7 {
47 dg_puts("DYNGATE distinct_per_issue=1 lease_bound_auto_expiry=1 revoke_immediate=1 reproducible=1 seed_role_dependent=1 exceed[sovereign generate-on-demand short-lived creds = HashiCorp dynamic-secrets-class; leak bounded to one lease; prod generator = CSPRNG] verdict=GREEN\n" as *u8)
48 sys_exit(0); return 0
49 }
50 dg_puts("DYNGATE verdict=RED\n" as *u8); sys_exit(1); return 1
51}