code wiki / _hdl_build / nx_apistack_svctoken_gate.nx
nx_apistack_svctoken_gate.nx source
↩ module page · 42 lines · 3222 B
1import "nx_gate_gn.nx"
2import "nx_gate_base.nx"
3// nx_apistack_svctoken_gate.nx -- hermetic gate for CAP-API-SVCTOKEN. Proves a presented token resolves to its
4// service+level via the HASHED store, unknown tokens are denied, and the store holds only the hash (not the token).
5// expect_exit: 0
6import "nx_syscalls.nx"
7import "nx_apistack_svctoken.nx"
8
9func grow(name: *u8, ok: i64) -> i64 { if ok==1 { gw(" PASS " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw("
10" as *u8); return ok }
11func gp(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
12func g_app(buf: *u8, off: i64, s: *u8) -> i64 { var i: i64=0; while s[i]!=(0 as u8){buf[off+i]=s[i];i=i+1} return off+i }
13func g_eq(a: *u8, b: *u8, n: i64) -> i64 { var i: i64=0; while i<n { if a[i]!=b[i] { return 0 } i=i+1 } return 1 }
14func g_contains(hay: *u8, hlen: i64, needle: *u8) -> i64 { let nl: i64=g_slen(needle); var i: i64=0; while i+nl<=hlen { var j: i64=0; var m: i64=1; while j<nl { if hay[i+j]!=needle[j] { m=0; j=nl } else { j=j+1 } } if m==1 { return 1 } i=i+1 } return 0 }
15
16func main(argc: i64, argv: *i64) -> i64 {
17 gp("=== nx_apistack_svctoken_gate (scoped hashed service tokens) ===\n" as *u8)
18 let C: *u8 = "/tmp/svctokens.conf" as *u8
19 let tok: *u8 = "deploy-bot-secret-abc123" as *u8; let tokn: i64 = g_slen(tok)
20 // build the store row: HASH(token) TAB deploy-bot TAB 3
21 let th: *u8 = sys_mmap(24); st_hex16(st_fnv(tok, tokn), th)
22 let sf: *u8 = sys_mmap(256); var sn: i64 = 0
23 var i: i64 = 0; while i < 16 { sf[sn] = th[i]; sn = sn + 1; i = i + 1 }
24 sf[sn] = 9 as u8; sn = sn + 1; sn = g_app(sf, sn, "deploy-bot" as *u8); sf[sn] = 9 as u8; sn = sn + 1; sf[sn] = 51 as u8; sn = sn + 1; sf[sn] = 10 as u8; sn = sn + 1
25 let fd: i64 = sys_openat_wr(C, 0x1a4); if fd >= 0 { sys_write(fd, sf, sn); sys_close(fd) }
26 var pass: i64 = 0; var fail: i64 = 0
27
28 // T1 valid token -> service + level
29 let svc: *u8 = sys_mmap(64); let lvl: *i64 = sys_mmap(8) as *i64
30 if st_resolve(C, tok, tokn, svc, 64, lvl) == 1 { if g_eq(svc, "deploy-bot" as *u8, 10) == 1 { if lvl[0] == 3 { pass=pass+1; gp(" T1 token -> deploy-bot / level 3 PASS\n" as *u8) } else { fail=fail+1; gp(" T1 FAIL level\n" as *u8) } } else { fail=fail+1; gp(" T1 FAIL service\n" as *u8) } } else { fail=fail+1; gp(" T1 FAIL not resolved\n" as *u8) }
31
32 // T2 unknown token -> denied
33 let svc2: *u8 = sys_mmap(64); let lvl2: *i64 = sys_mmap(8) as *i64
34 if st_resolve(C, "wrong-token" as *u8, 11, svc2, 64, lvl2) == 0 { if lvl2[0] == 0 { pass=pass+1; gp(" T2 unknown token -> denied (level 0) PASS\n" as *u8) } else { fail=fail+1; gp(" T2 FAIL level\n" as *u8) } } else { fail=fail+1; gp(" T2 FAIL resolved\n" as *u8) }
35
36 // T3 store holds only the HASH, not the plaintext token
37 if g_contains(sf, sn, "deploy-bot-secret" as *u8) == 0 { pass=pass+1; gp(" T3 store holds hash NOT the token (leak-safe) PASS\n" as *u8) } else { fail=fail+1; gp(" T3 FAIL plaintext token in store\n" as *u8) }
38
39 gp("RESULT pass=" as *u8); gn(pass); gp(" fail=" as *u8); gn(fail)
40 if fail == 0 { gp(" verdict=GREEN\n" as *u8); sys_exit(0); return 0 }
41 gp(" verdict=RED\n" as *u8); sys_exit(1); return 1
42}