Branch data Line data Source code
# 1 : : // Copyright (c) 2013-2021 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 <boost/test/unit_test.hpp>
# 6 : :
# 7 : : #include <clientversion.h>
# 8 : : #include <key.h>
# 9 : : #include <key_io.h>
# 10 : : #include <streams.h>
# 11 : : #include <test/util/setup_common.h>
# 12 : : #include <util/strencodings.h>
# 13 : :
# 14 : : #include <string>
# 15 : : #include <vector>
# 16 : :
# 17 : : struct TestDerivation {
# 18 : : std::string pub;
# 19 : : std::string prv;
# 20 : : unsigned int nChild;
# 21 : : };
# 22 : :
# 23 : : struct TestVector {
# 24 : : std::string strHexMaster;
# 25 : : std::vector<TestDerivation> vDerive;
# 26 : :
# 27 : 8 : explicit TestVector(std::string strHexMasterIn) : strHexMaster(strHexMasterIn) {}
# 28 : :
# 29 : 34 : TestVector& operator()(std::string pub, std::string prv, unsigned int nChild) {
# 30 : 34 : vDerive.push_back(TestDerivation());
# 31 : 34 : TestDerivation &der = vDerive.back();
# 32 : 34 : der.pub = pub;
# 33 : 34 : der.prv = prv;
# 34 : 34 : der.nChild = nChild;
# 35 : 34 : return *this;
# 36 : 34 : }
# 37 : : };
# 38 : :
# 39 : : TestVector test1 =
# 40 : : TestVector("000102030405060708090a0b0c0d0e0f")
# 41 : : ("xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8",
# 42 : : "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi",
# 43 : : 0x80000000)
# 44 : : ("xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw",
# 45 : : "xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7",
# 46 : : 1)
# 47 : : ("xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ",
# 48 : : "xprv9wTYmMFdV23N2TdNG573QoEsfRrWKQgWeibmLntzniatZvR9BmLnvSxqu53Kw1UmYPxLgboyZQaXwTCg8MSY3H2EU4pWcQDnRnrVA1xe8fs",
# 49 : : 0x80000002)
# 50 : : ("xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5",
# 51 : : "xprv9z4pot5VBttmtdRTWfWQmoH1taj2axGVzFqSb8C9xaxKymcFzXBDptWmT7FwuEzG3ryjH4ktypQSAewRiNMjANTtpgP4mLTj34bhnZX7UiM",
# 52 : : 2)
# 53 : : ("xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV",
# 54 : : "xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334",
# 55 : : 1000000000)
# 56 : : ("xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy",
# 57 : : "xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76",
# 58 : : 0);
# 59 : :
# 60 : : TestVector test2 =
# 61 : : TestVector("fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542")
# 62 : : ("xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB",
# 63 : : "xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U",
# 64 : : 0)
# 65 : : ("xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH",
# 66 : : "xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt",
# 67 : : 0xFFFFFFFF)
# 68 : : ("xpub6ASAVgeehLbnwdqV6UKMHVzgqAG8Gr6riv3Fxxpj8ksbH9ebxaEyBLZ85ySDhKiLDBrQSARLq1uNRts8RuJiHjaDMBU4Zn9h8LZNnBC5y4a",
# 69 : : "xprv9wSp6B7kry3Vj9m1zSnLvN3xH8RdsPP1Mh7fAaR7aRLcQMKTR2vidYEeEg2mUCTAwCd6vnxVrcjfy2kRgVsFawNzmjuHc2YmYRmagcEPdU9",
# 70 : : 1)
# 71 : : ("xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon",
# 72 : : "xprv9zFnWC6h2cLgpmSA46vutJzBcfJ8yaJGg8cX1e5StJh45BBciYTRXSd25UEPVuesF9yog62tGAQtHjXajPPdbRCHuWS6T8XA2ECKADdw4Ef",
# 73 : : 0xFFFFFFFE)
# 74 : : ("xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL",
# 75 : : "xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc",
# 76 : : 2)
# 77 : : ("xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt",
# 78 : : "xprvA2nrNbFZABcdryreWet9Ea4LvTJcGsqrMzxHx98MMrotbir7yrKCEXw7nadnHM8Dq38EGfSh6dqA9QWTyefMLEcBYJUuekgW4BYPJcr9E7j",
# 79 : : 0);
# 80 : :
# 81 : : TestVector test3 =
# 82 : : TestVector("4b381541583be4423346c643850da4b320e46a87ae3d2a4e6da11eba819cd4acba45d239319ac14f863b8d5ab5a0d0c64d2e8a1e7d1457df2e5a3c51c73235be")
# 83 : : ("xpub661MyMwAqRbcEZVB4dScxMAdx6d4nFc9nvyvH3v4gJL378CSRZiYmhRoP7mBy6gSPSCYk6SzXPTf3ND1cZAceL7SfJ1Z3GC8vBgp2epUt13",
# 84 : : "xprv9s21ZrQH143K25QhxbucbDDuQ4naNntJRi4KUfWT7xo4EKsHt2QJDu7KXp1A3u7Bi1j8ph3EGsZ9Xvz9dGuVrtHHs7pXeTzjuxBrCmmhgC6",
# 85 : : 0x80000000)
# 86 : : ("xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y",
# 87 : : "xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L",
# 88 : : 0);
# 89 : :
# 90 : : TestVector test4 =
# 91 : : TestVector("3ddd5602285899a946114506157c7997e5444528f3003f6134712147db19b678")
# 92 : : ("xpub661MyMwAqRbcGczjuMoRm6dXaLDEhW1u34gKenbeYqAix21mdUKJyuyu5F1rzYGVxyL6tmgBUAEPrEz92mBXjByMRiJdba9wpnN37RLLAXa",
# 93 : : "xprv9s21ZrQH143K48vGoLGRPxgo2JNkJ3J3fqkirQC2zVdk5Dgd5w14S7fRDyHH4dWNHUgkvsvNDCkvAwcSHNAQwhwgNMgZhLtQC63zxwhQmRv",
# 94 : : 0x80000000)
# 95 : : ("xpub69AUMk3qDBi3uW1sXgjCmVjJ2G6WQoYSnNHyzkmdCHEhSZ4tBok37xfFEqHd2AddP56Tqp4o56AePAgCjYdvpW2PU2jbUPFKsav5ut6Ch1m",
# 96 : : "xprv9vB7xEWwNp9kh1wQRfCCQMnZUEG21LpbR9NPCNN1dwhiZkjjeGRnaALmPXCX7SgjFTiCTT6bXes17boXtjq3xLpcDjzEuGLQBM5ohqkao9G",
# 97 : : 0x80000001)
# 98 : : ("xpub6BJA1jSqiukeaesWfxe6sNK9CCGaujFFSJLomWHprUL9DePQ4JDkM5d88n49sMGJxrhpjazuXYWdMf17C9T5XnxkopaeS7jGk1GyyVziaMt",
# 99 : : "xprv9xJocDuwtYCMNAo3Zw76WENQeAS6WGXQ55RCy7tDJ8oALr4FWkuVoHJeHVAcAqiZLE7Je3vZJHxspZdFHfnBEjHqU5hG1Jaj32dVoS6XLT1",
# 100 : : 0);
# 101 : :
# 102 : 8 : static void RunTest(const TestVector &test) {
# 103 : 8 : std::vector<unsigned char> seed = ParseHex(test.strHexMaster);
# 104 : 8 : CExtKey key;
# 105 : 8 : CExtPubKey pubkey;
# 106 : 8 : key.SetSeed(seed.data(), seed.size());
# 107 : 8 : pubkey = key.Neuter();
# 108 [ + + ]: 34 : for (const TestDerivation &derive : test.vDerive) {
# 109 : 34 : unsigned char data[74];
# 110 : 34 : key.Encode(data);
# 111 : 34 : pubkey.Encode(data);
# 112 : :
# 113 : : // Test private key
# 114 : 34 : BOOST_CHECK(EncodeExtKey(key) == derive.prv);
# 115 : 34 : BOOST_CHECK(DecodeExtKey(derive.prv) == key); //ensure a base58 decoded key also matches
# 116 : :
# 117 : : // Test public key
# 118 : 34 : BOOST_CHECK(EncodeExtPubKey(pubkey) == derive.pub);
# 119 : 34 : BOOST_CHECK(DecodeExtPubKey(derive.pub) == pubkey); //ensure a base58 decoded pubkey also matches
# 120 : :
# 121 : : // Derive new keys
# 122 : 34 : CExtKey keyNew;
# 123 : 34 : BOOST_CHECK(key.Derive(keyNew, derive.nChild));
# 124 : 34 : CExtPubKey pubkeyNew = keyNew.Neuter();
# 125 [ + + ]: 34 : if (!(derive.nChild & 0x80000000)) {
# 126 : : // Compare with public derivation
# 127 : 20 : CExtPubKey pubkeyNew2;
# 128 : 20 : BOOST_CHECK(pubkey.Derive(pubkeyNew2, derive.nChild));
# 129 : 20 : BOOST_CHECK(pubkeyNew == pubkeyNew2);
# 130 : 20 : }
# 131 : 34 : key = keyNew;
# 132 : 34 : pubkey = pubkeyNew;
# 133 : 34 : }
# 134 : 8 : }
# 135 : :
# 136 : : BOOST_FIXTURE_TEST_SUITE(bip32_tests, BasicTestingSetup)
# 137 : :
# 138 : 2 : BOOST_AUTO_TEST_CASE(bip32_test1) {
# 139 : 2 : RunTest(test1);
# 140 : 2 : }
# 141 : :
# 142 : 2 : BOOST_AUTO_TEST_CASE(bip32_test2) {
# 143 : 2 : RunTest(test2);
# 144 : 2 : }
# 145 : :
# 146 : 2 : BOOST_AUTO_TEST_CASE(bip32_test3) {
# 147 : 2 : RunTest(test3);
# 148 : 2 : }
# 149 : :
# 150 : 2 : BOOST_AUTO_TEST_CASE(bip32_test4) {
# 151 : 2 : RunTest(test4);
# 152 : 2 : }
# 153 : :
# 154 : : BOOST_AUTO_TEST_SUITE_END()
|