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}