code wiki / (root) / nx_tls12_record_test.nx

nx_tls12_record_test.nx source

↩ module page · 52 lines · 2716 B

1// nx_tls12_record_test.nx -- KAT for the TLS 1.2 AES-128-GCM record layer (rung 4, no network). 2// Round-trips a 32-byte application_data record (seal -> open -> recovered == original) and proves the AEAD 3// tag rejects tampering (flip one ciphertext byte -> open fails). license_tier: ORIGINAL 4import "nx_syscalls.nx" 5import "nx_tls12_record.nx" 6 7func rt_slen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n } 8func rt_p(s: *u8) -> i64 { sys_write(1, s, rt_slen(s)); return 0 } 9func rt_row(name: *u8, pass: i64) -> i64 { 10 rt_p("ROW " as *u8); rt_p(name) 11 if pass == 1 { rt_p(" PASS\n" as *u8) } else { rt_p(" FAIL\n" as *u8) } 12 return pass 13} 14func rt_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 } 15 16func main() -> i64 { 17 rt_p("=== TLS12 RECORD KAT ===\n" as *u8) 18 let key: *u8 = sys_mmap(16); var i: i64 = 0; while i < 16 { key[i] = (0x30 + i) as u8; i = i + 1 } 19 let salt: *u8 = sys_mmap(8); i = 0; while i < 4 { salt[i] = (0x90 + i) as u8; i = i + 1 } 20 let seq: *u8 = sys_mmap(8); i = 0; while i < 8 { seq[i] = 0 as u8; i = i + 1 } seq[7] = 1 as u8 // seq = 1 21 let pt: *u8 = sys_mmap(64); i = 0; while i < 32 { pt[i] = (0xA0 + i) as u8; i = i + 1 } 22 let ptlen: i64 = 32 23 let ctype: i64 = 23 // application_data 24 25 var pass: i64 = 0 26 var r: i64 = 0 27 28 let rec: *u8 = sys_mmap(128) 29 let reclen: i64 = tls12_record_seal(key, salt, seq, ctype, pt, ptlen, rec) 30 r = 0; if reclen == 8 + 32 + 16 { r = 1 } // explicit(8)+ct(32)+tag(16)=56 31 pass = pass + rt_row("seal-len-56" as *u8, r) 32 33 let out: *u8 = sys_mmap(64) 34 let ol: i64 = tls12_record_open(key, salt, seq, ctype, rec, reclen, out) 35 r = 0; if ol == 32 { if rt_eq(out, pt, 32) == 1 { r = 1 } } 36 pass = pass + rt_row("open-roundtrip" as *u8, r) 37 38 // tamper: flip a ciphertext byte (offset 8 = first ct byte) -> open MUST fail 39 rec[8] = (rec[8] ^ (0xFF as u8)) as u8 40 let out2: *u8 = sys_mmap(64) 41 let ol2: i64 = tls12_record_open(key, salt, seq, ctype, rec, reclen, out2) 42 r = 0; if ol2 < 0 { r = 1 } 43 pass = pass + rt_row("tamper-rejected" as *u8, r) 44 45 rt_p("TLS12-RECORD-KAT rows=3 pass=" as *u8) 46 let pb: *u8 = sys_mmap(16); var pv: i64 = pass 47 if pv == 0 { pb[0] = 48 as u8; sys_write(1, pb, 1) } 48 else { var k: i64 = 0; let t: *u8 = sys_mmap(16); while pv > 0 { t[k] = (48 + (pv % 10)) as u8; pv = pv / 10; k = k + 1 } var j: i64 = 0; while j < k { pb[j] = t[k-1-j]; j = j + 1 } sys_write(1, pb, k) } 49 if pass == 3 { rt_p(" verdict=GREEN\n" as *u8); return 0 } 50 rt_p(" verdict=RED\n" as *u8) 51 return 1 52}