nx_tls12_keys_test.nx source
↩ module page · 77 lines · 3821 B
1// nx_tls12_keys_test.nx -- KAT for the TLS 1.2 key schedule (rung 3, no network).
2// Proves the wiring matches RFC 5246 by deriving each value via the rung-3 functions AND via a direct
3// nx_tls12_prf_sha256 call with the spec's label + seed order, then asserting equality. The PRF itself is
4// already RFC-KAT'd (nx_tls12_prf_test), so matching it == correct. license_tier: ORIGINAL
5import "nx_syscalls.nx"
6import "nx_tls12_keys.nx"
7
8func tk_slen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
9func tk_p(s: *u8) -> i64 { sys_write(1, s, tk_slen(s)); return 0 }
10func tk_row(name: *u8, pass: i64) -> i64 {
11 tk_p("ROW " as *u8); tk_p(name)
12 if pass == 1 { tk_p(" PASS\n" as *u8) } else { tk_p(" FAIL\n" as *u8) }
13 return pass
14}
15func tk_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 }
16
17func main() -> i64 {
18 tk_p("=== TLS12 KEY SCHEDULE KAT ===\n" as *u8)
19 let pm: *u8 = sys_mmap(64); var i: i64 = 0; while i < 32 { pm[i] = (0x20 + i) as u8; i = i + 1 }
20 let cr: *u8 = sys_mmap(64); i = 0; while i < 32 { cr[i] = (0x10 + i) as u8; i = i + 1 }
21 let sr: *u8 = sys_mmap(64); i = 0; while i < 32 { sr[i] = (0x50 + i) as u8; i = i + 1 }
22 let hh: *u8 = sys_mmap(64); i = 0; while i < 32 { hh[i] = (0x70 + i) as u8; i = i + 1 }
23
24 var pass: i64 = 0
25 var r: i64 = 0
26
27 // ---- master_secret ----
28 let ms: *u8 = sys_mmap(64)
29 tls12_derive_master_secret(pm, 32, cr, sr, ms)
30 let ms_ref: *u8 = sys_mmap(64)
31 let seed1: *u8 = sys_mmap(80)
32 i = 0; while i < 32 { seed1[i] = cr[i]; i = i + 1 }
33 i = 0; while i < 32 { seed1[32 + i] = sr[i]; i = i + 1 }
34 nx_tls12_prf_sha256(pm, 32, "master secret" as *u8, 13, seed1, 64, ms_ref, 48)
35 r = tk_eq(ms, ms_ref, 48)
36 pass = pass + tk_row("master-matches-spec" as *u8, r)
37
38 // ---- key_block (SR||CR) ----
39 let kb: *u8 = sys_mmap(64)
40 tls12_derive_key_block(ms, sr, cr, kb, 40)
41 let kb_ref: *u8 = sys_mmap(64)
42 let seed2: *u8 = sys_mmap(80)
43 i = 0; while i < 32 { seed2[i] = sr[i]; i = i + 1 }
44 i = 0; while i < 32 { seed2[32 + i] = cr[i]; i = i + 1 }
45 nx_tls12_prf_sha256(ms, 48, "key expansion" as *u8, 13, seed2, 64, kb_ref, 40)
46 r = tk_eq(kb, kb_ref, 40)
47 pass = pass + tk_row("keyblock-matches-spec" as *u8, r)
48
49 // ---- seed order MUST matter: key_block(sr,cr) != key_block(cr,sr) ----
50 let kb_wrong: *u8 = sys_mmap(64)
51 tls12_derive_key_block(ms, cr, sr, kb_wrong, 40) // swapped on purpose
52 r = 0; if tk_eq(kb, kb_wrong, 40) == 0 { r = 1 }
53 pass = pass + tk_row("seed-order-matters" as *u8, r)
54
55 // ---- split ----
56 let ck: *u8 = sys_mmap(32); let sk: *u8 = sys_mmap(32); let ci: *u8 = sys_mmap(16); let si: *u8 = sys_mmap(16)
57 tls12_split_keys_aes128gcm(kb, ck, sk, ci, si)
58 r = 0
59 if ck[0] == kb[0] { if sk[0] == kb[16] { if ci[0] == kb[32] { if si[0] == kb[36] { r = 1 } } } }
60 pass = pass + tk_row("split-aes128gcm" as *u8, r)
61
62 // ---- Finished verify_data ----
63 let vd: *u8 = sys_mmap(16)
64 tls12_finished_verify_data(ms, "client finished" as *u8, 15, hh, vd)
65 let vd_ref: *u8 = sys_mmap(16)
66 nx_tls12_prf_sha256(ms, 48, "client finished" as *u8, 15, hh, 32, vd_ref, 12)
67 r = tk_eq(vd, vd_ref, 12)
68 pass = pass + tk_row("finished-matches-spec" as *u8, r)
69
70 tk_p("TLS12-KEYS-KAT rows=5 pass=" as *u8)
71 let pb: *u8 = sys_mmap(16); var pv: i64 = pass
72 if pv == 0 { pb[0] = 48 as u8; sys_write(1, pb, 1) }
73 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) }
74 if pass == 5 { tk_p(" verdict=GREEN\n" as *u8); return 0 }
75 tk_p(" verdict=RED\n" as *u8)
76 return 1
77}