Merge pull request #5227
4cdaa95Resize after succesful result (Pieter Wuille)9d8604fHeader define style cleanups (Pieter Wuille)a53fd41Deterministic signing (Pieter Wuille)3060e36Add the RFC6979 PRNG (Pieter Wuille)a8f5087Add HMAC-SHA256 (Pieter Wuille)36fa4a7Split up crypto/sha2 (Pieter Wuille)
This commit is contained in:
@@ -2,14 +2,19 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#include "crypto/rfc6979_hmac_sha256.h"
|
||||
#include "crypto/ripemd160.h"
|
||||
#include "crypto/sha1.h"
|
||||
#include "crypto/sha2.h"
|
||||
#include "crypto/sha256.h"
|
||||
#include "crypto/sha512.h"
|
||||
#include "crypto/hmac_sha256.h"
|
||||
#include "crypto/hmac_sha512.h"
|
||||
#include "random.h"
|
||||
#include "utilstrencodings.h"
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include <boost/assign/list_of.hpp>
|
||||
#include <boost/test/unit_test.hpp>
|
||||
|
||||
BOOST_AUTO_TEST_SUITE(crypto_tests)
|
||||
@@ -48,6 +53,11 @@ void TestSHA256(const std::string &in, const std::string &hexout) { TestVector(C
|
||||
void TestSHA512(const std::string &in, const std::string &hexout) { TestVector(CSHA512(), in, ParseHex(hexout));}
|
||||
void TestRIPEMD160(const std::string &in, const std::string &hexout) { TestVector(CRIPEMD160(), in, ParseHex(hexout));}
|
||||
|
||||
void TestHMACSHA256(const std::string &hexkey, const std::string &hexin, const std::string &hexout) {
|
||||
std::vector<unsigned char> key = ParseHex(hexkey);
|
||||
TestVector(CHMAC_SHA256(&key[0], key.size()), ParseHex(hexin), ParseHex(hexout));
|
||||
}
|
||||
|
||||
void TestHMACSHA512(const std::string &hexkey, const std::string &hexin, const std::string &hexout) {
|
||||
std::vector<unsigned char> key = ParseHex(hexkey);
|
||||
TestVector(CHMAC_SHA512(&key[0], key.size()), ParseHex(hexin), ParseHex(hexout));
|
||||
@@ -158,6 +168,43 @@ BOOST_AUTO_TEST_CASE(sha512_testvectors) {
|
||||
"37de8c3ef5459d76a52cedc02dc499a3c9ed9dedbfb3281afd9653b8a112fafc");
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(hmac_sha256_testvectors) {
|
||||
// test cases 1, 2, 3, 4, 6 and 7 of RFC 4231
|
||||
TestHMACSHA256("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
|
||||
"4869205468657265",
|
||||
"b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7");
|
||||
TestHMACSHA256("4a656665",
|
||||
"7768617420646f2079612077616e7420666f72206e6f7468696e673f",
|
||||
"5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843");
|
||||
TestHMACSHA256("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
||||
"dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"
|
||||
"dddddddddddddddddddddddddddddddddddd",
|
||||
"773ea91e36800e46854db8ebd09181a72959098b3ef8c122d9635514ced565fe");
|
||||
TestHMACSHA256("0102030405060708090a0b0c0d0e0f10111213141516171819",
|
||||
"cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd"
|
||||
"cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd",
|
||||
"82558a389a443c0ea4cc819899f2083a85f0faa3e578f8077a2e3ff46729665b");
|
||||
TestHMACSHA256("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||
"aaaaaa",
|
||||
"54657374205573696e67204c6172676572205468616e20426c6f636b2d53697a"
|
||||
"65204b6579202d2048617368204b6579204669727374",
|
||||
"60e431591ee0b67f0d8a26aacbf5b77f8e0bc6213728c5140546040f0ee37f54");
|
||||
TestHMACSHA256("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||
"aaaaaa",
|
||||
"5468697320697320612074657374207573696e672061206c6172676572207468"
|
||||
"616e20626c6f636b2d73697a65206b657920616e642061206c61726765722074"
|
||||
"68616e20626c6f636b2d73697a6520646174612e20546865206b6579206e6565"
|
||||
"647320746f20626520686173686564206265666f7265206265696e6720757365"
|
||||
"642062792074686520484d414320616c676f726974686d2e",
|
||||
"9b09ffa71b942fcb27635fbcd5b0e944bfdc63644f0713938a7f51535c3a35e2");
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(hmac_sha512_testvectors) {
|
||||
// test cases 1, 2, 3, 4, 6 and 7 of RFC 4231
|
||||
TestHMACSHA512("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
|
||||
@@ -201,4 +248,38 @@ BOOST_AUTO_TEST_CASE(hmac_sha512_testvectors) {
|
||||
"b6022cac3c4982b10d5eeb55c3e4de15134676fb6de0446065c97440fa8c6a58");
|
||||
}
|
||||
|
||||
void TestRFC6979(const std::string& hexkey, const std::string& hexmsg, const std::vector<std::string>& hexout)
|
||||
{
|
||||
std::vector<unsigned char> key = ParseHex(hexkey);
|
||||
std::vector<unsigned char> msg = ParseHex(hexmsg);
|
||||
RFC6979_HMAC_SHA256 rng(&key[0], key.size(), &msg[0], msg.size());
|
||||
|
||||
for (unsigned int i = 0; i < hexout.size(); i++) {
|
||||
std::vector<unsigned char> out = ParseHex(hexout[i]);
|
||||
std::vector<unsigned char> gen;
|
||||
gen.resize(out.size());
|
||||
rng.Generate(&gen[0], gen.size());
|
||||
BOOST_CHECK(out == gen);
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(rfc6979_hmac_sha256)
|
||||
{
|
||||
TestRFC6979(
|
||||
"0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f00",
|
||||
"4bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459a",
|
||||
boost::assign::list_of
|
||||
("4fe29525b2086809159acdf0506efb86b0ec932c7ba44256ab321e421e67e9fb")
|
||||
("2bf0fff1d3c378a22dc5de1d856522325c65b504491a0cbd01cb8f3aa67ffd4a")
|
||||
("f528b410cb541f77000d7afb6c5b53c5c471eab43e466d9ac5190c39c82fd82e"));
|
||||
|
||||
TestRFC6979(
|
||||
"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
|
||||
"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
boost::assign::list_of
|
||||
("9c236c165b82ae0cd590659e100b6bab3036e7ba8b06749baf6981e16f1a2b95")
|
||||
("df471061625bc0ea14b682feee2c9c02f235da04204c1d62a1536c6e17aed7a9")
|
||||
("7597887cbd76321f32e30440679a22cf7f8d9d2eac390e581fea091ce202ba94"));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include "script/script.h"
|
||||
#include "uint256.h"
|
||||
#include "util.h"
|
||||
#include "utilstrencodings.h"
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
@@ -162,6 +163,28 @@ BOOST_AUTO_TEST_CASE(key_test1)
|
||||
BOOST_CHECK(rkey1C == pubkey1C);
|
||||
BOOST_CHECK(rkey2C == pubkey2C);
|
||||
}
|
||||
|
||||
// test deterministic signing
|
||||
|
||||
std::vector<unsigned char> detsig, detsigc;
|
||||
string strMsg = "Very deterministic message";
|
||||
uint256 hashMsg = Hash(strMsg.begin(), strMsg.end());
|
||||
BOOST_CHECK(key1.Sign(hashMsg, detsig));
|
||||
BOOST_CHECK(key1C.Sign(hashMsg, detsigc));
|
||||
BOOST_CHECK(detsig == detsigc);
|
||||
BOOST_CHECK(detsig == ParseHex("304402205dbbddda71772d95ce91cd2d14b592cfbc1dd0aabd6a394b6c2d377bbe59d31d022014ddda21494a4e221f0824f0b8b924c43fa43c0ad57dccdaa11f81a6bd4582f6"));
|
||||
BOOST_CHECK(key2.Sign(hashMsg, detsig));
|
||||
BOOST_CHECK(key2C.Sign(hashMsg, detsigc));
|
||||
BOOST_CHECK(detsig == detsigc);
|
||||
BOOST_CHECK(detsig == ParseHex("3044022052d8a32079c11e79db95af63bb9600c5b04f21a9ca33dc129c2bfa8ac9dc1cd5022061d8ae5e0f6c1a16bde3719c64c2fd70e404b6428ab9a69566962e8771b5944d"));
|
||||
BOOST_CHECK(key1.SignCompact(hashMsg, detsig));
|
||||
BOOST_CHECK(key1C.SignCompact(hashMsg, detsigc));
|
||||
BOOST_CHECK(detsig == ParseHex("1c5dbbddda71772d95ce91cd2d14b592cfbc1dd0aabd6a394b6c2d377bbe59d31d14ddda21494a4e221f0824f0b8b924c43fa43c0ad57dccdaa11f81a6bd4582f6"));
|
||||
BOOST_CHECK(detsigc == ParseHex("205dbbddda71772d95ce91cd2d14b592cfbc1dd0aabd6a394b6c2d377bbe59d31d14ddda21494a4e221f0824f0b8b924c43fa43c0ad57dccdaa11f81a6bd4582f6"));
|
||||
BOOST_CHECK(key2.SignCompact(hashMsg, detsig));
|
||||
BOOST_CHECK(key2C.SignCompact(hashMsg, detsigc));
|
||||
BOOST_CHECK(detsig == ParseHex("1c52d8a32079c11e79db95af63bb9600c5b04f21a9ca33dc129c2bfa8ac9dc1cd561d8ae5e0f6c1a16bde3719c64c2fd70e404b6428ab9a69566962e8771b5944d"));
|
||||
BOOST_CHECK(detsigc == ParseHex("2052d8a32079c11e79db95af63bb9600c5b04f21a9ca33dc129c2bfa8ac9dc1cd561d8ae5e0f6c1a16bde3719c64c2fd70e404b6428ab9a69566962e8771b5944d"));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
||||
@@ -248,8 +248,9 @@ public:
|
||||
{
|
||||
uint256 hash = SignatureHash(scriptPubKey, spendTx, 0, nHashType);
|
||||
std::vector<unsigned char> vchSig, r, s;
|
||||
uint32_t iter = 0;
|
||||
do {
|
||||
key.Sign(hash, vchSig);
|
||||
key.Sign(hash, vchSig, iter++);
|
||||
if ((lenS == 33) != (vchSig[5 + vchSig[3]] == 33)) {
|
||||
NegateSignatureS(vchSig);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user