LCOV - code coverage report
Current view: top level - src/test - bip32_tests.cpp (source / functions) Hit Total Coverage
Test: total_coverage.info Lines: 41 41 100.0 %
Date: 2025-02-23 09:33:43 Functions: 8 8 100.0 %

          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()

Generated by: LCOV version 1.14