Branch data Line data Source code
1 : : // Copyright (c) 2020-2021 The Bitcoin Core developers
2 : : // Distributed under the MIT software license, see the accompanying
3 : : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 : :
5 : : #include <crypto/muhash.h>
6 : : #include <test/fuzz/FuzzedDataProvider.h>
7 : : #include <test/fuzz/fuzz.h>
8 : : #include <test/fuzz/util.h>
9 : :
10 : : #include <vector>
11 : :
12 [ + - ]: 1474 : FUZZ_TARGET(muhash)
13 : : {
14 : 1060 : FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
15 : 1060 : std::vector<uint8_t> data{ConsumeRandomLengthByteVector(fuzzed_data_provider)};
16 : 1060 : std::vector<uint8_t> data2{ConsumeRandomLengthByteVector(fuzzed_data_provider)};
17 : :
18 : 1060 : MuHash3072 muhash;
19 : :
20 : 1060 : muhash.Insert(data);
21 : 1060 : muhash.Insert(data2);
22 : :
23 : 1060 : constexpr uint256 initial_state_hash{"dd5ad2a105c2d29495f577245c357409002329b9f4d6182c0af3dc2f462555c8"};
24 : 1060 : uint256 out;
25 : 1060 : uint256 out2;
26 : 1060 : CallOneOf(
27 : : fuzzed_data_provider,
28 : 177 : [&] {
29 : : // Test that MuHash result is consistent independent of order of operations
30 : 177 : muhash.Finalize(out);
31 : :
32 : 177 : muhash = MuHash3072();
33 : 177 : muhash.Insert(data2);
34 : 177 : muhash.Insert(data);
35 : 177 : muhash.Finalize(out2);
36 : 177 : },
37 : 78 : [&] {
38 : : // Test that multiplication with the initial state never changes the finalized result
39 : 78 : muhash.Finalize(out);
40 : 78 : MuHash3072 muhash3;
41 : 78 : muhash3 *= muhash;
42 : 78 : muhash3.Finalize(out2);
43 : 78 : },
44 : 591 : [&] {
45 : : // Test that dividing a MuHash by itself brings it back to it's initial state
46 : :
47 : : // See note about clang + self-assignment in test/uint256_tests.cpp
48 : : #if defined(__clang__)
49 : : # pragma clang diagnostic push
50 : : # pragma clang diagnostic ignored "-Wself-assign-overloaded"
51 : : #endif
52 : :
53 : 591 : muhash /= muhash;
54 : :
55 : : #if defined(__clang__)
56 : : # pragma clang diagnostic pop
57 : : #endif
58 : :
59 : 591 : muhash.Finalize(out);
60 : 591 : out2 = initial_state_hash;
61 : 591 : },
62 : 214 : [&] {
63 : : // Test that removing all added elements brings the object back to it's initial state
64 : 214 : muhash.Remove(data);
65 : 214 : muhash.Remove(data2);
66 : 214 : muhash.Finalize(out);
67 : 214 : out2 = initial_state_hash;
68 : 214 : });
69 [ - + ]: 1060 : assert(out == out2);
70 : 1060 : }
|