Gavin Andresen
11 years ago
9 changed files with 585 additions and 36 deletions
@ -0,0 +1,116 @@ |
|||||||
|
#include <boost/test/unit_test.hpp> |
||||||
|
|
||||||
|
#include <string> |
||||||
|
#include <vector> |
||||||
|
|
||||||
|
#include "key.h" |
||||||
|
#include "base58.h" |
||||||
|
#include "uint256.h" |
||||||
|
#include "util.h" |
||||||
|
|
||||||
|
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
|
||||||
|
CBitcoinExtKey b58key; b58key.SetKey(key); |
||||||
|
BOOST_CHECK(b58key.ToString() == derive.prv); |
||||||
|
// Test public key
|
||||||
|
CBitcoinExtPubKey b58pubkey; b58pubkey.SetKey(pubkey); |
||||||
|
BOOST_CHECK(b58pubkey.ToString() == derive.pub); |
||||||
|
// 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; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
BOOST_AUTO_TEST_SUITE(bip32_tests) |
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(bip32_test1) { |
||||||
|
RunTest(test1); |
||||||
|
} |
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(bip32_test2) { |
||||||
|
RunTest(test2); |
||||||
|
} |
||||||
|
|
||||||
|
BOOST_AUTO_TEST_SUITE_END() |
@ -0,0 +1,125 @@ |
|||||||
|
#include <boost/test/unit_test.hpp> |
||||||
|
|
||||||
|
#include "hash.h" |
||||||
|
#include "util.h" |
||||||
|
|
||||||
|
using namespace std; |
||||||
|
|
||||||
|
BOOST_AUTO_TEST_SUITE(hmac_tests) |
||||||
|
|
||||||
|
typedef struct { |
||||||
|
const char *pszKey; |
||||||
|
const char *pszData; |
||||||
|
const char *pszMAC; |
||||||
|
} testvec_t; |
||||||
|
|
||||||
|
// test cases 1, 2, 3, 4, 6 and 7 of RFC 4231
|
||||||
|
static const testvec_t vtest[] = { |
||||||
|
{ |
||||||
|
"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b" |
||||||
|
"0b0b0b0b", |
||||||
|
"4869205468657265", |
||||||
|
"87aa7cdea5ef619d4ff0b4241a1d6cb0" |
||||||
|
"2379f4e2ce4ec2787ad0b30545e17cde" |
||||||
|
"daa833b7d6b8a702038b274eaea3f4e4" |
||||||
|
"be9d914eeb61f1702e696c203a126854" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"4a656665", |
||||||
|
"7768617420646f2079612077616e7420" |
||||||
|
"666f72206e6f7468696e673f", |
||||||
|
"164b7a7bfcf819e2e395fbe73b56e0a3" |
||||||
|
"87bd64222e831fd610270cd7ea250554" |
||||||
|
"9758bf75c05a994a6d034f65f8f0e6fd" |
||||||
|
"caeab1a34d4a6b4b636e070a38bce737" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" |
||||||
|
"aaaaaaaa", |
||||||
|
"dddddddddddddddddddddddddddddddd" |
||||||
|
"dddddddddddddddddddddddddddddddd" |
||||||
|
"dddddddddddddddddddddddddddddddd" |
||||||
|
"dddd", |
||||||
|
"fa73b0089d56a284efb0f0756c890be9" |
||||||
|
"b1b5dbdd8ee81a3655f83e33b2279d39" |
||||||
|
"bf3e848279a722c806b485a47e67c807" |
||||||
|
"b946a337bee8942674278859e13292fb" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"0102030405060708090a0b0c0d0e0f10" |
||||||
|
"111213141516171819", |
||||||
|
"cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd" |
||||||
|
"cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd" |
||||||
|
"cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd" |
||||||
|
"cdcd", |
||||||
|
"b0ba465637458c6990e5a8c5f61d4af7" |
||||||
|
"e576d97ff94b872de76f8050361ee3db" |
||||||
|
"a91ca5c11aa25eb4d679275cc5788063" |
||||||
|
"a5f19741120c4f2de2adebeb10a298dd" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" |
||||||
|
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" |
||||||
|
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" |
||||||
|
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" |
||||||
|
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" |
||||||
|
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" |
||||||
|
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" |
||||||
|
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" |
||||||
|
"aaaaaa", |
||||||
|
"54657374205573696e67204c61726765" |
||||||
|
"72205468616e20426c6f636b2d53697a" |
||||||
|
"65204b6579202d2048617368204b6579" |
||||||
|
"204669727374", |
||||||
|
"80b24263c7c1a3ebb71493c1dd7be8b4" |
||||||
|
"9b46d1f41b4aeec1121b013783f8f352" |
||||||
|
"6b56d037e05f2598bd0fd2215d6a1e52" |
||||||
|
"95e64f73f63f0aec8b915a985d786598" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" |
||||||
|
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" |
||||||
|
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" |
||||||
|
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" |
||||||
|
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" |
||||||
|
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" |
||||||
|
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" |
||||||
|
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" |
||||||
|
"aaaaaa", |
||||||
|
"54686973206973206120746573742075" |
||||||
|
"73696e672061206c6172676572207468" |
||||||
|
"616e20626c6f636b2d73697a65206b65" |
||||||
|
"7920616e642061206c61726765722074" |
||||||
|
"68616e20626c6f636b2d73697a652064" |
||||||
|
"6174612e20546865206b6579206e6565" |
||||||
|
"647320746f2062652068617368656420" |
||||||
|
"6265666f7265206265696e6720757365" |
||||||
|
"642062792074686520484d414320616c" |
||||||
|
"676f726974686d2e", |
||||||
|
"e37b6a775dc87dbaa4dfa9f96e5e3ffd" |
||||||
|
"debd71f8867289865df5a32d20cdc944" |
||||||
|
"b6022cac3c4982b10d5eeb55c3e4de15" |
||||||
|
"134676fb6de0446065c97440fa8c6a58" |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(hmacsha512_testvectors) |
||||||
|
{ |
||||||
|
for (unsigned int n=0; n<sizeof(vtest)/sizeof(vtest[0]); n++) |
||||||
|
{ |
||||||
|
vector<unsigned char> vchKey = ParseHex(vtest[n].pszKey); |
||||||
|
vector<unsigned char> vchData = ParseHex(vtest[n].pszData); |
||||||
|
vector<unsigned char> vchMAC = ParseHex(vtest[n].pszMAC); |
||||||
|
unsigned char vchTemp[64]; |
||||||
|
|
||||||
|
HMAC_SHA512_CTX ctx; |
||||||
|
HMAC_SHA512_Init(&ctx, &vchKey[0], vchKey.size()); |
||||||
|
HMAC_SHA512_Update(&ctx, &vchData[0], vchData.size()); |
||||||
|
HMAC_SHA512_Final(&vchTemp[0], &ctx); |
||||||
|
|
||||||
|
BOOST_CHECK(memcmp(&vchTemp[0], &vchMAC[0], 64) == 0); |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
BOOST_AUTO_TEST_SUITE_END() |
Loading…
Reference in new issue