From 458655bca8eddd4d913958c579a46a6fca23cbf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C5=91rinc?= Date: Thu, 20 Feb 2025 16:57:26 +0100 Subject: [PATCH] fuzz: make sure DecodeBase58(Check) is called with valid values more often In Base58 fuzz the two roundtrips are merged now, the new `decode_input` switches between a completely random input and a valid encoded one, to make sure the decoding passes more often. The `max_ret_len` can also exceed the original length now and is being validated more thoroughly. Github-Pull: #31917 Rebased-From: d5537c18a9034647ba4c9ed4008abd7fee33989e Co-authored-by: maflcko <6399679+maflcko@users.noreply.github.com> Co-authored-by: marcofleon --- src/test/fuzz/base_encode_decode.cpp | 44 ++++++++++++++-------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/test/fuzz/base_encode_decode.cpp b/src/test/fuzz/base_encode_decode.cpp index 69caac58100..2ffcbdf7207 100644 --- a/src/test/fuzz/base_encode_decode.cpp +++ b/src/test/fuzz/base_encode_decode.cpp @@ -22,38 +22,38 @@ FUZZ_TARGET(base58_encode_decode) { FuzzedDataProvider provider{buffer.data(), buffer.size()}; const auto random_string{provider.ConsumeRandomLengthString(100)}; - const int max_ret_len{provider.ConsumeIntegralInRange(-1, 100)}; - // Decode/Encode roundtrip - if (std::vector decoded; DecodeBase58(random_string, decoded, max_ret_len)) { - const auto encoded_string{EncodeBase58(decoded)}; - assert(encoded_string == TrimStringView(random_string)); - assert(decoded.empty() || !DecodeBase58(encoded_string, decoded, provider.ConsumeIntegralInRange(0, decoded.size() - 1))); - } - // Encode/Decode roundtrip const auto encoded{EncodeBase58(MakeUCharSpan(random_string))}; - std::vector roundtrip_decoded; - assert(DecodeBase58(encoded, roundtrip_decoded, random_string.size()) - && std::ranges::equal(roundtrip_decoded, MakeUCharSpan(random_string))); + const auto decode_input{provider.ConsumeBool() ? random_string : encoded}; + const int max_ret_len{provider.ConsumeIntegralInRange(-1, decode_input.size() + 1)}; + if (std::vector decoded; DecodeBase58(decode_input, decoded, max_ret_len)) { + const auto encoded_string{EncodeBase58(decoded)}; + assert(encoded_string == TrimStringView(decode_input)); + if (decoded.size() > 0) { + assert(max_ret_len > 0); + assert(decoded.size() <= static_cast(max_ret_len)); + assert(!DecodeBase58(encoded_string, decoded, provider.ConsumeIntegralInRange(0, decoded.size() - 1))); + } + } } FUZZ_TARGET(base58check_encode_decode) { FuzzedDataProvider provider{buffer.data(), buffer.size()}; const auto random_string{provider.ConsumeRandomLengthString(100)}; - const int max_ret_len{provider.ConsumeIntegralInRange(-1, 100)}; - // Decode/Encode roundtrip - if (std::vector decoded; DecodeBase58Check(random_string, decoded, max_ret_len)) { - const auto encoded_string{EncodeBase58Check(decoded)}; - assert(encoded_string == TrimStringView(random_string)); - assert(decoded.empty() || !DecodeBase58Check(encoded_string, decoded, provider.ConsumeIntegralInRange(0, decoded.size() - 1))); - } - // Encode/Decode roundtrip const auto encoded{EncodeBase58Check(MakeUCharSpan(random_string))}; - std::vector roundtrip_decoded; - assert(DecodeBase58Check(encoded, roundtrip_decoded, random_string.size()) - && std::ranges::equal(roundtrip_decoded, MakeUCharSpan(random_string))); + const auto decode_input{provider.ConsumeBool() ? random_string : encoded}; + const int max_ret_len{provider.ConsumeIntegralInRange(-1, decode_input.size() + 1)}; + if (std::vector decoded; DecodeBase58Check(decode_input, decoded, max_ret_len)) { + const auto encoded_string{EncodeBase58Check(decoded)}; + assert(encoded_string == TrimStringView(decode_input)); + if (decoded.size() > 0) { + assert(max_ret_len > 0); + assert(decoded.size() <= static_cast(max_ret_len)); + assert(!DecodeBase58Check(encoded_string, decoded, provider.ConsumeIntegralInRange(0, decoded.size() - 1))); + } + } } FUZZ_TARGET(base32_encode_decode)