Changeset View
Changeset View
Standalone View
Standalone View
src/test/key_tests.cpp
Show All 26 Lines | static const std::string strSecret2C = | ||||
"L3Hq7a8FEQwJkW1M2GNKDW28546Vp5miewcCzSqUD9kCAXrJdS3g"; | "L3Hq7a8FEQwJkW1M2GNKDW28546Vp5miewcCzSqUD9kCAXrJdS3g"; | ||||
static const std::string addr1 = "1QFqqMUD55ZV3PJEJZtaKCsQmjLT6JkjvJ"; | static const std::string addr1 = "1QFqqMUD55ZV3PJEJZtaKCsQmjLT6JkjvJ"; | ||||
static const std::string addr2 = "1F5y5E5FMc5YzdJtB9hLaUe43GDxEKXENJ"; | static const std::string addr2 = "1F5y5E5FMc5YzdJtB9hLaUe43GDxEKXENJ"; | ||||
static const std::string addr1C = "1NoJrossxPBKfCHuJXT4HadJrXRE9Fxiqs"; | static const std::string addr1C = "1NoJrossxPBKfCHuJXT4HadJrXRE9Fxiqs"; | ||||
static const std::string addr2C = "1CRj2HyM1CXWzHAXLQtiGLyggNT9WQqsDs"; | static const std::string addr2C = "1CRj2HyM1CXWzHAXLQtiGLyggNT9WQqsDs"; | ||||
static const std::string strAddressBad = "1HV9Lc3sNHZxwj4Zk6fB38tEmBryq2cBiF"; | static const std::string strAddressBad = "1HV9Lc3sNHZxwj4Zk6fB38tEmBryq2cBiF"; | ||||
// get r value produced by ECDSA signing algorithm | |||||
// (assumes ECDSA r is encoded in the canonical manner) | |||||
std::vector<uint8_t> get_r_ECDSA(std::vector<uint8_t> &sigECDSA) { | |||||
std::vector<uint8_t> ret(32, 0); | |||||
assert(sigECDSA[2] == 2); | |||||
int rlen = sigECDSA[3]; | |||||
assert(rlen <= 33); | |||||
assert(sigECDSA[4 + rlen] == 2); | |||||
if (rlen == 33) { | |||||
assert(sigECDSA[4] == 0); | |||||
std::copy(sigECDSA.begin() + 5, sigECDSA.begin() + 37, ret.begin()); | |||||
} else { | |||||
std::copy(sigECDSA.begin() + 4, sigECDSA.begin() + 36, | |||||
ret.begin() + (32 - rlen)); | |||||
} | |||||
return ret; | |||||
} | |||||
BOOST_FIXTURE_TEST_SUITE(key_tests, BasicTestingSetup) | BOOST_FIXTURE_TEST_SUITE(key_tests, BasicTestingSetup) | ||||
BOOST_AUTO_TEST_CASE(key_test1) { | BOOST_AUTO_TEST_CASE(key_test1) { | ||||
CBitcoinSecret bsecret1, bsecret2, bsecret1C, bsecret2C, baddress1; | CBitcoinSecret bsecret1, bsecret2, bsecret1C, bsecret2C, baddress1; | ||||
BOOST_CHECK(bsecret1.SetString(strSecret1)); | BOOST_CHECK(bsecret1.SetString(strSecret1)); | ||||
BOOST_CHECK(bsecret2.SetString(strSecret2)); | BOOST_CHECK(bsecret2.SetString(strSecret2)); | ||||
BOOST_CHECK(bsecret1C.SetString(strSecret1C)); | BOOST_CHECK(bsecret1C.SetString(strSecret1C)); | ||||
BOOST_CHECK(bsecret2C.SetString(strSecret2C)); | BOOST_CHECK(bsecret2C.SetString(strSecret2C)); | ||||
▲ Show 20 Lines • Show All 96 Lines • ▼ Show 20 Lines | for (int n = 0; n < 16; n++) { | ||||
BOOST_CHECK(rkey2 == pubkey2); | BOOST_CHECK(rkey2 == pubkey2); | ||||
BOOST_CHECK(rkey1C == pubkey1C); | BOOST_CHECK(rkey1C == pubkey1C); | ||||
BOOST_CHECK(rkey2C == pubkey2C); | BOOST_CHECK(rkey2C == pubkey2C); | ||||
// Schnorr signatures | // Schnorr signatures | ||||
std::vector<uint8_t> ssign1, ssign2, ssign1C, ssign2C; | std::vector<uint8_t> ssign1, ssign2, ssign1C, ssign2C; | ||||
BOOST_CHECK(key1.SignSchnorr(hashMsg, sign1)); | BOOST_CHECK(key1.SignSchnorr(hashMsg, ssign1)); | ||||
BOOST_CHECK(key2.SignSchnorr(hashMsg, sign2)); | BOOST_CHECK(key2.SignSchnorr(hashMsg, ssign2)); | ||||
BOOST_CHECK(key1C.SignSchnorr(hashMsg, sign1C)); | BOOST_CHECK(key1C.SignSchnorr(hashMsg, ssign1C)); | ||||
BOOST_CHECK(key2C.SignSchnorr(hashMsg, sign2C)); | BOOST_CHECK(key2C.SignSchnorr(hashMsg, ssign2C)); | ||||
BOOST_CHECK(pubkey1.VerifySchnorr(hashMsg, sign1)); | BOOST_CHECK(pubkey1.VerifySchnorr(hashMsg, ssign1)); | ||||
BOOST_CHECK(!pubkey1.VerifySchnorr(hashMsg, sign2)); | BOOST_CHECK(!pubkey1.VerifySchnorr(hashMsg, ssign2)); | ||||
BOOST_CHECK(pubkey1.VerifySchnorr(hashMsg, sign1C)); | BOOST_CHECK(pubkey1.VerifySchnorr(hashMsg, ssign1C)); | ||||
BOOST_CHECK(!pubkey1.VerifySchnorr(hashMsg, sign2C)); | BOOST_CHECK(!pubkey1.VerifySchnorr(hashMsg, ssign2C)); | ||||
BOOST_CHECK(!pubkey2.VerifySchnorr(hashMsg, sign1)); | BOOST_CHECK(!pubkey2.VerifySchnorr(hashMsg, ssign1)); | ||||
BOOST_CHECK(pubkey2.VerifySchnorr(hashMsg, sign2)); | BOOST_CHECK(pubkey2.VerifySchnorr(hashMsg, ssign2)); | ||||
BOOST_CHECK(!pubkey2.VerifySchnorr(hashMsg, sign1C)); | BOOST_CHECK(!pubkey2.VerifySchnorr(hashMsg, ssign1C)); | ||||
BOOST_CHECK(pubkey2.VerifySchnorr(hashMsg, sign2C)); | BOOST_CHECK(pubkey2.VerifySchnorr(hashMsg, ssign2C)); | ||||
BOOST_CHECK(pubkey1C.VerifySchnorr(hashMsg, sign1)); | BOOST_CHECK(pubkey1C.VerifySchnorr(hashMsg, ssign1)); | ||||
BOOST_CHECK(!pubkey1C.VerifySchnorr(hashMsg, sign2)); | BOOST_CHECK(!pubkey1C.VerifySchnorr(hashMsg, ssign2)); | ||||
BOOST_CHECK(pubkey1C.VerifySchnorr(hashMsg, sign1C)); | BOOST_CHECK(pubkey1C.VerifySchnorr(hashMsg, ssign1C)); | ||||
BOOST_CHECK(!pubkey1C.VerifySchnorr(hashMsg, sign2C)); | BOOST_CHECK(!pubkey1C.VerifySchnorr(hashMsg, ssign2C)); | ||||
BOOST_CHECK(!pubkey2C.VerifySchnorr(hashMsg, sign1)); | BOOST_CHECK(!pubkey2C.VerifySchnorr(hashMsg, ssign1)); | ||||
BOOST_CHECK(pubkey2C.VerifySchnorr(hashMsg, sign2)); | BOOST_CHECK(pubkey2C.VerifySchnorr(hashMsg, ssign2)); | ||||
BOOST_CHECK(!pubkey2C.VerifySchnorr(hashMsg, sign1C)); | BOOST_CHECK(!pubkey2C.VerifySchnorr(hashMsg, ssign1C)); | ||||
BOOST_CHECK(pubkey2C.VerifySchnorr(hashMsg, sign2C)); | BOOST_CHECK(pubkey2C.VerifySchnorr(hashMsg, ssign2C)); | ||||
// check deterministicity of ECDSA & Schnorr | |||||
BOOST_CHECK(sign1 == sign1C); | |||||
BOOST_CHECK(sign2 == sign2C); | |||||
BOOST_CHECK(ssign1 == ssign1C); | |||||
BOOST_CHECK(ssign2 == ssign2C); | |||||
// Extract r value from ECDSA and Schnorr. Make sure they are | |||||
// distinct (nonce reuse would be dangerous and can leak private key). | |||||
std::vector<uint8_t> rE1 = get_r_ECDSA(sign1); | |||||
std::vector<uint8_t> rS1(ssign1.begin(), ssign1.begin() + 32); | |||||
BOOST_CHECK(rE1.size() == rS1.size()); | |||||
BOOST_CHECK(rE1 != rS1); | |||||
std::vector<uint8_t> rE2 = get_r_ECDSA(sign2); | |||||
std::vector<uint8_t> rS2(ssign2.begin(), ssign2.begin() + 32); | |||||
BOOST_CHECK(rE2.size() == rS2.size()); | |||||
BOOST_CHECK(rE2 != rS2); | |||||
} | } | ||||
// test deterministic signing | // test deterministic signing expected values | ||||
std::vector<uint8_t> detsig, detsigc; | std::vector<uint8_t> detsig, detsigc; | ||||
std::string strMsg = "Very deterministic message"; | std::string strMsg = "Very deterministic message"; | ||||
uint256 hashMsg = Hash(strMsg.begin(), strMsg.end()); | uint256 hashMsg = Hash(strMsg.begin(), strMsg.end()); | ||||
// ECDSA | // ECDSA | ||||
BOOST_CHECK(key1.SignECDSA(hashMsg, detsig)); | BOOST_CHECK(key1.SignECDSA(hashMsg, detsig)); | ||||
BOOST_CHECK(key1C.SignECDSA(hashMsg, detsigc)); | BOOST_CHECK(key1C.SignECDSA(hashMsg, detsigc)); | ||||
BOOST_CHECK(detsig == detsigc); | BOOST_CHECK(detsig == detsigc); | ||||
▲ Show 20 Lines • Show All 50 Lines • Show Last 20 Lines |