code wiki / _hdl_build / nx_vault_transit_test.nx
nx_vault_transit_test.nx source
↩ module page · 83 lines · 5119 B
1// nx_vault_transit_test.nx -- TRANSITGATE: proves the sovereign transit engine (encryption-as-a-service)
2// with REAL AES-128-GCM. GREEN iff: encrypt->decrypt roundtrips; the envelope stamps the key version;
3// after rotation an OLD-version envelope still decrypts (versioned keyring); rewrap re-encrypts an old
4// envelope to the latest version (ciphertext CHANGES, plaintext preserved, caller gets no plaintext);
5// tamper FAILS CLOSED; and version routing works (encrypt v2 -> decrypt routes to v2). exit 0 on 7/7.
6import "nx_vault_transit.nx"
7import "nx_syscalls.nx"
8
9func tt_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 tt_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 }
11func tt_eq(a: *u8, b: *u8, n: i64) -> i64 { var i: i64 = 0; while i < n { if a[i] != b[i] { return 0 } i = i + 1 } return 1 }
12func tt_fill(buf: *u8, val: i64, n: i64) -> i64 { var i: i64 = 0; while i < n { buf[i] = val as u8; i = i + 1 } return 0 }
13
14func main() -> i64 {
15 tt_puts("=== SOVEREIGN TRANSIT (encryption-as-a-service, real AES-128-GCM) ===\n" as *u8)
16 let neg1: i64 = 0 - 1
17
18 // versioned keyring: v1 (0x11*16), v2 (0x22*16) -- distinct keys
19 let keyring: *u8 = sys_mmap(32)
20 tt_fill(keyring, 0x11, 16)
21 tt_fill(((keyring as i64) + 16) as *u8, 0x22, 16)
22 let key_count: i64 = 2
23
24 let iv1: *u8 = sys_mmap(16); tt_fill(iv1, 0xA1, 12)
25 let iv2: *u8 = sys_mmap(16); tt_fill(iv2, 0xB2, 12)
26 let iv3: *u8 = sys_mmap(16); tt_fill(iv3, 0xC3, 12)
27 let pt: *u8 = "transit-secret" as *u8
28 let pt_len: i64 = 14
29
30 // K1: encrypt under v1, decrypt -> roundtrip (real AES-GCM)
31 let env1: *u8 = sys_mmap(256)
32 let e1len: i64 = tr_encrypt(keyring, 1, iv1, pt, pt_len, env1)
33 let out1: *u8 = sys_mmap(256)
34 let d1: i64 = tr_decrypt(keyring, key_count, env1, e1len, out1)
35
36 // K3: after rotation (latest=2) the v1 envelope STILL decrypts
37 let out3: *u8 = sys_mmap(256)
38 let d3: i64 = tr_decrypt(keyring, key_count, env1, e1len, out3)
39
40 // K4: rewrap v1 -> v2
41 let env2: *u8 = sys_mmap(256)
42 let e2len: i64 = tr_rewrap(keyring, key_count, 2, env1, e1len, iv3, env2)
43 let out4: *u8 = sys_mmap(256)
44 let d4: i64 = tr_decrypt(keyring, key_count, env2, e2len, out4)
45 let c1: *u8 = ((env1 as i64) + TR_CT_OFF) as *u8
46 let c2: *u8 = ((env2 as i64) + TR_CT_OFF) as *u8
47
48 // K5: tamper a ciphertext byte -> fails closed
49 let envT: *u8 = sys_mmap(256)
50 var i: i64 = 0; while i < e1len { envT[i] = env1[i]; i = i + 1 }
51 envT[TR_CT_OFF] = (envT[TR_CT_OFF] as i64 ^ 0x5a) as u8
52 let outT: *u8 = sys_mmap(256)
53 let dT: i64 = tr_decrypt(keyring, key_count, envT, e1len, outT)
54
55 // K6: encrypt directly under v2 -> decrypt routes to v2
56 let env6: *u8 = sys_mmap(256)
57 let e6len: i64 = tr_encrypt(keyring, 2, iv2, pt, pt_len, env6)
58 let out6: *u8 = sys_mmap(256)
59 let d6: i64 = tr_decrypt(keyring, key_count, env6, e6len, out6)
60
61 tt_puts(" v1 roundtrip d=" as *u8); tt_num(d1); tt_puts(" ver=" as *u8); tt_num(env1[TR_VER_OFF] as i64)
62 tt_puts(" | rotate+old-open d=" as *u8); tt_num(d3)
63 tt_puts(" | rewrap->v" as *u8); tt_num(env2[TR_VER_OFF] as i64); tt_puts(" d=" as *u8); tt_num(d4)
64 tt_puts(" | tamper d=" as *u8); tt_num(dT); tt_puts(" | v2-route d=" as *u8); tt_num(d6); tt_puts("\n" as *u8)
65
66 let r: *i64 = sys_mmap(8*8) as *i64
67 r[0] = 0; if d1 == pt_len { if tt_eq(out1, pt, pt_len) == 1 { r[0] = 1 } } // real AES-GCM roundtrip
68 r[1] = 0; if env1[TR_VER_OFF] == (1 as u8) { r[1] = 1 } // version stamped
69 r[2] = 0; if d3 == pt_len { if tt_eq(out3, pt, pt_len) == 1 { r[2] = 1 } } // old version still opens
70 r[3] = 0; if env2[TR_VER_OFF] == (2 as u8) { if d4 == pt_len { if tt_eq(out4, pt, pt_len) == 1 { r[3] = 1 } } } // rewrap->v2 opens to same pt
71 r[4] = 0; if e2len == e1len { if tt_eq(c1, c2, pt_len) == 0 { r[4] = 1 } } // rewrap really re-encrypted (ct changed)
72 r[5] = 0; if dT == neg1 { r[5] = 1 } // tamper fails closed
73 r[6] = 0; if env6[TR_VER_OFF] == (2 as u8) { if d6 == pt_len { if tt_eq(out6, pt, pt_len) == 1 { r[6] = 1 } } } // version routing
74
75 var pass: i64 = 0; i = 0
76 while i < 7 { pass = pass + r[i]; i = i + 1 }
77 tt_puts("----\n passed " as *u8); tt_num(pass); tt_puts("/7\n" as *u8)
78 if pass == 7 {
79 tt_puts("TRANSITGATE aead=AES-128-GCM(real) roundtrip=1 versioned_keyring=1 rotate_old_opens=1 rewrap_no_plaintext=1 ct_changed_on_rewrap=1 tamper_fails_closed=1 version_routing=1 exceed[sovereign encryption-as-a-service = HashiCorp transit-class, bits-up NIST SP800-38D; data passes through, never stored; prod keys vault-sealed] verdict=GREEN\n" as *u8)
80 sys_exit(0); return 0
81 }
82 tt_puts("TRANSITGATE verdict=RED\n" as *u8); sys_exit(1); return 1
83}