|
|
|
@ -236,6 +236,8 @@ public:
@@ -236,6 +236,8 @@ public:
|
|
|
|
|
{ |
|
|
|
|
CKey keyRec; |
|
|
|
|
keyRec.fSet = true; |
|
|
|
|
if (fCompressedPubKey) |
|
|
|
|
keyRec.SetCompressedPubKey(); |
|
|
|
|
if (ECDSA_SIG_recover_key_GFp(keyRec.pkey, sig, (unsigned char*)&hash, sizeof(hash), i, 1) == 1) |
|
|
|
|
if (keyRec.GetPubKey() == this->GetPubKey()) |
|
|
|
|
{ |
|
|
|
@ -247,7 +249,7 @@ public:
@@ -247,7 +249,7 @@ public:
|
|
|
|
|
if (nRecId == -1) |
|
|
|
|
throw key_error("CKey::SignCompact() : unable to construct recoverable key"); |
|
|
|
|
|
|
|
|
|
vchSig[0] = nRecId+27; |
|
|
|
|
vchSig[0] = nRecId+27+(fCompressedPubKey ? 4 : 0); |
|
|
|
|
BN_bn2bin(sig->r,&vchSig[33-(nBitsR+7)/8]); |
|
|
|
|
BN_bn2bin(sig->s,&vchSig[65-(nBitsS+7)/8]); |
|
|
|
|
fOk = true; |
|
|
|
@ -264,7 +266,8 @@ public:
@@ -264,7 +266,8 @@ public:
|
|
|
|
|
{ |
|
|
|
|
if (vchSig.size() != 65) |
|
|
|
|
return false; |
|
|
|
|
if (vchSig[0]<27 || vchSig[0]>=31) |
|
|
|
|
int nV = vchSig[0]; |
|
|
|
|
if (nV<27 || nV>=35) |
|
|
|
|
return false; |
|
|
|
|
ECDSA_SIG *sig = ECDSA_SIG_new(); |
|
|
|
|
BN_bin2bn(&vchSig[1],32,sig->r); |
|
|
|
@ -272,7 +275,12 @@ public:
@@ -272,7 +275,12 @@ public:
|
|
|
|
|
|
|
|
|
|
EC_KEY_free(pkey); |
|
|
|
|
pkey = EC_KEY_new_by_curve_name(NID_secp256k1); |
|
|
|
|
if (ECDSA_SIG_recover_key_GFp(pkey, sig, (unsigned char*)&hash, sizeof(hash), vchSig[0] - 27, 0) == 1) |
|
|
|
|
if (nV >= 31) |
|
|
|
|
{ |
|
|
|
|
SetCompressedPubKey(); |
|
|
|
|
nV -= 4; |
|
|
|
|
} |
|
|
|
|
if (ECDSA_SIG_recover_key_GFp(pkey, sig, (unsigned char*)&hash, sizeof(hash), nV - 27, 0) == 1) |
|
|
|
|
{ |
|
|
|
|
fSet = true; |
|
|
|
|
ECDSA_SIG_free(sig); |
|
|
|
|