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}