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 <merkleblock.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 <cstdint>
12 #include <optional>
13 #include <string>
14 #include <vector>
15 
test_one_input(const std::vector<uint8_t> & buffer)16 void test_one_input(const std::vector<uint8_t>& buffer)
17 {
18     FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
19     CPartialMerkleTree partial_merkle_tree;
20     switch (fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 1)) {
21     case 0: {
22         const std::optional<CPartialMerkleTree> opt_partial_merkle_tree = ConsumeDeserializable<CPartialMerkleTree>(fuzzed_data_provider);
23         if (opt_partial_merkle_tree) {
24             partial_merkle_tree = *opt_partial_merkle_tree;
25         }
26         break;
27     }
28     case 1: {
29         CMerkleBlock merkle_block;
30         const std::optional<CBlock> opt_block = ConsumeDeserializable<CBlock>(fuzzed_data_provider);
31         CBloomFilter bloom_filter;
32         std::set<uint256> txids;
33         if (opt_block && !opt_block->vtx.empty()) {
34             if (fuzzed_data_provider.ConsumeBool()) {
35                 merkle_block = CMerkleBlock{*opt_block, bloom_filter};
36             } else if (fuzzed_data_provider.ConsumeBool()) {
37                 while (fuzzed_data_provider.ConsumeBool()) {
38                     txids.insert(ConsumeUInt256(fuzzed_data_provider));
39                 }
40                 merkle_block = CMerkleBlock{*opt_block, txids};
41             }
42         }
43         partial_merkle_tree = merkle_block.txn;
44         break;
45     }
46     }
47     (void)partial_merkle_tree.GetNumTransactions();
48     std::vector<uint256> matches;
49     std::vector<unsigned int> indices;
50     (void)partial_merkle_tree.ExtractMatches(matches, indices);
51 }
52