code wiki / (root) / nx_tls13_server_session_recv_ch_test.nx

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}