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&lt;script&gt;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}