PIVX Core  5.6.99
P2P Digital Currency
bip32_tests.cpp
Go to the documentation of this file.
1 // Copyright (c) 2013 The Bitcoin Core developers
2 // Copyright (c) 2019-2020 The PIVX Core developers
3 // Distributed under the MIT/X11 software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 
6 #include <boost/test/unit_test.hpp>
7 
8 #include "key.h"
9 #include "key_io.h"
10 #include "test/test_pivx.h"
11 
12 #include <string>
13 #include <vector>
14 
16  std::string pub;
17  std::string prv;
18  unsigned int nChild;
19 };
20 
21 struct TestVector {
22  std::string strHexMaster;
23  std::vector<TestDerivation> vDerive;
24 
25  explicit TestVector(std::string strHexMasterIn) : strHexMaster(strHexMasterIn) {}
26 
27  TestVector& operator()(std::string pub, std::string prv, unsigned int nChild) {
28  vDerive.emplace_back();
29  TestDerivation &der = vDerive.back();
30  der.pub = pub;
31  der.prv = prv;
32  der.nChild = nChild;
33  return *this;
34  }
35 };
36 
38  TestVector("000102030405060708090a0b0c0d0e0f")
39  ("ToEA6epvY6iUs9r4R5mvZQyK8EtsCsK1xZ6hEXrGFDKjQpAT8V28vb7LKuKhFM7zoxQ7CzWX7dE7mJNiqBw8t8PU91Bu8oAqabvg9xGoBzHZLxp",
40  "TDt9EWvD5T5T44hAac1bLFvmH5fhMx2T6zgUKCmsDWZskySV2A1VDhHjPie5CBJ8nZs7TKXmo5sy2eHhFCSwa4gxqpKBK9NEZaua11yXwhAQ2wp",
41  0x80000000)
42  ("ToEA6h6LXp1wxQy3ZgudmAqx1GzyXgsNLdahv9HADJhrP1MjVmKKLpeRT3g72cghZGJeDCo5yrmYVwSooauGqA7rCtedLRy6VuptftQMVd9h3VM",
43  "TDt9EZBd5ANv9Kp9jD9JY1oQA7mogmaoV5AUzpCmBbwzjAdmPSJfdvppWrzUySeUCHF5ANRUAPCqR18ZxxUfDey9dtPhP23NoYcTi2cPNoMUB6w",
44  1)
45  ("ToEA6jGTjbZqM7r7Q8x5VRjpc1tdb4rULfJzrTwzoaUfKe9wjJpT4d4jQcaLSh9GyD1zAvR8mHDecXwHPte6JVHjtYUZddowyYqAJcw8ncLBfDe",
46  "TDt9EbMkGwvoY2hDZfBkGGhGkrfTk9ZuV6tmw8sbmsiofoRycyooMjF8URtiPVqXoD27cTB9yCoGVi5z6tztLzm8R3t8to16sJPKNpvkun8rYcG",
47  0x80000002)
48  ("ToEA6msjn8Ph3zhXGJkAk29By1vmpDizcCtzC1Bg3umpVWXP9A1ZsNuAK48FziL7R5TJXSWsNfCFzUWFrDnP1aqGwzdQDXn64Vtr2JrGstysVAH",
49  "TDt9Edy2KUkfEuYdRpyqWs6e7rhbyJSRkeUmGg7H2D1xqfoR2pzvAV5ZNsSdwY49mSXc7vCYZfkBv7utL6jdw1gKY9KoFQZf2EdFz6fyYM6oD1B",
50  2)
51  ("ToEA6p78cZWeEUNWLnDtSHMGrX65u31jEoDBdV4yJsJHox5zWFdvw9bXWdbBg3KVpsc2zke3WfgD3DQNQe8P6tGUfb6f8KLGtgng2zm82T6KJan",
52  "TDt9EgCR9uscRPDcWJTZD8Jj1Mrv47jAPEnxi9zaHAYSA7N2PvdHEFmvaSuZcrTcE6w3BiLFBaykpwN3oHe68SDfjXuqeeekaKSy95993rNMzUu",
53  1000000000)
54  ("ToEA6qpu6F7tMbkhs81LYpv1AE65hGb34J2DRjTXZ9gS22UVDP3KTZrBmjkFJsESg8gkUSvb21c1aR6y14XQCjmKWrFmzrkMhANJqxP3GenZSJd",
55  "TDt9EhvBdbUrYWbp2eF1KfsTK4rurMJUCjbzWQP8XSvaNBkX742fkg2aqZ4dFiEp9247o7jVxwxhfyuAoTeTfWEPrVZNz9QyhECgRQhVo1R47Ej",
56  0);
57 
59  TestVector("fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542")
60  ("ToEA6epvY6iUs9r4QhHFfa3baScdT4TSeBMWv7dzYA4ZPCHKRU3L6jtGkoVHbTCyXCm57YkK2HtHANsyYyfN1KJdGvBqzjNJR6RLUKwuTyjmv5e",
61  "TDt9EWvD5T5T44hAaDWvSR13jHPTc9AsncwHznZbWTJhjMZMK92gPr4fpcofYF5By5RChNHCYNLRJkKtLjB3cV5fTBdwmZSUhvpJaGbmJc39xAS",
62  0)
63  ("ToEA6i6fopQSMAg8vxsYoMRUeF29p2ChM9qoUHPMhy61Tc9H7SVJg1ELue4YAvAsKHmWKsEUtWt2ZTiwi963tU13cWr8Gn6yKSZibp4ZuCFDqQD",
64  "TDt9EaBxMAmQY5XF6V7DaCNvo5nyy6v8VbRaYxJxgGL9omRK17Uey7QjyTNv7kLzc9G372X2SNk9juk1hEosAmaiPQoLmjrY6Qz3hgWKfy7BcRy",
65  0xFFFFFFFF)
66  ("ToEA6jFj4RRxj4rF6q5jDoR87ahiCmRbte1VZSTtdMzn7LufZjimHtef7hr8nJQz52Nc7PA2YMjdrg9YNoxPfNVALfJkorj2gApjUCLAjzRSrz1",
67  "TDt9EbM1bmnvuyhMGMKPzeNaGRUYMr9335bGe7PVbfEvTWBhTQi7azq4BXAWj6pyLPzX1FqvDPwnnvF88UYdu9BqxiEuCU5srviJVTqrSM8WfhM",
68  1)
69  ("ToEA6n4hUSQtti9SCSksHTZh5XdwYJJ6zpvkssxkURf7REG7EZavbQBN1cEWd6c7ru4thZcaNzpsVoTNTcDQaGv7bzmfQ8vstiFwPy17zPEAhLs",
70  "TDt9Ee9z1nms5czYMxzY4JX9ENQmhP1Y9GWXxYtMSiuFmPY98EaGtWMm5RYtZu2bN7CDKDCcxh2BCTvLTBKnx2iDyC4CLEcgi2ggyGGauzni6xJ",
71  0xFFFFFFFE)
72  ("ToEA6oEjPQMFW779VPzU1wPET3L8T2mU3oZFuage19MXFzXMguurh57NY8bcFkjd4GbLf1GDBVtaYQnE7FNoGA2dKMU7g3FNT1MMGC5hXLLMMwA",
73  "TDt9EfL1vkiDh1xFevE8nnLgbt6xc7UuCF92zFcEySbfc9oPaauCzBHmbwuzCbkyzXaVrnVKGWoAaqVvGJRATycif2jNAB9zrEiKJrH6yj3CXGC",
74  2)
75  ("ToEA6pbmLqZm2HRPEfBMk1WvRni6r6JaJ8ULZkJXQvi1tnNwm7FRri38ihYcL9ouBqx3B4USTRPzS7oDbgSJ6FiXdcKhKD5TPNe5wVGtC3N27Jk",
76  "TDt9Egh3tBvjDCGVQBR2WrUNadUw1B21Sa47eRE8PDxAEweyenEn9pDXnWrzH1Rz9YfZu6M3ZGRz2wLcJrJgCHywi1U5y2fVuer31Dcf4Mqgck3",
77  0);
78 
80  TestVector("4b381541583be4423346c643850da4b320e46a87ae3d2a4e6da11eba819cd4acba45d239319ac14f863b8d5ab5a0d0c64d2e8a1e7d1457df2e5a3c51c73235be")
81  ("ToEA6epvY6iUs9r4PkjRBxYPnRsfKhnYQ3WndTQYwT67etN7PiGbkt8Ei4ip5SjxLoLiHdWArHmHZ3hpzHJGr2M4hFqz7yGX9esBG3TbzVdjxDo",
82  "TDt9EWvD5T5T44hAZGy5xoVqwGeVUnVyYV6Zi8L9ukLG13e9HPFx3zJdmt3C2EoMv6eXn4wx7J2XDB4bhNnMqvE6Ef9CHr17uNAGrzG7xYqJd6B",
83  0x80000000)
84  ("ToEA6hC8H4YcYXDQbHppR6stqgdL24PvYtvh2weVkgmxbCHUejQ4LNu6nXWXPAaU59wTV111dFX2PzuKckEcnGHFGW7vo5DQhWMykDpWeoJwYt1",
85  "TDt9EZHQpQuajS4Wkp4VBwqLzXQAB97MhLWU7ca6iz26wMZWYQPQdV5VrLpuL19iG3yTEDbN8EpPruh4LvRWR8oqzRLpiyvAeXS5z1Dmuvfnaee",
86  0);
87 
88 static void RunTest(const TestVector &test) {
89  std::vector<unsigned char> seed = ParseHex(test.strHexMaster);
90  CExtKey key;
91  CExtPubKey pubkey;
92  key.SetSeed(seed.data(), seed.size());
93  pubkey = key.Neuter();
94  for (const TestDerivation &derive : test.vDerive) {
95  unsigned char data[74];
96  key.Encode(data);
97  pubkey.Encode(data);
98 
99  // Test private key
100  BOOST_CHECK(KeyIO::EncodeExtKey(key) == derive.prv);
101  BOOST_CHECK(KeyIO::DecodeExtKey(derive.prv) == key); //ensure a base58 decoded key also matches
102 
103  // Test public key
104  BOOST_CHECK(KeyIO::EncodeExtPubKey(pubkey) == derive.pub);
105  BOOST_CHECK(KeyIO::DecodeExtPubKey(derive.pub) == pubkey); //ensure a base58 decoded pubkey also matches
106 
107  // Derive new keys
108  CExtKey keyNew;
109  BOOST_CHECK(key.Derive(keyNew, derive.nChild));
110  CExtPubKey pubkeyNew = keyNew.Neuter();
111  if (!(derive.nChild & 0x80000000)) {
112  // Compare with public derivation
113  CExtPubKey pubkeyNew2;
114  BOOST_CHECK(pubkey.Derive(pubkeyNew2, derive.nChild));
115  BOOST_CHECK(pubkeyNew == pubkeyNew2);
116  }
117  key = keyNew;
118  pubkey = pubkeyNew;
119  }
120 }
121 
123 
124 BOOST_AUTO_TEST_CASE(bip32_test1) {
125  RunTest(test1);
126 }
127 
128 BOOST_AUTO_TEST_CASE(bip32_test2) {
129  RunTest(test2);
130 }
131 
132 BOOST_AUTO_TEST_CASE(bip32_test3) {
133  RunTest(test3);
134 }
135 
TestVector test2
Definition: bip32_tests.cpp:58
BOOST_AUTO_TEST_CASE(bip32_test1)
TestVector test1
Definition: bip32_tests.cpp:37
TestVector test3
Definition: bip32_tests.cpp:79
BOOST_AUTO_TEST_SUITE_END()
std::string EncodeExtPubKey(const CExtPubKey &key)
Definition: key_io.cpp:193
std::string EncodeExtKey(const CExtKey &key)
Definition: key_io.cpp:170
CExtPubKey DecodeExtPubKey(const std::string &str)
Definition: key_io.cpp:180
CExtKey DecodeExtKey(const std::string &str)
Definition: key_io.cpp:157
#define BOOST_FIXTURE_TEST_SUITE(a, b)
Definition: object.cpp:14
#define BOOST_CHECK(expr)
Definition: object.cpp:17
Definition: key.h:148
CExtPubKey Neuter() const
Definition: key.cpp:302
bool Derive(CExtKey &out, unsigned int nChild) const
Definition: key.cpp:281
void SetSeed(const unsigned char *seed, unsigned int nSeedLen)
Definition: key.cpp:290
void Encode(unsigned char code[BIP32_EXTKEY_SIZE]) const
Definition: key.cpp:313
void Encode(unsigned char code[BIP32_EXTKEY_SIZE]) const
Definition: pubkey.cpp:258
bool Derive(CExtPubKey &out, unsigned int nChild) const
Definition: pubkey.cpp:278
std::string prv
Definition: bip32_tests.cpp:17
unsigned int nChild
Definition: bip32_tests.cpp:18
std::string pub
Definition: bip32_tests.cpp:16
TestVector & operator()(std::string pub, std::string prv, unsigned int nChild)
Definition: bip32_tests.cpp:27
TestVector(std::string strHexMasterIn)
Definition: bip32_tests.cpp:25
std::string strHexMaster
Definition: bip32_tests.cpp:22
std::vector< TestDerivation > vDerive
Definition: bip32_tests.cpp:23
void TestVector(const Hasher &h, const In &in, const Out &out)
std::vector< unsigned char > ParseHex(const char *psz)