mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-03-11 01:26:10 +01:00
Also remove a needless loop in DecodeBase58 to prune zeroes in the base256 output of the conversion. The number of zeroes is implied by keeping track explicitly of the length during the loop.
86 lines
3.5 KiB
C++
86 lines
3.5 KiB
C++
// Copyright (c) 2011-2019 The Bitcoin Core developers
|
|
// Distributed under the MIT software license, see the accompanying
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
#include <test/data/base58_encode_decode.json.h>
|
|
|
|
#include <base58.h>
|
|
#include <test/util/setup_common.h>
|
|
#include <util/strencodings.h>
|
|
#include <util/vector.h>
|
|
|
|
#include <univalue.h>
|
|
|
|
#include <boost/test/unit_test.hpp>
|
|
|
|
|
|
extern UniValue read_json(const std::string& jsondata);
|
|
|
|
BOOST_FIXTURE_TEST_SUITE(base58_tests, BasicTestingSetup)
|
|
|
|
// Goal: test low-level base58 encoding functionality
|
|
BOOST_AUTO_TEST_CASE(base58_EncodeBase58)
|
|
{
|
|
UniValue tests = read_json(std::string(json_tests::base58_encode_decode, json_tests::base58_encode_decode + sizeof(json_tests::base58_encode_decode)));
|
|
for (unsigned int idx = 0; idx < tests.size(); idx++) {
|
|
UniValue test = tests[idx];
|
|
std::string strTest = test.write();
|
|
if (test.size() < 2) // Allow for extra stuff (useful for comments)
|
|
{
|
|
BOOST_ERROR("Bad test: " << strTest);
|
|
continue;
|
|
}
|
|
std::vector<unsigned char> sourcedata = ParseHex(test[0].get_str());
|
|
std::string base58string = test[1].get_str();
|
|
BOOST_CHECK_MESSAGE(
|
|
EncodeBase58(sourcedata.data(), sourcedata.data() + sourcedata.size()) == base58string,
|
|
strTest);
|
|
}
|
|
}
|
|
|
|
// Goal: test low-level base58 decoding functionality
|
|
BOOST_AUTO_TEST_CASE(base58_DecodeBase58)
|
|
{
|
|
UniValue tests = read_json(std::string(json_tests::base58_encode_decode, json_tests::base58_encode_decode + sizeof(json_tests::base58_encode_decode)));
|
|
std::vector<unsigned char> result;
|
|
|
|
for (unsigned int idx = 0; idx < tests.size(); idx++) {
|
|
UniValue test = tests[idx];
|
|
std::string strTest = test.write();
|
|
if (test.size() < 2) // Allow for extra stuff (useful for comments)
|
|
{
|
|
BOOST_ERROR("Bad test: " << strTest);
|
|
continue;
|
|
}
|
|
std::vector<unsigned char> expected = ParseHex(test[0].get_str());
|
|
std::string base58string = test[1].get_str();
|
|
BOOST_CHECK_MESSAGE(DecodeBase58(base58string, result), strTest);
|
|
BOOST_CHECK_MESSAGE(result.size() == expected.size() && std::equal(result.begin(), result.end(), expected.begin()), strTest);
|
|
}
|
|
|
|
BOOST_CHECK(!DecodeBase58("invalid", result));
|
|
|
|
// check that DecodeBase58 skips whitespace, but still fails with unexpected non-whitespace at the end.
|
|
BOOST_CHECK(!DecodeBase58(" \t\n\v\f\r skip \r\f\v\n\t a", result));
|
|
BOOST_CHECK( DecodeBase58(" \t\n\v\f\r skip \r\f\v\n\t ", result));
|
|
std::vector<unsigned char> expected = ParseHex("971a55");
|
|
BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
|
|
}
|
|
|
|
BOOST_AUTO_TEST_CASE(base58_random_encode_decode)
|
|
{
|
|
for (int n = 0; n < 1000; ++n) {
|
|
unsigned int len = 1 + InsecureRandBits(8);
|
|
unsigned int zeroes = InsecureRandBool() ? InsecureRandRange(len + 1) : 0;
|
|
auto data = Cat(std::vector<unsigned char>(zeroes, '\000'), g_insecure_rand_ctx.randbytes(len - zeroes));
|
|
auto encoded = EncodeBase58Check(data);
|
|
std::vector<unsigned char> decoded;
|
|
auto ok_too_small = DecodeBase58Check(encoded, decoded, InsecureRandRange(len));
|
|
BOOST_CHECK(!ok_too_small);
|
|
auto ok = DecodeBase58Check(encoded, decoded, len + InsecureRandRange(257 - len));
|
|
BOOST_CHECK(ok);
|
|
BOOST_CHECK(data == decoded);
|
|
}
|
|
}
|
|
|
|
BOOST_AUTO_TEST_SUITE_END()
|