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 <blockfilter.h>
6 #include <test/fuzz/FuzzedDataProvider.h>
7 #include <test/fuzz/fuzz.h>
8 #include <test/fuzz/util.h>
9 
10 #include <cstdint>
11 #include <optional>
12 #include <string>
13 #include <vector>
14 
test_one_input(const std::vector<uint8_t> & buffer)15 void test_one_input(const std::vector<uint8_t>& buffer)
16 {
17     FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
18     const std::optional<BlockFilter> block_filter = ConsumeDeserializable<BlockFilter>(fuzzed_data_provider);
19     if (!block_filter) {
20         return;
21     }
22     {
23         (void)block_filter->ComputeHeader(ConsumeUInt256(fuzzed_data_provider));
24         (void)block_filter->GetBlockHash();
25         (void)block_filter->GetEncodedFilter();
26         (void)block_filter->GetHash();
27     }
28     {
29         const BlockFilterType block_filter_type = block_filter->GetFilterType();
30         (void)BlockFilterTypeName(block_filter_type);
31     }
32     {
33         const GCSFilter gcs_filter = block_filter->GetFilter();
34         (void)gcs_filter.GetN();
35         (void)gcs_filter.GetParams();
36         (void)gcs_filter.GetEncoded();
37         (void)gcs_filter.Match(ConsumeRandomLengthByteVector(fuzzed_data_provider));
38         GCSFilter::ElementSet element_set;
39         while (fuzzed_data_provider.ConsumeBool()) {
40             element_set.insert(ConsumeRandomLengthByteVector(fuzzed_data_provider));
41             gcs_filter.MatchAny(element_set);
42         }
43     }
44 }
45