]>
Commit | Line | Data |
---|---|---|
3fc68461 | 1 | // Copyright (c) 2013 The Bitcoin Core developers |
78253fcb | 2 | // Distributed under the MIT software license, see the accompanying |
3fc68461 WL |
3 | // file COPYING or http://www.opensource.org/licenses/mit-license.php. |
4 | ||
a59db19e PW |
5 | #include <boost/test/unit_test.hpp> |
6 | ||
a59db19e | 7 | #include "base58.h" |
51ed9ec9 | 8 | #include "key.h" |
a59db19e PW |
9 | #include "uint256.h" |
10 | #include "util.h" | |
92fd887f | 11 | #include "test/test_bitcoin.h" |
a59db19e | 12 | |
51ed9ec9 BD |
13 | #include <string> |
14 | #include <vector> | |
15 | ||
a59db19e PW |
16 | struct TestDerivation { |
17 | std::string pub; | |
18 | std::string prv; | |
19 | unsigned int nChild; | |
20 | }; | |
21 | ||
22 | struct TestVector { | |
23 | std::string strHexMaster; | |
24 | std::vector<TestDerivation> vDerive; | |
25 | ||
26 | TestVector(std::string strHexMasterIn) : strHexMaster(strHexMasterIn) {} | |
27 | ||
28 | TestVector& operator()(std::string pub, std::string prv, unsigned int nChild) { | |
29 | vDerive.push_back(TestDerivation()); | |
30 | TestDerivation &der = vDerive.back(); | |
31 | der.pub = pub; | |
32 | der.prv = prv; | |
33 | der.nChild = nChild; | |
34 | return *this; | |
35 | } | |
36 | }; | |
37 | ||
38 | TestVector test1 = | |
39 | TestVector("000102030405060708090a0b0c0d0e0f") | |
40 | ("xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8", | |
41 | "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi", | |
42 | 0x80000000) | |
43 | ("xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw", | |
44 | "xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7", | |
45 | 1) | |
46 | ("xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ", | |
47 | "xprv9wTYmMFdV23N2TdNG573QoEsfRrWKQgWeibmLntzniatZvR9BmLnvSxqu53Kw1UmYPxLgboyZQaXwTCg8MSY3H2EU4pWcQDnRnrVA1xe8fs", | |
48 | 0x80000002) | |
49 | ("xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5", | |
50 | "xprv9z4pot5VBttmtdRTWfWQmoH1taj2axGVzFqSb8C9xaxKymcFzXBDptWmT7FwuEzG3ryjH4ktypQSAewRiNMjANTtpgP4mLTj34bhnZX7UiM", | |
51 | 2) | |
52 | ("xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV", | |
53 | "xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334", | |
54 | 1000000000) | |
55 | ("xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy", | |
56 | "xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76", | |
57 | 0); | |
58 | ||
59 | TestVector test2 = | |
60 | TestVector("fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542") | |
61 | ("xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB", | |
62 | "xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U", | |
63 | 0) | |
64 | ("xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH", | |
65 | "xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt", | |
66 | 0xFFFFFFFF) | |
67 | ("xpub6ASAVgeehLbnwdqV6UKMHVzgqAG8Gr6riv3Fxxpj8ksbH9ebxaEyBLZ85ySDhKiLDBrQSARLq1uNRts8RuJiHjaDMBU4Zn9h8LZNnBC5y4a", | |
68 | "xprv9wSp6B7kry3Vj9m1zSnLvN3xH8RdsPP1Mh7fAaR7aRLcQMKTR2vidYEeEg2mUCTAwCd6vnxVrcjfy2kRgVsFawNzmjuHc2YmYRmagcEPdU9", | |
69 | 1) | |
70 | ("xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon", | |
71 | "xprv9zFnWC6h2cLgpmSA46vutJzBcfJ8yaJGg8cX1e5StJh45BBciYTRXSd25UEPVuesF9yog62tGAQtHjXajPPdbRCHuWS6T8XA2ECKADdw4Ef", | |
72 | 0xFFFFFFFE) | |
73 | ("xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL", | |
74 | "xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc", | |
75 | 2) | |
76 | ("xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt", | |
77 | "xprvA2nrNbFZABcdryreWet9Ea4LvTJcGsqrMzxHx98MMrotbir7yrKCEXw7nadnHM8Dq38EGfSh6dqA9QWTyefMLEcBYJUuekgW4BYPJcr9E7j", | |
78 | 0); | |
79 | ||
80 | void RunTest(const TestVector &test) { | |
81 | std::vector<unsigned char> seed = ParseHex(test.strHexMaster); | |
82 | CExtKey key; | |
83 | CExtPubKey pubkey; | |
84 | key.SetMaster(&seed[0], seed.size()); | |
85 | pubkey = key.Neuter(); | |
86 | BOOST_FOREACH(const TestDerivation &derive, test.vDerive) { | |
87 | unsigned char data[74]; | |
88 | key.Encode(data); | |
89 | pubkey.Encode(data); | |
90 | // Test private key | |
91 | CBitcoinExtKey b58key; b58key.SetKey(key); | |
92 | BOOST_CHECK(b58key.ToString() == derive.prv); | |
93 | // Test public key | |
94 | CBitcoinExtPubKey b58pubkey; b58pubkey.SetKey(pubkey); | |
95 | BOOST_CHECK(b58pubkey.ToString() == derive.pub); | |
96 | // Derive new keys | |
97 | CExtKey keyNew; | |
98 | BOOST_CHECK(key.Derive(keyNew, derive.nChild)); | |
99 | CExtPubKey pubkeyNew = keyNew.Neuter(); | |
100 | if (!(derive.nChild & 0x80000000)) { | |
101 | // Compare with public derivation | |
102 | CExtPubKey pubkeyNew2; | |
103 | BOOST_CHECK(pubkey.Derive(pubkeyNew2, derive.nChild)); | |
104 | BOOST_CHECK(pubkeyNew == pubkeyNew2); | |
105 | } | |
106 | key = keyNew; | |
107 | pubkey = pubkeyNew; | |
108 | } | |
109 | } | |
110 | ||
92fd887f | 111 | BOOST_FIXTURE_TEST_SUITE(bip32_tests, BasicTestingSetup) |
a59db19e PW |
112 | |
113 | BOOST_AUTO_TEST_CASE(bip32_test1) { | |
114 | RunTest(test1); | |
115 | } | |
116 | ||
117 | BOOST_AUTO_TEST_CASE(bip32_test2) { | |
118 | RunTest(test2); | |
119 | } | |
120 | ||
121 | BOOST_AUTO_TEST_SUITE_END() |