code wiki / _hdl_build / nx_site_auth_gate.nx

nx_site_auth_gate.nx source

↩ module page · 115 lines · 5828 B

1// nx_site_auth_gate.nx -- REFEREE for the ONE shared access gate (nx_sa_validate) against the REAL 2// canonical Modern Auth. Security code MUST prove it rejects: a wall that can't deny is no wall. 3// Arms a realm exactly like production (load-or-init server keys -> nx_auth_context_init), provisions 4// an admin (nx_modern_auth_register), logs in for a genuine 152B no-cookie token, base64-encodes it 5// into an X-Nishi-Session header, then drives nx_sa_validate four ways: 6// T1 valid X-Nishi-Session -> ALLOW (NX_MAUTH_OK) 7// T2 NO session header -> DENY (NO_SESSION) <- default-deny 8// T3 tampered token (1 b64 char flipped) -> DENY (INVALID_SESSION) <- Ed25519 sig catches it 9// T4 valid token, clock past TTL -> DENY (EXPIRED) <- session actually expires 10// GREEN iff T1..T4 hold. Sovereign: nx_site_auth + nx_modern_auth_flow + nx_base64 + nx_syscalls. license_tier: ORIGINAL 11import "nx_site_auth.nx" 12import "hub/nx_modern_auth_flow.nx" 13import "nx_base64.nx" 14import "nx_syscalls.nx" 15 16func g_w(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 17func g_row(name: *u8, ok: i64) -> i64 { 18 if ok == 1 { g_w(" PASS " as *u8) } 19 if ok != 1 { g_w(" FAIL " as *u8) } 20 g_w(name) 21 g_w("\n" as *u8) 22 return ok 23} 24func g_trunc(path: *u8) -> i64 { let fd: i64 = sys_openat_wr(path, 0x180); if fd >= 0 { sys_close(fd) } return 0 } 25 26// build "GET /status HTTP/1.1\r\nHost: ...\r\n[X-Nishi-Session: <b64>\r\n]\r\n" into req; return length. 27func g_build_req(req: *u8, b64: *u8, b64_n: i64, with_session: i64) -> i64 { 28 var o: i64 = 0 29 let pre: *u8 = "GET /status HTTP/1.1\r\nHost: nishifamily.com\r\n" as *u8 30 var i: i64 = 0 31 while pre[i] != (0 as u8) { req[o] = pre[i]; o = o + 1; i = i + 1 } 32 if with_session == 1 { 33 let h: *u8 = "X-Nishi-Session: " as *u8 34 var j: i64 = 0 35 while h[j] != (0 as u8) { req[o] = h[j]; o = o + 1; j = j + 1 } 36 var k: i64 = 0 37 while k < b64_n { req[o] = b64[k]; o = o + 1; k = k + 1 } 38 req[o] = 13 as u8; o = o + 1 39 req[o] = 10 as u8; o = o + 1 40 } 41 req[o] = 13 as u8; o = o + 1 42 req[o] = 10 as u8; o = o + 1 43 return o 44} 45 46func main() -> i64 { 47 g_w("site-auth shared gate -- the ONE access wall every site composes -- vs REAL Modern Auth\n" as *u8) 48 let store_path: *u8 = "/tmp/nishi_siteauth_gate_store.log" as *u8 49 let keys_path: *u8 = "/tmp/nishi_siteauth_gate_keys.log" as *u8 50 g_trunc(store_path) 51 g_trunc(keys_path) 52 53 // ---- arm a realm context exactly like the production access wall will ---- 54 let oprf_seed: *u8 = sys_mmap(32) 55 let akp: *u8 = sys_mmap(32) 56 let akb: *u8 = sys_mmap(33) 57 let edp: *u8 = sys_mmap(32) 58 let edb: *u8 = sys_mmap(32) 59 if nx_uas_server_keys_load_or_init(keys_path, oprf_seed, akp, akb, edp, edb) != NX_UAS_OK { g_w("KEYS FAIL\n" as *u8); sys_exit(1) } 60 let realm: *u8 = "nishi_status_adm" as *u8 61 let disp: *u8 = "Nishi status adm" as *u8 62 let ctx: *NxAuthContext = sys_mmap(256) as *NxAuthContext 63 if nx_auth_context_init(ctx, realm, 16, disp, 16, store_path as i64, oprf_seed, edp, edb, 900, 8192, 1, 1, 5, 1) != NX_MAUTH_OK { g_w("CTX FAIL\n" as *u8); sys_exit(1) } 64 65 // ---- provision an admin + log in for a genuine no-cookie token ---- 66 let handle: *u8 = "elder" as *u8 67 let pw: *u8 = "correct horse battery staple" as *u8 68 let pw_n: i64 = 28 69 let mn: *u8 = sys_mmap(512) 70 let mn_n: *i64 = sys_mmap(16) as *i64 71 if nx_modern_auth_register(ctx, handle, 5, pw, pw_n, mn, 512, mn_n) != NX_MAUTH_OK { g_w("REGISTER FAIL\n" as *u8); sys_exit(1) } 72 let tok: *u8 = sys_mmap(NX_MAUTH_SESSION_TOKEN_BYTES) 73 let tok_n: *i64 = sys_mmap(16) as *i64 74 if nx_modern_auth_login(ctx, handle, 5, pw, pw_n, tok, NX_MAUTH_SESSION_TOKEN_BYTES, tok_n) != NX_MAUTH_OK { g_w("LOGIN FAIL\n" as *u8); sys_exit(1) } 75 76 let b64: *u8 = sys_mmap(256) 77 let b64_n: i64 = b64_encode(tok, NX_MAUTH_SESSION_TOKEN_BYTES, b64) 78 let now_s: i64 = sys_now_realtime_sec() 79 let req: *u8 = sys_mmap(4096) 80 var pass: i64 = 0 81 82 // ---- T1: valid no-cookie token -> ALLOW ---- 83 let n1: i64 = g_build_req(req, b64, b64_n, 1) 84 var t1: i64 = 0 85 if nx_sa_validate(ctx, req, n1, now_s) == NX_MAUTH_OK { t1 = 1 } 86 pass = pass + g_row("T1 valid X-Nishi-Session -> ALLOW\x00" as *u8, t1) 87 88 // ---- T2: no session header -> DENY (NO_SESSION) ---- 89 let n2: i64 = g_build_req(req, b64, b64_n, 0) 90 var t2: i64 = 0 91 if nx_sa_validate(ctx, req, n2, now_s) == (0 - NX_MAUTH_NO_SESSION) { t2 = 1 } 92 pass = pass + g_row("T2 no session header -> DENY (NO_SESSION)\x00" as *u8, t2) 93 94 // ---- T3: tampered token (flip 1 base64 char in the body) -> DENY (INVALID_SESSION) ---- 95 let b64t: *u8 = sys_mmap(256) 96 var ci: i64 = 0 97 while ci < b64_n { b64t[ci] = b64[ci]; ci = ci + 1 } 98 if (b64t[40] as i64) == 65 { b64t[40] = 66 as u8 } 99 if (b64t[40] as i64) != 66 { b64t[40] = 65 as u8 } 100 let n3: i64 = g_build_req(req, b64t, b64_n, 1) 101 var t3: i64 = 0 102 if nx_sa_validate(ctx, req, n3, now_s) == (0 - NX_MAUTH_INVALID_SESSION) { t3 = 1 } 103 pass = pass + g_row("T3 tampered token -> DENY (INVALID_SESSION)\x00" as *u8, t3) 104 105 // ---- T4: valid token but clock past the 900s TTL -> DENY (EXPIRED) ---- 106 let n4: i64 = g_build_req(req, b64, b64_n, 1) 107 var t4: i64 = 0 108 if nx_sa_validate(ctx, req, n4, now_s + 901) == (0 - NX_MAUTH_EXPIRED) { t4 = 1 } 109 pass = pass + g_row("T4 valid token, past TTL -> DENY (EXPIRED)\x00" as *u8, t4) 110 111 if pass == 4 { g_w("SITE-AUTH GATE GREEN 4/4 (one shared gate: allows valid, denies missing/tampered/expired -- canonical Modern Auth)\n" as *u8); sys_exit(0) } 112 g_w("SITE-AUTH GATE RED\n" as *u8) 113 sys_exit(1) 114 return 1 115}