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