code wiki / (root) / nx_tls12_keys_test.nx

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}