code wiki / _hdl_build / nx_status_daemon_gate.nx
nx_status_daemon_gate.nx source
↩ module page · 167 lines · 8171 B
1// nx_status_daemon_gate.nx -- SOVEREIGN in-process referee for the modern-auth status daemon. NO socket,
2// NO curl, NO shell -- it arms a realm + registers an admin via the real Modern Auth, then feeds crafted
3// HTTP request BYTES straight into the pure router sd_handle and asserts the response bytes. The whole
4// login -> token -> gated-content -> deny flow, proven inside one Nishi organ.
5// T1 GET /status -> 200 + SPA shell (public)
6// T2 POST /status/login ok -> 200 + {"token":...} (mint a real no-cookie token)
7// T3 GET /content WITH tok -> 200 + the gated body marker
8// T4 GET /content NO tok -> 401 (default-deny)
9// T5 POST /login WRONG pw -> 401 (and same shape as unknown-handle)
10// T6 GET /content BAD tok -> 401 (forged token rejected)
11// GREEN iff T1..T6 hold. Sovereign: nx_status_daemon + nx_modern_auth_flow + nx_syscalls. license_tier: ORIGINAL
12import "nx_status_daemon.nx"
13import "hub/nx_modern_auth_flow.nx"
14import "nx_syscalls.nx"
15import "nx_gate_verdict.nx"
16
17func 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 }
18func g_len(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
19func g_row(name: *u8, ok: i64) -> i64 {
20 if ok == 1 { g_w(" PASS " as *u8) }
21 if ok != 1 { g_w(" FAIL " as *u8) }
22 g_w(name)
23 g_w("\n" as *u8)
24 return ok
25}
26func g_cat(d: *u8, o: i64, s: *u8) -> i64 { var i: i64 = 0; while s[i] != (0 as u8) { d[o + i] = s[i]; i = i + 1 } return o + i }
27func g_cat_n(d: *u8, o: i64, s: *u8, n: i64) -> i64 { var i: i64 = 0; while i < n { d[o + i] = s[i]; i = i + 1 } return o + n }
28func g_trunc(path: *u8) -> i64 { let fd: i64 = sys_openat_wr(path, 0x180); if fd >= 0 { sys_close(fd) } return 0 }
29
30// response starts with status line s?
31func g_starts(buf: *u8, n: i64, s: *u8) -> i64 {
32 let sn: i64 = g_len(s)
33 if n < sn { return 0 }
34 var i: i64 = 0
35 while i < sn { if (buf[i] as i64) != (s[i] as i64) { return 0 } i = i + 1 }
36 return 1
37}
38// substring search
39func g_contains(hay: *u8, n: i64, needle: *u8) -> i64 {
40 let nn: i64 = g_len(needle)
41 var i: i64 = 0
42 while i + nn <= n {
43 var m: i64 = 1
44 var j: i64 = 0
45 while j < nn { if (hay[i + j] as i64) != (needle[j] as i64) { m = 0; j = nn } else { j = j + 1 } }
46 if m == 1 { return 1 }
47 i = i + 1
48 }
49 return 0
50}
51// copy the base64 token out of {"token":"<b64>"} into out; returns length (0 if absent).
52func g_extract_token(resp: *u8, n: i64, out: *u8) -> i64 {
53 let key: *u8 = "{\"token\":\"" as *u8
54 let kn: i64 = 10
55 var start: i64 = 0 - 1
56 var i: i64 = 0
57 while i + kn <= n {
58 var m: i64 = 1
59 var j: i64 = 0
60 while j < kn { if (resp[i + j] as i64) != (key[j] as i64) { m = 0; j = kn } else { j = j + 1 } }
61 if m == 1 { start = i + kn; i = n }
62 i = i + 1
63 }
64 if start < 0 { return 0 }
65 var w: i64 = 0
66 var k: i64 = start
67 var done: i64 = 0
68 while done == 0 {
69 if k >= n { done = 1 }
70 if done == 0 { if (resp[k] as i64) == 34 { done = 1 } }
71 if done == 0 { out[w] = resp[k]; w = w + 1; k = k + 1 }
72 }
73 return w
74}
75
76func main() -> i64 {
77 g_w("status-daemon SOVEREIGN in-process gate (no socket/curl/shell -- sd_handle bytes-in/bytes-out)\n" as *u8)
78 let store_path: *u8 = "/tmp/nx_sd_gate_store.log" as *u8
79 let keys_path: *u8 = "/tmp/nx_sd_gate_keys.log" as *u8
80 let stf: *u8 = "/tmp/nx_sd_gate_status.html" as *u8
81 g_trunc(store_path)
82 g_trunc(keys_path)
83
84 // ---- write the status fixture via syscalls (NOT a shell) ----
85 let sfd: i64 = sys_openat_wr(stf, 0x180)
86 if sfd < 0 { g_w("FIXTURE FAIL\n" as *u8); sys_exit(1) }
87 let fixture: *u8 = "<h3>STATUSMARK all systems nominal</h3>" as *u8
88 sys_write(sfd, fixture, g_len(fixture))
89 sys_close(sfd)
90
91 // ---- arm a realm + register an admin via the real Modern Auth ----
92 let oprf_seed: *u8 = sys_mmap(32)
93 let akp: *u8 = sys_mmap(32)
94 let akb: *u8 = sys_mmap(33)
95 let edp: *u8 = sys_mmap(32)
96 let edb: *u8 = sys_mmap(32)
97 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) }
98 let realm: *u8 = "nishi_status_adm" as *u8
99 let ctx: *NxAuthContext = sys_mmap(256) as *NxAuthContext
100 if nx_auth_context_init(ctx, realm, 16, realm, 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) }
101 let mn: *u8 = sys_mmap(512)
102 let mn_n: *i64 = sys_mmap(16) as *i64
103 if nx_modern_auth_register(ctx, "elder" as *u8, 5, "correct horse battery staple" as *u8, 28, mn, 512, mn_n) != NX_MAUTH_OK { g_w("REGISTER FAIL\n" as *u8); sys_exit(1) }
104
105 let req: *u8 = sys_mmap(8192)
106 let out: *u8 = sys_mmap(SD_OUTCAP)
107 var pass: i64 = 0
108
109 // ---- T1: GET /status -> 200 + shell ----
110 var n1: i64 = g_cat(req, 0, "GET /status HTTP/1.1\r\nHost: x\r\n\r\n" as *u8)
111 let o1: i64 = sd_handle(ctx, req, n1, stf, out)
112 var t1: i64 = 0
113 if g_starts(out, o1, "HTTP/1.1 200" as *u8) == 1 { if g_contains(out, o1, "id=login" as *u8) == 1 { t1 = 1 } }
114 pass = pass + g_row("T1 GET /status -> 200 + SPA shell\x00" as *u8, t1)
115
116 // ---- T2: POST /status/login (correct) -> 200 + token ----
117 var n2: i64 = g_cat(req, 0, "POST /status/login HTTP/1.1\r\nHost: x\r\n\r\nhandle=elder&passphrase=correct+horse+battery+staple" as *u8)
118 let o2: i64 = sd_handle(ctx, req, n2, stf, out)
119 var t2: i64 = 0
120 let tokbuf: *u8 = sys_mmap(256)
121 var tok_n: i64 = 0
122 if g_starts(out, o2, "HTTP/1.1 200" as *u8) == 1 {
123 tok_n = g_extract_token(out, o2, tokbuf)
124 if tok_n > 0 { t2 = 1 }
125 }
126 pass = pass + g_row("T2 POST /login ok -> 200 + token\x00" as *u8, t2)
127
128 // ---- T3: GET /status/content WITH token -> 200 + gated body ----
129 var n3: i64 = g_cat(req, 0, "GET /status/content HTTP/1.1\r\nHost: x\r\nX-Nishi-Session: " as *u8)
130 n3 = g_cat_n(req, n3, tokbuf, tok_n)
131 n3 = g_cat(req, n3, "\r\n\r\n" as *u8)
132 let o3: i64 = sd_handle(ctx, req, n3, stf, out)
133 var t3: i64 = 0
134 if g_starts(out, o3, "HTTP/1.1 200" as *u8) == 1 { if g_contains(out, o3, "STATUSMARK" as *u8) == 1 { t3 = 1 } }
135 pass = pass + g_row("T3 GET /content WITH token -> 200 + gated body\x00" as *u8, t3)
136
137 // ---- T4: GET /status/content WITHOUT token -> 401 ----
138 var n4: i64 = g_cat(req, 0, "GET /status/content HTTP/1.1\r\nHost: x\r\n\r\n" as *u8)
139 let o4: i64 = sd_handle(ctx, req, n4, stf, out)
140 var t4: i64 = 0
141 if g_starts(out, o4, "HTTP/1.1 401" as *u8) == 1 { t4 = 1 }
142 pass = pass + g_row("T4 GET /content NO token -> 401 (default-deny)\x00" as *u8, t4)
143
144 // ---- T5: POST /status/login (wrong pw) -> 401 ----
145 var n5: i64 = g_cat(req, 0, "POST /status/login HTTP/1.1\r\nHost: x\r\n\r\nhandle=elder&passphrase=wrong+passphrase\x00" as *u8)
146 let o5: i64 = sd_handle(ctx, req, n5, stf, out)
147 var t5: i64 = 0
148 if g_starts(out, o5, "HTTP/1.1 401" as *u8) == 1 { t5 = 1 }
149 pass = pass + g_row("T5 POST /login WRONG pw -> 401\x00" as *u8, t5)
150
151 // ---- T6: GET /status/content BAD token -> 401 ----
152 var n6: i64 = g_cat(req, 0, "GET /status/content HTTP/1.1\r\nHost: x\r\nX-Nishi-Session: AAAAAAAA\r\n\r\n" as *u8)
153 let o6: i64 = sd_handle(ctx, req, n6, stf, out)
154 var t6: i64 = 0
155 if g_starts(out, o6, "HTTP/1.1 401" as *u8) == 1 { t6 = 1 }
156 pass = pass + g_row("T6 GET /content BAD token -> 401 (forged rejected)\x00" as *u8, t6)
157
158 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check
159 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled
160 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify.
161 let ctr__dry: *i64 = gv_ctr()
162 ctr__dry[0] = pass
163 ctr__dry[1] = 6
164 let rc__dry: i64 = gv_verdict("STATUS-DAEMON-GATE" as *u8, ctr__dry, "6/6 (full login->token->gated-content->deny, sovereign in-process)" as *u8)
165 sys_exit(rc__dry)
166 return rc__dry
167}