code wiki / _hdl_build / nx_quic_hdr_test.nx
nx_quic_hdr_test.nx source
↩ module page · 65 lines · 3920 B
1// nx_quic_hdr_gate.nx -- RUNG 3 gate: QUIC long/short headers vs RFC 9000 17.2/17.3, anchored on the
2// RFC 9001 Appendix A.2 sample Client Initial header (c3 00000001 08 8394c8f03e515708 00). Native, sovereign.
3// license_tier: ORIGINAL
4import "nx_quic_hdr.nx"
5import "nx_g_check_lib.nx"
6import "nx_g_pn_lib.nx"
7import "nx_g_puts_lib.nx"
8
9func main() -> i64 {
10 g_puts("nx_quic_hdr gate -- long/short headers vs RFC 9000/9001 A.2\n" as *u8)
11 var pass: i64=0; var total: i64=0
12 let info: *i64 = sys_mmap(8*8) as *i64
13
14 // ---- RFC 9001 A.2 sample Client Initial header ----
15 let dcid: *u8 = sys_mmap(8)
16 dcid[0]=0x83 as u8; dcid[1]=0x94 as u8; dcid[2]=0xc8 as u8; dcid[3]=0xf0 as u8
17 dcid[4]=0x3e as u8; dcid[5]=0x51 as u8; dcid[6]=0x57 as u8; dcid[7]=0x08 as u8
18 let buf: *u8 = sys_mmap(64)
19 buf[0]=0xc3 as u8
20 buf[1]=0x00 as u8; buf[2]=0x00 as u8; buf[3]=0x00 as u8; buf[4]=0x01 as u8 // version 1
21 buf[5]=0x08 as u8 // DCID len 8
22 var i: i64=0; while i<8 { buf[6+i]=dcid[i]; i=i+1 } // DCID
23 buf[14]=0x00 as u8 // SCID len 0
24
25 let rc: i64 = quic_lhdr_parse(buf, 15, info)
26 var p_ok: i64=0
27 if rc==0 { if info[0]==0 { if info[1]==1 { if info[3]==8 { if info[5]==0 { if info[7]==4 { p_ok=1 } } } } } }
28 // verify DCID bytes at info[2]
29 if p_ok==1 { var k: i64=0; while k<8 { if buf[info[2]+k]!=dcid[k] { p_ok=0; k=8 } else { k=k+1 } } }
30 pass = pass + g_check("parse RFC 9001 Initial hdr: type=Initial,ver=1,DCID=8B match,SCID=0,pn_len=4" as *u8, p_ok); total=total+1
31
32 // ---- encode the same header -> byte-exact ----
33 let out: *u8 = sys_mmap(64)
34 let elen: i64 = quic_lhdr_encode(out, 0, 1, dcid, 8, dcid, 0, 4) // scil=0 (scid ptr unused)
35 var e_ok: i64=0
36 if elen==15 { e_ok=1; var j: i64=0; while j<15 { if out[j]!=buf[j] { e_ok=0; j=15 } else { j=j+1 } } }
37 pass = pass + g_check("encode -> byte-exact c30000000108 8394c8f03e515708 00 (15B)" as *u8, e_ok); total=total+1
38
39 // ---- short header (1-RTT) round-trip ----
40 let scid4: *u8 = sys_mmap(8)
41 scid4[0]=0xde as u8; scid4[1]=0xad as u8; scid4[2]=0xbe as u8; scid4[3]=0xef as u8
42 let sout: *u8 = sys_mmap(32)
43 let slen: i64 = quic_shdr_encode(sout, 1, 1, 2, scid4, 4) // spin=1,kp=1,pn_len=2
44 var s_ok: i64=0
45 // first byte = 0x40|0x20(spin)|0x04(kp)|0x01(pnlen-1) = 0x65 ; total = 1 + 4 dcid = 5
46 if slen==5 { if sout[0]==(0x65 as u8) { s_ok=1; var m: i64=0; while m<4 { if sout[1+m]!=scid4[m] { s_ok=0; m=4 } else { m=m+1 } } } }
47 pass = pass + g_check("short hdr encode: first byte 0x65 (fixed+spin+kp+pnlen2) + DCID" as *u8, s_ok); total=total+1
48 let sinfo: *i64 = sys_mmap(8*4) as *i64
49 var sp_ok: i64=0
50 if quic_shdr_parse(sout, slen, 4, sinfo)==0 { if sinfo[0]==1 { if sinfo[1]==2 { if sinfo[2]==5 { sp_ok=1 } } } }
51 pass = pass + g_check("short hdr parse(dcil=4): keyphase=1, pn_len=2, pn_off=5" as *u8, sp_ok); total=total+1
52
53 // ---- form-bit + fixed-bit discrimination ----
54 var disc: i64=1
55 if quic_lhdr_parse(sout, slen, info) != 0 - 1 { disc=0 } // short bytes rejected by long parse
56 if quic_shdr_parse(buf, 15, 8, sinfo) != 0 - 1 { disc=0 } // long bytes rejected by short parse
57 buf[0]=0x80 as u8 // long form, fixed bit CLEARED
58 if quic_lhdr_parse(buf, 15, info) != 0 - 1 { disc=0 }
59 pass = pass + g_check("form-bit + fixed-bit discrimination (3 malformed cases rejected)" as *u8, disc); total=total+1
60
61 g_puts("---- quic_hdr gate: passed " as *u8); g_pn(pass); g_puts(" / " as *u8); g_pn(total); g_puts(" ----\n" as *u8)
62 if pass == total { g_puts("VERDICT: GREEN (QUIC long/short headers, RFC 9000/9001 A.2, sovereign)\n" as *u8); return 0 }
63 g_puts("VERDICT: RED\n" as *u8)
64 return 1
65}