nx_tls12_parse_test.nx source
↩ module page · 89 lines · 4218 B
1// nx_tls12_parse_test.nx -- KAT for the TLS 1.2 handshake parsers (rung 2, no network).
2// Builds a synthetic ServerHello (cipher 0xC02F, random 0x50..0x6F) + ServerKeyExchange (secp256r1, 65-byte
3// point starting 0x04, sig_alg 0x0401, 4-byte sig) and round-trips them through the parsers, asserting every
4// extracted field. license_tier: ORIGINAL
5import "nx_syscalls.nx"
6import "nx_tls12_parse.nx"
7
8func tp_slen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
9func tp_p(s: *u8) -> i64 { sys_write(1, s, tp_slen(s)); return 0 }
10func tp_row(name: *u8, pass: i64) -> i64 {
11 tp_p("ROW " as *u8); tp_p(name)
12 if pass == 1 { tp_p(" PASS\n" as *u8) } else { tp_p(" FAIL\n" as *u8) }
13 return pass
14}
15
16func main() -> i64 {
17 tp_p("=== TLS12 PARSE KAT ===\n" as *u8)
18
19 // ---- synthetic ServerHello ----
20 let sh: *u8 = sys_mmap(256)
21 sh[0] = 0x03 as u8; sh[1] = 0x03 as u8
22 var i: i64 = 0
23 while i < 32 { sh[2 + i] = (0x50 + i) as u8; i = i + 1 }
24 sh[34] = 0 as u8 // session_id len = 0
25 sh[35] = 0xC0 as u8; sh[36] = 0x2F as u8 // cipher = 0xC02F
26 sh[37] = 0 as u8 // compression = null
27 let sh_len: i64 = 38
28
29 // ---- synthetic ServerKeyExchange ----
30 let skx: *u8 = sys_mmap(256)
31 skx[0] = 3 as u8 // named_curve
32 skx[1] = 0x00 as u8; skx[2] = 0x17 as u8 // secp256r1
33 skx[3] = 65 as u8 // point len
34 skx[4] = 0x04 as u8
35 i = 1; while i < 65 { skx[4 + i] = 0x11 as u8; i = i + 1 }
36 skx[69] = 0x04 as u8; skx[70] = 0x01 as u8 // sig_alg 0x0401
37 skx[71] = 0x00 as u8; skx[72] = 0x04 as u8 // sig_len 4
38 skx[73] = 0xAA as u8; skx[74] = 0xBB as u8; skx[75] = 0xCC as u8; skx[76] = 0xDD as u8
39 let skx_len: i64 = 77
40
41 var pass: i64 = 0
42 var r: i64 = 0
43
44 let srand: *u8 = sys_mmap(64)
45 let scipher: *i64 = sys_mmap(16) as *i64
46 let shr: i64 = tls12_parse_server_hello(sh, sh_len, srand, scipher)
47 r = 0; if shr == 1 { r = 1 }
48 pass = pass + tp_row("sh-parse-ok" as *u8, r)
49 r = 0; if (srand[0] as i64) == 0x50 { if (srand[31] as i64) == 0x6F { r = 1 } }
50 pass = pass + tp_row("sh-random" as *u8, r)
51 r = 0; if scipher[0] == 0xC02F { r = 1 }
52 pass = pass + tp_row("sh-cipher-c02f" as *u8, r)
53
54 let curve: *i64 = sys_mmap(16) as *i64
55 let pub: *u8 = sys_mmap(256)
56 let publen: *i64 = sys_mmap(16) as *i64
57 let sigalg: *i64 = sys_mmap(16) as *i64
58 let sig: *u8 = sys_mmap(256)
59 let siglen: *i64 = sys_mmap(16) as *i64
60 let kr: i64 = tls12_parse_server_key_exchange(skx, skx_len, curve, pub, publen, sigalg, sig, siglen)
61 r = 0; if kr == 1 { r = 1 }
62 pass = pass + tp_row("skx-parse-ok" as *u8, r)
63 r = 0; if curve[0] == 0x0017 { r = 1 }
64 pass = pass + tp_row("skx-curve-secp256r1" as *u8, r)
65 r = 0; if publen[0] == 65 { if (pub[0] as i64) == 0x04 { r = 1 } }
66 pass = pass + tp_row("skx-pubkey-65" as *u8, r)
67 r = 0; if sigalg[0] == 0x0401 { r = 1 }
68 pass = pass + tp_row("skx-sigalg-0401" as *u8, r)
69 r = 0; if siglen[0] == 4 { if (sig[0] as i64) == 0xAA { if (sig[3] as i64) == 0xDD { r = 1 } } }
70 pass = pass + tp_row("skx-sig" as *u8, r)
71
72 // signed-data = client_random(32) || server_random(32) || params(69)
73 let crand: *u8 = sys_mmap(64)
74 i = 0; while i < 32 { crand[i] = (0x10 + i) as u8; i = i + 1 }
75 let sd: *u8 = sys_mmap(512)
76 let sdl: i64 = tls12_skx_signed_data(crand, srand, skx, 69, sd)
77 r = 0
78 if sdl == 133 { if (sd[0] as i64) == 0x10 { if (sd[32] as i64) == 0x50 { if (sd[64] as i64) == 3 { r = 1 } } } }
79 pass = pass + tp_row("skx-signed-data" as *u8, r)
80
81 tp_p("TLS12-PARSE-KAT rows=9 pass=" as *u8)
82 let pb: *u8 = sys_mmap(16)
83 var pv: i64 = pass
84 if pv == 0 { pb[0] = 48 as u8; sys_write(1, pb, 1) }
85 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) }
86 if pass == 9 { tp_p(" verdict=GREEN\n" as *u8); return 0 }
87 tp_p(" verdict=RED\n" as *u8)
88 return 1
89}