nx_tls13_client_session_test.nx source
↩ module page · 93 lines · 4067 B
1// nx_tls13_client_session_test.nx -- KAT for the TLS 1.3 client
2// session container + emit-ClientHello primitive.
3//
4// expect_exit: 0
5// license_tier: ORIGINAL
6
7import "nx_syscalls.nx"
8import "nx_tls13.nx"
9import "nx_tls13_client_session.nx"
10
11func main() -> i64 {
12 // Caller-supplied entropy (deterministic for test reproducibility).
13 let client_random: *u8 = sys_mmap(32)
14 var i: i64 = 0
15 while i < 32 { client_random[i] = (0xC0 + i) as u8; i = i + 1 }
16
17 let priv: *u8 = sys_mmap(32)
18 i = 0
19 while i < 32 { priv[i] = (0x40 + i) as u8; i = i + 1 }
20
21 // ---- Test A: session_new produces session with state=INIT ----
22 let s: *Tls13ClientSession = nx_tls13_client_session_new(client_random, priv)
23 if s.state != NX_TLS13_CSESSION_STATE_INIT { return 1 }
24
25 // Random + priv copied byte-exact into session
26 var j: i64 = 0
27 while j < 32 {
28 if (s.client_random[j] & 0xff) != (0xC0 + j) { return 2 }
29 if (s.x25519_priv[j] & 0xff) != (0x40 + j) { return 3 }
30 j = j + 1
31 }
32
33 // pubkey was derived (non-zero -- x25519 of any priv != 0 yields
34 // a non-zero pubkey except for very specific small-subgroup priv)
35 var pub_acc: i64 = 0
36 j = 0
37 while j < 32 { pub_acc = pub_acc | (s.x25519_pub[j] & 0xff); j = j + 1 }
38 if pub_acc == 0 { return 4 }
39
40 // ---- Test B: emit_ch writes ClientHello + advances state ----
41 let sni: *u8 = sys_mmap(32)
42 sni[0]=0x65; sni[1]=0x78; sni[2]=0x61; sni[3]=0x6D
43 sni[4]=0x70; sni[5]=0x6C; sni[6]=0x65; sni[7]=0x2E
44 sni[8]=0x63; sni[9]=0x6F; sni[10]=0x6D // "example.com" (11 bytes)
45
46 let buf: *u8 = sys_mmap(512)
47 let n: i64 = nx_tls13_client_session_emit_ch(s, sni, 11, buf, 512)
48 if n < 0 { return 10 }
49 if s.state != NX_TLS13_CSESSION_STATE_CH_SENT { return 11 }
50 // ClientHello starts with handshake-header type byte HT_CLIENT_HELLO
51 if (buf[0] & 0xff) != HT_CLIENT_HELLO { return 12 }
52 // 3-byte big-endian body length follows; body length should equal n - 4
53 let body_len: i64 = ((buf[1] & 0xff) << 16) | ((buf[2] & 0xff) << 8) | (buf[3] & 0xff)
54 if body_len != n - 4 { return 13 }
55 // legacy_version follows at offset 4: 0x03 0x03
56 if (buf[4] & 0xff) != 0x03 { return 14 }
57 if (buf[5] & 0xff) != 0x03 { return 15 }
58 // client_random at offset 6 should byte-exact match what we passed
59 j = 0
60 while j < 32 {
61 if (buf[6 + j] & 0xff) != (0xC0 + j) { return 20 + j }
62 j = j + 1
63 }
64
65 // ---- Test C: emit_ch from non-INIT state -> BAD_STATE ----
66 let n2: i64 = nx_tls13_client_session_emit_ch(s, sni, 11, buf, 512)
67 if n2 != (0 - NX_TLS13_CSESSION_BAD_STATE) { return 60 }
68
69 // ---- Test D: emit_ch with too-small buffer -> BUF_OVERFLOW ----
70 let s2: *Tls13ClientSession = nx_tls13_client_session_new(client_random, priv)
71 let tiny_buf: *u8 = sys_mmap(64)
72 let n3: i64 = nx_tls13_client_session_emit_ch(s2, sni, 11, tiny_buf, 64)
73 if n3 != (0 - NX_TLS13_CSESSION_BUF_OVERFLOW) { return 70 }
74 // State unchanged on failure
75 if s2.state != NX_TLS13_CSESSION_STATE_INIT { return 71 }
76
77 // ---- Test E: state constants are distinct + ordered ----
78 if NX_TLS13_CSESSION_STATE_INIT != 0 { return 80 }
79 if NX_TLS13_CSESSION_STATE_CH_SENT != 1 { return 81 }
80 if NX_TLS13_CSESSION_STATE_WAIT_EE != 2 { return 82 }
81 if NX_TLS13_CSESSION_STATE_CONNECTED != 8 { return 83 }
82
83 // ---- Test F: verdict gate ----
84 if nx_tls13_client_session_verdict_is_valid(NX_TLS13_CSESSION_OK) != 1 { return 90 }
85 if nx_tls13_client_session_verdict_is_valid(NX_TLS13_CSESSION_BAD_STATE) != 1 { return 91 }
86 if nx_tls13_client_session_verdict_is_valid(NX_TLS13_CSESSION_BUF_OVERFLOW) != 1 { return 92 }
87 if nx_tls13_client_session_verdict_is_valid(NX_TLS13_CSESSION_INTERNAL) != 1 { return 93 }
88 if nx_tls13_client_session_verdict_is_valid(NX_TLS13_CSESSION_VERDICT_N) != 0 { return 94 }
89 if nx_tls13_client_session_verdict_is_valid(0) != 0 { return 95 }
90 if nx_tls13_client_session_verdict_is_valid(0 - 1) != 0 { return 96 }
91
92 return 0
93}