Any projects which want to use Hush code from now on will need to be licensed as GPLv3 or we will send the lawyers: https://www.softwarefreedom.org/ Notably, Komodo (KMD) is licensed as GPLv2 and is no longer compatible to receive code changes, without causing legal issues. MIT projects, such as Zcash, also cannot pull in changes from the Hush Full Node without permission from The Hush Developers, which may in some circumstances grant an MIT license on a case-by-case basis.
142 lines
5.9 KiB
C++
142 lines
5.9 KiB
C++
// Copyright (c) 2013 The Bitcoin Core developers
|
|
// Distributed under the GPLv3 software license, see the accompanying
|
|
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
|
|
|
#include <boost/test/unit_test.hpp>
|
|
|
|
#include "key.h"
|
|
#include "key_io.h"
|
|
#include "uint256.h"
|
|
#include "util.h"
|
|
#include "utilstrencodings.h"
|
|
#include "test/test_bitcoin.h"
|
|
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
struct TestDerivation {
|
|
std::string pub;
|
|
std::string prv;
|
|
unsigned int nChild;
|
|
};
|
|
|
|
struct TestVector {
|
|
std::string strHexMaster;
|
|
std::vector<TestDerivation> vDerive;
|
|
|
|
TestVector(std::string strHexMasterIn) : strHexMaster(strHexMasterIn) {}
|
|
|
|
TestVector& operator()(std::string pub, std::string prv, unsigned int nChild) {
|
|
vDerive.push_back(TestDerivation());
|
|
TestDerivation &der = vDerive.back();
|
|
der.pub = pub;
|
|
der.prv = prv;
|
|
der.nChild = nChild;
|
|
return *this;
|
|
}
|
|
};
|
|
|
|
TestVector test1 =
|
|
TestVector("000102030405060708090a0b0c0d0e0f")
|
|
("xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8",
|
|
"xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi",
|
|
0x80000000)
|
|
("xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw",
|
|
"xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7",
|
|
1)
|
|
("xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ",
|
|
"xprv9wTYmMFdV23N2TdNG573QoEsfRrWKQgWeibmLntzniatZvR9BmLnvSxqu53Kw1UmYPxLgboyZQaXwTCg8MSY3H2EU4pWcQDnRnrVA1xe8fs",
|
|
0x80000002)
|
|
("xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5",
|
|
"xprv9z4pot5VBttmtdRTWfWQmoH1taj2axGVzFqSb8C9xaxKymcFzXBDptWmT7FwuEzG3ryjH4ktypQSAewRiNMjANTtpgP4mLTj34bhnZX7UiM",
|
|
2)
|
|
("xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV",
|
|
"xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334",
|
|
1000000000)
|
|
("xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy",
|
|
"xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76",
|
|
0);
|
|
|
|
TestVector test2 =
|
|
TestVector("fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542")
|
|
("xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB",
|
|
"xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U",
|
|
0)
|
|
("xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH",
|
|
"xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt",
|
|
0xFFFFFFFF)
|
|
("xpub6ASAVgeehLbnwdqV6UKMHVzgqAG8Gr6riv3Fxxpj8ksbH9ebxaEyBLZ85ySDhKiLDBrQSARLq1uNRts8RuJiHjaDMBU4Zn9h8LZNnBC5y4a",
|
|
"xprv9wSp6B7kry3Vj9m1zSnLvN3xH8RdsPP1Mh7fAaR7aRLcQMKTR2vidYEeEg2mUCTAwCd6vnxVrcjfy2kRgVsFawNzmjuHc2YmYRmagcEPdU9",
|
|
1)
|
|
("xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon",
|
|
"xprv9zFnWC6h2cLgpmSA46vutJzBcfJ8yaJGg8cX1e5StJh45BBciYTRXSd25UEPVuesF9yog62tGAQtHjXajPPdbRCHuWS6T8XA2ECKADdw4Ef",
|
|
0xFFFFFFFE)
|
|
("xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL",
|
|
"xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc",
|
|
2)
|
|
("xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt",
|
|
"xprvA2nrNbFZABcdryreWet9Ea4LvTJcGsqrMzxHx98MMrotbir7yrKCEXw7nadnHM8Dq38EGfSh6dqA9QWTyefMLEcBYJUuekgW4BYPJcr9E7j",
|
|
0);
|
|
|
|
void RunTest(const TestVector &test) {
|
|
std::vector<unsigned char> seed = ParseHex(test.strHexMaster);
|
|
CExtKey key;
|
|
CExtPubKey pubkey;
|
|
key.SetMaster(&seed[0], seed.size());
|
|
pubkey = key.Neuter();
|
|
BOOST_FOREACH(const TestDerivation &derive, test.vDerive) {
|
|
unsigned char data[74];
|
|
key.Encode(data);
|
|
pubkey.Encode(data);
|
|
|
|
// Test private key
|
|
BOOST_CHECK(EncodeExtKey(key) == derive.prv);
|
|
BOOST_CHECK(DecodeExtKey(derive.prv) == key); //ensure a base58 decoded key also matches
|
|
|
|
// Test public key
|
|
BOOST_CHECK(EncodeExtPubKey(pubkey) == derive.pub);
|
|
BOOST_CHECK(DecodeExtPubKey(derive.pub) == pubkey); //ensure a base58 decoded pubkey also matches
|
|
|
|
// Derive new keys
|
|
CExtKey keyNew;
|
|
BOOST_CHECK(key.Derive(keyNew, derive.nChild));
|
|
CExtPubKey pubkeyNew = keyNew.Neuter();
|
|
if (!(derive.nChild & 0x80000000)) {
|
|
// Compare with public derivation
|
|
CExtPubKey pubkeyNew2;
|
|
BOOST_CHECK(pubkey.Derive(pubkeyNew2, derive.nChild));
|
|
BOOST_CHECK(pubkeyNew == pubkeyNew2);
|
|
}
|
|
key = keyNew;
|
|
pubkey = pubkeyNew;
|
|
|
|
CDataStream ssPub(SER_DISK, CLIENT_VERSION);
|
|
ssPub << pubkeyNew;
|
|
BOOST_CHECK(ssPub.size() == 75);
|
|
|
|
CDataStream ssPriv(SER_DISK, CLIENT_VERSION);
|
|
ssPriv << keyNew;
|
|
BOOST_CHECK(ssPriv.size() == 75);
|
|
|
|
CExtPubKey pubCheck;
|
|
CExtKey privCheck;
|
|
ssPub >> pubCheck;
|
|
ssPriv >> privCheck;
|
|
|
|
BOOST_CHECK(pubCheck == pubkeyNew);
|
|
BOOST_CHECK(privCheck == keyNew);
|
|
}
|
|
}
|
|
|
|
BOOST_FIXTURE_TEST_SUITE(bip32_tests, BasicTestingSetup)
|
|
|
|
BOOST_AUTO_TEST_CASE(bip32_test1) {
|
|
RunTest(test1);
|
|
}
|
|
|
|
BOOST_AUTO_TEST_CASE(bip32_test2) {
|
|
RunTest(test2);
|
|
}
|
|
|
|
BOOST_AUTO_TEST_SUITE_END()
|