1 // Copyright (c) 2020 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 <bloom.h>
6 #include <optional.h>
7 #include <primitives/transaction.h>
8 #include <test/fuzz/FuzzedDataProvider.h>
9 #include <test/fuzz/fuzz.h>
10 #include <test/fuzz/util.h>
11 #include <uint256.h>
12 
13 #include <cassert>
14 #include <cstdint>
15 #include <string>
16 #include <vector>
17 
test_one_input(const std::vector<uint8_t> & buffer)18 void test_one_input(const std::vector<uint8_t>& buffer)
19 {
20     FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
21 
22     CBloomFilter bloom_filter{
23         fuzzed_data_provider.ConsumeIntegralInRange<unsigned int>(1, 10000000),
24         1.0 / fuzzed_data_provider.ConsumeIntegralInRange<unsigned int>(1, std::numeric_limits<unsigned int>::max()),
25         fuzzed_data_provider.ConsumeIntegral<unsigned int>(),
26         static_cast<unsigned char>(fuzzed_data_provider.PickValueInArray({BLOOM_UPDATE_NONE, BLOOM_UPDATE_ALL, BLOOM_UPDATE_P2PUBKEY_ONLY, BLOOM_UPDATE_MASK}))};
27     while (fuzzed_data_provider.remaining_bytes() > 0) {
28         switch (fuzzed_data_provider.ConsumeIntegralInRange(0, 6)) {
29         case 0: {
30             const std::vector<unsigned char> b = ConsumeRandomLengthByteVector(fuzzed_data_provider);
31             (void)bloom_filter.contains(b);
32             bloom_filter.insert(b);
33             const bool present = bloom_filter.contains(b);
34             assert(present);
35             break;
36         }
37         case 1: {
38             const Optional<COutPoint> out_point = ConsumeDeserializable<COutPoint>(fuzzed_data_provider);
39             if (!out_point) {
40                 break;
41             }
42             (void)bloom_filter.contains(*out_point);
43             bloom_filter.insert(*out_point);
44             const bool present = bloom_filter.contains(*out_point);
45             assert(present);
46             break;
47         }
48         case 2: {
49             const Optional<uint256> u256 = ConsumeDeserializable<uint256>(fuzzed_data_provider);
50             if (!u256) {
51                 break;
52             }
53             (void)bloom_filter.contains(*u256);
54             bloom_filter.insert(*u256);
55             const bool present = bloom_filter.contains(*u256);
56             assert(present);
57             break;
58         }
59         case 3:
60             bloom_filter.clear();
61             break;
62         case 4:
63             bloom_filter.reset(fuzzed_data_provider.ConsumeIntegral<unsigned int>());
64             break;
65         case 5: {
66             const Optional<CMutableTransaction> mut_tx = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider);
67             if (!mut_tx) {
68                 break;
69             }
70             const CTransaction tx{*mut_tx};
71             (void)bloom_filter.IsRelevantAndUpdate(tx);
72             break;
73         }
74         case 6:
75             bloom_filter.UpdateEmptyFull();
76             break;
77         }
78         (void)bloom_filter.IsWithinSizeConstraints();
79     }
80 }
81