code wiki / (root) / nx_tls13_client_session_derive_app_test.nx

nx_tls13_client_session_derive_app_test.nx source

↩ module page · 90 lines · 3652 B

1// nx_tls13_client_session_derive_app_test.nx -- KAT for step 3c.5: 2// derive application traffic keys + advance to CONNECTED. 3// 4// expect_exit: 0 5// license_tier: ORIGINAL 6 7import "nx_syscalls.nx" 8import "nx_tls13_client_session.nx" 9import "nx_tls13_client_session_derive_app.nx" 10 11func main() -> i64 { 12 let client_random: *u8 = sys_mmap(32) 13 var i: i64 = 0 14 while i < 32 { client_random[i] = (0xC0 + i) as u8; i = i + 1 } 15 let priv: *u8 = sys_mmap(32) 16 i = 0 17 while i < 32 { priv[i] = (0x40 + i) as u8; i = i + 1 } 18 19 // ---- Test A: derive_app from INIT -> BAD_STATE ---- 20 let s1: *Tls13ClientSession = nx_tls13_client_session_new(client_random, priv) 21 if nx_tls13_client_session_derive_app(s1) != NX_TLS13_DERIVE_APP_BAD_STATE { return 1 } 22 if s1.state != NX_TLS13_CSESSION_STATE_INIT { return 2 } 23 24 // ---- Test B: derive_app from CONNECTED -> BAD_STATE (called twice) ---- 25 s1.state = NX_TLS13_CSESSION_STATE_CONNECTED 26 if nx_tls13_client_session_derive_app(s1) != NX_TLS13_DERIVE_APP_BAD_STATE { return 3 } 27 28 // ---- Test C: derive_app from WAIT_APP_KEYS -> OK + state CONNECTED ---- 29 // Session struct has mmap-zeroed handshake_secret + transcript; 30 // the key schedule against all-zeros is well-defined (HKDF + 31 // SHA-256 are total functions; we just get deterministic 32 // all-zero-driven output). 33 s1.state = NX_TLS13_CSESSION_STATE_WAIT_APP_KEYS 34 if nx_tls13_client_session_derive_app(s1) != NX_TLS13_DERIVE_APP_OK { return 4 } 35 if s1.state != NX_TLS13_CSESSION_STATE_CONNECTED { return 5 } 36 37 // App-traffic state derived (non-zero) 38 var ms_acc: i64 = 0 39 i = 0 40 while i < 32 { ms_acc = ms_acc | (s1.master_secret[i] & 0xff); i = i + 1 } 41 if ms_acc == 0 { return 10 } 42 var c_ats_acc: i64 = 0 43 i = 0 44 while i < 32 { c_ats_acc = c_ats_acc | (s1.client_app_traffic_secret[i] & 0xff); i = i + 1 } 45 if c_ats_acc == 0 { return 11 } 46 var s_ats_acc: i64 = 0 47 i = 0 48 while i < 32 { s_ats_acc = s_ats_acc | (s1.server_app_traffic_secret[i] & 0xff); i = i + 1 } 49 if s_ats_acc == 0 { return 12 } 50 var c_ak_acc: i64 = 0 51 i = 0 52 while i < 32 { c_ak_acc = c_ak_acc | (s1.client_app_traffic_key[i] & 0xff); i = i + 1 } 53 if c_ak_acc == 0 { return 13 } 54 var s_ak_acc: i64 = 0 55 i = 0 56 while i < 32 { s_ak_acc = s_ak_acc | (s1.server_app_traffic_key[i] & 0xff); i = i + 1 } 57 if s_ak_acc == 0 { return 14 } 58 var c_aiv_acc: i64 = 0 59 i = 0 60 while i < 12 { c_aiv_acc = c_aiv_acc | (s1.client_app_iv[i] & 0xff); i = i + 1 } 61 if c_aiv_acc == 0 { return 15 } 62 var s_aiv_acc: i64 = 0 63 i = 0 64 while i < 12 { s_aiv_acc = s_aiv_acc | (s1.server_app_iv[i] & 0xff); i = i + 1 } 65 if s_aiv_acc == 0 { return 16 } 66 67 // c + s app keys MUST DIFFER (independent labels) 68 var keys_eq: i64 = 1 69 i = 0 70 while i < 32 { 71 if (s1.client_app_traffic_key[i] & 0xff) != (s1.server_app_traffic_key[i] & 0xff) { 72 keys_eq = 0 73 i = 32 // break 74 } else { i = i + 1 } 75 } 76 if keys_eq == 1 { return 20 } 77 78 // App seq numbers reset to 0 79 if s1.client_app_seq != 0 { return 30 } 80 if s1.server_app_seq != 0 { return 31 } 81 82 // ---- Test D: verdict gate ---- 83 if nx_tls13_derive_app_verdict_is_valid(NX_TLS13_DERIVE_APP_OK) != 1 { return 40 } 84 if nx_tls13_derive_app_verdict_is_valid(NX_TLS13_DERIVE_APP_BAD_STATE) != 1 { return 41 } 85 if nx_tls13_derive_app_verdict_is_valid(NX_TLS13_DERIVE_APP_VERDICT_N) != 0 { return 42 } 86 if nx_tls13_derive_app_verdict_is_valid(0) != 0 { return 43 } 87 if nx_tls13_derive_app_verdict_is_valid(0 - 1) != 0 { return 44 } 88 89 return 0 90}