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}