code wiki / _hdl_build / nx_store_ingest_test.nx

nx_store_ingest_test.nx source

↩ module page · 352 lines · 10140 B

1import "nx_gate_base.nx" 2// AUTHORED BY THE NISHI BUILDER (pattern: PNG_INGEST test) -- multi-tEXt PNG + CID/idempotency KATs computed at emit time 3import "nx_store_ingest.nx" 4import "nx_canon_cid.nx" 5import "nx_seg_store.nx" 6import "nx_syscalls.nx" 7func grow(name: *u8, ok: i64) -> i64 { if ok==1 { gw(" PASS " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw(" 8" as *u8); return ok } 9func main() -> i64 { 10 let b: *u8 = sys_mmap(8192) 11 b[0] = 137 as u8 12 b[1] = 80 as u8 13 b[2] = 78 as u8 14 b[3] = 71 as u8 15 b[4] = 13 as u8 16 b[5] = 10 as u8 17 b[6] = 26 as u8 18 b[7] = 10 as u8 19 b[8] = 0 as u8 20 b[9] = 0 as u8 21 b[10] = 0 as u8 22 b[11] = 14 as u8 23 b[12] = 73 as u8 24 b[13] = 72 as u8 25 b[14] = 68 as u8 26 b[15] = 82 as u8 27 b[16] = 0 as u8 28 b[17] = 0 as u8 29 b[18] = 0 as u8 30 b[19] = 0 as u8 31 b[20] = 1 as u8 32 b[21] = 0 as u8 33 b[22] = 0 as u8 34 b[23] = 0 as u8 35 b[24] = 1 as u8 36 b[25] = 8 as u8 37 b[26] = 6 as u8 38 b[27] = 0 as u8 39 b[28] = 0 as u8 40 b[29] = 0 as u8 41 b[30] = 115 as u8 42 b[31] = 22 as u8 43 b[32] = 206 as u8 44 b[33] = 242 as u8 45 b[34] = 0 as u8 46 b[35] = 0 as u8 47 b[36] = 0 as u8 48 b[37] = 7 as u8 49 b[38] = 116 as u8 50 b[39] = 69 as u8 51 b[40] = 88 as u8 52 b[41] = 116 as u8 53 b[42] = 115 as u8 54 b[43] = 101 as u8 55 b[44] = 101 as u8 56 b[45] = 100 as u8 57 b[46] = 0 as u8 58 b[47] = 118 as u8 59 b[48] = 48 as u8 60 b[49] = 131 as u8 61 b[50] = 236 as u8 62 b[51] = 2 as u8 63 b[52] = 151 as u8 64 b[53] = 0 as u8 65 b[54] = 0 as u8 66 b[55] = 0 as u8 67 b[56] = 8 as u8 68 b[57] = 116 as u8 69 b[58] = 69 as u8 70 b[59] = 88 as u8 71 b[60] = 116 as u8 72 b[61] = 109 as u8 73 b[62] = 111 as u8 74 b[63] = 100 as u8 75 b[64] = 101 as u8 76 b[65] = 108 as u8 77 b[66] = 0 as u8 78 b[67] = 118 as u8 79 b[68] = 49 as u8 80 b[69] = 81 as u8 81 b[70] = 230 as u8 82 b[71] = 55 as u8 83 b[72] = 202 as u8 84 b[73] = 0 as u8 85 b[74] = 0 as u8 86 b[75] = 0 as u8 87 b[76] = 10 as u8 88 b[77] = 116 as u8 89 b[78] = 69 as u8 90 b[79] = 88 as u8 91 b[80] = 116 as u8 92 b[81] = 115 as u8 93 b[82] = 97 as u8 94 b[83] = 109 as u8 95 b[84] = 112 as u8 96 b[85] = 108 as u8 97 b[86] = 101 as u8 98 b[87] = 114 as u8 99 b[88] = 0 as u8 100 b[89] = 118 as u8 101 b[90] = 50 as u8 102 b[91] = 89 as u8 103 b[92] = 214 as u8 104 b[93] = 116 as u8 105 b[94] = 100 as u8 106 b[95] = 0 as u8 107 b[96] = 0 as u8 108 b[97] = 0 as u8 109 b[98] = 8 as u8 110 b[99] = 116 as u8 111 b[100] = 69 as u8 112 b[101] = 88 as u8 113 b[102] = 116 as u8 114 b[103] = 115 as u8 115 b[104] = 116 as u8 116 b[105] = 101 as u8 117 b[106] = 112 as u8 118 b[107] = 115 as u8 119 b[108] = 0 as u8 120 b[109] = 118 as u8 121 b[110] = 51 as u8 122 b[111] = 216 as u8 123 b[112] = 38 as u8 124 b[113] = 49 as u8 125 b[114] = 85 as u8 126 b[115] = 0 as u8 127 b[116] = 0 as u8 128 b[117] = 0 as u8 129 b[118] = 17 as u8 130 b[119] = 116 as u8 131 b[120] = 69 as u8 132 b[121] = 88 as u8 133 b[122] = 116 as u8 134 b[123] = 103 as u8 135 b[124] = 101 as u8 136 b[125] = 110 as u8 137 b[126] = 101 as u8 138 b[127] = 114 as u8 139 b[128] = 97 as u8 140 b[129] = 116 as u8 141 b[130] = 111 as u8 142 b[131] = 114 as u8 143 b[132] = 95 as u8 144 b[133] = 104 as u8 145 b[134] = 111 as u8 146 b[135] = 115 as u8 147 b[136] = 116 as u8 148 b[137] = 0 as u8 149 b[138] = 118 as u8 150 b[139] = 52 as u8 151 b[140] = 81 as u8 152 b[141] = 43 as u8 153 b[142] = 32 as u8 154 b[143] = 18 as u8 155 b[144] = 0 as u8 156 b[145] = 0 as u8 157 b[146] = 0 as u8 158 b[147] = 1 as u8 159 b[148] = 73 as u8 160 b[149] = 69 as u8 161 b[150] = 78 as u8 162 b[151] = 68 as u8 163 b[152] = 0 as u8 164 b[153] = 209 as u8 165 b[154] = 26 as u8 166 b[155] = 79 as u8 167 b[156] = 225 as u8 168 let prefix: *u8 = "/tmp/galxkat-" as *u8 169 let mfn: *u8 = sys_mmap(64) 170 var mo: i64 = 0 171 while (prefix[mo] & 0xff) != 0 { mfn[mo] = prefix[mo]; mo = mo + 1 } 172 let suf: *u8 = "manifest.txt" as *u8 173 var so: i64 = 0 174 while (suf[so] & 0xff) != 0 { mfn[mo + so] = suf[so]; so = so + 1 } 175 mfn[mo + so] = 0 as u8 176 let cfd: i64 = sys_openat_wr(mfn, 0x1a4) 177 if cfd >= 0 { sys_close(cfd) } 178 let r1: i64 = nx_store_ingest_ingest(b, 157, prefix) 179 if r1 != 1 { gw("KAT FAIL: first ingest did not store (r1=" as *u8); sys_exit(1); return 1 } 180 let rk: *u8 = sys_mmap(96) 181 rk[0]=105 as u8; rk[1]=109 as u8; rk[2]=103 as u8; rk[3]=58 as u8 182 rk[4] = 110 as u8 183 rk[5] = 120 as u8 184 rk[6] = 99 as u8 185 rk[7] = 49 as u8 186 rk[8] = 45 as u8 187 rk[9] = 57 as u8 188 rk[10] = 55 as u8 189 rk[11] = 99 as u8 190 rk[12] = 53 as u8 191 rk[13] = 55 as u8 192 rk[14] = 54 as u8 193 rk[15] = 49 as u8 194 rk[16] = 53 as u8 195 rk[17] = 102 as u8 196 rk[18] = 54 as u8 197 rk[19] = 48 as u8 198 rk[20] = 100 as u8 199 rk[21] = 50 as u8 200 rk[22] = 97 as u8 201 rk[23] = 48 as u8 202 rk[24] = 54 as u8 203 rk[25] = 50 as u8 204 rk[26] = 53 as u8 205 rk[27] = 48 as u8 206 rk[28] = 50 as u8 207 rk[29] = 54 as u8 208 rk[30] = 101 as u8 209 rk[31] = 48 as u8 210 rk[32] = 57 as u8 211 rk[33] = 54 as u8 212 rk[34] = 101 as u8 213 rk[35] = 50 as u8 214 rk[36] = 51 as u8 215 rk[37] = 102 as u8 216 rk[38] = 56 as u8 217 rk[39] = 50 as u8 218 rk[40] = 98 as u8 219 rk[41] = 51 as u8 220 rk[42] = 57 as u8 221 rk[43] = 48 as u8 222 rk[44] = 98 as u8 223 rk[45] = 52 as u8 224 rk[46] = 102 as u8 225 rk[47] = 48 as u8 226 rk[48] = 52 as u8 227 rk[49] = 52 as u8 228 rk[50] = 48 as u8 229 rk[51] = 56 as u8 230 rk[52] = 100 as u8 231 rk[53] = 100 as u8 232 rk[54] = 52 as u8 233 rk[55] = 101 as u8 234 rk[56] = 54 as u8 235 rk[57] = 49 as u8 236 rk[58] = 97 as u8 237 rk[59] = 102 as u8 238 rk[60] = 54 as u8 239 rk[61] = 102 as u8 240 rk[62] = 50 as u8 241 rk[63] = 55 as u8 242 rk[64] = 48 as u8 243 rk[65] = 57 as u8 244 rk[66] = 52 as u8 245 rk[67] = 99 as u8 246 rk[68] = 48 as u8 247 rk[69] = 52 as u8 248 rk[70] = 50 as u8 249 rk[71] = 54 as u8 250 rk[72] = 97 as u8 251 rk[73] = 0 as u8 252 let pp: *i64 = sys_mmap(16) as *i64 253 let ll: *i64 = sys_mmap(16) as *i64 254 if ss_get(prefix, rk, pp, ll) != 1 { gw("KAT FAIL: stored record not found under expected CID key" as *u8); sys_exit(1); return 1 } 255 let rb: *u8 = pp[0] as *u8 256 let rlen: i64 = ll[0] 257 let cid2: *u8 = sys_mmap(80) 258 cid_of(rb, rlen, cid2) 259 var ci: i64 = 0 260 while ci < 69 { if (cid2[ci] & 0xff) != (rk[4 + ci] & 0xff) { gw("KAT FAIL: CID round-trip mismatch" as *u8); sys_exit(1); return 1 } ci = ci + 1 } 261 let gk0: *u8 = sys_mmap(5) 262 gk0[0] = 115 as u8 263 gk0[1] = 101 as u8 264 gk0[2] = 101 as u8 265 gk0[3] = 100 as u8 266 gk0[4] = 0 as u8 267 if nx_store_ingest_kat_contains(rb, rlen, gk0, 4) != 1 { gw("KAT FAIL: GENREC key missing from canonical record" as *u8); sys_exit(1); return 1 } 268 let gk1: *u8 = sys_mmap(6) 269 gk1[0] = 109 as u8 270 gk1[1] = 111 as u8 271 gk1[2] = 100 as u8 272 gk1[3] = 101 as u8 273 gk1[4] = 108 as u8 274 gk1[5] = 0 as u8 275 if nx_store_ingest_kat_contains(rb, rlen, gk1, 5) != 1 { gw("KAT FAIL: GENREC key missing from canonical record" as *u8); sys_exit(1); return 1 } 276 let gk2: *u8 = sys_mmap(8) 277 gk2[0] = 115 as u8 278 gk2[1] = 97 as u8 279 gk2[2] = 109 as u8 280 gk2[3] = 112 as u8 281 gk2[4] = 108 as u8 282 gk2[5] = 101 as u8 283 gk2[6] = 114 as u8 284 gk2[7] = 0 as u8 285 if nx_store_ingest_kat_contains(rb, rlen, gk2, 7) != 1 { gw("KAT FAIL: GENREC key missing from canonical record" as *u8); sys_exit(1); return 1 } 286 let gk3: *u8 = sys_mmap(6) 287 gk3[0] = 115 as u8 288 gk3[1] = 116 as u8 289 gk3[2] = 101 as u8 290 gk3[3] = 112 as u8 291 gk3[4] = 115 as u8 292 gk3[5] = 0 as u8 293 if nx_store_ingest_kat_contains(rb, rlen, gk3, 5) != 1 { gw("KAT FAIL: GENREC key missing from canonical record" as *u8); sys_exit(1); return 1 } 294 let gk4: *u8 = sys_mmap(15) 295 gk4[0] = 103 as u8 296 gk4[1] = 101 as u8 297 gk4[2] = 110 as u8 298 gk4[3] = 101 as u8 299 gk4[4] = 114 as u8 300 gk4[5] = 97 as u8 301 gk4[6] = 116 as u8 302 gk4[7] = 111 as u8 303 gk4[8] = 114 as u8 304 gk4[9] = 95 as u8 305 gk4[10] = 104 as u8 306 gk4[11] = 111 as u8 307 gk4[12] = 115 as u8 308 gk4[13] = 116 as u8 309 gk4[14] = 0 as u8 310 if nx_store_ingest_kat_contains(rb, rlen, gk4, 14) != 1 { gw("KAT FAIL: GENREC key missing from canonical record" as *u8); sys_exit(1); return 1 } 311 let r2: i64 = nx_store_ingest_ingest(b, 157, prefix) 312 if r2 != 0 { gw("KAT FAIL: re-ingest produced a duplicate (r2 != 0)" as *u8); sys_exit(1); return 1 } 313 let tb: *u8 = sys_mmap(8192) 314 var tci: i64 = 0 315 while tci < 157 { tb[tci] = b[tci]; tci = tci + 1 } 316 tb[42] = (((tb[42] & 0xff) ^ 0x20) & 0xff) as u8 317 nx_store_ingest_kat_fixcrc(tb, 34) 318 let r3: i64 = nx_store_ingest_ingest(tb, 157, prefix) 319 if r3 != 1 { gw("KAT FAIL: tamper arm -- changed-content image did not yield a NEW CID record (r3 != 1)" as *u8); sys_exit(1); return 1 } 320 gw("INGEST-KAT GREEN -- CID round-trip byte-exact + idempotent (0 dup) + GENREC fields + tamper(new-content->new-CID) fired\n" as *u8) 321 sys_exit(0) 322 return 0 323} 324func nx_store_ingest_kat_contains(buf: *u8, n: i64, key: *u8, kl: i64) -> i64 { 325 var i: i64 = 0 326 while i + kl <= n { 327 var j: i64 = 0 328 var ok: i64 = 1 329 while j < kl { if (buf[i + j] & 0xff) != (key[j] & 0xff) { ok = 0; j = kl } else { j = j + 1 } } 330 if ok == 1 { return 1 } 331 i = i + 1 332 } 333 return 0 334} 335func nx_store_ingest_kat_fixcrc(buf: *u8, coff: i64) -> i64 { 336 let blen: i64 = (((buf[coff] & 0xff) << 24) | ((buf[coff+1] & 0xff) << 16)) | (((buf[coff+2] & 0xff) << 8) | (buf[coff+3] & 0xff)) 337 var cc: i64 = 0xffffffff 338 var ci: i64 = coff + 4 339 let ce: i64 = coff + 8 + blen 340 while ci < ce { 341 cc = cc ^ (buf[ci] & 0xff) 342 var cb: i64 = 0 343 while cb < 8 { let cm: i64 = 0 - (cc & 1); cc = (cc >> 1) ^ (0xedb88320 & cm); cb = cb + 1 } 344 ci = ci + 1 345 } 346 let cv: i64 = (cc ^ 0xffffffff) & 0xffffffff 347 buf[ce] = ((cv >> 24) & 0xff) as u8 348 buf[ce + 1] = ((cv >> 16) & 0xff) as u8 349 buf[ce + 2] = ((cv >> 8) & 0xff) as u8 350 buf[ce + 3] = (cv & 0xff) as u8 351 return 0 352}