diff --git a/src/Makefile.test.include b/src/Makefile.test.include --- a/src/Makefile.test.include +++ b/src/Makefile.test.include @@ -8,6 +8,7 @@ test/fuzz/address_deserialize \ test/fuzz/addrman_deserialize \ test/fuzz/banentry_deserialize \ + test/fuzz/cashaddr \ test/fuzz/block_deserialize \ test/fuzz/block_file_info_deserialize \ test/fuzz/block_filter_deserialize \ @@ -89,7 +90,11 @@ FUZZ_SUITE = \ test/fuzz/fuzz.cpp \ test/fuzz/fuzz.h \ - test/fuzz/FuzzedDataProvider.h + test/fuzz/FuzzedDataProvider.h \ + test/setup_common.cpp \ + test/setup_common.h \ + test/util/str.cpp \ + test/util/str.h FUZZ_SUITE_LD_COMMON = \ $(LIBBITCOIN_SERVER) \ @@ -303,6 +308,12 @@ test_fuzz_banentry_deserialize_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) test_fuzz_banentry_deserialize_LDADD = $(FUZZ_SUITE_LD_COMMON) +test_fuzz_cashaddr_SOURCES = $(FUZZ_SUITE) test/fuzz/cashaddr.cpp +test_fuzz_cashaddr_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) +test_fuzz_cashaddr_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) +test_fuzz_cashaddr_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) +test_fuzz_cashaddr_LDADD = $(FUZZ_SUITE_LD_COMMON) + test_fuzz_txundo_deserialize_SOURCES = $(FUZZ_SUITE) test/fuzz/deserialize.cpp test_fuzz_txundo_deserialize_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) -DTXUNDO_DESERIALIZE=1 test_fuzz_txundo_deserialize_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) diff --git a/src/test/fuzz/CMakeLists.txt b/src/test/fuzz/CMakeLists.txt --- a/src/test/fuzz/CMakeLists.txt +++ b/src/test/fuzz/CMakeLists.txt @@ -45,6 +45,7 @@ endfunction() add_regular_fuzz_targets( + cashaddr descriptor_parse eval_script parse_iso8601 diff --git a/src/test/fuzz/cashaddr.cpp b/src/test/fuzz/cashaddr.cpp new file mode 100644 --- /dev/null +++ b/src/test/fuzz/cashaddr.cpp @@ -0,0 +1,52 @@ +// Copyright (c) 2019 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +void test_one_input(const std::vector &buffer) { + FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size()); + const std::string random_string = + fuzzed_data_provider.ConsumeRandomLengthString(112); + const std::string random_prefix = + fuzzed_data_provider.ConsumeRemainingBytesAsString(); + const std::pair> r1 = + cashaddr::Decode(random_prefix, random_string); + if (r1.first.empty()) { + assert(r1.second.empty()); + } else { + const std::string &hrp = r1.first; + const std::vector &data = r1.second; + const std::string reencoded = cashaddr::Encode(hrp, data); + assert(CaseInsensitiveEqual(random_string, reencoded)); + } + + std::vector input; + ConvertBits<8, 5, true>([&](uint8_t c) { input.push_back(c); }, + buffer.begin(), buffer.end()); + const std::string encoded = cashaddr::Encode(random_prefix, input); + assert(!encoded.empty()); + + const std::pair> r2 = + cashaddr::Decode(random_prefix, encoded); + if (r2.first.empty()) { + assert(r2.second.empty()); + } else { + const std::string &hrp = r2.first; + const std::vector &data = r2.second; + assert(hrp == random_prefix); + assert(data == input); + } +}