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 [ + - ]: 857 : FUZZ_TARGET(muhash)
13 : : {
14 : 445 : FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
15 : 445 : std::vector<uint8_t> data{ConsumeRandomLengthByteVector(fuzzed_data_provider)};
16 : 445 : std::vector<uint8_t> data2{ConsumeRandomLengthByteVector(fuzzed_data_provider)};
17 : :
18 : 445 : MuHash3072 muhash;
19 : :
20 : 445 : muhash.Insert(data);
21 : 445 : muhash.Insert(data2);
22 : :
23 : 445 : constexpr uint256 initial_state_hash{"dd5ad2a105c2d29495f577245c357409002329b9f4d6182c0af3dc2f462555c8"};
24 : 445 : uint256 out;
25 : 445 : uint256 out2;
26 : 445 : CallOneOf(
27 : : fuzzed_data_provider,
28 : 69 : [&] {
29 : : // Test that MuHash result is consistent independent of order of operations
30 : 69 : muhash.Finalize(out);
31 : :
32 : 69 : muhash = MuHash3072();
33 : 69 : muhash.Insert(data2);
34 : 69 : muhash.Insert(data);
35 : 69 : muhash.Finalize(out2);
36 : 69 : },
37 : 36 : [&] {
38 : : // Test that multiplication with the initial state never changes the finalized result
39 : 36 : muhash.Finalize(out);
40 : 36 : MuHash3072 muhash3;
41 : 36 : muhash3 *= muhash;
42 : 36 : muhash3.Finalize(out2);
43 : 36 : },
44 : 242 : [&] {
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 : 242 : muhash /= muhash;
54 : :
55 : : #if defined(__clang__)
56 : : # pragma clang diagnostic pop
57 : : #endif
58 : :
59 : 242 : muhash.Finalize(out);
60 : 242 : out2 = initial_state_hash;
61 : 242 : },
62 : 98 : [&] {
63 : : // Test that removing all added elements brings the object back to it's initial state
64 : 98 : muhash.Remove(data);
65 : 98 : muhash.Remove(data2);
66 : 98 : muhash.Finalize(out);
67 : 98 : out2 = initial_state_hash;
68 : 98 : });
69 [ - + ]: 445 : assert(out == out2);
70 : 445 : }
|