code wiki / _hdl_build / nx_quic_handshake_sm_test.nx

nx_quic_handshake_sm_test.nx source

↩ module page · 53 lines · 3343 B

1// nx_quic_handshake_sm_test.nx -- RUNG 6d gate: TLS 1.3 / QUIC handshake state machine (RFC 8446 App A) 2// + Finished-MAC (RFC 8446 sec 4.4.4). Drives the valid client flight, rejects out-of-order messages, and 3// proves the Finished MAC binds the transcript (different transcript -> different verify_data). Native, 4// sovereign, on our own HKDF+HMAC. license_tier: ORIGINAL 5import "nx_quic_handshake_sm.nx" 6import "nx_g_pn_lite_lib.nx" 7import "nx_g_check_lib.nx" 8import "nx_g_puts_lib.nx" 9 10func main() -> i64 { 11 g_puts("nx_quic_handshake_sm gate -- TLS 1.3 handshake state machine + Finished MAC (RFC 8446)\n" as *u8) 12 var pass: i64=0; var total: i64=0 13 14 // ---- valid client flight: WAIT_SH ->SH-> EE -> Cert -> CertVerify -> Finished -> CONNECTED ---- 15 var s: i64 = HS_WAIT_SH 16 s = quic_hs_sm_step(s, 2) // server_hello 17 s = quic_hs_sm_step(s, 8) // encrypted_extensions 18 s = quic_hs_sm_step(s, 11) // certificate 19 s = quic_hs_sm_step(s, 15) // certificate_verify 20 s = quic_hs_sm_step(s, 20) // finished 21 pass = pass + g_check("valid flight SH->EE->Cert->CV->Fin reaches HS_CONNECTED" as *u8, (s == HS_CONNECTED) as i64); total=total+1 22 23 // ---- out-of-order rejected ---- 24 var bad1: i64 = quic_hs_sm_step(HS_WAIT_SH, 11) // cert before server_hello 25 var bad2: i64 = quic_hs_sm_step(HS_WAIT_EE, 20) // finished before cert chain 26 var bad_ok: i64=1 27 if bad1 != HS_ERROR { bad_ok=0 } 28 if bad2 != HS_ERROR { bad_ok=0 } 29 pass = pass + g_check("out-of-order handshake messages -> HS_ERROR (2 cases)" as *u8, bad_ok); total=total+1 30 31 // ---- Finished MAC: deterministic + binds the transcript ---- 32 let base_key: *u8 = sys_mmap(32) 33 var i: i64=0; while i<32 { base_key[i]=((i*13+5)&255) as u8; i=i+1 } 34 let th1: *u8 = sys_mmap(32); i=0; while i<32 { th1[i]=((i*7+1)&255) as u8; i=i+1 } 35 let th2: *u8 = sys_mmap(32); i=0; while i<32 { th2[i]=((i*7+1)&255) as u8; i=i+1 } th2[0]=(th2[0] as i64 ^ 1) as u8 // 1 bit different 36 let vd1: *u8 = sys_mmap(32); quic_hs_finished_verify(base_key, th1, vd1) 37 let vd1b: *u8 = sys_mmap(32); quic_hs_finished_verify(base_key, th1, vd1b) 38 let vd2: *u8 = sys_mmap(32); quic_hs_finished_verify(base_key, th2, vd2) 39 pass = pass + g_check("Finished verify_data deterministic (same inputs -> identical)" as *u8, quic_hs_verify_eq(vd1, vd1b)); total=total+1 40 pass = pass + g_check("Finished MAC binds transcript (1-bit transcript change -> different verify_data)" as *u8, (quic_hs_verify_eq(vd1, vd2) == 0) as i64); total=total+1 41 42 // ---- finished_key derivation is deterministic + distinct from the base key ---- 43 let fk1: *u8 = sys_mmap(32); quic_hs_finished_key(base_key, fk1) 44 let fk2: *u8 = sys_mmap(32); quic_hs_finished_key(base_key, fk2) 45 var fk_ok: i64=0 46 if quic_hs_verify_eq(fk1, fk2)==1 { if quic_hs_verify_eq(fk1, base_key)==0 { fk_ok=1 } } 47 pass = pass + g_check("finished_key = Expand-Label(base,'finished') deterministic + != base" as *u8, fk_ok); total=total+1 48 49 g_puts("---- quic_handshake_sm gate: passed " as *u8); g_pn(pass); g_puts(" / " as *u8); g_pn(total); g_puts(" ----\n" as *u8) 50 if pass == total { g_puts("VERDICT: GREEN (TLS 1.3 handshake state machine + Finished MAC, RFC 8446, sovereign)\n" as *u8); return 0 } 51 g_puts("VERDICT: RED\n" as *u8) 52 return 1 53}