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}