nx_tls13_server_session_recv_ch_test.nx source
↩ module page · 96 lines · 3322 B
1// nx_tls13_server_session_recv_ch_test.nx -- verify the server-side
2// ClientHello receive step.
3//
4// Strategy: build a ClientHello using the shipped CLIENT emitter
5// (tls13_client_hello_emit), then feed those bytes into recv_ch on a
6// fresh server session. Round-trip proves the server correctly
7// parses + extracts the X25519 client public key emitted by the
8// client.
9//
10// Closed-form invariants:
11// (a) Null session/buf -> BAD_STATE
12// (b) Wrong-state session (e.g., already CH_RECEIVED) -> BAD_STATE
13// (c) Truncated bytes -> PROTOCOL_ERR
14// (d) Real ClientHello -> OK + state advances to CH_RECEIVED
15// (e) After recv_ch, session.client_x25519_pub == client's pubkey
16// (round-trip bit-exact)
17//
18// expect_exit: 0
19// license_tier: ORIGINAL
20
21import "nx_syscalls.nx"
22import "nx_x25519.nx"
23import "nx_x25519_ephemeral.nx"
24import "nx_tls13.nx"
25import "nx_tls13_hello.nx"
26import "nx_tls13_server_session.nx"
27import "nx_tls13_server_session_recv_ch.nx"
28
29func main() -> i64 {
30 // --- Build a client public key ---
31 let client_priv: *u8 = sys_mmap(32)
32 let client_pub: *u8 = sys_mmap(32)
33 var i: i64 = 0
34 while i < 32 {
35 client_priv[i] = ((i + 17) & 0xff) as u8
36 i = i + 1
37 }
38 x25519_keypair_public(client_priv, client_pub)
39
40 // --- Build a ClientHello ---
41 let client_random: *u8 = sys_mmap(32)
42 var j: i64 = 0
43 while j < 32 {
44 client_random[j] = ((j + 50) & 0xff) as u8
45 j = j + 1
46 }
47 let sni: *u8 = "nishifamily.com"
48 let sni_len: i64 = 15
49
50 let ch_cap: i64 = 1024
51 let ch_buf: *u8 = sys_mmap(ch_cap)
52 let ch_n: i64 = tls13_client_hello_emit(
53 client_random, sni, sni_len, client_pub, ch_buf, ch_cap)
54 if ch_n <= 0 { return 5 }
55
56 // --- Build a server session ---
57 let server_random: *u8 = sys_mmap(32)
58 let server_priv: *u8 = sys_mmap(32)
59 var k: i64 = 0
60 while k < 32 {
61 server_random[k] = ((k + 70) & 0xff) as u8
62 server_priv[k] = ((k + 80) & 0xff) as u8
63 k = k + 1
64 }
65 let s: *Tls13ServerSession = nx_tls13_server_session_new(server_random, server_priv)
66 if (s as i64) == 0 { return 6 }
67
68 // --- (a) Null buf -> BAD_STATE ---
69 let r_null: i64 = nx_tls13_server_session_recv_ch(s, 0 as *u8, 0)
70 if r_null != NX_TLS13_SSESSION_BAD_STATE { return 10 }
71
72 // --- (c) Truncated bytes -> PROTOCOL_ERR ---
73 let r_short: i64 = nx_tls13_server_session_recv_ch(s, ch_buf, 8)
74 if r_short != NX_TLS13_SSESSION_PROTOCOL_ERR { return 30 }
75
76 // --- (d) Real ClientHello round-trip -> OK + state CH_RECEIVED ---
77 let r_ok: i64 = nx_tls13_server_session_recv_ch(s, ch_buf, ch_n)
78 if r_ok != NX_TLS13_SSESSION_OK { return 40 }
79 if s.state != NX_TLS13_SSTATE_CH_RECEIVED { return 41 }
80
81 // --- (b) Calling recv_ch again -> BAD_STATE (already past INIT) ---
82 let r_again: i64 = nx_tls13_server_session_recv_ch(s, ch_buf, ch_n)
83 if r_again != NX_TLS13_SSESSION_BAD_STATE { return 20 }
84
85 // --- (e) Extracted client_x25519_pub matches what client emitted ---
86 if (s.client_x25519_pub as i64) == 0 { return 50 }
87 var mismatch: i64 = 0
88 var m: i64 = 0
89 while m < 32 {
90 if s.client_x25519_pub[m] != client_pub[m] { mismatch = 1 }
91 m = m + 1
92 }
93 if mismatch != 0 { return 51 }
94
95 return 0
96}