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 <marleo23@proton.me>
This commit is contained in:
Lőrinc 2025-02-20 16:57:26 +01:00 committed by glozow
parent 15ecae31a8
commit 458655bca8

View File

@ -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<int>(-1, 100)};
// Decode/Encode roundtrip
if (std::vector<unsigned char> 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<int>(0, decoded.size() - 1)));
}
// Encode/Decode roundtrip
const auto encoded{EncodeBase58(MakeUCharSpan(random_string))};
std::vector<unsigned char> 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<int>(-1, decode_input.size() + 1)};
if (std::vector<unsigned char> 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<size_t>(max_ret_len));
assert(!DecodeBase58(encoded_string, decoded, provider.ConsumeIntegralInRange<int>(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<int>(-1, 100)};
// Decode/Encode roundtrip
if (std::vector<unsigned char> 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<int>(0, decoded.size() - 1)));
}
// Encode/Decode roundtrip
const auto encoded{EncodeBase58Check(MakeUCharSpan(random_string))};
std::vector<unsigned char> 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<int>(-1, decode_input.size() + 1)};
if (std::vector<unsigned char> 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<size_t>(max_ret_len));
assert(!DecodeBase58Check(encoded_string, decoded, provider.ConsumeIntegralInRange<int>(0, decoded.size() - 1)));
}
}
}
FUZZ_TARGET(base32_encode_decode)