code wiki / (root) / nx_tls13_client_session_test.nx

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}