Line data Source code
1 : // Copyright (c) 2013 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 "base58.h"
8 : #include "key.h"
9 : #include "uint256.h"
10 : #include "util.h"
11 : #include "utilstrencodings.h"
12 : #include "test/test_bitcoin.h"
13 :
14 : #include <string>
15 : #include <vector>
16 :
17 212 : struct TestDerivation {
18 : std::string pub;
19 : std::string prv;
20 : unsigned int nChild;
21 : };
22 :
23 10 : struct TestVector {
24 : std::string strHexMaster;
25 : std::vector<TestDerivation> vDerive;
26 :
27 2 : TestVector(std::string strHexMasterIn) : strHexMaster(strHexMasterIn) {}
28 :
29 12 : TestVector& operator()(std::string pub, std::string prv, unsigned int nChild) {
30 24 : vDerive.push_back(TestDerivation());
31 24 : TestDerivation &der = vDerive.back();
32 12 : der.pub = pub;
33 12 : der.prv = prv;
34 12 : der.nChild = nChild;
35 12 : return *this;
36 : }
37 : };
38 :
39 2 : TestVector test1 =
40 : TestVector("000102030405060708090a0b0c0d0e0f")
41 : ("xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8",
42 : "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi",
43 9 : 0x80000000)
44 : ("xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw",
45 : "xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7",
46 6 : 1)
47 : ("xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ",
48 : "xprv9wTYmMFdV23N2TdNG573QoEsfRrWKQgWeibmLntzniatZvR9BmLnvSxqu53Kw1UmYPxLgboyZQaXwTCg8MSY3H2EU4pWcQDnRnrVA1xe8fs",
49 6 : 0x80000002)
50 : ("xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5",
51 : "xprv9z4pot5VBttmtdRTWfWQmoH1taj2axGVzFqSb8C9xaxKymcFzXBDptWmT7FwuEzG3ryjH4ktypQSAewRiNMjANTtpgP4mLTj34bhnZX7UiM",
52 6 : 2)
53 : ("xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV",
54 : "xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334",
55 6 : 1000000000)
56 : ("xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy",
57 : "xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76",
58 6 : 0);
59 :
60 2 : TestVector test2 =
61 : TestVector("fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542")
62 : ("xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB",
63 : "xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U",
64 9 : 0)
65 : ("xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH",
66 : "xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt",
67 6 : 0xFFFFFFFF)
68 : ("xpub6ASAVgeehLbnwdqV6UKMHVzgqAG8Gr6riv3Fxxpj8ksbH9ebxaEyBLZ85ySDhKiLDBrQSARLq1uNRts8RuJiHjaDMBU4Zn9h8LZNnBC5y4a",
69 : "xprv9wSp6B7kry3Vj9m1zSnLvN3xH8RdsPP1Mh7fAaR7aRLcQMKTR2vidYEeEg2mUCTAwCd6vnxVrcjfy2kRgVsFawNzmjuHc2YmYRmagcEPdU9",
70 6 : 1)
71 : ("xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon",
72 : "xprv9zFnWC6h2cLgpmSA46vutJzBcfJ8yaJGg8cX1e5StJh45BBciYTRXSd25UEPVuesF9yog62tGAQtHjXajPPdbRCHuWS6T8XA2ECKADdw4Ef",
73 6 : 0xFFFFFFFE)
74 : ("xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL",
75 : "xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc",
76 6 : 2)
77 : ("xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt",
78 : "xprvA2nrNbFZABcdryreWet9Ea4LvTJcGsqrMzxHx98MMrotbir7yrKCEXw7nadnHM8Dq38EGfSh6dqA9QWTyefMLEcBYJUuekgW4BYPJcr9E7j",
79 6 : 0);
80 :
81 2 : void RunTest(const TestVector &test) {
82 2 : std::vector<unsigned char> seed = ParseHex(test.strHexMaster);
83 2 : CExtKey key;
84 : CExtPubKey pubkey;
85 4 : key.SetMaster(&seed[0], seed.size());
86 2 : pubkey = key.Neuter();
87 70 : BOOST_FOREACH(const TestDerivation &derive, test.vDerive) {
88 : unsigned char data[74];
89 12 : key.Encode(data);
90 12 : pubkey.Encode(data);
91 :
92 : // Test private key
93 12 : CBitcoinExtKey b58key; b58key.SetKey(key);
94 108 : BOOST_CHECK(b58key.ToString() == derive.prv);
95 :
96 12 : CBitcoinExtKey b58keyDecodeCheck(derive.prv);
97 : CExtKey checkKey = b58keyDecodeCheck.GetKey();
98 12 : assert(checkKey == key); //ensure a base58 decoded key also matches
99 :
100 : // Test public key
101 12 : CBitcoinExtPubKey b58pubkey; b58pubkey.SetKey(pubkey);
102 108 : BOOST_CHECK(b58pubkey.ToString() == derive.pub);
103 :
104 12 : CBitcoinExtPubKey b58PubkeyDecodeCheck(derive.pub);
105 : CExtPubKey checkPubKey = b58PubkeyDecodeCheck.GetKey();
106 12 : assert(checkPubKey == pubkey); //ensure a base58 decoded pubkey also matches
107 :
108 : // Derive new keys
109 12 : CExtKey keyNew;
110 96 : BOOST_CHECK(key.Derive(keyNew, derive.nChild));
111 12 : CExtPubKey pubkeyNew = keyNew.Neuter();
112 12 : if (!(derive.nChild & 0x80000000)) {
113 : // Compare with public derivation
114 : CExtPubKey pubkeyNew2;
115 64 : BOOST_CHECK(pubkey.Derive(pubkeyNew2, derive.nChild));
116 64 : BOOST_CHECK(pubkeyNew == pubkeyNew2);
117 : }
118 12 : key = keyNew;
119 12 : pubkey = pubkeyNew;
120 : }
121 2 : }
122 :
123 1 : BOOST_FIXTURE_TEST_SUITE(bip32_tests, BasicTestingSetup)
124 :
125 6 : BOOST_AUTO_TEST_CASE(bip32_test1) {
126 1 : RunTest(test1);
127 0 : }
128 :
129 6 : BOOST_AUTO_TEST_CASE(bip32_test2) {
130 1 : RunTest(test2);
131 0 : }
132 :
133 3 : BOOST_AUTO_TEST_SUITE_END()
|