Branch data Line data Source code
# 1 : : // Copyright (c) 2011-2020 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/data/base58_encode_decode.json.h>
# 6 : :
# 7 : : #include <base58.h>
# 8 : : #include <test/util/setup_common.h>
# 9 : : #include <util/strencodings.h>
# 10 : : #include <util/vector.h>
# 11 : :
# 12 : : #include <univalue.h>
# 13 : :
# 14 : : #include <boost/test/unit_test.hpp>
# 15 : : #include <string>
# 16 : :
# 17 : : using namespace std::literals;
# 18 : :
# 19 : : UniValue read_json(const std::string& jsondata);
# 20 : :
# 21 : : BOOST_FIXTURE_TEST_SUITE(base58_tests, BasicTestingSetup)
# 22 : :
# 23 : : // Goal: test low-level base58 encoding functionality
# 24 : : BOOST_AUTO_TEST_CASE(base58_EncodeBase58)
# 25 : 2 : {
# 26 : 2 : UniValue tests = read_json(std::string(json_tests::base58_encode_decode, json_tests::base58_encode_decode + sizeof(json_tests::base58_encode_decode)));
# 27 [ + + ]: 30 : for (unsigned int idx = 0; idx < tests.size(); idx++) {
# 28 : 28 : UniValue test = tests[idx];
# 29 : 28 : std::string strTest = test.write();
# 30 [ - + ]: 28 : if (test.size() < 2) // Allow for extra stuff (useful for comments)
# 31 : 0 : {
# 32 : 0 : BOOST_ERROR("Bad test: " << strTest);
# 33 : 0 : continue;
# 34 : 0 : }
# 35 : 28 : std::vector<unsigned char> sourcedata = ParseHex(test[0].get_str());
# 36 : 28 : std::string base58string = test[1].get_str();
# 37 : 28 : BOOST_CHECK_MESSAGE(
# 38 : 28 : EncodeBase58(sourcedata) == base58string,
# 39 : 28 : strTest);
# 40 : 28 : }
# 41 : 2 : }
# 42 : :
# 43 : : // Goal: test low-level base58 decoding functionality
# 44 : : BOOST_AUTO_TEST_CASE(base58_DecodeBase58)
# 45 : 2 : {
# 46 : 2 : UniValue tests = read_json(std::string(json_tests::base58_encode_decode, json_tests::base58_encode_decode + sizeof(json_tests::base58_encode_decode)));
# 47 : 2 : std::vector<unsigned char> result;
# 48 : :
# 49 [ + + ]: 30 : for (unsigned int idx = 0; idx < tests.size(); idx++) {
# 50 : 28 : UniValue test = tests[idx];
# 51 : 28 : std::string strTest = test.write();
# 52 [ - + ]: 28 : if (test.size() < 2) // Allow for extra stuff (useful for comments)
# 53 : 0 : {
# 54 : 0 : BOOST_ERROR("Bad test: " << strTest);
# 55 : 0 : continue;
# 56 : 0 : }
# 57 : 28 : std::vector<unsigned char> expected = ParseHex(test[0].get_str());
# 58 : 28 : std::string base58string = test[1].get_str();
# 59 : 28 : BOOST_CHECK_MESSAGE(DecodeBase58(base58string, result, 256), strTest);
# 60 : 28 : BOOST_CHECK_MESSAGE(result.size() == expected.size() && std::equal(result.begin(), result.end(), expected.begin()), strTest);
# 61 : 28 : }
# 62 : :
# 63 : 2 : BOOST_CHECK(!DecodeBase58("invalid"s, result, 100));
# 64 : 2 : BOOST_CHECK(!DecodeBase58("invalid\0"s, result, 100));
# 65 : 2 : BOOST_CHECK(!DecodeBase58("\0invalid"s, result, 100));
# 66 : :
# 67 : 2 : BOOST_CHECK(DecodeBase58("good"s, result, 100));
# 68 : 2 : BOOST_CHECK(!DecodeBase58("bad0IOl"s, result, 100));
# 69 : 2 : BOOST_CHECK(!DecodeBase58("goodbad0IOl"s, result, 100));
# 70 : 2 : BOOST_CHECK(!DecodeBase58("good\0bad0IOl"s, result, 100));
# 71 : :
# 72 : : // check that DecodeBase58 skips whitespace, but still fails with unexpected non-whitespace at the end.
# 73 : 2 : BOOST_CHECK(!DecodeBase58(" \t\n\v\f\r skip \r\f\v\n\t a", result, 3));
# 74 : 2 : BOOST_CHECK( DecodeBase58(" \t\n\v\f\r skip \r\f\v\n\t ", result, 3));
# 75 : 2 : std::vector<unsigned char> expected = ParseHex("971a55");
# 76 : 2 : BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
# 77 : :
# 78 : 2 : BOOST_CHECK(DecodeBase58Check("3vQB7B6MrGQZaxCuFg4oh"s, result, 100));
# 79 : 2 : BOOST_CHECK(!DecodeBase58Check("3vQB7B6MrGQZaxCuFg4oi"s, result, 100));
# 80 : 2 : BOOST_CHECK(!DecodeBase58Check("3vQB7B6MrGQZaxCuFg4oh0IOl"s, result, 100));
# 81 : 2 : BOOST_CHECK(!DecodeBase58Check("3vQB7B6MrGQZaxCuFg4oh\0" "0IOl"s, result, 100));
# 82 : 2 : }
# 83 : :
# 84 : : BOOST_AUTO_TEST_CASE(base58_random_encode_decode)
# 85 : 2 : {
# 86 [ + + ]: 2002 : for (int n = 0; n < 1000; ++n) {
# 87 : 2000 : unsigned int len = 1 + InsecureRandBits(8);
# 88 [ + + ]: 2000 : unsigned int zeroes = InsecureRandBool() ? InsecureRandRange(len + 1) : 0;
# 89 : 2000 : auto data = Cat(std::vector<unsigned char>(zeroes, '\000'), g_insecure_rand_ctx.randbytes(len - zeroes));
# 90 : 2000 : auto encoded = EncodeBase58Check(data);
# 91 : 2000 : std::vector<unsigned char> decoded;
# 92 : 2000 : auto ok_too_small = DecodeBase58Check(encoded, decoded, InsecureRandRange(len));
# 93 : 2000 : BOOST_CHECK(!ok_too_small);
# 94 : 2000 : auto ok = DecodeBase58Check(encoded, decoded, len + InsecureRandRange(257 - len));
# 95 : 2000 : BOOST_CHECK(ok);
# 96 : 2000 : BOOST_CHECK(data == decoded);
# 97 : 2000 : }
# 98 : 2 : }
# 99 : :
# 100 : : BOOST_AUTO_TEST_SUITE_END()
|