code wiki / (root) / nx_porkbun_ping_probe.nx

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}