Bitcoin Core 28.99.0
P2P Digital Currency
base_encode_decode.cpp
Go to the documentation of this file.
1// Copyright (c) 2019-2022 The Bitcoin Core developers
2// Distributed under the MIT software license, see the accompanying
3// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5#include <test/fuzz/fuzz.h>
6
7#include <base58.h>
8#include <psbt.h>
10#include <util/strencodings.h>
11#include <util/string.h>
12
13#include <cassert>
14#include <string>
15#include <vector>
16#include <ranges>
17
19
20FUZZ_TARGET(base58_encode_decode)
21{
22 FuzzedDataProvider provider(buffer.data(), buffer.size());
23 const std::string random_string{provider.ConsumeRandomLengthString(1000)};
24 const int max_ret_len{provider.ConsumeIntegralInRange<int>(-1, 1000)};
25
26 // Decode/Encode roundtrip
27 std::vector<unsigned char> decoded;
28 if (DecodeBase58(random_string, decoded, max_ret_len)) {
29 const auto encoded_string{EncodeBase58(decoded)};
30 assert(encoded_string == TrimStringView(random_string));
31 assert(encoded_string.empty() || !DecodeBase58(encoded_string, decoded, provider.ConsumeIntegralInRange<int>(0, decoded.size() - 1)));
32 }
33 // Encode/Decode roundtrip
34 const auto encoded{EncodeBase58(buffer)};
35 std::vector<unsigned char> roundtrip_decoded;
36 assert(DecodeBase58(encoded, roundtrip_decoded, buffer.size())
37 && std::ranges::equal(roundtrip_decoded, buffer));
38}
39
40FUZZ_TARGET(base58check_encode_decode)
41{
42 FuzzedDataProvider provider(buffer.data(), buffer.size());
43 const std::string random_string{provider.ConsumeRandomLengthString(1000)};
44 const int max_ret_len{provider.ConsumeIntegralInRange<int>(-1, 1000)};
45
46 // Decode/Encode roundtrip
47 std::vector<unsigned char> decoded;
48 if (DecodeBase58Check(random_string, decoded, max_ret_len)) {
49 const auto encoded_string{EncodeBase58Check(decoded)};
50 assert(encoded_string == TrimStringView(random_string));
51 assert(encoded_string.empty() || !DecodeBase58Check(encoded_string, decoded, provider.ConsumeIntegralInRange<int>(0, decoded.size() - 1)));
52 }
53 // Encode/Decode roundtrip
54 const auto encoded{EncodeBase58Check(buffer)};
55 std::vector<unsigned char> roundtrip_decoded;
56 assert(DecodeBase58Check(encoded, roundtrip_decoded, buffer.size())
57 && std::ranges::equal(roundtrip_decoded, buffer));
58}
59
60FUZZ_TARGET(base32_encode_decode)
61{
62 const std::string random_string{buffer.begin(), buffer.end()};
63
64 // Decode/Encode roundtrip
65 if (auto result{DecodeBase32(random_string)}) {
66 const auto encoded_string{EncodeBase32(*result)};
67 assert(encoded_string == ToLower(TrimStringView(random_string)));
68 }
69 // Encode/Decode roundtrip
70 const auto encoded{EncodeBase32(buffer)};
71 const auto decoded{DecodeBase32(encoded)};
72 assert(decoded && std::ranges::equal(*decoded, buffer));
73}
74
75FUZZ_TARGET(base64_encode_decode)
76{
77 const std::string random_string{buffer.begin(), buffer.end()};
78
79 // Decode/Encode roundtrip
80 if (auto result{DecodeBase64(random_string)}) {
81 const auto encoded_string{EncodeBase64(*result)};
82 assert(encoded_string == TrimStringView(random_string));
83 }
84 // Encode/Decode roundtrip
85 const auto encoded{EncodeBase64(buffer)};
86 const auto decoded{DecodeBase64(encoded)};
87 assert(decoded && std::ranges::equal(*decoded, buffer));
88}
89
90FUZZ_TARGET(psbt_base64_decode)
91{
92 const std::string random_string{buffer.begin(), buffer.end()};
93
95 std::string error;
96 assert(DecodeBase64PSBT(psbt, random_string, error) == error.empty());
97}
std::string EncodeBase58(Span< const unsigned char > input)
Why base-58 instead of standard base-64 encoding?
Definition: base58.cpp:89
std::string EncodeBase58Check(Span< const unsigned char > input)
Encode a byte span into a base58-encoded string, including checksum.
Definition: base58.cpp:137
static bool DecodeBase58Check(const char *psz, std::vector< unsigned char > &vchRet, int max_ret_len)
Definition: base58.cpp:146
static bool DecodeBase58(const char *psz, std::vector< unsigned char > &vch, int max_ret_len)
Definition: base58.cpp:40
FUZZ_TARGET(base58_encode_decode)
std::string ConsumeRandomLengthString(size_t max_length)
T ConsumeIntegralInRange(T min, T max)
std::string_view TrimStringView(std::string_view str, std::string_view pattern=" \f\n\r\t\v")
Definition: string.h:146
bool DecodeBase64PSBT(PartiallySignedTransaction &psbt, const std::string &base64_tx, std::string &error)
Decode a base64ed PSBT into a PartiallySignedTransaction.
Definition: psbt.cpp:536
A version of CTransaction with the PSBT format.
Definition: psbt.h:951
std::string EncodeBase64(Span< const unsigned char > input)
std::optional< std::vector< unsigned char > > DecodeBase32(std::string_view str)
std::string EncodeBase32(Span< const unsigned char > input, bool pad)
Base32 encode.
std::optional< std::vector< unsigned char > > DecodeBase64(std::string_view str)
std::string ToLower(std::string_view str)
Returns the lowercase equivalent of the given string.
assert(!tx.IsCoinBase())