code wiki / (root) / nx_provenance_chain_test.nx

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}