code wiki / (root) / nx_uxf_cid_test.nx

nx_uxf_cid_test.nx source

↩ module page · 94 lines · 4553 B

1// nx_uxf_cid_test.nx -- KAT + negative controls for the self-describing multicodec CID. 2// Proves: (T1) determinism, (T2) multicodec DISTINGUISHES profiles, (T3) profile is READABLE 3// from the CID (self-describing), (T4) still content-addressed (neg-control), (T5) the codec 4// is genuinely FOLDED INTO the hash (profiled hash-part != plain cid_of hash-part). 5// expect_exit: 0 license_tier: ORIGINAL 6import "nx_syscalls.nx" 7import "nx_canon_cid.nx" 8import "nx_uxf_cid.nx" 9 10func t_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 11func t_putn(v: i64) -> i64 { let bb: *u8 = sys_mmap(28); var m: i64 = v; if m < 0 { m = 0 - m; sys_write(1, "-" as *u8, 1) } let t: *u8 = sys_mmap(28); 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 } var i: i64 = 0; while i < k { bb[i] = t[k - 1 - i]; i = i + 1 } sys_write(1, bb, k); return 0 } 12 13func t_streq(a: *u8, b: *u8) -> i64 { 14 var i: i64 = 0 15 while 1 == 1 { 16 if a[i] != b[i] { return 0 } 17 if a[i] == (0 as u8) { return 1 } 18 i = i + 1 19 } 20 return 1 21} 22 23// do the 64-hex hash parts differ? cidprof hash at [8..72), plain cid_of hash at [5..69). 24func t_hash_differs(cidprof: *u8, plain: *u8) -> i64 { 25 var i: i64 = 0 26 while i < 64 { if cidprof[8 + i] != plain[5 + i] { return 1 } i = i + 1 } 27 return 0 28} 29 30func main() -> i64 { 31 // record 1: {name:User, type:record} 32 let keys: *i64 = sys_mmap(64) as *i64 33 let vals: *i64 = sys_mmap(64) as *i64 34 keys[0] = ("name\x00") as i64; vals[0] = ("User\x00") as i64 35 keys[1] = ("type\x00") as i64; vals[1] = ("record\x00") as i64 36 let canon: *u8 = sys_mmap(4096) 37 let clen: i64 = canon_encode(keys, vals, 2, canon) 38 39 // record 2: {name:Ben, type:record} (different content) 40 let keys2: *i64 = sys_mmap(64) as *i64 41 let vals2: *i64 = sys_mmap(64) as *i64 42 keys2[0] = ("name\x00") as i64; vals2[0] = ("Ben\x00") as i64 43 keys2[1] = ("type\x00") as i64; vals2[1] = ("record\x00") as i64 44 let canon2: *u8 = sys_mmap(4096) 45 let clen2: i64 = canon_encode(keys2, vals2, 2, canon2) 46 47 let cidA: *u8 = sys_mmap(128) 48 let cidB: *u8 = sys_mmap(128) 49 let cidC: *u8 = sys_mmap(128) 50 let cidD: *u8 = sys_mmap(128) 51 let plain: *u8 = sys_mmap(128) 52 uxf_cid_profiled(UXF_DATA, canon, clen, cidA) 53 uxf_cid_profiled(UXF_DATA, canon, clen, cidB) 54 uxf_cid_profiled(UXF_DOC, canon, clen, cidC) 55 uxf_cid_profiled(UXF_DATA, canon2, clen2, cidD) 56 cid_of(canon, clen, plain) 57 58 var pass: i64 = 0 59 var total: i64 = 0 60 61 t_puts("cidA(DATA) = " as *u8); t_puts(cidA); t_puts("\n" as *u8) 62 t_puts("cidC(DOC) = " as *u8); t_puts(cidC); t_puts("\n" as *u8) 63 64 // T1 determinism: same content + same profile -> same CID 65 total = total + 1 66 t_puts("T1 determinism (cidA==cidB): " as *u8) 67 if t_streq(cidA, cidB) == 1 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) } 68 69 // T2 multicodec distinguishes: same content + DIFFERENT profile -> DIFFERENT CID 70 total = total + 1 71 t_puts("T2 profile distinguishes (cidA!=cidC): " as *u8) 72 if t_streq(cidA, cidC) == 0 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) } 73 74 // T3 self-describing: read the profile back out of each CID 75 total = total + 1 76 let ra: i64 = uxf_codec_of_cid(cidA) 77 let rc: i64 = uxf_codec_of_cid(cidC) 78 t_puts("T3 self-describing (read DATA=" as *u8); t_putn(ra); t_puts(" DOC=" as *u8); t_putn(rc); t_puts("): " as *u8) 79 if ra == UXF_DATA { if rc == UXF_DOC { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) } } else { t_puts("FAIL\n" as *u8) } 80 81 // T4 still content-addressed (neg-control): different content + same profile -> different CID 82 total = total + 1 83 t_puts("T4 content-addressed (cidA!=cidD): " as *u8) 84 if t_streq(cidA, cidD) == 0 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) } 85 86 // T5 codec folded into hash: profiled hash-part != plain cid_of hash-part 87 total = total + 1 88 t_puts("T5 multicodec folded into hash (cidA-hash != plain-hash): " as *u8) 89 if t_hash_differs(cidA, plain) == 1 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) } 90 91 t_puts("UXF-CID-GATE passed " as *u8); t_putn(pass); t_puts("/" as *u8); t_putn(total) 92 if pass == total { t_puts(" verdict=GREEN\n" as *u8); sys_exit(0); return 0 } 93 t_puts(" verdict=RED\n" as *u8); sys_exit(1); return 1 94}