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)17void 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