code wiki / _hdl_build / nx_adnet_dash_gate.nx
nx_adnet_dash_gate.nx source
↩ module page · 147 lines · 6779 B
1// nx_adnet_dash_gate.nx -- GATE for the adnet advertiser dashboard (nx_adnet_dash). Proves per-ad
2// aggregate rows (served/clicks/CTR-permil) computed EXACTLY from planted counter logs, totals, the
3// zero-division guard, XSS-escape of advertiser text, the dashboard self-optout marker (a dashboard
4// never carries an injected ad), the honest SERVED-not-viewable label, zero visitor identity, and the
5// ads.txt DIRECT emission. Detector anti-false-green: the scanner FIRES on a planted <script.
6// expect_exit: 0 license_tier: ORIGINAL
7import "nx_syscalls.nx"
8import "_hdl_build/nx_adnet_dash.nx"
9import "nx_gate_verdict.nx"
10
11func dg_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
12func dg_putn(v: i64) -> i64 { var m: i64 = v; if m < 0 { dg_puts("-" as *u8); m = 0 - m } let t: *u8 = sys_mmap(24); var k: i64 = 0; if m == 0 { t[0] = 48 as u8; k = 1 } while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } let o: *u8 = sys_mmap(24); var i: i64 = 0; while i < k { o[i] = t[k - 1 - i]; i = i + 1 } sys_write(1, o, k); return 0 }
13func dg_cat(dst: *u8, off: i64, s: *u8) -> i64 { var o: i64 = off; var i: i64 = 0; while s[i] != (0 as u8) { dst[o] = s[i]; o = o + 1; i = i + 1 } return o }
14func dg_tab(dst: *u8, off: i64) -> i64 { dst[off] = 9 as u8; return off + 1 }
15func dg_nl(dst: *u8, off: i64) -> i64 { dst[off] = 10 as u8; return off + 1 }
16
17func dg_has(hay: *u8, n: i64, needle: *u8) -> i64 {
18 var nl: i64 = 0
19 while needle[nl] != (0 as u8) { nl = nl + 1 }
20 if nl == 0 { return 0 }
21 var i: i64 = 0
22 while i + nl <= n {
23 var j: i64 = 0
24 var eq: i64 = 1
25 while j < nl { if hay[i + j] != needle[j] { eq = 0; break } j = j + 1 }
26 if eq == 1 { return 1 }
27 i = i + 1
28 }
29 return 0
30}
31
32func dg_row6(dst: *u8, off: i64, f0: *u8, f1: *u8, f2: *u8, f3: *u8, f4: *u8, f5: *u8) -> i64 {
33 var o: i64 = off
34 o = dg_cat(dst, o, f0)
35 o = dg_tab(dst, o)
36 o = dg_cat(dst, o, f1)
37 o = dg_tab(dst, o)
38 o = dg_cat(dst, o, f2)
39 o = dg_tab(dst, o)
40 o = dg_cat(dst, o, f3)
41 o = dg_tab(dst, o)
42 o = dg_cat(dst, o, f4)
43 o = dg_tab(dst, o)
44 o = dg_cat(dst, o, f5)
45 o = dg_nl(dst, o)
46 return o
47}
48
49func main() -> i64 {
50 dg_puts("=== nx_adnet_dash_gate ===\n" as *u8)
51 var pass: i64 = 0
52 var fail: i64 = 0
53
54 let inv: *u8 = sys_mmap(4096)
55 var n: i64 = 0
56 n = dg_cat(inv, n, "@host" as *u8)
57 n = dg_tab(inv, n)
58 n = dg_cat(inv, n, "nishifamily.com" as *u8)
59 n = dg_nl(inv, n)
60 n = dg_row6(inv, n, "h1" as *u8, "HomeCo" as *u8, "/adnet/h1.png" as *u8, "https://example.com/h1" as *u8, "home" as *u8, "1" as *u8)
61 n = dg_row6(inv, n, "h2" as *u8, "Evil<script>Co" as *u8, "/adnet/h2.png" as *u8, "/torrent" as *u8, "video" as *u8, "1" as *u8)
62
63 let implog: *u8 = sys_mmap(256)
64 var iln: i64 = 0
65 iln = dg_cat(implog, iln, "h1" as *u8)
66 iln = dg_nl(implog, iln)
67 iln = dg_cat(implog, iln, "h1" as *u8)
68 iln = dg_nl(implog, iln)
69 iln = dg_cat(implog, iln, "h1" as *u8)
70 iln = dg_nl(implog, iln)
71 iln = dg_cat(implog, iln, "h2" as *u8)
72 iln = dg_nl(implog, iln)
73 let clklog: *u8 = sys_mmap(256)
74 var cln: i64 = 0
75 cln = dg_cat(clklog, cln, "h1" as *u8)
76 cln = dg_nl(clklog, cln)
77
78 let page: *u8 = sys_mmap(65536)
79 let w: i64 = and_page(inv, n, implog, iln, clklog, cln, page, 65536)
80
81 // T1 page renders
82 if w > 0 { pass = pass + 1 } else { fail = fail + 1; dg_puts("T1 FAIL render\n" as *u8) }
83
84 // T2 exact per-ad aggregate rows (h1: 3 served, 1 click, ctr 333; h2: 1, 0, 0 -- div0 guarded)
85 var t2: i64 = 1
86 if dg_has(page, w, "<td>h1</td><td>HomeCo</td><td>home</td><td>3</td><td>1</td><td>333</td>" as *u8) == 0 { t2 = 0 }
87 if dg_has(page, w, "<td>1</td><td>0</td><td>0</td>" as *u8) == 0 { t2 = 0 }
88 if t2 == 1 { pass = pass + 1 } else { fail = fail + 1; dg_puts("T2 FAIL aggregate rows\n" as *u8) }
89
90 // T3 totals
91 var t3: i64 = 1
92 if dg_has(page, w, "<th>TOTAL</th><th></th><th></th><th>4</th><th>1</th>" as *u8) == 0 { t3 = 0 }
93 if t3 == 1 { pass = pass + 1 } else { fail = fail + 1; dg_puts("T3 FAIL totals\n" as *u8) }
94
95 // T4 XSS-escape: advertiser <script> escaped, raw tag ABSENT
96 var t4: i64 = 1
97 if dg_has(page, w, "Evil<script>Co" as *u8) == 0 { t4 = 0 }
98 if dg_has(page, w, "<script" as *u8) == 1 { t4 = 0 }
99 if t4 == 1 { pass = pass + 1 } else { fail = fail + 1; dg_puts("T4 FAIL escape\n" as *u8) }
100
101 // T5 self-optout + honest labels + zero visitor identity
102 var t5: i64 = 1
103 if dg_has(page, w, "nx-ad-optout" as *u8) == 0 { t5 = 0 }
104 if dg_has(page, w, "SERVED first-party impressions" as *u8) == 0 { t5 = 0 }
105 if dg_has(page, w, "No visitor identity" as *u8) == 0 { t5 = 0 }
106 if dg_has(page, w, "Set-Cookie" as *u8) == 1 { t5 = 0 }
107 if t5 == 1 { pass = pass + 1 } else { fail = fail + 1; dg_puts("T5 FAIL labels/identity\n" as *u8) }
108
109 // T6 ads.txt DIRECT emission
110 let adst: *u8 = sys_mmap(512)
111 let aw: i64 = and_adstxt("nishifamily.com" as *u8, adst, 512)
112 var t6: i64 = 1
113 if aw <= 0 { t6 = 0 }
114 if dg_has(adst, aw, "nishifamily.com, nishi-adnet, DIRECT" as *u8) == 0 { t6 = 0 }
115 if dg_has(adst, aw, "RESELLER" as *u8) == 1 { t6 = 0 }
116 if t6 == 1 { pass = pass + 1 } else { fail = fail + 1; dg_puts("T6 FAIL ads.txt\n" as *u8) }
117
118 // T7 detector anti-false-green: the scanner FIRES on a planted raw <script
119 let planted: *u8 = "xx <script src=evil> yy" as *u8
120 var t7: i64 = 1
121 if dg_has(planted, 23, "<script" as *u8) == 0 { t7 = 0 }
122 if t7 == 1 { pass = pass + 1 } else { fail = fail + 1; dg_puts("T7 FAIL detector\n" as *u8) }
123
124 dg_puts("pass=" as *u8)
125 dg_putn(pass)
126 dg_puts(" fail=" as *u8)
127 dg_putn(fail)
128 dg_puts("\n" as *u8)
129
130 let log2: *u8 = sys_mmap(256)
131 var lo: i64 = 0
132 if fail == 0 { lo = dg_cat(log2, lo, "ADNETDASH authored=organ verdict=GREEN" as *u8) } else { lo = dg_cat(log2, lo, "ADNETDASH authored=organ verdict=RED" as *u8) }
133 log2[lo] = 10 as u8
134 lo = lo + 1
135 let fd: i64 = sys_openat_wr("knowledge/status/adnet_dash.log" as *u8, 0x1A4)
136 if fd >= 0 { sys_write(fd, log2, lo); sys_close(fd) }
137
138 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check
139 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled
140 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify.
141 let ctr__dry: *i64 = gv_ctr()
142 ctr__dry[0] = pass
143 ctr__dry[1] = pass + fail
144 let rc__dry: i64 = gv_verdict("ADNET-DASH-GATE" as *u8, ctr__dry, "teeth unchanged; verdict emission migrated onto the shared base class" as *u8)
145 sys_exit(rc__dry)
146 return rc__dry
147}