code wiki / _hdl_build / _ar2_perf_probe.nx

_ar2_perf_probe.nx source

↩ module page · 53 lines · 2616 B

1// _ar2_perf_probe.nx -- TIMING ORACLE for argon2id KDF params (vault machine-key v2 upgrade). 2// Measures wall ms at candidate (m_kib, t) pairs so the chosen params are MEASURED, not guessed 3// (no magic numbers). Run after the 2026-06-10 compiler bless; before this the module miscompiled. 4// license_tier: ORIGINAL 5import "nx_syscalls.nx" 6import "nx_argon2id.nx" 7func _p(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 8func _pn(v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m;sys_write(1,"-" as *u8,1)}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48;k=1}; while m>0{t[k]=48+(m%10);m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(1,bb,k); return 0 } 9func pp_mk_ctx(m_kib: i64) -> *NxArgon2idCtx { 10 let raw: *u8 = sys_mmap(NX_ARGON2ID_CTX_BYTES) 11 let ctx: *NxArgon2idCtx = raw as *NxArgon2idCtx 12 ctx.memory_blocks = sys_mmap(m_kib * 1024) 13 ctx.h0_buf = sys_mmap(64) 14 ctx.prepend_buf = sys_mmap(2048) 15 ctx.prev_buf = sys_mmap(64) 16 ctx.curr_buf = sys_mmap(64) 17 ctx.zero_block = sys_mmap(1024) 18 ctx.z_buf = sys_mmap(1024) 19 ctx.tmp_block = sys_mmap(1024) 20 ctx.addr_block = sys_mmap(1024) 21 ctx.final_block = sys_mmap(1024) 22 ctx.h0_input = sys_mmap(2048) 23 ctx.b2b_ctx = sys_mmap(NX_BLAKE2B_CTX_BYTES) as *NxBlake2b 24 ctx.b2b_buf = sys_mmap(128) 25 ctx.b2b_sv = sys_mmap(128) as *i64 26 ctx.b2b_sm = sys_mmap(128) as *i64 27 ctx.g_r = sys_mmap(1024) as *i64 28 ctx.g_rs = sys_mmap(1024) as *i64 29 ctx.g_col = sys_mmap(128) as *i64 30 return ctx 31} 32func pp_one(m_kib: i64, t: i64) -> i64 { 33 let ctx: *NxArgon2idCtx = pp_mk_ctx(m_kib) 34 let tag: *u8 = sys_mmap(64) 35 let t0: i64 = sys_now_ms() 36 let rc: i64 = nx_argon2id_hash(ctx, "probe-password" as *u8, 14, "probe-salt-16byt" as *u8, 16, 1, 32, m_kib, t, tag) 37 let t1: i64 = sys_now_ms() 38 _p(" m_kib=" as *u8); _pn(m_kib); _p(" t=" as *u8); _pn(t) 39 _p(" rc=" as *u8); _pn(rc); _p(" ms=" as *u8); _pn(t1 - t0) 40 _p(" tag0=" as *u8); _pn(tag[0] as i64); _p("\n" as *u8) 41 return rc 42} 43func main() -> i64 { 44 _p("=== argon2id timing oracle (vault mkey-v2 param selection) ===\n" as *u8) 45 var bad: i64 = 0 46 if pp_one(1024, 3) != 0 { bad = 1 } // 1 MiB 47 if pp_one(8192, 3) != 0 { bad = 1 } // 8 MiB 48 if pp_one(65536, 3) != 0 { bad = 1 } // 64 MiB (RFC 9106 second-recommended) 49 if bad == 1 { _p(" PROBE: a derivation FAILED\n" as *u8); sys_exit(1); return 1 } 50 _p(" PROBE: all derivations rc=0 (pick the largest m_kib within ~1-2s)\n" as *u8) 51 sys_exit(0) 52 return 0 53}