code wiki / _hdl_build / nx_library_gate_test.nx

nx_library_gate_test.nx source

↩ module page · 65 lines · 3583 B

1// nx_library_gate_test.nx -- prove the /library login-gate: a request WITH a valid OPAQUE session 2// header serves the library (200); WITHOUT (or forged) -> 302 /wiki/login. The security property the 3// operator required ("behind a login") proven before any live deploy. license_tier: ORIGINAL 4import "nx_library_gate_handle.nx" 5import "nx_ed25519_signature.nx" 6import "hub/nx_no_cookie_session.nx" 7import "nx_syscalls.nx" 8 9func gt_w(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 10func gt_hex(dst: *u8, off: i64, tok: *u8, n: i64) -> i64 { 11 let hx: *u8 = "0123456789abcdef" as *u8 12 var i: i64=0 13 while i<n { dst[off+i*2]=hx[((tok[i] as i64)>>4)&15]; dst[off+i*2+1]=hx[(tok[i] as i64)&15]; i=i+1 } 14 return off+n*2 15} 16func gt_app(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} var n: i64=0; while s[n]!=(0 as u8){n=n+1} return off+n } 17 18const GT_NOW: i64 = 1000000 19 20func main() -> i64 { 21 let priv: *u8 = sys_mmap(32); var i: i64=0; while i<32 { priv[i]=(i+1) as u8; i=i+1 } 22 let pub: *u8 = sys_mmap(32); ed25519_pub_from_priv(priv, pub) 23 let uid: *u8 = sys_mmap(32); i=0; while i<32 { uid[i]=17 as u8; i=i+1 } 24 let realm: *u8 = sys_mmap(32); i=0; while i<32 { realm[i]=34 as u8; i=i+1 } 25 let tok: *u8 = sys_mmap(152) 26 let mrc: i64 = nx_ncs_mint_token(priv, uid, realm, GT_NOW, 3600, tok) 27 28 // request WITH valid session header 29 let req1: *u8 = sys_mmap(4096) 30 var o: i64 = 0 31 o = gt_app(req1, o, "GET /library HTTP/1.1\r\nHost: nishifamily.com\r\nX-Nishi-Session: " as *u8) 32 o = gt_hex(req1, o, tok, 152) 33 o = gt_app(req1, o, "\r\n\r\n" as *u8) 34 let out1: *u8 = sys_mmap(262144); let n1: *i64 = sys_mmap(8) as *i64 35 let r1: i64 = nx_library_gate_handle(req1, o, pub, GT_NOW, "knowledge/library.html" as *u8, out1, 262144, n1) 36 var served_ok: i64=0 37 if r1==LG_SERVED { if n1[0]>500 { served_ok=1 } } 38 39 // request WITHOUT session -> 302 40 let req2: *u8 = sys_mmap(4096) 41 let o2: i64 = gt_app(req2, 0, "GET /library HTTP/1.1\r\nHost: nishifamily.com\r\n\r\n" as *u8) 42 let out2: *u8 = sys_mmap(8192); let n2: *i64 = sys_mmap(8) as *i64 43 let r2: i64 = nx_library_gate_handle(req2, o2, pub, GT_NOW, "knowledge/library.html" as *u8, out2, 8192, n2) 44 var redir_ok: i64=0 45 if r2==LG_REDIRECT { redir_ok=1 } 46 47 // request with FORGED token -> 302 48 let req3: *u8 = sys_mmap(4096) 49 var o3: i64 = gt_app(req3, 0, "GET /library HTTP/1.1\r\nHost: x\r\nX-Nishi-Session: " as *u8) 50 let bad: *u8 = sys_mmap(152); i=0; while i<152 { bad[i]=tok[i]; i=i+1 } bad[88]=((bad[88] as i64)^1) as u8 51 o3 = gt_hex(req3, o3, bad, 152) 52 o3 = gt_app(req3, o3, "\r\n\r\n" as *u8) 53 let out3: *u8 = sys_mmap(8192); let n3: *i64 = sys_mmap(8) as *i64 54 let r3: i64 = nx_library_gate_handle(req3, o3, pub, GT_NOW, "knowledge/library.html" as *u8, out3, 8192, n3) 55 var forged_ok: i64=0 56 if r3==LG_REDIRECT { forged_ok=1 } 57 58 gt_w("LIBGATE-HANDLE mint_ok=" as *u8); if mrc==0 { gt_w("1" as *u8) } else { gt_w("0" as *u8) } 59 gt_w(" authed_serves_library=" as *u8); if served_ok==1 { gt_w("1" as *u8) } else { gt_w("0" as *u8) } 60 gt_w(" no_session_302=" as *u8); if redir_ok==1 { gt_w("1" as *u8) } else { gt_w("0" as *u8) } 61 gt_w(" forged_302=" as *u8); if forged_ok==1 { gt_w("1" as *u8) } else { gt_w("0" as *u8) } 62 if mrc==0 { if served_ok==1 { if redir_ok==1 { if forged_ok==1 { 63 gt_w(" verdict=GREEN\n" as *u8); sys_exit(0); return 0 } } } } 64 gt_w(" verdict=RED\n" as *u8); sys_exit(1); return 1 65}