code wiki / _hdl_build / nx_token.nx
nx_token.nx source
↩ module page · 60 lines · 3184 B
1// nx_token.nx -- CMS layered-spec task #3 (L3-crypto, lowest BUILD): a secure random token for session IDs and
2// CSRF tokens. Grounded (deep-research wpq1btr1l, OWASP/NIST primary): session IDs need >=64 bits of CSPRNG
3// entropy, CSRF synchronizer tokens >=128 bits, generated by a CSPRNG. We read the kernel CSPRNG (/dev/urandom)
4// -- NOT a fast PRNG -- and hex-encode. 16 bytes = 128 bits (covers both). Bottom-up: L0 file read -> L3 token.
5// Built by the team; Engineer gate = the property test below (length + uniqueness + non-degenerate). Hands a
6// tested deliverable UP to L7 (cookie/session) and the CSRF binder. license_tier: ORIGINAL
7import "nx_syscalls.nx"
8
9func tk_puts(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
10
11func hexc(v: i64) -> u8 { if v < 10 { return (48 + v) as u8 } return (97 + (v - 10)) as u8 }
12
13// fill `out` with 2*nbytes hex chars from the kernel CSPRNG; NUL-terminate; return char count (0 on failure).
14func sec_token(out: *u8, nbytes: i64) -> i64 {
15 let fd: i64 = sys_openat_rd("/dev/urandom" as *u8, 0)
16 if fd < 0 { return 0 }
17 let raw: *u8 = sys_mmap(nbytes + 8)
18 let got: i64 = sys_read(fd, raw, nbytes)
19 sys_close(fd)
20 if got != nbytes { return 0 }
21 var i: i64 = 0; var o: i64 = 0
22 while i < nbytes {
23 let byte: i64 = raw[i] as i64
24 out[o] = hexc((byte >> 4) & 0xf); out[o + 1] = hexc(byte & 0xf)
25 o = o + 2; i = i + 1
26 }
27 out[o] = 0 as u8
28 return o
29}
30
31func main() -> i64 {
32 let t1: *u8 = sys_mmap(64); let t2: *u8 = sys_mmap(64)
33 let n1: i64 = sec_token(t1, 16) // 128-bit session/CSRF token
34 let n2: i64 = sec_token(t2, 16)
35
36 tk_puts("=== nx_token (L3 secure-token) self-test ===\n" as *u8)
37 tk_puts("token1 = " as *u8); tk_puts(t1); tk_puts("\n" as *u8)
38 tk_puts("token2 = " as *u8); tk_puts(t2); tk_puts("\n" as *u8)
39
40 // property gate: both 32 hex chars (128 bits), differ, and not degenerate (not all-zero / not all-same char).
41 var pass: i64 = 1
42 if n1 != 32 { pass = 0 }
43 if n2 != 32 { pass = 0 }
44 var diffs: i64 = 0; var i: i64 = 0
45 while i < 32 { if t1[i] != t2[i] { diffs = diffs + 1 } i = i + 1 }
46 if diffs == 0 { pass = 0 } // two CSPRNG draws must differ
47 var nonzero: i64 = 0; i = 0
48 while i < 32 { if t1[i] != (48 as u8) { nonzero = 1 } i = i + 1 }
49 if nonzero == 0 { pass = 0 } // not all '0' (degenerate)
50
51 tk_puts("len1=32? " as *u8); if n1==32 { tk_puts("Y " as *u8) } else { tk_puts("N " as *u8) }
52 tk_puts(" len2=32? " as *u8); if n2==32 { tk_puts("Y " as *u8) } else { tk_puts("N " as *u8) }
53 tk_puts(" distinct-chars(t1 vs t2)=" as *u8)
54 let db: *u8 = sys_mmap(8); var m: i64=diffs; var k: i64=0; if m==0{db[0]=48 as u8;k=1}; while m>0{db[k]=(48+(m%10)) as u8;m=m/10;k=k+1}
55 var j: i64=0; let rev: *u8 = sys_mmap(8); while j<k { rev[j]=db[k-1-j]; j=j+1 }
56 sys_write(1, rev, k)
57 tk_puts("\n" as *u8)
58 if pass == 1 { tk_puts(">>> nx_token GATE PASS (128-bit CSPRNG token; ready for L7 session+CSRF)\n" as *u8); sys_exit(0); return 0 }
59 tk_puts(">>> nx_token GATE FAIL\n" as *u8); sys_exit(1); return 1
60}