code wiki / _hdl_build / nx_torrent_authn_gate.nx

nx_torrent_authn_gate.nx source

↩ module page · 99 lines · 7851 B

1// nx_torrent_authn_gate.nx -- referee for the R3 session->level resolver (real OPAQUE, synthetic realm). 2// Stands up a LIGHT-argon test realm; registers operator/family/stranger. PROVISIONS the roles registry BY 3// HANDLE via tau_cred_id (operator=3, family=1; stranger ABSENT) -- the derive-from-handle path. Then logs 4// each in to mint REAL Ed25519 tokens and drives tau_level. The crucial property: the id derived from a 5// HANDLE (provisioning) equals the id a LOGIN TOKEN resolves to (runtime) -- so a by-handle-provisioned row 6// actually grants the level at runtime. PROVES deny-by-default end to end: 7// operator token -> 3 family token -> 1 no token -> 0 garbage -> 0 8// VALID token w/ NO provisioned role (stranger) -> 0 (leak-check) operator via ngs COOKIE -> 3 9// GREEN iff every row matches. Prints verdict=GREEN to STDOUT *and* returns the exit code. 10// Durable -> knowledge/status/torrent_authn_gate.log. license_tier: ORIGINAL 11import "nx_torrent_authn.nx" 12import "nx_opaque_login.nx" 13import "nx_syscalls.nx" 14 15func 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 } 16func 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 } 17func 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 } 18func 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 } 19func rput(dst: *u8, off: i64, s: *u8) -> i64 { var i: i64=0; while s[i]!=(0 as u8){ dst[off+i]=s[i]; i=i+1 } return off+i } 20func rlen(s: *u8) -> i64 { var i: i64=0; while s[i]!=(0 as u8){i=i+1} return i } 21func gwrite(path: *u8, s: *u8, n: i64) -> i64 { let fd: i64 = sys_openat_wr(path, 0x1a4); if fd<0 { return 0 } if n>0 { sys_write(fd, s, n) } sys_close(fd); return 0 } 22func chk(got: i64, want: i64, label: *u8) -> i64 { 23 g_puts(" "); g_puts(label); g_puts(" got="); g_num(got); g_puts(" want="); g_num(want) 24 if got == want { g_puts(" PASS\n"); return 1 } 25 g_puts(" FAIL\n"); return 0 26} 27// mint a token for handle into tok (NUL-terminated). returns login status. 28func mint(ctx: *NxAuthContext, handle: *u8, hn: i64, pw: *u8, pwn: i64, tok: *u8) -> i64 { 29 let tn: *i64 = sys_mmap(16) as *i64; tn[0] = 0 30 let rc: i64 = olg_login(ctx, handle, hn, pw, pwn, tok, 1023, tn) 31 tok[tn[0]] = 0 as u8 32 return rc 33} 34 35func main() -> i64 { 36 g_puts("=== TORRENT AUTHN GATE (R3: OPAQUE session -> roles level, deny-by-default) ===\n" as *u8) 37 var pass: i64=0 38 var rows: i64=0 39 40 let keys: *u8 = "/tmp/nx_tauG_keys" as *u8 41 let store: *u8 = "/tmp/nx_tauG_store" as *u8 42 let roles: *u8 = "/tmp/nx_tauG_roles" as *u8 43 let realm: *u8 = "nishi_hub_test" as *u8 44 let realm_n: i64 = 14 45 let pw: *u8 = "hub-pass-123456" as *u8; let pwn: i64 = 15 46 47 gwrite(store, "" as *u8, 0) // fresh account store (idempotent re-runs) 48 49 let ctx: *NxAuthContext = sys_mmap(256) as *NxAuthContext 50 rows=rows+1; pass=pass+chk(olg_ctx_setup(ctx, keys, store, realm, realm_n, realm, realm_n, 8192, 1, 1), 0, "ctx setup (light argon)" as *u8) 51 52 let mn: *u8 = sys_mmap(1024); let mnn: *i64 = sys_mmap(16) as *i64 53 rows=rows+1; pass=pass+chk(olg_register(ctx, "operator" as *u8, 8, pw, pwn, mn, 1023, mnn), NX_MAUTH_OK, "register operator" as *u8) 54 rows=rows+1; pass=pass+chk(olg_register(ctx, "family" as *u8, 6, pw, pwn, mn, 1023, mnn), NX_MAUTH_OK, "register family" as *u8) 55 rows=rows+1; pass=pass+chk(olg_register(ctx, "stranger" as *u8, 8, pw, pwn, mn, 1023, mnn), NX_MAUTH_OK, "register stranger" as *u8) 56 57 // PROVISION via NISHI HR (the user-management SSOT) BY HANDLE: enroll operator=3 + family=1; stranger NOT enrolled. 58 gwrite(roles, "" as *u8, 0) // fresh HR store (the "roles" path is now the HR directory) 59 let op_hex: *u8 = sys_mmap(160); let fam_hex: *u8 = sys_mmap(160) 60 rows=rows+1; pass=pass+chk(hr_enroll(roles, realm, realm_n, "operator" as *u8, 8, 3, "hub" as *u8, 1, "gate" as *u8, op_hex), 0, "HR enroll operator(3)" as *u8) 61 rows=rows+1; pass=pass+chk(hr_enroll(roles, realm, realm_n, "family" as *u8, 6, 1, "hub" as *u8, 1, "gate" as *u8, fam_hex), 0, "HR enroll family(1)" as *u8) 62 63 // mint REAL login tokens (runtime path). 64 let tok_op: *u8 = sys_mmap(1024); rows=rows+1; pass=pass+chk(mint(ctx, "operator" as *u8, 8, pw, pwn, tok_op), NX_MAUTH_OK, "login operator -> token" as *u8) 65 let tok_fam: *u8 = sys_mmap(1024); rows=rows+1; pass=pass+chk(mint(ctx, "family" as *u8, 6, pw, pwn, tok_fam), NX_MAUTH_OK, "login family -> token" as *u8) 66 let tok_str: *u8 = sys_mmap(1024); rows=rows+1; pass=pass+chk(mint(ctx, "stranger" as *u8, 8, pw, pwn, tok_str), NX_MAUTH_OK, "login stranger -> token" as *u8) 67 68 let tsb: *i64 = sys_mmap(16) as *i64; tsb[0]=0; sys_clock_gettime_real(tsb); let now: i64 = tsb[0] 69 70 // operator token (header) -> 3 (proves derive-by-handle id == login-token id) 71 let rq: *u8 = sys_mmap(2048); var n: i64 = rput(rq, 0, "GET /torrent/api/add HTTP/1.1\r\nHost: x\r\nX-Nishi-Session: " as *u8); n = rput(rq, n, tok_op); n = rput(rq, n, "\r\n\r\n" as *u8) 72 rows=rows+1; pass=pass+chk(tau_level(rq, n, keys, store, roles, realm, realm_n, now), 3, "operator token (header) -> 3 OWNER" as *u8) 73 74 let rq2: *u8 = sys_mmap(2048); var n2: i64 = rput(rq2, 0, "GET /torrent/api/add HTTP/1.1\r\nX-Nishi-Session: " as *u8); n2 = rput(rq2, n2, tok_fam); n2 = rput(rq2, n2, "\r\n\r\n" as *u8) 75 rows=rows+1; pass=pass+chk(tau_level(rq2, n2, keys, store, roles, realm, realm_n, now), 1, "family token (header) -> 1 FAMILY" as *u8) 76 77 let rq3: *u8 = sys_mmap(512); let n3: i64 = rput(rq3, 0, "GET /torrent/api/add HTTP/1.1\r\nHost: x\r\n\r\n" as *u8) 78 rows=rows+1; pass=pass+chk(tau_level(rq3, n3, keys, store, roles, realm, realm_n, now), 0, "NO token -> 0 ANON (deny)" as *u8) 79 80 let rq4: *u8 = sys_mmap(512); let n4: i64 = rput(rq4, 0, "GET /t HTTP/1.1\r\nX-Nishi-Session: not-a-real-token!!\r\n\r\n" as *u8) 81 rows=rows+1; pass=pass+chk(tau_level(rq4, n4, keys, store, roles, realm, realm_n, now), 0, "garbage token -> 0 (deny)" as *u8) 82 83 let rq5: *u8 = sys_mmap(2048); var n5: i64 = rput(rq5, 0, "GET /t HTTP/1.1\r\nX-Nishi-Session: " as *u8); n5 = rput(rq5, n5, tok_str); n5 = rput(rq5, n5, "\r\n\r\n" as *u8) 84 rows=rows+1; pass=pass+chk(tau_level(rq5, n5, keys, store, roles, realm, realm_n, now), 0, "VALID token, NO provisioned role -> 0 (LEAK-CHECK)" as *u8) 85 86 let rq6: *u8 = sys_mmap(2048); var n6: i64 = rput(rq6, 0, "GET /torrent/stream/x HTTP/1.1\r\nCookie: sid=abc; ngs=" as *u8); n6 = rput(rq6, n6, tok_op); n6 = rput(rq6, n6, "; foo=bar\r\n\r\n" as *u8) 87 rows=rows+1; pass=pass+chk(tau_level(rq6, n6, keys, store, roles, realm, realm_n, now), 3, "operator token via ngs COOKIE -> 3 (media transport)" as *u8) 88 89 g_puts("----\nTORRENT-AUTHN-GATE rows=" as *u8); g_num(rows); g_puts(" pass=" as *u8); g_num(pass) 90 if pass==rows { g_puts(" verdict=GREEN\n" as *u8) } else { g_puts(" verdict=RED\n" as *u8) } 91 let lg: i64=sys_openat_append("knowledge/status/torrent_authn_gate.log" as *u8, 0x1a4) 92 if lg>=0 { 93 g_w(lg, "TORRENT-AUTHN-GATE rows=" as *u8); g_wn(lg, rows); g_w(lg, " pass=" as *u8); g_wn(lg, pass) 94 if pass==rows { g_w(lg, " verdict=GREEN\n" as *u8) } else { g_w(lg, " verdict=RED\n" as *u8) } 95 sys_close(lg) 96 } 97 if pass==rows { sys_exit(0); return 0 } 98 sys_exit(1); return 1 99}