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