Line data Source code
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 : 15 5192 : struct TestDerivation { 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 1232 : TestVector& operator()(std::string pub, std::string prv, unsigned int nChild) { 28 1232 : vDerive.emplace_back(); 29 1232 : TestDerivation &der = vDerive.back(); 30 1232 : der.pub = pub; 31 1232 : der.prv = prv; 32 1232 : der.nChild = nChild; 33 1232 : return *this; 34 : } 35 : }; 36 : 37 : TestVector test1 = 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 : 58 : TestVector test2 = 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 : 79 : TestVector test3 = 80 : TestVector("4b381541583be4423346c643850da4b320e46a87ae3d2a4e6da11eba819cd4acba45d239319ac14f863b8d5ab5a0d0c64d2e8a1e7d1457df2e5a3c51c73235be") 81 : ("ToEA6epvY6iUs9r4PkjRBxYPnRsfKhnYQ3WndTQYwT67etN7PiGbkt8Ei4ip5SjxLoLiHdWArHmHZ3hpzHJGr2M4hFqz7yGX9esBG3TbzVdjxDo", 82 : "TDt9EWvD5T5T44hAZGy5xoVqwGeVUnVyYV6Zi8L9ukLG13e9HPFx3zJdmt3C2EoMv6eXn4wx7J2XDB4bhNnMqvE6Ef9CHr17uNAGrzG7xYqJd6B", 83 : 0x80000000) 84 : ("ToEA6hC8H4YcYXDQbHppR6stqgdL24PvYtvh2weVkgmxbCHUejQ4LNu6nXWXPAaU59wTV111dFX2PzuKckEcnGHFGW7vo5DQhWMykDpWeoJwYt1", 85 : "TDt9EZHQpQuajS4Wkp4VBwqLzXQAB97MhLWU7ca6iz26wMZWYQPQdV5VrLpuL19iG3yTEDbN8EpPruh4LvRWR8oqzRLpiyvAeXS5z1Dmuvfnaee", 86 : 0); 87 : 88 3 : static void RunTest(const TestVector &test) { 89 3 : std::vector<unsigned char> seed = ParseHex(test.strHexMaster); 90 6 : CExtKey key; 91 3 : CExtPubKey pubkey; 92 3 : key.SetSeed(seed.data(), seed.size()); 93 3 : pubkey = key.Neuter(); 94 17 : for (const TestDerivation &derive : test.vDerive) { 95 14 : unsigned char data[74]; 96 14 : key.Encode(data); 97 14 : pubkey.Encode(data); 98 : 99 : // Test private key 100 42 : BOOST_CHECK(KeyIO::EncodeExtKey(key) == derive.prv); 101 42 : BOOST_CHECK(KeyIO::DecodeExtKey(derive.prv) == key); //ensure a base58 decoded key also matches 102 : 103 : // Test public key 104 42 : BOOST_CHECK(KeyIO::EncodeExtPubKey(pubkey) == derive.pub); 105 28 : BOOST_CHECK(KeyIO::DecodeExtPubKey(derive.pub) == pubkey); //ensure a base58 decoded pubkey also matches 106 : 107 : // Derive new keys 108 28 : CExtKey keyNew; 109 28 : BOOST_CHECK(key.Derive(keyNew, derive.nChild)); 110 14 : CExtPubKey pubkeyNew = keyNew.Neuter(); 111 14 : if (!(derive.nChild & 0x80000000)) { 112 : // Compare with public derivation 113 9 : CExtPubKey pubkeyNew2; 114 18 : BOOST_CHECK(pubkey.Derive(pubkeyNew2, derive.nChild)); 115 18 : BOOST_CHECK(pubkeyNew == pubkeyNew2); 116 : } 117 14 : key = keyNew; 118 14 : pubkey = pubkeyNew; 119 : } 120 3 : } 121 : 122 : BOOST_FIXTURE_TEST_SUITE(bip32_tests, TestingSetup) 123 : 124 2 : BOOST_AUTO_TEST_CASE(bip32_test1) { 125 1 : RunTest(test1); 126 1 : } 127 : 128 2 : BOOST_AUTO_TEST_CASE(bip32_test2) { 129 1 : RunTest(test2); 130 1 : } 131 : 132 2 : BOOST_AUTO_TEST_CASE(bip32_test3) { 133 1 : RunTest(test3); 134 1 : } 135 : 136 : BOOST_AUTO_TEST_SUITE_END()