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}