code wiki / _hdl_build / nx_quic_wire_test.nx
nx_quic_wire_test.nx source
↩ module page · 97 lines · 5538 B
1// nx_quic_wire_gate.nx -- RUNG 1 gate: proves the sovereign QUIC varint + DATAGRAM frame codec is
2// RFC-CONFORMANT against the actual RFC 9000 Appendix A.1 test vectors + RFC 9221 DATAGRAM round-trip.
3// Native (same source the transport ships), no browser. GREEN = byte-exact vs the RFCs. license_tier: ORIGINAL
4import "nx_quic_wire.nx"
5import "nx_g_pn_lib.nx"
6import "nx_g_puts_lib.nx"
7
8func g_check(name: *u8, cond: i64) -> i64 {
9 if cond==1 { g_puts(" PASS " as *u8) } else { g_puts(" FAIL " as *u8) }
10 g_puts(name); g_puts("\n" as *u8); return cond
11}
12// decode b[0..8) and require value==ev AND consumed==el
13func dec_ok(b: *u8, ev: i64, el: i64, ov: *i64) -> i64 {
14 let c: i64 = quic_varint_decode(b, 8, ov)
15 if c != el { return 0 }
16 if ov[0] != ev { return 0 }
17 return 1
18}
19// encode val and require bytes==exp[0..el) AND length==el
20func enc_ok(val: i64, exp: *u8, el: i64, scratch: *u8) -> i64 {
21 let c: i64 = quic_varint_encode(scratch, val)
22 if c != el { return 0 }
23 var i: i64=0; while i<el { if scratch[i]!=exp[i] { return 0 } i=i+1 }
24 return 1
25}
26
27func main() -> i64 {
28 g_puts("nx_quic_wire gate -- sovereign QUIC varint + DATAGRAM vs RFC 9000/9221\n" as *u8)
29 var pass: i64=0; var total: i64=0
30 let b: *u8 = sys_mmap(64)
31 let s: *u8 = sys_mmap(64)
32 let ov: *i64 = sys_mmap(8) as *i64
33
34 // ---- RFC 9000 A.1 DECODE vectors ----
35 b[0]=0x25 as u8
36 pass = pass + g_check("decode 0x25 -> 37 (1B)" as *u8, dec_ok(b,37,1,ov)); total=total+1
37 b[0]=0x7b as u8; b[1]=0xbd as u8
38 pass = pass + g_check("decode 0x7bbd -> 15293 (2B)" as *u8, dec_ok(b,15293,2,ov)); total=total+1
39 b[0]=0x9d as u8; b[1]=0x7f as u8; b[2]=0x3e as u8; b[3]=0x7d as u8
40 pass = pass + g_check("decode 0x9d7f3e7d -> 494878333 (4B)" as *u8, dec_ok(b,494878333,4,ov)); total=total+1
41 b[0]=0xc2 as u8; b[1]=0x19 as u8; b[2]=0x7c as u8; b[3]=0x5e as u8; b[4]=0xff as u8; b[5]=0x14 as u8; b[6]=0xe8 as u8; b[7]=0x8c as u8
42 pass = pass + g_check("decode 0xc2197c5eff14e88c -> 151288809941952652 (8B)" as *u8, dec_ok(b,151288809941952652,8,ov)); total=total+1
43 // non-minimal 2-byte form of 37 still decodes to 37 (RFC allows it)
44 b[0]=0x40 as u8; b[1]=0x25 as u8
45 pass = pass + g_check("decode non-minimal 0x4025 -> 37 (2B)" as *u8, dec_ok(b,37,2,ov)); total=total+1
46
47 // ---- ENCODE produces the minimal RFC forms ----
48 s[0]=0x25 as u8
49 pass = pass + g_check("encode 37 -> 0x25 (1B minimal)" as *u8, enc_ok(37, s, 1, b)); total=total+1
50 s[0]=0x7b as u8; s[1]=0xbd as u8
51 pass = pass + g_check("encode 15293 -> 0x7bbd (2B)" as *u8, enc_ok(15293, s, 2, b)); total=total+1
52 s[0]=0x9d as u8; s[1]=0x7f as u8; s[2]=0x3e as u8; s[3]=0x7d as u8
53 pass = pass + g_check("encode 494878333 -> 0x9d7f3e7d (4B)" as *u8, enc_ok(494878333, s, 4, b)); total=total+1
54 s[0]=0xc2 as u8; s[1]=0x19 as u8; s[2]=0x7c as u8; s[3]=0x5e as u8; s[4]=0xff as u8; s[5]=0x14 as u8; s[6]=0xe8 as u8; s[7]=0x8c as u8
55 pass = pass + g_check("encode 151288809941952652 -> 0xc2..88c (8B)" as *u8, enc_ok(151288809941952652, s, 8, b)); total=total+1
56
57 // ---- encode->decode round-trip across the boundary values ----
58 let vals: *i64 = sys_mmap(8*9) as *i64
59 vals[0]=0; vals[1]=63; vals[2]=64; vals[3]=16383; vals[4]=16384; vals[5]=1073741823; vals[6]=1073741824; vals[7]=4611686018427387903; vals[8]=12345678
60 let lens: *i64 = sys_mmap(8*9) as *i64
61 lens[0]=1; lens[1]=1; lens[2]=2; lens[3]=2; lens[4]=4; lens[5]=4; lens[6]=8; lens[7]=8; lens[8]=4
62 var rt_ok: i64=1; var k: i64=0
63 while k<9 {
64 let el: i64 = quic_varint_encode(b, vals[k])
65 if el != lens[k] { rt_ok=0 }
66 let dl: i64 = quic_varint_decode(b, 8, ov)
67 if dl != el { rt_ok=0 }
68 if ov[0] != vals[k] { rt_ok=0 }
69 k=k+1
70 }
71 pass = pass + g_check("encode->decode round-trip + minimal length on all 9 boundary values" as *u8, rt_ok); total=total+1
72 // out-of-range rejected
73 pass = pass + g_check("varint rejects >= 2^62 (returns 0)" as *u8, quic_varint_encode(b, 4611686018427387904) == 0); total=total+1
74
75 // ---- RFC 9221 DATAGRAM frame round-trip (byte-exact payload) ----
76 let pl: *u8 = sys_mmap(512)
77 var i: i64=0; while i<300 { pl[i]=((i*7+11)&255) as u8; i=i+1 }
78 let fr: *u8 = sys_mmap(512)
79 let flen: i64 = quic_datagram_encode(fr, pl, 300)
80 // 300 -> 2-byte length varint (0x41,0x2c); frame = 1 + 2 + 300 = 303
81 var fr_ok: i64=0
82 if flen == 303 { if fr[0]==(0x31 as u8) { if fr[1]==(0x41 as u8) { if fr[2]==(0x2c as u8) { fr_ok=1 } } } }
83 pass = pass + g_check("DATAGRAM encode: type 0x31 + Length varint(300)=0x412c, total 303B" as *u8, fr_ok); total=total+1
84 let poff: *i64 = sys_mmap(8) as *i64
85 let pp: i64 = quic_datagram_parse(fr, flen, poff)
86 var dg_ok: i64=0
87 if pp == 300 { dg_ok=1; var j: i64=0; while j<300 { if fr[poff[0]+j] != pl[j] { dg_ok=0; j=300 } else { j=j+1 } } }
88 pass = pass + g_check("DATAGRAM parse: payload len 300, byte-exact round-trip" as *u8, dg_ok); total=total+1
89 // non-DATAGRAM first byte rejected
90 fr[0]=0x06 as u8
91 pass = pass + g_check("DATAGRAM parse rejects non-0x31 frame (-1)" as *u8, quic_datagram_parse(fr, flen, poff) == 0 - 1); total=total+1
92
93 g_puts("---- quic_wire gate: passed " as *u8); g_pn(pass); g_puts(" / " as *u8); g_pn(total); g_puts(" ----\n" as *u8)
94 if pass == total { g_puts("VERDICT: GREEN (RFC 9000 varints + RFC 9221 DATAGRAM frame, sovereign, byte-exact)\n" as *u8); return 0 }
95 g_puts("VERDICT: RED\n" as *u8)
96 return 1
97}