From b9643bf3e9b21e4e2207ea210d1d57ffa014d271 Mon Sep 17 00:00:00 2001 From: "Tobin C. Harding" Date: Fri, 16 Sep 2022 11:52:57 +1000 Subject: [PATCH] Import bitcoin_hashes crate into hashes We would like to bring the `bitcoin_hashes` crate into the `rust-bitcoin` repository. Import `bitcoin_hashes` into `rust-bitocin/hashes`, doing so looses all the commit history from the original crate but if we archive the original repository then the history will be preserved. We maintain the same version number obviously and in the changelog we note the change of repository. Commit hash that was tip of `bitcoin_hashes` at time of import: commit 54c16249e06cc6b7870c7fc07d90f489d82647c7 Includes making `embedded` and `fuzzing` per-crate i.e., move them into `bitcoin` as hashes includes these also. NOTE: Does _not_ enable fuzzing for `hashes` in CI. Notes on CI: Attempts to merge in the github actions from the hashes crate however reduces coverage by not running hashes tests for beta toolchain. Some additional work could be done to improve the CI to increase efficiency without reducing coverage. Leaving for another day. --- .github/workflows/fuzz.yml | 4 +- .github/workflows/rust.yml | 49 +- .gitignore | 8 +- Cargo.toml | 3 +- {embedded => bitcoin/embedded}/Cargo.toml | 6 +- {embedded => bitcoin/embedded}/README.md | 0 {embedded => bitcoin/embedded}/memory.x | 0 {embedded => bitcoin/embedded}/scripts/env.sh | 0 .../embedded}/scripts/install-deps | 0 {embedded => bitcoin/embedded}/src/main.rs | 0 {fuzz => bitcoin/fuzz}/.gitignore | 0 {fuzz => bitcoin/fuzz}/Cargo.toml | 2 +- {fuzz => bitcoin/fuzz}/cycle.sh | 0 .../fuzz}/fuzz_targets/deser_net_msg.rs | 0 .../fuzz}/fuzz_targets/deserialize_address.rs | 0 .../fuzz}/fuzz_targets/deserialize_amount.rs | 0 .../fuzz}/fuzz_targets/deserialize_block.rs | 0 .../deserialize_prefilled_transaction.rs | 0 .../fuzz}/fuzz_targets/deserialize_psbt.rs | 0 .../fuzz}/fuzz_targets/deserialize_script.rs | 0 .../fuzz_targets/deserialize_transaction.rs | 0 .../fuzz}/fuzz_targets/deserialize_witness.rs | 0 .../fuzz}/fuzz_targets/outpoint_string.rs | 0 .../fuzz_targets/script_bytes_to_asm_fmt.rs | 0 ...d45df9508b64b8e47d5.00000014.honggfuzz.cov | 0 ...37088ce87020b701357.0000000e.honggfuzz.cov | 0 ...93ecb031b7a493d5517.0000000b.honggfuzz.cov | 0 ...c9dcbf11d4517132cff.0000000d.honggfuzz.cov | 0 ...0002c9c9c9cc3100000.00000005.honggfuzz.cov | 0 ...27d3fa9842a5fbf0acb.00000012.honggfuzz.cov | 0 ...000211c9c9194400000.00000005.honggfuzz.cov | 0 ...2b7663a33abe7722ab8.0000000e.honggfuzz.cov | 0 ...fd614aa48444fdc440d.0000000b.honggfuzz.cov | 0 ...e0dd97c488f9e1629c3.0000000b.honggfuzz.cov | 0 ...ebf030efcdefcc12454.00000008.honggfuzz.cov | 0 ...96348bc3115fa7ebe63.0000000e.honggfuzz.cov | 0 ...d0f6697654f73f1590f.0000001d.honggfuzz.cov | 0 ...ecc4678fc57c3fec235.00000025.honggfuzz.cov | Bin ...0005938fcb000000000.00000003.honggfuzz.cov | 0 ...7b354b7c3b6c80a2bb9.0000002b.honggfuzz.cov | 0 ...0002957ebebb2a00000.00000005.honggfuzz.cov | 0 ...0002c9c9c9cb0000000.00000004.honggfuzz.cov | 0 ...5a5a60c3c7aa5a5a5a5.0000000b.honggfuzz.cov | 0 ...cded749fcdd9d288fec.00000009.honggfuzz.cov | 0 ...d6ad2d9fe413e542b60.000018a8.honggfuzz.cov | Bin ...0005f6e800000000000.00000002.honggfuzz.cov | 0 ...000d79f300000000000.00000002.honggfuzz.cov | 0 ...e0d748f29409e19cbbb.0000000b.honggfuzz.cov | 0 ...0007b30000000000000.00000001.honggfuzz.cov | 0 ...a2889ce9e10f05d9924.0000000f.honggfuzz.cov | 0 ...1b41f947711ecde356c.0000000a.honggfuzz.cov | 0 ...cde31ebfc9d50d957a3.00000009.honggfuzz.cov | 0 ...0004636700000000000.00000002.honggfuzz.cov | 0 ...f606f0efc9d201a4bc0.00000007.honggfuzz.cov | 0 ...00071af4cb000000000.00000003.honggfuzz.cov | 0 ...0006f0efc90a0638000.00000006.honggfuzz.cov | 0 ...00047994cb000000000.00000003.honggfuzz.cov | 0 ...c9ce4299c9c9c9c9c9c.00000009.honggfuzz.cov | 0 ...0004d5f57b000000000.00000003.honggfuzz.cov | 0 ...1414173604141414141.00000019.honggfuzz.cov | 0 ...f0cf61b913df4fa7b99.00000011.honggfuzz.cov | 0 ...cde4deafc9d73636363.00000009.honggfuzz.cov | 0 ...9_orig-id-000033_src-000004_op-havoc_rep-2 | 0 ...0_orig-id-000034_src-000004_op-havoc_rep-2 | 0 ..._orig-id-000034_src-000004_op-havoc_rep-64 | Bin ...3_orig-id-000042_src-000004_op-havoc_rep-2 | 0 ..._orig-id-000042_src-000004_op-havoc_rep-64 | 0 ...5_orig-id-000044_src-000004_op-havoc_rep-4 | 0 ...6_orig-id-000045_src-000004_op-havoc_rep-2 | 0 .../input/id-000046_src-000004_op-havoc_rep-2 | 0 ...d-000047_src-000004+000012_op-splice_rep-2 | 0 ...0058_sync-deserialize_address_0_src-000050 | 0 ...0059_sync-deserialize_address_0_src-000057 | 0 ...0062_sync-deserialize_address_0_src-000059 | 0 ...sync-deserialize_address_master_src-000062 | 0 ...sync-deserialize_address_master_src-000044 | 0 ...0064_sync-deserialize_address_0_src-000044 | 0 ...0064_sync-deserialize_address_0_src-000060 | 0 ...sync-deserialize_address_master_src-000067 | 0 .../input/id-000068_src-000004_op-flip1_pos-3 | 0 .../input/id-000069_src-000004_op-flip2_pos-3 | 0 .../input/id-000069_src-000050_op-havoc_rep-8 | 0 .../input/id-000070_src-000050_op-havoc_rep-4 | 0 ...0070_sync-deserialize_address_0_src-000062 | 0 .../input/id-000071_src-000050_op-havoc_rep-2 | 0 .../id-000072_src-000004_op-havoc_rep-64 | 0 .../id-000072_src-000051_op-flip2_pos-22 | 0 .../input/id-000074_src-000004_op-havoc_rep-2 | 0 ...0074_sync-deserialize_address_0_src-000064 | 0 .../id-000075_src-000004_op-havoc_rep-64 | 0 ...0075_sync-deserialize_address_0_src-000049 | 0 .../input/id-000076_src-000061_op-havoc_rep-8 | 0 .../id-000077_src-000006_op-flip1_pos-30 | 0 ...0077_sync-deserialize_address_0_src-000043 | 0 .../input/id-000080_src-000006_op-havoc_rep-2 | 0 .../input/id-000082_src-000010_op-havoc_rep-4 | Bin .../input/id-000090_src-000081_op-havoc_rep-2 | 0 ...108489c94e7f7d9ec83.0000187a.honggfuzz.cov | Bin ...ae9f860fb7f02607f0f.0000005e.honggfuzz.cov | Bin ...664845b7c29b1a259ce.00001e39.honggfuzz.cov | Bin ...4453ccdb7b706da2fcd.0000012c.honggfuzz.cov | Bin ...89940ee87aef0bf42c8.0000005e.honggfuzz.cov | Bin ...0000000000000000000.00000014.honggfuzz.cov | Bin ...000e395529a00000000.0000000d.honggfuzz.cov | Bin ...3eae7a8524998830ae5.0000104e.honggfuzz.cov | Bin ...688176bafdc1cdef3ac.00000068.honggfuzz.cov | Bin ...206e3f01d38fab33e5d.0000049a.honggfuzz.cov | Bin ...27b9016b8cf573000d5.00000050.honggfuzz.cov | Bin ...6233d1bdf0cedad7f63.00001175.honggfuzz.cov | Bin ...a545d8693c4b4ca38ee.00000347.honggfuzz.cov | Bin ...cb6d1a8c01a2a733c0f.000009c1.honggfuzz.cov | Bin ...22cd02347f6759f8d49.00000171.honggfuzz.cov | Bin ...36e43f6a2ce9dd5d500.00000280.honggfuzz.cov | Bin ...211b85e51eb858552d0.00000052.honggfuzz.cov | Bin ...c35458b98ab40242765.00000090.honggfuzz.cov | Bin ...2580273b028376c833f.00001118.honggfuzz.cov | Bin ...b62f1155509f47c1925.000001c9.honggfuzz.cov | Bin ...70b8dd960d5e2497074.00000051.honggfuzz.cov | Bin ...e94f08803b89546af85.000003d5.honggfuzz.cov | Bin ...a1cbc932c4b11ebe638.00000cb1.honggfuzz.cov | Bin ...9e138d25cf41c61568e.0000007c.honggfuzz.cov | Bin ...3100c9651148b73a82d.00000483.honggfuzz.cov | Bin ...134239874b31cc9164c.00003ffa.honggfuzz.cov | Bin ...1a93b8b39474c2da11b.0000005e.honggfuzz.cov | Bin ...b92ecccd35ed7653e78.000001c9.honggfuzz.cov | Bin ...24953bcb2e8bc3c634e.0000191b.honggfuzz.cov | Bin ...dd6d2ffcc74e82004b9.00001cea.honggfuzz.cov | Bin ...d1b20e16d8b69a0bd06.00000051.honggfuzz.cov | Bin ...88cd46df1ba44f91982.0000008e.honggfuzz.cov | Bin ...3adef93f9d0d26be075.000001bc.honggfuzz.cov | Bin ...6e68c4c802bc457e84b.00000051.honggfuzz.cov | Bin ...3a0d9aae05f1e9a69ea.0000005b.honggfuzz.cov | Bin ...9a5671ba4a0e75e9fd2.000010b0.honggfuzz.cov | Bin ...cdb4b52e2703192aa1c.00000936.honggfuzz.cov | Bin ...1032e788e06f6b9ccc6.0000049e.honggfuzz.cov | Bin ...e8f482d6b2ca2c638ab.00000146.honggfuzz.cov | Bin ...7fcc08f5f4eca611c52.00004f36.honggfuzz.cov | Bin ...d2b490ad59971eba5cb.00000089.honggfuzz.cov | Bin ...aac2055199abf343c9a.0000006d.honggfuzz.cov | Bin ...b920aa463251cc10b72.00000071.honggfuzz.cov | Bin ...8dd2b74ee38afc9b112.00000080.honggfuzz.cov | Bin ...f3827c6e58a4798aef1.0000132e.honggfuzz.cov | Bin ...8d6fc2cae5619513e47.00000024.honggfuzz.cov | Bin ...9e467497ea8f3ace4fc.0000020a.honggfuzz.cov | Bin ...d3eaf012548db3e06f1.0000005a.honggfuzz.cov | Bin ...10bd9a07dbdfc6860a8.0000005e.honggfuzz.cov | Bin ...7061b581cf656ccdcb5.0000005b.honggfuzz.cov | Bin ...bdbf8ea9eaa0ad83f5e.00000045.honggfuzz.cov | Bin ...000f33500515ca91269.00000009.honggfuzz.cov | Bin ...1a71c589706915e229f.0000004c.honggfuzz.cov | Bin ...e308e3001d40c988e60.00000007.honggfuzz.cov | Bin ...c1179d61d182d7ee35f.0000132e.honggfuzz.cov | Bin ...0006fdc801fe0000000.00000004.honggfuzz.cov | 0 ...orig-id-000107_src-000105_op-flip1_pos-435 | Bin ...rig-id-000112_src-000012_op-flip1_pos-1599 | Bin ...54c3ea9ef2a9d29a71e.00000048.honggfuzz.cov | Bin ...0115_src-000101_op-arith8_pos-1139_val--19 | Bin .../id-000081_src-000003_op-havoc_rep-64 | Bin .../input/id-000082_src-000003_op-havoc_rep-8 | Bin .../id-000083_src-000003_op-havoc_rep-32 | Bin ...00101_src-000005_op-int16_pos-97_val-+1024 | Bin ...000095_src-000000+000033_op-splice_rep-128 | Bin ..._orig-id-000157_src-000113_op-havoc_rep-32 | Bin ...-000097_src-000000+000010_op-splice_rep-64 | Bin ...0097_src-000005_op-arith8_pos-3343_val--22 | Bin ...-deserialize_transaction_master_src-000136 | Bin .../id-000098_src-000021_op-flip1_pos-3143 | Bin ...-deserialize_transaction_master_src-000172 | Bin ...-deserialize_transaction_master_src-000171 | Bin ...00104_src-000005_op-int32_pos-3524_val-+16 | Bin .../id-000105_src-000008_op-flip1_pos-1160 | Bin ...000202_src-000173_op-arith8_pos-178_val--2 | Bin ..._sync-deserialize_transaction_2_src-000214 | Bin .../input/id-000110_src-000002_op-havoc_rep-4 | Bin .../id-000111_src-000002_op-havoc_rep-32 | Bin .../id-000113_src-000002_op-havoc_rep-16 | Bin ...000113_sync-deserialize_block_2_src-000112 | Bin .../id-000114_src-000005_op-flip4_pos-263 | Bin ...-000116_src-000031+000101_op-splice_rep-16 | Bin .../id-000116_src-000059_op-flip1_pos-157 | Bin .../id-000117_src-000059_op-flip4_pos-157 | Bin .../id-000118_src-000018_op-flip1_pos-134 | Bin .../id-000119_src-000082_op-flip1_pos-443 | Bin .../id-000120_src-000029_op-havoc_rep-64 | Bin ...0121_src-000077_op-arith8_pos-7636_val--18 | Bin ...121_src-000115_op-int16_pos-24501_val-+256 | Bin ...-000122_src-000064_op-arith8_pos-95_val--2 | Bin ...0124_src-000118_op-int16_pos-2599_val-+256 | Bin .../id-000125_src-000080_op-flip2_pos-411 | Bin ...d-000126_src-000018+000077_op-splice_rep-8 | Bin .../input/id-000126_src-000085_op-havoc_rep-8 | Bin .../id-000128_src-000108_op-havoc_rep-32 | Bin .../id-000129_src-000128_op-flip1_pos-1977 | Bin .../id-000132_src-000131_op-flip1_pos-7872 | Bin ...d-000134_src-000005+000128_op-splice_rep-4 | Bin .../id-000135_src-000134_op-flip8_pos-972 | Bin ...000136_src-000134_op-arith8_pos-972_val--2 | Bin ...d-000137_src-000035+000128_op-splice_rep-4 | Bin .../id-000155_src-000087_op-flip2_pos-126 | 0 .../id-000159_src-000113_op-havoc_rep-128 | Bin ...6444cc2a3b45a01b0c1.000000aa.honggfuzz.cov | Bin ...01782b6e9d970a22f7f.000013b1.honggfuzz.cov | Bin ...9cbbed5448562b7a513.000000aa.honggfuzz.cov | Bin ...000999bfe5b80000000.00000005.honggfuzz.cov | Bin .../tx_id-000076_src-000000_op-havoc_rep-128 | Bin .../tx_id-000077_src-000000_op-havoc_rep-64 | Bin .../tx_id-000080_src-000000_op-havoc_rep-32 | Bin ...d-000084_src-000000+000044_op-splice_rep-8 | Bin ...d-000121_src-000000+000033_op-splice_rep-8 | Bin ..._sync-deserialize_transaction_2_src-000163 | Bin ...-deserialize_transaction_master_src-000128 | Bin ...-deserialize_transaction_master_src-000162 | Bin ...8b44ba177926907375c.00001102.honggfuzz.cov | Bin ...e7c4c6a3c36c0233963.00000096.honggfuzz.cov | Bin ...ed06ceb68cac5f8cf8f.00000067.honggfuzz.cov | Bin ...8e2e5809bbfae424566.00000a1f.honggfuzz.cov | Bin ...503665a2b0af684b9d0.00001102.honggfuzz.cov | Bin ...0b695d0087a84fb020c.000010c3.honggfuzz.cov | Bin ...00007a3416803854000.00000006.honggfuzz.cov | 0 ...98fdf1e3fd228c1f412.00000096.honggfuzz.cov | Bin ...00001d4200000000000.00000002.honggfuzz.cov | 0 ...00001d5900000000000.00000002.honggfuzz.cov | 0 ...00001d6f00000000000.00000002.honggfuzz.cov | 0 ...00001d7400000000000.00000002.honggfuzz.cov | 0 ...0000771b1a11529a000.00000006.honggfuzz.cov | 0 ...a7231ceeda52eee8351.00002000.honggfuzz.cov | Bin ...9a788ad4e0c6739dcf3.000003d0.honggfuzz.cov | Bin ...808403307a6e07bf584.0000084d.honggfuzz.cov | Bin ...000910e61f021200000.00000005.honggfuzz.cov | 0 ...0000000000000000000.00000001.honggfuzz.cov | Bin ...00085c1a00000000000.00000003.honggfuzz.cov | Bin ...0009090000000000000.00000001.honggfuzz.cov | 0 ...0009120000000000000.00000001.honggfuzz.cov | 0 ...00093f0000000000000.00000001.honggfuzz.cov | 0 ...000e05c88c5b0000000.00000004.honggfuzz.cov | 0 ..._orig-id-000016_src-000000_op-havoc_rep-32 | 0 ...id-000026_src-000011_op-int16_pos-2_val-+0 | Bin .../input/id-000065_src-000000_op-havoc_rep-2 | Bin .../input/id-000066_src-000000_op-havoc_rep-4 | Bin .../id-000067_src-000000_op-havoc_rep-64 | 0 .../input/id-000068_src-000000_op-havoc_rep-4 | Bin .../input/id-000072_src-000001_op-havoc_rep-2 | Bin .../input/id-000073_src-000002_op-havoc_rep-8 | Bin .../input/id-000075_src-000004_op-flip4_pos-4 | Bin .../input/id-000076_src-000007_op-havoc_rep-4 | 0 ...000079_src-000009_op-arith8_pos-65_val--34 | Bin ...081_src-000009_op-int16_pos-65_val-be-+100 | Bin ...000084_src-000009_op-int32_pos-1_val-be-+1 | Bin .../input/id-000085_src-000009_op-havoc_rep-8 | Bin .../input/id-000087_src-000011_op-flip2_pos-5 | Bin .../input/id-000088_src-000011_op-flip2_pos-6 | Bin .../input/id-000094_src-000011_op-havoc_rep-2 | Bin .../input/id-000095_src-000011_op-havoc_rep-2 | Bin .../input/id-000097_src-000013_op-flip1_pos-1 | Bin .../id-000102_src-000013_op-flip1_pos-1791 | Bin .../id-000103_src-000013_op-flip1_pos-2155 | Bin .../id-000111_src-000013_op-flip32_pos-2400 | Bin ...00118_src-000013_op-arith8_pos-974_val-+18 | Bin ...0120_src-000013_op-arith8_pos-3822_val-+28 | Bin ...0121_src-000013_op-arith8_pos-3837_val-+20 | Bin ...000125_src-000013_op-int16_pos-3820_val-+1 | Bin .../input/id-000129_src-000019_op-havoc_rep-2 | Bin .../input/id-000131_src-000019_op-havoc_rep-4 | Bin .../id-000133_src-000019_op-havoc_rep-32 | Bin .../input/id-000134_src-000019_op-havoc_rep-4 | Bin .../input/id-000137_src-000019_op-havoc_rep-8 | Bin .../input/id-000139_src-000019_op-havoc_rep-8 | Bin .../input/id-000140_src-000019_op-havoc_rep-4 | Bin .../input/id-000141_src-000019_op-havoc_rep-4 | Bin .../input/id-000143_src-000019_op-havoc_rep-4 | Bin .../input/id-000144_src-000019_op-havoc_rep-2 | Bin .../input/id-000145_src-000019_op-havoc_rep-8 | Bin .../input/id-000146_src-000019_op-havoc_rep-8 | Bin .../input/id-000148_src-000019_op-havoc_rep-8 | Bin .../id-000150_src-000019_op-havoc_rep-16 | Bin .../input/id-000151_src-000019_op-havoc_rep-4 | Bin .../id-000152_src-000024_op-flip2_pos-97 | Bin .../id-000154_src-000024_op-flip2_pos-1124 | Bin .../id-000155_src-000024_op-flip2_pos-1606 | Bin ...-000161_src-000041_op-arith8_pos-0_val-+12 | Bin .../id-000163_src-000046_op-flip1_pos-2164 | Bin .../id-000165_src-000046_op-flip2_pos-494 | Bin .../id-000167_src-000046_op-flip2_pos-1025 | Bin ...-000170_src-000046_op-arith8_pos-3_val--17 | Bin .../id-000173_src-000046_op-havoc_rep-16 | Bin ...-000174_src-000091_op-arith8_pos-6_val--24 | Bin ...-000175_src-000091_op-arith8_pos-6_val--25 | Bin .../id-000176_src-000123_op-flip1_pos-36 | Bin .../id-000177_src-000123_op-flip1_pos-1025 | Bin .../input/id-000179_src-000135_op-flip1_pos-3 | Bin .../id-000180_src-000135_op-havoc_rep-64 | Bin .../id-000181_src-000159_op-havoc_rep-64 | Bin .../input/id-000182_src-000166_op-flip1_pos-3 | Bin .../id-000185_src-000183_op-flip1_pos-3694 | Bin .../id-000186_src-000185_op-flip4_pos-278 | Bin .../input/id-000187_src-000026_op-havoc_rep-8 | Bin .../input/id-000188_src-000026_op-havoc_rep-4 | Bin .../input/id-000189_src-000026_op-havoc_rep-2 | Bin .../id-000190_src-000026_op-havoc_rep-16 | Bin .../input/id-000191_src-000026_op-havoc_rep-4 | Bin .../input/id-000192_src-000026_op-havoc_rep-8 | Bin .../input/id-000193_src-000026_op-havoc_rep-2 | Bin .../id-000194_src-000026_op-havoc_rep-16 | Bin .../id-000195_src-000026_op-havoc_rep-64 | Bin .../id-000197_src-000026_op-havoc_rep-128 | Bin .../input/id-000200_src-000026_op-havoc_rep-4 | Bin .../id-000202_src-000037_op-flip1_pos-1249 | Bin .../id-000203_src-000037_op-flip4_pos-2342 | Bin .../input/id-000204_src-000138_op-flip1_pos-3 | Bin .../input/id-000205_src-000138_op-havoc_rep-4 | Bin .../input/id-000206_src-000138_op-havoc_rep-8 | Bin .../id-000210_src-000069_op-havoc_rep-16 | Bin .../input/id-000216_src-000069_op-havoc_rep-2 | Bin .../input/id-000218_src-000069_op-havoc_rep-8 | Bin .../input/id-000219_src-000069_op-havoc_rep-4 | Bin .../input/id-000220_src-000069_op-havoc_rep-2 | Bin .../input/id-000222_src-000099_op-havoc_rep-8 | Bin .../input/id-000223_src-000113_op-havoc_rep-8 | Bin .../input/id-000225_src-000142_op-flip1_pos-3 | Bin .../input/id-000226_src-000142_op-havoc_rep-4 | Bin .../id-000227_src-000167_op-flip1_pos-1844 | Bin .../input/id-000230_src-000189_op-flip2_pos-2 | Bin .../input/id-000232_src-000196_op-havoc_rep-4 | Bin .../id-000234_src-000203_op-havoc_rep-16 | Bin .../input/id-000235_src-000211_op-havoc_rep-2 | Bin .../input/id-000237_src-000211_op-havoc_rep-8 | Bin .../id-000238_src-000211_op-havoc_rep-16 | Bin .../input/id-000239_src-000211_op-havoc_rep-8 | Bin .../id-000240_src-000211_op-havoc_rep-64 | 0 .../id-000241_src-000215_op-havoc_rep-16 | Bin .../input/id-000242_src-000215_op-havoc_rep-8 | Bin .../input/id-000243_src-000215_op-havoc_rep-4 | Bin .../input/id-000244_src-000215_op-havoc_rep-2 | 0 .../input/id-000245_src-000215_op-havoc_rep-4 | Bin .../input/id-000246_src-000215_op-havoc_rep-8 | Bin .../input/id-000248_src-000216_op-flip1_pos-2 | Bin .../id-000250_src-000236_op-flip32_pos-4 | Bin .../input/id-000251_src-000238_op-havoc_rep-2 | Bin .../input/id-000252_src-000156_op-havoc_rep-8 | Bin .../input/id-000253_src-000241_op-havoc_rep-2 | Bin .../input/id-000254_src-000206_op-havoc_rep-4 | Bin .../input/id-000255_src-000229_op-flip1_pos-4 | Bin .../input/id-000256_src-000237_op-havoc_rep-8 | Bin .../id-000257_src-000255_op-havoc_rep-16 | Bin .../input/id-000258_src-000126_op-havoc_rep-8 | Bin .../input/id-000259_src-000172_op-flip1_pos-3 | Bin .../input/id-000260_src-000254_op-flip1_pos-3 | Bin .../id-000261_src-000254_op-flip1_pos-46 | Bin .../id-000262_src-000232_op-flip2_pos-100 | Bin .../id-000263_src-000258_op-flip1_pos-4249 | Bin .../id-000265_src-000264_op-flip1_pos-4249 | Bin .../id-000267_src-000266_op-flip1_pos-4249 | Bin .../input/id-000269_src-000085_op-havoc_rep-4 | Bin .../id-000271_src-000262_op-flip2_pos-102 | Bin ...0272_src-000270_op-arith8_pos-4249_val-+14 | Bin .../input/id-000273_src-000272_op-havoc_rep-4 | Bin .../input/id-000275_src-000274_op-flip1_pos-3 | 0 .../id-000276_src-000274_op-flip1_pos-271 | Bin .../id-000277_src-000274_op-flip1_pos-386 | Bin .../input/id-000278_src-000181_op-havoc_rep-2 | Bin .../input/id-000279_src-000278_op-havoc_rep-2 | Bin ...be89656abe2efcacc9c.00003e4a.honggfuzz.cov | Bin ...1760f9345f884bf7884.00002ddb.honggfuzz.cov | Bin ...26f53f014ac738f9f13.000001cc.honggfuzz.cov | Bin ...a763153889a6ef41f9d.00002000.honggfuzz.cov | Bin ...13e28827cca4ca6b58b.00001022.honggfuzz.cov | Bin ...cf03c63d0bc63d7f000.00000007.honggfuzz.cov | Bin ...96b10a6e86143c9a9b9.0000019e.honggfuzz.cov | Bin ...939f6dc7076393bec9c.0000000b.honggfuzz.cov | 0 ...ce23ddf96240f65e2d9.000007ac.honggfuzz.cov | Bin ...685014501da4b98b0df.00001ecf.honggfuzz.cov | Bin ...0351298a9bddfea3e5b.000000af.honggfuzz.cov | Bin ...72cc7e25dab4d0cbd5a.00000323.honggfuzz.cov | Bin ...9cbbed5448562b7a513.000000aa.honggfuzz.cov | Bin ...74067d82b409001b000.00000007.honggfuzz.cov | Bin ...01782b6e9d970a22f7f.000013b1.honggfuzz.cov | Bin ...974bbd12814f2dace4a.0000002b.honggfuzz.cov | Bin ...000ba64c09000900000.00000005.honggfuzz.cov | Bin ...d99f43029ee8c9787e0.00001590.honggfuzz.cov | Bin .../input/id-000023_orig-auto_000043 | 0 ...028dd307804fc133fbb.00002000.honggfuzz.cov | Bin ...e562ce1da2737e3688c.0000002b.honggfuzz.cov | Bin ...f69df89af72278b7eea.00000015.honggfuzz.cov | Bin ...9836f08b12e0d8e188a.000006f4.honggfuzz.cov | Bin ...50083767ba57a6560f3.00000081.honggfuzz.cov | Bin ...8f9bfaf8e6585044b53.00000063.honggfuzz.cov | Bin ...9838ddc73d910000000.0000000a.honggfuzz.cov | Bin ...9a68b60c9dfa2bd7561.0000003b.honggfuzz.cov | Bin ...00046ed82fcb1200000.00000005.honggfuzz.cov | 0 ...00006d4500000990000.00000006.honggfuzz.cov | Bin ...0008ddd500000000000.00000006.honggfuzz.cov | Bin ...000f95959c930000000.00000005.honggfuzz.cov | Bin ...4943b1d7b1d50b246e6.00000010.honggfuzz.cov | Bin ...0008da9bebd50000000.00000004.honggfuzz.cov | 0 ...-000095_src-000000+000044_op-splice_rep-64 | Bin ...00089cdb63915c00000.00000005.honggfuzz.cov | 0 ...0_orig-id-000101_src-000002_op-flip2_pos-6 | Bin ...107_src-000002_op-int16_pos-4773_val-+1000 | Bin ..._orig-id-000060_src-000000_op-havoc_rep-64 | Bin .../id-000072_src-000000_op-havoc_rep-16 | Bin .../input/id-000074_src-000000_op-havoc_rep-8 | 0 .../id-000076_src-000000_op-havoc_rep-128 | 0 .../id-000077_src-000000_op-havoc_rep-128 | Bin .../id-000080_src-000000_op-havoc_rep-32 | Bin .../input/id-000082_src-000000_op-havoc_rep-4 | Bin ...d-000084_src-000000+000044_op-splice_rep-8 | Bin .../id-000087_src-000000_op-havoc_rep-64 | Bin ...000088_src-000000+000010_op-splice_rep-128 | Bin .../input/id-000088_src-000000_op-havoc_rep-2 | Bin .../id-000089_src-000003_op-flip1_pos-43 | Bin .../id-000090_src-000003_op-flip1_pos-3258 | Bin .../id-000091_src-000003_op-flip2_pos-1612 | Bin .../id-000092_src-000003_op-flip8_pos-84 | Bin .../id-000093_src-000002_op-flip1_pos-535 | Bin ...0095_src-000003_op-arith16_pos-1118_val--5 | Bin ...096_src-000007_op-int32_pos-2110_val-+1024 | Bin ...-000097_src-000000+000010_op-splice_rep-64 | Bin .../input/id-000097_src-000007_op-havoc_rep-2 | Bin ...-000098_src-000025_op-arith8_pos-6_val--30 | Bin .../id-000099_src-000051_op-flip1_pos-698 | Bin ...0100_src-000053_op-int16_pos-370_val-+1024 | Bin ...0101_src-000053_op-int32_pos-111_val-+1024 | Bin .../id-000103_src-000073_op-flip1_pos-181 | Bin .../id-000106_src-000076_op-flip1_pos-57 | Bin ...00107_src-000076_op-int32_pos-58_val-+1000 | Bin .../input/id-000108_src-000096_op-havoc_rep-8 | Bin .../id-000114_src-000002_op-havoc_rep-64 | Bin .../id-000114_src-000107_op-havoc_rep-32 | Bin .../id-000115_src-000107_op-havoc_rep-32 | Bin ...000116_src-000111_op-int16_pos-58_val-+512 | Bin ...0117_src-000052_op-int16_pos-1595_val-+512 | Bin .../id-000118_src-000002_op-havoc_rep-64 | Bin ...18_src-000062_op-int16_pos-427_val-be-+100 | Bin ...119_src-000085_op-arith8_pos-15196_val-+11 | Bin ...0122_src-000016_op-int16_pos-6_val-be-+127 | Bin ...00124_src-000119_op-arith8_pos-584_val-+10 | Bin .../id-000125_src-000020_op-flip1_pos-1946 | Bin .../input/id-000127_src-000072_op-havoc_rep-4 | Bin ...29_src-000128_op-int32_pos-406_val-be-+512 | Bin .../input/id-000130_src-000076_op-flip1_pos-6 | Bin .../id-000130_src-000129_op-havoc_rep-16 | Bin .../id-000131_src-000068_op-flip2_pos-43 | Bin ...d-000132_src-000097+000109_op-splice_rep-4 | Bin ...d-000133_src-000027+000052_op-splice_rep-8 | Bin ...d-000134_src-000060+000111_op-splice_rep-4 | Bin ...-000137_src-000047+000127_op-splice_rep-16 | Bin ...40_src-000090_op-arith16_pos-114_val-be--6 | Bin .../id-000142_src-000123_op-flip1_pos-92 | Bin .../id-000144_src-000121_op-flip2_pos-743 | Bin ...-deserialize_transaction_master_src-000136 | Bin ..._sync-deserialize_transaction_2_src-000163 | Bin ...-deserialize_transaction_master_src-000128 | Bin ...-deserialize_transaction_master_src-000172 | Bin ...-deserialize_transaction_master_src-000171 | Bin .../id-000194_src-000154_op-havoc_rep-32 | Bin ..._sync-deserialize_transaction_2_src-000177 | Bin ..._sync-deserialize_transaction_0_src-000190 | Bin ...000202_src-000173_op-arith8_pos-178_val--2 | Bin ...-deserialize_transaction_master_src-000162 | Bin ..._sync-deserialize_transaction_3_src-000202 | Bin ..._sync-deserialize_transaction_3_src-000206 | Bin ..._sync-deserialize_transaction_2_src-000216 | 0 {fuzz => bitcoin/fuzz}/travis-fuzz.sh | 0 contrib/test.sh | 2 +- hashes/CHANGELOG.md | 163 ++++++ hashes/Cargo.toml | 41 ++ hashes/README.md | 34 ++ hashes/contrib/test.sh | 93 +++ hashes/embedded/Cargo.toml | 32 ++ hashes/embedded/memory.x | 5 + hashes/embedded/src/main.rs | 72 +++ hashes/extended_tests/schemars/Cargo.toml | 20 + hashes/extended_tests/schemars/src/main.rs | 193 +++++++ hashes/fuzz/Cargo.toml | 49 ++ hashes/fuzz/fuzz_targets/cbor.rs | 66 +++ hashes/fuzz/fuzz_targets/json.rs | 66 +++ hashes/fuzz/fuzz_targets/ripemd160.rs | 57 ++ hashes/fuzz/fuzz_targets/sha1.rs | 57 ++ hashes/fuzz/fuzz_targets/sha256.rs | 57 ++ hashes/fuzz/fuzz_targets/sha512.rs | 57 ++ hashes/fuzz/travis-fuzz.sh | 22 + hashes/src/cmp.rs | 160 ++++++ hashes/src/error.rs | 33 ++ hashes/src/hash160.rs | 160 ++++++ hashes/src/hex.rs | 483 ++++++++++++++++ hashes/src/hmac.rs | 437 ++++++++++++++ hashes/src/impls.rs | 205 +++++++ hashes/src/internal_macros.rs | 127 ++++ hashes/src/lib.rs | 237 ++++++++ hashes/src/ripemd160.rs | 544 ++++++++++++++++++ hashes/src/serde_macros.rs | 158 +++++ hashes/src/sha1.rs | 270 +++++++++ hashes/src/sha256.rs | 532 +++++++++++++++++ hashes/src/sha256d.rs | 153 +++++ hashes/src/sha256t.rs | 165 ++++++ hashes/src/sha512.rs | 452 +++++++++++++++ hashes/src/siphash24.rs | 421 ++++++++++++++ hashes/src/util.rs | 278 +++++++++ rustfmt.toml | 1 + 499 files changed, 5961 insertions(+), 13 deletions(-) rename {embedded => bitcoin/embedded}/Cargo.toml (76%) rename {embedded => bitcoin/embedded}/README.md (100%) rename {embedded => bitcoin/embedded}/memory.x (100%) rename {embedded => bitcoin/embedded}/scripts/env.sh (100%) rename {embedded => bitcoin/embedded}/scripts/install-deps (100%) rename {embedded => bitcoin/embedded}/src/main.rs (100%) rename {fuzz => bitcoin/fuzz}/.gitignore (100%) rename {fuzz => bitcoin/fuzz}/Cargo.toml (97%) rename {fuzz => bitcoin/fuzz}/cycle.sh (100%) rename {fuzz => bitcoin/fuzz}/fuzz_targets/deser_net_msg.rs (100%) rename {fuzz => bitcoin/fuzz}/fuzz_targets/deserialize_address.rs (100%) rename {fuzz => bitcoin/fuzz}/fuzz_targets/deserialize_amount.rs (100%) rename {fuzz => bitcoin/fuzz}/fuzz_targets/deserialize_block.rs (100%) rename {fuzz => bitcoin/fuzz}/fuzz_targets/deserialize_prefilled_transaction.rs (100%) rename {fuzz => bitcoin/fuzz}/fuzz_targets/deserialize_psbt.rs (100%) rename {fuzz => bitcoin/fuzz}/fuzz_targets/deserialize_script.rs (100%) rename {fuzz => bitcoin/fuzz}/fuzz_targets/deserialize_transaction.rs (100%) rename {fuzz => bitcoin/fuzz}/fuzz_targets/deserialize_witness.rs (100%) rename {fuzz => bitcoin/fuzz}/fuzz_targets/outpoint_string.rs (100%) rename {fuzz => bitcoin/fuzz}/fuzz_targets/script_bytes_to_asm_fmt.rs (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/18b6e222b04bbd45df9508b64b8e47d5.00000014.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/2418838742eb837088ce87020b701357.0000000e.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/4c268893957d293ecb031b7a493d5517.0000000b.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/642cd2ab1075cc9dcbf11d4517132cff.0000000d.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/733c9c9c9cb000002c9c9c9cc3100000.00000005.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/804ca76c67dac27d3fa9842a5fbf0acb.00000012.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/a4611c9c91300000211c9c9194400000.00000005.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/c7b1f1e233cb62b7663a33abe7722ab8.0000000e.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/dddf9577343cbfd614aa48444fdc440d.0000000b.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/ebdf1f0999769e0dd97c488f9e1629c3.0000000b.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/fea481ecdefcdebf030efcdefcc12454.00000008.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000000_orig-15cad1ae8551b96348bc3115fa7ebe63.0000000e.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000001_orig-215f74c65c586d0f6697654f73f1590f.0000001d.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000002_orig-2cc7e6ae50991ecc4678fc57c3fec235.00000025.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000003_orig-2ce88960000000005938fcb000000000.00000003.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000006_orig-70b17afe56c3a7b354b7c3b6c80a2bb9.0000002b.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000007_orig-728beb87e91000002957ebebb2a00000.00000005.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000008_orig-2c9c9c9cb00000002c9c9c9cb0000000.00000004.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000011_orig-9c3c1fb7a5a5a5a5a60c3c7aa5a5a5a5.0000000b.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000013_orig-c5a6dff88d6d9cded749fcdd9d288fec.00000009.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000014_orig-c609787c4d59cd6ad2d9fe413e542b60.000018a8.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000016_orig-cedfa000000000005f6e800000000000.00000002.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000017_orig-cfe7500000000000d79f300000000000.00000002.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000018_orig-e9b51c311bb9ce0d748f29409e19cbbb.0000000b.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000019_orig-7b300000000000007b30000000000000.00000001.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000019_orig-eaaab62c6d65ea2889ce9e10f05d9924.0000000f.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000021_orig-efa9a6552efcc1b41f947711ecde356c.0000000a.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000022_orig-cb1917e940dd2cde31ebfc9d50d957a3.00000009.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000025_orig-46367000000000004636700000000000.00000002.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000026_orig-2b5a40ad2cdebf606f0efc9d201a4bc0.00000007.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000028_orig-2cdf11c00000000071af4cb000000000.00000003.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000028_orig-e3a0a0acdebf60006f0efc90a0638000.00000006.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000029_orig-2ce927c00000000047994cb000000000.00000003.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000029_orig-e4299c9c9c9c9c9ce4299c9c9c9c9c9c.00000009.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000030_orig-37df2d30000000004d5f57b000000000.00000003.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000031_orig-41736041414141414173604141414141.00000019.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000032_orig-583f57782266bf0cf61b913df4fa7b99.00000011.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000036_orig-d7796363633d2cde4deafc9d73636363.00000009.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000039_orig-id-000033_src-000004_op-havoc_rep-2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000040_orig-id-000034_src-000004_op-havoc_rep-2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000041_orig-id-000034_src-000004_op-havoc_rep-64 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000043_orig-id-000042_src-000004_op-havoc_rep-2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000044_orig-id-000042_src-000004_op-havoc_rep-64 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000045_orig-id-000044_src-000004_op-havoc_rep-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000046_orig-id-000045_src-000004_op-havoc_rep-2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000046_src-000004_op-havoc_rep-2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000047_src-000004+000012_op-splice_rep-2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000058_sync-deserialize_address_0_src-000050 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000059_sync-deserialize_address_0_src-000057 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000062_sync-deserialize_address_0_src-000059 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000062_sync-deserialize_address_master_src-000062 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000063_sync-deserialize_address_master_src-000044 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000064_sync-deserialize_address_0_src-000044 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000064_sync-deserialize_address_0_src-000060 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000065_sync-deserialize_address_master_src-000067 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000068_src-000004_op-flip1_pos-3 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000069_src-000004_op-flip2_pos-3 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000069_src-000050_op-havoc_rep-8 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000070_src-000050_op-havoc_rep-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000070_sync-deserialize_address_0_src-000062 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000071_src-000050_op-havoc_rep-2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000072_src-000004_op-havoc_rep-64 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000072_src-000051_op-flip2_pos-22 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000074_src-000004_op-havoc_rep-2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000074_sync-deserialize_address_0_src-000064 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000075_src-000004_op-havoc_rep-64 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000075_sync-deserialize_address_0_src-000049 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000076_src-000061_op-havoc_rep-8 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000077_src-000006_op-flip1_pos-30 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000077_sync-deserialize_address_0_src-000043 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000080_src-000006_op-havoc_rep-2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000082_src-000010_op-havoc_rep-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_address/input/id-000090_src-000081_op-havoc_rep-2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/26c81c03b9651108489c94e7f7d9ec83.0000187a.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/82b6ca2032c4fae9f860fb7f02607f0f.0000005e.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/e4313771686c7664845b7c29b1a259ce.00001e39.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/ea8e157df43da4453ccdb7b706da2fcd.0000012c.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/eaa84c843e28389940ee87aef0bf42c8.0000005e.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000000_orig-00000000000000000000000000000000.00000014.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000000_orig-0000747a210d0000e395529a00000000.0000000d.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000002_orig-30de67eb614e23eae7a8524998830ae5.0000104e.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000003_orig-3e4c1ecfa88e7688176bafdc1cdef3ac.00000068.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000004_orig-46ef0efd9258e206e3f01d38fab33e5d.0000049a.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000006_orig-55c3be8d8490c27b9016b8cf573000d5.00000050.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000007_orig-58d699335b5b36233d1bdf0cedad7f63.00001175.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000007_orig-d7112b3552db4a545d8693c4b4ca38ee.00000347.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000008_orig-59d7733b7ce0acb6d1a8c01a2a733c0f.000009c1.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000009_orig-5a049d1bda43f22cd02347f6759f8d49.00000171.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000010_orig-799478dd7f44436e43f6a2ce9dd5d500.00000280.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000012_orig-33158c5168501211b85e51eb858552d0.00000052.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000013_orig-834b231ba86ecc35458b98ab40242765.00000090.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000013_orig-92acdfa148ead2580273b028376c833f.00001118.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000014_orig-8a6caa161bbf8b62f1155509f47c1925.000001c9.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000014_orig-b195ff73ae6af70b8dd960d5e2497074.00000051.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000015_orig-9997f28c8f839e94f08803b89546af85.000003d5.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000016_orig-9fee7269e42f7a1cbc932c4b11ebe638.00000cb1.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000017_orig-a544d559857d49e138d25cf41c61568e.0000007c.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000018_orig-b01ceea7151583100c9651148b73a82d.00000483.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000018_orig-d3a15597bf83b134239874b31cc9164c.00003ffa.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000019_orig-b63ddcefe10c51a93b8b39474c2da11b.0000005e.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000020_orig-be9377d826f57b92ecccd35ed7653e78.000001c9.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000022_orig-d26c7af7d0ff524953bcb2e8bc3c634e.0000191b.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000024_orig-e7dbfe989e635dd6d2ffcc74e82004b9.00001cea.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000025_orig-e7e475510d47fd1b20e16d8b69a0bd06.00000051.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000027_orig-f8b26d87f49e288cd46df1ba44f91982.0000008e.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000028_orig-587e6b698644e3adef93f9d0d26be075.000001bc.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000029_orig-2f7cea00ffbe06e68c4c802bc457e84b.00000051.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000030_orig-288c2c66482153a0d9aae05f1e9a69ea.0000005b.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000030_orig-69f287152d5409a5671ba4a0e75e9fd2.000010b0.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000032_orig-6be09244078a2cdb4b52e2703192aa1c.00000936.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000033_orig-898de0b89c0c21032e788e06f6b9ccc6.0000049e.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000034_orig-fb4c2bb2b57f2e8f482d6b2ca2c638ab.00000146.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000036_orig-ee35e81370e627fcc08f5f4eca611c52.00004f36.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000037_orig-d8c72638fcfeed2b490ad59971eba5cb.00000089.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000039_orig-dca36c2c9dfc4aac2055199abf343c9a.0000006d.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000041_orig-4182ee40e8b9db920aa463251cc10b72.00000071.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000042_orig-fc696eda9366e8dd2b74ee38afc9b112.00000080.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000043_orig-21056c56ff512f3827c6e58a4798aef1.0000132e.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000044_orig-3bb95a79c18a48d6fc2cae5619513e47.00000024.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000047_orig-bbbb8044701289e467497ea8f3ace4fc.0000020a.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000049_orig-3f61d605dff91d3eaf012548db3e06f1.0000005a.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000051_orig-739a844f27d4b10bd9a07dbdfc6860a8.0000005e.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000052_orig-e4fd180890e317061b581cf656ccdcb5.0000005b.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000053_orig-e7ffc69d40729bdbf8ea9eaa0ad83f5e.00000045.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000054_orig-eaa3d259ac214000f33500515ca91269.00000009.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000055_orig-25eef38783e131a71c589706915e229f.0000004c.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000056_orig-2e488cd421b08e308e3001d40c988e60.00000007.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000059_orig-eea8d9411c998c1179d61d182d7ee35f.0000132e.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000060_orig-4f40ec4f600000006fdc801fe0000000.00000004.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000071_orig-id-000107_src-000105_op-flip1_pos-435 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000073_orig-id-000112_src-000012_op-flip1_pos-1599 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000076_orig-fd80063f8fa2254c3ea9ef2a9d29a71e.00000048.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000076_orig-id-000115_src-000101_op-arith8_pos-1139_val--19 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000081_src-000003_op-havoc_rep-64 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000082_src-000003_op-havoc_rep-8 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000083_src-000003_op-havoc_rep-32 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000087_orig-id-000101_src-000005_op-int16_pos-97_val-+1024 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000095_orig-tx_id-000095_src-000000+000033_op-splice_rep-128 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000096_orig-id-000157_src-000113_op-havoc_rep-32 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000096_orig-tx_id-000097_src-000000+000010_op-splice_rep-64 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000097_src-000005_op-arith8_pos-3343_val--22 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000098_orig-tx_id-000166_sync-deserialize_transaction_master_src-000136 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000098_src-000021_op-flip1_pos-3143 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000101_orig-tx_id-000188_sync-deserialize_transaction_master_src-000172 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000102_orig-tx_id-000190_sync-deserialize_transaction_master_src-000171 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000104_src-000005_op-int32_pos-3524_val-+16 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000105_src-000008_op-flip1_pos-1160 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000106_orig-tx_id-000202_src-000173_op-arith8_pos-178_val--2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000108_orig-tx_id-000223_sync-deserialize_transaction_2_src-000214 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000110_src-000002_op-havoc_rep-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000111_src-000002_op-havoc_rep-32 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000113_src-000002_op-havoc_rep-16 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000113_sync-deserialize_block_2_src-000112 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000114_src-000005_op-flip4_pos-263 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000116_src-000031+000101_op-splice_rep-16 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000116_src-000059_op-flip1_pos-157 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000117_src-000059_op-flip4_pos-157 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000118_src-000018_op-flip1_pos-134 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000119_src-000082_op-flip1_pos-443 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000120_src-000029_op-havoc_rep-64 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000121_src-000077_op-arith8_pos-7636_val--18 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000121_src-000115_op-int16_pos-24501_val-+256 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000122_src-000064_op-arith8_pos-95_val--2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000124_src-000118_op-int16_pos-2599_val-+256 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000125_src-000080_op-flip2_pos-411 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000126_src-000018+000077_op-splice_rep-8 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000126_src-000085_op-havoc_rep-8 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000128_src-000108_op-havoc_rep-32 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000129_src-000128_op-flip1_pos-1977 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000132_src-000131_op-flip1_pos-7872 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000134_src-000005+000128_op-splice_rep-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000135_src-000134_op-flip8_pos-972 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000136_src-000134_op-arith8_pos-972_val--2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000137_src-000035+000128_op-splice_rep-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000155_src-000087_op-flip2_pos-126 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/id-000159_src-000113_op-havoc_rep-128 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/tx_id-000008_orig-363987a6ffb736444cc2a3b45a01b0c1.000000aa.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/tx_id-000009_orig-8530f6c85f51e01782b6e9d970a22f7f.000013b1.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/tx_id-000015_orig-a7114a6c122f99cbbed5448562b7a513.000000aa.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/tx_id-000016_orig-003baefb49000000999bfe5b80000000.00000005.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/tx_id-000076_src-000000_op-havoc_rep-128 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/tx_id-000077_src-000000_op-havoc_rep-64 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/tx_id-000080_src-000000_op-havoc_rep-32 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/tx_id-000084_src-000000+000044_op-splice_rep-8 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/tx_id-000121_src-000000+000033_op-splice_rep-8 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/tx_id-000176_sync-deserialize_transaction_2_src-000163 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/tx_id-000176_sync-deserialize_transaction_master_src-000128 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_block/input/tx_id-000202_sync-deserialize_transaction_master_src-000162 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/8958f2684d1268b44ba177926907375c.00001102.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/b1d2a3debe7a2e7c4c6a3c36c0233963.00000096.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/c9d1399a00c0eed06ceb68cac5f8cf8f.00000067.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/dc2ac020c3f058e2e5809bbfae424566.00000a1f.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/df690781d9f3e503665a2b0af684b9d0.00001102.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/e1482fe1b587e0b695d0087a84fb020c.000010c3.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/e543b8016347700007a3416803854000.00000006.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000009_orig-02bc0dcc52d8198fdf1e3fd228c1f412.00000096.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000018_orig-6421b0000000000001d4200000000000.00000002.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000020_orig-6591b0000000000001d5900000000000.00000002.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000021_orig-66f1b0000000000001d6f00000000000.00000002.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000022_orig-6741b0000000000001d7400000000000.00000002.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000023_orig-694551f1b1b770000771b1a11529a000.00000006.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000035_orig-adf692b94a4f7a7231ceeda52eee8351.00002000.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000041_orig-dc3e82e673cab9a788ad4e0c6739dcf3.000003d0.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000042_orig-dd15d52ef0000808403307a6e07bf584.0000084d.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000050_orig-9160b19ef1200000910e61f021200000.00000005.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000051_orig-00000000000000000000000000000000.00000001.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000052_orig-00b125700000000085c1a00000000000.00000003.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000053_orig-90900000000000009090000000000000.00000001.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000054_orig-91200000000000009120000000000000.00000001.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000055_orig-93f000000000000093f0000000000000.00000001.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000056_orig-b518ccc0e0000000e05c88c5b0000000.00000004.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000057_orig-id-000016_src-000000_op-havoc_rep-32 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000058_orig-id-000026_src-000011_op-int16_pos-2_val-+0 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000065_src-000000_op-havoc_rep-2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000066_src-000000_op-havoc_rep-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000067_src-000000_op-havoc_rep-64 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000068_src-000000_op-havoc_rep-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000072_src-000001_op-havoc_rep-2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000073_src-000002_op-havoc_rep-8 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000075_src-000004_op-flip4_pos-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000076_src-000007_op-havoc_rep-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000079_src-000009_op-arith8_pos-65_val--34 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000081_src-000009_op-int16_pos-65_val-be-+100 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000084_src-000009_op-int32_pos-1_val-be-+1 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000085_src-000009_op-havoc_rep-8 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000087_src-000011_op-flip2_pos-5 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000088_src-000011_op-flip2_pos-6 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000094_src-000011_op-havoc_rep-2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000095_src-000011_op-havoc_rep-2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000097_src-000013_op-flip1_pos-1 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000102_src-000013_op-flip1_pos-1791 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000103_src-000013_op-flip1_pos-2155 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000111_src-000013_op-flip32_pos-2400 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000118_src-000013_op-arith8_pos-974_val-+18 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000120_src-000013_op-arith8_pos-3822_val-+28 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000121_src-000013_op-arith8_pos-3837_val-+20 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000125_src-000013_op-int16_pos-3820_val-+1 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000129_src-000019_op-havoc_rep-2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000131_src-000019_op-havoc_rep-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000133_src-000019_op-havoc_rep-32 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000134_src-000019_op-havoc_rep-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000137_src-000019_op-havoc_rep-8 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000139_src-000019_op-havoc_rep-8 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000140_src-000019_op-havoc_rep-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000141_src-000019_op-havoc_rep-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000143_src-000019_op-havoc_rep-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000144_src-000019_op-havoc_rep-2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000145_src-000019_op-havoc_rep-8 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000146_src-000019_op-havoc_rep-8 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000148_src-000019_op-havoc_rep-8 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000150_src-000019_op-havoc_rep-16 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000151_src-000019_op-havoc_rep-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000152_src-000024_op-flip2_pos-97 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000154_src-000024_op-flip2_pos-1124 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000155_src-000024_op-flip2_pos-1606 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000161_src-000041_op-arith8_pos-0_val-+12 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000163_src-000046_op-flip1_pos-2164 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000165_src-000046_op-flip2_pos-494 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000167_src-000046_op-flip2_pos-1025 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000170_src-000046_op-arith8_pos-3_val--17 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000173_src-000046_op-havoc_rep-16 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000174_src-000091_op-arith8_pos-6_val--24 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000175_src-000091_op-arith8_pos-6_val--25 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000176_src-000123_op-flip1_pos-36 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000177_src-000123_op-flip1_pos-1025 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000179_src-000135_op-flip1_pos-3 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000180_src-000135_op-havoc_rep-64 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000181_src-000159_op-havoc_rep-64 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000182_src-000166_op-flip1_pos-3 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000185_src-000183_op-flip1_pos-3694 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000186_src-000185_op-flip4_pos-278 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000187_src-000026_op-havoc_rep-8 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000188_src-000026_op-havoc_rep-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000189_src-000026_op-havoc_rep-2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000190_src-000026_op-havoc_rep-16 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000191_src-000026_op-havoc_rep-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000192_src-000026_op-havoc_rep-8 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000193_src-000026_op-havoc_rep-2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000194_src-000026_op-havoc_rep-16 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000195_src-000026_op-havoc_rep-64 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000197_src-000026_op-havoc_rep-128 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000200_src-000026_op-havoc_rep-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000202_src-000037_op-flip1_pos-1249 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000203_src-000037_op-flip4_pos-2342 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000204_src-000138_op-flip1_pos-3 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000205_src-000138_op-havoc_rep-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000206_src-000138_op-havoc_rep-8 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000210_src-000069_op-havoc_rep-16 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000216_src-000069_op-havoc_rep-2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000218_src-000069_op-havoc_rep-8 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000219_src-000069_op-havoc_rep-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000220_src-000069_op-havoc_rep-2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000222_src-000099_op-havoc_rep-8 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000223_src-000113_op-havoc_rep-8 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000225_src-000142_op-flip1_pos-3 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000226_src-000142_op-havoc_rep-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000227_src-000167_op-flip1_pos-1844 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000230_src-000189_op-flip2_pos-2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000232_src-000196_op-havoc_rep-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000234_src-000203_op-havoc_rep-16 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000235_src-000211_op-havoc_rep-2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000237_src-000211_op-havoc_rep-8 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000238_src-000211_op-havoc_rep-16 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000239_src-000211_op-havoc_rep-8 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000240_src-000211_op-havoc_rep-64 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000241_src-000215_op-havoc_rep-16 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000242_src-000215_op-havoc_rep-8 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000243_src-000215_op-havoc_rep-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000244_src-000215_op-havoc_rep-2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000245_src-000215_op-havoc_rep-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000246_src-000215_op-havoc_rep-8 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000248_src-000216_op-flip1_pos-2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000250_src-000236_op-flip32_pos-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000251_src-000238_op-havoc_rep-2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000252_src-000156_op-havoc_rep-8 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000253_src-000241_op-havoc_rep-2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000254_src-000206_op-havoc_rep-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000255_src-000229_op-flip1_pos-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000256_src-000237_op-havoc_rep-8 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000257_src-000255_op-havoc_rep-16 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000258_src-000126_op-havoc_rep-8 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000259_src-000172_op-flip1_pos-3 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000260_src-000254_op-flip1_pos-3 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000261_src-000254_op-flip1_pos-46 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000262_src-000232_op-flip2_pos-100 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000263_src-000258_op-flip1_pos-4249 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000265_src-000264_op-flip1_pos-4249 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000267_src-000266_op-flip1_pos-4249 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000269_src-000085_op-havoc_rep-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000271_src-000262_op-flip2_pos-102 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000272_src-000270_op-arith8_pos-4249_val-+14 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000273_src-000272_op-havoc_rep-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000275_src-000274_op-flip1_pos-3 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000276_src-000274_op-flip1_pos-271 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000277_src-000274_op-flip1_pos-386 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000278_src-000181_op-havoc_rep-2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_script/input/id-000279_src-000278_op-havoc_rep-2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/2d1bda85f26c6be89656abe2efcacc9c.00003e4a.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/81018c8ec16dd1760f9345f884bf7884.00002ddb.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/99d1820d217a526f53f014ac738f9f13.000001cc.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/9c997889bc333a763153889a6ef41f9d.00002000.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/ac9bb13a181a013e28827cca4ca6b58b.00001022.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000000_orig-002763ccd013ccf03c63d0bc63d7f000.00000007.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000002_orig-745aa2bf1eb4f96b10a6e86143c9a9b9.0000019e.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000003_orig-0ab99d259c9be939f6dc7076393bec9c.0000000b.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000008_orig-cbae8f9530fd6ce23ddf96240f65e2d9.000007ac.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000011_orig-fd15b185d5abc685014501da4b98b0df.00001ecf.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000012_orig-2125d9ea2ab360351298a9bddfea3e5b.000000af.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000012_orig-febd092ddff9c72cc7e25dab4d0cbd5a.00000323.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000015_orig-a7114a6c122f99cbbed5448562b7a513.000000aa.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000016_orig-0001b0900b48d74067d82b409001b000.00000007.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000017_orig-8530f6c85f51e01782b6e9d970a22f7f.000013b1.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000018_orig-7091449e57d7e974bbd12814f2dace4a.0000002b.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000019_orig-900090847ae00000ba64c09000900000.00000005.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000020_orig-7469f7d107c7fd99f43029ee8c9787e0.00001590.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000023_orig-auto_000043 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000023_orig-cb75435edf707028dd307804fc133fbb.00002000.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000024_orig-bc4caef929c4fe562ce1da2737e3688c.0000002b.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000028_orig-da420ddf8a5b5f69df89af72278b7eea.00000015.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000029_orig-e4e83fa44f6fe9836f08b12e0d8e188a.000006f4.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000041_orig-fafb191376bf650083767ba57a6560f3.00000081.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000043_orig-53b59d89e4b4a8f9bfaf8e6585044b53.00000063.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000045_orig-4a108700000029838ddc73d910000000.0000000a.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000047_orig-f286eecdb14369a68b60c9dfa2bd7561.0000003b.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000050_orig-919cb2dd5670000046ed82fcb1200000.00000005.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000051_orig-990000001456c00006d4500000990000.00000006.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000052_orig-000000008ddd50008ddd500000000000.00000006.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000053_orig-00f9c95959300000f95959c930000000.00000005.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000054_orig-649e8b804eaa54943b1d7b1d50b246e6.00000010.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000057_orig-8ddec9bd500000008da9bebd50000000.00000004.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000057_orig-id-000095_src-000000+000044_op-splice_rep-64 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000060_orig-c5d936add940000089cdb63915c00000.00000005.honggfuzz.cov (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000060_orig-id-000101_src-000002_op-flip2_pos-6 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000061_orig-id-000107_src-000002_op-int16_pos-4773_val-+1000 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000062_orig-id-000060_src-000000_op-havoc_rep-64 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000072_src-000000_op-havoc_rep-16 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000074_src-000000_op-havoc_rep-8 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000076_src-000000_op-havoc_rep-128 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000077_src-000000_op-havoc_rep-128 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000080_src-000000_op-havoc_rep-32 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000082_src-000000_op-havoc_rep-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000084_src-000000+000044_op-splice_rep-8 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000087_src-000000_op-havoc_rep-64 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000088_src-000000+000010_op-splice_rep-128 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000088_src-000000_op-havoc_rep-2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000089_src-000003_op-flip1_pos-43 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000090_src-000003_op-flip1_pos-3258 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000091_src-000003_op-flip2_pos-1612 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000092_src-000003_op-flip8_pos-84 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000093_src-000002_op-flip1_pos-535 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000095_src-000003_op-arith16_pos-1118_val--5 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000096_src-000007_op-int32_pos-2110_val-+1024 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000097_src-000000+000010_op-splice_rep-64 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000097_src-000007_op-havoc_rep-2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000098_src-000025_op-arith8_pos-6_val--30 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000099_src-000051_op-flip1_pos-698 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000100_src-000053_op-int16_pos-370_val-+1024 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000101_src-000053_op-int32_pos-111_val-+1024 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000103_src-000073_op-flip1_pos-181 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000106_src-000076_op-flip1_pos-57 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000107_src-000076_op-int32_pos-58_val-+1000 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000108_src-000096_op-havoc_rep-8 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000114_src-000002_op-havoc_rep-64 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000114_src-000107_op-havoc_rep-32 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000115_src-000107_op-havoc_rep-32 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000116_src-000111_op-int16_pos-58_val-+512 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000117_src-000052_op-int16_pos-1595_val-+512 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000118_src-000002_op-havoc_rep-64 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000118_src-000062_op-int16_pos-427_val-be-+100 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000119_src-000085_op-arith8_pos-15196_val-+11 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000122_src-000016_op-int16_pos-6_val-be-+127 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000124_src-000119_op-arith8_pos-584_val-+10 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000125_src-000020_op-flip1_pos-1946 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000127_src-000072_op-havoc_rep-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000129_src-000128_op-int32_pos-406_val-be-+512 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000130_src-000076_op-flip1_pos-6 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000130_src-000129_op-havoc_rep-16 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000131_src-000068_op-flip2_pos-43 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000132_src-000097+000109_op-splice_rep-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000133_src-000027+000052_op-splice_rep-8 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000134_src-000060+000111_op-splice_rep-4 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000137_src-000047+000127_op-splice_rep-16 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000140_src-000090_op-arith16_pos-114_val-be--6 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000142_src-000123_op-flip1_pos-92 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000144_src-000121_op-flip2_pos-743 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000166_sync-deserialize_transaction_master_src-000136 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000176_sync-deserialize_transaction_2_src-000163 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000176_sync-deserialize_transaction_master_src-000128 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000188_sync-deserialize_transaction_master_src-000172 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000190_sync-deserialize_transaction_master_src-000171 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000194_src-000154_op-havoc_rep-32 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000196_sync-deserialize_transaction_2_src-000177 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000199_sync-deserialize_transaction_0_src-000190 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000202_src-000173_op-arith8_pos-178_val--2 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000202_sync-deserialize_transaction_master_src-000162 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000209_sync-deserialize_transaction_3_src-000202 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000213_sync-deserialize_transaction_3_src-000206 (100%) rename {fuzz => bitcoin/fuzz}/hfuzz_input/deserialize_transaction/input/id-000226_sync-deserialize_transaction_2_src-000216 (100%) rename {fuzz => bitcoin/fuzz}/travis-fuzz.sh (100%) create mode 100644 hashes/CHANGELOG.md create mode 100644 hashes/Cargo.toml create mode 100644 hashes/README.md create mode 100755 hashes/contrib/test.sh create mode 100644 hashes/embedded/Cargo.toml create mode 100644 hashes/embedded/memory.x create mode 100644 hashes/embedded/src/main.rs create mode 100644 hashes/extended_tests/schemars/Cargo.toml create mode 100644 hashes/extended_tests/schemars/src/main.rs create mode 100644 hashes/fuzz/Cargo.toml create mode 100644 hashes/fuzz/fuzz_targets/cbor.rs create mode 100644 hashes/fuzz/fuzz_targets/json.rs create mode 100644 hashes/fuzz/fuzz_targets/ripemd160.rs create mode 100644 hashes/fuzz/fuzz_targets/sha1.rs create mode 100644 hashes/fuzz/fuzz_targets/sha256.rs create mode 100644 hashes/fuzz/fuzz_targets/sha512.rs create mode 100755 hashes/fuzz/travis-fuzz.sh create mode 100644 hashes/src/cmp.rs create mode 100644 hashes/src/error.rs create mode 100644 hashes/src/hash160.rs create mode 100644 hashes/src/hex.rs create mode 100644 hashes/src/hmac.rs create mode 100644 hashes/src/impls.rs create mode 100644 hashes/src/internal_macros.rs create mode 100644 hashes/src/lib.rs create mode 100644 hashes/src/ripemd160.rs create mode 100644 hashes/src/serde_macros.rs create mode 100644 hashes/src/sha1.rs create mode 100644 hashes/src/sha256.rs create mode 100644 hashes/src/sha256d.rs create mode 100644 hashes/src/sha256t.rs create mode 100644 hashes/src/sha512.rs create mode 100644 hashes/src/siphash24.rs create mode 100644 hashes/src/util.rs diff --git a/.github/workflows/fuzz.yml b/.github/workflows/fuzz.yml index d60940df..e4ce4b6b 100644 --- a/.github/workflows/fuzz.yml +++ b/.github/workflows/fuzz.yml @@ -29,7 +29,7 @@ jobs: override: true profile: minimal - name: fuzz - run: cd fuzz && ./travis-fuzz.sh "${{ matrix.fuzz_target }}" + run: cd bitcoin/fuzz && ./travis-fuzz.sh "${{ matrix.fuzz_target }}" - run: echo "${{ matrix.fuzz_target }}.rs" >executed_${{ matrix.fuzz_target }} - uses: actions/upload-artifact@v2 with: @@ -46,5 +46,5 @@ jobs: - name: Display structure of downloaded files run: ls -R - run: find executed_* -type f -exec cat {} + | sort > executed - - run: ls fuzz/fuzz_targets | sort > expected + - run: ls bitcoin/fuzz/fuzz_targets | sort > expected - run: diff expected executed diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 540478c1..c4113cc6 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -16,6 +16,8 @@ jobs: DO_LINT: true AS_DEPENDENCY: true DO_NO_STD: true + DO_FEATURE_MATRIX: true # Currently only used in hashes crate. + DO_SCHEMARS_TESTS: true # Currently only used in hashes crate. - rust: beta env: AS_DEPENDENCY: true @@ -89,6 +91,9 @@ jobs: Embedded: runs-on: ubuntu-latest + env: + RUSTFLAGS: "-C link-arg=-Tlink.x" + CARGO_TARGET_THUMBV7M_NONE_EABI_RUNNER: "qemu-system-arm -cpu cortex-m3 -machine mps2-an385 -nographic -semihosting-config enable=on,target=native -kernel" steps: - name: Checkout uses: actions/checkout@v2 @@ -102,8 +107,44 @@ jobs: override: true components: rust-src target: thumbv7m-none-eabi - - name: Run + - name: Run bitcoin/embedded + run: cd bitcoin/embedded && cargo run --target thumbv7m-none-eabi + - name: Run hashes/embedded no alloc + run: cd hashes/embedded && cargo run --target thumbv7m-none-eabi + - name: Run hashes/embedded with alloc + run: cd hashes/embedded && cargo run --target thumbv7m-none-eabi --features=alloc + + ASAN: + name: Address sanitizer # hashes crate only. + runs-on: ubuntu-latest + steps: + - name: Checkout Crate + uses: actions/checkout@v2 + - name: Checkout Toolchain + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: nightly + override: true + components: rust-src + - name: Running address sanitizer env: - RUSTFLAGS: "-C link-arg=-Tlink.x" - CARGO_TARGET_THUMBV7M_NONE_EABI_RUNNER: "qemu-system-arm -cpu cortex-m3 -machine mps2-an385 -nographic -semihosting-config enable=on,target=native -kernel" - run: cd embedded && cargo run --target thumbv7m-none-eabi + DO_ASAN: true + run: ./hashes/contrib/test.sh + + WASM: + name: WebAssembly Build # hashes crate only. + runs-on: ubuntu-latest + steps: + - name: Checkout Crate + uses: actions/checkout@v2 + - name: Checkout Toolchain + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true + - name: Running WASM build + env: + DO_WASM: true + run: ./hashes/contrib/test.sh diff --git a/.gitignore b/.gitignore index 03941061..2ccfc05f 100644 --- a/.gitignore +++ b/.gitignore @@ -4,15 +4,19 @@ Cargo.lock internals/Cargo.lock bitcoin/Cargo.lock +hashes/Cargo.lock # Build artifacts target internals/target bitcoin/target +hashes/target # Test artifacts bitcoin/dep_test # Fuzz artifacts -fuzz/hfuzz_target -fuzz/hfuzz_workspace +bitcoin/fuzz/hfuzz_target +bitcoin/fuzz/hfuzz_workspace +hashes/fuzz/hfuzz_target +hashes/fuzz/hfuzz_workspace diff --git a/Cargo.toml b/Cargo.toml index 5298527d..c68aac6f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,3 +1,2 @@ [workspace] -members = ["bitcoin", "internals"] -exclude = ["embedded", "fuzz"] +members = ["bitcoin", "hashes", "internals"] diff --git a/embedded/Cargo.toml b/bitcoin/embedded/Cargo.toml similarity index 76% rename from embedded/Cargo.toml rename to bitcoin/embedded/Cargo.toml index ef6d962e..3971abf3 100644 --- a/embedded/Cargo.toml +++ b/bitcoin/embedded/Cargo.toml @@ -5,13 +5,17 @@ readme = "README.md" name = "embedded" version = "0.1.0" +# Prevent this from interfering with workspaces +[workspace] +members = ["."] + [dependencies] cortex-m = "0.6.0" cortex-m-rt = "0.6.10" cortex-m-semihosting = "0.3.3" panic-halt = "0.2.0" alloc-cortex-m = "0.4.1" -bitcoin = { path="../bitcoin", default-features = false, features = ["no-std", "secp-lowmemory"] } +bitcoin = { path="../", default-features = false, features = ["no-std", "secp-lowmemory"] } [[bin]] name = "embedded" diff --git a/embedded/README.md b/bitcoin/embedded/README.md similarity index 100% rename from embedded/README.md rename to bitcoin/embedded/README.md diff --git a/embedded/memory.x b/bitcoin/embedded/memory.x similarity index 100% rename from embedded/memory.x rename to bitcoin/embedded/memory.x diff --git a/embedded/scripts/env.sh b/bitcoin/embedded/scripts/env.sh similarity index 100% rename from embedded/scripts/env.sh rename to bitcoin/embedded/scripts/env.sh diff --git a/embedded/scripts/install-deps b/bitcoin/embedded/scripts/install-deps similarity index 100% rename from embedded/scripts/install-deps rename to bitcoin/embedded/scripts/install-deps diff --git a/embedded/src/main.rs b/bitcoin/embedded/src/main.rs similarity index 100% rename from embedded/src/main.rs rename to bitcoin/embedded/src/main.rs diff --git a/fuzz/.gitignore b/bitcoin/fuzz/.gitignore similarity index 100% rename from fuzz/.gitignore rename to bitcoin/fuzz/.gitignore diff --git a/fuzz/Cargo.toml b/bitcoin/fuzz/Cargo.toml similarity index 97% rename from fuzz/Cargo.toml rename to bitcoin/fuzz/Cargo.toml index 153b708e..c8e8ae9f 100644 --- a/fuzz/Cargo.toml +++ b/bitcoin/fuzz/Cargo.toml @@ -14,7 +14,7 @@ honggfuzz_fuzz = ["honggfuzz"] [dependencies] honggfuzz = { version = "0.5", optional = true, default-features = false } afl = { version = "0.4", optional = true } -bitcoin = { path = "../bitcoin" } +bitcoin = { path = "../" } # Prevent this from interfering with workspaces [workspace] diff --git a/fuzz/cycle.sh b/bitcoin/fuzz/cycle.sh similarity index 100% rename from fuzz/cycle.sh rename to bitcoin/fuzz/cycle.sh diff --git a/fuzz/fuzz_targets/deser_net_msg.rs b/bitcoin/fuzz/fuzz_targets/deser_net_msg.rs similarity index 100% rename from fuzz/fuzz_targets/deser_net_msg.rs rename to bitcoin/fuzz/fuzz_targets/deser_net_msg.rs diff --git a/fuzz/fuzz_targets/deserialize_address.rs b/bitcoin/fuzz/fuzz_targets/deserialize_address.rs similarity index 100% rename from fuzz/fuzz_targets/deserialize_address.rs rename to bitcoin/fuzz/fuzz_targets/deserialize_address.rs diff --git a/fuzz/fuzz_targets/deserialize_amount.rs b/bitcoin/fuzz/fuzz_targets/deserialize_amount.rs similarity index 100% rename from fuzz/fuzz_targets/deserialize_amount.rs rename to bitcoin/fuzz/fuzz_targets/deserialize_amount.rs diff --git a/fuzz/fuzz_targets/deserialize_block.rs b/bitcoin/fuzz/fuzz_targets/deserialize_block.rs similarity index 100% rename from fuzz/fuzz_targets/deserialize_block.rs rename to bitcoin/fuzz/fuzz_targets/deserialize_block.rs diff --git a/fuzz/fuzz_targets/deserialize_prefilled_transaction.rs b/bitcoin/fuzz/fuzz_targets/deserialize_prefilled_transaction.rs similarity index 100% rename from fuzz/fuzz_targets/deserialize_prefilled_transaction.rs rename to bitcoin/fuzz/fuzz_targets/deserialize_prefilled_transaction.rs diff --git a/fuzz/fuzz_targets/deserialize_psbt.rs b/bitcoin/fuzz/fuzz_targets/deserialize_psbt.rs similarity index 100% rename from fuzz/fuzz_targets/deserialize_psbt.rs rename to bitcoin/fuzz/fuzz_targets/deserialize_psbt.rs diff --git a/fuzz/fuzz_targets/deserialize_script.rs b/bitcoin/fuzz/fuzz_targets/deserialize_script.rs similarity index 100% rename from fuzz/fuzz_targets/deserialize_script.rs rename to bitcoin/fuzz/fuzz_targets/deserialize_script.rs diff --git a/fuzz/fuzz_targets/deserialize_transaction.rs b/bitcoin/fuzz/fuzz_targets/deserialize_transaction.rs similarity index 100% rename from fuzz/fuzz_targets/deserialize_transaction.rs rename to bitcoin/fuzz/fuzz_targets/deserialize_transaction.rs diff --git a/fuzz/fuzz_targets/deserialize_witness.rs b/bitcoin/fuzz/fuzz_targets/deserialize_witness.rs similarity index 100% rename from fuzz/fuzz_targets/deserialize_witness.rs rename to bitcoin/fuzz/fuzz_targets/deserialize_witness.rs diff --git a/fuzz/fuzz_targets/outpoint_string.rs b/bitcoin/fuzz/fuzz_targets/outpoint_string.rs similarity index 100% rename from fuzz/fuzz_targets/outpoint_string.rs rename to bitcoin/fuzz/fuzz_targets/outpoint_string.rs diff --git a/fuzz/fuzz_targets/script_bytes_to_asm_fmt.rs b/bitcoin/fuzz/fuzz_targets/script_bytes_to_asm_fmt.rs similarity index 100% rename from fuzz/fuzz_targets/script_bytes_to_asm_fmt.rs rename to bitcoin/fuzz/fuzz_targets/script_bytes_to_asm_fmt.rs diff --git a/fuzz/hfuzz_input/deserialize_address/input/18b6e222b04bbd45df9508b64b8e47d5.00000014.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/18b6e222b04bbd45df9508b64b8e47d5.00000014.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/18b6e222b04bbd45df9508b64b8e47d5.00000014.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/18b6e222b04bbd45df9508b64b8e47d5.00000014.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/2418838742eb837088ce87020b701357.0000000e.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/2418838742eb837088ce87020b701357.0000000e.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/2418838742eb837088ce87020b701357.0000000e.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/2418838742eb837088ce87020b701357.0000000e.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/4c268893957d293ecb031b7a493d5517.0000000b.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/4c268893957d293ecb031b7a493d5517.0000000b.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/4c268893957d293ecb031b7a493d5517.0000000b.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/4c268893957d293ecb031b7a493d5517.0000000b.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/642cd2ab1075cc9dcbf11d4517132cff.0000000d.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/642cd2ab1075cc9dcbf11d4517132cff.0000000d.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/642cd2ab1075cc9dcbf11d4517132cff.0000000d.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/642cd2ab1075cc9dcbf11d4517132cff.0000000d.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/733c9c9c9cb000002c9c9c9cc3100000.00000005.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/733c9c9c9cb000002c9c9c9cc3100000.00000005.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/733c9c9c9cb000002c9c9c9cc3100000.00000005.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/733c9c9c9cb000002c9c9c9cc3100000.00000005.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/804ca76c67dac27d3fa9842a5fbf0acb.00000012.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/804ca76c67dac27d3fa9842a5fbf0acb.00000012.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/804ca76c67dac27d3fa9842a5fbf0acb.00000012.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/804ca76c67dac27d3fa9842a5fbf0acb.00000012.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/a4611c9c91300000211c9c9194400000.00000005.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/a4611c9c91300000211c9c9194400000.00000005.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/a4611c9c91300000211c9c9194400000.00000005.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/a4611c9c91300000211c9c9194400000.00000005.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/c7b1f1e233cb62b7663a33abe7722ab8.0000000e.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/c7b1f1e233cb62b7663a33abe7722ab8.0000000e.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/c7b1f1e233cb62b7663a33abe7722ab8.0000000e.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/c7b1f1e233cb62b7663a33abe7722ab8.0000000e.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/dddf9577343cbfd614aa48444fdc440d.0000000b.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/dddf9577343cbfd614aa48444fdc440d.0000000b.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/dddf9577343cbfd614aa48444fdc440d.0000000b.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/dddf9577343cbfd614aa48444fdc440d.0000000b.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/ebdf1f0999769e0dd97c488f9e1629c3.0000000b.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/ebdf1f0999769e0dd97c488f9e1629c3.0000000b.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/ebdf1f0999769e0dd97c488f9e1629c3.0000000b.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/ebdf1f0999769e0dd97c488f9e1629c3.0000000b.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/fea481ecdefcdebf030efcdefcc12454.00000008.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/fea481ecdefcdebf030efcdefcc12454.00000008.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/fea481ecdefcdebf030efcdefcc12454.00000008.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/fea481ecdefcdebf030efcdefcc12454.00000008.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000000_orig-15cad1ae8551b96348bc3115fa7ebe63.0000000e.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000000_orig-15cad1ae8551b96348bc3115fa7ebe63.0000000e.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000000_orig-15cad1ae8551b96348bc3115fa7ebe63.0000000e.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000000_orig-15cad1ae8551b96348bc3115fa7ebe63.0000000e.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000001_orig-215f74c65c586d0f6697654f73f1590f.0000001d.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000001_orig-215f74c65c586d0f6697654f73f1590f.0000001d.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000001_orig-215f74c65c586d0f6697654f73f1590f.0000001d.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000001_orig-215f74c65c586d0f6697654f73f1590f.0000001d.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000002_orig-2cc7e6ae50991ecc4678fc57c3fec235.00000025.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000002_orig-2cc7e6ae50991ecc4678fc57c3fec235.00000025.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000002_orig-2cc7e6ae50991ecc4678fc57c3fec235.00000025.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000002_orig-2cc7e6ae50991ecc4678fc57c3fec235.00000025.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000003_orig-2ce88960000000005938fcb000000000.00000003.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000003_orig-2ce88960000000005938fcb000000000.00000003.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000003_orig-2ce88960000000005938fcb000000000.00000003.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000003_orig-2ce88960000000005938fcb000000000.00000003.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000006_orig-70b17afe56c3a7b354b7c3b6c80a2bb9.0000002b.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000006_orig-70b17afe56c3a7b354b7c3b6c80a2bb9.0000002b.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000006_orig-70b17afe56c3a7b354b7c3b6c80a2bb9.0000002b.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000006_orig-70b17afe56c3a7b354b7c3b6c80a2bb9.0000002b.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000007_orig-728beb87e91000002957ebebb2a00000.00000005.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000007_orig-728beb87e91000002957ebebb2a00000.00000005.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000007_orig-728beb87e91000002957ebebb2a00000.00000005.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000007_orig-728beb87e91000002957ebebb2a00000.00000005.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000008_orig-2c9c9c9cb00000002c9c9c9cb0000000.00000004.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000008_orig-2c9c9c9cb00000002c9c9c9cb0000000.00000004.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000008_orig-2c9c9c9cb00000002c9c9c9cb0000000.00000004.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000008_orig-2c9c9c9cb00000002c9c9c9cb0000000.00000004.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000011_orig-9c3c1fb7a5a5a5a5a60c3c7aa5a5a5a5.0000000b.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000011_orig-9c3c1fb7a5a5a5a5a60c3c7aa5a5a5a5.0000000b.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000011_orig-9c3c1fb7a5a5a5a5a60c3c7aa5a5a5a5.0000000b.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000011_orig-9c3c1fb7a5a5a5a5a60c3c7aa5a5a5a5.0000000b.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000013_orig-c5a6dff88d6d9cded749fcdd9d288fec.00000009.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000013_orig-c5a6dff88d6d9cded749fcdd9d288fec.00000009.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000013_orig-c5a6dff88d6d9cded749fcdd9d288fec.00000009.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000013_orig-c5a6dff88d6d9cded749fcdd9d288fec.00000009.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000014_orig-c609787c4d59cd6ad2d9fe413e542b60.000018a8.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000014_orig-c609787c4d59cd6ad2d9fe413e542b60.000018a8.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000014_orig-c609787c4d59cd6ad2d9fe413e542b60.000018a8.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000014_orig-c609787c4d59cd6ad2d9fe413e542b60.000018a8.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000016_orig-cedfa000000000005f6e800000000000.00000002.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000016_orig-cedfa000000000005f6e800000000000.00000002.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000016_orig-cedfa000000000005f6e800000000000.00000002.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000016_orig-cedfa000000000005f6e800000000000.00000002.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000017_orig-cfe7500000000000d79f300000000000.00000002.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000017_orig-cfe7500000000000d79f300000000000.00000002.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000017_orig-cfe7500000000000d79f300000000000.00000002.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000017_orig-cfe7500000000000d79f300000000000.00000002.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000018_orig-e9b51c311bb9ce0d748f29409e19cbbb.0000000b.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000018_orig-e9b51c311bb9ce0d748f29409e19cbbb.0000000b.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000018_orig-e9b51c311bb9ce0d748f29409e19cbbb.0000000b.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000018_orig-e9b51c311bb9ce0d748f29409e19cbbb.0000000b.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000019_orig-7b300000000000007b30000000000000.00000001.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000019_orig-7b300000000000007b30000000000000.00000001.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000019_orig-7b300000000000007b30000000000000.00000001.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000019_orig-7b300000000000007b30000000000000.00000001.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000019_orig-eaaab62c6d65ea2889ce9e10f05d9924.0000000f.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000019_orig-eaaab62c6d65ea2889ce9e10f05d9924.0000000f.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000019_orig-eaaab62c6d65ea2889ce9e10f05d9924.0000000f.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000019_orig-eaaab62c6d65ea2889ce9e10f05d9924.0000000f.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000021_orig-efa9a6552efcc1b41f947711ecde356c.0000000a.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000021_orig-efa9a6552efcc1b41f947711ecde356c.0000000a.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000021_orig-efa9a6552efcc1b41f947711ecde356c.0000000a.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000021_orig-efa9a6552efcc1b41f947711ecde356c.0000000a.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000022_orig-cb1917e940dd2cde31ebfc9d50d957a3.00000009.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000022_orig-cb1917e940dd2cde31ebfc9d50d957a3.00000009.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000022_orig-cb1917e940dd2cde31ebfc9d50d957a3.00000009.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000022_orig-cb1917e940dd2cde31ebfc9d50d957a3.00000009.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000025_orig-46367000000000004636700000000000.00000002.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000025_orig-46367000000000004636700000000000.00000002.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000025_orig-46367000000000004636700000000000.00000002.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000025_orig-46367000000000004636700000000000.00000002.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000026_orig-2b5a40ad2cdebf606f0efc9d201a4bc0.00000007.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000026_orig-2b5a40ad2cdebf606f0efc9d201a4bc0.00000007.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000026_orig-2b5a40ad2cdebf606f0efc9d201a4bc0.00000007.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000026_orig-2b5a40ad2cdebf606f0efc9d201a4bc0.00000007.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000028_orig-2cdf11c00000000071af4cb000000000.00000003.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000028_orig-2cdf11c00000000071af4cb000000000.00000003.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000028_orig-2cdf11c00000000071af4cb000000000.00000003.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000028_orig-2cdf11c00000000071af4cb000000000.00000003.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000028_orig-e3a0a0acdebf60006f0efc90a0638000.00000006.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000028_orig-e3a0a0acdebf60006f0efc90a0638000.00000006.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000028_orig-e3a0a0acdebf60006f0efc90a0638000.00000006.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000028_orig-e3a0a0acdebf60006f0efc90a0638000.00000006.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000029_orig-2ce927c00000000047994cb000000000.00000003.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000029_orig-2ce927c00000000047994cb000000000.00000003.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000029_orig-2ce927c00000000047994cb000000000.00000003.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000029_orig-2ce927c00000000047994cb000000000.00000003.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000029_orig-e4299c9c9c9c9c9ce4299c9c9c9c9c9c.00000009.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000029_orig-e4299c9c9c9c9c9ce4299c9c9c9c9c9c.00000009.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000029_orig-e4299c9c9c9c9c9ce4299c9c9c9c9c9c.00000009.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000029_orig-e4299c9c9c9c9c9ce4299c9c9c9c9c9c.00000009.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000030_orig-37df2d30000000004d5f57b000000000.00000003.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000030_orig-37df2d30000000004d5f57b000000000.00000003.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000030_orig-37df2d30000000004d5f57b000000000.00000003.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000030_orig-37df2d30000000004d5f57b000000000.00000003.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000031_orig-41736041414141414173604141414141.00000019.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000031_orig-41736041414141414173604141414141.00000019.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000031_orig-41736041414141414173604141414141.00000019.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000031_orig-41736041414141414173604141414141.00000019.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000032_orig-583f57782266bf0cf61b913df4fa7b99.00000011.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000032_orig-583f57782266bf0cf61b913df4fa7b99.00000011.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000032_orig-583f57782266bf0cf61b913df4fa7b99.00000011.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000032_orig-583f57782266bf0cf61b913df4fa7b99.00000011.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000036_orig-d7796363633d2cde4deafc9d73636363.00000009.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000036_orig-d7796363633d2cde4deafc9d73636363.00000009.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000036_orig-d7796363633d2cde4deafc9d73636363.00000009.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000036_orig-d7796363633d2cde4deafc9d73636363.00000009.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000039_orig-id-000033_src-000004_op-havoc_rep-2 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000039_orig-id-000033_src-000004_op-havoc_rep-2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000039_orig-id-000033_src-000004_op-havoc_rep-2 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000039_orig-id-000033_src-000004_op-havoc_rep-2 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000040_orig-id-000034_src-000004_op-havoc_rep-2 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000040_orig-id-000034_src-000004_op-havoc_rep-2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000040_orig-id-000034_src-000004_op-havoc_rep-2 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000040_orig-id-000034_src-000004_op-havoc_rep-2 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000041_orig-id-000034_src-000004_op-havoc_rep-64 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000041_orig-id-000034_src-000004_op-havoc_rep-64 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000041_orig-id-000034_src-000004_op-havoc_rep-64 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000041_orig-id-000034_src-000004_op-havoc_rep-64 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000043_orig-id-000042_src-000004_op-havoc_rep-2 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000043_orig-id-000042_src-000004_op-havoc_rep-2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000043_orig-id-000042_src-000004_op-havoc_rep-2 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000043_orig-id-000042_src-000004_op-havoc_rep-2 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000044_orig-id-000042_src-000004_op-havoc_rep-64 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000044_orig-id-000042_src-000004_op-havoc_rep-64 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000044_orig-id-000042_src-000004_op-havoc_rep-64 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000044_orig-id-000042_src-000004_op-havoc_rep-64 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000045_orig-id-000044_src-000004_op-havoc_rep-4 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000045_orig-id-000044_src-000004_op-havoc_rep-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000045_orig-id-000044_src-000004_op-havoc_rep-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000045_orig-id-000044_src-000004_op-havoc_rep-4 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000046_orig-id-000045_src-000004_op-havoc_rep-2 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000046_orig-id-000045_src-000004_op-havoc_rep-2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000046_orig-id-000045_src-000004_op-havoc_rep-2 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000046_orig-id-000045_src-000004_op-havoc_rep-2 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000046_src-000004_op-havoc_rep-2 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000046_src-000004_op-havoc_rep-2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000046_src-000004_op-havoc_rep-2 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000046_src-000004_op-havoc_rep-2 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000047_src-000004+000012_op-splice_rep-2 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000047_src-000004+000012_op-splice_rep-2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000047_src-000004+000012_op-splice_rep-2 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000047_src-000004+000012_op-splice_rep-2 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000058_sync-deserialize_address_0_src-000050 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000058_sync-deserialize_address_0_src-000050 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000058_sync-deserialize_address_0_src-000050 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000058_sync-deserialize_address_0_src-000050 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000059_sync-deserialize_address_0_src-000057 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000059_sync-deserialize_address_0_src-000057 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000059_sync-deserialize_address_0_src-000057 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000059_sync-deserialize_address_0_src-000057 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000062_sync-deserialize_address_0_src-000059 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000062_sync-deserialize_address_0_src-000059 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000062_sync-deserialize_address_0_src-000059 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000062_sync-deserialize_address_0_src-000059 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000062_sync-deserialize_address_master_src-000062 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000062_sync-deserialize_address_master_src-000062 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000062_sync-deserialize_address_master_src-000062 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000062_sync-deserialize_address_master_src-000062 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000063_sync-deserialize_address_master_src-000044 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000063_sync-deserialize_address_master_src-000044 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000063_sync-deserialize_address_master_src-000044 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000063_sync-deserialize_address_master_src-000044 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000064_sync-deserialize_address_0_src-000044 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000064_sync-deserialize_address_0_src-000044 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000064_sync-deserialize_address_0_src-000044 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000064_sync-deserialize_address_0_src-000044 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000064_sync-deserialize_address_0_src-000060 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000064_sync-deserialize_address_0_src-000060 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000064_sync-deserialize_address_0_src-000060 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000064_sync-deserialize_address_0_src-000060 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000065_sync-deserialize_address_master_src-000067 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000065_sync-deserialize_address_master_src-000067 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000065_sync-deserialize_address_master_src-000067 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000065_sync-deserialize_address_master_src-000067 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000068_src-000004_op-flip1_pos-3 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000068_src-000004_op-flip1_pos-3 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000068_src-000004_op-flip1_pos-3 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000068_src-000004_op-flip1_pos-3 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000069_src-000004_op-flip2_pos-3 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000069_src-000004_op-flip2_pos-3 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000069_src-000004_op-flip2_pos-3 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000069_src-000004_op-flip2_pos-3 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000069_src-000050_op-havoc_rep-8 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000069_src-000050_op-havoc_rep-8 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000069_src-000050_op-havoc_rep-8 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000069_src-000050_op-havoc_rep-8 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000070_src-000050_op-havoc_rep-4 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000070_src-000050_op-havoc_rep-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000070_src-000050_op-havoc_rep-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000070_src-000050_op-havoc_rep-4 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000070_sync-deserialize_address_0_src-000062 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000070_sync-deserialize_address_0_src-000062 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000070_sync-deserialize_address_0_src-000062 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000070_sync-deserialize_address_0_src-000062 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000071_src-000050_op-havoc_rep-2 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000071_src-000050_op-havoc_rep-2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000071_src-000050_op-havoc_rep-2 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000071_src-000050_op-havoc_rep-2 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000072_src-000004_op-havoc_rep-64 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000072_src-000004_op-havoc_rep-64 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000072_src-000004_op-havoc_rep-64 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000072_src-000004_op-havoc_rep-64 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000072_src-000051_op-flip2_pos-22 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000072_src-000051_op-flip2_pos-22 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000072_src-000051_op-flip2_pos-22 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000072_src-000051_op-flip2_pos-22 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000074_src-000004_op-havoc_rep-2 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000074_src-000004_op-havoc_rep-2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000074_src-000004_op-havoc_rep-2 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000074_src-000004_op-havoc_rep-2 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000074_sync-deserialize_address_0_src-000064 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000074_sync-deserialize_address_0_src-000064 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000074_sync-deserialize_address_0_src-000064 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000074_sync-deserialize_address_0_src-000064 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000075_src-000004_op-havoc_rep-64 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000075_src-000004_op-havoc_rep-64 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000075_src-000004_op-havoc_rep-64 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000075_src-000004_op-havoc_rep-64 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000075_sync-deserialize_address_0_src-000049 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000075_sync-deserialize_address_0_src-000049 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000075_sync-deserialize_address_0_src-000049 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000075_sync-deserialize_address_0_src-000049 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000076_src-000061_op-havoc_rep-8 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000076_src-000061_op-havoc_rep-8 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000076_src-000061_op-havoc_rep-8 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000076_src-000061_op-havoc_rep-8 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000077_src-000006_op-flip1_pos-30 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000077_src-000006_op-flip1_pos-30 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000077_src-000006_op-flip1_pos-30 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000077_src-000006_op-flip1_pos-30 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000077_sync-deserialize_address_0_src-000043 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000077_sync-deserialize_address_0_src-000043 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000077_sync-deserialize_address_0_src-000043 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000077_sync-deserialize_address_0_src-000043 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000080_src-000006_op-havoc_rep-2 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000080_src-000006_op-havoc_rep-2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000080_src-000006_op-havoc_rep-2 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000080_src-000006_op-havoc_rep-2 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000082_src-000010_op-havoc_rep-4 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000082_src-000010_op-havoc_rep-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000082_src-000010_op-havoc_rep-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000082_src-000010_op-havoc_rep-4 diff --git a/fuzz/hfuzz_input/deserialize_address/input/id-000090_src-000081_op-havoc_rep-2 b/bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000090_src-000081_op-havoc_rep-2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_address/input/id-000090_src-000081_op-havoc_rep-2 rename to bitcoin/fuzz/hfuzz_input/deserialize_address/input/id-000090_src-000081_op-havoc_rep-2 diff --git a/fuzz/hfuzz_input/deserialize_block/input/26c81c03b9651108489c94e7f7d9ec83.0000187a.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/26c81c03b9651108489c94e7f7d9ec83.0000187a.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/26c81c03b9651108489c94e7f7d9ec83.0000187a.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/26c81c03b9651108489c94e7f7d9ec83.0000187a.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/82b6ca2032c4fae9f860fb7f02607f0f.0000005e.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/82b6ca2032c4fae9f860fb7f02607f0f.0000005e.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/82b6ca2032c4fae9f860fb7f02607f0f.0000005e.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/82b6ca2032c4fae9f860fb7f02607f0f.0000005e.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/e4313771686c7664845b7c29b1a259ce.00001e39.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/e4313771686c7664845b7c29b1a259ce.00001e39.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/e4313771686c7664845b7c29b1a259ce.00001e39.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/e4313771686c7664845b7c29b1a259ce.00001e39.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/ea8e157df43da4453ccdb7b706da2fcd.0000012c.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/ea8e157df43da4453ccdb7b706da2fcd.0000012c.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/ea8e157df43da4453ccdb7b706da2fcd.0000012c.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/ea8e157df43da4453ccdb7b706da2fcd.0000012c.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/eaa84c843e28389940ee87aef0bf42c8.0000005e.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/eaa84c843e28389940ee87aef0bf42c8.0000005e.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/eaa84c843e28389940ee87aef0bf42c8.0000005e.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/eaa84c843e28389940ee87aef0bf42c8.0000005e.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000000_orig-00000000000000000000000000000000.00000014.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000000_orig-00000000000000000000000000000000.00000014.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000000_orig-00000000000000000000000000000000.00000014.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000000_orig-00000000000000000000000000000000.00000014.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000000_orig-0000747a210d0000e395529a00000000.0000000d.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000000_orig-0000747a210d0000e395529a00000000.0000000d.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000000_orig-0000747a210d0000e395529a00000000.0000000d.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000000_orig-0000747a210d0000e395529a00000000.0000000d.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000002_orig-30de67eb614e23eae7a8524998830ae5.0000104e.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000002_orig-30de67eb614e23eae7a8524998830ae5.0000104e.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000002_orig-30de67eb614e23eae7a8524998830ae5.0000104e.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000002_orig-30de67eb614e23eae7a8524998830ae5.0000104e.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000003_orig-3e4c1ecfa88e7688176bafdc1cdef3ac.00000068.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000003_orig-3e4c1ecfa88e7688176bafdc1cdef3ac.00000068.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000003_orig-3e4c1ecfa88e7688176bafdc1cdef3ac.00000068.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000003_orig-3e4c1ecfa88e7688176bafdc1cdef3ac.00000068.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000004_orig-46ef0efd9258e206e3f01d38fab33e5d.0000049a.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000004_orig-46ef0efd9258e206e3f01d38fab33e5d.0000049a.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000004_orig-46ef0efd9258e206e3f01d38fab33e5d.0000049a.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000004_orig-46ef0efd9258e206e3f01d38fab33e5d.0000049a.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000006_orig-55c3be8d8490c27b9016b8cf573000d5.00000050.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000006_orig-55c3be8d8490c27b9016b8cf573000d5.00000050.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000006_orig-55c3be8d8490c27b9016b8cf573000d5.00000050.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000006_orig-55c3be8d8490c27b9016b8cf573000d5.00000050.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000007_orig-58d699335b5b36233d1bdf0cedad7f63.00001175.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000007_orig-58d699335b5b36233d1bdf0cedad7f63.00001175.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000007_orig-58d699335b5b36233d1bdf0cedad7f63.00001175.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000007_orig-58d699335b5b36233d1bdf0cedad7f63.00001175.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000007_orig-d7112b3552db4a545d8693c4b4ca38ee.00000347.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000007_orig-d7112b3552db4a545d8693c4b4ca38ee.00000347.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000007_orig-d7112b3552db4a545d8693c4b4ca38ee.00000347.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000007_orig-d7112b3552db4a545d8693c4b4ca38ee.00000347.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000008_orig-59d7733b7ce0acb6d1a8c01a2a733c0f.000009c1.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000008_orig-59d7733b7ce0acb6d1a8c01a2a733c0f.000009c1.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000008_orig-59d7733b7ce0acb6d1a8c01a2a733c0f.000009c1.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000008_orig-59d7733b7ce0acb6d1a8c01a2a733c0f.000009c1.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000009_orig-5a049d1bda43f22cd02347f6759f8d49.00000171.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000009_orig-5a049d1bda43f22cd02347f6759f8d49.00000171.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000009_orig-5a049d1bda43f22cd02347f6759f8d49.00000171.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000009_orig-5a049d1bda43f22cd02347f6759f8d49.00000171.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000010_orig-799478dd7f44436e43f6a2ce9dd5d500.00000280.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000010_orig-799478dd7f44436e43f6a2ce9dd5d500.00000280.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000010_orig-799478dd7f44436e43f6a2ce9dd5d500.00000280.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000010_orig-799478dd7f44436e43f6a2ce9dd5d500.00000280.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000012_orig-33158c5168501211b85e51eb858552d0.00000052.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000012_orig-33158c5168501211b85e51eb858552d0.00000052.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000012_orig-33158c5168501211b85e51eb858552d0.00000052.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000012_orig-33158c5168501211b85e51eb858552d0.00000052.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000013_orig-834b231ba86ecc35458b98ab40242765.00000090.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000013_orig-834b231ba86ecc35458b98ab40242765.00000090.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000013_orig-834b231ba86ecc35458b98ab40242765.00000090.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000013_orig-834b231ba86ecc35458b98ab40242765.00000090.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000013_orig-92acdfa148ead2580273b028376c833f.00001118.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000013_orig-92acdfa148ead2580273b028376c833f.00001118.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000013_orig-92acdfa148ead2580273b028376c833f.00001118.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000013_orig-92acdfa148ead2580273b028376c833f.00001118.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000014_orig-8a6caa161bbf8b62f1155509f47c1925.000001c9.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000014_orig-8a6caa161bbf8b62f1155509f47c1925.000001c9.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000014_orig-8a6caa161bbf8b62f1155509f47c1925.000001c9.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000014_orig-8a6caa161bbf8b62f1155509f47c1925.000001c9.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000014_orig-b195ff73ae6af70b8dd960d5e2497074.00000051.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000014_orig-b195ff73ae6af70b8dd960d5e2497074.00000051.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000014_orig-b195ff73ae6af70b8dd960d5e2497074.00000051.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000014_orig-b195ff73ae6af70b8dd960d5e2497074.00000051.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000015_orig-9997f28c8f839e94f08803b89546af85.000003d5.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000015_orig-9997f28c8f839e94f08803b89546af85.000003d5.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000015_orig-9997f28c8f839e94f08803b89546af85.000003d5.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000015_orig-9997f28c8f839e94f08803b89546af85.000003d5.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000016_orig-9fee7269e42f7a1cbc932c4b11ebe638.00000cb1.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000016_orig-9fee7269e42f7a1cbc932c4b11ebe638.00000cb1.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000016_orig-9fee7269e42f7a1cbc932c4b11ebe638.00000cb1.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000016_orig-9fee7269e42f7a1cbc932c4b11ebe638.00000cb1.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000017_orig-a544d559857d49e138d25cf41c61568e.0000007c.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000017_orig-a544d559857d49e138d25cf41c61568e.0000007c.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000017_orig-a544d559857d49e138d25cf41c61568e.0000007c.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000017_orig-a544d559857d49e138d25cf41c61568e.0000007c.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000018_orig-b01ceea7151583100c9651148b73a82d.00000483.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000018_orig-b01ceea7151583100c9651148b73a82d.00000483.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000018_orig-b01ceea7151583100c9651148b73a82d.00000483.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000018_orig-b01ceea7151583100c9651148b73a82d.00000483.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000018_orig-d3a15597bf83b134239874b31cc9164c.00003ffa.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000018_orig-d3a15597bf83b134239874b31cc9164c.00003ffa.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000018_orig-d3a15597bf83b134239874b31cc9164c.00003ffa.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000018_orig-d3a15597bf83b134239874b31cc9164c.00003ffa.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000019_orig-b63ddcefe10c51a93b8b39474c2da11b.0000005e.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000019_orig-b63ddcefe10c51a93b8b39474c2da11b.0000005e.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000019_orig-b63ddcefe10c51a93b8b39474c2da11b.0000005e.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000019_orig-b63ddcefe10c51a93b8b39474c2da11b.0000005e.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000020_orig-be9377d826f57b92ecccd35ed7653e78.000001c9.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000020_orig-be9377d826f57b92ecccd35ed7653e78.000001c9.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000020_orig-be9377d826f57b92ecccd35ed7653e78.000001c9.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000020_orig-be9377d826f57b92ecccd35ed7653e78.000001c9.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000022_orig-d26c7af7d0ff524953bcb2e8bc3c634e.0000191b.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000022_orig-d26c7af7d0ff524953bcb2e8bc3c634e.0000191b.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000022_orig-d26c7af7d0ff524953bcb2e8bc3c634e.0000191b.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000022_orig-d26c7af7d0ff524953bcb2e8bc3c634e.0000191b.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000024_orig-e7dbfe989e635dd6d2ffcc74e82004b9.00001cea.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000024_orig-e7dbfe989e635dd6d2ffcc74e82004b9.00001cea.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000024_orig-e7dbfe989e635dd6d2ffcc74e82004b9.00001cea.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000024_orig-e7dbfe989e635dd6d2ffcc74e82004b9.00001cea.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000025_orig-e7e475510d47fd1b20e16d8b69a0bd06.00000051.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000025_orig-e7e475510d47fd1b20e16d8b69a0bd06.00000051.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000025_orig-e7e475510d47fd1b20e16d8b69a0bd06.00000051.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000025_orig-e7e475510d47fd1b20e16d8b69a0bd06.00000051.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000027_orig-f8b26d87f49e288cd46df1ba44f91982.0000008e.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000027_orig-f8b26d87f49e288cd46df1ba44f91982.0000008e.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000027_orig-f8b26d87f49e288cd46df1ba44f91982.0000008e.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000027_orig-f8b26d87f49e288cd46df1ba44f91982.0000008e.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000028_orig-587e6b698644e3adef93f9d0d26be075.000001bc.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000028_orig-587e6b698644e3adef93f9d0d26be075.000001bc.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000028_orig-587e6b698644e3adef93f9d0d26be075.000001bc.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000028_orig-587e6b698644e3adef93f9d0d26be075.000001bc.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000029_orig-2f7cea00ffbe06e68c4c802bc457e84b.00000051.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000029_orig-2f7cea00ffbe06e68c4c802bc457e84b.00000051.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000029_orig-2f7cea00ffbe06e68c4c802bc457e84b.00000051.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000029_orig-2f7cea00ffbe06e68c4c802bc457e84b.00000051.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000030_orig-288c2c66482153a0d9aae05f1e9a69ea.0000005b.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000030_orig-288c2c66482153a0d9aae05f1e9a69ea.0000005b.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000030_orig-288c2c66482153a0d9aae05f1e9a69ea.0000005b.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000030_orig-288c2c66482153a0d9aae05f1e9a69ea.0000005b.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000030_orig-69f287152d5409a5671ba4a0e75e9fd2.000010b0.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000030_orig-69f287152d5409a5671ba4a0e75e9fd2.000010b0.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000030_orig-69f287152d5409a5671ba4a0e75e9fd2.000010b0.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000030_orig-69f287152d5409a5671ba4a0e75e9fd2.000010b0.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000032_orig-6be09244078a2cdb4b52e2703192aa1c.00000936.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000032_orig-6be09244078a2cdb4b52e2703192aa1c.00000936.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000032_orig-6be09244078a2cdb4b52e2703192aa1c.00000936.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000032_orig-6be09244078a2cdb4b52e2703192aa1c.00000936.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000033_orig-898de0b89c0c21032e788e06f6b9ccc6.0000049e.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000033_orig-898de0b89c0c21032e788e06f6b9ccc6.0000049e.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000033_orig-898de0b89c0c21032e788e06f6b9ccc6.0000049e.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000033_orig-898de0b89c0c21032e788e06f6b9ccc6.0000049e.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000034_orig-fb4c2bb2b57f2e8f482d6b2ca2c638ab.00000146.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000034_orig-fb4c2bb2b57f2e8f482d6b2ca2c638ab.00000146.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000034_orig-fb4c2bb2b57f2e8f482d6b2ca2c638ab.00000146.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000034_orig-fb4c2bb2b57f2e8f482d6b2ca2c638ab.00000146.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000036_orig-ee35e81370e627fcc08f5f4eca611c52.00004f36.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000036_orig-ee35e81370e627fcc08f5f4eca611c52.00004f36.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000036_orig-ee35e81370e627fcc08f5f4eca611c52.00004f36.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000036_orig-ee35e81370e627fcc08f5f4eca611c52.00004f36.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000037_orig-d8c72638fcfeed2b490ad59971eba5cb.00000089.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000037_orig-d8c72638fcfeed2b490ad59971eba5cb.00000089.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000037_orig-d8c72638fcfeed2b490ad59971eba5cb.00000089.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000037_orig-d8c72638fcfeed2b490ad59971eba5cb.00000089.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000039_orig-dca36c2c9dfc4aac2055199abf343c9a.0000006d.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000039_orig-dca36c2c9dfc4aac2055199abf343c9a.0000006d.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000039_orig-dca36c2c9dfc4aac2055199abf343c9a.0000006d.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000039_orig-dca36c2c9dfc4aac2055199abf343c9a.0000006d.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000041_orig-4182ee40e8b9db920aa463251cc10b72.00000071.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000041_orig-4182ee40e8b9db920aa463251cc10b72.00000071.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000041_orig-4182ee40e8b9db920aa463251cc10b72.00000071.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000041_orig-4182ee40e8b9db920aa463251cc10b72.00000071.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000042_orig-fc696eda9366e8dd2b74ee38afc9b112.00000080.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000042_orig-fc696eda9366e8dd2b74ee38afc9b112.00000080.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000042_orig-fc696eda9366e8dd2b74ee38afc9b112.00000080.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000042_orig-fc696eda9366e8dd2b74ee38afc9b112.00000080.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000043_orig-21056c56ff512f3827c6e58a4798aef1.0000132e.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000043_orig-21056c56ff512f3827c6e58a4798aef1.0000132e.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000043_orig-21056c56ff512f3827c6e58a4798aef1.0000132e.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000043_orig-21056c56ff512f3827c6e58a4798aef1.0000132e.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000044_orig-3bb95a79c18a48d6fc2cae5619513e47.00000024.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000044_orig-3bb95a79c18a48d6fc2cae5619513e47.00000024.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000044_orig-3bb95a79c18a48d6fc2cae5619513e47.00000024.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000044_orig-3bb95a79c18a48d6fc2cae5619513e47.00000024.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000047_orig-bbbb8044701289e467497ea8f3ace4fc.0000020a.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000047_orig-bbbb8044701289e467497ea8f3ace4fc.0000020a.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000047_orig-bbbb8044701289e467497ea8f3ace4fc.0000020a.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000047_orig-bbbb8044701289e467497ea8f3ace4fc.0000020a.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000049_orig-3f61d605dff91d3eaf012548db3e06f1.0000005a.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000049_orig-3f61d605dff91d3eaf012548db3e06f1.0000005a.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000049_orig-3f61d605dff91d3eaf012548db3e06f1.0000005a.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000049_orig-3f61d605dff91d3eaf012548db3e06f1.0000005a.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000051_orig-739a844f27d4b10bd9a07dbdfc6860a8.0000005e.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000051_orig-739a844f27d4b10bd9a07dbdfc6860a8.0000005e.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000051_orig-739a844f27d4b10bd9a07dbdfc6860a8.0000005e.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000051_orig-739a844f27d4b10bd9a07dbdfc6860a8.0000005e.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000052_orig-e4fd180890e317061b581cf656ccdcb5.0000005b.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000052_orig-e4fd180890e317061b581cf656ccdcb5.0000005b.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000052_orig-e4fd180890e317061b581cf656ccdcb5.0000005b.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000052_orig-e4fd180890e317061b581cf656ccdcb5.0000005b.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000053_orig-e7ffc69d40729bdbf8ea9eaa0ad83f5e.00000045.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000053_orig-e7ffc69d40729bdbf8ea9eaa0ad83f5e.00000045.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000053_orig-e7ffc69d40729bdbf8ea9eaa0ad83f5e.00000045.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000053_orig-e7ffc69d40729bdbf8ea9eaa0ad83f5e.00000045.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000054_orig-eaa3d259ac214000f33500515ca91269.00000009.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000054_orig-eaa3d259ac214000f33500515ca91269.00000009.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000054_orig-eaa3d259ac214000f33500515ca91269.00000009.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000054_orig-eaa3d259ac214000f33500515ca91269.00000009.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000055_orig-25eef38783e131a71c589706915e229f.0000004c.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000055_orig-25eef38783e131a71c589706915e229f.0000004c.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000055_orig-25eef38783e131a71c589706915e229f.0000004c.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000055_orig-25eef38783e131a71c589706915e229f.0000004c.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000056_orig-2e488cd421b08e308e3001d40c988e60.00000007.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000056_orig-2e488cd421b08e308e3001d40c988e60.00000007.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000056_orig-2e488cd421b08e308e3001d40c988e60.00000007.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000056_orig-2e488cd421b08e308e3001d40c988e60.00000007.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000059_orig-eea8d9411c998c1179d61d182d7ee35f.0000132e.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000059_orig-eea8d9411c998c1179d61d182d7ee35f.0000132e.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000059_orig-eea8d9411c998c1179d61d182d7ee35f.0000132e.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000059_orig-eea8d9411c998c1179d61d182d7ee35f.0000132e.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000060_orig-4f40ec4f600000006fdc801fe0000000.00000004.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000060_orig-4f40ec4f600000006fdc801fe0000000.00000004.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000060_orig-4f40ec4f600000006fdc801fe0000000.00000004.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000060_orig-4f40ec4f600000006fdc801fe0000000.00000004.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000071_orig-id-000107_src-000105_op-flip1_pos-435 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000071_orig-id-000107_src-000105_op-flip1_pos-435 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000071_orig-id-000107_src-000105_op-flip1_pos-435 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000071_orig-id-000107_src-000105_op-flip1_pos-435 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000073_orig-id-000112_src-000012_op-flip1_pos-1599 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000073_orig-id-000112_src-000012_op-flip1_pos-1599 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000073_orig-id-000112_src-000012_op-flip1_pos-1599 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000073_orig-id-000112_src-000012_op-flip1_pos-1599 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000076_orig-fd80063f8fa2254c3ea9ef2a9d29a71e.00000048.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000076_orig-fd80063f8fa2254c3ea9ef2a9d29a71e.00000048.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000076_orig-fd80063f8fa2254c3ea9ef2a9d29a71e.00000048.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000076_orig-fd80063f8fa2254c3ea9ef2a9d29a71e.00000048.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000076_orig-id-000115_src-000101_op-arith8_pos-1139_val--19 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000076_orig-id-000115_src-000101_op-arith8_pos-1139_val--19 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000076_orig-id-000115_src-000101_op-arith8_pos-1139_val--19 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000076_orig-id-000115_src-000101_op-arith8_pos-1139_val--19 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000081_src-000003_op-havoc_rep-64 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000081_src-000003_op-havoc_rep-64 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000081_src-000003_op-havoc_rep-64 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000081_src-000003_op-havoc_rep-64 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000082_src-000003_op-havoc_rep-8 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000082_src-000003_op-havoc_rep-8 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000082_src-000003_op-havoc_rep-8 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000082_src-000003_op-havoc_rep-8 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000083_src-000003_op-havoc_rep-32 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000083_src-000003_op-havoc_rep-32 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000083_src-000003_op-havoc_rep-32 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000083_src-000003_op-havoc_rep-32 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000087_orig-id-000101_src-000005_op-int16_pos-97_val-+1024 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000087_orig-id-000101_src-000005_op-int16_pos-97_val-+1024 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000087_orig-id-000101_src-000005_op-int16_pos-97_val-+1024 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000087_orig-id-000101_src-000005_op-int16_pos-97_val-+1024 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000095_orig-tx_id-000095_src-000000+000033_op-splice_rep-128 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000095_orig-tx_id-000095_src-000000+000033_op-splice_rep-128 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000095_orig-tx_id-000095_src-000000+000033_op-splice_rep-128 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000095_orig-tx_id-000095_src-000000+000033_op-splice_rep-128 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000096_orig-id-000157_src-000113_op-havoc_rep-32 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000096_orig-id-000157_src-000113_op-havoc_rep-32 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000096_orig-id-000157_src-000113_op-havoc_rep-32 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000096_orig-id-000157_src-000113_op-havoc_rep-32 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000096_orig-tx_id-000097_src-000000+000010_op-splice_rep-64 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000096_orig-tx_id-000097_src-000000+000010_op-splice_rep-64 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000096_orig-tx_id-000097_src-000000+000010_op-splice_rep-64 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000096_orig-tx_id-000097_src-000000+000010_op-splice_rep-64 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000097_src-000005_op-arith8_pos-3343_val--22 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000097_src-000005_op-arith8_pos-3343_val--22 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000097_src-000005_op-arith8_pos-3343_val--22 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000097_src-000005_op-arith8_pos-3343_val--22 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000098_orig-tx_id-000166_sync-deserialize_transaction_master_src-000136 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000098_orig-tx_id-000166_sync-deserialize_transaction_master_src-000136 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000098_orig-tx_id-000166_sync-deserialize_transaction_master_src-000136 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000098_orig-tx_id-000166_sync-deserialize_transaction_master_src-000136 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000098_src-000021_op-flip1_pos-3143 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000098_src-000021_op-flip1_pos-3143 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000098_src-000021_op-flip1_pos-3143 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000098_src-000021_op-flip1_pos-3143 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000101_orig-tx_id-000188_sync-deserialize_transaction_master_src-000172 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000101_orig-tx_id-000188_sync-deserialize_transaction_master_src-000172 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000101_orig-tx_id-000188_sync-deserialize_transaction_master_src-000172 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000101_orig-tx_id-000188_sync-deserialize_transaction_master_src-000172 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000102_orig-tx_id-000190_sync-deserialize_transaction_master_src-000171 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000102_orig-tx_id-000190_sync-deserialize_transaction_master_src-000171 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000102_orig-tx_id-000190_sync-deserialize_transaction_master_src-000171 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000102_orig-tx_id-000190_sync-deserialize_transaction_master_src-000171 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000104_src-000005_op-int32_pos-3524_val-+16 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000104_src-000005_op-int32_pos-3524_val-+16 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000104_src-000005_op-int32_pos-3524_val-+16 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000104_src-000005_op-int32_pos-3524_val-+16 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000105_src-000008_op-flip1_pos-1160 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000105_src-000008_op-flip1_pos-1160 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000105_src-000008_op-flip1_pos-1160 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000105_src-000008_op-flip1_pos-1160 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000106_orig-tx_id-000202_src-000173_op-arith8_pos-178_val--2 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000106_orig-tx_id-000202_src-000173_op-arith8_pos-178_val--2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000106_orig-tx_id-000202_src-000173_op-arith8_pos-178_val--2 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000106_orig-tx_id-000202_src-000173_op-arith8_pos-178_val--2 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000108_orig-tx_id-000223_sync-deserialize_transaction_2_src-000214 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000108_orig-tx_id-000223_sync-deserialize_transaction_2_src-000214 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000108_orig-tx_id-000223_sync-deserialize_transaction_2_src-000214 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000108_orig-tx_id-000223_sync-deserialize_transaction_2_src-000214 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000110_src-000002_op-havoc_rep-4 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000110_src-000002_op-havoc_rep-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000110_src-000002_op-havoc_rep-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000110_src-000002_op-havoc_rep-4 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000111_src-000002_op-havoc_rep-32 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000111_src-000002_op-havoc_rep-32 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000111_src-000002_op-havoc_rep-32 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000111_src-000002_op-havoc_rep-32 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000113_src-000002_op-havoc_rep-16 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000113_src-000002_op-havoc_rep-16 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000113_src-000002_op-havoc_rep-16 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000113_src-000002_op-havoc_rep-16 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000113_sync-deserialize_block_2_src-000112 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000113_sync-deserialize_block_2_src-000112 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000113_sync-deserialize_block_2_src-000112 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000113_sync-deserialize_block_2_src-000112 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000114_src-000005_op-flip4_pos-263 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000114_src-000005_op-flip4_pos-263 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000114_src-000005_op-flip4_pos-263 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000114_src-000005_op-flip4_pos-263 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000116_src-000031+000101_op-splice_rep-16 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000116_src-000031+000101_op-splice_rep-16 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000116_src-000031+000101_op-splice_rep-16 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000116_src-000031+000101_op-splice_rep-16 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000116_src-000059_op-flip1_pos-157 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000116_src-000059_op-flip1_pos-157 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000116_src-000059_op-flip1_pos-157 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000116_src-000059_op-flip1_pos-157 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000117_src-000059_op-flip4_pos-157 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000117_src-000059_op-flip4_pos-157 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000117_src-000059_op-flip4_pos-157 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000117_src-000059_op-flip4_pos-157 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000118_src-000018_op-flip1_pos-134 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000118_src-000018_op-flip1_pos-134 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000118_src-000018_op-flip1_pos-134 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000118_src-000018_op-flip1_pos-134 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000119_src-000082_op-flip1_pos-443 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000119_src-000082_op-flip1_pos-443 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000119_src-000082_op-flip1_pos-443 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000119_src-000082_op-flip1_pos-443 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000120_src-000029_op-havoc_rep-64 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000120_src-000029_op-havoc_rep-64 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000120_src-000029_op-havoc_rep-64 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000120_src-000029_op-havoc_rep-64 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000121_src-000077_op-arith8_pos-7636_val--18 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000121_src-000077_op-arith8_pos-7636_val--18 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000121_src-000077_op-arith8_pos-7636_val--18 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000121_src-000077_op-arith8_pos-7636_val--18 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000121_src-000115_op-int16_pos-24501_val-+256 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000121_src-000115_op-int16_pos-24501_val-+256 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000121_src-000115_op-int16_pos-24501_val-+256 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000121_src-000115_op-int16_pos-24501_val-+256 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000122_src-000064_op-arith8_pos-95_val--2 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000122_src-000064_op-arith8_pos-95_val--2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000122_src-000064_op-arith8_pos-95_val--2 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000122_src-000064_op-arith8_pos-95_val--2 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000124_src-000118_op-int16_pos-2599_val-+256 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000124_src-000118_op-int16_pos-2599_val-+256 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000124_src-000118_op-int16_pos-2599_val-+256 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000124_src-000118_op-int16_pos-2599_val-+256 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000125_src-000080_op-flip2_pos-411 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000125_src-000080_op-flip2_pos-411 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000125_src-000080_op-flip2_pos-411 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000125_src-000080_op-flip2_pos-411 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000126_src-000018+000077_op-splice_rep-8 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000126_src-000018+000077_op-splice_rep-8 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000126_src-000018+000077_op-splice_rep-8 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000126_src-000018+000077_op-splice_rep-8 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000126_src-000085_op-havoc_rep-8 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000126_src-000085_op-havoc_rep-8 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000126_src-000085_op-havoc_rep-8 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000126_src-000085_op-havoc_rep-8 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000128_src-000108_op-havoc_rep-32 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000128_src-000108_op-havoc_rep-32 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000128_src-000108_op-havoc_rep-32 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000128_src-000108_op-havoc_rep-32 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000129_src-000128_op-flip1_pos-1977 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000129_src-000128_op-flip1_pos-1977 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000129_src-000128_op-flip1_pos-1977 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000129_src-000128_op-flip1_pos-1977 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000132_src-000131_op-flip1_pos-7872 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000132_src-000131_op-flip1_pos-7872 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000132_src-000131_op-flip1_pos-7872 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000132_src-000131_op-flip1_pos-7872 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000134_src-000005+000128_op-splice_rep-4 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000134_src-000005+000128_op-splice_rep-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000134_src-000005+000128_op-splice_rep-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000134_src-000005+000128_op-splice_rep-4 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000135_src-000134_op-flip8_pos-972 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000135_src-000134_op-flip8_pos-972 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000135_src-000134_op-flip8_pos-972 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000135_src-000134_op-flip8_pos-972 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000136_src-000134_op-arith8_pos-972_val--2 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000136_src-000134_op-arith8_pos-972_val--2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000136_src-000134_op-arith8_pos-972_val--2 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000136_src-000134_op-arith8_pos-972_val--2 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000137_src-000035+000128_op-splice_rep-4 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000137_src-000035+000128_op-splice_rep-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000137_src-000035+000128_op-splice_rep-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000137_src-000035+000128_op-splice_rep-4 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000155_src-000087_op-flip2_pos-126 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000155_src-000087_op-flip2_pos-126 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000155_src-000087_op-flip2_pos-126 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000155_src-000087_op-flip2_pos-126 diff --git a/fuzz/hfuzz_input/deserialize_block/input/id-000159_src-000113_op-havoc_rep-128 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000159_src-000113_op-havoc_rep-128 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/id-000159_src-000113_op-havoc_rep-128 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/id-000159_src-000113_op-havoc_rep-128 diff --git a/fuzz/hfuzz_input/deserialize_block/input/tx_id-000008_orig-363987a6ffb736444cc2a3b45a01b0c1.000000aa.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/tx_id-000008_orig-363987a6ffb736444cc2a3b45a01b0c1.000000aa.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/tx_id-000008_orig-363987a6ffb736444cc2a3b45a01b0c1.000000aa.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/tx_id-000008_orig-363987a6ffb736444cc2a3b45a01b0c1.000000aa.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/tx_id-000009_orig-8530f6c85f51e01782b6e9d970a22f7f.000013b1.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/tx_id-000009_orig-8530f6c85f51e01782b6e9d970a22f7f.000013b1.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/tx_id-000009_orig-8530f6c85f51e01782b6e9d970a22f7f.000013b1.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/tx_id-000009_orig-8530f6c85f51e01782b6e9d970a22f7f.000013b1.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/tx_id-000015_orig-a7114a6c122f99cbbed5448562b7a513.000000aa.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/tx_id-000015_orig-a7114a6c122f99cbbed5448562b7a513.000000aa.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/tx_id-000015_orig-a7114a6c122f99cbbed5448562b7a513.000000aa.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/tx_id-000015_orig-a7114a6c122f99cbbed5448562b7a513.000000aa.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/tx_id-000016_orig-003baefb49000000999bfe5b80000000.00000005.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/tx_id-000016_orig-003baefb49000000999bfe5b80000000.00000005.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/tx_id-000016_orig-003baefb49000000999bfe5b80000000.00000005.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/tx_id-000016_orig-003baefb49000000999bfe5b80000000.00000005.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_block/input/tx_id-000076_src-000000_op-havoc_rep-128 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/tx_id-000076_src-000000_op-havoc_rep-128 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/tx_id-000076_src-000000_op-havoc_rep-128 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/tx_id-000076_src-000000_op-havoc_rep-128 diff --git a/fuzz/hfuzz_input/deserialize_block/input/tx_id-000077_src-000000_op-havoc_rep-64 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/tx_id-000077_src-000000_op-havoc_rep-64 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/tx_id-000077_src-000000_op-havoc_rep-64 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/tx_id-000077_src-000000_op-havoc_rep-64 diff --git a/fuzz/hfuzz_input/deserialize_block/input/tx_id-000080_src-000000_op-havoc_rep-32 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/tx_id-000080_src-000000_op-havoc_rep-32 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/tx_id-000080_src-000000_op-havoc_rep-32 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/tx_id-000080_src-000000_op-havoc_rep-32 diff --git a/fuzz/hfuzz_input/deserialize_block/input/tx_id-000084_src-000000+000044_op-splice_rep-8 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/tx_id-000084_src-000000+000044_op-splice_rep-8 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/tx_id-000084_src-000000+000044_op-splice_rep-8 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/tx_id-000084_src-000000+000044_op-splice_rep-8 diff --git a/fuzz/hfuzz_input/deserialize_block/input/tx_id-000121_src-000000+000033_op-splice_rep-8 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/tx_id-000121_src-000000+000033_op-splice_rep-8 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/tx_id-000121_src-000000+000033_op-splice_rep-8 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/tx_id-000121_src-000000+000033_op-splice_rep-8 diff --git a/fuzz/hfuzz_input/deserialize_block/input/tx_id-000176_sync-deserialize_transaction_2_src-000163 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/tx_id-000176_sync-deserialize_transaction_2_src-000163 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/tx_id-000176_sync-deserialize_transaction_2_src-000163 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/tx_id-000176_sync-deserialize_transaction_2_src-000163 diff --git a/fuzz/hfuzz_input/deserialize_block/input/tx_id-000176_sync-deserialize_transaction_master_src-000128 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/tx_id-000176_sync-deserialize_transaction_master_src-000128 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/tx_id-000176_sync-deserialize_transaction_master_src-000128 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/tx_id-000176_sync-deserialize_transaction_master_src-000128 diff --git a/fuzz/hfuzz_input/deserialize_block/input/tx_id-000202_sync-deserialize_transaction_master_src-000162 b/bitcoin/fuzz/hfuzz_input/deserialize_block/input/tx_id-000202_sync-deserialize_transaction_master_src-000162 similarity index 100% rename from fuzz/hfuzz_input/deserialize_block/input/tx_id-000202_sync-deserialize_transaction_master_src-000162 rename to bitcoin/fuzz/hfuzz_input/deserialize_block/input/tx_id-000202_sync-deserialize_transaction_master_src-000162 diff --git a/fuzz/hfuzz_input/deserialize_script/input/8958f2684d1268b44ba177926907375c.00001102.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/8958f2684d1268b44ba177926907375c.00001102.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/8958f2684d1268b44ba177926907375c.00001102.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/8958f2684d1268b44ba177926907375c.00001102.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_script/input/b1d2a3debe7a2e7c4c6a3c36c0233963.00000096.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/b1d2a3debe7a2e7c4c6a3c36c0233963.00000096.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/b1d2a3debe7a2e7c4c6a3c36c0233963.00000096.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/b1d2a3debe7a2e7c4c6a3c36c0233963.00000096.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_script/input/c9d1399a00c0eed06ceb68cac5f8cf8f.00000067.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/c9d1399a00c0eed06ceb68cac5f8cf8f.00000067.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/c9d1399a00c0eed06ceb68cac5f8cf8f.00000067.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/c9d1399a00c0eed06ceb68cac5f8cf8f.00000067.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_script/input/dc2ac020c3f058e2e5809bbfae424566.00000a1f.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/dc2ac020c3f058e2e5809bbfae424566.00000a1f.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/dc2ac020c3f058e2e5809bbfae424566.00000a1f.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/dc2ac020c3f058e2e5809bbfae424566.00000a1f.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_script/input/df690781d9f3e503665a2b0af684b9d0.00001102.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/df690781d9f3e503665a2b0af684b9d0.00001102.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/df690781d9f3e503665a2b0af684b9d0.00001102.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/df690781d9f3e503665a2b0af684b9d0.00001102.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_script/input/e1482fe1b587e0b695d0087a84fb020c.000010c3.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/e1482fe1b587e0b695d0087a84fb020c.000010c3.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/e1482fe1b587e0b695d0087a84fb020c.000010c3.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/e1482fe1b587e0b695d0087a84fb020c.000010c3.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_script/input/e543b8016347700007a3416803854000.00000006.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/e543b8016347700007a3416803854000.00000006.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/e543b8016347700007a3416803854000.00000006.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/e543b8016347700007a3416803854000.00000006.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000009_orig-02bc0dcc52d8198fdf1e3fd228c1f412.00000096.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000009_orig-02bc0dcc52d8198fdf1e3fd228c1f412.00000096.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000009_orig-02bc0dcc52d8198fdf1e3fd228c1f412.00000096.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000009_orig-02bc0dcc52d8198fdf1e3fd228c1f412.00000096.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000018_orig-6421b0000000000001d4200000000000.00000002.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000018_orig-6421b0000000000001d4200000000000.00000002.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000018_orig-6421b0000000000001d4200000000000.00000002.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000018_orig-6421b0000000000001d4200000000000.00000002.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000020_orig-6591b0000000000001d5900000000000.00000002.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000020_orig-6591b0000000000001d5900000000000.00000002.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000020_orig-6591b0000000000001d5900000000000.00000002.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000020_orig-6591b0000000000001d5900000000000.00000002.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000021_orig-66f1b0000000000001d6f00000000000.00000002.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000021_orig-66f1b0000000000001d6f00000000000.00000002.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000021_orig-66f1b0000000000001d6f00000000000.00000002.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000021_orig-66f1b0000000000001d6f00000000000.00000002.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000022_orig-6741b0000000000001d7400000000000.00000002.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000022_orig-6741b0000000000001d7400000000000.00000002.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000022_orig-6741b0000000000001d7400000000000.00000002.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000022_orig-6741b0000000000001d7400000000000.00000002.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000023_orig-694551f1b1b770000771b1a11529a000.00000006.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000023_orig-694551f1b1b770000771b1a11529a000.00000006.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000023_orig-694551f1b1b770000771b1a11529a000.00000006.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000023_orig-694551f1b1b770000771b1a11529a000.00000006.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000035_orig-adf692b94a4f7a7231ceeda52eee8351.00002000.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000035_orig-adf692b94a4f7a7231ceeda52eee8351.00002000.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000035_orig-adf692b94a4f7a7231ceeda52eee8351.00002000.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000035_orig-adf692b94a4f7a7231ceeda52eee8351.00002000.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000041_orig-dc3e82e673cab9a788ad4e0c6739dcf3.000003d0.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000041_orig-dc3e82e673cab9a788ad4e0c6739dcf3.000003d0.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000041_orig-dc3e82e673cab9a788ad4e0c6739dcf3.000003d0.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000041_orig-dc3e82e673cab9a788ad4e0c6739dcf3.000003d0.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000042_orig-dd15d52ef0000808403307a6e07bf584.0000084d.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000042_orig-dd15d52ef0000808403307a6e07bf584.0000084d.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000042_orig-dd15d52ef0000808403307a6e07bf584.0000084d.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000042_orig-dd15d52ef0000808403307a6e07bf584.0000084d.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000050_orig-9160b19ef1200000910e61f021200000.00000005.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000050_orig-9160b19ef1200000910e61f021200000.00000005.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000050_orig-9160b19ef1200000910e61f021200000.00000005.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000050_orig-9160b19ef1200000910e61f021200000.00000005.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000051_orig-00000000000000000000000000000000.00000001.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000051_orig-00000000000000000000000000000000.00000001.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000051_orig-00000000000000000000000000000000.00000001.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000051_orig-00000000000000000000000000000000.00000001.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000052_orig-00b125700000000085c1a00000000000.00000003.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000052_orig-00b125700000000085c1a00000000000.00000003.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000052_orig-00b125700000000085c1a00000000000.00000003.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000052_orig-00b125700000000085c1a00000000000.00000003.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000053_orig-90900000000000009090000000000000.00000001.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000053_orig-90900000000000009090000000000000.00000001.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000053_orig-90900000000000009090000000000000.00000001.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000053_orig-90900000000000009090000000000000.00000001.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000054_orig-91200000000000009120000000000000.00000001.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000054_orig-91200000000000009120000000000000.00000001.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000054_orig-91200000000000009120000000000000.00000001.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000054_orig-91200000000000009120000000000000.00000001.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000055_orig-93f000000000000093f0000000000000.00000001.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000055_orig-93f000000000000093f0000000000000.00000001.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000055_orig-93f000000000000093f0000000000000.00000001.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000055_orig-93f000000000000093f0000000000000.00000001.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000056_orig-b518ccc0e0000000e05c88c5b0000000.00000004.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000056_orig-b518ccc0e0000000e05c88c5b0000000.00000004.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000056_orig-b518ccc0e0000000e05c88c5b0000000.00000004.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000056_orig-b518ccc0e0000000e05c88c5b0000000.00000004.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000057_orig-id-000016_src-000000_op-havoc_rep-32 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000057_orig-id-000016_src-000000_op-havoc_rep-32 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000057_orig-id-000016_src-000000_op-havoc_rep-32 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000057_orig-id-000016_src-000000_op-havoc_rep-32 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000058_orig-id-000026_src-000011_op-int16_pos-2_val-+0 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000058_orig-id-000026_src-000011_op-int16_pos-2_val-+0 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000058_orig-id-000026_src-000011_op-int16_pos-2_val-+0 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000058_orig-id-000026_src-000011_op-int16_pos-2_val-+0 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000065_src-000000_op-havoc_rep-2 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000065_src-000000_op-havoc_rep-2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000065_src-000000_op-havoc_rep-2 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000065_src-000000_op-havoc_rep-2 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000066_src-000000_op-havoc_rep-4 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000066_src-000000_op-havoc_rep-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000066_src-000000_op-havoc_rep-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000066_src-000000_op-havoc_rep-4 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000067_src-000000_op-havoc_rep-64 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000067_src-000000_op-havoc_rep-64 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000067_src-000000_op-havoc_rep-64 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000067_src-000000_op-havoc_rep-64 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000068_src-000000_op-havoc_rep-4 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000068_src-000000_op-havoc_rep-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000068_src-000000_op-havoc_rep-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000068_src-000000_op-havoc_rep-4 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000072_src-000001_op-havoc_rep-2 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000072_src-000001_op-havoc_rep-2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000072_src-000001_op-havoc_rep-2 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000072_src-000001_op-havoc_rep-2 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000073_src-000002_op-havoc_rep-8 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000073_src-000002_op-havoc_rep-8 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000073_src-000002_op-havoc_rep-8 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000073_src-000002_op-havoc_rep-8 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000075_src-000004_op-flip4_pos-4 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000075_src-000004_op-flip4_pos-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000075_src-000004_op-flip4_pos-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000075_src-000004_op-flip4_pos-4 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000076_src-000007_op-havoc_rep-4 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000076_src-000007_op-havoc_rep-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000076_src-000007_op-havoc_rep-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000076_src-000007_op-havoc_rep-4 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000079_src-000009_op-arith8_pos-65_val--34 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000079_src-000009_op-arith8_pos-65_val--34 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000079_src-000009_op-arith8_pos-65_val--34 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000079_src-000009_op-arith8_pos-65_val--34 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000081_src-000009_op-int16_pos-65_val-be-+100 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000081_src-000009_op-int16_pos-65_val-be-+100 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000081_src-000009_op-int16_pos-65_val-be-+100 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000081_src-000009_op-int16_pos-65_val-be-+100 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000084_src-000009_op-int32_pos-1_val-be-+1 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000084_src-000009_op-int32_pos-1_val-be-+1 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000084_src-000009_op-int32_pos-1_val-be-+1 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000084_src-000009_op-int32_pos-1_val-be-+1 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000085_src-000009_op-havoc_rep-8 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000085_src-000009_op-havoc_rep-8 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000085_src-000009_op-havoc_rep-8 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000085_src-000009_op-havoc_rep-8 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000087_src-000011_op-flip2_pos-5 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000087_src-000011_op-flip2_pos-5 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000087_src-000011_op-flip2_pos-5 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000087_src-000011_op-flip2_pos-5 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000088_src-000011_op-flip2_pos-6 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000088_src-000011_op-flip2_pos-6 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000088_src-000011_op-flip2_pos-6 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000088_src-000011_op-flip2_pos-6 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000094_src-000011_op-havoc_rep-2 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000094_src-000011_op-havoc_rep-2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000094_src-000011_op-havoc_rep-2 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000094_src-000011_op-havoc_rep-2 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000095_src-000011_op-havoc_rep-2 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000095_src-000011_op-havoc_rep-2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000095_src-000011_op-havoc_rep-2 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000095_src-000011_op-havoc_rep-2 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000097_src-000013_op-flip1_pos-1 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000097_src-000013_op-flip1_pos-1 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000097_src-000013_op-flip1_pos-1 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000097_src-000013_op-flip1_pos-1 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000102_src-000013_op-flip1_pos-1791 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000102_src-000013_op-flip1_pos-1791 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000102_src-000013_op-flip1_pos-1791 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000102_src-000013_op-flip1_pos-1791 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000103_src-000013_op-flip1_pos-2155 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000103_src-000013_op-flip1_pos-2155 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000103_src-000013_op-flip1_pos-2155 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000103_src-000013_op-flip1_pos-2155 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000111_src-000013_op-flip32_pos-2400 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000111_src-000013_op-flip32_pos-2400 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000111_src-000013_op-flip32_pos-2400 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000111_src-000013_op-flip32_pos-2400 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000118_src-000013_op-arith8_pos-974_val-+18 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000118_src-000013_op-arith8_pos-974_val-+18 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000118_src-000013_op-arith8_pos-974_val-+18 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000118_src-000013_op-arith8_pos-974_val-+18 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000120_src-000013_op-arith8_pos-3822_val-+28 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000120_src-000013_op-arith8_pos-3822_val-+28 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000120_src-000013_op-arith8_pos-3822_val-+28 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000120_src-000013_op-arith8_pos-3822_val-+28 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000121_src-000013_op-arith8_pos-3837_val-+20 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000121_src-000013_op-arith8_pos-3837_val-+20 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000121_src-000013_op-arith8_pos-3837_val-+20 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000121_src-000013_op-arith8_pos-3837_val-+20 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000125_src-000013_op-int16_pos-3820_val-+1 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000125_src-000013_op-int16_pos-3820_val-+1 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000125_src-000013_op-int16_pos-3820_val-+1 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000125_src-000013_op-int16_pos-3820_val-+1 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000129_src-000019_op-havoc_rep-2 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000129_src-000019_op-havoc_rep-2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000129_src-000019_op-havoc_rep-2 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000129_src-000019_op-havoc_rep-2 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000131_src-000019_op-havoc_rep-4 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000131_src-000019_op-havoc_rep-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000131_src-000019_op-havoc_rep-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000131_src-000019_op-havoc_rep-4 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000133_src-000019_op-havoc_rep-32 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000133_src-000019_op-havoc_rep-32 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000133_src-000019_op-havoc_rep-32 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000133_src-000019_op-havoc_rep-32 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000134_src-000019_op-havoc_rep-4 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000134_src-000019_op-havoc_rep-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000134_src-000019_op-havoc_rep-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000134_src-000019_op-havoc_rep-4 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000137_src-000019_op-havoc_rep-8 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000137_src-000019_op-havoc_rep-8 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000137_src-000019_op-havoc_rep-8 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000137_src-000019_op-havoc_rep-8 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000139_src-000019_op-havoc_rep-8 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000139_src-000019_op-havoc_rep-8 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000139_src-000019_op-havoc_rep-8 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000139_src-000019_op-havoc_rep-8 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000140_src-000019_op-havoc_rep-4 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000140_src-000019_op-havoc_rep-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000140_src-000019_op-havoc_rep-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000140_src-000019_op-havoc_rep-4 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000141_src-000019_op-havoc_rep-4 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000141_src-000019_op-havoc_rep-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000141_src-000019_op-havoc_rep-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000141_src-000019_op-havoc_rep-4 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000143_src-000019_op-havoc_rep-4 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000143_src-000019_op-havoc_rep-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000143_src-000019_op-havoc_rep-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000143_src-000019_op-havoc_rep-4 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000144_src-000019_op-havoc_rep-2 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000144_src-000019_op-havoc_rep-2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000144_src-000019_op-havoc_rep-2 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000144_src-000019_op-havoc_rep-2 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000145_src-000019_op-havoc_rep-8 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000145_src-000019_op-havoc_rep-8 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000145_src-000019_op-havoc_rep-8 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000145_src-000019_op-havoc_rep-8 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000146_src-000019_op-havoc_rep-8 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000146_src-000019_op-havoc_rep-8 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000146_src-000019_op-havoc_rep-8 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000146_src-000019_op-havoc_rep-8 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000148_src-000019_op-havoc_rep-8 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000148_src-000019_op-havoc_rep-8 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000148_src-000019_op-havoc_rep-8 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000148_src-000019_op-havoc_rep-8 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000150_src-000019_op-havoc_rep-16 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000150_src-000019_op-havoc_rep-16 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000150_src-000019_op-havoc_rep-16 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000150_src-000019_op-havoc_rep-16 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000151_src-000019_op-havoc_rep-4 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000151_src-000019_op-havoc_rep-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000151_src-000019_op-havoc_rep-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000151_src-000019_op-havoc_rep-4 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000152_src-000024_op-flip2_pos-97 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000152_src-000024_op-flip2_pos-97 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000152_src-000024_op-flip2_pos-97 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000152_src-000024_op-flip2_pos-97 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000154_src-000024_op-flip2_pos-1124 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000154_src-000024_op-flip2_pos-1124 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000154_src-000024_op-flip2_pos-1124 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000154_src-000024_op-flip2_pos-1124 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000155_src-000024_op-flip2_pos-1606 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000155_src-000024_op-flip2_pos-1606 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000155_src-000024_op-flip2_pos-1606 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000155_src-000024_op-flip2_pos-1606 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000161_src-000041_op-arith8_pos-0_val-+12 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000161_src-000041_op-arith8_pos-0_val-+12 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000161_src-000041_op-arith8_pos-0_val-+12 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000161_src-000041_op-arith8_pos-0_val-+12 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000163_src-000046_op-flip1_pos-2164 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000163_src-000046_op-flip1_pos-2164 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000163_src-000046_op-flip1_pos-2164 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000163_src-000046_op-flip1_pos-2164 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000165_src-000046_op-flip2_pos-494 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000165_src-000046_op-flip2_pos-494 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000165_src-000046_op-flip2_pos-494 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000165_src-000046_op-flip2_pos-494 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000167_src-000046_op-flip2_pos-1025 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000167_src-000046_op-flip2_pos-1025 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000167_src-000046_op-flip2_pos-1025 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000167_src-000046_op-flip2_pos-1025 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000170_src-000046_op-arith8_pos-3_val--17 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000170_src-000046_op-arith8_pos-3_val--17 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000170_src-000046_op-arith8_pos-3_val--17 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000170_src-000046_op-arith8_pos-3_val--17 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000173_src-000046_op-havoc_rep-16 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000173_src-000046_op-havoc_rep-16 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000173_src-000046_op-havoc_rep-16 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000173_src-000046_op-havoc_rep-16 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000174_src-000091_op-arith8_pos-6_val--24 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000174_src-000091_op-arith8_pos-6_val--24 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000174_src-000091_op-arith8_pos-6_val--24 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000174_src-000091_op-arith8_pos-6_val--24 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000175_src-000091_op-arith8_pos-6_val--25 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000175_src-000091_op-arith8_pos-6_val--25 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000175_src-000091_op-arith8_pos-6_val--25 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000175_src-000091_op-arith8_pos-6_val--25 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000176_src-000123_op-flip1_pos-36 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000176_src-000123_op-flip1_pos-36 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000176_src-000123_op-flip1_pos-36 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000176_src-000123_op-flip1_pos-36 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000177_src-000123_op-flip1_pos-1025 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000177_src-000123_op-flip1_pos-1025 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000177_src-000123_op-flip1_pos-1025 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000177_src-000123_op-flip1_pos-1025 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000179_src-000135_op-flip1_pos-3 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000179_src-000135_op-flip1_pos-3 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000179_src-000135_op-flip1_pos-3 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000179_src-000135_op-flip1_pos-3 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000180_src-000135_op-havoc_rep-64 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000180_src-000135_op-havoc_rep-64 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000180_src-000135_op-havoc_rep-64 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000180_src-000135_op-havoc_rep-64 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000181_src-000159_op-havoc_rep-64 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000181_src-000159_op-havoc_rep-64 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000181_src-000159_op-havoc_rep-64 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000181_src-000159_op-havoc_rep-64 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000182_src-000166_op-flip1_pos-3 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000182_src-000166_op-flip1_pos-3 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000182_src-000166_op-flip1_pos-3 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000182_src-000166_op-flip1_pos-3 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000185_src-000183_op-flip1_pos-3694 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000185_src-000183_op-flip1_pos-3694 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000185_src-000183_op-flip1_pos-3694 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000185_src-000183_op-flip1_pos-3694 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000186_src-000185_op-flip4_pos-278 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000186_src-000185_op-flip4_pos-278 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000186_src-000185_op-flip4_pos-278 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000186_src-000185_op-flip4_pos-278 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000187_src-000026_op-havoc_rep-8 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000187_src-000026_op-havoc_rep-8 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000187_src-000026_op-havoc_rep-8 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000187_src-000026_op-havoc_rep-8 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000188_src-000026_op-havoc_rep-4 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000188_src-000026_op-havoc_rep-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000188_src-000026_op-havoc_rep-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000188_src-000026_op-havoc_rep-4 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000189_src-000026_op-havoc_rep-2 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000189_src-000026_op-havoc_rep-2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000189_src-000026_op-havoc_rep-2 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000189_src-000026_op-havoc_rep-2 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000190_src-000026_op-havoc_rep-16 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000190_src-000026_op-havoc_rep-16 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000190_src-000026_op-havoc_rep-16 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000190_src-000026_op-havoc_rep-16 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000191_src-000026_op-havoc_rep-4 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000191_src-000026_op-havoc_rep-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000191_src-000026_op-havoc_rep-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000191_src-000026_op-havoc_rep-4 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000192_src-000026_op-havoc_rep-8 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000192_src-000026_op-havoc_rep-8 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000192_src-000026_op-havoc_rep-8 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000192_src-000026_op-havoc_rep-8 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000193_src-000026_op-havoc_rep-2 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000193_src-000026_op-havoc_rep-2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000193_src-000026_op-havoc_rep-2 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000193_src-000026_op-havoc_rep-2 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000194_src-000026_op-havoc_rep-16 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000194_src-000026_op-havoc_rep-16 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000194_src-000026_op-havoc_rep-16 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000194_src-000026_op-havoc_rep-16 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000195_src-000026_op-havoc_rep-64 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000195_src-000026_op-havoc_rep-64 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000195_src-000026_op-havoc_rep-64 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000195_src-000026_op-havoc_rep-64 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000197_src-000026_op-havoc_rep-128 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000197_src-000026_op-havoc_rep-128 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000197_src-000026_op-havoc_rep-128 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000197_src-000026_op-havoc_rep-128 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000200_src-000026_op-havoc_rep-4 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000200_src-000026_op-havoc_rep-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000200_src-000026_op-havoc_rep-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000200_src-000026_op-havoc_rep-4 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000202_src-000037_op-flip1_pos-1249 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000202_src-000037_op-flip1_pos-1249 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000202_src-000037_op-flip1_pos-1249 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000202_src-000037_op-flip1_pos-1249 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000203_src-000037_op-flip4_pos-2342 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000203_src-000037_op-flip4_pos-2342 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000203_src-000037_op-flip4_pos-2342 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000203_src-000037_op-flip4_pos-2342 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000204_src-000138_op-flip1_pos-3 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000204_src-000138_op-flip1_pos-3 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000204_src-000138_op-flip1_pos-3 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000204_src-000138_op-flip1_pos-3 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000205_src-000138_op-havoc_rep-4 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000205_src-000138_op-havoc_rep-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000205_src-000138_op-havoc_rep-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000205_src-000138_op-havoc_rep-4 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000206_src-000138_op-havoc_rep-8 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000206_src-000138_op-havoc_rep-8 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000206_src-000138_op-havoc_rep-8 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000206_src-000138_op-havoc_rep-8 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000210_src-000069_op-havoc_rep-16 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000210_src-000069_op-havoc_rep-16 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000210_src-000069_op-havoc_rep-16 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000210_src-000069_op-havoc_rep-16 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000216_src-000069_op-havoc_rep-2 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000216_src-000069_op-havoc_rep-2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000216_src-000069_op-havoc_rep-2 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000216_src-000069_op-havoc_rep-2 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000218_src-000069_op-havoc_rep-8 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000218_src-000069_op-havoc_rep-8 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000218_src-000069_op-havoc_rep-8 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000218_src-000069_op-havoc_rep-8 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000219_src-000069_op-havoc_rep-4 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000219_src-000069_op-havoc_rep-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000219_src-000069_op-havoc_rep-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000219_src-000069_op-havoc_rep-4 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000220_src-000069_op-havoc_rep-2 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000220_src-000069_op-havoc_rep-2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000220_src-000069_op-havoc_rep-2 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000220_src-000069_op-havoc_rep-2 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000222_src-000099_op-havoc_rep-8 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000222_src-000099_op-havoc_rep-8 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000222_src-000099_op-havoc_rep-8 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000222_src-000099_op-havoc_rep-8 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000223_src-000113_op-havoc_rep-8 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000223_src-000113_op-havoc_rep-8 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000223_src-000113_op-havoc_rep-8 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000223_src-000113_op-havoc_rep-8 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000225_src-000142_op-flip1_pos-3 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000225_src-000142_op-flip1_pos-3 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000225_src-000142_op-flip1_pos-3 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000225_src-000142_op-flip1_pos-3 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000226_src-000142_op-havoc_rep-4 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000226_src-000142_op-havoc_rep-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000226_src-000142_op-havoc_rep-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000226_src-000142_op-havoc_rep-4 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000227_src-000167_op-flip1_pos-1844 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000227_src-000167_op-flip1_pos-1844 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000227_src-000167_op-flip1_pos-1844 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000227_src-000167_op-flip1_pos-1844 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000230_src-000189_op-flip2_pos-2 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000230_src-000189_op-flip2_pos-2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000230_src-000189_op-flip2_pos-2 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000230_src-000189_op-flip2_pos-2 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000232_src-000196_op-havoc_rep-4 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000232_src-000196_op-havoc_rep-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000232_src-000196_op-havoc_rep-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000232_src-000196_op-havoc_rep-4 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000234_src-000203_op-havoc_rep-16 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000234_src-000203_op-havoc_rep-16 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000234_src-000203_op-havoc_rep-16 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000234_src-000203_op-havoc_rep-16 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000235_src-000211_op-havoc_rep-2 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000235_src-000211_op-havoc_rep-2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000235_src-000211_op-havoc_rep-2 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000235_src-000211_op-havoc_rep-2 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000237_src-000211_op-havoc_rep-8 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000237_src-000211_op-havoc_rep-8 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000237_src-000211_op-havoc_rep-8 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000237_src-000211_op-havoc_rep-8 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000238_src-000211_op-havoc_rep-16 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000238_src-000211_op-havoc_rep-16 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000238_src-000211_op-havoc_rep-16 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000238_src-000211_op-havoc_rep-16 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000239_src-000211_op-havoc_rep-8 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000239_src-000211_op-havoc_rep-8 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000239_src-000211_op-havoc_rep-8 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000239_src-000211_op-havoc_rep-8 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000240_src-000211_op-havoc_rep-64 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000240_src-000211_op-havoc_rep-64 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000240_src-000211_op-havoc_rep-64 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000240_src-000211_op-havoc_rep-64 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000241_src-000215_op-havoc_rep-16 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000241_src-000215_op-havoc_rep-16 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000241_src-000215_op-havoc_rep-16 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000241_src-000215_op-havoc_rep-16 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000242_src-000215_op-havoc_rep-8 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000242_src-000215_op-havoc_rep-8 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000242_src-000215_op-havoc_rep-8 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000242_src-000215_op-havoc_rep-8 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000243_src-000215_op-havoc_rep-4 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000243_src-000215_op-havoc_rep-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000243_src-000215_op-havoc_rep-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000243_src-000215_op-havoc_rep-4 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000244_src-000215_op-havoc_rep-2 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000244_src-000215_op-havoc_rep-2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000244_src-000215_op-havoc_rep-2 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000244_src-000215_op-havoc_rep-2 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000245_src-000215_op-havoc_rep-4 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000245_src-000215_op-havoc_rep-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000245_src-000215_op-havoc_rep-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000245_src-000215_op-havoc_rep-4 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000246_src-000215_op-havoc_rep-8 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000246_src-000215_op-havoc_rep-8 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000246_src-000215_op-havoc_rep-8 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000246_src-000215_op-havoc_rep-8 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000248_src-000216_op-flip1_pos-2 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000248_src-000216_op-flip1_pos-2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000248_src-000216_op-flip1_pos-2 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000248_src-000216_op-flip1_pos-2 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000250_src-000236_op-flip32_pos-4 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000250_src-000236_op-flip32_pos-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000250_src-000236_op-flip32_pos-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000250_src-000236_op-flip32_pos-4 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000251_src-000238_op-havoc_rep-2 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000251_src-000238_op-havoc_rep-2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000251_src-000238_op-havoc_rep-2 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000251_src-000238_op-havoc_rep-2 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000252_src-000156_op-havoc_rep-8 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000252_src-000156_op-havoc_rep-8 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000252_src-000156_op-havoc_rep-8 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000252_src-000156_op-havoc_rep-8 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000253_src-000241_op-havoc_rep-2 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000253_src-000241_op-havoc_rep-2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000253_src-000241_op-havoc_rep-2 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000253_src-000241_op-havoc_rep-2 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000254_src-000206_op-havoc_rep-4 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000254_src-000206_op-havoc_rep-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000254_src-000206_op-havoc_rep-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000254_src-000206_op-havoc_rep-4 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000255_src-000229_op-flip1_pos-4 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000255_src-000229_op-flip1_pos-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000255_src-000229_op-flip1_pos-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000255_src-000229_op-flip1_pos-4 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000256_src-000237_op-havoc_rep-8 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000256_src-000237_op-havoc_rep-8 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000256_src-000237_op-havoc_rep-8 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000256_src-000237_op-havoc_rep-8 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000257_src-000255_op-havoc_rep-16 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000257_src-000255_op-havoc_rep-16 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000257_src-000255_op-havoc_rep-16 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000257_src-000255_op-havoc_rep-16 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000258_src-000126_op-havoc_rep-8 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000258_src-000126_op-havoc_rep-8 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000258_src-000126_op-havoc_rep-8 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000258_src-000126_op-havoc_rep-8 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000259_src-000172_op-flip1_pos-3 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000259_src-000172_op-flip1_pos-3 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000259_src-000172_op-flip1_pos-3 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000259_src-000172_op-flip1_pos-3 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000260_src-000254_op-flip1_pos-3 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000260_src-000254_op-flip1_pos-3 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000260_src-000254_op-flip1_pos-3 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000260_src-000254_op-flip1_pos-3 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000261_src-000254_op-flip1_pos-46 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000261_src-000254_op-flip1_pos-46 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000261_src-000254_op-flip1_pos-46 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000261_src-000254_op-flip1_pos-46 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000262_src-000232_op-flip2_pos-100 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000262_src-000232_op-flip2_pos-100 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000262_src-000232_op-flip2_pos-100 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000262_src-000232_op-flip2_pos-100 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000263_src-000258_op-flip1_pos-4249 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000263_src-000258_op-flip1_pos-4249 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000263_src-000258_op-flip1_pos-4249 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000263_src-000258_op-flip1_pos-4249 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000265_src-000264_op-flip1_pos-4249 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000265_src-000264_op-flip1_pos-4249 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000265_src-000264_op-flip1_pos-4249 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000265_src-000264_op-flip1_pos-4249 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000267_src-000266_op-flip1_pos-4249 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000267_src-000266_op-flip1_pos-4249 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000267_src-000266_op-flip1_pos-4249 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000267_src-000266_op-flip1_pos-4249 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000269_src-000085_op-havoc_rep-4 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000269_src-000085_op-havoc_rep-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000269_src-000085_op-havoc_rep-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000269_src-000085_op-havoc_rep-4 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000271_src-000262_op-flip2_pos-102 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000271_src-000262_op-flip2_pos-102 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000271_src-000262_op-flip2_pos-102 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000271_src-000262_op-flip2_pos-102 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000272_src-000270_op-arith8_pos-4249_val-+14 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000272_src-000270_op-arith8_pos-4249_val-+14 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000272_src-000270_op-arith8_pos-4249_val-+14 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000272_src-000270_op-arith8_pos-4249_val-+14 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000273_src-000272_op-havoc_rep-4 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000273_src-000272_op-havoc_rep-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000273_src-000272_op-havoc_rep-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000273_src-000272_op-havoc_rep-4 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000275_src-000274_op-flip1_pos-3 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000275_src-000274_op-flip1_pos-3 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000275_src-000274_op-flip1_pos-3 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000275_src-000274_op-flip1_pos-3 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000276_src-000274_op-flip1_pos-271 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000276_src-000274_op-flip1_pos-271 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000276_src-000274_op-flip1_pos-271 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000276_src-000274_op-flip1_pos-271 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000277_src-000274_op-flip1_pos-386 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000277_src-000274_op-flip1_pos-386 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000277_src-000274_op-flip1_pos-386 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000277_src-000274_op-flip1_pos-386 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000278_src-000181_op-havoc_rep-2 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000278_src-000181_op-havoc_rep-2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000278_src-000181_op-havoc_rep-2 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000278_src-000181_op-havoc_rep-2 diff --git a/fuzz/hfuzz_input/deserialize_script/input/id-000279_src-000278_op-havoc_rep-2 b/bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000279_src-000278_op-havoc_rep-2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_script/input/id-000279_src-000278_op-havoc_rep-2 rename to bitcoin/fuzz/hfuzz_input/deserialize_script/input/id-000279_src-000278_op-havoc_rep-2 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/2d1bda85f26c6be89656abe2efcacc9c.00003e4a.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/2d1bda85f26c6be89656abe2efcacc9c.00003e4a.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/2d1bda85f26c6be89656abe2efcacc9c.00003e4a.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/2d1bda85f26c6be89656abe2efcacc9c.00003e4a.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/81018c8ec16dd1760f9345f884bf7884.00002ddb.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/81018c8ec16dd1760f9345f884bf7884.00002ddb.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/81018c8ec16dd1760f9345f884bf7884.00002ddb.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/81018c8ec16dd1760f9345f884bf7884.00002ddb.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/99d1820d217a526f53f014ac738f9f13.000001cc.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/99d1820d217a526f53f014ac738f9f13.000001cc.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/99d1820d217a526f53f014ac738f9f13.000001cc.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/99d1820d217a526f53f014ac738f9f13.000001cc.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/9c997889bc333a763153889a6ef41f9d.00002000.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/9c997889bc333a763153889a6ef41f9d.00002000.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/9c997889bc333a763153889a6ef41f9d.00002000.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/9c997889bc333a763153889a6ef41f9d.00002000.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/ac9bb13a181a013e28827cca4ca6b58b.00001022.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/ac9bb13a181a013e28827cca4ca6b58b.00001022.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/ac9bb13a181a013e28827cca4ca6b58b.00001022.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/ac9bb13a181a013e28827cca4ca6b58b.00001022.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000000_orig-002763ccd013ccf03c63d0bc63d7f000.00000007.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000000_orig-002763ccd013ccf03c63d0bc63d7f000.00000007.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000000_orig-002763ccd013ccf03c63d0bc63d7f000.00000007.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000000_orig-002763ccd013ccf03c63d0bc63d7f000.00000007.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000002_orig-745aa2bf1eb4f96b10a6e86143c9a9b9.0000019e.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000002_orig-745aa2bf1eb4f96b10a6e86143c9a9b9.0000019e.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000002_orig-745aa2bf1eb4f96b10a6e86143c9a9b9.0000019e.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000002_orig-745aa2bf1eb4f96b10a6e86143c9a9b9.0000019e.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000003_orig-0ab99d259c9be939f6dc7076393bec9c.0000000b.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000003_orig-0ab99d259c9be939f6dc7076393bec9c.0000000b.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000003_orig-0ab99d259c9be939f6dc7076393bec9c.0000000b.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000003_orig-0ab99d259c9be939f6dc7076393bec9c.0000000b.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000008_orig-cbae8f9530fd6ce23ddf96240f65e2d9.000007ac.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000008_orig-cbae8f9530fd6ce23ddf96240f65e2d9.000007ac.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000008_orig-cbae8f9530fd6ce23ddf96240f65e2d9.000007ac.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000008_orig-cbae8f9530fd6ce23ddf96240f65e2d9.000007ac.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000011_orig-fd15b185d5abc685014501da4b98b0df.00001ecf.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000011_orig-fd15b185d5abc685014501da4b98b0df.00001ecf.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000011_orig-fd15b185d5abc685014501da4b98b0df.00001ecf.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000011_orig-fd15b185d5abc685014501da4b98b0df.00001ecf.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000012_orig-2125d9ea2ab360351298a9bddfea3e5b.000000af.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000012_orig-2125d9ea2ab360351298a9bddfea3e5b.000000af.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000012_orig-2125d9ea2ab360351298a9bddfea3e5b.000000af.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000012_orig-2125d9ea2ab360351298a9bddfea3e5b.000000af.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000012_orig-febd092ddff9c72cc7e25dab4d0cbd5a.00000323.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000012_orig-febd092ddff9c72cc7e25dab4d0cbd5a.00000323.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000012_orig-febd092ddff9c72cc7e25dab4d0cbd5a.00000323.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000012_orig-febd092ddff9c72cc7e25dab4d0cbd5a.00000323.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000015_orig-a7114a6c122f99cbbed5448562b7a513.000000aa.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000015_orig-a7114a6c122f99cbbed5448562b7a513.000000aa.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000015_orig-a7114a6c122f99cbbed5448562b7a513.000000aa.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000015_orig-a7114a6c122f99cbbed5448562b7a513.000000aa.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000016_orig-0001b0900b48d74067d82b409001b000.00000007.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000016_orig-0001b0900b48d74067d82b409001b000.00000007.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000016_orig-0001b0900b48d74067d82b409001b000.00000007.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000016_orig-0001b0900b48d74067d82b409001b000.00000007.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000017_orig-8530f6c85f51e01782b6e9d970a22f7f.000013b1.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000017_orig-8530f6c85f51e01782b6e9d970a22f7f.000013b1.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000017_orig-8530f6c85f51e01782b6e9d970a22f7f.000013b1.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000017_orig-8530f6c85f51e01782b6e9d970a22f7f.000013b1.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000018_orig-7091449e57d7e974bbd12814f2dace4a.0000002b.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000018_orig-7091449e57d7e974bbd12814f2dace4a.0000002b.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000018_orig-7091449e57d7e974bbd12814f2dace4a.0000002b.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000018_orig-7091449e57d7e974bbd12814f2dace4a.0000002b.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000019_orig-900090847ae00000ba64c09000900000.00000005.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000019_orig-900090847ae00000ba64c09000900000.00000005.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000019_orig-900090847ae00000ba64c09000900000.00000005.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000019_orig-900090847ae00000ba64c09000900000.00000005.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000020_orig-7469f7d107c7fd99f43029ee8c9787e0.00001590.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000020_orig-7469f7d107c7fd99f43029ee8c9787e0.00001590.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000020_orig-7469f7d107c7fd99f43029ee8c9787e0.00001590.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000020_orig-7469f7d107c7fd99f43029ee8c9787e0.00001590.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000023_orig-auto_000043 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000023_orig-auto_000043 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000023_orig-auto_000043 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000023_orig-auto_000043 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000023_orig-cb75435edf707028dd307804fc133fbb.00002000.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000023_orig-cb75435edf707028dd307804fc133fbb.00002000.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000023_orig-cb75435edf707028dd307804fc133fbb.00002000.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000023_orig-cb75435edf707028dd307804fc133fbb.00002000.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000024_orig-bc4caef929c4fe562ce1da2737e3688c.0000002b.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000024_orig-bc4caef929c4fe562ce1da2737e3688c.0000002b.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000024_orig-bc4caef929c4fe562ce1da2737e3688c.0000002b.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000024_orig-bc4caef929c4fe562ce1da2737e3688c.0000002b.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000028_orig-da420ddf8a5b5f69df89af72278b7eea.00000015.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000028_orig-da420ddf8a5b5f69df89af72278b7eea.00000015.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000028_orig-da420ddf8a5b5f69df89af72278b7eea.00000015.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000028_orig-da420ddf8a5b5f69df89af72278b7eea.00000015.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000029_orig-e4e83fa44f6fe9836f08b12e0d8e188a.000006f4.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000029_orig-e4e83fa44f6fe9836f08b12e0d8e188a.000006f4.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000029_orig-e4e83fa44f6fe9836f08b12e0d8e188a.000006f4.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000029_orig-e4e83fa44f6fe9836f08b12e0d8e188a.000006f4.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000041_orig-fafb191376bf650083767ba57a6560f3.00000081.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000041_orig-fafb191376bf650083767ba57a6560f3.00000081.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000041_orig-fafb191376bf650083767ba57a6560f3.00000081.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000041_orig-fafb191376bf650083767ba57a6560f3.00000081.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000043_orig-53b59d89e4b4a8f9bfaf8e6585044b53.00000063.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000043_orig-53b59d89e4b4a8f9bfaf8e6585044b53.00000063.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000043_orig-53b59d89e4b4a8f9bfaf8e6585044b53.00000063.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000043_orig-53b59d89e4b4a8f9bfaf8e6585044b53.00000063.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000045_orig-4a108700000029838ddc73d910000000.0000000a.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000045_orig-4a108700000029838ddc73d910000000.0000000a.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000045_orig-4a108700000029838ddc73d910000000.0000000a.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000045_orig-4a108700000029838ddc73d910000000.0000000a.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000047_orig-f286eecdb14369a68b60c9dfa2bd7561.0000003b.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000047_orig-f286eecdb14369a68b60c9dfa2bd7561.0000003b.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000047_orig-f286eecdb14369a68b60c9dfa2bd7561.0000003b.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000047_orig-f286eecdb14369a68b60c9dfa2bd7561.0000003b.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000050_orig-919cb2dd5670000046ed82fcb1200000.00000005.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000050_orig-919cb2dd5670000046ed82fcb1200000.00000005.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000050_orig-919cb2dd5670000046ed82fcb1200000.00000005.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000050_orig-919cb2dd5670000046ed82fcb1200000.00000005.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000051_orig-990000001456c00006d4500000990000.00000006.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000051_orig-990000001456c00006d4500000990000.00000006.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000051_orig-990000001456c00006d4500000990000.00000006.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000051_orig-990000001456c00006d4500000990000.00000006.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000052_orig-000000008ddd50008ddd500000000000.00000006.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000052_orig-000000008ddd50008ddd500000000000.00000006.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000052_orig-000000008ddd50008ddd500000000000.00000006.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000052_orig-000000008ddd50008ddd500000000000.00000006.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000053_orig-00f9c95959300000f95959c930000000.00000005.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000053_orig-00f9c95959300000f95959c930000000.00000005.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000053_orig-00f9c95959300000f95959c930000000.00000005.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000053_orig-00f9c95959300000f95959c930000000.00000005.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000054_orig-649e8b804eaa54943b1d7b1d50b246e6.00000010.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000054_orig-649e8b804eaa54943b1d7b1d50b246e6.00000010.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000054_orig-649e8b804eaa54943b1d7b1d50b246e6.00000010.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000054_orig-649e8b804eaa54943b1d7b1d50b246e6.00000010.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000057_orig-8ddec9bd500000008da9bebd50000000.00000004.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000057_orig-8ddec9bd500000008da9bebd50000000.00000004.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000057_orig-8ddec9bd500000008da9bebd50000000.00000004.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000057_orig-8ddec9bd500000008da9bebd50000000.00000004.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000057_orig-id-000095_src-000000+000044_op-splice_rep-64 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000057_orig-id-000095_src-000000+000044_op-splice_rep-64 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000057_orig-id-000095_src-000000+000044_op-splice_rep-64 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000057_orig-id-000095_src-000000+000044_op-splice_rep-64 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000060_orig-c5d936add940000089cdb63915c00000.00000005.honggfuzz.cov b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000060_orig-c5d936add940000089cdb63915c00000.00000005.honggfuzz.cov similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000060_orig-c5d936add940000089cdb63915c00000.00000005.honggfuzz.cov rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000060_orig-c5d936add940000089cdb63915c00000.00000005.honggfuzz.cov diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000060_orig-id-000101_src-000002_op-flip2_pos-6 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000060_orig-id-000101_src-000002_op-flip2_pos-6 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000060_orig-id-000101_src-000002_op-flip2_pos-6 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000060_orig-id-000101_src-000002_op-flip2_pos-6 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000061_orig-id-000107_src-000002_op-int16_pos-4773_val-+1000 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000061_orig-id-000107_src-000002_op-int16_pos-4773_val-+1000 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000061_orig-id-000107_src-000002_op-int16_pos-4773_val-+1000 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000061_orig-id-000107_src-000002_op-int16_pos-4773_val-+1000 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000062_orig-id-000060_src-000000_op-havoc_rep-64 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000062_orig-id-000060_src-000000_op-havoc_rep-64 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000062_orig-id-000060_src-000000_op-havoc_rep-64 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000062_orig-id-000060_src-000000_op-havoc_rep-64 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000072_src-000000_op-havoc_rep-16 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000072_src-000000_op-havoc_rep-16 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000072_src-000000_op-havoc_rep-16 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000072_src-000000_op-havoc_rep-16 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000074_src-000000_op-havoc_rep-8 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000074_src-000000_op-havoc_rep-8 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000074_src-000000_op-havoc_rep-8 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000074_src-000000_op-havoc_rep-8 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000076_src-000000_op-havoc_rep-128 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000076_src-000000_op-havoc_rep-128 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000076_src-000000_op-havoc_rep-128 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000076_src-000000_op-havoc_rep-128 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000077_src-000000_op-havoc_rep-128 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000077_src-000000_op-havoc_rep-128 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000077_src-000000_op-havoc_rep-128 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000077_src-000000_op-havoc_rep-128 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000080_src-000000_op-havoc_rep-32 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000080_src-000000_op-havoc_rep-32 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000080_src-000000_op-havoc_rep-32 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000080_src-000000_op-havoc_rep-32 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000082_src-000000_op-havoc_rep-4 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000082_src-000000_op-havoc_rep-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000082_src-000000_op-havoc_rep-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000082_src-000000_op-havoc_rep-4 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000084_src-000000+000044_op-splice_rep-8 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000084_src-000000+000044_op-splice_rep-8 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000084_src-000000+000044_op-splice_rep-8 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000084_src-000000+000044_op-splice_rep-8 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000087_src-000000_op-havoc_rep-64 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000087_src-000000_op-havoc_rep-64 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000087_src-000000_op-havoc_rep-64 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000087_src-000000_op-havoc_rep-64 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000088_src-000000+000010_op-splice_rep-128 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000088_src-000000+000010_op-splice_rep-128 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000088_src-000000+000010_op-splice_rep-128 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000088_src-000000+000010_op-splice_rep-128 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000088_src-000000_op-havoc_rep-2 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000088_src-000000_op-havoc_rep-2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000088_src-000000_op-havoc_rep-2 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000088_src-000000_op-havoc_rep-2 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000089_src-000003_op-flip1_pos-43 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000089_src-000003_op-flip1_pos-43 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000089_src-000003_op-flip1_pos-43 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000089_src-000003_op-flip1_pos-43 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000090_src-000003_op-flip1_pos-3258 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000090_src-000003_op-flip1_pos-3258 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000090_src-000003_op-flip1_pos-3258 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000090_src-000003_op-flip1_pos-3258 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000091_src-000003_op-flip2_pos-1612 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000091_src-000003_op-flip2_pos-1612 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000091_src-000003_op-flip2_pos-1612 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000091_src-000003_op-flip2_pos-1612 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000092_src-000003_op-flip8_pos-84 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000092_src-000003_op-flip8_pos-84 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000092_src-000003_op-flip8_pos-84 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000092_src-000003_op-flip8_pos-84 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000093_src-000002_op-flip1_pos-535 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000093_src-000002_op-flip1_pos-535 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000093_src-000002_op-flip1_pos-535 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000093_src-000002_op-flip1_pos-535 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000095_src-000003_op-arith16_pos-1118_val--5 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000095_src-000003_op-arith16_pos-1118_val--5 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000095_src-000003_op-arith16_pos-1118_val--5 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000095_src-000003_op-arith16_pos-1118_val--5 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000096_src-000007_op-int32_pos-2110_val-+1024 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000096_src-000007_op-int32_pos-2110_val-+1024 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000096_src-000007_op-int32_pos-2110_val-+1024 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000096_src-000007_op-int32_pos-2110_val-+1024 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000097_src-000000+000010_op-splice_rep-64 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000097_src-000000+000010_op-splice_rep-64 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000097_src-000000+000010_op-splice_rep-64 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000097_src-000000+000010_op-splice_rep-64 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000097_src-000007_op-havoc_rep-2 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000097_src-000007_op-havoc_rep-2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000097_src-000007_op-havoc_rep-2 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000097_src-000007_op-havoc_rep-2 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000098_src-000025_op-arith8_pos-6_val--30 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000098_src-000025_op-arith8_pos-6_val--30 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000098_src-000025_op-arith8_pos-6_val--30 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000098_src-000025_op-arith8_pos-6_val--30 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000099_src-000051_op-flip1_pos-698 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000099_src-000051_op-flip1_pos-698 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000099_src-000051_op-flip1_pos-698 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000099_src-000051_op-flip1_pos-698 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000100_src-000053_op-int16_pos-370_val-+1024 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000100_src-000053_op-int16_pos-370_val-+1024 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000100_src-000053_op-int16_pos-370_val-+1024 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000100_src-000053_op-int16_pos-370_val-+1024 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000101_src-000053_op-int32_pos-111_val-+1024 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000101_src-000053_op-int32_pos-111_val-+1024 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000101_src-000053_op-int32_pos-111_val-+1024 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000101_src-000053_op-int32_pos-111_val-+1024 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000103_src-000073_op-flip1_pos-181 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000103_src-000073_op-flip1_pos-181 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000103_src-000073_op-flip1_pos-181 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000103_src-000073_op-flip1_pos-181 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000106_src-000076_op-flip1_pos-57 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000106_src-000076_op-flip1_pos-57 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000106_src-000076_op-flip1_pos-57 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000106_src-000076_op-flip1_pos-57 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000107_src-000076_op-int32_pos-58_val-+1000 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000107_src-000076_op-int32_pos-58_val-+1000 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000107_src-000076_op-int32_pos-58_val-+1000 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000107_src-000076_op-int32_pos-58_val-+1000 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000108_src-000096_op-havoc_rep-8 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000108_src-000096_op-havoc_rep-8 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000108_src-000096_op-havoc_rep-8 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000108_src-000096_op-havoc_rep-8 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000114_src-000002_op-havoc_rep-64 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000114_src-000002_op-havoc_rep-64 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000114_src-000002_op-havoc_rep-64 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000114_src-000002_op-havoc_rep-64 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000114_src-000107_op-havoc_rep-32 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000114_src-000107_op-havoc_rep-32 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000114_src-000107_op-havoc_rep-32 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000114_src-000107_op-havoc_rep-32 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000115_src-000107_op-havoc_rep-32 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000115_src-000107_op-havoc_rep-32 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000115_src-000107_op-havoc_rep-32 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000115_src-000107_op-havoc_rep-32 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000116_src-000111_op-int16_pos-58_val-+512 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000116_src-000111_op-int16_pos-58_val-+512 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000116_src-000111_op-int16_pos-58_val-+512 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000116_src-000111_op-int16_pos-58_val-+512 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000117_src-000052_op-int16_pos-1595_val-+512 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000117_src-000052_op-int16_pos-1595_val-+512 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000117_src-000052_op-int16_pos-1595_val-+512 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000117_src-000052_op-int16_pos-1595_val-+512 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000118_src-000002_op-havoc_rep-64 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000118_src-000002_op-havoc_rep-64 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000118_src-000002_op-havoc_rep-64 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000118_src-000002_op-havoc_rep-64 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000118_src-000062_op-int16_pos-427_val-be-+100 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000118_src-000062_op-int16_pos-427_val-be-+100 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000118_src-000062_op-int16_pos-427_val-be-+100 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000118_src-000062_op-int16_pos-427_val-be-+100 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000119_src-000085_op-arith8_pos-15196_val-+11 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000119_src-000085_op-arith8_pos-15196_val-+11 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000119_src-000085_op-arith8_pos-15196_val-+11 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000119_src-000085_op-arith8_pos-15196_val-+11 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000122_src-000016_op-int16_pos-6_val-be-+127 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000122_src-000016_op-int16_pos-6_val-be-+127 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000122_src-000016_op-int16_pos-6_val-be-+127 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000122_src-000016_op-int16_pos-6_val-be-+127 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000124_src-000119_op-arith8_pos-584_val-+10 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000124_src-000119_op-arith8_pos-584_val-+10 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000124_src-000119_op-arith8_pos-584_val-+10 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000124_src-000119_op-arith8_pos-584_val-+10 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000125_src-000020_op-flip1_pos-1946 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000125_src-000020_op-flip1_pos-1946 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000125_src-000020_op-flip1_pos-1946 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000125_src-000020_op-flip1_pos-1946 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000127_src-000072_op-havoc_rep-4 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000127_src-000072_op-havoc_rep-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000127_src-000072_op-havoc_rep-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000127_src-000072_op-havoc_rep-4 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000129_src-000128_op-int32_pos-406_val-be-+512 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000129_src-000128_op-int32_pos-406_val-be-+512 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000129_src-000128_op-int32_pos-406_val-be-+512 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000129_src-000128_op-int32_pos-406_val-be-+512 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000130_src-000076_op-flip1_pos-6 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000130_src-000076_op-flip1_pos-6 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000130_src-000076_op-flip1_pos-6 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000130_src-000076_op-flip1_pos-6 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000130_src-000129_op-havoc_rep-16 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000130_src-000129_op-havoc_rep-16 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000130_src-000129_op-havoc_rep-16 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000130_src-000129_op-havoc_rep-16 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000131_src-000068_op-flip2_pos-43 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000131_src-000068_op-flip2_pos-43 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000131_src-000068_op-flip2_pos-43 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000131_src-000068_op-flip2_pos-43 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000132_src-000097+000109_op-splice_rep-4 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000132_src-000097+000109_op-splice_rep-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000132_src-000097+000109_op-splice_rep-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000132_src-000097+000109_op-splice_rep-4 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000133_src-000027+000052_op-splice_rep-8 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000133_src-000027+000052_op-splice_rep-8 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000133_src-000027+000052_op-splice_rep-8 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000133_src-000027+000052_op-splice_rep-8 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000134_src-000060+000111_op-splice_rep-4 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000134_src-000060+000111_op-splice_rep-4 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000134_src-000060+000111_op-splice_rep-4 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000134_src-000060+000111_op-splice_rep-4 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000137_src-000047+000127_op-splice_rep-16 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000137_src-000047+000127_op-splice_rep-16 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000137_src-000047+000127_op-splice_rep-16 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000137_src-000047+000127_op-splice_rep-16 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000140_src-000090_op-arith16_pos-114_val-be--6 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000140_src-000090_op-arith16_pos-114_val-be--6 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000140_src-000090_op-arith16_pos-114_val-be--6 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000140_src-000090_op-arith16_pos-114_val-be--6 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000142_src-000123_op-flip1_pos-92 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000142_src-000123_op-flip1_pos-92 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000142_src-000123_op-flip1_pos-92 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000142_src-000123_op-flip1_pos-92 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000144_src-000121_op-flip2_pos-743 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000144_src-000121_op-flip2_pos-743 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000144_src-000121_op-flip2_pos-743 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000144_src-000121_op-flip2_pos-743 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000166_sync-deserialize_transaction_master_src-000136 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000166_sync-deserialize_transaction_master_src-000136 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000166_sync-deserialize_transaction_master_src-000136 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000166_sync-deserialize_transaction_master_src-000136 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000176_sync-deserialize_transaction_2_src-000163 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000176_sync-deserialize_transaction_2_src-000163 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000176_sync-deserialize_transaction_2_src-000163 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000176_sync-deserialize_transaction_2_src-000163 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000176_sync-deserialize_transaction_master_src-000128 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000176_sync-deserialize_transaction_master_src-000128 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000176_sync-deserialize_transaction_master_src-000128 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000176_sync-deserialize_transaction_master_src-000128 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000188_sync-deserialize_transaction_master_src-000172 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000188_sync-deserialize_transaction_master_src-000172 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000188_sync-deserialize_transaction_master_src-000172 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000188_sync-deserialize_transaction_master_src-000172 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000190_sync-deserialize_transaction_master_src-000171 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000190_sync-deserialize_transaction_master_src-000171 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000190_sync-deserialize_transaction_master_src-000171 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000190_sync-deserialize_transaction_master_src-000171 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000194_src-000154_op-havoc_rep-32 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000194_src-000154_op-havoc_rep-32 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000194_src-000154_op-havoc_rep-32 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000194_src-000154_op-havoc_rep-32 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000196_sync-deserialize_transaction_2_src-000177 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000196_sync-deserialize_transaction_2_src-000177 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000196_sync-deserialize_transaction_2_src-000177 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000196_sync-deserialize_transaction_2_src-000177 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000199_sync-deserialize_transaction_0_src-000190 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000199_sync-deserialize_transaction_0_src-000190 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000199_sync-deserialize_transaction_0_src-000190 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000199_sync-deserialize_transaction_0_src-000190 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000202_src-000173_op-arith8_pos-178_val--2 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000202_src-000173_op-arith8_pos-178_val--2 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000202_src-000173_op-arith8_pos-178_val--2 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000202_src-000173_op-arith8_pos-178_val--2 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000202_sync-deserialize_transaction_master_src-000162 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000202_sync-deserialize_transaction_master_src-000162 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000202_sync-deserialize_transaction_master_src-000162 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000202_sync-deserialize_transaction_master_src-000162 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000209_sync-deserialize_transaction_3_src-000202 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000209_sync-deserialize_transaction_3_src-000202 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000209_sync-deserialize_transaction_3_src-000202 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000209_sync-deserialize_transaction_3_src-000202 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000213_sync-deserialize_transaction_3_src-000206 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000213_sync-deserialize_transaction_3_src-000206 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000213_sync-deserialize_transaction_3_src-000206 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000213_sync-deserialize_transaction_3_src-000206 diff --git a/fuzz/hfuzz_input/deserialize_transaction/input/id-000226_sync-deserialize_transaction_2_src-000216 b/bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000226_sync-deserialize_transaction_2_src-000216 similarity index 100% rename from fuzz/hfuzz_input/deserialize_transaction/input/id-000226_sync-deserialize_transaction_2_src-000216 rename to bitcoin/fuzz/hfuzz_input/deserialize_transaction/input/id-000226_sync-deserialize_transaction_2_src-000216 diff --git a/fuzz/travis-fuzz.sh b/bitcoin/fuzz/travis-fuzz.sh similarity index 100% rename from fuzz/travis-fuzz.sh rename to bitcoin/fuzz/travis-fuzz.sh diff --git a/contrib/test.sh b/contrib/test.sh index 30483824..2de2f1be 100755 --- a/contrib/test.sh +++ b/contrib/test.sh @@ -2,7 +2,7 @@ set -ex -CRATES="bitcoin" +CRATES="bitcoin hashes" for crate in ${CRATES} do diff --git a/hashes/CHANGELOG.md b/hashes/CHANGELOG.md new file mode 100644 index 00000000..00cc3a73 --- /dev/null +++ b/hashes/CHANGELOG.md @@ -0,0 +1,163 @@ +# Unreleased (0.12.0) + +Move crate from [original repo](https://github.com/rust-bitcoin/bitcoin_hashes) to the +`rust-bitcoin` repository. Commit history was lost during move, for commit history see the original +repository. Tip of bitcoin_hashes:master at time of import: 54c16249e06cc6b7870c7fc07d90f489d82647c7 + + +# 0.11.0 - 2022-06-25 + +The major change in this version is the increase of the Minimum Supported Rust Version (MSRV) from +1.29 to 1.41.1. This is a big change because it introduces Rust Edition 2018 to the codebase along +with all the benefits that brings. We also did a bunch of optimisations to speed up encoding and +decoding hex strings. + +## Breaking changes + +* [Enable edition 2018 and bump MSRV to Rust 1.41.1](https://github.com/rust-bitcoin/bitcoin_hashes/pull/136) + +## New features/APIs + +* [Add `all_zeros` to `Hash` trait](https://github.com/rust-bitcoin/bitcoin_hashes/pull/148) +* [Implement `Write` on `HmacEngine`](https://github.com/rust-bitcoin/bitcoin_hashes/pull/133) +* [Introduce `HexWriter`](https://github.com/rust-bitcoin/bitcoin_hashes/pull/156), makes serialising hex faster +* [Implement `Read` on `HexIterator`](https://github.com/rust-bitcoin/bitcoin_hashes/pull/135), makes deserialising hex faster + +## Other improvements + +* Use `rotate_left` [instead of custom macro](https://github.com/rust-bitcoin/bitcoin_hashes/pull/162) +* [Enable clippy on CI](https://github.com/rust-bitcoin/bitcoin_hashes/pull/152) +* Various docs fixes +* [Improve feature test coverage](https://github.com/rust-bitcoin/bitcoin_hashes/pull/147) +* [Add a disabled `rustfmt.toml`](https://github.com/rust-bitcoin/bitcoin_hashes/pull/141) to improve interaction with auto-formatting in editors + + +# 0.10.0 - 2021-07-05 + +* Increase `core2` to released version of 0.3.0 + +# 0.9.7 - 2021-06-17 + +* Introduce `alloc` feature and `core2` dependency for nostd support (this feature has MSRV of 1.36 rather than 1.29) + +# 0.9.6 - 2021-05-03 + +* Re-export `core` as `_export::_core`. This resolves an issue when calling several exported macros with the `std` feature. + +# 0.9.5 - 2021-04-28 + +* Add [`#[repr(transparent)]` to all newtype wrappers](https://github.com/rust-bitcoin/bitcoin_hashes/pull/108/) +* Add [missing `#derive`s](https://github.com/rust-bitcoin/bitcoin_hashes/pull/110/) +* Replace `fuzztarget` feature with [use of `cfg(fuzzing)`](https://github.com/rust-bitcoin/bitcoin_hashes/pull/111/) +* Use [`core` rather than `std`](https://github.com/rust-bitcoin/bitcoin_hashes/pull/118/) and [fix `no_std` compilation](https://github.com/rust-bitcoin/bitcoin_hashes/pull/122/) + +Note that we have stopped re-exporting the `core` crate when compiling without `std`. This is technically a breaking change but it is hard to imagine what user might be affected. + +# 0.9.4 - 2020-10-23 + +* Add `Hmac::from_inner_engines` + +# 0.9.3 - 2020-10-19 + +* More serde macro fixes + +# 0.9.2 - 2020-10-18 + +* Fix rustc 1.29.0 downstream issues with serde macros + +# 0.9.2 - 2020-10-16 + +* Fix visibility issue with serde macros + +# 0.9.1 - 2020-10-07 + +* Add `FromStr` impl to `sha256t::Hash` +* Fix `Hash::engine()` implementation for hash newtypes +* Add `sha256t_hash_newtype!` macro for creating tagged hashes + +# 0.9.0 - 2020-08-27 + +* **Update MSRV to 1.29.0** + +# 0.8.0 - 2020-08-26 + +* Add `as_inner` method to `Hash` trait +* Add `n_bytes_hashed` to `HashEngine` trait + +# 0.7.6 - 2020-04-05 + +* Support hash newtypes with reversed hex serialization. + +# 0.7.5 - 2020-04-02 + +* Add `sha256t` module for SHA-256-based tagged hashes. +* Add `FromStr` for hash newtypes. +* Add `from_hash` for hash newtypes. + +# 0.7.3 - 2019-12-18 + +* Add `as_hash(&self) -> ` method to hash newtypes. + +# 0.7.2 - 2019-11-29 + +* Make the inner variable of `sha256::Midstat` public +* Drop the `byteorder` dependency in favor of manual endianness implementations +(later this will be in stdlib so we can drop even that) +* Fix the `hash_newtype` macro, which did not compile before + +# 0.7.1 - 2019-08-14 + +* Add hash_newtype macro that allows third parties to create newtype structs. + +# 0.7.0 - 2019-07-19 + +* Add `hex::Error` type for errors generated by the `hex` module. + +# 0.6.0 - 2019-07-10 + +* Add `no_std` support, rearrange traits to not depend on `io::Write` + +# 0.5.0 - 2019-06-28 + +* Fix panic when parsing hashes that contain multibyte characters +* Add `FromStr` to all hashes which hex-parses them + +# 0.4.0 - 2019-06-23 + +* [Add `from_inner` method](https://github.com/rust-bitcoin/bitcoin_hashes/pull/20) to all hashes +* [Update `FromHex` trait](https://github.com/rust-bitcoin/bitcoin_hashes/pull/40) to require `from_byte_iter` method rather than `from_hex` be implemented +* Make `Hmac` midstate [an actual HMAC midstate](https://github.com/rust-bitcoin/bitcoin_hashes/pull/43) +* Allow `Display` [of truncated hashes](https://github.com/rust-bitcoin/bitcoin_hashes/pull/9) +* Require [using a constructor for `HexIterator`](https://github.com/rust-bitcoin/bitcoin_hashes/pull/44) and then [clean up the internals](https://github.com/rust-bitcoin/bitcoin_hashes/pull/47) +* [Strongly type `sha256::Midstate`](https://github.com/rust-bitcoin/bitcoin_hashes/pull/39) to allow independent serialization +* Add [siphash24 module](https://github.com/rust-bitcoin/bitcoin_hashes/pull/46) + +# 0.3.2 - 2019-03-20 + +* Implement the `FromHex` trait on [many more types](https://github.com/rust-bitcoin/bitcoin_hashes/pull/38) + +# 0.3.1 - 2019-03-04 + +* [Fix serde serialization](https://github.com/rust-bitcoin/bitcoin_hashes/pull/36) + +# 0.3.0 - 2019-01-23 + +* Bump minimum required rustc version to 1.22.0 +* Fixed serde deserialization into owned string that previously caused panics + when doing round-trip (de)serialization +* `HashEngine::block_size()` and `Hash::len()` are now associated constants + `HashEngine::BLOCK_SIZE` and `Hash::LEN` +* Removed `block_size()` method from `Hash` trait. It is still available as + `::Engine::BLOCK_SIZE` + +# 0.2.0 - 2019-01-15 + +* Add a constant-time comparison function +* Simplify `io::Write::write` implementations by having them do only partial writes +* Add fuzzing support +* Allow `Hash`es to be borrowed as `[u8]` +* Replace public `Hash` inners with `into_inner` method + +# 0.1.0 - 2018-12-08 + +* Initial release diff --git a/hashes/Cargo.toml b/hashes/Cargo.toml new file mode 100644 index 00000000..419d2c94 --- /dev/null +++ b/hashes/Cargo.toml @@ -0,0 +1,41 @@ +[package] +name = "bitcoin_hashes" +version = "0.11.0" +authors = ["Andrew Poelstra "] +license = "CC0-1.0" +description = "Hash functions used by rust-bitcoin which support rustc 1.41.1" +homepage = "https://github.com/rust-bitcoin/bitcoin_hashes/" +repository = "https://github.com/rust-bitcoin/bitcoin_hashes/" +documentation = "https://docs.rs/bitcoin_hashes/" +keywords = [ "crypto", "bitcoin", "hash", "digest" ] +readme = "README.md" +edition = "2018" + +[features] +default = ["std"] +std = [] +schemars = ["actual-schemars", "dyn-clone"] +# If you disable std, you can still use a Write trait via the core2 feature. +# You can also use ToHex via the alloc feature, as it requires Vec/String. +# And you can still just disable std by disabling default features, without enabling these two. +alloc = ["core2/alloc"] +serde-std = ["serde/std"] + +[dependencies] +# Only enable this if you explicitly do not want to use "std", otherwise enable "serde-std". +serde = { version = "1.0", default-features = false, optional = true } +# Only enable this if you explicitly do not want to use an allocator, otherwise enable "alloc". +core2 = { version = "0.3.0", optional = true, default_features = false } + +# Do NOT use this as a feature! Use the `schemars` feature instead. Can only be used with "std" enabled. +actual-schemars = { package = "schemars", version = "<=0.8.3", optional = true } +# Do NOT enable this dependency, this is just to pin dyn-clone (transitive dep from schemars) +# because 1.0.8 does not build with Rust 1.41.1 (because of useage of `Arc::as_ptr`). +dyn-clone = { version = "<=1.0.7", default_features = false, optional = true } + +[dev-dependencies] +serde_test = "1.0" +serde_json = "1.0" + +[target.wasm32-unknown-unknown.dev-dependencies] +wasm-bindgen-test = "0.3" diff --git a/hashes/README.md b/hashes/README.md new file mode 100644 index 00000000..96a04080 --- /dev/null +++ b/hashes/README.md @@ -0,0 +1,34 @@ +[![Status](https://travis-ci.org/rust-bitcoin/bitcoin_hashes.png?branch=master)](https://travis-ci.org/rust-bitcoin/bitcoin_hashes) + +# Bitcoin Hashes Library + +This is a simple, no-dependency library which implements the hash functions +needed by Bitcoin. These are SHA1, SHA256, SHA256d, SHA512, and RIPEMD160. As an +ancilliary thing, it exposes hexadecimal serialization and deserialization, +since these are needed to display hashes anway. + +[Documentation](https://docs.rs/bitcoin_hashes/) + +## Minimum Supported Rust Version (MSRV) + +This library should always compile with any combination of features on **Rust 1.41.1**. + +## Contributions + +Contributions are welcome, including additional hash function implementations. + +### Githooks + +To assist devs in catching errors _before_ running CI we provide some githooks. If you do not +already have locally configured githooks you can use the ones in this repository by running, in the +root directory of the repository: +``` +git config --local core.hooksPath githooks/ +``` + +Alternatively add symlinks in your `.git/hooks` directory to any of the githooks we provide. + +### Running Benchmarks + +We use a custom Rust compiler configuration conditional to guard the bench mark code. To run the +bench marks use: `RUSTFLAGS='--cfg=bench' cargo +nightly bench`. diff --git a/hashes/contrib/test.sh b/hashes/contrib/test.sh new file mode 100755 index 00000000..6cf1e764 --- /dev/null +++ b/hashes/contrib/test.sh @@ -0,0 +1,93 @@ +#!/bin/sh -ex + +FEATURES="serde serde-std std core2" + +if [ "$DO_ALLOC_TESTS" = true ]; then + FEATURES="$FEATURES alloc" +fi + +cargo --version +rustc --version + +# Work out if we are using a nightly toolchain. +NIGHTLY=false +if cargo --version | grep nightly >/dev/null; then + NIGHTLY=true +fi + +# Make all cargo invocations verbose +export CARGO_TERM_VERBOSE=true + +# Defaults / sanity checks +cargo build --all +cargo test --all + +if [ "$DO_FEATURE_MATRIX" = true ]; then + cargo build --all --no-default-features + cargo test --all --no-default-features + + # All features + cargo build --all --no-default-features --features="$FEATURES" + cargo test --all --no-default-features --features="$FEATURES" + # Single features + for feature in ${FEATURES} + do + cargo build --all --no-default-features --features="$feature" + cargo test --all --no-default-features --features="$feature" + # All combos of two features + for featuretwo in ${FEATURES}; do + cargo build --all --no-default-features --features="$feature $featuretwo" + cargo test --all --no-default-features --features="$feature $featuretwo" + done + done + + # Other combos + cargo test --all --no-default-features --features="std,schemars" +fi + +if [ "$DO_SCHEMARS_TESTS" = true ]; then + (cd extended_tests/schemars && cargo test) +fi + +# Build the docs if told to (this only works with the nightly toolchain) +if [ "$DO_DOCS" = true ]; then + RUSTDOCFLAGS="--cfg docsrs" cargo doc --all --features="$FEATURES" +fi + +# Webassembly stuff +if [ "$DO_WASM" = true ]; then + clang --version && + CARGO_TARGET_DIR=wasm cargo install --force wasm-pack && + printf '\n[lib]\ncrate-type = ["cdylib", "rlib"]\n' >> Cargo.toml && + CC=clang-9 wasm-pack build && + CC=clang-9 wasm-pack test --node; +fi + +# Address Sanitizer +if [ "$DO_ASAN" = true ]; then + cargo clean + CC='clang -fsanitize=address -fno-omit-frame-pointer' \ + RUSTFLAGS='-Zsanitizer=address -Clinker=clang -Cforce-frame-pointers=yes' \ + ASAN_OPTIONS='detect_leaks=1 detect_invalid_pointer_pairs=1 detect_stack_use_after_return=1' \ + cargo test --lib --all --no-default-features --features="$FEATURES" -Zbuild-std --target x86_64-unknown-linux-gnu + cargo clean + CC='clang -fsanitize=memory -fno-omit-frame-pointer' \ + RUSTFLAGS='-Zsanitizer=memory -Zsanitizer-memory-track-origins -Cforce-frame-pointers=yes' \ + cargo test --lib --all --no-default-features --features="$FEATURES" -Zbuild-std --target x86_64-unknown-linux-gnu +fi + +# Bench if told to, only works with non-stable toolchain (nightly, beta). +if [ "$DO_BENCH" = true ] +then + if [ "$NIGHTLY" = false ] + then + if [ -n "$RUSTUP_TOOLCHAIN" ] + then + echo "RUSTUP_TOOLCHAIN is set to a non-nightly toolchain but DO_BENCH requires a nightly toolchain" + else + echo "DO_BENCH requires a nightly toolchain" + fi + exit 1 + fi + RUSTFLAGS='--cfg=bench' cargo bench +fi diff --git a/hashes/embedded/Cargo.toml b/hashes/embedded/Cargo.toml new file mode 100644 index 00000000..87a1aaca --- /dev/null +++ b/hashes/embedded/Cargo.toml @@ -0,0 +1,32 @@ +[package] +authors = ["Riccardo Casatta "] +edition = "2018" +readme = "README.md" +name = "embedded" +version = "0.1.0" + +# Prevent this from interfering with workspaces +[workspace] +members = ["."] + +[features] +alloc = ["alloc-cortex-m", "bitcoin_hashes/alloc"] + +[dependencies] +cortex-m = "0.6.0" +cortex-m-rt = "0.6.10" +cortex-m-semihosting = "0.3.3" +panic-halt = "0.2.0" +alloc-cortex-m = { version = "0.4.1", optional = true } +bitcoin_hashes = { path="../", default-features = false, features = ["core2"] } +core2 = { version = "0.3.0", default_features = false } + +[[bin]] +name = "embedded" +test = false +bench = false + +[profile.release] +codegen-units = 1 # better optimizations +debug = true # symbols are nice and they don't increase the size on Flash +lto = true # better optimizations diff --git a/hashes/embedded/memory.x b/hashes/embedded/memory.x new file mode 100644 index 00000000..95de161b --- /dev/null +++ b/hashes/embedded/memory.x @@ -0,0 +1,5 @@ +MEMORY +{ + FLASH : ORIGIN = 0x00000000, LENGTH = 256K + RAM : ORIGIN = 0x20000000, LENGTH = 64K +} diff --git a/hashes/embedded/src/main.rs b/hashes/embedded/src/main.rs new file mode 100644 index 00000000..30921a0f --- /dev/null +++ b/hashes/embedded/src/main.rs @@ -0,0 +1,72 @@ +#![cfg_attr(feature = "alloc", feature(alloc_error_handler))] +#![no_std] +#![no_main] + +#[macro_use] +extern crate bitcoin_hashes; + +#[cfg(feature = "alloc")] extern crate alloc; +#[cfg(feature = "alloc")] use alloc_cortex_m::CortexMHeap; +#[cfg(feature = "alloc")] use core::alloc::Layout; +#[cfg(feature = "alloc")] use cortex_m::asm; +#[cfg(feature = "alloc")] use bitcoin_hashes::hex::ToHex; + +use bitcoin_hashes::{sha256, Hash, HashEngine}; +use core2::io::Write; +use core::str::FromStr; +use cortex_m_rt::entry; +use cortex_m_semihosting::{debug, hprintln}; +use panic_halt as _; + +hash_newtype!(TestType, sha256::Hash, 32, doc = "test"); + +// this is the allocator the application will use +#[cfg(feature = "alloc")] +#[global_allocator] +static ALLOCATOR: CortexMHeap = CortexMHeap::empty(); + +#[cfg(feature = "alloc")] +const HEAP_SIZE: usize = 1024; // in bytes + +#[entry] +fn main() -> ! { + #[cfg(feature = "alloc")] + unsafe { ALLOCATOR.init(cortex_m_rt::heap_start() as usize, HEAP_SIZE) } + + let mut engine = TestType::engine(); + engine.write_all(b"abc").unwrap(); + check_result(engine); + + let mut engine = TestType::engine(); + engine.input(b"abc"); + check_result(engine); + + debug::exit(debug::EXIT_SUCCESS); + loop {} +} + +fn check_result(engine: sha256::HashEngine) { + let hash = TestType::from_engine(engine); + + let hash_check = + TestType::from_str("ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad") + .unwrap(); + hprintln!("hash:{} hash_check:{}", hash, hash_check).unwrap(); + if hash != hash_check { + debug::exit(debug::EXIT_FAILURE); + } + + #[cfg(feature = "alloc")] + if hash.to_hex() != hash_check.to_hex() { + debug::exit(debug::EXIT_FAILURE); + } +} + +// define what happens in an Out Of Memory (OOM) condition +#[cfg(feature = "alloc")] +#[alloc_error_handler] +fn alloc_error(_layout: Layout) -> ! { + asm::bkpt(); + + loop {} +} diff --git a/hashes/extended_tests/schemars/Cargo.toml b/hashes/extended_tests/schemars/Cargo.toml new file mode 100644 index 00000000..35900f75 --- /dev/null +++ b/hashes/extended_tests/schemars/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "schemars" +version = "0.1.0" +authors = ["Jeremy Rubin "] +edition = "2018" + +# Prevent this from interfering with workspaces +[workspace] +members = ["."] + +[dependencies.bitcoin_hashes] +path = "../.." +features = ['schemars', 'serde'] + +[dependencies] +jsonschema-valid = "^0.4.0" +serde = { version = "1.0", default-features = false} +schemars = { version = "<=0.8.3"} +serde_test = "1.0" +serde_json = "1.0" diff --git a/hashes/extended_tests/schemars/src/main.rs b/hashes/extended_tests/schemars/src/main.rs new file mode 100644 index 00000000..3bfadcec --- /dev/null +++ b/hashes/extended_tests/schemars/src/main.rs @@ -0,0 +1,193 @@ +fn main() {} +#[cfg(test)] +mod tests { + use bitcoin_hashes::*; + + #[test] + fn hash160() { + static HASH_BYTES: [u8; 20] = [ + 0x13, 0x20, 0x72, 0xdf, 0x69, 0x09, 0x33, 0x83, 0x5e, 0xb8, 0xb6, 0xad, 0x0b, 0x77, + 0xe7, 0xb6, 0xf1, 0x4a, 0xca, 0xd7, + ]; + + let hash = hash160::Hash::from_slice(&HASH_BYTES).expect("right number of bytes"); + let js = serde_json::from_str(&serde_json::to_string(&hash).unwrap()).unwrap(); + let s = schemars::schema_for!(hash160::Hash); + let schema = serde_json::from_str(&serde_json::to_string(&s).unwrap()).unwrap(); + assert!(jsonschema_valid::Config::from_schema(&schema, None) + .unwrap() + .validate(&js) + .is_ok()); + } + + #[test] + fn hmac_sha512() { + static HASH_BYTES: [u8; 64] = [ + 0x8b, 0x41, 0xe1, 0xb7, 0x8a, 0xd1, 0x15, 0x21, 0x11, 0x3c, 0x52, 0xff, 0x18, 0x2a, + 0x1b, 0x8e, 0x0a, 0x19, 0x57, 0x54, 0xaa, 0x52, 0x7f, 0xcd, 0x00, 0xa4, 0x11, 0x62, + 0x0b, 0x46, 0xf2, 0x0f, 0xff, 0xfb, 0x80, 0x88, 0xcc, 0xf8, 0x54, 0x97, 0x12, 0x1a, + 0xd4, 0x49, 0x9e, 0x08, 0x45, 0xb8, 0x76, 0xf6, 0xdd, 0x66, 0x40, 0x08, 0x8a, 0x2f, + 0x0b, 0x2d, 0x8a, 0x60, 0x0b, 0xdf, 0x4c, 0x0c, + ]; + + let hash = Hmac::::from_slice(&HASH_BYTES).expect("right number of bytes"); + let js = serde_json::from_str(&serde_json::to_string(&hash).unwrap()).unwrap(); + let s = schemars::schema_for!(Hmac::); + let schema = serde_json::from_str(&serde_json::to_string(&s).unwrap()).unwrap(); + assert!(jsonschema_valid::Config::from_schema(&schema, None) + .unwrap() + .validate(&js) + .is_ok()); + } + + #[test] + fn ripemd160() { + static HASH_BYTES: [u8; 20] = [ + 0x13, 0x20, 0x72, 0xdf, 0x69, 0x09, 0x33, 0x83, 0x5e, 0xb8, 0xb6, 0xad, 0x0b, 0x77, + 0xe7, 0xb6, 0xf1, 0x4a, 0xca, 0xd7, + ]; + + let hash = ripemd160::Hash::from_slice(&HASH_BYTES).expect("right number of bytes"); + let js = serde_json::from_str(&serde_json::to_string(&hash).unwrap()).unwrap(); + let s = schemars::schema_for!(ripemd160::Hash); + let schema = serde_json::from_str(&serde_json::to_string(&s).unwrap()).unwrap(); + assert!(jsonschema_valid::Config::from_schema(&schema, None) + .unwrap() + .validate(&js) + .is_ok()); + } + + #[test] + fn sha1() { + static HASH_BYTES: [u8; 20] = [ + 0x13, 0x20, 0x72, 0xdf, 0x69, 0x09, 0x33, 0x83, 0x5e, 0xb8, 0xb6, 0xad, 0x0b, 0x77, + 0xe7, 0xb6, 0xf1, 0x4a, 0xca, 0xd7, + ]; + + let hash = sha1::Hash::from_slice(&HASH_BYTES).expect("right number of bytes"); + let js = serde_json::from_str(&serde_json::to_string(&hash).unwrap()).unwrap(); + let s = schemars::schema_for!(sha1::Hash); + let schema = serde_json::from_str(&serde_json::to_string(&s).unwrap()).unwrap(); + assert!(jsonschema_valid::Config::from_schema(&schema, None) + .unwrap() + .validate(&js) + .is_ok()); + } + + #[test] + fn sha256d() { + static HASH_BYTES: [u8; 32] = [ + 0xef, 0x53, 0x7f, 0x25, 0xc8, 0x95, 0xbf, 0xa7, 0x82, 0x52, 0x65, 0x29, 0xa9, 0xb6, + 0x3d, 0x97, 0xaa, 0x63, 0x15, 0x64, 0xd5, 0xd7, 0x89, 0xc2, 0xb7, 0x65, 0x44, 0x8c, + 0x86, 0x35, 0xfb, 0x6c, + ]; + + let hash = sha256d::Hash::from_slice(&HASH_BYTES).expect("right number of bytes"); + let js = serde_json::from_str(&serde_json::to_string(&hash).unwrap()).unwrap(); + let s = schemars::schema_for!(sha256d::Hash); + let schema = serde_json::from_str(&serde_json::to_string(&s).unwrap()).unwrap(); + assert!(jsonschema_valid::Config::from_schema(&schema, None) + .unwrap() + .validate(&js) + .is_ok()); + } + + #[test] + fn sha256() { + static HASH_BYTES: [u8; 32] = [ + 0xef, 0x53, 0x7f, 0x25, 0xc8, 0x95, 0xbf, 0xa7, 0x82, 0x52, 0x65, 0x29, 0xa9, 0xb6, + 0x3d, 0x97, 0xaa, 0x63, 0x15, 0x64, 0xd5, 0xd7, 0x89, 0xc2, 0xb7, 0x65, 0x44, 0x8c, + 0x86, 0x35, 0xfb, 0x6c, + ]; + + let hash = sha256::Hash::from_slice(&HASH_BYTES).expect("right number of bytes"); + let js = serde_json::from_str(&serde_json::to_string(&hash).unwrap()).unwrap(); + let s = schemars::schema_for!(sha256::Hash); + let schema = serde_json::from_str(&serde_json::to_string(&s).unwrap()).unwrap(); + assert!(jsonschema_valid::Config::from_schema(&schema, None) + .unwrap() + .validate(&js) + .is_ok()); + } + + #[test] + fn test_hash() { + const TEST_MIDSTATE: [u8; 32] = [ + 156, 224, 228, 230, 124, 17, 108, 57, 56, 179, 202, 242, 195, 15, 80, 137, 211, 243, + 147, 108, 71, 99, 110, 96, 125, 179, 62, 234, 221, 198, 240, 201, + ]; + + #[derive( + Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Default, Hash, schemars::JsonSchema, + )] + pub struct TestHashTag; + + impl sha256t::Tag for TestHashTag { + fn engine() -> sha256::HashEngine { + // The TapRoot TapLeaf midstate. + let midstate = sha256::Midstate::from_inner(TEST_MIDSTATE); + sha256::HashEngine::from_midstate(midstate, 64) + } + } + + /// A hash tagged with `$name`. + pub type TestHash = sha256t::Hash; + + sha256t_hash_newtype!( + NewTypeHash, + NewTypeTag, + TEST_MIDSTATE, + 64, + doc = "test hash", + true + ); + static HASH_BYTES: [u8; 32] = [ + 0xef, 0x53, 0x7f, 0x25, 0xc8, 0x95, 0xbf, 0xa7, 0x82, 0x52, 0x65, 0x29, 0xa9, 0xb6, + 0x3d, 0x97, 0xaa, 0x63, 0x15, 0x64, 0xd5, 0xd7, 0x89, 0xc2, 0xb7, 0x65, 0x44, 0x8c, + 0x86, 0x35, 0xfb, 0x6c, + ]; + + let hash = TestHash::from_slice(&HASH_BYTES).expect("right number of bytes"); + let js = serde_json::from_str(&serde_json::to_string(&hash).unwrap()).unwrap(); + let s = schemars::schema_for!(TestHash); + let schema = serde_json::from_str(&serde_json::to_string(&s).unwrap()).unwrap(); + assert!(jsonschema_valid::Config::from_schema(&schema, None) + .unwrap() + .validate(&js) + .is_ok()); + } + + #[test] + fn sha512() { + static HASH_BYTES: [u8; 64] = [ + 0x8b, 0x41, 0xe1, 0xb7, 0x8a, 0xd1, 0x15, 0x21, 0x11, 0x3c, 0x52, 0xff, 0x18, 0x2a, + 0x1b, 0x8e, 0x0a, 0x19, 0x57, 0x54, 0xaa, 0x52, 0x7f, 0xcd, 0x00, 0xa4, 0x11, 0x62, + 0x0b, 0x46, 0xf2, 0x0f, 0xff, 0xfb, 0x80, 0x88, 0xcc, 0xf8, 0x54, 0x97, 0x12, 0x1a, + 0xd4, 0x49, 0x9e, 0x08, 0x45, 0xb8, 0x76, 0xf6, 0xdd, 0x66, 0x40, 0x08, 0x8a, 0x2f, + 0x0b, 0x2d, 0x8a, 0x60, 0x0b, 0xdf, 0x4c, 0x0c, + ]; + + let hash = sha512::Hash::from_slice(&HASH_BYTES).expect("right number of bytes"); + let js = serde_json::from_str(&serde_json::to_string(&hash).unwrap()).unwrap(); + let s = schemars::schema_for!(sha512::Hash); + let schema = serde_json::from_str(&serde_json::to_string(&s).unwrap()).unwrap(); + assert!(jsonschema_valid::Config::from_schema(&schema, None) + .unwrap() + .validate(&js) + .is_ok()); + } + + #[test] + fn siphash24() { + static HASH_BYTES: [u8; 8] = [0x8b, 0x41, 0xe1, 0xb7, 0x8a, 0xd1, 0x15, 0x21]; + + let hash = siphash24::Hash::from_slice(&HASH_BYTES).expect("right number of bytes"); + let js = serde_json::from_str(&serde_json::to_string(&hash).unwrap()).unwrap(); + let s = schemars::schema_for!(siphash24::Hash); + let schema = serde_json::from_str(&serde_json::to_string(&s).unwrap()).unwrap(); + assert!(jsonschema_valid::Config::from_schema(&schema, None) + .unwrap() + .validate(&js) + .is_ok()); + } +} diff --git a/hashes/fuzz/Cargo.toml b/hashes/fuzz/Cargo.toml new file mode 100644 index 00000000..511ebe62 --- /dev/null +++ b/hashes/fuzz/Cargo.toml @@ -0,0 +1,49 @@ +[package] +name = "bitcoin_hashes-fuzz" +version = "0.0.1" +authors = ["copied from rust-bitcoin"] +publish = false + +[package.metadata] +cargo-fuzz = true + +[features] +honggfuzz_fuzz = ["honggfuzz"] + +[dependencies] +honggfuzz = { version = "0.5", optional = true } +bitcoin_hashes = { path = "..", features = ["serde"] } +rust-crypto = "0.2" + +serde = "1.0" +serde_derive = "1.0" +serde_json = "1.0" +serde_cbor = "0.9" + +# Prevent this from interfering with workspaces +[workspace] +members = ["."] + +[[bin]] +name = "sha1" +path = "fuzz_targets/sha1.rs" + +[[bin]] +name = "ripemd160" +path = "fuzz_targets/ripemd160.rs" + +[[bin]] +name = "sha256" +path = "fuzz_targets/sha256.rs" + +[[bin]] +name = "sha512" +path = "fuzz_targets/sha512.rs" + +[[bin]] +name = "cbor" +path = "fuzz_targets/cbor.rs" + +[[bin]] +name = "json" +path = "fuzz_targets/json.rs" diff --git a/hashes/fuzz/fuzz_targets/cbor.rs b/hashes/fuzz/fuzz_targets/cbor.rs new file mode 100644 index 00000000..4d0223ba --- /dev/null +++ b/hashes/fuzz/fuzz_targets/cbor.rs @@ -0,0 +1,66 @@ + +extern crate serde; +#[macro_use] extern crate serde_derive; +extern crate bitcoin_hashes; +extern crate serde_cbor; + +use bitcoin_hashes::Hmac; +use bitcoin_hashes::{sha1, sha512, ripemd160, sha256d}; + +#[derive(Deserialize, Serialize)] +struct Hmacs { + sha1: Hmac, + sha512: Hmac, +} + +#[derive(Deserialize, Serialize)] +struct Main { + hmacs: Hmacs, + ripemd: ripemd160::Hash, + sha2d: sha256d::Hash, +} + +fn do_test(data: &[u8]) { + if let Ok(m) = serde_cbor::from_slice::
(data) { + let vec = serde_cbor::to_vec(&m).unwrap(); + assert_eq!(data, &vec[..]); + } +} + +#[cfg(feature = "honggfuzz")] +#[macro_use] +extern crate honggfuzz; + +#[cfg(feature = "honggfuzz")] +fn main() { + loop { + fuzz!(|d| { do_test(d) }); + } +} + +#[cfg(test)] +mod tests { + fn extend_vec_from_hex(hex: &str, out: &mut Vec) { + let mut b = 0; + for (idx, c) in hex.as_bytes().iter().enumerate() { + b <<= 4; + match *c { + b'A'...b'F' => b |= c - b'A' + 10, + b'a'...b'f' => b |= c - b'a' + 10, + b'0'...b'9' => b |= c - b'0', + _ => panic!("Bad hex"), + } + if (idx & 1) == 1 { + out.push(b); + b = 0; + } + } + } + + #[test] + fn duplicate_crash() { + let mut a = Vec::new(); + extend_vec_from_hex("00000", &mut a); + super::do_test(&a); + } +} diff --git a/hashes/fuzz/fuzz_targets/json.rs b/hashes/fuzz/fuzz_targets/json.rs new file mode 100644 index 00000000..2553c710 --- /dev/null +++ b/hashes/fuzz/fuzz_targets/json.rs @@ -0,0 +1,66 @@ + +extern crate serde; +#[macro_use] extern crate serde_derive; +extern crate bitcoin_hashes; +extern crate serde_json; + +use bitcoin_hashes::Hmac; +use bitcoin_hashes::{sha1, sha512, ripemd160, sha256d}; + +#[derive(Deserialize, Serialize)] +struct Hmacs { + sha1: Hmac, + sha512: Hmac, +} + +#[derive(Deserialize, Serialize)] +struct Main { + hmacs: Hmacs, + ripemd: ripemd160::Hash, + sha2d: sha256d::Hash, +} + +fn do_test(data: &[u8]) { + if let Ok(m) = serde_json::from_slice::
(data) { + let vec = serde_json::to_vec(&m).unwrap(); + assert_eq!(data, &vec[..]); + } +} + +#[cfg(feature = "honggfuzz")] +#[macro_use] +extern crate honggfuzz; + +#[cfg(feature = "honggfuzz")] +fn main() { + loop { + fuzz!(|d| { do_test(d) }); + } +} + +#[cfg(test)] +mod tests { + fn extend_vec_from_hex(hex: &str, out: &mut Vec) { + let mut b = 0; + for (idx, c) in hex.as_bytes().iter().enumerate() { + b <<= 4; + match *c { + b'A'...b'F' => b |= c - b'A' + 10, + b'a'...b'f' => b |= c - b'a' + 10, + b'0'...b'9' => b |= c - b'0', + _ => panic!("Bad hex"), + } + if (idx & 1) == 1 { + out.push(b); + b = 0; + } + } + } + + #[test] + fn duplicate_crash() { + let mut a = Vec::new(); + extend_vec_from_hex("00000", &mut a); + super::do_test(&a); + } +} diff --git a/hashes/fuzz/fuzz_targets/ripemd160.rs b/hashes/fuzz/fuzz_targets/ripemd160.rs new file mode 100644 index 00000000..09becd2a --- /dev/null +++ b/hashes/fuzz/fuzz_targets/ripemd160.rs @@ -0,0 +1,57 @@ + +extern crate bitcoin_hashes; +extern crate crypto; + +use bitcoin_hashes::Hash; +use bitcoin_hashes::ripemd160; +use crypto::digest::Digest; +use crypto::ripemd160::Ripemd160; + +fn do_test(data: &[u8]) { + let our_hash = ripemd160::Hash::hash(data); + + let mut rc_hash = [0u8; 20]; + let mut rc_engine = Ripemd160::new(); + rc_engine.input(data); + rc_engine.result(&mut rc_hash); + + assert_eq!(&our_hash[..], &rc_hash[..]); +} + +#[cfg(feature = "honggfuzz")] +#[macro_use] +extern crate honggfuzz; + +#[cfg(feature = "honggfuzz")] +fn main() { + loop { + fuzz!(|d| { do_test(d) }); + } +} + +#[cfg(test)] +mod tests { + fn extend_vec_from_hex(hex: &str, out: &mut Vec) { + let mut b = 0; + for (idx, c) in hex.as_bytes().iter().enumerate() { + b <<= 4; + match *c { + b'A'...b'F' => b |= c - b'A' + 10, + b'a'...b'f' => b |= c - b'a' + 10, + b'0'...b'9' => b |= c - b'0', + _ => panic!("Bad hex"), + } + if (idx & 1) == 1 { + out.push(b); + b = 0; + } + } + } + + #[test] + fn duplicate_crash() { + let mut a = Vec::new(); + extend_vec_from_hex("00000", &mut a); + super::do_test(&a); + } +} diff --git a/hashes/fuzz/fuzz_targets/sha1.rs b/hashes/fuzz/fuzz_targets/sha1.rs new file mode 100644 index 00000000..ce2b08c2 --- /dev/null +++ b/hashes/fuzz/fuzz_targets/sha1.rs @@ -0,0 +1,57 @@ + +extern crate bitcoin_hashes; +extern crate crypto; + +use bitcoin_hashes::Hash; +use bitcoin_hashes::sha1; +use crypto::digest::Digest; +use crypto::sha1::Sha1; + +fn do_test(data: &[u8]) { + let our_hash = sha1::Hash::hash(data); + + let mut rc_hash = [0u8; 20]; + let mut rc_sha1 = Sha1::new(); + rc_sha1.input(data); + rc_sha1.result(&mut rc_hash); + + assert_eq!(&our_hash[..], &rc_hash[..]); +} + +#[cfg(feature = "honggfuzz")] +#[macro_use] +extern crate honggfuzz; + +#[cfg(feature = "honggfuzz")] +fn main() { + loop { + fuzz!(|d| { do_test(d) }); + } +} + +#[cfg(test)] +mod tests { + fn extend_vec_from_hex(hex: &str, out: &mut Vec) { + let mut b = 0; + for (idx, c) in hex.as_bytes().iter().enumerate() { + b <<= 4; + match *c { + b'A'...b'F' => b |= c - b'A' + 10, + b'a'...b'f' => b |= c - b'a' + 10, + b'0'...b'9' => b |= c - b'0', + _ => panic!("Bad hex"), + } + if (idx & 1) == 1 { + out.push(b); + b = 0; + } + } + } + + #[test] + fn duplicate_crash() { + let mut a = Vec::new(); + extend_vec_from_hex("00000", &mut a); + super::do_test(&a); + } +} diff --git a/hashes/fuzz/fuzz_targets/sha256.rs b/hashes/fuzz/fuzz_targets/sha256.rs new file mode 100644 index 00000000..89b6de8e --- /dev/null +++ b/hashes/fuzz/fuzz_targets/sha256.rs @@ -0,0 +1,57 @@ + +extern crate bitcoin_hashes; +extern crate crypto; + +use bitcoin_hashes::Hash; +use bitcoin_hashes::sha256; +use crypto::digest::Digest; +use crypto::sha2::Sha256; + +fn do_test(data: &[u8]) { + let our_hash = sha256::Hash::hash(data); + + let mut rc_hash = [0u8; 32]; + let mut rc_engine = Sha256::new(); + rc_engine.input(data); + rc_engine.result(&mut rc_hash); + + assert_eq!(&our_hash[..], &rc_hash[..]); +} + +#[cfg(feature = "honggfuzz")] +#[macro_use] +extern crate honggfuzz; + +#[cfg(feature = "honggfuzz")] +fn main() { + loop { + fuzz!(|d| { do_test(d) }); + } +} + +#[cfg(test)] +mod tests { + fn extend_vec_from_hex(hex: &str, out: &mut Vec) { + let mut b = 0; + for (idx, c) in hex.as_bytes().iter().enumerate() { + b <<= 4; + match *c { + b'A'...b'F' => b |= c - b'A' + 10, + b'a'...b'f' => b |= c - b'a' + 10, + b'0'...b'9' => b |= c - b'0', + _ => panic!("Bad hex"), + } + if (idx & 1) == 1 { + out.push(b); + b = 0; + } + } + } + + #[test] + fn duplicate_crash() { + let mut a = Vec::new(); + extend_vec_from_hex("00000", &mut a); + super::do_test(&a); + } +} diff --git a/hashes/fuzz/fuzz_targets/sha512.rs b/hashes/fuzz/fuzz_targets/sha512.rs new file mode 100644 index 00000000..f8909c1f --- /dev/null +++ b/hashes/fuzz/fuzz_targets/sha512.rs @@ -0,0 +1,57 @@ + +extern crate bitcoin_hashes; +extern crate crypto; + +use bitcoin_hashes::Hash; +use bitcoin_hashes::sha512; +use crypto::digest::Digest; +use crypto::sha2::Sha512; + +fn do_test(data: &[u8]) { + let our_hash = sha512::Hash::hash(data); + + let mut rc_hash = [0u8; 64]; + let mut rc_engine = Sha512::new(); + rc_engine.input(data); + rc_engine.result(&mut rc_hash); + + assert_eq!(&our_hash[..], &rc_hash[..]); +} + +#[cfg(feature = "honggfuzz")] +#[macro_use] +extern crate honggfuzz; + +#[cfg(feature = "honggfuzz")] +fn main() { + loop { + fuzz!(|d| { do_test(d) }); + } +} + +#[cfg(test)] +mod tests { + fn extend_vec_from_hex(hex: &str, out: &mut Vec) { + let mut b = 0; + for (idx, c) in hex.as_bytes().iter().enumerate() { + b <<= 4; + match *c { + b'A'...b'F' => b |= c - b'A' + 10, + b'a'...b'f' => b |= c - b'a' + 10, + b'0'...b'9' => b |= c - b'0', + _ => panic!("Bad hex"), + } + if (idx & 1) == 1 { + out.push(b); + b = 0; + } + } + } + + #[test] + fn duplicate_crash() { + let mut a = Vec::new(); + extend_vec_from_hex("00000", &mut a); + super::do_test(&a); + } +} diff --git a/hashes/fuzz/travis-fuzz.sh b/hashes/fuzz/travis-fuzz.sh new file mode 100755 index 00000000..aebd1aa4 --- /dev/null +++ b/hashes/fuzz/travis-fuzz.sh @@ -0,0 +1,22 @@ +#!/bin/bash +set -e +cargo install --force honggfuzz +for TARGET in fuzz_targets/*; do + FILENAME=$(basename $TARGET) + FILE="${FILENAME%.*}" + if [ -d hfuzz_input/$FILE ]; then + HFUZZ_INPUT_ARGS="-f hfuzz_input/$FILE/input" + fi + + rm -f hfuzz_workspace/$FILE/HONGGFUZZ.REPORT.TXT + + HFUZZ_BUILD_ARGS="--features honggfuzz_fuzz" HFUZZ_RUN_ARGS="-N1000000 --exit_upon_crash -v $HFUZZ_INPUT_ARGS" cargo hfuzz run $FILE + + if [ -f hfuzz_workspace/$FILE/HONGGFUZZ.REPORT.TXT ]; then + cat hfuzz_workspace/$FILE/HONGGFUZZ.REPORT.TXT + for CASE in hfuzz_workspace/$FILE/SIG*; do + cat $CASE | xxd -p + done + exit 1 + fi +done diff --git a/hashes/src/cmp.rs b/hashes/src/cmp.rs new file mode 100644 index 00000000..e540ebac --- /dev/null +++ b/hashes/src/cmp.rs @@ -0,0 +1,160 @@ +//! Useful comparison functions. + +/// Compare two slices for equality in fixed time. Panics if the slices are of non-equal length. +/// +/// This works by XOR'ing each byte of the two inputs together and keeping an OR counter of the +/// results. +/// +/// Instead of doing fancy bit twiddling to try to outsmart the compiler and prevent early exits, +/// which is not guaranteed to remain stable as compilers get ever smarter, we take the hit of +/// writing each intermediate value to memory with a volatile write and then re-reading it with a +/// volatile read. This should remain stable across compiler upgrades, but is much slower. +/// +/// As of rust 1.31.0 disassembly looks completely within reason for this, see +/// . +pub fn fixed_time_eq(a: &[u8], b: &[u8]) -> bool { + assert!(a.len() == b.len()); + let count = a.len(); + let lhs = &a[..count]; + let rhs = &b[..count]; + + let mut r: u8 = 0; + for i in 0..count { + let mut rs = unsafe { core::ptr::read_volatile(&r) }; + rs |= lhs[i] ^ rhs[i]; + unsafe { core::ptr::write_volatile(&mut r, rs); } + } + { + let mut t = unsafe { core::ptr::read_volatile(&r) }; + t |= t >> 4; + unsafe { core::ptr::write_volatile(&mut r, t); } + } + { + let mut t = unsafe { core::ptr::read_volatile(&r) }; + t |= t >> 2; + unsafe { core::ptr::write_volatile(&mut r, t); } + } + { + let mut t = unsafe { core::ptr::read_volatile(&r) }; + t |= t >> 1; + unsafe { core::ptr::write_volatile(&mut r, t); } + } + unsafe { (::core::ptr::read_volatile(&r) & 1) == 0 } +} + +#[test] +fn eq_test() { + assert!(fixed_time_eq(&[0b00000000], &[0b00000000])); + assert!(fixed_time_eq(&[0b00000001], &[0b00000001])); + assert!(fixed_time_eq(&[0b00000010], &[0b00000010])); + assert!(fixed_time_eq(&[0b00000100], &[0b00000100])); + assert!(fixed_time_eq(&[0b00001000], &[0b00001000])); + assert!(fixed_time_eq(&[0b00010000], &[0b00010000])); + assert!(fixed_time_eq(&[0b00100000], &[0b00100000])); + assert!(fixed_time_eq(&[0b01000000], &[0b01000000])); + assert!(fixed_time_eq(&[0b10000000], &[0b10000000])); + assert!(fixed_time_eq(&[0b11111111], &[0b11111111])); + + assert!(!fixed_time_eq(&[0b00000001], &[0b00000000])); + assert!(!fixed_time_eq(&[0b00000001], &[0b11111111])); + assert!(!fixed_time_eq(&[0b00000010], &[0b00000000])); + assert!(!fixed_time_eq(&[0b00000010], &[0b11111111])); + assert!(!fixed_time_eq(&[0b00000100], &[0b00000000])); + assert!(!fixed_time_eq(&[0b00000100], &[0b11111111])); + assert!(!fixed_time_eq(&[0b00001000], &[0b00000000])); + assert!(!fixed_time_eq(&[0b00001000], &[0b11111111])); + assert!(!fixed_time_eq(&[0b00010000], &[0b00000000])); + assert!(!fixed_time_eq(&[0b00010000], &[0b11111111])); + assert!(!fixed_time_eq(&[0b00100000], &[0b00000000])); + assert!(!fixed_time_eq(&[0b00100000], &[0b11111111])); + assert!(!fixed_time_eq(&[0b01000000], &[0b00000000])); + assert!(!fixed_time_eq(&[0b01000000], &[0b11111111])); + assert!(!fixed_time_eq(&[0b10000000], &[0b00000000])); + assert!(!fixed_time_eq(&[0b10000000], &[0b11111111])); + + assert!( fixed_time_eq(&[0b00000000, 0b00000000], &[0b00000000, 0b00000000])); + assert!(!fixed_time_eq(&[0b00000001, 0b00000000], &[0b00000000, 0b00000000])); + assert!(!fixed_time_eq(&[0b00000000, 0b00000001], &[0b00000000, 0b00000000])); + assert!(!fixed_time_eq(&[0b00000000, 0b00000000], &[0b00000001, 0b00000000])); + assert!(!fixed_time_eq(&[0b00000000, 0b00000000], &[0b00000001, 0b00000001])); +} + +#[cfg(bench)] +mod benches { + use test::Bencher; + + use crate::{Hash, sha256, sha512}; + use crate::cmp::fixed_time_eq; + + #[bench] + fn bench_32b_constant_time_cmp_ne(bh: &mut Bencher) { + let hash_a = sha256::Hash::hash(&[0; 1]); + let hash_b = sha256::Hash::hash(&[1; 1]); + bh.iter(|| { + fixed_time_eq(&hash_a[..], &hash_b[..]) + }) + } + + #[bench] + fn bench_32b_slice_cmp_ne(bh: &mut Bencher) { + let hash_a = sha256::Hash::hash(&[0; 1]); + let hash_b = sha256::Hash::hash(&[1; 1]); + bh.iter(|| { + &hash_a[..] == &hash_b[..] + }) + } + + #[bench] + fn bench_32b_constant_time_cmp_eq(bh: &mut Bencher) { + let hash_a = sha256::Hash::hash(&[0; 1]); + let hash_b = sha256::Hash::hash(&[0; 1]); + bh.iter(|| { + fixed_time_eq(&hash_a[..], &hash_b[..]) + }) + } + + #[bench] + fn bench_32b_slice_cmp_eq(bh: &mut Bencher) { + let hash_a = sha256::Hash::hash(&[0; 1]); + let hash_b = sha256::Hash::hash(&[0; 1]); + bh.iter(|| { + &hash_a[..] == &hash_b[..] + }) + } + + #[bench] + fn bench_64b_constant_time_cmp_ne(bh: &mut Bencher) { + let hash_a = sha512::Hash::hash(&[0; 1]); + let hash_b = sha512::Hash::hash(&[1; 1]); + bh.iter(|| { + fixed_time_eq(&hash_a[..], &hash_b[..]) + }) + } + + #[bench] + fn bench_64b_slice_cmp_ne(bh: &mut Bencher) { + let hash_a = sha512::Hash::hash(&[0; 1]); + let hash_b = sha512::Hash::hash(&[1; 1]); + bh.iter(|| { + &hash_a[..] == &hash_b[..] + }) + } + + #[bench] + fn bench_64b_constant_time_cmp_eq(bh: &mut Bencher) { + let hash_a = sha512::Hash::hash(&[0; 1]); + let hash_b = sha512::Hash::hash(&[0; 1]); + bh.iter(|| { + fixed_time_eq(&hash_a[..], &hash_b[..]) + }) + } + + #[bench] + fn bench_64b_slice_cmp_eq(bh: &mut Bencher) { + let hash_a = sha512::Hash::hash(&[0; 1]); + let hash_b = sha512::Hash::hash(&[0; 1]); + bh.iter(|| { + &hash_a[..] == &hash_b[..] + }) + } +} diff --git a/hashes/src/error.rs b/hashes/src/error.rs new file mode 100644 index 00000000..fb393251 --- /dev/null +++ b/hashes/src/error.rs @@ -0,0 +1,33 @@ +// Bitcoin Hashes Library +// Written in 2018 by +// Andrew Poelstra +// +// To the extent possible under law, the author(s) have dedicated all +// copyright and related and neighboring rights to this software to +// the public domain worldwide. This software is distributed without +// any warranty. +// +// You should have received a copy of the CC0 Public Domain Dedication +// along with this software. +// If not, see . +// + +//! Crate error type. +//! + +use core::fmt; + +/// Crate error type. +#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub enum Error { + /// Tried to create a fixed-length hash from a slice with the wrong size (expected, got). + InvalidLength(usize, usize), +} + +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match *self { + Error::InvalidLength(ell, ell2) => write!(f, "bad slice length {} (expected {})", ell2, ell), + } + } +} diff --git a/hashes/src/hash160.rs b/hashes/src/hash160.rs new file mode 100644 index 00000000..89950bc4 --- /dev/null +++ b/hashes/src/hash160.rs @@ -0,0 +1,160 @@ +// Bitcoin Hashes Library +// Written in 2018 by +// Andrew Poelstra +// +// To the extent possible under law, the author(s) have dedicated all +// copyright and related and neighboring rights to this software to +// the public domain worldwide. This software is distributed without +// any warranty. +// +// You should have received a copy of the CC0 Public Domain Dedication +// along with this software. +// If not, see . +// + +// This module is largely copied from the rust-crypto ripemd.rs file; +// while rust-crypto is licensed under Apache, that file specifically +// was written entirely by Andrew Poelstra, who is re-licensing its +// contents here as CC0. + +//! HASH160 (SHA256 then RIPEMD160) implementation. +//! + +use core::str; +use core::ops::Index; +use core::slice::SliceIndex; + +use crate::{Error, hex, ripemd160, sha256}; + +crate::internal_macros::hash_type! { + 160, + false, + "Output of the Bitcoin HASH160 hash function. (RIPEMD160(SHA256))", + "crate::util::json_hex_string::len_20" +} + +type HashEngine = sha256::HashEngine; + +fn from_engine(e: HashEngine) -> Hash { + use crate::Hash as _; + + let sha2 = sha256::Hash::from_engine(e); + let rmd = ripemd160::Hash::hash(&sha2[..]); + + let mut ret = [0; 20]; + ret.copy_from_slice(&rmd[..]); + Hash(ret) +} + +#[cfg(test)] +mod tests { + #[test] + #[cfg(any(feature = "std", feature = "alloc"))] + fn test() { + use crate::{hash160, Hash, HashEngine}; + use crate::hex::{FromHex, ToHex}; + + #[derive(Clone)] + #[cfg(any(feature = "std", feature = "alloc"))] + struct Test { + input: Vec, + output: Vec, + output_str: &'static str, + } + + let tests = vec![ + // Uncompressed pubkey obtained from Bitcoin key; data from validateaddress + Test { + input: vec![ + 0x04, 0xa1, 0x49, 0xd7, 0x6c, 0x5d, 0xe2, 0x7a, 0x2d, + 0xdb, 0xfa, 0xa1, 0x24, 0x6c, 0x4a, 0xdc, 0xd2, 0xb6, + 0xf7, 0xaa, 0x29, 0x54, 0xc2, 0xe2, 0x53, 0x03, 0xf5, + 0x51, 0x54, 0xca, 0xad, 0x91, 0x52, 0xe4, 0xf7, 0xe4, + 0xb8, 0x5d, 0xf1, 0x69, 0xc1, 0x8a, 0x3c, 0x69, 0x7f, + 0xbb, 0x2d, 0xc4, 0xec, 0xef, 0x94, 0xac, 0x55, 0xfe, + 0x81, 0x64, 0xcc, 0xf9, 0x82, 0xa1, 0x38, 0x69, 0x1a, + 0x55, 0x19, + ], + output: vec![ + 0xda, 0x0b, 0x34, 0x52, 0xb0, 0x6f, 0xe3, 0x41, + 0x62, 0x6a, 0xd0, 0x94, 0x9c, 0x18, 0x3f, 0xbd, + 0xa5, 0x67, 0x68, 0x26, + ], + output_str: "da0b3452b06fe341626ad0949c183fbda5676826", + }, + ]; + + for test in tests { + // Hash through high-level API, check hex encoding/decoding + let hash = hash160::Hash::hash(&test.input[..]); + assert_eq!(hash, hash160::Hash::from_hex(test.output_str).expect("parse hex")); + assert_eq!(&hash[..], &test.output[..]); + assert_eq!(&hash.to_hex(), &test.output_str); + + // Hash through engine, checking that we can input byte by byte + let mut engine = hash160::Hash::engine(); + for ch in test.input { + engine.input(&[ch]); + } + let manual_hash = Hash::from_engine(engine); + assert_eq!(hash, manual_hash); + assert_eq!(hash.into_inner()[..].as_ref(), test.output.as_slice()); + } + } + + #[cfg(feature = "serde")] + #[test] + fn ripemd_serde() { + use serde_test::{Configure, Token, assert_tokens}; + use crate::{hash160, Hash}; + + static HASH_BYTES: [u8; 20] = [ + 0x13, 0x20, 0x72, 0xdf, + 0x69, 0x09, 0x33, 0x83, + 0x5e, 0xb8, 0xb6, 0xad, + 0x0b, 0x77, 0xe7, 0xb6, + 0xf1, 0x4a, 0xca, 0xd7, + ]; + + let hash = hash160::Hash::from_slice(&HASH_BYTES).expect("right number of bytes"); + assert_tokens(&hash.compact(), &[Token::BorrowedBytes(&HASH_BYTES[..])]); + assert_tokens(&hash.readable(), &[Token::Str("132072df690933835eb8b6ad0b77e7b6f14acad7")]); + } +} + +#[cfg(bench)] +mod benches { + use test::Bencher; + + use crate::{Hash, HashEngine, hash160}; + + #[bench] + pub fn hash160_10(bh: &mut Bencher) { + let mut engine = hash160::Hash::engine(); + let bytes = [1u8; 10]; + bh.iter( || { + engine.input(&bytes); + }); + bh.bytes = bytes.len() as u64; + } + + #[bench] + pub fn hash160_1k(bh: &mut Bencher) { + let mut engine = hash160::Hash::engine(); + let bytes = [1u8; 1024]; + bh.iter( || { + engine.input(&bytes); + }); + bh.bytes = bytes.len() as u64; + } + + #[bench] + pub fn hash160_64k(bh: &mut Bencher) { + let mut engine = hash160::Hash::engine(); + let bytes = [1u8; 65536]; + bh.iter( || { + engine.input(&bytes); + }); + bh.bytes = bytes.len() as u64; + } +} diff --git a/hashes/src/hex.rs b/hashes/src/hex.rs new file mode 100644 index 00000000..570895cc --- /dev/null +++ b/hashes/src/hex.rs @@ -0,0 +1,483 @@ +// Bitcoin Hashes Library +// Written in 2018 by +// Andrew Poelstra +// +// To the extent possible under law, the author(s) have dedicated all +// copyright and related and neighboring rights to this software to +// the public domain worldwide. This software is distributed without +// any warranty. +// +// You should have received a copy of the CC0 Public Domain Dedication +// along with this software. +// If not, see . +// + +//! Hex encoding and decoding. +//! + +#[cfg(any(feature = "std", feature = "alloc"))] +use crate::alloc::{string::String, vec::Vec}; +#[cfg(feature = "alloc")] +use crate::alloc::format; + +#[cfg(any(test, feature = "std"))] +use std::io; +#[cfg(all(not(test), not(feature = "std"), feature = "core2"))] +use core2::io; + +use core::{fmt, str}; +use crate::Hash; + +/// Hex decoding error. +#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub enum Error { + /// Non-hexadecimal character. + InvalidChar(u8), + /// Purported hex string had odd length. + OddLengthString(usize), + /// Tried to parse fixed-length hash from a string with the wrong type (expected, got). + InvalidLength(usize, usize), +} + +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match *self { + Error::InvalidChar(ch) => write!(f, "invalid hex character {}", ch), + Error::OddLengthString(ell) => write!(f, "odd hex string length {}", ell), + Error::InvalidLength(ell, ell2) => write!(f, "bad hex string length {} (expected {})", ell2, ell), + } + } +} + +/// Trait for objects that can be serialized as hex strings. +#[cfg(any(test, feature = "std", feature = "alloc"))] +#[cfg_attr(docsrs, doc(cfg(any(test, feature = "std", feature = "alloc"))))] +pub trait ToHex { + /// Converts to a hexadecimal representation of the object. + fn to_hex(&self) -> String; +} + +/// Trait for objects that can be deserialized from hex strings. +pub trait FromHex: Sized { + /// Produces an object from a byte iterator. + fn from_byte_iter(iter: I) -> Result + where + I: Iterator> + ExactSizeIterator + DoubleEndedIterator; + + /// Produces an object from a hex string. + fn from_hex(s: &str) -> Result { + Self::from_byte_iter(HexIterator::new(s)?) + } +} + +#[cfg(any(test, feature = "std", feature = "alloc"))] +#[cfg_attr(docsrs, doc(cfg(any(test, feature = "std", feature = "alloc"))))] +impl ToHex for T { + /// Outputs the hash in hexadecimal form. + fn to_hex(&self) -> String { + format!("{:x}", self) + } +} + +impl FromHex for T { + fn from_byte_iter(iter: I) -> Result + where + I: Iterator> + ExactSizeIterator + DoubleEndedIterator, + { + let inner = if Self::DISPLAY_BACKWARD { + T::Inner::from_byte_iter(iter.rev())? + } else { + T::Inner::from_byte_iter(iter)? + }; + Ok(Hash::from_inner(inner)) + } +} + +/// Iterator over a hex-encoded string slice which decodes hex and yields bytes. +pub struct HexIterator<'a> { + /// The `Bytes` iterator whose next two bytes will be decoded to yield + /// the next byte. + iter: str::Bytes<'a>, +} + +impl<'a> HexIterator<'a> { + /// Constructs a new `HexIterator` from a string slice. + /// + /// # Errors + /// + /// If the input string is of odd length. + pub fn new(s: &'a str) -> Result, Error> { + if s.len() % 2 != 0 { + Err(Error::OddLengthString(s.len())) + } else { + Ok(HexIterator { iter: s.bytes() }) + } + } +} + +fn chars_to_hex(hi: u8, lo: u8) -> Result { + let hih = (hi as char) + .to_digit(16) + .ok_or(Error::InvalidChar(hi))?; + let loh = (lo as char) + .to_digit(16) + .ok_or(Error::InvalidChar(lo))?; + + let ret = (hih << 4) + loh; + Ok(ret as u8) +} + +impl<'a> Iterator for HexIterator<'a> { + type Item = Result; + + fn next(&mut self) -> Option> { + let hi = self.iter.next()?; + let lo = self.iter.next().unwrap(); + Some(chars_to_hex(hi, lo)) + } + + fn size_hint(&self) -> (usize, Option) { + let (min, max) = self.iter.size_hint(); + (min / 2, max.map(|x| x / 2)) + } +} + +#[cfg(any(feature = "std", feature = "core2"))] +#[cfg_attr(docsrs, doc(cfg(any(feature = "std", feature = "core2"))))] +impl<'a> io::Read for HexIterator<'a> { + fn read(&mut self, buf: &mut [u8]) -> io::Result { + let mut bytes_read = 0usize; + for dst in buf { + match self.next() { + Some(Ok(src)) => { + *dst = src; + bytes_read += 1; + }, + _ => break, + } + } + Ok(bytes_read) + } +} + +impl<'a> DoubleEndedIterator for HexIterator<'a> { + fn next_back(&mut self) -> Option> { + let lo = self.iter.next_back()?; + let hi = self.iter.next_back().unwrap(); + Some(chars_to_hex(hi, lo)) + } +} + +impl<'a> ExactSizeIterator for HexIterator<'a> {} + +/// Outputs hex into an object implementing `fmt::Write`. +/// +/// This is usually more efficient than going through a `String` using [`ToHex`]. +pub fn format_hex(data: &[u8], f: &mut fmt::Formatter) -> fmt::Result { + let prec = f.precision().unwrap_or(2 * data.len()); + let width = f.width().unwrap_or(2 * data.len()); + for _ in (2 * data.len())..width { + f.write_str("0")?; + } + for ch in data.iter().take(prec / 2) { + write!(f, "{:02x}", *ch)?; + } + if prec < 2 * data.len() && prec % 2 == 1 { + write!(f, "{:x}", data[prec / 2] / 16)?; + } + Ok(()) +} + +/// Outputs hex in reverse order. +/// +/// Used for `sha256d::Hash` whose standard hex encoding has the bytes reversed. +pub fn format_hex_reverse(data: &[u8], f: &mut fmt::Formatter) -> fmt::Result { + let prec = f.precision().unwrap_or(2 * data.len()); + let width = f.width().unwrap_or(2 * data.len()); + for _ in (2 * data.len())..width { + f.write_str("0")?; + } + for ch in data.iter().rev().take(prec / 2) { + write!(f, "{:02x}", *ch)?; + } + if prec < 2 * data.len() && prec % 2 == 1 { + write!(f, "{:x}", data[data.len() - 1 - prec / 2] / 16)?; + } + Ok(()) +} + +#[cfg(any(test, feature = "std", feature = "alloc"))] +#[cfg_attr(docsrs, doc(cfg(any(test, feature = "std", feature = "alloc"))))] +impl ToHex for [u8] { + fn to_hex(&self) -> String { + use core::fmt::Write; + let mut ret = String::with_capacity(2 * self.len()); + for ch in self { + write!(ret, "{:02x}", ch).expect("writing to string"); + } + ret + } +} + +/// A struct implementing [`io::Write`] that converts what's written to it into +/// a hex String. +/// +/// If you already have the data to be converted in a `Vec` use [`ToHex`] +/// but if you have an encodable object, by using this you avoid the +/// serialization to `Vec` by going directly to `String`. +/// +/// Note that to achieve better perfomance than [`ToHex`] the struct must be +/// created with the right `capacity` of the final hex string so that the inner +/// `String` doesn't re-allocate. +#[cfg(any(test, feature = "std", feature = "alloc"))] +#[cfg_attr(docsrs, doc(cfg(any(test, feature = "std", feature = "alloc"))))] +pub struct HexWriter(String); + +#[cfg(any(test, feature = "std", feature = "alloc"))] +#[cfg_attr(docsrs, doc(cfg(any(test, feature = "std", feature = "alloc"))))] +impl HexWriter { + /// Creates a new [`HexWriter`] with the `capacity` of the inner `String` + /// that will contain final hex value. + pub fn new(capacity: usize) -> Self { + HexWriter(String::with_capacity(capacity)) + } + + /// Returns the resulting hex string. + pub fn result(self) -> String { + self.0 + } +} + +#[cfg(any(test, feature = "std", feature = "alloc"))] +#[cfg_attr(docsrs, doc(cfg(any(test, feature = "std", feature = "alloc"))))] +impl io::Write for HexWriter { + fn write(&mut self, buf: &[u8]) -> io::Result { + use core::fmt::Write; + for ch in buf { + write!(self.0, "{:02x}", ch).expect("writing to string"); + } + Ok(buf.len()) + } + + fn flush(&mut self) -> io::Result<()> { + Ok(()) + } +} + +#[cfg(any(test, feature = "std", feature = "alloc"))] +#[cfg_attr(docsrs, doc(cfg(any(feature = "std", feature = "alloc"))))] +impl FromHex for Vec { + fn from_byte_iter(iter: I) -> Result + where + I: Iterator> + ExactSizeIterator + DoubleEndedIterator, + { + iter.collect() + } +} + +macro_rules! impl_fromhex_array { + ($len:expr) => { + impl FromHex for [u8; $len] { + fn from_byte_iter(iter: I) -> Result + where + I: Iterator> + ExactSizeIterator + DoubleEndedIterator, + { + if iter.len() == $len { + let mut ret = [0; $len]; + for (n, byte) in iter.enumerate() { + ret[n] = byte?; + } + Ok(ret) + } else { + Err(Error::InvalidLength(2 * $len, 2 * iter.len())) + } + } + } + } +} + +impl_fromhex_array!(2); +impl_fromhex_array!(4); +impl_fromhex_array!(6); +impl_fromhex_array!(8); +impl_fromhex_array!(10); +impl_fromhex_array!(12); +impl_fromhex_array!(14); +impl_fromhex_array!(16); +impl_fromhex_array!(20); +impl_fromhex_array!(24); +impl_fromhex_array!(28); +impl_fromhex_array!(32); +impl_fromhex_array!(33); +impl_fromhex_array!(64); +impl_fromhex_array!(65); +impl_fromhex_array!(128); +impl_fromhex_array!(256); +impl_fromhex_array!(384); +impl_fromhex_array!(512); + +#[cfg(test)] +mod tests { + use super::*; + + use core::fmt; + use std::io::Write; + + #[test] + #[cfg(any(feature = "std", feature = "alloc"))] + fn hex_roundtrip() { + let expected = "0123456789abcdef"; + let expected_up = "0123456789ABCDEF"; + + let parse: Vec = FromHex::from_hex(expected).expect("parse lowercase string"); + assert_eq!(parse, vec![0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef]); + let ser = parse.to_hex(); + assert_eq!(ser, expected); + + let parse: Vec = FromHex::from_hex(expected_up).expect("parse uppercase string"); + assert_eq!(parse, vec![0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef]); + let ser = parse.to_hex(); + assert_eq!(ser, expected); + + let parse: [u8; 8] = FromHex::from_hex(expected_up).expect("parse uppercase string"); + assert_eq!(parse, [0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef]); + let ser = parse.to_hex(); + assert_eq!(ser, expected); + } + + #[test] + fn hex_truncate() { + struct HexBytes(Vec); + impl fmt::LowerHex for HexBytes { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + format_hex(&self.0, f) + } + } + + let bytes = HexBytes(vec![1u8, 2, 3, 4, 5, 6, 7, 8, 9, 10]); + + assert_eq!( + format!("{:x}", bytes), + "0102030405060708090a" + ); + + for i in 0..20 { + assert_eq!( + format!("{:.prec$x}", bytes, prec = i), + &"0102030405060708090a"[0..i] + ); + } + + assert_eq!( + format!("{:25x}", bytes), + "000000102030405060708090a" + ); + assert_eq!( + format!("{:26x}", bytes), + "0000000102030405060708090a" + ); + } + + #[test] + fn hex_truncate_rev() { + struct HexBytes(Vec); + impl fmt::LowerHex for HexBytes { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + format_hex_reverse(&self.0, f) + } + } + + let bytes = HexBytes(vec![1u8, 2, 3, 4, 5, 6, 7, 8, 9, 10]); + + assert_eq!( + format!("{:x}", bytes), + "0a090807060504030201" + ); + + for i in 0..20 { + assert_eq!( + format!("{:.prec$x}", bytes, prec = i), + &"0a090807060504030201"[0..i] + ); + } + + assert_eq!( + format!("{:25x}", bytes), + "000000a090807060504030201" + ); + assert_eq!( + format!("{:26x}", bytes), + "0000000a090807060504030201" + ); + } + + #[test] + #[cfg(any(feature = "std", feature = "alloc"))] + fn hex_error() { + let oddlen = "0123456789abcdef0"; + let badchar1 = "Z123456789abcdef"; + let badchar2 = "012Y456789abcdeb"; + let badchar3 = "«23456789abcdef"; + + assert_eq!( + Vec::::from_hex(oddlen), + Err(Error::OddLengthString(17)) + ); + assert_eq!( + <[u8; 4]>::from_hex(oddlen), + Err(Error::OddLengthString(17)) + ); + assert_eq!( + <[u8; 8]>::from_hex(oddlen), + Err(Error::OddLengthString(17)) + ); + assert_eq!( + Vec::::from_hex(badchar1), + Err(Error::InvalidChar(b'Z')) + ); + assert_eq!( + Vec::::from_hex(badchar2), + Err(Error::InvalidChar(b'Y')) + ); + assert_eq!( + Vec::::from_hex(badchar3), + Err(Error::InvalidChar(194)) + ); + } + + + #[test] + fn hex_writer() { + let vec: Vec<_> = (0u8..32).collect(); + let mut writer = HexWriter::new(64); + writer.write_all(&vec[..]).unwrap(); + assert_eq!(vec.to_hex(), writer.result()); + } +} + +#[cfg(bench)] +mod benches { + use test::{Bencher, black_box}; + use super::{ToHex, HexWriter}; + use std::io::Write; + use crate::{sha256, Hash}; + + #[bench] + fn bench_to_hex(bh: &mut Bencher) { + let hash = sha256::Hash::hash(&[0; 1]); + bh.iter(|| { + black_box(hash.to_hex()); + }) + } + + + #[bench] + fn bench_to_hex_writer(bh: &mut Bencher) { + let hash = sha256::Hash::hash(&[0; 1]); + bh.iter(|| { + let mut writer = HexWriter::new(64); + writer.write_all(hash.as_inner()).unwrap(); + black_box(writer.result()); + }) + } +} diff --git a/hashes/src/hmac.rs b/hashes/src/hmac.rs new file mode 100644 index 00000000..050ede06 --- /dev/null +++ b/hashes/src/hmac.rs @@ -0,0 +1,437 @@ +// Bitcoin Hashes Library +// Written in 2018 by +// Andrew Poelstra +// +// To the extent possible under law, the author(s) have dedicated all +// copyright and related and neighboring rights to this software to +// the public domain worldwide. This software is distributed without +// any warranty. +// +// You should have received a copy of the CC0 Public Domain Dedication +// along with this software. +// If not, see . +// + +// This module is largely copied from the rust-crypto ripemd.rs file; +// while rust-crypto is licensed under Apache, that file specifically +// was written entirely by Andrew Poelstra, who is re-licensing its +// contents here as CC0. + +//! Hash-based Message Authentication Code (HMAC). +//! + +use core::{borrow, fmt, ops, str}; +#[cfg(feature = "serde")] +use serde::{Serialize, Serializer, Deserialize, Deserializer}; + +use crate::{Error, Hash, HashEngine}; + +/// A hash computed from a RFC 2104 HMAC. Parameterized by the underlying hash function. +#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[cfg_attr(feature = "schemars", schemars(transparent))] +#[repr(transparent)] +pub struct Hmac(T); + +impl str::FromStr for Hmac { + type Err = ::Err; + fn from_str(s: &str) -> Result { + Ok(Hmac(str::FromStr::from_str(s)?)) + } +} + +/// Pair of underlying hash midstates which represent the current state of an `HmacEngine`. +pub struct HmacMidState { + /// Midstate of the inner hash engine + pub inner: ::MidState, + /// Midstate of the outer hash engine + pub outer: ::MidState, +} + +/// Pair of underyling hash engines, used for the inner and outer hash of HMAC. +#[derive(Clone)] +pub struct HmacEngine { + iengine: T::Engine, + oengine: T::Engine, +} + +impl Default for HmacEngine { + fn default() -> Self { + HmacEngine::new(&[]) + } +} + +impl HmacEngine { + /// Constructs a new keyed HMAC from `key`. + /// + /// We only support underlying hashes whose block sizes are ≤ 128 bytes. + /// + /// # Panics + /// + /// Larger hashes will result in a panic. + pub fn new(key: &[u8]) -> HmacEngine { + debug_assert!(T::Engine::BLOCK_SIZE <= 128); + + let mut ipad = [0x36u8; 128]; + let mut opad = [0x5cu8; 128]; + let mut ret = HmacEngine { + iengine: ::engine(), + oengine: ::engine(), + }; + + if key.len() > T::Engine::BLOCK_SIZE { + let hash = ::hash(key); + for (b_i, b_h) in ipad.iter_mut().zip(&hash[..]) { + *b_i ^= *b_h; + } + for (b_o, b_h) in opad.iter_mut().zip(&hash[..]) { + *b_o ^= *b_h; + } + } else { + for (b_i, b_h) in ipad.iter_mut().zip(key) { + *b_i ^= *b_h; + } + for (b_o, b_h) in opad.iter_mut().zip(key) { + *b_o ^= *b_h; + } + }; + + HashEngine::input(&mut ret.iengine, &ipad[..T::Engine::BLOCK_SIZE]); + HashEngine::input(&mut ret.oengine, &opad[..T::Engine::BLOCK_SIZE]); + ret + } + + /// A special constructor giving direct access to the underlying "inner" and "outer" engines. + pub fn from_inner_engines(iengine: T::Engine, oengine: T::Engine) -> HmacEngine { + HmacEngine { + iengine, + oengine, + } + } +} + +impl HashEngine for HmacEngine { + type MidState = HmacMidState; + + fn midstate(&self) -> Self::MidState { + HmacMidState { + inner: self.iengine.midstate(), + outer: self.oengine.midstate(), + } + } + + const BLOCK_SIZE: usize = T::Engine::BLOCK_SIZE; + + fn n_bytes_hashed(&self) -> usize { + self.iengine.n_bytes_hashed() + } + + fn input(&mut self, buf: &[u8]) { + self.iengine.input(buf) + } +} + +impl fmt::Debug for Hmac { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + fmt::Debug::fmt(&self.0, f) + } +} + +impl fmt::Display for Hmac { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + fmt::Display::fmt(&self.0, f) + } +} + +impl fmt::LowerHex for Hmac { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + fmt::LowerHex::fmt(&self.0, f) + } +} + +impl ops::Index for Hmac { + type Output = u8; + fn index(&self, index: usize) -> &u8 { + &self.0[index] + } +} + +impl ops::Index> for Hmac { + type Output = [u8]; + fn index(&self, index: ops::Range) -> &[u8] { + &self.0[index] + } +} + +impl ops::Index> for Hmac { + type Output = [u8]; + fn index(&self, index: ops::RangeFrom) -> &[u8] { + &self.0[index] + } +} + +impl ops::Index> for Hmac { + type Output = [u8]; + fn index(&self, index: ops::RangeTo) -> &[u8] { + &self.0[index] + } +} + +impl ops::Index for Hmac { + type Output = [u8]; + fn index(&self, index: ops::RangeFull) -> &[u8] { + &self.0[index] + } +} + +impl borrow::Borrow<[u8]> for Hmac { + fn borrow(&self) -> &[u8] { + &self[..] + } +} + +impl Hash for Hmac { + type Engine = HmacEngine; + type Inner = T::Inner; + + fn from_engine(mut e: HmacEngine) -> Hmac { + let ihash = T::from_engine(e.iengine); + e.oengine.input(&ihash[..]); + let ohash = T::from_engine(e.oengine); + Hmac(ohash) + } + + const LEN: usize = T::LEN; + + fn from_slice(sl: &[u8]) -> Result, Error> { + T::from_slice(sl).map(Hmac) + } + + fn into_inner(self) -> Self::Inner { + self.0.into_inner() + } + + fn as_inner(&self) -> &Self::Inner { + self.0.as_inner() + } + + fn from_inner(inner: T::Inner) -> Self { + Hmac(T::from_inner(inner)) + } + + fn all_zeros() -> Self { + let zeros = T::all_zeros(); + Hmac(zeros) + } +} + +#[cfg(feature = "serde")] +#[cfg_attr(docsrs, doc(cfg(feature = "serde")))] +impl Serialize for Hmac { + fn serialize(&self, s: S) -> Result { + Serialize::serialize(&self.0, s) + } +} + +#[cfg(feature = "serde")] +#[cfg_attr(docsrs, doc(cfg(feature = "serde")))] +impl<'de, T: Hash + Deserialize<'de>> Deserialize<'de> for Hmac { + fn deserialize>(d: D) -> Result, D::Error> { + let inner = Deserialize::deserialize(d)?; + Ok(Hmac(inner)) + } +} + +#[cfg(test)] +mod tests { + #[test] + #[cfg(any(feature = "std", feature = "alloc"))] + fn test() { + use crate::{sha256, HashEngine, HmacEngine, Hash, Hmac}; + + #[derive(Clone)] + struct Test { + key: Vec, + input: Vec, + output: Vec, + } + + let tests = vec![ + // Test vectors copied from libsecp256k1 + // Sadly the RFC2104 test vectors all use MD5 as their underlying hash function, + // which of course this library does not support. + Test { + key: vec![ 0x0b; 20], + input: vec![0x48, 0x69, 0x20, 0x54, 0x68, 0x65, 0x72, 0x65], + output: vec![ + 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, + 0x5c, 0xa8, 0xaf, 0xce, 0xaf, 0x0b, 0xf1, 0x2b, + 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83, 0x3d, 0xa7, + 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7, + ], + }, + Test { + key: vec![ 0x4a, 0x65, 0x66, 0x65 ], + input: vec![ + 0x77, 0x68, 0x61, 0x74, 0x20, 0x64, 0x6f, 0x20, + 0x79, 0x61, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x68, + 0x69, 0x6e, 0x67, 0x3f, + ], + output: vec![ + 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, + 0x6a, 0x04, 0x24, 0x26, 0x08, 0x95, 0x75, 0xc7, + 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27, 0x39, 0x83, + 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43, + ], + }, + Test { + key: vec![ 0xaa; 20 ], + input: vec![ 0xdd; 50 ], + output: vec![ + 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, + 0x85, 0x4d, 0xb8, 0xeb, 0xd0, 0x91, 0x81, 0xa7, + 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8, 0xc1, 0x22, + 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe, + ], + }, + Test { + key: vec![ + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, + 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, + 0x19 + ], + input: vec![ 0xcd; 50 ], + output: vec![ + 0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, + 0xa4, 0xcc, 0x81, 0x98, 0x99, 0xf2, 0x08, 0x3a, + 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78, 0xf8, 0x07, + 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b, + ], + }, + Test { + key: vec! [ 0xaa; 131 ], + input: vec![ + 0x54, 0x65, 0x73, 0x74, 0x20, 0x55, 0x73, 0x69, + 0x6e, 0x67, 0x20, 0x4c, 0x61, 0x72, 0x67, 0x65, + 0x72, 0x20, 0x54, 0x68, 0x61, 0x6e, 0x20, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x2d, 0x53, 0x69, 0x7a, + 0x65, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x2d, 0x20, + 0x48, 0x61, 0x73, 0x68, 0x20, 0x4b, 0x65, 0x79, + 0x20, 0x46, 0x69, 0x72, 0x73, 0x74, + ], + output: vec![ + 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, + 0x0d, 0x8a, 0x26, 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, + 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28, 0xc5, 0x14, + 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54, + ], + }, + Test { + key: vec! [ 0xaa; 131 ], + input: vec![ + 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, + 0x61, 0x20, 0x74, 0x65, 0x73, 0x74, 0x20, 0x75, + 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x6c, + 0x61, 0x72, 0x67, 0x65, 0x72, 0x20, 0x74, 0x68, + 0x61, 0x6e, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6b, 0x65, + 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x20, + 0x6c, 0x61, 0x72, 0x67, 0x65, 0x72, 0x20, 0x74, + 0x68, 0x61, 0x6e, 0x20, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x20, 0x54, 0x68, 0x65, + 0x20, 0x6b, 0x65, 0x79, 0x20, 0x6e, 0x65, 0x65, + 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, + 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, + 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x62, + 0x65, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x73, 0x65, + 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x48, 0x4d, 0x41, 0x43, 0x20, 0x61, 0x6c, + 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x2e, + ], + output: vec![ + 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, + 0x27, 0x63, 0x5f, 0xbc, 0xd5, 0xb0, 0xe9, 0x44, + 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07, 0x13, 0x93, + 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2, + ], + }, + ]; + + for test in tests { + let mut engine = HmacEngine::::new(&test.key); + engine.input(&test.input); + let hash = Hmac::::from_engine(engine); + assert_eq!(&hash[..], &test.output[..]); + assert_eq!(hash.into_inner()[..].as_ref(), test.output.as_slice()); + } + } + + #[cfg(feature = "serde")] + #[test] + fn hmac_sha512_serde() { + use serde_test::{Configure, Token, assert_tokens}; + use crate::{sha512, Hash, Hmac}; + + static HASH_BYTES: [u8; 64] = [ + 0x8b, 0x41, 0xe1, 0xb7, 0x8a, 0xd1, 0x15, 0x21, + 0x11, 0x3c, 0x52, 0xff, 0x18, 0x2a, 0x1b, 0x8e, + 0x0a, 0x19, 0x57, 0x54, 0xaa, 0x52, 0x7f, 0xcd, + 0x00, 0xa4, 0x11, 0x62, 0x0b, 0x46, 0xf2, 0x0f, + 0xff, 0xfb, 0x80, 0x88, 0xcc, 0xf8, 0x54, 0x97, + 0x12, 0x1a, 0xd4, 0x49, 0x9e, 0x08, 0x45, 0xb8, + 0x76, 0xf6, 0xdd, 0x66, 0x40, 0x08, 0x8a, 0x2f, + 0x0b, 0x2d, 0x8a, 0x60, 0x0b, 0xdf, 0x4c, 0x0c, + ]; + + let hash = Hmac::::from_slice(&HASH_BYTES).expect("right number of bytes"); + assert_tokens(&hash.compact(), &[Token::BorrowedBytes(&HASH_BYTES[..])]); + assert_tokens( + &hash.readable(), + &[Token::Str( + "8b41e1b78ad11521113c52ff182a1b8e0a195754aa527fcd00a411620b46f20f\ + fffb8088ccf85497121ad4499e0845b876f6dd6640088a2f0b2d8a600bdf4c0c" + )], + ); + } +} + +#[cfg(bench)] +mod benches { + use test::Bencher; + + use crate::{Hmac, Hash, HashEngine, sha256}; + + #[bench] + pub fn hmac_sha256_10(bh: &mut Bencher) { + let mut engine = Hmac::::engine(); + let bytes = [1u8; 10]; + bh.iter( || { + engine.input(&bytes); + }); + bh.bytes = bytes.len() as u64; + } + + #[bench] + pub fn hmac_sha256_1k(bh: &mut Bencher) { + let mut engine = Hmac::::engine(); + let bytes = [1u8; 1024]; + bh.iter( || { + engine.input(&bytes); + }); + bh.bytes = bytes.len() as u64; + } + + #[bench] + pub fn hmac_sha256_64k(bh: &mut Bencher) { + let mut engine = Hmac::::engine(); + let bytes = [1u8; 65536]; + bh.iter( || { + engine.input(&bytes); + }); + bh.bytes = bytes.len() as u64; + } + +} diff --git a/hashes/src/impls.rs b/hashes/src/impls.rs new file mode 100644 index 00000000..b7a7ff7c --- /dev/null +++ b/hashes/src/impls.rs @@ -0,0 +1,205 @@ +// Bitcoin Hashes Library +// Written in 2019 by +// Andrew Poelstra +// +// To the extent possible under law, the author(s) have dedicated all +// copyright and related and neighboring rights to this software to +// the public domain worldwide. This software is distributed without +// any warranty. +// +// You should have received a copy of the CC0 Public Domain Dedication +// along with this software. +// If not, see . +// + +//! `std` / `core2` Impls. +//! +//! Implementations of traits defined in `std` / `core2` and not in `core`. +//! + +#[cfg(feature = "std")] +use std::{error, io}; + +#[cfg(not(feature = "std"))] +use core2::{error, io}; + +use crate::{Error, HashEngine, hex, sha1, sha256, sha512, ripemd160, siphash24, hmac}; + +impl error::Error for Error { + #[cfg(feature = "std")] + fn cause(&self) -> Option<&error::Error> { None } + #[cfg(feature = "std")] + fn description(&self) -> &str { "`std::error::description` is deprecated" } +} + +impl error::Error for hex::Error { + #[cfg(feature = "std")] + fn cause(&self) -> Option<&error::Error> { None } + #[cfg(feature = "std")] + fn description(&self) -> &str { "`std::error::description` is deprecated" } +} + +impl io::Write for sha1::HashEngine { + fn flush(&mut self) -> io::Result<()> { Ok(()) } + + fn write(&mut self, buf: &[u8]) -> io::Result { + self.input(buf); + Ok(buf.len()) + } +} + +impl io::Write for sha256::HashEngine { + fn flush(&mut self) -> io::Result<()> { Ok(()) } + + fn write(&mut self, buf: &[u8]) -> io::Result { + self.input(buf); + Ok(buf.len()) + } +} + +impl io::Write for sha512::HashEngine { + fn flush(&mut self) -> io::Result<()> { Ok(()) } + + fn write(&mut self, buf: &[u8]) -> io::Result { + self.input(buf); + Ok(buf.len()) + } +} + +impl io::Write for ripemd160::HashEngine { + fn flush(&mut self) -> io::Result<()> { Ok(()) } + + fn write(&mut self, buf: &[u8]) -> io::Result { + self.input(buf); + Ok(buf.len()) + } +} + +impl io::Write for siphash24::HashEngine { + fn flush(&mut self) -> io::Result<()> { Ok(()) } + + fn write(&mut self, buf: &[u8]) -> io::Result { + self.input(buf); + Ok(buf.len()) + } +} + +impl io::Write for hmac::HmacEngine { + fn flush(&mut self) -> io::Result<()> { Ok(()) } + + fn write(&mut self, buf: &[u8]) -> io::Result { + self.input(buf); + Ok(buf.len()) + } +} + +#[cfg(test)] +mod tests { + use super::io::Write; + + use crate::{Hash, sha1, sha256, sha256d, sha512, ripemd160, hash160, siphash24, hmac}; + + macro_rules! write_test { + ($mod:ident, $exp_empty:expr, $exp_256:expr, $exp_64k:expr,) => { + #[test] + fn $mod() { + let mut engine = $mod::Hash::engine(); + engine.write_all(&[]).unwrap(); + assert_eq!( + format!("{}", $mod::Hash::from_engine(engine)), + $exp_empty + ); + + let mut engine = $mod::Hash::engine(); + engine.write_all(&[1; 256]).unwrap(); + assert_eq!( + format!("{}", $mod::Hash::from_engine(engine)), + $exp_256 + ); + + let mut engine = $mod::Hash::engine(); + engine.write_all(&[99; 64000]).unwrap(); + assert_eq!( + format!("{}", $mod::Hash::from_engine(engine)), + $exp_64k + ); + } + } + } + + write_test!( + sha1, + "da39a3ee5e6b4b0d3255bfef95601890afd80709", + "ac458b067c6b021c7e9358229b636e9d1e4cb154", + "e4b66838f9f7b6f91e5be32a02ae78094df402e7", + ); + + write_test!( + sha256, + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "2661920f2409dd6c8adeb0c44972959f232b6429afa913845d0fd95e7e768234", + "5c5e904f5d4fd587c7a906bf846e08a927286f388c54c39213a4884695271bbc", + ); + + write_test!( + sha256d, + "56944c5d3f98413ef45cf54545538103cc9f298e0575820ad3591376e2e0f65d", + "374000d830c75d10d9417e493a7652920f30efbd300e3fb092f24c28c20baf64", + "0050d4148ad7a0437ca0643fad5bf4614cd95d9ba21fde52370b37dcc3f03307", + ); + + write_test!( + sha512, + "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce\ + 47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e", + "57ecf739d3a7ca647639adae80a05f4f361304bfcbfa1ceba93296b096e74287\ + 45fc10c142cecdd3bb587a3dba598c072f6f78b31cc0a06a3da0105ee51f75d6", + "dd28f78c53f3bc9bd0c2dca9642a1ad402a70412f985c1f6e54fadb98ce9c458\ + 4761df8d04ed04bb734ba48dd2106bb9ea54524f1394cdd18e6da3166e71c3ee", + ); + + write_test!( + ripemd160, + "9c1185a5c5e9fc54612808977ee8f548b2258d31", + "e571a1ca5b780aa52bafdb9ec852544ffca418ba", + "ddd2ecce739e823629c7d46ab18918e9c4a51c75", + ); + + write_test!( + hash160, + "b472a266d0bd89c13706a4132ccfb16f7c3b9fcb", + "671356a1a874695ad3bc20cae440f4360835bd5a", + "a9608c952c8dbcc20c53803d2ca5ad31d64d9313", + ); + + write_test!( + siphash24, + "d70077739d4b921e", + "3a3ccefde9b5b1e3", + "ce456e4e4ecbc5bf", + ); + + #[test] + fn hmac() { + let mut engine = hmac::HmacEngine::::new(&[0xde, 0xad, 0xbe, 0xef]); + engine.write_all(&[]).unwrap(); + assert_eq!( + format!("{}", hmac::Hmac::from_engine(engine)), + "bf5515149cf797955c4d3194cca42472883281951697c8375d9d9b107f384225" + ); + + let mut engine = hmac::HmacEngine::::new(&[0xde, 0xad, 0xbe, 0xef]); + engine.write_all(&[1; 256]).unwrap(); + assert_eq!( + format!("{}", hmac::Hmac::from_engine(engine)), + "59c9aca10c81c73cb4c196d94db741b6bf2050e0153d5a45f2526bff34675ac5" + ); + + let mut engine = hmac::HmacEngine::::new(&[0xde, 0xad, 0xbe, 0xef]); + engine.write_all(&[99; 64000]).unwrap(); + assert_eq!( + format!("{}", hmac::Hmac::from_engine(engine)), + "30df499717415a395379a1eaabe50038036e4abb5afc94aa55c952f4aa57be08" + ); + } +} diff --git a/hashes/src/internal_macros.rs b/hashes/src/internal_macros.rs new file mode 100644 index 00000000..897917a1 --- /dev/null +++ b/hashes/src/internal_macros.rs @@ -0,0 +1,127 @@ +//! Non-public macros + +/// Adds trait impls to the type called `Hash` in the current scope. +/// +/// Implpements various conversion traits as well as the [`crate::Hash`] trait. +/// Arguments: +/// +/// * `$bits` - number of bits this hash type has +/// * `$reversed` - `bool` - `true` if the hash type should be displayed backwards, `false` +/// otherwise. +/// * `$gen: $gent` - generic type(s) and trait bound(s) +/// +/// Restrictions on usage: +/// +/// * There must be a free-standing `fn from_engine(HashEngine) -> Hash` in the scope +/// * `fn internal_new([u8; $bits / 8]) -> Self` must exist on `Hash` +/// * `fn internal_engine() -> HashEngine` must exist on `Hash` +/// +/// `from_engine` obviously implements the finalization algorithm. +/// `internal_new` is required so that types with more than one field are constructible. +/// `internal_engine` is required to initialize the engine for given hash type. +macro_rules! hash_trait_impls { + ($bits:expr, $reversed:expr $(, $gen:ident: $gent:ident)*) => { + impl<$($gen: $gent),*> str::FromStr for Hash<$($gen),*> { + type Err = hex::Error; + fn from_str(s: &str) -> Result { + hex::FromHex::from_hex(s) + } + } + + hex_fmt_impl!(Hash $(, $gen: $gent)*); + serde_impl!(Hash, $bits / 8 $(, $gen: $gent)*); + borrow_slice_impl!(Hash $(, $gen: $gent)*); + + impl $(, $gen: $gent)*> Index for Hash<$($gen),*> { + type Output = I::Output; + + #[inline] + fn index(&self, index: I) -> &Self::Output { + &self.0[index] + } + } + + impl<$($gen: $gent),*> crate::Hash for Hash<$($gen),*> { + type Engine = HashEngine; + type Inner = [u8; $bits / 8]; + + const LEN: usize = $bits / 8; + const DISPLAY_BACKWARD: bool = $reversed; + + fn engine() -> Self::Engine { + Self::internal_engine() + } + + fn from_engine(e: HashEngine) -> Hash<$($gen),*> { + from_engine(e) + } + + fn from_slice(sl: &[u8]) -> Result, Error> { + if sl.len() != $bits / 8 { + Err(Error::InvalidLength(Self::LEN, sl.len())) + } else { + let mut ret = [0; $bits / 8]; + ret.copy_from_slice(sl); + Ok(Self::internal_new(ret)) + } + } + + fn into_inner(self) -> Self::Inner { + self.0 + } + + fn as_inner(&self) -> &Self::Inner { + &self.0 + } + + fn from_inner(inner: Self::Inner) -> Self { + Self::internal_new(inner) + } + + fn all_zeros() -> Self { + Hash::internal_new([0x00; $bits / 8]) + } + } + } +} +pub(crate) use hash_trait_impls; + +/// Creates a type called `Hash` and implements standard interface for it. +/// +/// The created type will have all standard derives, `Hash` impl and implementation of +/// `internal_engine` returning default. The created type has a single field. +/// +/// Arguments: +/// +/// * `$bits` - the number of bits of the hash type +/// * `$reversed` - `true` if the hash should be displayed backwards, `false` otherwise +/// * `$doc` - doc string to put on the type +/// * `$schemars` - a literal that goes into `schema_with`. +/// +/// The `from_engine` free-standing function is still required with this macro. See the doc of +/// [`hash_trait_impls`]. +macro_rules! hash_type { + ($bits:expr, $reversed:expr, $doc:literal, $schemars:literal) => { + #[doc = $doc] + #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] + #[cfg_attr(feature = "schemars", derive(crate::schemars::JsonSchema))] + #[repr(transparent)] + pub struct Hash( + #[cfg_attr(feature = "schemars", schemars(schema_with = $schemars))] + [u8; $bits / 8] + ); + + impl Hash { + fn internal_new(arr: [u8; $bits / 8]) -> Self { + Hash(arr) + } + + fn internal_engine() -> HashEngine { + Default::default() + } + } + + crate::internal_macros::hash_trait_impls!($bits, $reversed); + } +} +pub(crate) use hash_type; diff --git a/hashes/src/lib.rs b/hashes/src/lib.rs new file mode 100644 index 00000000..b4180238 --- /dev/null +++ b/hashes/src/lib.rs @@ -0,0 +1,237 @@ +// Bitcoin Hashes Library +// Written in 2018 by +// Andrew Poelstra +// +// To the extent possible under law, the author(s) have dedicated all +// copyright and related and neighboring rights to this software to +// the public domain worldwide. This software is distributed without +// any warranty. +// +// You should have received a copy of the CC0 Public Domain Dedication +// along with this software. +// If not, see . +// + +//! Rust hashes library. +//! +//! This is a simple, no-dependency library which implements the hash functions +//! needed by Bitcoin. These are SHA256, SHA256d, and RIPEMD160. As an ancillary +//! thing, it exposes hexadecimal serialization and deserialization, since these +//! are needed to display hashes anway. +//! +//! ## Commonly used operations +//! +//! Hashing a single byte slice or a string: +//! +//! ```rust +//! use bitcoin_hashes::sha256; +//! use bitcoin_hashes::Hash; +//! +//! let bytes = [0u8; 5]; +//! let hash_of_bytes = sha256::Hash::hash(&bytes); +//! let hash_of_string = sha256::Hash::hash("some string".as_bytes()); +//! ``` +//! +//! +//! Hashing content from a reader: +//! +//! ```rust +//! use bitcoin_hashes::sha256; +//! use bitcoin_hashes::Hash; +//! +//! #[cfg(std)] +//! # fn main() -> std::io::Result<()> { +//! let mut reader: &[u8] = b"hello"; // in real code, this could be a `File` or `TcpStream` +//! let mut engine = sha256::HashEngine::default(); +//! std::io::copy(&mut reader, &mut engine)?; +//! let hash = sha256::Hash::from_engine(engine); +//! # Ok(()) +//! # } +//! +//! #[cfg(not(std))] +//! # fn main() {} +//! ``` +//! +//! +//! Hashing content by [`std::io::Write`] on HashEngine: +//! +//! ```rust +//! use bitcoin_hashes::sha256; +//! use bitcoin_hashes::Hash; +//! use std::io::Write; +//! +//! #[cfg(std)] +//! # fn main() -> std::io::Result<()> { +//! let mut part1: &[u8] = b"hello"; +//! let mut part2: &[u8] = b" "; +//! let mut part3: &[u8] = b"world"; +//! let mut engine = sha256::HashEngine::default(); +//! engine.write_all(part1)?; +//! engine.write_all(part2)?; +//! engine.write_all(part3)?; +//! let hash = sha256::Hash::from_engine(engine); +//! # Ok(()) +//! # } +//! +//! #[cfg(not(std))] +//! # fn main() {} +//! ``` + +// Coding conventions +#![deny(non_upper_case_globals)] +#![deny(non_camel_case_types)] +#![deny(non_snake_case)] +#![deny(unused_mut)] +#![deny(missing_docs)] + +// Experimental features we need. +#![cfg_attr(docsrs, feature(doc_cfg))] +#![cfg_attr(bench, feature(test))] + +// In general, rust is absolutely horrid at supporting users doing things like, +// for example, compiling Rust code for real environments. Disable useless lints +// that don't do anything but annoy us and cant actually ever be resolved. +#![allow(bare_trait_objects)] +#![allow(ellipsis_inclusive_range_patterns)] + +#![cfg_attr(all(not(test), not(feature = "std")), no_std)] + +#[cfg(bench)] extern crate test; +#[cfg(any(test, feature = "std"))] extern crate core; +#[cfg(feature = "core2")] extern crate core2; +#[cfg(feature = "alloc")] extern crate alloc; +#[cfg(all(not(feature = "alloc"), feature = "std"))] use std as alloc; +#[cfg(feature = "serde")] pub extern crate serde; +#[cfg(all(test,feature = "serde"))] extern crate serde_test; + +#[doc(hidden)] +pub mod _export { + /// A re-export of core::* + pub mod _core { + pub use core::*; + } +} + +#[cfg(feature = "schemars")] +extern crate actual_schemars as schemars; + +mod internal_macros; +#[macro_use] mod util; +#[macro_use] pub mod serde_macros; +#[cfg(any(feature = "std", feature = "core2"))] mod impls; +pub mod error; +pub mod hex; +pub mod hash160; +pub mod hmac; +pub mod ripemd160; +pub mod sha1; +pub mod sha256; +pub mod sha256d; +pub mod sha256t; +pub mod siphash24; +pub mod sha512; +pub mod cmp; + +use core::{borrow, fmt, hash, ops}; + +pub use hmac::{Hmac, HmacEngine}; +pub use error::Error; + +/// A hashing engine which bytes can be serialized into. +pub trait HashEngine: Clone + Default { + /// Byte array representing the internal state of the hash engine. + type MidState; + + /// Outputs the midstate of the hash engine. This function should not be + /// used directly unless you really know what you're doing. + fn midstate(&self) -> Self::MidState; + + /// Length of the hash's internal block size, in bytes. + const BLOCK_SIZE: usize; + + /// Add data to the hash engine. + fn input(&mut self, data: &[u8]); + + /// Return the number of bytes already n_bytes_hashed(inputted). + fn n_bytes_hashed(&self) -> usize; +} + +/// Trait which applies to hashes of all types. +pub trait Hash: Copy + Clone + PartialEq + Eq + PartialOrd + Ord + + hash::Hash + fmt::Debug + fmt::Display + fmt::LowerHex + + ops::Index + + ops::Index, Output = [u8]> + + ops::Index, Output = [u8]> + + ops::Index, Output = [u8]> + + ops::Index + + borrow::Borrow<[u8]> +{ + /// A hashing engine which bytes can be serialized into. It is expected + /// to implement the `io::Write` trait, and to never return errors under + /// any conditions. + type Engine: HashEngine; + + /// The byte array that represents the hash internally. + type Inner: hex::FromHex; + + /// Constructs a new engine. + fn engine() -> Self::Engine { + Self::Engine::default() + } + + /// Produces a hash from the current state of a given engine. + fn from_engine(e: Self::Engine) -> Self; + + /// Length of the hash, in bytes. + const LEN: usize; + + /// Copies a byte slice into a hash object. + fn from_slice(sl: &[u8]) -> Result; + + /// Hashes some bytes. + fn hash(data: &[u8]) -> Self { + let mut engine = Self::engine(); + engine.input(data); + Self::from_engine(engine) + } + + /// Flag indicating whether user-visible serializations of this hash + /// should be backward. For some reason Satoshi decided this should be + /// true for `Sha256dHash`, so here we are. + const DISPLAY_BACKWARD: bool = false; + + /// Unwraps the hash and returns the underlying byte array. + fn into_inner(self) -> Self::Inner; + + /// Unwraps the hash and returns a reference to the underlying byte array. + fn as_inner(&self) -> &Self::Inner; + + /// Constructs a hash from the underlying byte array. + fn from_inner(inner: Self::Inner) -> Self; + + /// Returns an all zero hash. + /// + /// An all zeros hash is a made up construct because there is not a known input that can create + /// it, however it is used in various places in Bitcoin e.g., the Bitcoin genesis block's + /// previous blockhash and the coinbase transaction's outpoint txid. + fn all_zeros() -> Self; +} + +#[cfg(test)] +mod tests { + use crate::{Hash, sha256d}; + + hash_newtype!(TestNewtype, sha256d::Hash, 32, doc="A test newtype"); + hash_newtype!(TestNewtype2, sha256d::Hash, 32, doc="A test newtype"); + + #[test] + fn convert_newtypes() { + let h1 = TestNewtype::hash(&[]); + let h2: TestNewtype2 = h1.as_hash().into(); + assert_eq!(&h1[..], &h2[..]); + + let h = sha256d::Hash::hash(&[]); + let h2: TestNewtype = h.to_string().parse().unwrap(); + assert_eq!(h2.as_hash(), h); + } +} diff --git a/hashes/src/ripemd160.rs b/hashes/src/ripemd160.rs new file mode 100644 index 00000000..30d24172 --- /dev/null +++ b/hashes/src/ripemd160.rs @@ -0,0 +1,544 @@ +// Bitcoin Hashes Library +// Written in 2018 by +// Andrew Poelstra +// +// To the extent possible under law, the author(s) have dedicated all +// copyright and related and neighboring rights to this software to +// the public domain worldwide. This software is distributed without +// any warranty. +// +// You should have received a copy of the CC0 Public Domain Dedication +// along with this software. +// If not, see . +// + +// This module is largely copied from the rust-crypto ripemd.rs file; +// while rust-crypto is licensed under Apache, that file specifically +// was written entirely by Andrew Poelstra, who is re-licensing its +// contents here as CC0. + +//! RIPEMD160 implementation. +//! + +use core::{cmp, str}; +use core::convert::TryInto; +use core::ops::Index; +use core::slice::SliceIndex; + +use crate::{Error, HashEngine as _, hex}; + +crate::internal_macros::hash_type! { + 160, + false, + "Output of the RIPEMD160 hash function.", + "crate::util::json_hex_string::len_20" +} + +#[cfg(not(fuzzing))] +fn from_engine(mut e: HashEngine) -> Hash { + // pad buffer with a single 1-bit then all 0s, until there are exactly 8 bytes remaining + let data_len = e.length as u64; + + let zeroes = [0; BLOCK_SIZE - 8]; + e.input(&[0x80]); + if e.length % BLOCK_SIZE > zeroes.len() { + e.input(&zeroes); + } + let pad_length = zeroes.len() - (e.length % BLOCK_SIZE); + e.input(&zeroes[..pad_length]); + debug_assert_eq!(e.length % BLOCK_SIZE, zeroes.len()); + + e.input(&(8 * data_len).to_le_bytes()); + debug_assert_eq!(e.length % BLOCK_SIZE, 0); + + Hash(e.midstate()) +} + +#[cfg(fuzzing)] +fn from_engine(e: HashEngine) -> Hash { + let mut res = e.midstate(); + res[0] ^= (e.length & 0xff) as u8; + Hash(res) +} + +const BLOCK_SIZE: usize = 64; + +/// Engine to compute RIPEMD160 hash function. +#[derive(Clone)] +pub struct HashEngine { + buffer: [u8; BLOCK_SIZE], + h: [u32; 5], + length: usize, +} + +impl Default for HashEngine { + fn default() -> Self { + HashEngine { + h: [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0], + length: 0, + buffer: [0; BLOCK_SIZE], + } + } +} + +impl crate::HashEngine for HashEngine { + type MidState = [u8; 20]; + + #[cfg(not(fuzzing))] + fn midstate(&self) -> [u8; 20] { + let mut ret = [0; 20]; + for (val, ret_bytes) in self.h.iter().zip(ret.chunks_exact_mut(4)) { + ret_bytes.copy_from_slice(&(*val).to_le_bytes()); + } + ret + } + + #[cfg(fuzzing)] + fn midstate(&self) -> [u8; 20] { + let mut ret = [0; 20]; + ret.copy_from_slice(&self.buffer[..20]); + ret + } + + const BLOCK_SIZE: usize = 64; + + fn n_bytes_hashed(&self) -> usize { + self.length + } + + engine_input_impl!(); +} + +macro_rules! round( + ($a:expr, $b:expr, $c:expr, $d:expr, $e:expr, + $x:expr, $bits:expr, $add:expr, $round:expr) => ({ + $a = $a.wrapping_add($round).wrapping_add($x).wrapping_add($add); + $a = $a.rotate_left($bits).wrapping_add($e); + $c = $c.rotate_left(10); + }); +); + +macro_rules! process_block( + ($h:expr, $data:expr, + $( round1: h_ordering $f0:expr, $f1:expr, $f2:expr, $f3:expr, $f4:expr; + data_index $data_index1:expr; roll_shift $bits1:expr; )* + $( round2: h_ordering $g0:expr, $g1:expr, $g2:expr, $g3:expr, $g4:expr; + data_index $data_index2:expr; roll_shift $bits2:expr; )* + $( round3: h_ordering $h0:expr, $h1:expr, $h2:expr, $h3:expr, $h4:expr; + data_index $data_index3:expr; roll_shift $bits3:expr; )* + $( round4: h_ordering $i0:expr, $i1:expr, $i2:expr, $i3:expr, $i4:expr; + data_index $data_index4:expr; roll_shift $bits4:expr; )* + $( round5: h_ordering $j0:expr, $j1:expr, $j2:expr, $j3:expr, $j4:expr; + data_index $data_index5:expr; roll_shift $bits5:expr; )* + $( par_round1: h_ordering $pj0:expr, $pj1:expr, $pj2:expr, $pj3:expr, $pj4:expr; + data_index $pdata_index1:expr; roll_shift $pbits1:expr; )* + $( par_round2: h_ordering $pi0:expr, $pi1:expr, $pi2:expr, $pi3:expr, $pi4:expr; + data_index $pdata_index2:expr; roll_shift $pbits2:expr; )* + $( par_round3: h_ordering $ph0:expr, $ph1:expr, $ph2:expr, $ph3:expr, $ph4:expr; + data_index $pdata_index3:expr; roll_shift $pbits3:expr; )* + $( par_round4: h_ordering $pg0:expr, $pg1:expr, $pg2:expr, $pg3:expr, $pg4:expr; + data_index $pdata_index4:expr; roll_shift $pbits4:expr; )* + $( par_round5: h_ordering $pf0:expr, $pf1:expr, $pf2:expr, $pf3:expr, $pf4:expr; + data_index $pdata_index5:expr; roll_shift $pbits5:expr; )* + ) => ({ + let mut bb = $h; + let mut bbb = $h; + + // Round 1 + $( round!(bb[$f0], bb[$f1], bb[$f2], bb[$f3], bb[$f4], + $data[$data_index1], $bits1, 0x00000000, + bb[$f1] ^ bb[$f2] ^ bb[$f3]); )* + + // Round 2 + $( round!(bb[$g0], bb[$g1], bb[$g2], bb[$g3], bb[$g4], + $data[$data_index2], $bits2, 0x5a827999, + (bb[$g1] & bb[$g2]) | (!bb[$g1] & bb[$g3])); )* + + // Round 3 + $( round!(bb[$h0], bb[$h1], bb[$h2], bb[$h3], bb[$h4], + $data[$data_index3], $bits3, 0x6ed9eba1, + (bb[$h1] | !bb[$h2]) ^ bb[$h3]); )* + + // Round 4 + $( round!(bb[$i0], bb[$i1], bb[$i2], bb[$i3], bb[$i4], + $data[$data_index4], $bits4, 0x8f1bbcdc, + (bb[$i1] & bb[$i3]) | (bb[$i2] & !bb[$i3])); )* + + // Round 5 + $( round!(bb[$j0], bb[$j1], bb[$j2], bb[$j3], bb[$j4], + $data[$data_index5], $bits5, 0xa953fd4e, + bb[$j1] ^ (bb[$j2] | !bb[$j3])); )* + + // Parallel rounds: these are the same as the previous five + // rounds except that the constants have changed, we work + // with the other buffer, and they are applied in reverse + // order. + + // Parallel Round 1 + $( round!(bbb[$pj0], bbb[$pj1], bbb[$pj2], bbb[$pj3], bbb[$pj4], + $data[$pdata_index1], $pbits1, 0x50a28be6, + bbb[$pj1] ^ (bbb[$pj2] | !bbb[$pj3])); )* + + // Porallel Round 2 + $( round!(bbb[$pi0], bbb[$pi1], bbb[$pi2], bbb[$pi3], bbb[$pi4], + $data[$pdata_index2], $pbits2, 0x5c4dd124, + (bbb[$pi1] & bbb[$pi3]) | (bbb[$pi2] & !bbb[$pi3])); )* + + // Parallel Round 3 + $( round!(bbb[$ph0], bbb[$ph1], bbb[$ph2], bbb[$ph3], bbb[$ph4], + $data[$pdata_index3], $pbits3, 0x6d703ef3, + (bbb[$ph1] | !bbb[$ph2]) ^ bbb[$ph3]); )* + + // Parallel Round 4 + $( round!(bbb[$pg0], bbb[$pg1], bbb[$pg2], bbb[$pg3], bbb[$pg4], + $data[$pdata_index4], $pbits4, 0x7a6d76e9, + (bbb[$pg1] & bbb[$pg2]) | (!bbb[$pg1] & bbb[$pg3])); )* + + // Parallel Round 5 + $( round!(bbb[$pf0], bbb[$pf1], bbb[$pf2], bbb[$pf3], bbb[$pf4], + $data[$pdata_index5], $pbits5, 0x00000000, + bbb[$pf1] ^ bbb[$pf2] ^ bbb[$pf3]); )* + + // Combine results + bbb[3] = bbb[3].wrapping_add($h[1]).wrapping_add(bb[2]); + $h[1] = $h[2].wrapping_add(bb[3]).wrapping_add(bbb[4]); + $h[2] = $h[3].wrapping_add(bb[4]).wrapping_add(bbb[0]); + $h[3] = $h[4].wrapping_add(bb[0]).wrapping_add(bbb[1]); + $h[4] = $h[0].wrapping_add(bb[1]).wrapping_add(bbb[2]); + $h[0] = bbb[3]; + }); +); + +impl HashEngine { + fn process_block(&mut self) { + debug_assert_eq!(self.buffer.len(), BLOCK_SIZE); + + let mut w = [0u32; 16]; + for (w_val, buff_bytes) in w.iter_mut().zip(self.buffer.chunks_exact(4)) { + *w_val = u32::from_le_bytes(buff_bytes.try_into().expect("4 byte slice")) + } + + process_block!(self.h, w, + // Round 1 + round1: h_ordering 0, 1, 2, 3, 4; data_index 0; roll_shift 11; + round1: h_ordering 4, 0, 1, 2, 3; data_index 1; roll_shift 14; + round1: h_ordering 3, 4, 0, 1, 2; data_index 2; roll_shift 15; + round1: h_ordering 2, 3, 4, 0, 1; data_index 3; roll_shift 12; + round1: h_ordering 1, 2, 3, 4, 0; data_index 4; roll_shift 5; + round1: h_ordering 0, 1, 2, 3, 4; data_index 5; roll_shift 8; + round1: h_ordering 4, 0, 1, 2, 3; data_index 6; roll_shift 7; + round1: h_ordering 3, 4, 0, 1, 2; data_index 7; roll_shift 9; + round1: h_ordering 2, 3, 4, 0, 1; data_index 8; roll_shift 11; + round1: h_ordering 1, 2, 3, 4, 0; data_index 9; roll_shift 13; + round1: h_ordering 0, 1, 2, 3, 4; data_index 10; roll_shift 14; + round1: h_ordering 4, 0, 1, 2, 3; data_index 11; roll_shift 15; + round1: h_ordering 3, 4, 0, 1, 2; data_index 12; roll_shift 6; + round1: h_ordering 2, 3, 4, 0, 1; data_index 13; roll_shift 7; + round1: h_ordering 1, 2, 3, 4, 0; data_index 14; roll_shift 9; + round1: h_ordering 0, 1, 2, 3, 4; data_index 15; roll_shift 8; + + // Round 2 + round2: h_ordering 4, 0, 1, 2, 3; data_index 7; roll_shift 7; + round2: h_ordering 3, 4, 0, 1, 2; data_index 4; roll_shift 6; + round2: h_ordering 2, 3, 4, 0, 1; data_index 13; roll_shift 8; + round2: h_ordering 1, 2, 3, 4, 0; data_index 1; roll_shift 13; + round2: h_ordering 0, 1, 2, 3, 4; data_index 10; roll_shift 11; + round2: h_ordering 4, 0, 1, 2, 3; data_index 6; roll_shift 9; + round2: h_ordering 3, 4, 0, 1, 2; data_index 15; roll_shift 7; + round2: h_ordering 2, 3, 4, 0, 1; data_index 3; roll_shift 15; + round2: h_ordering 1, 2, 3, 4, 0; data_index 12; roll_shift 7; + round2: h_ordering 0, 1, 2, 3, 4; data_index 0; roll_shift 12; + round2: h_ordering 4, 0, 1, 2, 3; data_index 9; roll_shift 15; + round2: h_ordering 3, 4, 0, 1, 2; data_index 5; roll_shift 9; + round2: h_ordering 2, 3, 4, 0, 1; data_index 2; roll_shift 11; + round2: h_ordering 1, 2, 3, 4, 0; data_index 14; roll_shift 7; + round2: h_ordering 0, 1, 2, 3, 4; data_index 11; roll_shift 13; + round2: h_ordering 4, 0, 1, 2, 3; data_index 8; roll_shift 12; + + // Round 3 + round3: h_ordering 3, 4, 0, 1, 2; data_index 3; roll_shift 11; + round3: h_ordering 2, 3, 4, 0, 1; data_index 10; roll_shift 13; + round3: h_ordering 1, 2, 3, 4, 0; data_index 14; roll_shift 6; + round3: h_ordering 0, 1, 2, 3, 4; data_index 4; roll_shift 7; + round3: h_ordering 4, 0, 1, 2, 3; data_index 9; roll_shift 14; + round3: h_ordering 3, 4, 0, 1, 2; data_index 15; roll_shift 9; + round3: h_ordering 2, 3, 4, 0, 1; data_index 8; roll_shift 13; + round3: h_ordering 1, 2, 3, 4, 0; data_index 1; roll_shift 15; + round3: h_ordering 0, 1, 2, 3, 4; data_index 2; roll_shift 14; + round3: h_ordering 4, 0, 1, 2, 3; data_index 7; roll_shift 8; + round3: h_ordering 3, 4, 0, 1, 2; data_index 0; roll_shift 13; + round3: h_ordering 2, 3, 4, 0, 1; data_index 6; roll_shift 6; + round3: h_ordering 1, 2, 3, 4, 0; data_index 13; roll_shift 5; + round3: h_ordering 0, 1, 2, 3, 4; data_index 11; roll_shift 12; + round3: h_ordering 4, 0, 1, 2, 3; data_index 5; roll_shift 7; + round3: h_ordering 3, 4, 0, 1, 2; data_index 12; roll_shift 5; + + // Round 4 + round4: h_ordering 2, 3, 4, 0, 1; data_index 1; roll_shift 11; + round4: h_ordering 1, 2, 3, 4, 0; data_index 9; roll_shift 12; + round4: h_ordering 0, 1, 2, 3, 4; data_index 11; roll_shift 14; + round4: h_ordering 4, 0, 1, 2, 3; data_index 10; roll_shift 15; + round4: h_ordering 3, 4, 0, 1, 2; data_index 0; roll_shift 14; + round4: h_ordering 2, 3, 4, 0, 1; data_index 8; roll_shift 15; + round4: h_ordering 1, 2, 3, 4, 0; data_index 12; roll_shift 9; + round4: h_ordering 0, 1, 2, 3, 4; data_index 4; roll_shift 8; + round4: h_ordering 4, 0, 1, 2, 3; data_index 13; roll_shift 9; + round4: h_ordering 3, 4, 0, 1, 2; data_index 3; roll_shift 14; + round4: h_ordering 2, 3, 4, 0, 1; data_index 7; roll_shift 5; + round4: h_ordering 1, 2, 3, 4, 0; data_index 15; roll_shift 6; + round4: h_ordering 0, 1, 2, 3, 4; data_index 14; roll_shift 8; + round4: h_ordering 4, 0, 1, 2, 3; data_index 5; roll_shift 6; + round4: h_ordering 3, 4, 0, 1, 2; data_index 6; roll_shift 5; + round4: h_ordering 2, 3, 4, 0, 1; data_index 2; roll_shift 12; + + // Round 5 + round5: h_ordering 1, 2, 3, 4, 0; data_index 4; roll_shift 9; + round5: h_ordering 0, 1, 2, 3, 4; data_index 0; roll_shift 15; + round5: h_ordering 4, 0, 1, 2, 3; data_index 5; roll_shift 5; + round5: h_ordering 3, 4, 0, 1, 2; data_index 9; roll_shift 11; + round5: h_ordering 2, 3, 4, 0, 1; data_index 7; roll_shift 6; + round5: h_ordering 1, 2, 3, 4, 0; data_index 12; roll_shift 8; + round5: h_ordering 0, 1, 2, 3, 4; data_index 2; roll_shift 13; + round5: h_ordering 4, 0, 1, 2, 3; data_index 10; roll_shift 12; + round5: h_ordering 3, 4, 0, 1, 2; data_index 14; roll_shift 5; + round5: h_ordering 2, 3, 4, 0, 1; data_index 1; roll_shift 12; + round5: h_ordering 1, 2, 3, 4, 0; data_index 3; roll_shift 13; + round5: h_ordering 0, 1, 2, 3, 4; data_index 8; roll_shift 14; + round5: h_ordering 4, 0, 1, 2, 3; data_index 11; roll_shift 11; + round5: h_ordering 3, 4, 0, 1, 2; data_index 6; roll_shift 8; + round5: h_ordering 2, 3, 4, 0, 1; data_index 15; roll_shift 5; + round5: h_ordering 1, 2, 3, 4, 0; data_index 13; roll_shift 6; + + // Porallel Round 1; + par_round1: h_ordering 0, 1, 2, 3, 4; data_index 5; roll_shift 8; + par_round1: h_ordering 4, 0, 1, 2, 3; data_index 14; roll_shift 9; + par_round1: h_ordering 3, 4, 0, 1, 2; data_index 7; roll_shift 9; + par_round1: h_ordering 2, 3, 4, 0, 1; data_index 0; roll_shift 11; + par_round1: h_ordering 1, 2, 3, 4, 0; data_index 9; roll_shift 13; + par_round1: h_ordering 0, 1, 2, 3, 4; data_index 2; roll_shift 15; + par_round1: h_ordering 4, 0, 1, 2, 3; data_index 11; roll_shift 15; + par_round1: h_ordering 3, 4, 0, 1, 2; data_index 4; roll_shift 5; + par_round1: h_ordering 2, 3, 4, 0, 1; data_index 13; roll_shift 7; + par_round1: h_ordering 1, 2, 3, 4, 0; data_index 6; roll_shift 7; + par_round1: h_ordering 0, 1, 2, 3, 4; data_index 15; roll_shift 8; + par_round1: h_ordering 4, 0, 1, 2, 3; data_index 8; roll_shift 11; + par_round1: h_ordering 3, 4, 0, 1, 2; data_index 1; roll_shift 14; + par_round1: h_ordering 2, 3, 4, 0, 1; data_index 10; roll_shift 14; + par_round1: h_ordering 1, 2, 3, 4, 0; data_index 3; roll_shift 12; + par_round1: h_ordering 0, 1, 2, 3, 4; data_index 12; roll_shift 6; + + // Parallel Round 2 + par_round2: h_ordering 4, 0, 1, 2, 3; data_index 6; roll_shift 9; + par_round2: h_ordering 3, 4, 0, 1, 2; data_index 11; roll_shift 13; + par_round2: h_ordering 2, 3, 4, 0, 1; data_index 3; roll_shift 15; + par_round2: h_ordering 1, 2, 3, 4, 0; data_index 7; roll_shift 7; + par_round2: h_ordering 0, 1, 2, 3, 4; data_index 0; roll_shift 12; + par_round2: h_ordering 4, 0, 1, 2, 3; data_index 13; roll_shift 8; + par_round2: h_ordering 3, 4, 0, 1, 2; data_index 5; roll_shift 9; + par_round2: h_ordering 2, 3, 4, 0, 1; data_index 10; roll_shift 11; + par_round2: h_ordering 1, 2, 3, 4, 0; data_index 14; roll_shift 7; + par_round2: h_ordering 0, 1, 2, 3, 4; data_index 15; roll_shift 7; + par_round2: h_ordering 4, 0, 1, 2, 3; data_index 8; roll_shift 12; + par_round2: h_ordering 3, 4, 0, 1, 2; data_index 12; roll_shift 7; + par_round2: h_ordering 2, 3, 4, 0, 1; data_index 4; roll_shift 6; + par_round2: h_ordering 1, 2, 3, 4, 0; data_index 9; roll_shift 15; + par_round2: h_ordering 0, 1, 2, 3, 4; data_index 1; roll_shift 13; + par_round2: h_ordering 4, 0, 1, 2, 3; data_index 2; roll_shift 11; + + // Parallel Round 3 + par_round3: h_ordering 3, 4, 0, 1, 2; data_index 15; roll_shift 9; + par_round3: h_ordering 2, 3, 4, 0, 1; data_index 5; roll_shift 7; + par_round3: h_ordering 1, 2, 3, 4, 0; data_index 1; roll_shift 15; + par_round3: h_ordering 0, 1, 2, 3, 4; data_index 3; roll_shift 11; + par_round3: h_ordering 4, 0, 1, 2, 3; data_index 7; roll_shift 8; + par_round3: h_ordering 3, 4, 0, 1, 2; data_index 14; roll_shift 6; + par_round3: h_ordering 2, 3, 4, 0, 1; data_index 6; roll_shift 6; + par_round3: h_ordering 1, 2, 3, 4, 0; data_index 9; roll_shift 14; + par_round3: h_ordering 0, 1, 2, 3, 4; data_index 11; roll_shift 12; + par_round3: h_ordering 4, 0, 1, 2, 3; data_index 8; roll_shift 13; + par_round3: h_ordering 3, 4, 0, 1, 2; data_index 12; roll_shift 5; + par_round3: h_ordering 2, 3, 4, 0, 1; data_index 2; roll_shift 14; + par_round3: h_ordering 1, 2, 3, 4, 0; data_index 10; roll_shift 13; + par_round3: h_ordering 0, 1, 2, 3, 4; data_index 0; roll_shift 13; + par_round3: h_ordering 4, 0, 1, 2, 3; data_index 4; roll_shift 7; + par_round3: h_ordering 3, 4, 0, 1, 2; data_index 13; roll_shift 5; + + // Parallel Round 4 + par_round4: h_ordering 2, 3, 4, 0, 1; data_index 8; roll_shift 15; + par_round4: h_ordering 1, 2, 3, 4, 0; data_index 6; roll_shift 5; + par_round4: h_ordering 0, 1, 2, 3, 4; data_index 4; roll_shift 8; + par_round4: h_ordering 4, 0, 1, 2, 3; data_index 1; roll_shift 11; + par_round4: h_ordering 3, 4, 0, 1, 2; data_index 3; roll_shift 14; + par_round4: h_ordering 2, 3, 4, 0, 1; data_index 11; roll_shift 14; + par_round4: h_ordering 1, 2, 3, 4, 0; data_index 15; roll_shift 6; + par_round4: h_ordering 0, 1, 2, 3, 4; data_index 0; roll_shift 14; + par_round4: h_ordering 4, 0, 1, 2, 3; data_index 5; roll_shift 6; + par_round4: h_ordering 3, 4, 0, 1, 2; data_index 12; roll_shift 9; + par_round4: h_ordering 2, 3, 4, 0, 1; data_index 2; roll_shift 12; + par_round4: h_ordering 1, 2, 3, 4, 0; data_index 13; roll_shift 9; + par_round4: h_ordering 0, 1, 2, 3, 4; data_index 9; roll_shift 12; + par_round4: h_ordering 4, 0, 1, 2, 3; data_index 7; roll_shift 5; + par_round4: h_ordering 3, 4, 0, 1, 2; data_index 10; roll_shift 15; + par_round4: h_ordering 2, 3, 4, 0, 1; data_index 14; roll_shift 8; + + // Parallel Round 5 + par_round5: h_ordering 1, 2, 3, 4, 0; data_index 12; roll_shift 8; + par_round5: h_ordering 0, 1, 2, 3, 4; data_index 15; roll_shift 5; + par_round5: h_ordering 4, 0, 1, 2, 3; data_index 10; roll_shift 12; + par_round5: h_ordering 3, 4, 0, 1, 2; data_index 4; roll_shift 9; + par_round5: h_ordering 2, 3, 4, 0, 1; data_index 1; roll_shift 12; + par_round5: h_ordering 1, 2, 3, 4, 0; data_index 5; roll_shift 5; + par_round5: h_ordering 0, 1, 2, 3, 4; data_index 8; roll_shift 14; + par_round5: h_ordering 4, 0, 1, 2, 3; data_index 7; roll_shift 6; + par_round5: h_ordering 3, 4, 0, 1, 2; data_index 6; roll_shift 8; + par_round5: h_ordering 2, 3, 4, 0, 1; data_index 2; roll_shift 13; + par_round5: h_ordering 1, 2, 3, 4, 0; data_index 13; roll_shift 6; + par_round5: h_ordering 0, 1, 2, 3, 4; data_index 14; roll_shift 5; + par_round5: h_ordering 4, 0, 1, 2, 3; data_index 0; roll_shift 15; + par_round5: h_ordering 3, 4, 0, 1, 2; data_index 3; roll_shift 13; + par_round5: h_ordering 2, 3, 4, 0, 1; data_index 9; roll_shift 11; + par_round5: h_ordering 1, 2, 3, 4, 0; data_index 11; roll_shift 11; + ); + } +} + +#[cfg(test)] +mod tests { + #[test] + #[cfg(any(feature = "std", feature = "alloc"))] + fn test() { + use crate::{Hash, HashEngine, ripemd160}; + use crate::hex::{FromHex, ToHex}; + + #[derive(Clone)] + struct Test { + input: &'static str, + output: Vec, + output_str: &'static str, + } + + let tests = vec![ + // Test messages from FIPS 180-1 + Test { + input: "abc", + output: vec![ + 0x8e, 0xb2, 0x08, 0xf7, + 0xe0, 0x5d, 0x98, 0x7a, + 0x9b, 0x04, 0x4a, 0x8e, + 0x98, 0xc6, 0xb0, 0x87, + 0xf1, 0x5a, 0x0b, 0xfc, + ], + output_str: "8eb208f7e05d987a9b044a8e98c6b087f15a0bfc" + }, + Test { + input: + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + output: vec![ + 0x12, 0xa0, 0x53, 0x38, + 0x4a, 0x9c, 0x0c, 0x88, + 0xe4, 0x05, 0xa0, 0x6c, + 0x27, 0xdc, 0xf4, 0x9a, + 0xda, 0x62, 0xeb, 0x2b, + ], + output_str: "12a053384a9c0c88e405a06c27dcf49ada62eb2b" + }, + // Examples from wikipedia + Test { + input: "The quick brown fox jumps over the lazy dog", + output: vec![ + 0x37, 0xf3, 0x32, 0xf6, + 0x8d, 0xb7, 0x7b, 0xd9, + 0xd7, 0xed, 0xd4, 0x96, + 0x95, 0x71, 0xad, 0x67, + 0x1c, 0xf9, 0xdd, 0x3b, + ], + output_str: "37f332f68db77bd9d7edd4969571ad671cf9dd3b", + }, + Test { + input: "The quick brown fox jumps over the lazy cog", + output: vec![ + 0x13, 0x20, 0x72, 0xdf, + 0x69, 0x09, 0x33, 0x83, + 0x5e, 0xb8, 0xb6, 0xad, + 0x0b, 0x77, 0xe7, 0xb6, + 0xf1, 0x4a, 0xca, 0xd7, + ], + output_str: "132072df690933835eb8b6ad0b77e7b6f14acad7", + }, + ]; + + for test in tests { + // Hash through high-level API, check hex encoding/decoding + let hash = ripemd160::Hash::hash(&test.input.as_bytes()); + assert_eq!(hash, ripemd160::Hash::from_hex(test.output_str).expect("parse hex")); + assert_eq!(&hash[..], &test.output[..]); + assert_eq!(&hash.to_hex(), &test.output_str); + + // Hash through engine, checking that we can input byte by byte + let mut engine = ripemd160::Hash::engine(); + for ch in test.input.as_bytes() { + engine.input(&[*ch]); + } + let manual_hash = ripemd160::Hash::from_engine(engine); + assert_eq!(hash, manual_hash); + assert_eq!(hash.into_inner()[..].as_ref(), test.output.as_slice()); + } + } + + #[cfg(feature = "serde")] + #[test] + fn ripemd_serde() { + use serde_test::{Configure, Token, assert_tokens}; + use crate::{ripemd160, Hash}; + + static HASH_BYTES: [u8; 20] = [ + 0x13, 0x20, 0x72, 0xdf, + 0x69, 0x09, 0x33, 0x83, + 0x5e, 0xb8, 0xb6, 0xad, + 0x0b, 0x77, 0xe7, 0xb6, + 0xf1, 0x4a, 0xca, 0xd7, + ]; + + let hash = ripemd160::Hash::from_slice(&HASH_BYTES).expect("right number of bytes"); + assert_tokens(&hash.compact(), &[Token::BorrowedBytes(&HASH_BYTES[..])]); + assert_tokens(&hash.readable(), &[Token::Str("132072df690933835eb8b6ad0b77e7b6f14acad7")]); + } +} + +#[cfg(bench)] +mod benches { + use test::Bencher; + + use crate::{Hash, HashEngine, ripemd160}; + + #[bench] + pub fn ripemd160_10(bh: &mut Bencher) { + let mut engine = ripemd160::Hash::engine(); + let bytes = [1u8; 10]; + bh.iter( || { + engine.input(&bytes); + }); + bh.bytes = bytes.len() as u64; + } + + #[bench] + pub fn ripemd160_1k(bh: &mut Bencher) { + let mut engine = ripemd160::Hash::engine(); + let bytes = [1u8; 1024]; + bh.iter( || { + engine.input(&bytes); + }); + bh.bytes = bytes.len() as u64; + } + + #[bench] + pub fn ripemd160_64k(bh: &mut Bencher) { + let mut engine = ripemd160::Hash::engine(); + let bytes = [1u8; 65536]; + bh.iter( || { + engine.input(&bytes); + }); + bh.bytes = bytes.len() as u64; + } + +} diff --git a/hashes/src/serde_macros.rs b/hashes/src/serde_macros.rs new file mode 100644 index 00000000..c8658aa5 --- /dev/null +++ b/hashes/src/serde_macros.rs @@ -0,0 +1,158 @@ +// Bitcoin Hashes Library +// Written in 2018 by +// Andrew Poelstra +// +// To the extent possible under law, the author(s) have dedicated all +// copyright and related and neighboring rights to this software to +// the public domain worldwide. This software is distributed without +// any warranty. +// +// You should have received a copy of the CC0 Public Domain Dedication +// along with this software. +// If not, see . +// + +//! Macros for serde trait implementations, and supporting code. +//! + +/// Functions used by serde impls of all hashes. +#[cfg(feature = "serde")] +#[cfg_attr(docsrs, doc(cfg(feature = "serde")))] +pub mod serde_details { + use crate::Error; + + use core::marker::PhantomData; + use core::{fmt, ops, str}; + use core::str::FromStr; + struct HexVisitor(PhantomData); + use serde::{de, Serializer, Deserializer}; + + impl<'de, ValueT> de::Visitor<'de> for HexVisitor + where + ValueT: FromStr, + ::Err: fmt::Display, + { + type Value = ValueT; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("an ASCII hex string") + } + + fn visit_bytes(self, v: &[u8]) -> Result + where + E: de::Error, + { + if let Ok(hex) = str::from_utf8(v) { + Self::Value::from_str(hex).map_err(E::custom) + } else { + return Err(E::invalid_value( + de::Unexpected::Bytes(v), + &self, + )); + } + } + + fn visit_str(self, v: &str) -> Result + where + E: de::Error, + { + Self::Value::from_str(v).map_err(E::custom) + } + } + + struct BytesVisitor(PhantomData); + + impl<'de, ValueT> de::Visitor<'de> for BytesVisitor + where + ValueT: SerdeHash, + ::Err: fmt::Display, + { + type Value = ValueT; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("a bytestring") + } + + fn visit_bytes(self, v: &[u8]) -> Result + where + E: de::Error, + { + SerdeHash::from_slice_delegated(v).map_err(|_| { + // from_slice only errors on incorrect length + E::invalid_length(v.len(), &stringify!(N)) + }) + } + } + + /// Default serialization/deserialization methods. + pub trait SerdeHash + where + Self: Sized + + FromStr + + fmt::Display + + ops::Index + + ops::Index, + ::Err: fmt::Display, + { + /// Size, in bits, of the hash. + const N: usize; + + /// Helper function to turn a deserialized slice into the correct hash type. + fn from_slice_delegated(sl: &[u8]) -> Result; + + /// Do serde serialization. + fn serialize(&self, s: S) -> Result { + if s.is_human_readable() { + s.collect_str(self) + } else { + s.serialize_bytes(&self[..]) + } + } + + /// Do serde deserialization. + fn deserialize<'de, D: Deserializer<'de>>(d: D) -> Result { + if d.is_human_readable() { + d.deserialize_str(HexVisitor::(PhantomData)) + } else { + d.deserialize_bytes(BytesVisitor::(PhantomData)) + } + } + } +} + +/// Implements `Serialize` and `Deserialize` for a type `$t` which +/// represents a newtype over a byte-slice over length `$len`. +#[macro_export] +#[cfg(feature = "serde")] +#[cfg_attr(docsrs, doc(cfg(feature = "serde")))] +macro_rules! serde_impl( + ($t:ident, $len:expr $(, $gen:ident: $gent:ident)*) => ( + impl<$($gen: $gent),*> $crate::serde_macros::serde_details::SerdeHash for $t<$($gen),*> { + const N : usize = $len; + fn from_slice_delegated(sl: &[u8]) -> Result { + #[allow(unused_imports)] + use $crate::Hash as _; + $t::from_slice(sl) + } + } + + impl<$($gen: $gent),*> $crate::serde::Serialize for $t<$($gen),*> { + fn serialize(&self, s: S) -> Result { + $crate::serde_macros::serde_details::SerdeHash::serialize(self, s) + } + } + + impl<'de $(, $gen: $gent)*> $crate::serde::Deserialize<'de> for $t<$($gen),*> { + fn deserialize>(d: D) -> Result<$t<$($gen),*>, D::Error> { + $crate::serde_macros::serde_details::SerdeHash::deserialize(d) + } + } +)); + +/// Does an "empty" serde implementation for the configuration without serde feature. +#[macro_export] +#[cfg(not(feature = "serde"))] +#[cfg_attr(docsrs, doc(cfg(not(feature = "serde"))))] +macro_rules! serde_impl( + ($t:ident, $len:expr $(, $gen:ident: $gent:ident)*) => () +); diff --git a/hashes/src/sha1.rs b/hashes/src/sha1.rs new file mode 100644 index 00000000..a342d193 --- /dev/null +++ b/hashes/src/sha1.rs @@ -0,0 +1,270 @@ +// Bitcoin Hashes Library +// Written in 2018 by +// Andrew Poelstra +// +// To the extent possible under law, the author(s) have dedicated all +// copyright and related and neighboring rights to this software to +// the public domain worldwide. This software is distributed without +// any warranty. +// +// You should have received a copy of the CC0 Public Domain Dedication +// along with this software. +// If not, see . +// + +//! SHA1 implementation. +//! + +use core::{cmp, str}; +use core::convert::TryInto; +use core::ops::Index; +use core::slice::SliceIndex; + +use crate::{Error, HashEngine as _, hex}; + +crate::internal_macros::hash_type! { + 160, + false, + "Output of the SHA1 hash function.", + "crate::util::json_hex_string::len_20" +} + +fn from_engine(mut e: HashEngine) -> Hash { + // pad buffer with a single 1-bit then all 0s, until there are exactly 8 bytes remaining + let data_len = e.length as u64; + + let zeroes = [0; BLOCK_SIZE - 8]; + e.input(&[0x80]); + if e.length % BLOCK_SIZE > zeroes.len() { + e.input(&zeroes); + } + let pad_length = zeroes.len() - (e.length % BLOCK_SIZE); + e.input(&zeroes[..pad_length]); + debug_assert_eq!(e.length % BLOCK_SIZE, zeroes.len()); + + e.input(&(8 * data_len).to_be_bytes()); + debug_assert_eq!(e.length % BLOCK_SIZE, 0); + + Hash(e.midstate()) +} + +const BLOCK_SIZE: usize = 64; + +/// Engine to compute SHA1 hash function. +#[derive(Clone)] +pub struct HashEngine { + buffer: [u8; BLOCK_SIZE], + h: [u32; 5], + length: usize, +} + +impl Default for HashEngine { + fn default() -> Self { + HashEngine { + h: [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0], + length: 0, + buffer: [0; BLOCK_SIZE], + } + } +} + +impl crate::HashEngine for HashEngine { + type MidState = [u8; 20]; + + #[cfg(not(fuzzing))] + fn midstate(&self) -> [u8; 20] { + let mut ret = [0; 20]; + for (val, ret_bytes) in self.h.iter().zip(ret.chunks_exact_mut(4)) { + ret_bytes.copy_from_slice(&val.to_be_bytes()) + } + ret + } + + #[cfg(fuzzing)] + fn midstate(&self) -> [u8; 20] { + let mut ret = [0; 20]; + ret.copy_from_slice(&self.buffer[..20]); + ret + } + + const BLOCK_SIZE: usize = 64; + + fn n_bytes_hashed(&self) -> usize { + self.length + } + + engine_input_impl!(); +} + +impl HashEngine { + // Basic unoptimized algorithm from Wikipedia + fn process_block(&mut self) { + debug_assert_eq!(self.buffer.len(), BLOCK_SIZE); + + let mut w = [0u32; 80]; + for (w_val, buff_bytes) in w.iter_mut().zip(self.buffer.chunks_exact(4)) { + *w_val = u32::from_be_bytes(buff_bytes.try_into().expect("4 bytes slice")) + } + for i in 16..80 { + w[i] =(w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16]).rotate_left(1); + } + + let mut a = self.h[0]; + let mut b = self.h[1]; + let mut c = self.h[2]; + let mut d = self.h[3]; + let mut e = self.h[4]; + + for (i, &wi) in w.iter().enumerate() { + let (f, k) = match i { + 0...19 => ((b & c) | (!b & d), 0x5a827999), + 20...39 => (b ^ c ^ d, 0x6ed9eba1), + 40...59 => ((b & c) | (b & d) | (c & d), 0x8f1bbcdc), + 60...79 => (b ^ c ^ d, 0xca62c1d6), + _ => unreachable!() + }; + + let new_a = a.rotate_left(5).wrapping_add(f).wrapping_add(e).wrapping_add(k).wrapping_add(wi); + e = d; + d = c; + c = b.rotate_left(30); + b = a; + a = new_a; + } + + self.h[0] = self.h[0].wrapping_add(a); + self.h[1] = self.h[1].wrapping_add(b); + self.h[2] = self.h[2].wrapping_add(c); + self.h[3] = self.h[3].wrapping_add(d); + self.h[4] = self.h[4].wrapping_add(e); + } +} + +#[cfg(test)] +mod tests { + #[test] + #[cfg(any(feature = "std", feature = "alloc"))] + fn test() { + use crate::{sha1, Hash, HashEngine}; + use crate::hex::{FromHex, ToHex}; + + #[derive(Clone)] + struct Test { + input: &'static str, + output: Vec, + output_str: &'static str, + } + + + let tests = vec![ + // Examples from wikipedia + Test { + input: "", + output: vec![ + 0xda, 0x39, 0xa3, 0xee, + 0x5e, 0x6b, 0x4b, 0x0d, + 0x32, 0x55, 0xbf, 0xef, + 0x95, 0x60, 0x18, 0x90, + 0xaf, 0xd8, 0x07, 0x09, + ], + output_str: "da39a3ee5e6b4b0d3255bfef95601890afd80709" + }, + Test { + input: "The quick brown fox jumps over the lazy dog", + output: vec![ + 0x2f, 0xd4, 0xe1, 0xc6, + 0x7a, 0x2d, 0x28, 0xfc, + 0xed, 0x84, 0x9e, 0xe1, + 0xbb, 0x76, 0xe7, 0x39, + 0x1b, 0x93, 0xeb, 0x12, + ], + output_str: "2fd4e1c67a2d28fced849ee1bb76e7391b93eb12", + }, + Test { + input: "The quick brown fox jumps over the lazy cog", + output: vec![ + 0xde, 0x9f, 0x2c, 0x7f, + 0xd2, 0x5e, 0x1b, 0x3a, + 0xfa, 0xd3, 0xe8, 0x5a, + 0x0b, 0xd1, 0x7d, 0x9b, + 0x10, 0x0d, 0xb4, 0xb3, + ], + output_str: "de9f2c7fd25e1b3afad3e85a0bd17d9b100db4b3", + }, + ]; + + for test in tests { + // Hash through high-level API, check hex encoding/decoding + let hash = sha1::Hash::hash(&test.input.as_bytes()); + assert_eq!(hash, sha1::Hash::from_hex(test.output_str).expect("parse hex")); + assert_eq!(&hash[..], &test.output[..]); + assert_eq!(&hash.to_hex(), &test.output_str); + + // Hash through engine, checking that we can input byte by byte + let mut engine = sha1::Hash::engine(); + for ch in test.input.as_bytes() { + engine.input(&[*ch]); + } + let manual_hash = sha1::Hash::from_engine(engine); + assert_eq!(hash, manual_hash); + assert_eq!(hash.into_inner()[..].as_ref(), test.output.as_slice()); + } + } + + #[cfg(feature = "serde")] + #[test] + fn sha1_serde() { + use serde_test::{Configure, Token, assert_tokens}; + use crate::{sha1, Hash}; + + static HASH_BYTES: [u8; 20] = [ + 0x13, 0x20, 0x72, 0xdf, + 0x69, 0x09, 0x33, 0x83, + 0x5e, 0xb8, 0xb6, 0xad, + 0x0b, 0x77, 0xe7, 0xb6, + 0xf1, 0x4a, 0xca, 0xd7, + ]; + + let hash = sha1::Hash::from_slice(&HASH_BYTES).expect("right number of bytes"); + assert_tokens(&hash.compact(), &[Token::BorrowedBytes(&HASH_BYTES[..])]); + assert_tokens(&hash.readable(), &[Token::Str("132072df690933835eb8b6ad0b77e7b6f14acad7")]); + } +} + +#[cfg(bench)] +mod benches { + use test::Bencher; + + use crate::{Hash, HashEngine, sha1}; + + #[bench] + pub fn sha1_10(bh: &mut Bencher) { + let mut engine = sha1::Hash::engine(); + let bytes = [1u8; 10]; + bh.iter( || { + engine.input(&bytes); + }); + bh.bytes = bytes.len() as u64; + } + + #[bench] + pub fn sha1_1k(bh: &mut Bencher) { + let mut engine = sha1::Hash::engine(); + let bytes = [1u8; 1024]; + bh.iter( || { + engine.input(&bytes); + }); + bh.bytes = bytes.len() as u64; + } + + #[bench] + pub fn sha1_64k(bh: &mut Bencher) { + let mut engine = sha1::Hash::engine(); + let bytes = [1u8; 65536]; + bh.iter( || { + engine.input(&bytes); + }); + bh.bytes = bytes.len() as u64; + } + +} diff --git a/hashes/src/sha256.rs b/hashes/src/sha256.rs new file mode 100644 index 00000000..cc4d5364 --- /dev/null +++ b/hashes/src/sha256.rs @@ -0,0 +1,532 @@ +// Bitcoin Hashes Library +// Written in 2018 by +// Andrew Poelstra +// +// To the extent possible under law, the author(s) have dedicated all +// copyright and related and neighboring rights to this software to +// the public domain worldwide. This software is distributed without +// any warranty. +// +// You should have received a copy of the CC0 Public Domain Dedication +// along with this software. +// If not, see . +// + +//! SHA256 implementation. +//! + +use core::{cmp, str}; +use core::convert::TryInto; +use core::ops::Index; +use core::slice::SliceIndex; + +use crate::{Error, HashEngine as _, hex, sha256d}; + +crate::internal_macros::hash_type! { + 256, + false, + "Output of the SHA256 hash function.", + "crate::util::json_hex_string::len_32" +} + +#[cfg(not(fuzzing))] +fn from_engine(mut e: HashEngine) -> Hash { + // pad buffer with a single 1-bit then all 0s, until there are exactly 8 bytes remaining + let data_len = e.length as u64; + + let zeroes = [0; BLOCK_SIZE - 8]; + e.input(&[0x80]); + if e.length % BLOCK_SIZE > zeroes.len() { + e.input(&zeroes); + } + let pad_length = zeroes.len() - (e.length % BLOCK_SIZE); + e.input(&zeroes[..pad_length]); + debug_assert_eq!(e.length % BLOCK_SIZE, zeroes.len()); + + e.input(&(8 * data_len).to_be_bytes()); + debug_assert_eq!(e.length % BLOCK_SIZE, 0); + + Hash(e.midstate().into_inner()) +} + +#[cfg(fuzzing)] +fn from_engine(e: HashEngine) -> Hash { + let mut hash = e.midstate().into_inner(); + if hash == [0; 32] { + // Assume sha256 is secure and never generate 0-hashes (which represent invalid + // secp256k1 secret keys, causing downstream application breakage). + hash[0] = 1; + } + Hash(hash) +} + +const BLOCK_SIZE: usize = 64; + +/// Engine to compute SHA256 hash function. +#[derive(Clone)] +pub struct HashEngine { + buffer: [u8; BLOCK_SIZE], + h: [u32; 8], + length: usize, +} + +impl Default for HashEngine { + fn default() -> Self { + HashEngine { + h: [0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19], + length: 0, + buffer: [0; BLOCK_SIZE], + } + } +} + +impl crate::HashEngine for HashEngine { + type MidState = Midstate; + + #[cfg(not(fuzzing))] + fn midstate(&self) -> Midstate { + let mut ret = [0; 32]; + for (val, ret_bytes) in self.h.iter().zip(ret.chunks_exact_mut(4)) { + ret_bytes.copy_from_slice(&val.to_be_bytes()); + } + Midstate(ret) + } + + #[cfg(fuzzing)] + fn midstate(&self) -> Midstate { + let mut ret = [0; 32]; + ret.copy_from_slice(&self.buffer[..32]); + Midstate(ret) + } + + const BLOCK_SIZE: usize = 64; + + fn n_bytes_hashed(&self) -> usize { + self.length + } + + engine_input_impl!(); +} + +impl Hash { + /// Iterate the sha256 algorithm to turn a sha256 hash into a sha256d hash + pub fn hash_again(&self) -> sha256d::Hash { + crate::Hash::from_inner(::hash(&self.0).0) + } +} + +/// Output of the SHA256 hash function. +#[derive(Copy, Clone, PartialEq, Eq, Default, PartialOrd, Ord, Hash)] +pub struct Midstate(pub [u8; 32]); + +hex_fmt_impl!(Midstate); +serde_impl!(Midstate, 32); +borrow_slice_impl!(Midstate); + +impl> Index for Midstate { + type Output = I::Output; + + #[inline] + fn index(&self, index: I) -> &Self::Output { + &self.0[index] + } +} + +impl str::FromStr for Midstate { + type Err = hex::Error; + fn from_str(s: &str) -> Result { + hex::FromHex::from_hex(s) + } +} + +impl Midstate { + /// Length of the midstate, in bytes. + const LEN: usize = 32; + + /// Flag indicating whether user-visible serializations of this hash + /// should be backward. For some reason Satoshi decided this should be + /// true for `Sha256dHash`, so here we are. + const DISPLAY_BACKWARD: bool = true; + + /// Construct a new [`Midstate`] from the inner value. + pub fn from_inner(inner: [u8; 32]) -> Self { + Midstate(inner) + } + + /// Copies a byte slice into the [`Midstate`] object. + pub fn from_slice(sl: &[u8]) -> Result { + if sl.len() != Self::LEN { + Err(Error::InvalidLength(Self::LEN, sl.len())) + } else { + let mut ret = [0; 32]; + ret.copy_from_slice(sl); + Ok(Midstate(ret)) + } + } + + /// Unwraps the [`Midstate`] and returns the underlying byte array. + pub fn into_inner(self) -> [u8; 32] { + self.0 + } +} + +impl hex::FromHex for Midstate { + fn from_byte_iter(iter: I) -> Result + where + I: Iterator> + ExactSizeIterator + DoubleEndedIterator, + { + // DISPLAY_BACKWARD is true + Ok(Midstate::from_inner(hex::FromHex::from_byte_iter(iter.rev())?)) + } +} + +macro_rules! Ch( ($x:expr, $y:expr, $z:expr) => ($z ^ ($x & ($y ^ $z))) ); +macro_rules! Maj( ($x:expr, $y:expr, $z:expr) => (($x & $y) | ($z & ($x | $y))) ); +macro_rules! Sigma0( ($x:expr) => ($x.rotate_left(30) ^ $x.rotate_left(19) ^ $x.rotate_left(10)) ); macro_rules! Sigma1( ($x:expr) => ( $x.rotate_left(26) ^ $x.rotate_left(21) ^ $x.rotate_left(7)) ); +macro_rules! sigma0( ($x:expr) => ($x.rotate_left(25) ^ $x.rotate_left(14) ^ ($x >> 3)) ); +macro_rules! sigma1( ($x:expr) => ($x.rotate_left(15) ^ $x.rotate_left(13) ^ ($x >> 10)) ); + +macro_rules! round( + // first round + ($a:expr, $b:expr, $c:expr, $d:expr, $e:expr, $f:expr, $g:expr, $h:expr, $k:expr, $w:expr) => ( + let t1 = $h.wrapping_add(Sigma1!($e)).wrapping_add(Ch!($e, $f, $g)).wrapping_add($k).wrapping_add($w); + let t2 = Sigma0!($a).wrapping_add(Maj!($a, $b, $c)); + $d = $d.wrapping_add(t1); + $h = t1.wrapping_add(t2); + ); + // later rounds we reassign $w before doing the first-round computation + ($a:expr, $b:expr, $c:expr, $d:expr, $e:expr, $f:expr, $g:expr, $h:expr, $k:expr, $w:expr, $w1:expr, $w2:expr, $w3:expr) => ( + $w = $w.wrapping_add(sigma1!($w1)).wrapping_add($w2).wrapping_add(sigma0!($w3)); + round!($a, $b, $c, $d, $e, $f, $g, $h, $k, $w); + ) +); + +impl HashEngine { + /// Create a new [`HashEngine`] from a [`Midstate`]. + /// + /// # Panics + /// + /// If `length` is not a multiple of the block size. + pub fn from_midstate(midstate: Midstate, length: usize) -> HashEngine { + assert!(length % BLOCK_SIZE == 0, "length is no multiple of the block size"); + + let mut ret = [0; 8]; + for (ret_val, midstate_bytes) in ret.iter_mut().zip(midstate[..].chunks_exact(4)) { + *ret_val = u32::from_be_bytes(midstate_bytes.try_into().expect("4 byte slice")); + } + + HashEngine { + buffer: [0; BLOCK_SIZE], + h: ret, + length, + } + } + + // Algorithm copied from libsecp256k1 + fn process_block(&mut self) { + debug_assert_eq!(self.buffer.len(), BLOCK_SIZE); + + let mut w = [0u32; 16]; + for (w_val, buff_bytes) in w.iter_mut().zip(self.buffer.chunks_exact(4)) { + *w_val = u32::from_be_bytes(buff_bytes.try_into().expect("4 byte slice")); + } + + let mut a = self.h[0]; + let mut b = self.h[1]; + let mut c = self.h[2]; + let mut d = self.h[3]; + let mut e = self.h[4]; + let mut f = self.h[5]; + let mut g = self.h[6]; + let mut h = self.h[7]; + + round!(a, b, c, d, e, f, g, h, 0x428a2f98, w[0]); + round!(h, a, b, c, d, e, f, g, 0x71374491, w[1]); + round!(g, h, a, b, c, d, e, f, 0xb5c0fbcf, w[2]); + round!(f, g, h, a, b, c, d, e, 0xe9b5dba5, w[3]); + round!(e, f, g, h, a, b, c, d, 0x3956c25b, w[4]); + round!(d, e, f, g, h, a, b, c, 0x59f111f1, w[5]); + round!(c, d, e, f, g, h, a, b, 0x923f82a4, w[6]); + round!(b, c, d, e, f, g, h, a, 0xab1c5ed5, w[7]); + round!(a, b, c, d, e, f, g, h, 0xd807aa98, w[8]); + round!(h, a, b, c, d, e, f, g, 0x12835b01, w[9]); + round!(g, h, a, b, c, d, e, f, 0x243185be, w[10]); + round!(f, g, h, a, b, c, d, e, 0x550c7dc3, w[11]); + round!(e, f, g, h, a, b, c, d, 0x72be5d74, w[12]); + round!(d, e, f, g, h, a, b, c, 0x80deb1fe, w[13]); + round!(c, d, e, f, g, h, a, b, 0x9bdc06a7, w[14]); + round!(b, c, d, e, f, g, h, a, 0xc19bf174, w[15]); + + round!(a, b, c, d, e, f, g, h, 0xe49b69c1, w[0], w[14], w[9], w[1]); + round!(h, a, b, c, d, e, f, g, 0xefbe4786, w[1], w[15], w[10], w[2]); + round!(g, h, a, b, c, d, e, f, 0x0fc19dc6, w[2], w[0], w[11], w[3]); + round!(f, g, h, a, b, c, d, e, 0x240ca1cc, w[3], w[1], w[12], w[4]); + round!(e, f, g, h, a, b, c, d, 0x2de92c6f, w[4], w[2], w[13], w[5]); + round!(d, e, f, g, h, a, b, c, 0x4a7484aa, w[5], w[3], w[14], w[6]); + round!(c, d, e, f, g, h, a, b, 0x5cb0a9dc, w[6], w[4], w[15], w[7]); + round!(b, c, d, e, f, g, h, a, 0x76f988da, w[7], w[5], w[0], w[8]); + round!(a, b, c, d, e, f, g, h, 0x983e5152, w[8], w[6], w[1], w[9]); + round!(h, a, b, c, d, e, f, g, 0xa831c66d, w[9], w[7], w[2], w[10]); + round!(g, h, a, b, c, d, e, f, 0xb00327c8, w[10], w[8], w[3], w[11]); + round!(f, g, h, a, b, c, d, e, 0xbf597fc7, w[11], w[9], w[4], w[12]); + round!(e, f, g, h, a, b, c, d, 0xc6e00bf3, w[12], w[10], w[5], w[13]); + round!(d, e, f, g, h, a, b, c, 0xd5a79147, w[13], w[11], w[6], w[14]); + round!(c, d, e, f, g, h, a, b, 0x06ca6351, w[14], w[12], w[7], w[15]); + round!(b, c, d, e, f, g, h, a, 0x14292967, w[15], w[13], w[8], w[0]); + + round!(a, b, c, d, e, f, g, h, 0x27b70a85, w[0], w[14], w[9], w[1]); + round!(h, a, b, c, d, e, f, g, 0x2e1b2138, w[1], w[15], w[10], w[2]); + round!(g, h, a, b, c, d, e, f, 0x4d2c6dfc, w[2], w[0], w[11], w[3]); + round!(f, g, h, a, b, c, d, e, 0x53380d13, w[3], w[1], w[12], w[4]); + round!(e, f, g, h, a, b, c, d, 0x650a7354, w[4], w[2], w[13], w[5]); + round!(d, e, f, g, h, a, b, c, 0x766a0abb, w[5], w[3], w[14], w[6]); + round!(c, d, e, f, g, h, a, b, 0x81c2c92e, w[6], w[4], w[15], w[7]); + round!(b, c, d, e, f, g, h, a, 0x92722c85, w[7], w[5], w[0], w[8]); + round!(a, b, c, d, e, f, g, h, 0xa2bfe8a1, w[8], w[6], w[1], w[9]); + round!(h, a, b, c, d, e, f, g, 0xa81a664b, w[9], w[7], w[2], w[10]); + round!(g, h, a, b, c, d, e, f, 0xc24b8b70, w[10], w[8], w[3], w[11]); + round!(f, g, h, a, b, c, d, e, 0xc76c51a3, w[11], w[9], w[4], w[12]); + round!(e, f, g, h, a, b, c, d, 0xd192e819, w[12], w[10], w[5], w[13]); + round!(d, e, f, g, h, a, b, c, 0xd6990624, w[13], w[11], w[6], w[14]); + round!(c, d, e, f, g, h, a, b, 0xf40e3585, w[14], w[12], w[7], w[15]); + round!(b, c, d, e, f, g, h, a, 0x106aa070, w[15], w[13], w[8], w[0]); + + round!(a, b, c, d, e, f, g, h, 0x19a4c116, w[0], w[14], w[9], w[1]); + round!(h, a, b, c, d, e, f, g, 0x1e376c08, w[1], w[15], w[10], w[2]); + round!(g, h, a, b, c, d, e, f, 0x2748774c, w[2], w[0], w[11], w[3]); + round!(f, g, h, a, b, c, d, e, 0x34b0bcb5, w[3], w[1], w[12], w[4]); + round!(e, f, g, h, a, b, c, d, 0x391c0cb3, w[4], w[2], w[13], w[5]); + round!(d, e, f, g, h, a, b, c, 0x4ed8aa4a, w[5], w[3], w[14], w[6]); + round!(c, d, e, f, g, h, a, b, 0x5b9cca4f, w[6], w[4], w[15], w[7]); + round!(b, c, d, e, f, g, h, a, 0x682e6ff3, w[7], w[5], w[0], w[8]); + round!(a, b, c, d, e, f, g, h, 0x748f82ee, w[8], w[6], w[1], w[9]); + round!(h, a, b, c, d, e, f, g, 0x78a5636f, w[9], w[7], w[2], w[10]); + round!(g, h, a, b, c, d, e, f, 0x84c87814, w[10], w[8], w[3], w[11]); + round!(f, g, h, a, b, c, d, e, 0x8cc70208, w[11], w[9], w[4], w[12]); + round!(e, f, g, h, a, b, c, d, 0x90befffa, w[12], w[10], w[5], w[13]); + round!(d, e, f, g, h, a, b, c, 0xa4506ceb, w[13], w[11], w[6], w[14]); + round!(c, d, e, f, g, h, a, b, 0xbef9a3f7, w[14], w[12], w[7], w[15]); + round!(b, c, d, e, f, g, h, a, 0xc67178f2, w[15], w[13], w[8], w[0]); + + self.h[0] = self.h[0].wrapping_add(a); + self.h[1] = self.h[1].wrapping_add(b); + self.h[2] = self.h[2].wrapping_add(c); + self.h[3] = self.h[3].wrapping_add(d); + self.h[4] = self.h[4].wrapping_add(e); + self.h[5] = self.h[5].wrapping_add(f); + self.h[6] = self.h[6].wrapping_add(g); + self.h[7] = self.h[7].wrapping_add(h); + } +} + +#[cfg(test)] +mod tests { + use crate::{Hash, HashEngine, sha256}; + + #[test] + #[cfg(any(feature = "std", feature = "alloc"))] + fn test() { + use crate::hex::{FromHex, ToHex}; + + #[derive(Clone)] + struct Test { + input: &'static str, + output: Vec, + output_str: &'static str, + } + + let tests = vec![ + // Examples from wikipedia + Test { + input: "", + output: vec![ + 0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, + 0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24, + 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, + 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55, + ], + output_str: "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + Test { + input: "The quick brown fox jumps over the lazy dog", + output: vec![ + 0xd7, 0xa8, 0xfb, 0xb3, 0x07, 0xd7, 0x80, 0x94, + 0x69, 0xca, 0x9a, 0xbc, 0xb0, 0x08, 0x2e, 0x4f, + 0x8d, 0x56, 0x51, 0xe4, 0x6d, 0x3c, 0xdb, 0x76, + 0x2d, 0x02, 0xd0, 0xbf, 0x37, 0xc9, 0xe5, 0x92, + ], + output_str: "d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592", + }, + Test { + input: "The quick brown fox jumps over the lazy dog.", + output: vec![ + 0xef, 0x53, 0x7f, 0x25, 0xc8, 0x95, 0xbf, 0xa7, + 0x82, 0x52, 0x65, 0x29, 0xa9, 0xb6, 0x3d, 0x97, + 0xaa, 0x63, 0x15, 0x64, 0xd5, 0xd7, 0x89, 0xc2, + 0xb7, 0x65, 0x44, 0x8c, 0x86, 0x35, 0xfb, 0x6c, + ], + output_str: "ef537f25c895bfa782526529a9b63d97aa631564d5d789c2b765448c8635fb6c", + }, + ]; + + for test in tests { + // Hash through high-level API, check hex encoding/decoding + let hash = sha256::Hash::hash(&test.input.as_bytes()); + assert_eq!(hash, sha256::Hash::from_hex(test.output_str).expect("parse hex")); + assert_eq!(&hash[..], &test.output[..]); + assert_eq!(&hash.to_hex(), &test.output_str); + + // Hash through engine, checking that we can input byte by byte + let mut engine = sha256::Hash::engine(); + for ch in test.input.as_bytes() { + engine.input(&[*ch]); + } + let manual_hash = sha256::Hash::from_engine(engine); + assert_eq!(hash, manual_hash); + assert_eq!(hash.into_inner()[..].as_ref(), test.output.as_slice()); + } + } + + #[test] + fn midstate() { + // Test vector obtained by doing an asset issuance on Elements + let mut engine = sha256::Hash::engine(); + // sha256dhash of outpoint + // 73828cbc65fd68ab78dc86992b76ae50ae2bf8ceedbe8de0483172f0886219f7:0 + engine.input(&[ + 0x9d, 0xd0, 0x1b, 0x56, 0xb1, 0x56, 0x45, 0x14, + 0x3e, 0xad, 0x15, 0x8d, 0xec, 0x19, 0xf8, 0xce, + 0xa9, 0x0b, 0xd0, 0xa9, 0xb2, 0xf8, 0x1d, 0x21, + 0xff, 0xa3, 0xa4, 0xc6, 0x44, 0x81, 0xd4, 0x1c, + ]); + // 32 bytes of zeroes representing "new asset" + engine.input(&[0; 32]); + assert_eq!( + engine.midstate(), + // RPC output + sha256::Midstate::from_inner([ + 0x0b, 0xcf, 0xe0, 0xe5, 0x4e, 0x6c, 0xc7, 0xd3, + 0x4f, 0x4f, 0x7c, 0x1d, 0xf0, 0xb0, 0xf5, 0x03, + 0xf2, 0xf7, 0x12, 0x91, 0x2a, 0x06, 0x05, 0xb4, + 0x14, 0xed, 0x33, 0x7f, 0x7f, 0x03, 0x2e, 0x03, + ]) + ); + } + + #[test] + fn engine_with_state() { + let mut engine = sha256::Hash::engine(); + let midstate_engine = sha256::HashEngine::from_midstate(engine.midstate(), 0); + // Fresh engine and engine initialized with fresh state should have same state + assert_eq!(engine.h, midstate_engine.h); + + // Midstate changes after writing 64 bytes + engine.input(&[1; 63]); + assert_eq!(engine.h, midstate_engine.h); + engine.input(&[2; 1]); + assert_ne!(engine.h, midstate_engine.h); + + // Initializing an engine with midstate from another engine should result in + // both engines producing the same hashes + let data_vec = vec![vec![3; 1], vec![4; 63], vec![5; 65], vec![6; 66]]; + for data in data_vec { + let mut engine = engine.clone(); + let mut midstate_engine = + sha256::HashEngine::from_midstate(engine.midstate(), engine.length); + assert_eq!(engine.h, midstate_engine.h); + assert_eq!(engine.length, midstate_engine.length); + engine.input(&data); + midstate_engine.input(&data); + assert_eq!(engine.h, midstate_engine.h); + let hash1 = sha256::Hash::from_engine(engine); + let hash2 = sha256::Hash::from_engine(midstate_engine); + assert_eq!(hash1, hash2); + } + + // Test that a specific midstate results in a specific hash. Midstate was + // obtained by applying sha256 to sha256("MuSig coefficient")||sha256("MuSig + // coefficient"). + static MIDSTATE: [u8; 32] = [ + 0x0f, 0xd0, 0x69, 0x0c, 0xfe, 0xfe, 0xae, 0x97, 0x99, 0x6e, 0xac, 0x7f, 0x5c, 0x30, + 0xd8, 0x64, 0x8c, 0x4a, 0x05, 0x73, 0xac, 0xa1, 0xa2, 0x2f, 0x6f, 0x43, 0xb8, 0x01, + 0x85, 0xce, 0x27, 0xcd, + ]; + static HASH_EXPECTED: [u8; 32] = [ + 0x18, 0x84, 0xe4, 0x72, 0x40, 0x4e, 0xf4, 0x5a, 0xb4, 0x9c, 0x4e, 0xa4, 0x9a, 0xe6, + 0x23, 0xa8, 0x88, 0x52, 0x7f, 0x7d, 0x8a, 0x06, 0x94, 0x20, 0x8f, 0xf1, 0xf7, 0xa9, + 0xd5, 0x69, 0x09, 0x59, + ]; + let midstate_engine = + sha256::HashEngine::from_midstate(sha256::Midstate::from_inner(MIDSTATE), 64); + let hash = sha256::Hash::from_engine(midstate_engine); + assert_eq!(hash, sha256::Hash(HASH_EXPECTED)); + } + + #[cfg(feature = "serde")] + #[test] + fn sha256_serde() { + use serde_test::{Configure, Token, assert_tokens}; + + static HASH_BYTES: [u8; 32] = [ + 0xef, 0x53, 0x7f, 0x25, 0xc8, 0x95, 0xbf, 0xa7, + 0x82, 0x52, 0x65, 0x29, 0xa9, 0xb6, 0x3d, 0x97, + 0xaa, 0x63, 0x15, 0x64, 0xd5, 0xd7, 0x89, 0xc2, + 0xb7, 0x65, 0x44, 0x8c, 0x86, 0x35, 0xfb, 0x6c, + ]; + + let hash = sha256::Hash::from_slice(&HASH_BYTES).expect("right number of bytes"); + assert_tokens(&hash.compact(), &[Token::BorrowedBytes(&HASH_BYTES[..])]); + assert_tokens(&hash.readable(), &[Token::Str("ef537f25c895bfa782526529a9b63d97aa631564d5d789c2b765448c8635fb6c")]); + } + + #[cfg(target_arch = "wasm32")] + mod wasm_tests { + extern crate wasm_bindgen_test; + use super::*; + use self::wasm_bindgen_test::*; + #[wasm_bindgen_test] + fn sha256_tests() { + test(); + midstate(); + engine_with_state(); + } + } +} + +#[cfg(bench)] +mod benches { + use test::Bencher; + + use crate::{Hash, HashEngine, sha256}; + + #[bench] + pub fn sha256_10(bh: &mut Bencher) { + let mut engine = sha256::Hash::engine(); + let bytes = [1u8; 10]; + bh.iter( || { + engine.input(&bytes); + }); + bh.bytes = bytes.len() as u64; + } + + #[bench] + pub fn sha256_1k(bh: &mut Bencher) { + let mut engine = sha256::Hash::engine(); + let bytes = [1u8; 1024]; + bh.iter( || { + engine.input(&bytes); + }); + bh.bytes = bytes.len() as u64; + } + + #[bench] + pub fn sha256_64k(bh: &mut Bencher) { + let mut engine = sha256::Hash::engine(); + let bytes = [1u8; 65536]; + bh.iter( || { + engine.input(&bytes); + }); + bh.bytes = bytes.len() as u64; + } + +} diff --git a/hashes/src/sha256d.rs b/hashes/src/sha256d.rs new file mode 100644 index 00000000..6ecccdc4 --- /dev/null +++ b/hashes/src/sha256d.rs @@ -0,0 +1,153 @@ +// Bitcoin Hashes Library +// Written in 2018 by +// Andrew Poelstra +// +// To the extent possible under law, the author(s) have dedicated all +// copyright and related and neighboring rights to this software to +// the public domain worldwide. This software is distributed without +// any warranty. +// +// You should have received a copy of the CC0 Public Domain Dedication +// along with this software. +// If not, see . +// + +//! SHA256d implementation (double SHA256). +//! + +use core::str; +use core::ops::Index; +use core::slice::SliceIndex; + +use crate::{Error, hex, sha256}; + +crate::internal_macros::hash_type! { + 256, + true, + "Output of the SHA256d hash function.", + "crate::util::json_hex_string::len_32" +} + +type HashEngine = sha256::HashEngine; + +fn from_engine(e: sha256::HashEngine) -> Hash { + use crate::Hash as _; + + let sha2 = sha256::Hash::from_engine(e); + let sha2d = sha256::Hash::hash(&sha2[..]); + + let mut ret = [0; 32]; + ret.copy_from_slice(&sha2d[..]); + Hash(ret) +} + +#[cfg(test)] +mod tests { + use crate::sha256; + + #[test] + #[cfg(any(feature = "std", feature = "alloc"))] + fn test() { + use crate::{sha256d, Hash, HashEngine}; + use crate::hex::{FromHex, ToHex}; + + #[derive(Clone)] + struct Test { + input: &'static str, + output: Vec, + output_str: &'static str, + } + + let tests = vec![ + // Test vector copied out of rust-bitcoin + Test { + input: "", + output: vec![ + 0x5d, 0xf6, 0xe0, 0xe2, 0x76, 0x13, 0x59, 0xd3, + 0x0a, 0x82, 0x75, 0x05, 0x8e, 0x29, 0x9f, 0xcc, + 0x03, 0x81, 0x53, 0x45, 0x45, 0xf5, 0x5c, 0xf4, + 0x3e, 0x41, 0x98, 0x3f, 0x5d, 0x4c, 0x94, 0x56, + ], + output_str: "56944c5d3f98413ef45cf54545538103cc9f298e0575820ad3591376e2e0f65d", + }, + ]; + + for test in tests { + // Hash through high-level API, check hex encoding/decoding + let hash = sha256d::Hash::hash(&test.input.as_bytes()); + assert_eq!(hash, sha256d::Hash::from_hex(test.output_str).expect("parse hex")); + assert_eq!(&hash[..], &test.output[..]); + assert_eq!(&hash.to_hex(), &test.output_str); + + // Hash through engine, checking that we can input byte by byte + let mut engine = sha256d::Hash::engine(); + for ch in test.input.as_bytes() { + engine.input(&[*ch]); + } + let manual_hash = sha256d::Hash::from_engine(engine); + assert_eq!(hash, manual_hash); + + // Hash by computing a sha256 then `hash_again`ing it + let sha2_hash = sha256::Hash::hash(test.input.as_bytes()); + let sha2d_hash = sha2_hash.hash_again(); + assert_eq!(hash, sha2d_hash); + + assert_eq!(hash.into_inner()[..].as_ref(), test.output.as_slice()); + } + } + + #[cfg(feature = "serde")] + #[test] + fn sha256_serde() { + use serde_test::{Configure, Token, assert_tokens}; + use crate::{sha256d, Hash}; + + static HASH_BYTES: [u8; 32] = [ + 0xef, 0x53, 0x7f, 0x25, 0xc8, 0x95, 0xbf, 0xa7, + 0x82, 0x52, 0x65, 0x29, 0xa9, 0xb6, 0x3d, 0x97, + 0xaa, 0x63, 0x15, 0x64, 0xd5, 0xd7, 0x89, 0xc2, + 0xb7, 0x65, 0x44, 0x8c, 0x86, 0x35, 0xfb, 0x6c, + ]; + + let hash = sha256d::Hash::from_slice(&HASH_BYTES).expect("right number of bytes"); + assert_tokens(&hash.compact(), &[Token::BorrowedBytes(&HASH_BYTES[..])]); + assert_tokens(&hash.readable(), &[Token::Str("6cfb35868c4465b7c289d7d5641563aa973db6a929655282a7bf95c8257f53ef")]); + } +} + +#[cfg(bench)] +mod benches { + use test::Bencher; + + use crate::{Hash, HashEngine, sha256d}; + + #[bench] + pub fn sha256d_10(bh: &mut Bencher) { + let mut engine = sha256d::Hash::engine(); + let bytes = [1u8; 10]; + bh.iter( || { + engine.input(&bytes); + }); + bh.bytes = bytes.len() as u64; + } + + #[bench] + pub fn sha256d_1k(bh: &mut Bencher) { + let mut engine = sha256d::Hash::engine(); + let bytes = [1u8; 1024]; + bh.iter( || { + engine.input(&bytes); + }); + bh.bytes = bytes.len() as u64; + } + + #[bench] + pub fn sha256d_64k(bh: &mut Bencher) { + let mut engine = sha256d::Hash::engine(); + let bytes = [1u8; 65536]; + bh.iter( || { + engine.input(&bytes); + }); + bh.bytes = bytes.len() as u64; + } +} diff --git a/hashes/src/sha256t.rs b/hashes/src/sha256t.rs new file mode 100644 index 00000000..578321db --- /dev/null +++ b/hashes/src/sha256t.rs @@ -0,0 +1,165 @@ +// Bitcoin Hashes Library +// Written in 2019 by +// The rust-bitcoin developers. +// +// To the extent possible under law, the author(s) have dedicated all +// copyright and related and neighboring rights to this software to +// the public domain worldwide. This software is distributed without +// any warranty. +// +// You should have received a copy of the CC0 Public Domain Dedication +// along with this software. +// If not, see . +// + +//! SHA256t implementation (tagged SHA256). +//! + +use core::{cmp, str}; +use core::marker::PhantomData; +use core::ops::Index; +use core::slice::SliceIndex; + +use crate::{Error, hex, sha256}; + +type HashEngine = sha256::HashEngine; + +/// Trait representing a tag that can be used as a context for SHA256t hashes. +pub trait Tag { + /// Returns a hash engine that is pre-tagged and is ready to be used for the data. + fn engine() -> sha256::HashEngine; +} + +/// Output of the SHA256t hash function. +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[repr(transparent)] +pub struct Hash( + #[cfg_attr(feature = "schemars", schemars(schema_with = "crate::util::json_hex_string::len_32"))] + [u8; 32], + #[cfg_attr(feature = "schemars", schemars(skip))] + PhantomData +); + +impl Hash { + fn internal_new(arr: [u8; 32]) -> Self { + Hash(arr, Default::default()) + } + + fn internal_engine() -> HashEngine { + T::engine() + } +} + +impl Copy for Hash {} +impl Clone for Hash { + fn clone(&self) -> Self { + Hash(self.0, self.1) + } +} +impl PartialEq for Hash { + fn eq(&self, other: &Hash) -> bool { + self.0 == other.0 + } +} +impl Eq for Hash {} +impl Default for Hash { + fn default() -> Self { + Hash([0; 32], PhantomData) + } +} +impl PartialOrd for Hash { + fn partial_cmp(&self, other: &Hash) -> Option { + Some(cmp::Ord::cmp(self, other)) + } +} +impl Ord for Hash { + fn cmp(&self, other: &Hash) -> cmp::Ordering { + cmp::Ord::cmp(&self.0, &other.0) + } +} +impl core::hash::Hash for Hash { + fn hash(&self, h: &mut H) { + self.0.hash(h) + } +} + +crate::internal_macros::hash_trait_impls!(256, true, T: Tag); + +fn from_engine(e: sha256::HashEngine) -> Hash { + use crate::Hash as _; + + Hash::from_inner(sha256::Hash::from_engine(e).into_inner()) +} + +/// Macro used to define a newtype tagged hash. +/// It creates two public types: +/// - a sha256t::Tag struct, +/// - a sha256t::Hash type alias. +#[macro_export] +macro_rules! sha256t_hash_newtype { + ($newtype:ident, $tag:ident, $midstate:ident, $midstate_len:expr, $docs:meta, $reverse: expr) => { + sha256t_hash_newtype!($newtype, $tag, $midstate, $midstate_len, $docs, $reverse, stringify!($newtype)); + }; + + ($newtype:ident, $tag:ident, $midstate:ident, $midstate_len:expr, $docs:meta, $reverse: expr, $sname:expr) => { + #[doc = "The tag used for ["] + #[doc = $sname] + #[doc = "]"] + #[derive(Copy, Clone, PartialEq, Eq, Default, PartialOrd, Ord, Hash)] + pub struct $tag; + + impl $crate::sha256t::Tag for $tag { + fn engine() -> $crate::sha256::HashEngine { + let midstate = $crate::sha256::Midstate::from_inner($midstate); + $crate::sha256::HashEngine::from_midstate(midstate, $midstate_len) + } + } + + $crate::hash_newtype!($newtype, $crate::sha256t::Hash<$tag>, 32, $docs, $reverse); + }; +} + +#[cfg(test)] +mod tests { + use crate::{sha256, sha256t}; + #[cfg(any(feature = "std", feature = "alloc"))] + use crate::hex::ToHex; + #[cfg(any(feature = "std", feature = "alloc"))] + use crate::Hash; + + const TEST_MIDSTATE: [u8; 32] = [ + 156, 224, 228, 230, 124, 17, 108, 57, 56, 179, 202, 242, 195, 15, 80, 137, 211, 243, + 147, 108, 71, 99, 110, 96, 125, 179, 62, 234, 221, 198, 240, 201, + ]; + + #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Default, Hash)] + #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] + pub struct TestHashTag; + + impl sha256t::Tag for TestHashTag { + fn engine() -> sha256::HashEngine { + // The TapRoot TapLeaf midstate. + let midstate = sha256::Midstate::from_inner(TEST_MIDSTATE); + sha256::HashEngine::from_midstate(midstate, 64) + } + } + + /// A hash tagged with `$name`. + #[cfg(any(feature = "std", feature = "alloc"))] + pub type TestHash = sha256t::Hash; + + sha256t_hash_newtype!(NewTypeHash, NewTypeTag, TEST_MIDSTATE, 64, doc="test hash", true); + + #[test] + #[cfg(any(feature = "std", feature = "alloc"))] + fn test_sha256t() { + assert_eq!( + TestHash::hash(&[0]).to_hex(), + "29589d5122ec666ab5b4695070b6debc63881a4f85d88d93ddc90078038213ed" + ); + assert_eq!( + NewTypeHash::hash(&[0]).to_hex(), + "29589d5122ec666ab5b4695070b6debc63881a4f85d88d93ddc90078038213ed" + ); + } +} diff --git a/hashes/src/sha512.rs b/hashes/src/sha512.rs new file mode 100644 index 00000000..8498c993 --- /dev/null +++ b/hashes/src/sha512.rs @@ -0,0 +1,452 @@ +// Bitcoin Hashes Library +// Written in 2018 by +// Andrew Poelstra +// +// To the extent possible under law, the author(s) have dedicated all +// copyright and related and neighboring rights to this software to +// the public domain worldwide. This software is distributed without +// any warranty. +// +// You should have received a copy of the CC0 Public Domain Dedication +// along with this software. +// If not, see . +// + +// This module is largely copied from the rust-crypto ripemd.rs file; +// while rust-crypto is licensed under Apache, that file specifically +// was written entirely by Andrew Poelstra, who is re-licensing its +// contents here as CC0. + +//! SHA512 implementation. +//! + +use core::{cmp, hash, str}; +use core::convert::TryInto; +use core::ops::Index; +use core::slice::SliceIndex; + +use crate::{Error, HashEngine as _, hex}; + +crate::internal_macros::hash_trait_impls!(512, false); + +const BLOCK_SIZE: usize = 128; + +/// Engine to compute SHA512 hash function. +#[derive(Clone)] +pub struct HashEngine { + h: [u64; 8], + length: usize, + buffer: [u8; BLOCK_SIZE], +} + +impl Default for HashEngine { + fn default() -> Self { + HashEngine { + h: [ + 0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1, + 0x510e527fade682d1, 0x9b05688c2b3e6c1f, 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179, + ], + length: 0, + buffer: [0; BLOCK_SIZE], + } + } +} + +impl crate::HashEngine for HashEngine { + type MidState = [u8; 64]; + + #[cfg(not(fuzzing))] + fn midstate(&self) -> [u8; 64] { + let mut ret = [0; 64]; + for (val, ret_bytes) in self.h.iter().zip(ret.chunks_exact_mut(8)) { + ret_bytes.copy_from_slice(&val.to_be_bytes()); + } + ret + } + + #[cfg(fuzzing)] + fn midstate(&self) -> [u8; 64] { + let mut ret = [0; 64]; + ret.copy_from_slice(&self.buffer[..64]); + ret + } + + const BLOCK_SIZE: usize = 128; + + fn n_bytes_hashed(&self) -> usize { + self.length + } + + engine_input_impl!(); +} + +/// Output of the SHA256 hash function. +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +#[repr(transparent)] +pub struct Hash( + #[cfg_attr(feature = "schemars", schemars(schema_with = "crate::util::json_hex_string::len_64"))] + [u8; 64] +); + +impl Hash { + fn internal_new(arr: [u8; 64]) -> Self { + Hash(arr) + } + + fn internal_engine() -> HashEngine { + Default::default() + } +} + +impl Copy for Hash {} + +impl Clone for Hash { + fn clone(&self) -> Hash { + let mut ret = [0; 64]; + ret.copy_from_slice(&self.0); + Hash(ret) + } +} + +impl PartialEq for Hash { + fn eq(&self, other: &Hash) -> bool { + self.0[..] == other.0[..] + } +} + +impl Eq for Hash {} + +impl Default for Hash { + fn default() -> Hash { + Hash([0; 64]) + } +} + +impl PartialOrd for Hash { + fn partial_cmp(&self, other: &Hash) -> Option { + (&self.0).partial_cmp(&other.0) + } +} + +impl Ord for Hash { + fn cmp(&self, other: &Hash) -> cmp::Ordering { + (&self.0).cmp(&other.0) + } +} + +impl hash::Hash for Hash { + fn hash(&self, state: &mut H) { + (&self.0).hash(state) + } +} + +#[cfg(not(fuzzing))] +fn from_engine(mut e: HashEngine) -> Hash { + // pad buffer with a single 1-bit then all 0s, until there are exactly 16 bytes remaining + let data_len = e.length as u64; + + let zeroes = [0; BLOCK_SIZE - 16]; + e.input(&[0x80]); + if e.length % BLOCK_SIZE > zeroes.len() { + e.input(&zeroes); + } + let pad_length = zeroes.len() - (e.length % BLOCK_SIZE); + e.input(&zeroes[..pad_length]); + debug_assert_eq!(e.length % BLOCK_SIZE, zeroes.len()); + + e.input(&[0; 8]); + e.input(&(8 * data_len).to_be_bytes()); + debug_assert_eq!(e.length % BLOCK_SIZE, 0); + + Hash(e.midstate()) +} + +#[cfg(fuzzing)] +fn from_engine(e: HashEngine) -> Hash { + let mut hash = e.midstate(); + hash[0] ^= 0xff; // Make this distinct from SHA-256 + Hash(hash) +} + +macro_rules! Ch( ($x:expr, $y:expr, $z:expr) => ($z ^ ($x & ($y ^ $z))) ); +macro_rules! Maj( ($x:expr, $y:expr, $z:expr) => (($x & $y) | ($z & ($x | $y))) ); +macro_rules! Sigma0( ($x:expr) => ($x.rotate_left(36) ^ $x.rotate_left(30) ^ $x.rotate_left(25)) ); +macro_rules! Sigma1( ($x:expr) => ($x.rotate_left(50) ^ $x.rotate_left(46) ^ $x.rotate_left(23)) ); +macro_rules! sigma0( ($x:expr) => ($x.rotate_left(63) ^ $x.rotate_left(56) ^ ($x >> 7)) ); +macro_rules! sigma1( ($x:expr) => ($x.rotate_left(45) ^ $x.rotate_left(3) ^ ($x >> 6)) ); + +macro_rules! round( + // first round + ($a:expr, $b:expr, $c:expr, $d:expr, $e:expr, $f:expr, $g:expr, $h:expr, $k:expr, $w:expr) => ( + let t1 = $h.wrapping_add(Sigma1!($e)).wrapping_add(Ch!($e, $f, $g)).wrapping_add($k).wrapping_add($w); + let t2 = Sigma0!($a).wrapping_add(Maj!($a, $b, $c)); + $d = $d.wrapping_add(t1); + $h = t1.wrapping_add(t2); + ); + // later rounds we reassign $w before doing the first-round computation + ($a:expr, $b:expr, $c:expr, $d:expr, $e:expr, $f:expr, $g:expr, $h:expr, $k:expr, $w:expr, $w1:expr, $w2:expr, $w3:expr) => ( + $w = $w.wrapping_add(sigma1!($w1)).wrapping_add($w2).wrapping_add(sigma0!($w3)); + round!($a, $b, $c, $d, $e, $f, $g, $h, $k, $w); + ) +); + +impl HashEngine { + // Algorithm copied from libsecp256k1 + fn process_block(&mut self) { + debug_assert_eq!(self.buffer.len(), BLOCK_SIZE); + + let mut w = [0u64; 16]; + for (w_val, buff_bytes) in w.iter_mut().zip(self.buffer.chunks_exact(8)) { + *w_val = u64::from_be_bytes(buff_bytes.try_into().expect("8 byte slice")); + } + + let mut a = self.h[0]; + let mut b = self.h[1]; + let mut c = self.h[2]; + let mut d = self.h[3]; + let mut e = self.h[4]; + let mut f = self.h[5]; + let mut g = self.h[6]; + let mut h = self.h[7]; + + round!(a, b, c, d, e, f, g, h, 0x428a2f98d728ae22, w[0]); + round!(h, a, b, c, d, e, f, g, 0x7137449123ef65cd, w[1]); + round!(g, h, a, b, c, d, e, f, 0xb5c0fbcfec4d3b2f, w[2]); + round!(f, g, h, a, b, c, d, e, 0xe9b5dba58189dbbc, w[3]); + round!(e, f, g, h, a, b, c, d, 0x3956c25bf348b538, w[4]); + round!(d, e, f, g, h, a, b, c, 0x59f111f1b605d019, w[5]); + round!(c, d, e, f, g, h, a, b, 0x923f82a4af194f9b, w[6]); + round!(b, c, d, e, f, g, h, a, 0xab1c5ed5da6d8118, w[7]); + round!(a, b, c, d, e, f, g, h, 0xd807aa98a3030242, w[8]); + round!(h, a, b, c, d, e, f, g, 0x12835b0145706fbe, w[9]); + round!(g, h, a, b, c, d, e, f, 0x243185be4ee4b28c, w[10]); + round!(f, g, h, a, b, c, d, e, 0x550c7dc3d5ffb4e2, w[11]); + round!(e, f, g, h, a, b, c, d, 0x72be5d74f27b896f, w[12]); + round!(d, e, f, g, h, a, b, c, 0x80deb1fe3b1696b1, w[13]); + round!(c, d, e, f, g, h, a, b, 0x9bdc06a725c71235, w[14]); + round!(b, c, d, e, f, g, h, a, 0xc19bf174cf692694, w[15]); + + round!(a, b, c, d, e, f, g, h, 0xe49b69c19ef14ad2, w[0], w[14], w[9], w[1]); + round!(h, a, b, c, d, e, f, g, 0xefbe4786384f25e3, w[1], w[15], w[10], w[2]); + round!(g, h, a, b, c, d, e, f, 0x0fc19dc68b8cd5b5, w[2], w[0], w[11], w[3]); + round!(f, g, h, a, b, c, d, e, 0x240ca1cc77ac9c65, w[3], w[1], w[12], w[4]); + round!(e, f, g, h, a, b, c, d, 0x2de92c6f592b0275, w[4], w[2], w[13], w[5]); + round!(d, e, f, g, h, a, b, c, 0x4a7484aa6ea6e483, w[5], w[3], w[14], w[6]); + round!(c, d, e, f, g, h, a, b, 0x5cb0a9dcbd41fbd4, w[6], w[4], w[15], w[7]); + round!(b, c, d, e, f, g, h, a, 0x76f988da831153b5, w[7], w[5], w[0], w[8]); + round!(a, b, c, d, e, f, g, h, 0x983e5152ee66dfab, w[8], w[6], w[1], w[9]); + round!(h, a, b, c, d, e, f, g, 0xa831c66d2db43210, w[9], w[7], w[2], w[10]); + round!(g, h, a, b, c, d, e, f, 0xb00327c898fb213f, w[10], w[8], w[3], w[11]); + round!(f, g, h, a, b, c, d, e, 0xbf597fc7beef0ee4, w[11], w[9], w[4], w[12]); + round!(e, f, g, h, a, b, c, d, 0xc6e00bf33da88fc2, w[12], w[10], w[5], w[13]); + round!(d, e, f, g, h, a, b, c, 0xd5a79147930aa725, w[13], w[11], w[6], w[14]); + round!(c, d, e, f, g, h, a, b, 0x06ca6351e003826f, w[14], w[12], w[7], w[15]); + round!(b, c, d, e, f, g, h, a, 0x142929670a0e6e70, w[15], w[13], w[8], w[0]); + + round!(a, b, c, d, e, f, g, h, 0x27b70a8546d22ffc, w[0], w[14], w[9], w[1]); + round!(h, a, b, c, d, e, f, g, 0x2e1b21385c26c926, w[1], w[15], w[10], w[2]); + round!(g, h, a, b, c, d, e, f, 0x4d2c6dfc5ac42aed, w[2], w[0], w[11], w[3]); + round!(f, g, h, a, b, c, d, e, 0x53380d139d95b3df, w[3], w[1], w[12], w[4]); + round!(e, f, g, h, a, b, c, d, 0x650a73548baf63de, w[4], w[2], w[13], w[5]); + round!(d, e, f, g, h, a, b, c, 0x766a0abb3c77b2a8, w[5], w[3], w[14], w[6]); + round!(c, d, e, f, g, h, a, b, 0x81c2c92e47edaee6, w[6], w[4], w[15], w[7]); + round!(b, c, d, e, f, g, h, a, 0x92722c851482353b, w[7], w[5], w[0], w[8]); + round!(a, b, c, d, e, f, g, h, 0xa2bfe8a14cf10364, w[8], w[6], w[1], w[9]); + round!(h, a, b, c, d, e, f, g, 0xa81a664bbc423001, w[9], w[7], w[2], w[10]); + round!(g, h, a, b, c, d, e, f, 0xc24b8b70d0f89791, w[10], w[8], w[3], w[11]); + round!(f, g, h, a, b, c, d, e, 0xc76c51a30654be30, w[11], w[9], w[4], w[12]); + round!(e, f, g, h, a, b, c, d, 0xd192e819d6ef5218, w[12], w[10], w[5], w[13]); + round!(d, e, f, g, h, a, b, c, 0xd69906245565a910, w[13], w[11], w[6], w[14]); + round!(c, d, e, f, g, h, a, b, 0xf40e35855771202a, w[14], w[12], w[7], w[15]); + round!(b, c, d, e, f, g, h, a, 0x106aa07032bbd1b8, w[15], w[13], w[8], w[0]); + + round!(a, b, c, d, e, f, g, h, 0x19a4c116b8d2d0c8, w[0], w[14], w[9], w[1]); + round!(h, a, b, c, d, e, f, g, 0x1e376c085141ab53, w[1], w[15], w[10], w[2]); + round!(g, h, a, b, c, d, e, f, 0x2748774cdf8eeb99, w[2], w[0], w[11], w[3]); + round!(f, g, h, a, b, c, d, e, 0x34b0bcb5e19b48a8, w[3], w[1], w[12], w[4]); + round!(e, f, g, h, a, b, c, d, 0x391c0cb3c5c95a63, w[4], w[2], w[13], w[5]); + round!(d, e, f, g, h, a, b, c, 0x4ed8aa4ae3418acb, w[5], w[3], w[14], w[6]); + round!(c, d, e, f, g, h, a, b, 0x5b9cca4f7763e373, w[6], w[4], w[15], w[7]); + round!(b, c, d, e, f, g, h, a, 0x682e6ff3d6b2b8a3, w[7], w[5], w[0], w[8]); + round!(a, b, c, d, e, f, g, h, 0x748f82ee5defb2fc, w[8], w[6], w[1], w[9]); + round!(h, a, b, c, d, e, f, g, 0x78a5636f43172f60, w[9], w[7], w[2], w[10]); + round!(g, h, a, b, c, d, e, f, 0x84c87814a1f0ab72, w[10], w[8], w[3], w[11]); + round!(f, g, h, a, b, c, d, e, 0x8cc702081a6439ec, w[11], w[9], w[4], w[12]); + round!(e, f, g, h, a, b, c, d, 0x90befffa23631e28, w[12], w[10], w[5], w[13]); + round!(d, e, f, g, h, a, b, c, 0xa4506cebde82bde9, w[13], w[11], w[6], w[14]); + round!(c, d, e, f, g, h, a, b, 0xbef9a3f7b2c67915, w[14], w[12], w[7], w[15]); + round!(b, c, d, e, f, g, h, a, 0xc67178f2e372532b, w[15], w[13], w[8], w[0]); + + round!(a, b, c, d, e, f, g, h, 0xca273eceea26619c, w[0], w[14], w[9], w[1]); + round!(h, a, b, c, d, e, f, g, 0xd186b8c721c0c207, w[1], w[15], w[10], w[2]); + round!(g, h, a, b, c, d, e, f, 0xeada7dd6cde0eb1e, w[2], w[0], w[11], w[3]); + round!(f, g, h, a, b, c, d, e, 0xf57d4f7fee6ed178, w[3], w[1], w[12], w[4]); + round!(e, f, g, h, a, b, c, d, 0x06f067aa72176fba, w[4], w[2], w[13], w[5]); + round!(d, e, f, g, h, a, b, c, 0x0a637dc5a2c898a6, w[5], w[3], w[14], w[6]); + round!(c, d, e, f, g, h, a, b, 0x113f9804bef90dae, w[6], w[4], w[15], w[7]); + round!(b, c, d, e, f, g, h, a, 0x1b710b35131c471b, w[7], w[5], w[0], w[8]); + round!(a, b, c, d, e, f, g, h, 0x28db77f523047d84, w[8], w[6], w[1], w[9]); + round!(h, a, b, c, d, e, f, g, 0x32caab7b40c72493, w[9], w[7], w[2], w[10]); + round!(g, h, a, b, c, d, e, f, 0x3c9ebe0a15c9bebc, w[10], w[8], w[3], w[11]); + round!(f, g, h, a, b, c, d, e, 0x431d67c49c100d4c, w[11], w[9], w[4], w[12]); + round!(e, f, g, h, a, b, c, d, 0x4cc5d4becb3e42b6, w[12], w[10], w[5], w[13]); + round!(d, e, f, g, h, a, b, c, 0x597f299cfc657e2a, w[13], w[11], w[6], w[14]); + round!(c, d, e, f, g, h, a, b, 0x5fcb6fab3ad6faec, w[14], w[12], w[7], w[15]); + round!(b, c, d, e, f, g, h, a, 0x6c44198c4a475817, w[15], w[13], w[8], w[0]); + + self.h[0] = self.h[0].wrapping_add(a); + self.h[1] = self.h[1].wrapping_add(b); + self.h[2] = self.h[2].wrapping_add(c); + self.h[3] = self.h[3].wrapping_add(d); + self.h[4] = self.h[4].wrapping_add(e); + self.h[5] = self.h[5].wrapping_add(f); + self.h[6] = self.h[6].wrapping_add(g); + self.h[7] = self.h[7].wrapping_add(h); + } +} + +#[cfg(test)] +mod tests { + #[test] + #[cfg(any(feature = "std", feature = "alloc"))] + fn test() { + use crate::{sha512, Hash, HashEngine}; + use crate::hex::{FromHex, ToHex}; + + #[derive(Clone)] + struct Test { + input: &'static str, + output: Vec, + output_str: &'static str, + } + + let tests = vec![ + // Test vectors computed with `sha512sum` + Test { + input: "", + output: vec![ + 0xcf, 0x83, 0xe1, 0x35, 0x7e, 0xef, 0xb8, 0xbd, + 0xf1, 0x54, 0x28, 0x50, 0xd6, 0x6d, 0x80, 0x07, + 0xd6, 0x20, 0xe4, 0x05, 0x0b, 0x57, 0x15, 0xdc, + 0x83, 0xf4, 0xa9, 0x21, 0xd3, 0x6c, 0xe9, 0xce, + 0x47, 0xd0, 0xd1, 0x3c, 0x5d, 0x85, 0xf2, 0xb0, + 0xff, 0x83, 0x18, 0xd2, 0x87, 0x7e, 0xec, 0x2f, + 0x63, 0xb9, 0x31, 0xbd, 0x47, 0x41, 0x7a, 0x81, + 0xa5, 0x38, 0x32, 0x7a, 0xf9, 0x27, 0xda, 0x3e, + ], + output_str: "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e" + }, + Test { + input: "The quick brown fox jumps over the lazy dog", + output: vec![ + 0x07, 0xe5, 0x47, 0xd9, 0x58, 0x6f, 0x6a, 0x73, + 0xf7, 0x3f, 0xba, 0xc0, 0x43, 0x5e, 0xd7, 0x69, + 0x51, 0x21, 0x8f, 0xb7, 0xd0, 0xc8, 0xd7, 0x88, + 0xa3, 0x09, 0xd7, 0x85, 0x43, 0x6b, 0xbb, 0x64, + 0x2e, 0x93, 0xa2, 0x52, 0xa9, 0x54, 0xf2, 0x39, + 0x12, 0x54, 0x7d, 0x1e, 0x8a, 0x3b, 0x5e, 0xd6, + 0xe1, 0xbf, 0xd7, 0x09, 0x78, 0x21, 0x23, 0x3f, + 0xa0, 0x53, 0x8f, 0x3d, 0xb8, 0x54, 0xfe, 0xe6, + ], + output_str: "07e547d9586f6a73f73fbac0435ed76951218fb7d0c8d788a309d785436bbb642e93a252a954f23912547d1e8a3b5ed6e1bfd7097821233fa0538f3db854fee6", + }, + Test { + input: "The quick brown fox jumps over the lazy dog.", + output: vec![ + 0x91, 0xea, 0x12, 0x45, 0xf2, 0x0d, 0x46, 0xae, + 0x9a, 0x03, 0x7a, 0x98, 0x9f, 0x54, 0xf1, 0xf7, + 0x90, 0xf0, 0xa4, 0x76, 0x07, 0xee, 0xb8, 0xa1, + 0x4d, 0x12, 0x89, 0x0c, 0xea, 0x77, 0xa1, 0xbb, + 0xc6, 0xc7, 0xed, 0x9c, 0xf2, 0x05, 0xe6, 0x7b, + 0x7f, 0x2b, 0x8f, 0xd4, 0xc7, 0xdf, 0xd3, 0xa7, + 0xa8, 0x61, 0x7e, 0x45, 0xf3, 0xc4, 0x63, 0xd4, + 0x81, 0xc7, 0xe5, 0x86, 0xc3, 0x9a, 0xc1, 0xed, + ], + output_str: "91ea1245f20d46ae9a037a989f54f1f790f0a47607eeb8a14d12890cea77a1bbc6c7ed9cf205e67b7f2b8fd4c7dfd3a7a8617e45f3c463d481c7e586c39ac1ed", + }, + ]; + + for test in tests { + // Hash through high-level API, check hex encoding/decoding + let hash = sha512::Hash::hash(&test.input.as_bytes()); + assert_eq!(hash, sha512::Hash::from_hex(test.output_str).expect("parse hex")); + assert_eq!(&hash[..], &test.output[..]); + assert_eq!(&hash.to_hex(), &test.output_str); + + // Hash through engine, checking that we can input byte by byte + let mut engine = sha512::Hash::engine(); + for ch in test.input.as_bytes() { + engine.input(&[*ch]); + } + let manual_hash = sha512::Hash::from_engine(engine); + assert_eq!(hash, manual_hash); + assert_eq!(hash.into_inner()[..].as_ref(), test.output.as_slice()); + } + } + + #[cfg(feature = "serde")] + #[test] + fn sha512_serde() { + use serde_test::{Configure, Token, assert_tokens}; + use crate::{sha512, Hash}; + + static HASH_BYTES: [u8; 64] = [ + 0x8b, 0x41, 0xe1, 0xb7, 0x8a, 0xd1, 0x15, 0x21, + 0x11, 0x3c, 0x52, 0xff, 0x18, 0x2a, 0x1b, 0x8e, + 0x0a, 0x19, 0x57, 0x54, 0xaa, 0x52, 0x7f, 0xcd, + 0x00, 0xa4, 0x11, 0x62, 0x0b, 0x46, 0xf2, 0x0f, + 0xff, 0xfb, 0x80, 0x88, 0xcc, 0xf8, 0x54, 0x97, + 0x12, 0x1a, 0xd4, 0x49, 0x9e, 0x08, 0x45, 0xb8, + 0x76, 0xf6, 0xdd, 0x66, 0x40, 0x08, 0x8a, 0x2f, + 0x0b, 0x2d, 0x8a, 0x60, 0x0b, 0xdf, 0x4c, 0x0c, + ]; + + let hash = sha512::Hash::from_slice(&HASH_BYTES).expect("right number of bytes"); + assert_tokens(&hash.compact(), &[Token::BorrowedBytes(&HASH_BYTES[..])]); + assert_tokens( + &hash.readable(), + &[Token::Str( + "8b41e1b78ad11521113c52ff182a1b8e0a195754aa527fcd00a411620b46f20f\ + fffb8088ccf85497121ad4499e0845b876f6dd6640088a2f0b2d8a600bdf4c0c" + )], + ); + } +} + +#[cfg(bench)] +mod benches { + use test::Bencher; + + use crate::{Hash, HashEngine, sha512}; + + #[bench] + pub fn sha512_10(bh: &mut Bencher) { + let mut engine = sha512::Hash::engine(); + let bytes = [1u8; 10]; + bh.iter( || { + engine.input(&bytes); + }); + bh.bytes = bytes.len() as u64; + } + + #[bench] + pub fn sha512_1k(bh: &mut Bencher) { + let mut engine = sha512::Hash::engine(); + let bytes = [1u8; 1024]; + bh.iter( || { + engine.input(&bytes); + }); + bh.bytes = bytes.len() as u64; + } + + #[bench] + pub fn sha512_64k(bh: &mut Bencher) { + let mut engine = sha512::Hash::engine(); + let bytes = [1u8; 65536]; + bh.iter( || { + engine.input(&bytes); + }); + bh.bytes = bytes.len() as u64; + } + +} diff --git a/hashes/src/siphash24.rs b/hashes/src/siphash24.rs new file mode 100644 index 00000000..e46abec0 --- /dev/null +++ b/hashes/src/siphash24.rs @@ -0,0 +1,421 @@ +// Bitcoin Hashes Library +// Written in 2019 by +// The rust-bitcoin developers +// +// To the extent possible under law, the author(s) have dedicated all +// copyright and related and neighboring rights to this software to +// the public domain worldwide. This software is distributed without +// any warranty. +// +// You should have received a copy of the CC0 Public Domain Dedication +// along with this software. +// If not, see . +// + +// This module is largely copied from the rust-siphash sip.rs file; +// while rust-siphash is licensed under Apache, that file specifically +// was written entirely by Steven Roose, who is re-licensing its +// contents here as CC0. + +//! SipHash 2-4 implementation. +//! + +use core::{cmp, mem, ptr, str}; +use core::ops::Index; +use core::slice::SliceIndex; + +use crate::{Error, Hash as _, HashEngine as _, hex}; + +crate::internal_macros::hash_type! { + 64, + false, + "Output of the SipHash24 hash function.", + "crate::util::json_hex_string::len_8" +} + +#[cfg(not(fuzzing))] +fn from_engine(e: HashEngine) -> Hash { + Hash::from_u64(Hash::from_engine_to_u64(e)) +} + +#[cfg(fuzzing)] +fn from_engine(e: HashEngine) -> Hash { + let state = e.midstate(); + Hash::from_u64(state.v0 ^ state.v1 ^ state.v2 ^ state.v3) +} + + +macro_rules! compress { + ($state:expr) => {{ + compress!($state.v0, $state.v1, $state.v2, $state.v3) + }}; + ($v0:expr, $v1:expr, $v2:expr, $v3:expr) => {{ + $v0 = $v0.wrapping_add($v1); + $v1 = $v1.rotate_left(13); + $v1 ^= $v0; + $v0 = $v0.rotate_left(32); + $v2 = $v2.wrapping_add($v3); + $v3 = $v3.rotate_left(16); + $v3 ^= $v2; + $v0 = $v0.wrapping_add($v3); + $v3 = $v3.rotate_left(21); + $v3 ^= $v0; + $v2 = $v2.wrapping_add($v1); + $v1 = $v1.rotate_left(17); + $v1 ^= $v2; + $v2 = $v2.rotate_left(32); + }}; +} + +/// Load an integer of the desired type from a byte stream, in LE order. Uses +/// `copy_nonoverlapping` to let the compiler generate the most efficient way +/// to load it from a possibly unaligned address. +/// +/// Unsafe because: unchecked indexing at `i..i+size_of(int_ty)`. +macro_rules! load_int_le { + ($buf:expr, $i:expr, $int_ty:ident) => {{ + debug_assert!($i + mem::size_of::<$int_ty>() <= $buf.len()); + let mut data = 0 as $int_ty; + ptr::copy_nonoverlapping( + $buf.get_unchecked($i), + &mut data as *mut _ as *mut u8, + mem::size_of::<$int_ty>(), + ); + data.to_le() + }}; +} + +/// Internal state of the [`HashEngine`]. +#[derive(Debug, Clone)] +pub struct State { + // v0, v2 and v1, v3 show up in pairs in the algorithm, + // and simd implementations of SipHash will use vectors + // of v02 and v13. By placing them in this order in the struct, + // the compiler can pick up on just a few simd optimizations by itself. + v0: u64, + v2: u64, + v1: u64, + v3: u64, +} + +/// Engine to compute the SipHash24 hash function. +#[derive(Debug, Clone)] +pub struct HashEngine { + k0: u64, + k1: u64, + length: usize, // how many bytes we've processed + state: State, // hash State + tail: u64, // unprocessed bytes le + ntail: usize, // how many bytes in tail are valid +} + +impl HashEngine { + /// Creates a new SipHash24 engine with keys. + pub fn with_keys(k0: u64, k1: u64) -> HashEngine { + HashEngine { + k0, + k1, + length: 0, + state: State { + v0: k0 ^ 0x736f6d6570736575, + v1: k1 ^ 0x646f72616e646f6d, + v2: k0 ^ 0x6c7967656e657261, + v3: k1 ^ 0x7465646279746573, + }, + tail: 0, + ntail: 0, + } + } + + /// Creates a new SipHash24 engine. + pub fn new() -> HashEngine { + HashEngine::with_keys(0, 0) + } + + /// Retrieves the keys of this engine. + pub fn keys(&self) -> (u64, u64) { + (self.k0, self.k1) + } + + #[inline] + fn c_rounds(state: &mut State) { + compress!(state); + compress!(state); + } + + #[inline] + fn d_rounds(state: &mut State) { + compress!(state); + compress!(state); + compress!(state); + compress!(state); + } +} + +impl Default for HashEngine { + fn default() -> Self { + HashEngine::new() + } +} + +impl crate::HashEngine for HashEngine { + type MidState = State; + + fn midstate(&self) -> State { + self.state.clone() + } + + const BLOCK_SIZE: usize = 8; + + #[inline] + fn input(&mut self, msg: &[u8]) { + let length = msg.len(); + self.length += length; + + let mut needed = 0; + + if self.ntail != 0 { + needed = 8 - self.ntail; + self.tail |= unsafe { u8to64_le(msg, 0, cmp::min(length, needed)) } << (8 * self.ntail); + if length < needed { + self.ntail += length; + return; + } else { + self.state.v3 ^= self.tail; + HashEngine::c_rounds(&mut self.state); + self.state.v0 ^= self.tail; + self.ntail = 0; + } + } + + // Buffered tail is now flushed, process new input. + let len = length - needed; + let left = len & 0x7; + + let mut i = needed; + while i < len - left { + let mi = unsafe { load_int_le!(msg, i, u64) }; + + self.state.v3 ^= mi; + HashEngine::c_rounds(&mut self.state); + self.state.v0 ^= mi; + + i += 8; + } + + self.tail = unsafe { u8to64_le(msg, i, left) }; + self.ntail = left; + } + + fn n_bytes_hashed(&self) -> usize { + self.length + } + +} + +impl Hash { + /// Hashes the given data with an engine with the provided keys. + pub fn hash_with_keys(k0: u64, k1: u64, data: &[u8]) -> Hash { + let mut engine = HashEngine::with_keys(k0, k1); + engine.input(data); + Hash::from_engine(engine) + } + + /// Hashes the given data directly to u64 with an engine with the provided keys. + pub fn hash_to_u64_with_keys(k0: u64, k1: u64, data: &[u8]) -> u64 { + let mut engine = HashEngine::with_keys(k0, k1); + engine.input(data); + Hash::from_engine_to_u64(engine) + } + + /// Produces a hash as `u64` from the current state of a given engine. + #[inline] + pub fn from_engine_to_u64(e: HashEngine) -> u64 { + let mut state = e.state; + + let b: u64 = ((e.length as u64 & 0xff) << 56) | e.tail; + + state.v3 ^= b; + HashEngine::c_rounds(&mut state); + state.v0 ^= b; + + state.v2 ^= 0xff; + HashEngine::d_rounds(&mut state); + + state.v0 ^ state.v1 ^ state.v2 ^ state.v3 + } + + /// Returns the (little endian) 64-bit integer representation of the hash value. + pub fn as_u64(&self) -> u64 { + u64::from_le_bytes(self.0) + } + + /// Creates a hash from its (little endian) 64-bit integer representation. + pub fn from_u64(hash: u64) -> Hash { + Hash(hash.to_le_bytes()) + } +} + +/// Load an u64 using up to 7 bytes of a byte slice. +/// +/// Unsafe because: unchecked indexing at `start..start+len`. +#[inline] +unsafe fn u8to64_le(buf: &[u8], start: usize, len: usize) -> u64 { + debug_assert!(len < 8); + let mut i = 0; // current byte index (from LSB) in the output u64 + let mut out = 0; + if i + 3 < len { + out = u64::from(load_int_le!(buf, start + i, u32)); + i += 4; + } + if i + 1 < len { + out |= u64::from(load_int_le!(buf, start + i, u16)) << (i * 8); + i += 2 + } + if i < len { + out |= u64::from(*buf.get_unchecked(start + i)) << (i * 8); + i += 1; + } + debug_assert_eq!(i, len); + out +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_siphash_2_4() { + let vecs: [[u8; 8]; 64] = [ + [0x31, 0x0e, 0x0e, 0xdd, 0x47, 0xdb, 0x6f, 0x72], + [0xfd, 0x67, 0xdc, 0x93, 0xc5, 0x39, 0xf8, 0x74], + [0x5a, 0x4f, 0xa9, 0xd9, 0x09, 0x80, 0x6c, 0x0d], + [0x2d, 0x7e, 0xfb, 0xd7, 0x96, 0x66, 0x67, 0x85], + [0xb7, 0x87, 0x71, 0x27, 0xe0, 0x94, 0x27, 0xcf], + [0x8d, 0xa6, 0x99, 0xcd, 0x64, 0x55, 0x76, 0x18], + [0xce, 0xe3, 0xfe, 0x58, 0x6e, 0x46, 0xc9, 0xcb], + [0x37, 0xd1, 0x01, 0x8b, 0xf5, 0x00, 0x02, 0xab], + [0x62, 0x24, 0x93, 0x9a, 0x79, 0xf5, 0xf5, 0x93], + [0xb0, 0xe4, 0xa9, 0x0b, 0xdf, 0x82, 0x00, 0x9e], + [0xf3, 0xb9, 0xdd, 0x94, 0xc5, 0xbb, 0x5d, 0x7a], + [0xa7, 0xad, 0x6b, 0x22, 0x46, 0x2f, 0xb3, 0xf4], + [0xfb, 0xe5, 0x0e, 0x86, 0xbc, 0x8f, 0x1e, 0x75], + [0x90, 0x3d, 0x84, 0xc0, 0x27, 0x56, 0xea, 0x14], + [0xee, 0xf2, 0x7a, 0x8e, 0x90, 0xca, 0x23, 0xf7], + [0xe5, 0x45, 0xbe, 0x49, 0x61, 0xca, 0x29, 0xa1], + [0xdb, 0x9b, 0xc2, 0x57, 0x7f, 0xcc, 0x2a, 0x3f], + [0x94, 0x47, 0xbe, 0x2c, 0xf5, 0xe9, 0x9a, 0x69], + [0x9c, 0xd3, 0x8d, 0x96, 0xf0, 0xb3, 0xc1, 0x4b], + [0xbd, 0x61, 0x79, 0xa7, 0x1d, 0xc9, 0x6d, 0xbb], + [0x98, 0xee, 0xa2, 0x1a, 0xf2, 0x5c, 0xd6, 0xbe], + [0xc7, 0x67, 0x3b, 0x2e, 0xb0, 0xcb, 0xf2, 0xd0], + [0x88, 0x3e, 0xa3, 0xe3, 0x95, 0x67, 0x53, 0x93], + [0xc8, 0xce, 0x5c, 0xcd, 0x8c, 0x03, 0x0c, 0xa8], + [0x94, 0xaf, 0x49, 0xf6, 0xc6, 0x50, 0xad, 0xb8], + [0xea, 0xb8, 0x85, 0x8a, 0xde, 0x92, 0xe1, 0xbc], + [0xf3, 0x15, 0xbb, 0x5b, 0xb8, 0x35, 0xd8, 0x17], + [0xad, 0xcf, 0x6b, 0x07, 0x63, 0x61, 0x2e, 0x2f], + [0xa5, 0xc9, 0x1d, 0xa7, 0xac, 0xaa, 0x4d, 0xde], + [0x71, 0x65, 0x95, 0x87, 0x66, 0x50, 0xa2, 0xa6], + [0x28, 0xef, 0x49, 0x5c, 0x53, 0xa3, 0x87, 0xad], + [0x42, 0xc3, 0x41, 0xd8, 0xfa, 0x92, 0xd8, 0x32], + [0xce, 0x7c, 0xf2, 0x72, 0x2f, 0x51, 0x27, 0x71], + [0xe3, 0x78, 0x59, 0xf9, 0x46, 0x23, 0xf3, 0xa7], + [0x38, 0x12, 0x05, 0xbb, 0x1a, 0xb0, 0xe0, 0x12], + [0xae, 0x97, 0xa1, 0x0f, 0xd4, 0x34, 0xe0, 0x15], + [0xb4, 0xa3, 0x15, 0x08, 0xbe, 0xff, 0x4d, 0x31], + [0x81, 0x39, 0x62, 0x29, 0xf0, 0x90, 0x79, 0x02], + [0x4d, 0x0c, 0xf4, 0x9e, 0xe5, 0xd4, 0xdc, 0xca], + [0x5c, 0x73, 0x33, 0x6a, 0x76, 0xd8, 0xbf, 0x9a], + [0xd0, 0xa7, 0x04, 0x53, 0x6b, 0xa9, 0x3e, 0x0e], + [0x92, 0x59, 0x58, 0xfc, 0xd6, 0x42, 0x0c, 0xad], + [0xa9, 0x15, 0xc2, 0x9b, 0xc8, 0x06, 0x73, 0x18], + [0x95, 0x2b, 0x79, 0xf3, 0xbc, 0x0a, 0xa6, 0xd4], + [0xf2, 0x1d, 0xf2, 0xe4, 0x1d, 0x45, 0x35, 0xf9], + [0x87, 0x57, 0x75, 0x19, 0x04, 0x8f, 0x53, 0xa9], + [0x10, 0xa5, 0x6c, 0xf5, 0xdf, 0xcd, 0x9a, 0xdb], + [0xeb, 0x75, 0x09, 0x5c, 0xcd, 0x98, 0x6c, 0xd0], + [0x51, 0xa9, 0xcb, 0x9e, 0xcb, 0xa3, 0x12, 0xe6], + [0x96, 0xaf, 0xad, 0xfc, 0x2c, 0xe6, 0x66, 0xc7], + [0x72, 0xfe, 0x52, 0x97, 0x5a, 0x43, 0x64, 0xee], + [0x5a, 0x16, 0x45, 0xb2, 0x76, 0xd5, 0x92, 0xa1], + [0xb2, 0x74, 0xcb, 0x8e, 0xbf, 0x87, 0x87, 0x0a], + [0x6f, 0x9b, 0xb4, 0x20, 0x3d, 0xe7, 0xb3, 0x81], + [0xea, 0xec, 0xb2, 0xa3, 0x0b, 0x22, 0xa8, 0x7f], + [0x99, 0x24, 0xa4, 0x3c, 0xc1, 0x31, 0x57, 0x24], + [0xbd, 0x83, 0x8d, 0x3a, 0xaf, 0xbf, 0x8d, 0xb7], + [0x0b, 0x1a, 0x2a, 0x32, 0x65, 0xd5, 0x1a, 0xea], + [0x13, 0x50, 0x79, 0xa3, 0x23, 0x1c, 0xe6, 0x60], + [0x93, 0x2b, 0x28, 0x46, 0xe4, 0xd7, 0x06, 0x66], + [0xe1, 0x91, 0x5f, 0x5c, 0xb1, 0xec, 0xa4, 0x6c], + [0xf3, 0x25, 0x96, 0x5c, 0xa1, 0x6d, 0x62, 0x9f], + [0x57, 0x5f, 0xf2, 0x8e, 0x60, 0x38, 0x1b, 0xe5], + [0x72, 0x45, 0x06, 0xeb, 0x4c, 0x32, 0x8a, 0x95], + ]; + + let k0 = 0x_07_06_05_04_03_02_01_00; + let k1 = 0x_0f_0e_0d_0c_0b_0a_09_08; + let mut vin = [0u8; 64]; + let mut state_inc = HashEngine::with_keys(k0, k1); + + for i in 0..64 { + vin[i] = i as u8; + let vec = Hash::from_slice(&vecs[i][..]).unwrap(); + let out = Hash::hash_with_keys(k0, k1, &vin[0..i]); + assert_eq!(vec, out, "vec #{}", i); + + let inc = Hash::from_engine(state_inc.clone()); + assert_eq!(vec, inc, "vec #{}", i); + state_inc.input(&[i as u8]); + } + } +} + +#[cfg(bench)] +mod benches { + use test::Bencher; + + use crate::{Hash, HashEngine, siphash24}; + + #[bench] + pub fn siphash24_1ki(bh: &mut Bencher) { + let mut engine = siphash24::Hash::engine(); + let bytes = [1u8; 1024]; + bh.iter(|| { + engine.input(&bytes); + }); + bh.bytes = bytes.len() as u64; + } + + #[bench] + pub fn siphash24_64ki(bh: &mut Bencher) { + let mut engine = siphash24::Hash::engine(); + let bytes = [1u8; 65536]; + bh.iter(|| { + engine.input(&bytes); + }); + bh.bytes = bytes.len() as u64; + } + + #[bench] + pub fn siphash24_1ki_hash(bh: &mut Bencher) { + let k0 = 0x_07_06_05_04_03_02_01_00; + let k1 = 0x_0f_0e_0d_0c_0b_0a_09_08; + let bytes = [1u8; 1024]; + bh.iter(|| { + let _ = siphash24::Hash::hash_with_keys(k0, k1, &bytes); + }); + bh.bytes = bytes.len() as u64; + } + + #[bench] + pub fn siphash24_1ki_hash_u64(bh: &mut Bencher) { + let k0 = 0x_07_06_05_04_03_02_01_00; + let k1 = 0x_0f_0e_0d_0c_0b_0a_09_08; + let bytes = [1u8; 1024]; + bh.iter(|| { + let _ = siphash24::Hash::hash_to_u64_with_keys(k0, k1, &bytes); + }); + bh.bytes = bytes.len() as u64; + } +} diff --git a/hashes/src/util.rs b/hashes/src/util.rs new file mode 100644 index 00000000..77f4ce22 --- /dev/null +++ b/hashes/src/util.rs @@ -0,0 +1,278 @@ +// Bitcoin Hashes Library +// Written in 2018 by +// Andrew Poelstra +// +// To the extent possible under law, the author(s) have dedicated all +// copyright and related and neighboring rights to this software to +// the public domain worldwide. This software is distributed without +// any warranty. +// +// You should have received a copy of the CC0 Public Domain Dedication +// along with this software. +// If not, see . +// + +#[macro_export] +/// Adds hexadecimal formatting implementation of a trait `$imp` to a given type `$ty`. +macro_rules! hex_fmt_impl( + ($ty:ident) => ( + $crate::hex_fmt_impl!($ty, ); + ); + ($ty:ident, $($gen:ident: $gent:ident),*) => ( + impl<$($gen: $gent),*> $crate::_export::_core::fmt::LowerHex for $ty<$($gen),*> { + fn fmt(&self, f: &mut $crate::_export::_core::fmt::Formatter) -> $crate::_export::_core::fmt::Result { + #[allow(unused_imports)] + use $crate::{Hash as _, HashEngine as _, hex}; + + if f.alternate() { + write!(f, "0x")?; + } + if $ty::<$($gen),*>::DISPLAY_BACKWARD { + hex::format_hex_reverse(&self.0, f) + } else { + hex::format_hex(&self.0, f) + } + } + } + + impl<$($gen: $gent),*> $crate::_export::_core::fmt::Display for $ty<$($gen),*> { + fn fmt(&self, f: &mut $crate::_export::_core::fmt::Formatter) -> $crate::_export::_core::fmt::Result { + $crate::_export::_core::fmt::LowerHex::fmt(self, f) + } + } + + impl<$($gen: $gent),*> $crate::_export::_core::fmt::Debug for $ty<$($gen),*> { + fn fmt(&self, f: &mut $crate::_export::_core::fmt::Formatter) -> $crate::_export::_core::fmt::Result { + write!(f, "{:#}", self) + } + } + ); +); + +/// Adds slicing traits implementations to a given type `$ty` +#[macro_export] +macro_rules! borrow_slice_impl( + ($ty:ident) => ( + $crate::borrow_slice_impl!($ty, ); + ); + ($ty:ident, $($gen:ident: $gent:ident),*) => ( + impl<$($gen: $gent),*> $crate::_export::_core::borrow::Borrow<[u8]> for $ty<$($gen),*> { + fn borrow(&self) -> &[u8] { + &self[..] + } + } + + impl<$($gen: $gent),*> $crate::_export::_core::convert::AsRef<[u8]> for $ty<$($gen),*> { + fn as_ref(&self) -> &[u8] { + &self[..] + } + } + + impl<$($gen: $gent),*> $crate::_export::_core::ops::Deref for $ty<$($gen),*> { + type Target = [u8]; + + fn deref(&self) -> &Self::Target { + &self.0 + } + } + ) +); + +macro_rules! engine_input_impl( + () => ( + #[cfg(not(fuzzing))] + fn input(&mut self, mut inp: &[u8]) { + while !inp.is_empty() { + let buf_idx = self.length % ::BLOCK_SIZE; + let rem_len = ::BLOCK_SIZE - buf_idx; + let write_len = cmp::min(rem_len, inp.len()); + + self.buffer[buf_idx..buf_idx + write_len] + .copy_from_slice(&inp[..write_len]); + self.length += write_len; + if self.length % ::BLOCK_SIZE == 0 { + self.process_block(); + } + inp = &inp[write_len..]; + } + } + + #[cfg(fuzzing)] + fn input(&mut self, inp: &[u8]) { + for c in inp { + self.buffer[0] ^= *c; + } + self.length += inp.len(); + } + ) +); + + + +/// Creates a new newtype around a [`Hash`] type. +#[macro_export] +macro_rules! hash_newtype { + ($newtype:ident, $hash:ty, $len:expr, $docs:meta) => { + $crate::hash_newtype!($newtype, $hash, $len, $docs, <$hash as $crate::Hash>::DISPLAY_BACKWARD); + }; + ($newtype:ident, $hash:ty, $len:expr, $docs:meta, $reverse:expr) => { + #[$docs] + #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] + #[repr(transparent)] + pub struct $newtype($hash); + + $crate::hex_fmt_impl!($newtype); + $crate::serde_impl!($newtype, $len); + $crate::borrow_slice_impl!($newtype); + + impl $newtype { + /// Creates this type from the inner hash type. + pub fn from_hash(inner: $hash) -> $newtype { + $newtype(inner) + } + + /// Converts this type into the inner hash type. + pub fn as_hash(&self) -> $hash { + // Hashes implement Copy so don't need into_hash. + self.0 + } + } + + impl $crate::_export::_core::convert::From<$hash> for $newtype { + fn from(inner: $hash) -> $newtype { + // Due to rust 1.22 we have to use this instead of simple `Self(inner)` + Self { 0: inner } + } + } + + impl $crate::_export::_core::convert::From<$newtype> for $hash { + fn from(hashtype: $newtype) -> $hash { + hashtype.0 + } + } + + impl $crate::Hash for $newtype { + type Engine = <$hash as $crate::Hash>::Engine; + type Inner = <$hash as $crate::Hash>::Inner; + + const LEN: usize = <$hash as $crate::Hash>::LEN; + const DISPLAY_BACKWARD: bool = $reverse; + + fn engine() -> Self::Engine { + <$hash as $crate::Hash>::engine() + } + + fn from_engine(e: Self::Engine) -> Self { + Self::from(<$hash as $crate::Hash>::from_engine(e)) + } + + #[inline] + fn from_slice(sl: &[u8]) -> Result<$newtype, $crate::Error> { + Ok($newtype(<$hash as $crate::Hash>::from_slice(sl)?)) + } + + #[inline] + fn from_inner(inner: Self::Inner) -> Self { + $newtype(<$hash as $crate::Hash>::from_inner(inner)) + } + + #[inline] + fn into_inner(self) -> Self::Inner { + self.0.into_inner() + } + + #[inline] + fn as_inner(&self) -> &Self::Inner { + self.0.as_inner() + } + + #[inline] + fn all_zeros() -> Self { + let zeros = <$hash>::all_zeros(); + $newtype(zeros) + } + } + + impl $crate::_export::_core::str::FromStr for $newtype { + type Err = $crate::hex::Error; + fn from_str(s: &str) -> $crate::_export::_core::result::Result<$newtype, Self::Err> { + $crate::hex::FromHex::from_hex(s) + } + } + + impl> $crate::_export::_core::ops::Index for $newtype { + type Output = I::Output; + + #[inline] + fn index(&self, index: I) -> &Self::Output { + &self.0[index] + } + } + }; +} + +#[cfg(feature = "schemars")] +#[cfg_attr(docsrs, doc(cfg(feature = "schemars")))] +pub mod json_hex_string { + use schemars::schema::{Schema, SchemaObject}; + use schemars::{gen::SchemaGenerator, JsonSchema}; + macro_rules! define_custom_hex { + ($name:ident, $len:expr) => { + pub fn $name(gen: &mut SchemaGenerator) -> Schema { + let mut schema: SchemaObject = ::json_schema(gen).into(); + schema.string = Some(Box::new(schemars::schema::StringValidation { + max_length: Some($len * 2), + min_length: Some($len * 2), + pattern: Some("[0-9a-fA-F]+".to_owned()), + })); + schema.into() + } + }; + } + define_custom_hex!(len_8, 8); + define_custom_hex!(len_20, 20); + define_custom_hex!(len_32, 32); + define_custom_hex!(len_64, 64); +} + +#[cfg(test)] +mod test { + use crate::{Hash, sha256}; + + #[test] + fn borrow_slice_impl_to_vec() { + // Test that the borrow_slice_impl macro gives to_vec. + let hash = sha256::Hash::hash(&[3, 50]); + assert_eq!(hash.to_vec().len(), sha256::Hash::LEN); + } + + hash_newtype!(TestHash, crate::sha256d::Hash, 32, doc="Test hash."); + + #[test] + fn display() { + let want = "0000000000000000000000000000000000000000000000000000000000000000"; + let got = format!("{}", TestHash::all_zeros()); + assert_eq!(got, want) + } + + #[test] + fn display_alternate() { + let want = "0x0000000000000000000000000000000000000000000000000000000000000000"; + let got = format!("{:#}", TestHash::all_zeros()); + assert_eq!(got, want) + } + + #[test] + fn lower_hex() { + let want = "0000000000000000000000000000000000000000000000000000000000000000"; + let got = format!("{:x}", TestHash::all_zeros()); + assert_eq!(got, want) + } + + #[test] + fn lower_hex_alternate() { + let want = "0x0000000000000000000000000000000000000000000000000000000000000000"; + let got = format!("{:#x}", TestHash::all_zeros()); + assert_eq!(got, want) + } +} diff --git a/rustfmt.toml b/rustfmt.toml index a80a8e64..390e4b64 100644 --- a/rustfmt.toml +++ b/rustfmt.toml @@ -4,6 +4,7 @@ ignore = [ "bitcoin/src/consensus", "bitcoin/src/network", "bitcoin/src/util", + "hashes", ] hard_tabs = false