diff --git a/src/test/base58_tests.cpp b/src/test/base58_tests.cpp index d0e9d45b417..62db257a78c 100644 --- a/src/test/base58_tests.cpp +++ b/src/test/base58_tests.cpp @@ -82,20 +82,4 @@ BOOST_AUTO_TEST_CASE(base58_DecodeBase58) BOOST_CHECK(!DecodeBase58Check("3vQB7B6MrGQZaxCuFg4oh\0" "0IOl"s, result, 100)); } -BOOST_AUTO_TEST_CASE(base58_random_encode_decode) -{ - for (int n = 0; n < 1000; ++n) { - unsigned int len = 1 + m_rng.randbits(8); - unsigned int zeroes = m_rng.randbool() ? m_rng.randrange(len + 1) : 0; - auto data = Cat(std::vector(zeroes, '\000'), m_rng.randbytes(len - zeroes)); - auto encoded = EncodeBase58Check(data); - std::vector decoded; - auto ok_too_small = DecodeBase58Check(encoded, decoded, m_rng.randrange(len)); - BOOST_CHECK(!ok_too_small); - auto ok = DecodeBase58Check(encoded, decoded, len + m_rng.randrange(257 - len)); - BOOST_CHECK(ok); - BOOST_CHECK(data == decoded); - } -} - BOOST_AUTO_TEST_SUITE_END() diff --git a/src/test/fuzz/base_encode_decode.cpp b/src/test/fuzz/base_encode_decode.cpp index 0cc8cb58862..df3c10b4b1d 100644 --- a/src/test/fuzz/base_encode_decode.cpp +++ b/src/test/fuzz/base_encode_decode.cpp @@ -6,49 +6,90 @@ #include #include +#include #include #include #include -#include #include #include +#include -using util::TrimString; using util::TrimStringView; -FUZZ_TARGET(base_encode_decode) +FUZZ_TARGET(base58_encode_decode) { - const std::string random_encoded_string(buffer.begin(), buffer.end()); + FuzzedDataProvider provider(buffer.data(), buffer.size()); + const std::string random_string{provider.ConsumeRandomLengthString(1000)}; + // Decode/Encode roundtrip std::vector decoded; - if (DecodeBase58(random_encoded_string, decoded, 100)) { - const std::string encoded_string = EncodeBase58(decoded); - assert(encoded_string == TrimStringView(encoded_string)); - assert(ToLower(encoded_string) == ToLower(TrimString(random_encoded_string))); + if (DecodeBase58(random_string, decoded, 100)) { + const auto encoded_string{EncodeBase58(decoded)}; + assert(encoded_string == TrimStringView(random_string)); + assert(encoded_string.empty() || !DecodeBase58(encoded_string, decoded, provider.ConsumeIntegralInRange(0, decoded.size() - 1))); } + // Encode/Decode roundtrip + const auto encoded{EncodeBase58(buffer)}; + std::vector roundtrip_decoded; + assert(DecodeBase58(encoded, roundtrip_decoded, buffer.size()) + && std::ranges::equal(roundtrip_decoded, buffer)); +} - if (DecodeBase58Check(random_encoded_string, decoded, 100)) { - const std::string encoded_string = EncodeBase58Check(decoded); - assert(encoded_string == TrimString(encoded_string)); - assert(ToLower(encoded_string) == ToLower(TrimString(random_encoded_string))); - } +FUZZ_TARGET(base58check_encode_decode) +{ + FuzzedDataProvider provider(buffer.data(), buffer.size()); + const std::string random_string{provider.ConsumeRandomLengthString(1000)}; - auto result = DecodeBase32(random_encoded_string); - if (result) { - const std::string encoded_string = EncodeBase32(*result); - assert(encoded_string == TrimStringView(encoded_string)); - assert(ToLower(encoded_string) == ToLower(TrimString(random_encoded_string))); + // Decode/Encode roundtrip + std::vector decoded; + if (DecodeBase58Check(random_string, decoded, 100)) { + const auto encoded_string{EncodeBase58Check(decoded)}; + assert(encoded_string == TrimStringView(random_string)); + assert(encoded_string.empty() || !DecodeBase58Check(encoded_string, decoded, provider.ConsumeIntegralInRange(0, decoded.size() - 1))); } + // Encode/Decode roundtrip + const auto encoded{EncodeBase58Check(buffer)}; + std::vector roundtrip_decoded; + assert(DecodeBase58Check(encoded, roundtrip_decoded, buffer.size()) + && std::ranges::equal(roundtrip_decoded, buffer)); +} - result = DecodeBase64(random_encoded_string); - if (result) { - const std::string encoded_string = EncodeBase64(*result); - assert(encoded_string == TrimString(encoded_string)); - assert(ToLower(encoded_string) == ToLower(TrimString(random_encoded_string))); +FUZZ_TARGET(base32_encode_decode) +{ + const std::string random_string{buffer.begin(), buffer.end()}; + + // Decode/Encode roundtrip + if (auto result{DecodeBase32(random_string)}) { + const auto encoded_string{EncodeBase32(*result)}; + assert(encoded_string == ToLower(TrimStringView(random_string))); } + // Encode/Decode roundtrip + const auto encoded{EncodeBase32(buffer)}; + const auto decoded{DecodeBase32(encoded)}; + assert(decoded && std::ranges::equal(*decoded, buffer)); +} + +FUZZ_TARGET(base64_encode_decode) +{ + const std::string random_string{buffer.begin(), buffer.end()}; + + // Decode/Encode roundtrip + if (auto result{DecodeBase64(random_string)}) { + const auto encoded_string{EncodeBase64(*result)}; + assert(encoded_string == TrimStringView(random_string)); + } + // Encode/Decode roundtrip + const auto encoded{EncodeBase64(buffer)}; + const auto decoded{DecodeBase64(encoded)}; + assert(decoded && std::ranges::equal(*decoded, buffer)); +} + +FUZZ_TARGET(psbt_base64_decode) +{ + const std::string random_string{buffer.begin(), buffer.end()}; PartiallySignedTransaction psbt; std::string error; - (void)DecodeBase64PSBT(psbt, random_encoded_string, error); + assert(DecodeBase64PSBT(psbt, random_string, error) == error.empty()); }