Skip to content

Commit d5537c1

Browse files
l0rincmaflckomarcofleon
committed
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. Co-authored-by: maflcko <[email protected]> Co-authored-by: marcofleon <[email protected]>
1 parent bad1433 commit d5537c1

File tree

1 file changed

+20
-20
lines changed

1 file changed

+20
-20
lines changed

src/test/fuzz/base_encode_decode.cpp

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -22,38 +22,38 @@ FUZZ_TARGET(base58_encode_decode)
2222
{
2323
FuzzedDataProvider provider{buffer.data(), buffer.size()};
2424
const auto random_string{provider.ConsumeRandomLengthString(100)};
25-
const int max_ret_len{provider.ConsumeIntegralInRange<int>(-1, 100)};
2625

27-
// Decode/Encode roundtrip
28-
if (std::vector<unsigned char> decoded; DecodeBase58(random_string, decoded, max_ret_len)) {
26+
const auto encoded{EncodeBase58(MakeUCharSpan(random_string))};
27+
const auto decode_input{provider.ConsumeBool() ? random_string : encoded};
28+
const int max_ret_len{provider.ConsumeIntegralInRange<int>(-1, decode_input.size() + 1)};
29+
if (std::vector<unsigned char> decoded; DecodeBase58(decode_input, decoded, max_ret_len)) {
2930
const auto encoded_string{EncodeBase58(decoded)};
30-
assert(encoded_string == TrimStringView(random_string));
31-
assert(decoded.empty() || !DecodeBase58(encoded_string, decoded, provider.ConsumeIntegralInRange<int>(0, decoded.size() - 1)));
31+
assert(encoded_string == TrimStringView(decode_input));
32+
if (decoded.size() > 0) {
33+
assert(max_ret_len > 0);
34+
assert(decoded.size() <= static_cast<size_t>(max_ret_len));
35+
assert(!DecodeBase58(encoded_string, decoded, provider.ConsumeIntegralInRange<int>(0, decoded.size() - 1)));
36+
}
3237
}
33-
// Encode/Decode roundtrip
34-
const auto encoded{EncodeBase58(MakeUCharSpan(random_string))};
35-
std::vector<unsigned char> roundtrip_decoded;
36-
assert(DecodeBase58(encoded, roundtrip_decoded, random_string.size())
37-
&& std::ranges::equal(roundtrip_decoded, MakeUCharSpan(random_string)));
3838
}
3939

4040
FUZZ_TARGET(base58check_encode_decode)
4141
{
4242
FuzzedDataProvider provider{buffer.data(), buffer.size()};
4343
const auto random_string{provider.ConsumeRandomLengthString(100)};
44-
const int max_ret_len{provider.ConsumeIntegralInRange<int>(-1, 100)};
4544

46-
// Decode/Encode roundtrip
47-
if (std::vector<unsigned char> decoded; DecodeBase58Check(random_string, decoded, max_ret_len)) {
45+
const auto encoded{EncodeBase58Check(MakeUCharSpan(random_string))};
46+
const auto decode_input{provider.ConsumeBool() ? random_string : encoded};
47+
const int max_ret_len{provider.ConsumeIntegralInRange<int>(-1, decode_input.size() + 1)};
48+
if (std::vector<unsigned char> decoded; DecodeBase58Check(decode_input, decoded, max_ret_len)) {
4849
const auto encoded_string{EncodeBase58Check(decoded)};
49-
assert(encoded_string == TrimStringView(random_string));
50-
assert(decoded.empty() || !DecodeBase58Check(encoded_string, decoded, provider.ConsumeIntegralInRange<int>(0, decoded.size() - 1)));
50+
assert(encoded_string == TrimStringView(decode_input));
51+
if (decoded.size() > 0) {
52+
assert(max_ret_len > 0);
53+
assert(decoded.size() <= static_cast<size_t>(max_ret_len));
54+
assert(!DecodeBase58Check(encoded_string, decoded, provider.ConsumeIntegralInRange<int>(0, decoded.size() - 1)));
55+
}
5156
}
52-
// Encode/Decode roundtrip
53-
const auto encoded{EncodeBase58Check(MakeUCharSpan(random_string))};
54-
std::vector<unsigned char> roundtrip_decoded;
55-
assert(DecodeBase58Check(encoded, roundtrip_decoded, random_string.size())
56-
&& std::ranges::equal(roundtrip_decoded, MakeUCharSpan(random_string)));
5757
}
5858

5959
FUZZ_TARGET(base32_encode_decode)

0 commit comments

Comments
 (0)