|
|
|
@ -5,6 +5,7 @@
@@ -5,6 +5,7 @@
|
|
|
|
|
#include "key.h" |
|
|
|
|
|
|
|
|
|
#include "crypto/hmac_sha512.h" |
|
|
|
|
#include "crypto/rfc6979_hmac_sha256.h" |
|
|
|
|
#include "eccryptoverify.h" |
|
|
|
|
#include "pubkey.h" |
|
|
|
|
#include "random.h" |
|
|
|
@ -71,19 +72,22 @@ CPubKey CKey::GetPubKey() const {
@@ -71,19 +72,22 @@ CPubKey CKey::GetPubKey() const {
|
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool CKey::Sign(const uint256 &hash, std::vector<unsigned char>& vchSig) const { |
|
|
|
|
bool CKey::Sign(const uint256 &hash, std::vector<unsigned char>& vchSig, uint32_t test_case) const { |
|
|
|
|
if (!fValid) |
|
|
|
|
return false; |
|
|
|
|
vchSig.resize(72); |
|
|
|
|
int nSigLen = 72; |
|
|
|
|
CKey nonce; |
|
|
|
|
RFC6979_HMAC_SHA256 prng(begin(), 32, (unsigned char*)&hash, 32); |
|
|
|
|
do { |
|
|
|
|
nonce.MakeNewKey(true); |
|
|
|
|
if (secp256k1_ecdsa_sign((const unsigned char*)&hash, 32, (unsigned char*)&vchSig[0], &nSigLen, begin(), nonce.begin())) |
|
|
|
|
break; |
|
|
|
|
} while(true); |
|
|
|
|
uint256 nonce; |
|
|
|
|
prng.Generate((unsigned char*)&nonce, 32); |
|
|
|
|
nonce += test_case; |
|
|
|
|
int nSigLen = 72; |
|
|
|
|
int ret = secp256k1_ecdsa_sign((const unsigned char*)&hash, 32, (unsigned char*)&vchSig[0], &nSigLen, begin(), (unsigned char*)&nonce); |
|
|
|
|
vchSig.resize(nSigLen); |
|
|
|
|
nonce = 0; |
|
|
|
|
if (ret) |
|
|
|
|
return true; |
|
|
|
|
} while(true); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool CKey::SignCompact(const uint256 &hash, std::vector<unsigned char>& vchSig) const { |
|
|
|
@ -91,10 +95,13 @@ bool CKey::SignCompact(const uint256 &hash, std::vector<unsigned char>& vchSig)
@@ -91,10 +95,13 @@ bool CKey::SignCompact(const uint256 &hash, std::vector<unsigned char>& vchSig)
|
|
|
|
|
return false; |
|
|
|
|
vchSig.resize(65); |
|
|
|
|
int rec = -1; |
|
|
|
|
CKey nonce; |
|
|
|
|
RFC6979_HMAC_SHA256 prng(begin(), 32, (unsigned char*)&hash, 32); |
|
|
|
|
do { |
|
|
|
|
nonce.MakeNewKey(true); |
|
|
|
|
if (secp256k1_ecdsa_sign_compact((const unsigned char*)&hash, 32, &vchSig[1], begin(), nonce.begin(), &rec)) |
|
|
|
|
uint256 nonce; |
|
|
|
|
prng.Generate((unsigned char*)&nonce, 32); |
|
|
|
|
int ret = secp256k1_ecdsa_sign_compact((const unsigned char*)&hash, 32, &vchSig[1], begin(), (unsigned char*)&nonce, &rec); |
|
|
|
|
nonce = 0; |
|
|
|
|
if (ret) |
|
|
|
|
break; |
|
|
|
|
} while(true); |
|
|
|
|
assert(rec != -1); |
|
|
|
|