nx_provenance_chain_test.nx source
↩ module page · 82 lines · 3294 B
1// nx_provenance_chain_test.nx -- smoke for nx_provenance_chain.
2
3import "nx_syscalls.nx"
4import "nx_methyl.nx"
5import "nx_provenance_chain.nx"
6
7func main() -> i64 {
8 let sig: *u8 = (sys_mmap(96)) as *u8
9 sig[0] = 1 as u8
10 let mark: *NxMethylMark = nx_methyl_new(7, 0xfeed, 1000, sig, 96)
11
12 // 1: transform enum sealed
13 if NX_TX_N_KINDS != 13 { return 1 }
14 if nx_tx_is_canonical(NX_TX_CAPTURE) != 1 { return 2 }
15 if nx_tx_is_canonical(NX_TX_DAC) != 1 { return 3 }
16 if nx_tx_is_canonical(0) != 0 { return 4 } // NONE not canonical
17 if nx_tx_is_canonical(13) != 0 { return 5 } // out of range
18
19 // 2: construction
20 let c: *NxProvenanceChain = nx_provenance_chain_new(16)
21 if c.capacity != 16 { return 6 }
22 if c.count != 0 { return 7 }
23 if c.last_hash != 0 { return 8 }
24
25 // 3: first append -- prev_hash should be 0
26 nx_provenance_append(c, NX_TX_CAPTURE, 0xaa, 0xbb, 1000, 7, mark)
27 if c.count != 1 { return 9 }
28 if c.last_hash != 0xbb { return 10 }
29 let l0: *NxProvenanceLink = nx_provenance_link_at(c, 0)
30 if l0.prev_hash != 0 { return 11 }
31 if l0.output_hash != 0xbb { return 12 }
32 if l0.transform_id != NX_TX_CAPTURE { return 13 }
33
34 // 4: second append -- prev_hash auto-links
35 nx_provenance_append(c, NX_TX_PREPROCESS, 0xcc, 0xdd, 2000, 7, mark)
36 if c.count != 2 { return 14 }
37 if c.last_hash != 0xdd { return 15 }
38 let l1: *NxProvenanceLink = nx_provenance_link_at(c, 1)
39 if l1.prev_hash != 0xbb { return 16 }
40
41 // 5: NULL mark rejected
42 let null_mark: *NxMethylMark = (0 as i64) as *NxMethylMark
43 if nx_provenance_append(c, NX_TX_ENCODE, 0, 0, 3000, 7, null_mark) != NX_PV_ERR_BAD_LINK { return 17 }
44
45 // 6: continuity verify -- intact chain
46 if nx_provenance_verify_continuity(c) != NX_PV_OK { return 18 }
47
48 // 7: build longer chain
49 nx_provenance_append(c, NX_TX_ENCODE, 0xee, 0xff, 3000, 7, mark)
50 nx_provenance_append(c, NX_TX_ENCRYPT, 0x10, 0x20, 4000, 7, mark)
51 nx_provenance_append(c, NX_TX_NIC_SEND, 0x30, 0x40, 5000, 7, mark)
52 if c.count != 5 { return 19 }
53 if nx_provenance_verify_continuity(c) != NX_PV_OK { return 20 }
54
55 // 8: find by output_hash
56 let found: nx_int = nx_provenance_find_by_output_hash(c, 0x20)
57 if found != 3 { return 21 }
58 let not_found: nx_int = nx_provenance_find_by_output_hash(c, 0x9999)
59 if not_found != -1 { return 22 }
60
61 // 9: count by transform
62 if nx_provenance_count_by_transform(c, NX_TX_CAPTURE) != 1 { return 23 }
63 if nx_provenance_count_by_transform(c, NX_TX_NIC_SEND) != 1 { return 24 }
64 if nx_provenance_count_by_transform(c, NX_TX_DECODE) != 0 { return 25 }
65
66 // 10: last_hash getter
67 if nx_provenance_last_hash(c) != 0x40 { return 26 }
68
69 // 11: empty chain verifies OK
70 let c2: *NxProvenanceChain = nx_provenance_chain_new(8)
71 if nx_provenance_verify_continuity(c2) != NX_PV_OK { return 27 }
72
73 // 12: tampering breaks continuity -- manually corrupt prev_hash
74 let l2: *NxProvenanceLink = nx_provenance_link_at(c, 2)
75 let saved: nx_size = l2.prev_hash
76 l2.prev_hash = 0xCAFEBADBAD
77 if nx_provenance_verify_continuity(c) != NX_PV_ERR_BROKEN { return 28 }
78 l2.prev_hash = saved
79 if nx_provenance_verify_continuity(c) != NX_PV_OK { return 29 }
80
81 return 0
82}