nx_porkbun_ping_probe.nx source
↩ module page · 422 lines · 19406 B
1// nx_porkbun_ping_probe.nx -- THROWAWAY DIAGNOSTIC for the Porkbun
2// TLS/HTTP "empty response" failure (nx_porkbun_set_txt).
3//
4// Pinpoints WHERE the round-trip to api.porkbun.com breaks:
5// PROBE B (root-cause): manual handshake to api.porkbun.com, capture
6// the server's Certificate handshake message, dump the chain shape
7// (n_certs, per-cert sig_len/sig_alg/DN, trust-anchor lookup), then
8// run the EXACT validation the real client runs
9// (nx_https_cert_pipeline_verify_with_store) and print its sealed
10// verdict by name. This says "TLS handshake OK but cert validation
11// returned NO_TRUST_ANCHOR / CHAIN_SIG_FAIL / LEAF_* / ..." -- the
12// precise failure point.
13// PROBE A (end-to-end): full client stack (nx_tls13_client_session_run
14// + nx_https_post_complete) doing a Porkbun PING POST (read-only;
15// returns your IP). Prints session_run's exact stage verdict on
16// failure, or the HTTP status + body on success.
17//
18// Uses real wall-clock now() + the live Mozilla trust store, matching
19// nx_acme_dns01_issue exactly. Creds come from the sovereign vault
20// decrypt output /tmp/nxsecret.out (line1=apikey, line2=secretapikey).
21//
22// license_tier: ORIGINAL (throwaway probe; composes shipped primitives)
23
24import "nx_syscalls.nx"
25import "nx_csprng.nx"
26import "nx_url.nx"
27import "nx_https_url_for_fetch.nx"
28import "nx_https_url_connect.nx"
29import "nx_https_post_complete.nx"
30import "nx_tls13.nx"
31import "nx_tls13_record.nx"
32import "nx_tls13_read_record_from_fd.nx"
33import "nx_tls13_client_session.nx"
34import "nx_tls13_client_session_recv_sh.nx"
35import "nx_tls13_client_session_run.nx"
36import "nx_tls13_client_validate_certificate.nx"
37import "nx_tls13_auth.nx"
38import "nx_https_cert_pipeline.nx"
39import "nx_x509.nx"
40import "nx_x509_sig_alg.nx"
41import "nx_x509_trust_store.nx"
42import "nx_trust_store_load_from_certdata.nx"
43import "nx_http_response_parse.nx"
44import "nx_acme_porkbun.nx"
45const K_MAGIC_1024: i64 = 1024
46const K_MAGIC_2048: i64 = 2048
47const K_MAGIC_16645: i64 = 16645
48const K_MAGIC_65536: i64 = 65536
49const K_MAGIC_16384: i64 = 16384
50const K_MAGIC_4194304: i64 = 4194304
51
52// ---- tiny print helpers ----
53func pb_str(fd: i64, s: *u8) -> i64 {
54 var n: i64 = 0
55 while s[n] != (0 as u8) { n = n + 1 }
56 sys_write(fd, s, n)
57 return 0
58}
59func pb_dec(fd: i64, v: i64) -> i64 {
60 let b: *u8 = sys_mmap(24)
61 var x: i64 = v
62 if x < 0 { sys_write(fd, "-" as *u8, 1); x = 0 - x }
63 var i: i64 = 22
64 if x == 0 { b[i] = 0x30 as u8; i = i - 1 }
65 else { while x > 0 { b[i] = (0x30 + (x - (x / 10) * 10)) as u8; x = x / 10; i = i - 1 } }
66 sys_write(fd, (b as i64 + i + 1) as *u8, 22 - i)
67 return 0
68}
69
70// pipeline verdict -> name
71func pb_pipe_name(v: i64) -> *u8 {
72 if v == 1 { return "OK" as *u8 }
73 if v == 2 { return "CERT_MSG_BAD" as *u8 }
74 if v == 3 { return "CERT_PARSE_FAIL" as *u8 }
75 if v == 4 { return "LEAF_NOT_YET_VALID" as *u8 }
76 if v == 5 { return "LEAF_EXPIRED" as *u8 }
77 if v == 6 { return "LEAF_NO_SAN" as *u8 }
78 if v == 7 { return "HOSTNAME_MISMATCH" as *u8 }
79 if v == 8 { return "LEAF_OTHER" as *u8 }
80 if v == 9 { return "CHAIN_DN_MISMATCH" as *u8 }
81 if v == 10 { return "CHAIN_SIG_FAIL" as *u8 }
82 if v == 11 { return "CHAIN_OTHER" as *u8 }
83 if v == 12 { return "NO_TRUST_ANCHOR" as *u8 }
84 return "??" as *u8
85}
86// session_run negative -> stage name (pass the positive magnitude)
87func pb_run_name(v: i64) -> *u8 {
88 if v == 2 { return "EMIT_CH_FAIL" as *u8 }
89 if v == 3 { return "WRITE_CH_FAIL" as *u8 }
90 if v == 4 { return "READ_SH_FAIL" as *u8 }
91 if v == 5 { return "RECV_SH_FAIL" as *u8 }
92 if v == 6 { return "READ_HS_FAIL" as *u8 }
93 if v == 7 { return "RECV_HS_FAIL (cert-validate or record-decrypt)" as *u8 }
94 if v == 8 { return "EMIT_CF_FAIL" as *u8 }
95 if v == 9 { return "WRITE_CF_FAIL" as *u8 }
96 if v == 10 { return "DERIVE_APP_FAIL" as *u8 }
97 if v == 11 { return "LOOP_BUDGET_EXCEEDED" as *u8 }
98 return "??" as *u8
99}
100func pb_found(a: *TrustAnchor) -> i64 {
101 if (a as i64) != 0 { return 1 }
102 return 0
103}
104// is a full Finished (handshake type 20) message present in the stream?
105func pb_hs_complete(m: *u8, mlen: i64) -> i64 {
106 var off: i64 = 0
107 while off + 4 <= mlen {
108 let ty: i64 = m[off] & 0xff
109 let bl: i64 = ((m[off + 1] & 0xff) << 16) | ((m[off + 2] & 0xff) << 8) | (m[off + 3] & 0xff)
110 let ml: i64 = 4 + bl
111 if off + ml > mlen { return 0 }
112 if ty == 20 { return 1 }
113 off = off + ml
114 }
115 return 0
116}
117
118func pb_hex(fd: i64, buf: *u8, n: i64) -> i64 {
119 let hexd: *u8 = "0123456789abcdef" as *u8
120 let out: *u8 = sys_mmap(4)
121 out[1] = 0x20 as u8
122 var i: i64 = 0
123 while i < n {
124 let b: i64 = buf[i] & 0xff
125 out[0] = hexd[(b >> 4) & 0xf]
126 sys_write(fd, out, 1)
127 out[0] = hexd[b & 0xf]
128 sys_write(fd, out, 2)
129 i = i + 1
130 if (i % 16) == 0 { sys_write(fd, "\n" as *u8, 1) }
131 }
132 sys_write(fd, "\n" as *u8, 1)
133 return 0
134}
135// 32-byte HelloRetryRequest magic random (SHA-256 of "HelloRetryRequest", RFC 8446 4.1.3)
136func pb_is_hrr(rnd: *u8) -> i64 {
137 let magic: *u8 = sys_mmap(32)
138 magic[0]=0xcf as u8; magic[1]=0x21 as u8; magic[2]=0xad as u8; magic[3]=0x74 as u8
139 magic[4]=0xe5 as u8; magic[5]=0x9a as u8; magic[6]=0x61 as u8; magic[7]=0x11 as u8
140 magic[8]=0xbe as u8; magic[9]=0x1d as u8; magic[10]=0x8c as u8; magic[11]=0x02 as u8
141 magic[12]=0x1e as u8; magic[13]=0x65 as u8; magic[14]=0xb8 as u8; magic[15]=0x91 as u8
142 magic[16]=0xc2 as u8; magic[17]=0xa2 as u8; magic[18]=0x11 as u8; magic[19]=0x16 as u8
143 magic[20]=0x7a as u8; magic[21]=0xbb as u8; magic[22]=0x8c as u8; magic[23]=0x5e as u8
144 magic[24]=0x07 as u8; magic[25]=0x9e as u8; magic[26]=0x09 as u8; magic[27]=0xe2 as u8
145 magic[28]=0xc8 as u8; magic[29]=0xa8 as u8; magic[30]=0x33 as u8; magic[31]=0x9c as u8
146 var i: i64 = 0
147 while i < 32 { if (rnd[i] & 0xff) != (magic[i] & 0xff) { return 0 } i = i + 1 }
148 return 1
149}
150
151func pb_write_all(fd: i64, buf: *u8, n: i64) -> i64 {
152 var off: i64 = 0
153 while off < n {
154 let w: i64 = sys_write(fd, (buf as i64 + off) as *u8, n - off)
155 if w <= 0 { return 0 - 1 }
156 off = off + w
157 }
158 return 0
159}
160
161// dump the captured cert chain + trust-anchor lookup diagnostics
162func pb_dump_chain(cert_msg: *u8, cert_msg_len: i64, store: *TrustStore) -> i64 {
163 let offs: *i64 = sys_mmap(64) as *i64
164 let lens: *i64 = sys_mmap(64) as *i64
165 let np: *i64 = sys_mmap(16) as *i64
166 let pv: i64 = tls13_parse_certificate_chain_all(cert_msg, cert_msg_len, offs, lens, np, 8)
167 if pv != NX_TLS13_AUTH_VERDICT_OK {
168 pb_str(1, "[B] chain-parse verdict="); pb_dec(1, pv); pb_str(1, "\n"); return 1
169 }
170 let n: i64 = *np
171 pb_str(1, "[B] n_certs="); pb_dec(1, n); pb_str(1, "\n")
172 var i: i64 = 0
173 while i < n {
174 let cbuf: *u8 = (cert_msg as i64 + offs[i]) as *u8
175 let c_raw: *u8 = sys_mmap(256)
176 let c: *X509Cert = c_raw as *X509Cert
177 let rc: i64 = x509_parse(cbuf, lens[i], c)
178 pb_str(1, "[B] cert["); pb_dec(1, i); pb_str(1, "] der_len="); pb_dec(1, lens[i])
179 if rc < 0 { pb_str(1, " PARSE FAIL rc="); pb_dec(1, rc); pb_str(1, "\n") }
180 else {
181 let sa: i64 = nx_x509_sig_alg_identify(cbuf, c.sig_alg_off, c.sig_alg_len)
182 pb_str(1, " sig_len="); pb_dec(1, c.sig_len)
183 pb_str(1, " sig_alg#="); pb_dec(1, sa)
184 pb_str(1, " subj_len="); pb_dec(1, c.subject_len)
185 pb_str(1, " iss_len="); pb_dec(1, c.issuer_len)
186 let instore: *TrustAnchor = trust_store_lookup_by_subject(store, cbuf, c.subject_off, c.subject_len)
187 pb_str(1, " subj_in_store="); pb_dec(1, pb_found(instore))
188 pb_str(1, "\n")
189 }
190 i = i + 1
191 }
192 // trust-anchor resolution on the LAST presented cert (what the pipeline keys on)
193 let lbuf: *u8 = (cert_msg as i64 + offs[n - 1]) as *u8
194 let lc_raw: *u8 = sys_mmap(256)
195 let lc: *X509Cert = lc_raw as *X509Cert
196 if x509_parse(lbuf, lens[n - 1], lc) >= 0 {
197 let by_iss: *TrustAnchor = trust_store_lookup_by_subject(store, lbuf, lc.issuer_off, lc.issuer_len)
198 let by_sub: *TrustAnchor = trust_store_lookup_by_subject(store, lbuf, lc.subject_off, lc.subject_len)
199 pb_str(1, "[B] last-cert issuer_in_store="); pb_dec(1, pb_found(by_iss))
200 pb_str(1, " (CaseB root-omitted) subject_in_store="); pb_dec(1, pb_found(by_sub))
201 pb_str(1, " (CaseA root-included)\n")
202 }
203 return 0
204}
205
206// ============ PROBE B: capture Porkbun's cert chain + validate ============
207func pb_probe_cert(store: *TrustStore, now: i64) -> i64 {
208 pb_str(1, "=== PROBE B: capture api.porkbun.com cert chain + validate ===\n")
209 let host: *u8 = "api.porkbun.com" as *u8
210 let host_len: i64 = 15
211 let url: *u8 = "https://api.porkbun.com/api/json/v3/ping\x00" as *u8
212 let url_p: *NxUrl = nx_url_new()
213 let target_raw: *u8 = sys_mmap(32)
214 let target: *NxHttpsTarget = target_raw as *NxHttpsTarget
215 target.url = url_p
216 target.port = 0
217 if nx_https_url_for_fetch(url, target) != NX_HTTPS_URL_OK { pb_str(2, "[B] url FAIL\n"); return 1 }
218 let fd_p: *i64 = sys_mmap(16) as *i64
219 let cv: i64 = nx_https_url_connect(target, url, now, fd_p)
220 if cv != NX_HTTPS_CONNECT_OK { pb_str(2, "[B] TCP connect FAIL v="); pb_dec(2, cv); pb_str(2, "\n"); return 1 }
221 let fd: i64 = *fd_p
222 pb_str(1, "[B] TCP connected.\n")
223
224 let cr: *u8 = sys_mmap(32)
225 let priv: *u8 = sys_mmap(32)
226 nx_csprng_fill(cr, 32)
227 nx_csprng_fill(priv, 32)
228 let s: *Tls13ClientSession = nx_tls13_client_session_new(cr, priv)
229 let ch_buf: *u8 = sys_mmap(K_MAGIC_1024)
230 let ch_n: i64 = nx_tls13_client_session_emit_ch(s, host, host_len, ch_buf, K_MAGIC_1024)
231 if ch_n < 0 { pb_str(2, "[B] emit_ch FAIL\n"); sys_close(fd); return 1 }
232 let ch_rec: *u8 = sys_mmap(K_MAGIC_2048)
233 ch_rec[0] = (NX_TLS13_CT_HANDSHAKE & 0xff) as u8
234 ch_rec[1] = 0x03 as u8
235 ch_rec[2] = 0x01 as u8
236 ch_rec[3] = ((ch_n >> 8) & 0xff) as u8
237 ch_rec[4] = (ch_n & 0xff) as u8
238 var ci: i64 = 0
239 while ci < ch_n { ch_rec[5 + ci] = ch_buf[ci]; ci = ci + 1 }
240 if pb_write_all(fd, ch_rec, 5 + ch_n) < 0 { pb_str(2, "[B] write CH FAIL\n"); sys_close(fd); return 1 }
241
242 let sh_rec: *u8 = sys_mmap(K_MAGIC_16645)
243 let sh_total: i64 = nx_tls13_read_record_from_fd(fd, sh_rec, K_MAGIC_16645)
244 if sh_total < 0 { pb_str(2, "[B] read SH FAIL ret="); pb_dec(2, sh_total); pb_str(2, "\n"); sys_close(fd); return 1 }
245 // ---- DIAGNOSTIC: dump the first server record ----
246 pb_str(1, "[B] first server record: outer_type="); pb_dec(1, sh_rec[0] & 0xff)
247 pb_str(1, " total_len="); pb_dec(1, sh_total)
248 if sh_total >= 6 { pb_str(1, " hs_type="); pb_dec(1, sh_rec[5] & 0xff) }
249 pb_str(1, "\n")
250 var dn: i64 = sh_total
251 if dn > 96 { dn = 96 }
252 pb_str(1, "[B] record bytes[0.."); pb_dec(1, dn); pb_str(1, "]:\n")
253 pb_hex(1, sh_rec, dn)
254 // ServerHello random sits at record offset 11 (5 rec-hdr + 4 hs-hdr + 2 legacy_version)
255 if sh_total >= 43 {
256 if (sh_rec[5] & 0xff) == 2 {
257 let is_hrr: i64 = pb_is_hrr((sh_rec as i64 + 11) as *u8)
258 pb_str(1, "[B] is_HelloRetryRequest="); pb_dec(1, is_hrr); pb_str(1, "\n")
259 // chosen cipher suite is at: 11 + 32 (random) + 1 + session_id_len
260 let sidlen: i64 = sh_rec[43] & 0xff
261 let csoff: i64 = 44 + sidlen
262 if csoff + 1 < sh_total {
263 let cs: i64 = ((sh_rec[csoff] & 0xff) << 8) | (sh_rec[csoff + 1] & 0xff)
264 pb_str(1, "[B] server-chosen cipher_suite=0x"); pb_dec(1, cs)
265 pb_str(1, " (1301=AES128GCM 1302=AES256GCM-SHA384 1303=ChaCha20)\n")
266 }
267 }
268 }
269 let rs: i64 = nx_tls13_client_session_recv_sh(s, (sh_rec as i64 + 5) as *u8, sh_total - 5)
270 if rs != NX_TLS13_RECV_SH_OK {
271 pb_str(1, "[B] recv_sh verdict="); pb_dec(1, rs)
272 pb_str(1, " (3=BAD_FORMAT 4=NO_KEYSHARE 5=BAD_GROUP 6=BAD_KS_LEN 8=BAD_CIPHER)\n")
273 sys_close(fd); return 1
274 }
275 pb_str(1, "[B] ServerHello OK; negotiated cipher_suite#="); pb_dec(1, s.cipher_suite); pb_str(1, "\n")
276
277 // accumulate encrypted handshake plaintext until the server Finished arrives
278 let master: *u8 = sys_mmap(K_MAGIC_65536)
279 var mlen: i64 = 0
280 var recs: i64 = 0
281 var done: i64 = 0
282 while done == 0 {
283 if recs >= 8 { break }
284 let rec: *u8 = sys_mmap(K_MAGIC_16645)
285 let rt: i64 = nx_tls13_read_record_from_fd(fd, rec, K_MAGIC_16645)
286 if rt < 0 { pb_str(1, "[B] (read returned "); pb_dec(1, rt); pb_str(1, ", stopping)\n"); break }
287 recs = recs + 1
288 if (rec[0] & 0xff) == NX_TLS13_CT_CHANGE_CIPHER_SPEC { continue }
289 let ctlen: i64 = rt - 5 - 16
290 if ctlen < 1 { continue }
291 let inner: *u8 = sys_mmap(ctlen + 32)
292 let rct: *i64 = sys_mmap(16) as *i64
293 let rln: *i64 = sys_mmap(16) as *i64
294 let dv: i64 = nx_tls13_record_decrypt_v2(s.cipher_suite, s.server_hs_traffic_key, s.server_hs_iv,
295 s.server_seq, rec, (rec as i64 + 5) as *u8, ctlen,
296 (rec as i64 + rt - 16) as *u8, inner, rct, rln)
297 s.server_seq = s.server_seq + 1
298 if dv != NX_TLS13_REC_VERDICT_OK { pb_str(2, "[B] hs record decrypt FAIL v="); pb_dec(2, dv); pb_str(2, "\n"); break }
299 if *rct != NX_TLS13_CT_HANDSHAKE { continue }
300 var k: i64 = 0
301 while k < *rln { master[mlen + k] = inner[k]; k = k + 1 }
302 mlen = mlen + *rln
303 if pb_hs_complete(master, mlen) == 1 { done = 1 }
304 }
305 sys_close(fd)
306 pb_str(1, "[B] captured handshake bytes="); pb_dec(1, mlen); pb_str(1, " over records="); pb_dec(1, recs); pb_str(1, "\n")
307
308 // locate the Certificate message (handshake type 11)
309 var off: i64 = 0
310 var cert_off: i64 = 0 - 1
311 var cert_len: i64 = 0
312 while off + 4 <= mlen {
313 let ty: i64 = master[off] & 0xff
314 let bl: i64 = ((master[off + 1] & 0xff) << 16) | ((master[off + 2] & 0xff) << 8) | (master[off + 3] & 0xff)
315 let ml: i64 = 4 + bl
316 if ty == 11 { cert_off = off; cert_len = ml; off = mlen }
317 else { off = off + ml }
318 }
319 if cert_off < 0 { pb_str(2, "[B] NO Certificate (type 11) message captured\n"); return 1 }
320 let cert_msg: *u8 = (master as i64 + cert_off) as *u8
321 pb_str(1, "[B] Certificate msg captured len="); pb_dec(1, cert_len); pb_str(1, "\n")
322
323 pb_dump_chain(cert_msg, cert_len, store)
324
325 // THE decisive call: exactly what the real TLS client runs at WAIT_CERT.
326 pb_str(1, "[B] running nx_https_cert_pipeline_verify_with_store (per-link timing -> stderr)...\n")
327 let verdict: i64 = nx_https_cert_pipeline_verify_with_store(cert_msg, cert_len, host, host_len, now, store)
328 pb_str(1, "[B] >>> VALIDATION VERDICT = "); pb_dec(1, verdict); pb_str(1, " ("); pb_str(1, pb_pipe_name(verdict)); pb_str(1, ")\n")
329 return 0
330}
331
332// ============ PROBE A: full stack end-to-end Porkbun PING ============
333func pb_probe_e2e(store: *TrustStore, now: i64, ak: *u8, akn: i64, sk: *u8, skn: i64) -> i64 {
334 pb_str(1, "=== PROBE A: end-to-end Porkbun PING via full client stack ===\n")
335 let url: *u8 = "https://api.porkbun.com/api/json/v3/ping\x00" as *u8
336 let url_p: *NxUrl = nx_url_new()
337 let target_raw: *u8 = sys_mmap(32)
338 let target: *NxHttpsTarget = target_raw as *NxHttpsTarget
339 target.url = url_p
340 target.port = 0
341 if nx_https_url_for_fetch(url, target) != NX_HTTPS_URL_OK { pb_str(2, "[A] url FAIL\n"); return 1 }
342 let host: *u8 = url + target.url.host_off
343 let host_len: i64 = target.url.host_len
344 let fd_p: *i64 = sys_mmap(16) as *i64
345 let cv: i64 = nx_https_url_connect(target, url, now, fd_p)
346 if cv != NX_HTTPS_CONNECT_OK { pb_str(2, "[A] TCP connect FAIL v="); pb_dec(2, cv); pb_str(2, "\n"); return 1 }
347 let fd: i64 = *fd_p
348 pb_str(1, "[A] TCP connected.\n")
349
350 let cr: *u8 = sys_mmap(32)
351 let priv: *u8 = sys_mmap(32)
352 nx_csprng_fill(cr, 32)
353 nx_csprng_fill(priv, 32)
354 let vc_raw: *u8 = sys_mmap(64)
355 let vc: *TlsValidationContext = vc_raw as *TlsValidationContext
356 vc.store = store
357 vc.sni_host = host
358 vc.sni_host_len = host_len
359 vc.now_epoch = now
360 let sr: i64 = nx_tls13_client_session_run(fd, host, host_len, cr, priv, vc)
361 if sr <= 0 {
362 pb_str(1, "[A] *** session_run FAILED *** ret="); pb_dec(1, sr)
363 pb_str(1, " stage="); pb_str(1, pb_run_name(0 - sr)); pb_str(1, "\n")
364 sys_close(fd); return 1
365 }
366 pb_str(1, "[A] TLS handshake + cert validation OK.\n")
367 let session: *Tls13ClientSession = sr as *Tls13ClientSession
368
369 let body: *u8 = sys_mmap(K_MAGIC_1024)
370 var bo: i64 = pk_creds(body, 0, ak, akn, sk, skn)
371 bo = pk_put(body, bo, "}" as *u8)
372 let resp: *u8 = sys_mmap(K_MAGIC_16384)
373 let total: i64 = nx_https_post_complete(session, fd,
374 url + target.url.path_off, target.url.path_len,
375 host, host_len,
376 "application/json" as *u8, 16,
377 body, bo, resp, K_MAGIC_16384)
378 sys_close(fd)
379 if total < 0 { pb_str(1, "[A] POST FAILED ret="); pb_dec(1, total); pb_str(1, "\n"); return 1 }
380 pb_str(1, "[A] response bytes="); pb_dec(1, total); pb_str(1, "\n")
381 let r: *i64 = nx_http_resp_alloc()
382 if nx_http_response_parse(resp, total, r) == 0 {
383 pb_str(1, "[A] HTTP status="); pb_dec(1, r[1]); pb_str(1, "\n")
384 pb_str(1, "[A] body: "); sys_write(1, resp + r[6], total - r[6]); pb_str(1, "\n")
385 } else {
386 pb_str(1, "[A] raw response: "); sys_write(1, resp, total); pb_str(1, "\n")
387 }
388 return 0
389}
390
391func main() -> i64 {
392 let cdpath: *u8 = "data/mozilla_certdata.txt\x00" as *u8
393 let lr: i64 = nx_trust_store_load_from_certdata(cdpath, 300, K_MAGIC_4194304)
394 if lr <= 0 { pb_str(2, "trust load FAIL ret="); pb_dec(2, lr); pb_str(2, "\n"); return 1 }
395 let store: *TrustStore = lr as *TrustStore
396 pb_str(1, "trust store loaded; anchors="); pb_dec(1, trust_store_count(store)); pb_str(1, "\n")
397 let now: i64 = sys_now_realtime_sec()
398 pb_str(1, "now(real epoch)="); pb_dec(1, now); pb_str(1, "\n")
399
400 let raw: *u8 = sys_mmap(K_MAGIC_2048)
401 let rawn: i64 = pk_readline_file("/tmp/nxsecret.out\x00" as *u8, raw, K_MAGIC_2048)
402 if rawn <= 0 { pb_str(2, "creds read FAIL (/tmp/nxsecret.out)\n"); return 2 }
403 var nl: i64 = 0
404 while nl < rawn { if raw[nl] == 0x0a { break } nl = nl + 1 }
405 let ak: *u8 = raw
406 var akn: i64 = nl
407 let s2: i64 = nl + 1
408 var nl2: i64 = s2
409 while nl2 < rawn { if raw[nl2] == 0x0a { break } nl2 = nl2 + 1 }
410 let sk: *u8 = raw + s2
411 var skn: i64 = nl2 - s2
412 if akn > 0 { if raw[akn - 1] == 0x0d { akn = akn - 1 } }
413 if skn > 0 { if sk[skn - 1] == 0x0d { skn = skn - 1 } }
414 if akn <= 0 { pb_str(2, "apikey empty (line1)\n"); return 2 }
415 if skn <= 0 { pb_str(2, "secretapikey empty (line2)\n"); return 2 }
416 pb_str(1, "creds loaded: apikey_len="); pb_dec(1, akn); pb_str(1, " secret_len="); pb_dec(1, skn); pb_str(1, "\n\n")
417
418 pb_probe_cert(store, now)
419 pb_str(1, "\n")
420 pb_probe_e2e(store, now, ak, akn, sk, skn)
421 return 0
422}