code wiki / _hdl_build / nx_apistack_oidc_gate.nx
nx_apistack_oidc_gate.nx source
↩ module page · 46 lines · 3200 B
1import "nx_gate_gn.nx"
2import "nx_gate_base.nx"
3// nx_apistack_oidc_gate.nx -- hermetic gate for CAP-API-OIDC. Proves JWT structure validation, a base64url
4// encode/decode round-trip, and claim extraction from a real (self-built) JWT payload. expect_exit: 0
5import "nx_syscalls.nx"
6import "nx_apistack_oidc.nx"
7
8func grow(name: *u8, ok: i64) -> i64 { if ok==1 { gw(" PASS " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw("
9" as *u8); return ok }
10func gp(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
11func 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 }
12func 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 }
13
14func main(argc: i64, argv: *i64) -> i64 {
15 gp("=== nx_apistack_oidc_gate (JWT parse + base64url + claim extract) ===\n" as *u8)
16 var pass: i64 = 0; var fail: i64 = 0
17
18 // T1/T2 structure
19 if oidc_valid_structure("h.p.s" as *u8, 5) == 1 { pass=pass+1; gp(" T1 3-part JWT -> valid structure PASS\n" as *u8) } else { fail=fail+1; gp(" T1 FAIL\n" as *u8) }
20 if oidc_valid_structure("h.p" as *u8, 3) == 0 { pass=pass+1; gp(" T2 2-part -> invalid structure PASS\n" as *u8) } else { fail=fail+1; gp(" T2 FAIL\n" as *u8) }
21
22 // T3 base64url encode/decode round-trip
23 let enc: *u8 = sys_mmap(256); let en: i64 = oidc_b64url_encode("hello" as *u8, 5, enc)
24 let dec: *u8 = sys_mmap(256); let dn: i64 = oidc_b64url_decode(enc, en, dec)
25 if dn == 5 { if g_eq(dec, "hello" as *u8, 5) == 1 { pass=pass+1; gp(" T3 b64url encode->decode round-trip PASS\n" as *u8) } else { fail=fail+1; gp(" T3 FAIL content\n" as *u8) } } else { fail=fail+1; gp(" T3 FAIL len=" as *u8); gn(dn); gp("\n" as *u8) }
26
27 // build a JWT with payload {"sub":"ops","level":"3"}
28 let pl: *u8 = "{\"sub\":\"ops\",\"level\":\"3\"}" as *u8; let pln: i64 = g_slen(pl)
29 let penc: *u8 = sys_mmap(512); let pen: i64 = oidc_b64url_encode(pl, pln, penc)
30 let jwt: *u8 = sys_mmap(1024); var jn: i64 = g_app(jwt, 0, "aGVhZGVy." as *u8)
31 var i: i64 = 0; while i < pen { jwt[jn] = penc[i]; jn = jn + 1; i = i + 1 }
32 jn = g_app(jwt, jn, ".c2ln" as *u8)
33
34 // T4 extract sub
35 let o1: *u8 = sys_mmap(128); let n1: i64 = oidc_extract_claim(jwt, jn, "sub" as *u8, 3, o1, 128)
36 gp(" claim sub='" as *u8); sys_write(1, o1, n1); gp("'\n" as *u8)
37 if g_eq(o1, "ops" as *u8, 3) == 1 { if n1 == 3 { pass=pass+1; gp(" T4 extract claim sub -> 'ops' PASS\n" as *u8) } else { fail=fail+1; gp(" T4 FAIL len\n" as *u8) } } else { fail=fail+1; gp(" T4 FAIL\n" as *u8) }
38
39 // T5 extract level
40 let o2: *u8 = sys_mmap(128); let n2: i64 = oidc_extract_claim(jwt, jn, "level" as *u8, 5, o2, 128)
41 if g_eq(o2, "3" as *u8, 1) == 1 { if n2 == 1 { pass=pass+1; gp(" T5 extract claim level -> '3' PASS\n" as *u8) } else { fail=fail+1; gp(" T5 FAIL len\n" as *u8) } } else { fail=fail+1; gp(" T5 FAIL\n" as *u8) }
42
43 gp("RESULT pass=" as *u8); gn(pass); gp(" fail=" as *u8); gn(fail)
44 if fail == 0 { gp(" verdict=GREEN\n" as *u8); sys_exit(0); return 0 }
45 gp(" verdict=RED\n" as *u8); sys_exit(1); return 1
46}