code wiki / _hdl_build / nx_pow_challenge_gate.nx

nx_pow_challenge_gate.nx source

↩ module page · 70 lines · 4703 B

1// nx_pow_challenge_gate.nx -- gate for the L7 DDoS proof-of-work puzzle (nx_pow_challenge). Proves the 2// leading-zero-bit count, that a solver finds a valid solution which the server verifies, the difficulty 3// MONOTONICITY (a harder-than-required solution still satisfies an easier check), that a low-difficulty 4// solution does NOT satisfy a much harder one (cost scales), and the COST ASYMMETRY (a high difficulty is 5// infeasible to brute within a small budget = the defense). Appends "ACCESSGATE row=nx_pow_challenge ddos-pow 6// ... verdict=PASS" to knowledge/status/access_gate.log on all-pass. license_tier: ORIGINAL 7import "nx_pow_challenge.nx" 8import "nx_syscalls.nx" 9 10func pw_w(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 11func pw_num(v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48 as u8;k=1}; while m>0{t[k]=(48+(m%10)) as u8;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 } 12func pw_cat(dst: *u8, off: i64, s: *u8) -> i64 { var o: i64=off; var k: i64=0; while s[k]!=(0 as u8){dst[o]=s[k];o=o+1;k=k+1} return o } 13func pw_catnum(dst: *u8, off: i64, v: i64) -> i64 { var o: i64=off; let t: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m}; var k: i64=0; if m==0{t[0]=48 as u8;k=1}; while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1}; var i: i64=0; while i<k{dst[o]=t[k-1-i];o=o+1;i=i+1} return o } 14func pw_row(id: i64, ok: i64, what: *u8) -> i64 { pw_w("POWROW " as *u8); pw_num(id); pw_w(" " as *u8); if ok==1 { pw_w("PASS " as *u8) } else { pw_w("FAIL " as *u8) } pw_w(what); pw_w("\n" as *u8); return ok } 15func pw_slen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n } 16 17func main() -> i64 { 18 var pass: i64 = 0 19 var rows: i64 = 0 20 var ok: i64 = 0 21 22 // R0: leading-zero-bit count on crafted hashes 23 let z: *u8 = sys_mmap(32) // all zero -> 256 bits 24 let a: *u8 = sys_mmap(32); a[0]=128 as u8 // 0x80 -> 0 leading zeros 25 let b: *u8 = sys_mmap(32); b[0]=0 as u8; b[1]=64 as u8 // 0x00 0x40 -> 8 + 1 = 9 26 let c: *u8 = sys_mmap(32); c[0]=1 as u8 // 0x01 -> 7 27 ok = 0; if pow_lzb(z)==256 { if pow_lzb(a)==0 { if pow_lzb(b)==9 { if pow_lzb(c)==7 { ok=1 } } } } 28 rows=rows+1; pass=pass+pw_row(0, ok, "pow_lzb: zero=256, 0x80=0, 0x0040=9, 0x01=7" as *u8) 29 30 let chal: *u8 = "nishi-pow-challenge-2026-06-16-abc" as *u8 31 let clen: i64 = pw_slen(chal) 32 let sol: *u8 = sys_mmap(32) 33 34 // R1: solver finds a solution for difficulty 8 35 let slen: i64 = pow_solve(chal, clen, 8, sol, 200000) 36 ok = 0; if slen > 0 { ok = 1 } 37 rows=rows+1; pass=pass+pw_row(1, ok, "solver finds a difficulty-8 solution" as *u8) 38 39 // R2: the server verifies the found solution at difficulty 8 40 ok = pow_verify(chal, clen, sol, slen, 8) 41 rows=rows+1; pass=pass+pw_row(2, ok, "server verifies the found solution (diff=8) -> 1" as *u8) 42 43 // R3: monotonicity -- a diff-8 solution also satisfies the easier diff-4 44 ok = pow_verify(chal, clen, sol, slen, 4) 45 rows=rows+1; pass=pass+pw_row(3, ok, "monotonic: diff-8 solution also satisfies diff-4" as *u8) 46 47 // R4 (NEG): cost scales -- the diff-8 solution does NOT satisfy diff-24 (gap 2^16) 48 ok = 0; if pow_verify(chal, clen, sol, slen, 24)==0 { ok=1 } 49 rows=rows+1; pass=pass+pw_row(4, ok, "cost scales: diff-8 solution fails diff-24 (neg control)" as *u8) 50 51 // R5 (NEG): cost ASYMMETRY -- difficulty 32 is infeasible within a small budget (the DDoS defense) 52 let sol2: *u8 = sys_mmap(32) 53 let r: i64 = pow_solve(chal, clen, 32, sol2, 4000) 54 ok = 0; if r == (0 - 1) { ok = 1 } 55 rows=rows+1; pass=pass+pw_row(5, ok, "asymmetry: diff-32 not bruteable in 4000 tries (attacker pays, neg)" as *u8) 56 57 pw_w("NX-POW-CHALLENGE-GATE rows=" as *u8); pw_num(rows); pw_w(" pass=" as *u8); pw_num(pass); pw_w("\n" as *u8) 58 if pass == rows { 59 let line: *u8 = sys_mmap(256) 60 var off: i64 = pw_cat(line, 0, "ACCESSGATE row=nx_pow_challenge ddos-pow rows=" as *u8) 61 off = pw_catnum(line, off, rows); off = pw_cat(line, off, " pass=" as *u8); off = pw_catnum(line, off, pass) 62 off = pw_cat(line, off, " verdict=PASS\n" as *u8) 63 let gf: i64 = sys_openat_append("knowledge/status/access_gate.log" as *u8, 0x1a4) 64 if gf >= 0 { sys_write(gf, line, off); sys_close(gf) } 65 pw_w("NX-POW-CHALLENGE-GATE verdict=PASS -- L7 proof-of-work recorded in access_gate.log\n" as *u8) 66 sys_exit(0); return 0 67 } 68 pw_w("NX-POW-CHALLENGE-GATE verdict=FAIL -- NOT recorded (no fake-green)\n" as *u8) 69 sys_exit(1); return 1 70}