code wiki / _hdl_build / nx_torrent_gateway_gate.nx
nx_torrent_gateway_gate.nx source
↩ module page · 71 lines · 5628 B
1// nx_torrent_gateway_gate.nx -- referee for the R3c front gateway's security keystone (imports the gateway,
2// main stripped, tests the pure fns). PROVES:
3// tg_backend_req injects exactly ONE authoritative "X-Nishi-Level: <level>" built FRESH from the validated
4// level -- a client-supplied X-Nishi-Level cannot survive (no privilege spoof), and the POST body is forwarded.
5// tg_gate_decision: the login/auth/sw bootstrap is PUBLIC (reachable to log in); a gated /torrent/* path with
6// NO session (level 0) -> DENY (401); a logged-in member+ (level>=1) -> ALLOW (area enforced downstream).
7// GREEN iff every row matches. Prints verdict=GREEN to STDOUT *and* returns the exit code.
8// Durable -> knowledge/status/torrent_gateway_gate.log. license_tier: ORIGINAL
9import "nx_torrent_gateway.nx"
10import "nx_syscalls.nx"
11
12func g_puts(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
13func g_num(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 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 }
14func g_w(fd: i64, s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(fd,s,n); return 0 }
15func g_wn(fd: i64, 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(fd,bb,k); return 0 }
16func chk(got: i64, want: i64, label: *u8) -> i64 {
17 g_puts(" "); g_puts(label); g_puts(" got="); g_num(got); g_puts(" want="); g_num(want)
18 if got == want { g_puts(" PASS\n"); return 1 }
19 g_puts(" FAIL\n"); return 0
20}
21// count non-overlapping occurrences of NUL-terminated pat in buf[0..n).
22func gcount(buf: *u8, n: i64, pat: *u8) -> i64 {
23 var pl: i64=0; while pat[pl]!=(0 as u8){pl=pl+1}
24 if pl<=0 { return 0 }
25 var c: i64=0; var i: i64=0
26 while i + pl <= n { var j: i64=0; var m: i64=1; while j<pl { if buf[i+j]!=pat[j] {m=0;j=pl} else {j=j+1} } if m==1 { c=c+1; i=i+pl } else { i=i+1 } }
27 return c
28}
29
30func main() -> i64 {
31 g_puts("=== TORRENT GATEWAY GATE (R3c: authoritative X-Nishi-Level injection + deny-by-default gating) ===\n" as *u8)
32 var pass: i64=0
33 var rows: i64=0
34 let dummy: *u8 = sys_mmap(8)
35
36 // --- tg_backend_req: authoritative level injection, built fresh ---
37 let r3: *u8 = sys_mmap(4096); let n3: i64 = tg_backend_req("GET" as *u8, 3, "/torrent/api/status" as *u8, 19, 3, dummy, 0, dummy, 0, r3)
38 rows=rows+1; pass=pass+chk(gcount(r3, n3, "GET /torrent/api/status HTTP" as *u8), 1, "backend req has the method+path" as *u8)
39 rows=rows+1; pass=pass+chk(gcount(r3, n3, "X-Nishi-Level: 3" as *u8), 1, "injects exactly one X-Nishi-Level: 3" as *u8)
40 rows=rows+1; pass=pass+chk(gcount(r3, n3, "X-Nishi-Level: " as *u8), 1, " -> EXACTLY ONE level header (no dup)" as *u8)
41 rows=rows+1; pass=pass+chk(gcount(r3, n3, "X-Nishi-Level: 9" as *u8), 0, " -> NO client-spoofed level (9) present (NO-SPOOF)" as *u8)
42
43 let r1: *u8 = sys_mmap(4096); let n1: i64 = tg_backend_req("GET" as *u8, 3, "/torrent/api/status" as *u8, 19, 1, dummy, 0, dummy, 0, r1)
44 rows=rows+1; pass=pass+chk(gcount(r1, n1, "X-Nishi-Level: 1" as *u8), 1, "family level -> X-Nishi-Level: 1" as *u8)
45
46 // body forwarding (POST /add carries the magnet)
47 let rb: *u8 = sys_mmap(4096); let body: *u8 = "magnet=x&area=media" as *u8
48 let nb: i64 = tg_backend_req("POST" as *u8, 4, "/torrent/api/add" as *u8, 16, 3, dummy, 0, body, 19, rb)
49 rows=rows+1; pass=pass+chk(gcount(rb, nb, "Content-Length: 19" as *u8), 1, "POST body forwarded (Content-Length)" as *u8)
50 rows=rows+1; pass=pass+chk(gcount(rb, nb, "magnet=x&area=media" as *u8), 1, " -> body bytes present" as *u8)
51
52 // --- tg_gate_decision: public bootstrap reachable; gated paths deny-by-default ---
53 rows=rows+1; pass=pass+chk(tg_gate_decision("/torrent/login" as *u8, 14, 0), 1, "public /torrent/login @lvl0 -> ALLOW" as *u8)
54 rows=rows+1; pass=pass+chk(tg_gate_decision("/torrent/auth/login" as *u8, 19, 0), 1, "public /torrent/auth/login @lvl0 -> ALLOW" as *u8)
55 rows=rows+1; pass=pass+chk(tg_gate_decision("/torrent/sw.js" as *u8, 14, 0), 1, "public /torrent/sw.js @lvl0 -> ALLOW" as *u8)
56 rows=rows+1; pass=pass+chk(tg_gate_decision("/torrent/api/add" as *u8, 16, 0), 0, "gated /torrent/api/add @lvl0 -> DENY (401)" as *u8)
57 rows=rows+1; pass=pass+chk(tg_gate_decision("/torrent/api/add" as *u8, 16, 1), 1, "gated /torrent/api/add @lvl1 -> ALLOW (member)" as *u8)
58 rows=rows+1; pass=pass+chk(tg_gate_decision("/torrent/stream/x" as *u8, 17, 0), 0, "gated /torrent/stream @lvl0 -> DENY" as *u8)
59 rows=rows+1; pass=pass+chk(tg_path_public("/torrent/api/status" as *u8, 19), 0, "tg_path_public(api/status)=0 (gated)" as *u8)
60
61 g_puts("----\nTORRENT-GATEWAY-GATE rows=" as *u8); g_num(rows); g_puts(" pass=" as *u8); g_num(pass)
62 if pass==rows { g_puts(" verdict=GREEN\n" as *u8) } else { g_puts(" verdict=RED\n" as *u8) }
63 let lg: i64=sys_openat_append("knowledge/status/torrent_gateway_gate.log" as *u8, 0x1a4)
64 if lg>=0 {
65 g_w(lg, "TORRENT-GATEWAY-GATE rows=" as *u8); g_wn(lg, rows); g_w(lg, " pass=" as *u8); g_wn(lg, pass)
66 if pass==rows { g_w(lg, " verdict=GREEN\n" as *u8) } else { g_w(lg, " verdict=RED\n" as *u8) }
67 sys_close(lg)
68 }
69 if pass==rows { sys_exit(0); return 0 }
70 sys_exit(1); return 1
71}