nx_tls13_recv_hs_diff_test.nx source
↩ module page · 137 lines · 5745 B
1// nx_tls13_recv_hs_diff_test.nx -- B1 differential: identical setup to
2// nx_tls13_recv_hs_probe_test (which walks the record with MIRRORED logic
3// and reaches WAIT_CLIENT_FIN green vs example.com), but calls the REAL
4// shipped nx_tls13_client_session_recv_hs per record. If this fails where
5// the mirror passes, the defect is inside recv_hs's COMPILED code (suspect:
6// the 5-deep nested else-if state chain -- a filed compiler landmine class),
7// not its logic. RH= verdict + ST= state per record.
8// expect_exit: 0 when recv_hs is healthy against example.com
9// license_tier: ORIGINAL
10
11import "nx_syscalls.nx"
12import "nx_https_url_for_fetch.nx"
13import "nx_https_url_connect.nx"
14import "nx_x509_trust_store.nx"
15import "nx_trust_store_load_from_certdata.nx"
16import "nx_tls13_client_session_recv_sh.nx"
17import "nx_tls13_client_session_recv_hs.nx"
18import "nx_tls13_read_record_from_fd.nx"
19
20func rd_dec(label0: i64, label1: i64, v: i64) -> i64 {
21 let lab: *u8 = sys_mmap(8)
22 lab[0] = label0 as u8; lab[1] = label1 as u8; lab[2] = 0x3D
23 sys_write(1, lab, 3)
24 var av: i64 = v
25 if av < 0 {
26 let neg: *u8 = sys_mmap(8); neg[0] = 0x2D; sys_write(1, neg, 1)
27 av = 0 - av
28 }
29 if av == 0 {
30 let z: *u8 = sys_mmap(8); z[0] = 0x30; sys_write(1, z, 1)
31 }
32 if av > 0 {
33 let buf: *u8 = sys_mmap(32)
34 var pos: i64 = 0
35 var x: i64 = av
36 while x > 0 { buf[pos] = (0x30 + (x % 10)) as u8; x = x / 10; pos = pos + 1 }
37 let out: *u8 = sys_mmap(32)
38 var oi: i64 = 0
39 while oi < pos { out[oi] = buf[pos - 1 - oi]; oi = oi + 1 }
40 sys_write(1, out, pos)
41 }
42 let nl: *u8 = sys_mmap(8); nl[0] = 0x0A; sys_write(1, nl, 1)
43 return 0
44}
45
46func main() -> i64 {
47 let host_len: i64 = 11
48 let url: *u8 = "https://example.com/\x00"
49 let epoch: i64 = 1781100000
50
51 let r: i64 = nx_trust_store_load_from_certdata("/tmp/mozilla_certdata.txt\x00" as *u8, 300, 4194304)
52 if r <= 0 { rd_dec(0x4C, 0x4F, r); return 11 }
53 let store: *TrustStore = r as *TrustStore
54
55 let url_p: *NxUrl = nx_url_new()
56 let target_raw: *u8 = sys_mmap(32)
57 let target: *NxHttpsTarget = target_raw as *NxHttpsTarget
58 target.url = url_p
59 target.port = 0
60 if nx_https_url_for_fetch(url, target) != NX_HTTPS_URL_OK { return 12 }
61 let fd_p: *i64 = sys_mmap(16) as *i64
62 if nx_https_url_connect(target, url, 1781100002, fd_p) != NX_HTTPS_CONNECT_OK { return 13 }
63 let fd: i64 = *fd_p
64 sys_set_socket_timeout(fd, 10)
65 let host: *u8 = url + target.url.host_off
66
67 let val_ctx_raw: *u8 = sys_mmap(64)
68 let val_ctx: *TlsValidationContext = val_ctx_raw as *TlsValidationContext
69 val_ctx.store = store
70 val_ctx.sni_host = host
71 val_ctx.sni_host_len = host_len
72 val_ctx.now_epoch = epoch
73
74 let cr: *u8 = sys_mmap(32)
75 let priv: *u8 = sys_mmap(32)
76 var i: i64 = 0
77 while i < 32 { cr[i] = (0xC0 + i) as u8; priv[i] = (0xA0 + i) as u8; i = i + 1 }
78 let s: *Tls13ClientSession = nx_tls13_client_session_new(cr, priv)
79 let ch_buf: *u8 = sys_mmap(1024)
80 let ch_n: i64 = nx_tls13_client_session_emit_ch(s, host, host_len, ch_buf, 1024)
81 if ch_n < 0 { sys_close(fd); return 14 }
82
83 let rec: *u8 = sys_mmap(1024 + NX_TLS13_RECORD_HEADER_LEN)
84 rec[0] = (NX_TLS13_CT_HANDSHAKE & 0xff) as u8
85 rec[1] = 0x03 as u8; rec[2] = 0x01 as u8
86 rec[3] = ((ch_n >> 8) & 0xff) as u8
87 rec[4] = (ch_n & 0xff) as u8
88 var ci: i64 = 0
89 while ci < ch_n { rec[NX_TLS13_RECORD_HEADER_LEN + ci] = ch_buf[ci]; ci = ci + 1 }
90 var sent: i64 = 0
91 let want: i64 = NX_TLS13_RECORD_HEADER_LEN + ch_n
92 while sent < want {
93 let w: i64 = sys_write(fd, rec + sent, want - sent)
94 if w <= 0 { sys_close(fd); return 15 }
95 sent = sent + w
96 }
97
98 let sh_record: *u8 = sys_mmap(16700)
99 let sh_total: i64 = nx_tls13_read_record_from_fd(fd, sh_record, 16700)
100 if sh_total < 0 { sys_close(fd); rd_dec(0x52, 0x44, sh_total); return 16 }
101 let rv: i64 = nx_tls13_client_session_recv_sh(s, sh_record + NX_TLS13_RECORD_HEADER_LEN, sh_total - NX_TLS13_RECORD_HEADER_LEN)
102 rd_dec(0x52, 0x56, rv)
103 if rv != NX_TLS13_RECV_SH_OK { sys_close(fd); return 17 }
104
105 var recno: i64 = 0
106 var fail: i64 = 0
107 var running: i64 = 1
108 while running == 1 {
109 if s.state == NX_TLS13_CSESSION_STATE_WAIT_CLIENT_FIN { running = 0 }
110 if recno >= 16 { running = 0; if fail == 0 { fail = 90 } }
111 if running == 1 {
112 let hs_record: *u8 = sys_mmap(17000)
113 let hs_total: i64 = nx_tls13_read_record_from_fd(fd, hs_record, 17000)
114 rd_dec(0x52, 0x43, recno) // RC=
115 rd_dec(0x54, 0x4C, hs_total) // TL=
116 if hs_total < 0 { fail = 20; running = 0 }
117 if running == 1 {
118 let oct: i64 = hs_record[0] & 0xff
119 rd_dec(0x43, 0x54, oct) // CT=
120 if oct == 20 {
121 rd_dec(0x43, 0x43, 1) // CC=
122 } else {
123 let rh: i64 = nx_tls13_client_session_recv_hs(s, hs_record, hs_total, val_ctx)
124 rd_dec(0x52, 0x48, rh) // RH=
125 rd_dec(0x53, 0x54, s.state) // ST=
126 if rh != NX_TLS13_RECV_HS_OK { fail = 40 + rh; running = 0 }
127 }
128 }
129 recno = recno + 1
130 }
131 }
132 sys_close(fd)
133 rd_dec(0x46, 0x58, fail) // FX=
134 if fail == 0 { if s.state == NX_TLS13_CSESSION_STATE_WAIT_CLIENT_FIN { return 0 } }
135 if fail == 0 { return 91 }
136 return fail
137}