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 <test/fuzz/FuzzedDataProvider.h>
7 #include <test/fuzz/fuzz.h>
8 #include <test/fuzz/util.h>
9 #include <uint256.h>
10 
11 #include <cassert>
12 #include <cstdint>
13 #include <optional>
14 #include <string>
15 #include <vector>
16 
test_one_input(const std::vector<uint8_t> & buffer)17 void test_one_input(const std::vector<uint8_t>& buffer)
18 {
19     FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
20 
21     CRollingBloomFilter rolling_bloom_filter{
22         fuzzed_data_provider.ConsumeIntegralInRange<unsigned int>(1, 1000),
23         0.999 / fuzzed_data_provider.ConsumeIntegralInRange<unsigned int>(1, std::numeric_limits<unsigned int>::max())};
24     while (fuzzed_data_provider.remaining_bytes() > 0) {
25         switch (fuzzed_data_provider.ConsumeIntegralInRange(0, 2)) {
26         case 0: {
27             const std::vector<unsigned char> b = ConsumeRandomLengthByteVector(fuzzed_data_provider);
28             (void)rolling_bloom_filter.contains(b);
29             rolling_bloom_filter.insert(b);
30             const bool present = rolling_bloom_filter.contains(b);
31             assert(present);
32             break;
33         }
34         case 1: {
35             const std::optional<uint256> u256 = ConsumeDeserializable<uint256>(fuzzed_data_provider);
36             if (!u256) {
37                 break;
38             }
39             (void)rolling_bloom_filter.contains(*u256);
40             rolling_bloom_filter.insert(*u256);
41             const bool present = rolling_bloom_filter.contains(*u256);
42             assert(present);
43             break;
44         }
45         case 2:
46             rolling_bloom_filter.reset();
47             break;
48         }
49     }
50 }
51