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}