aboutsummaryrefslogtreecommitdiff
path: root/src/key.h
diff options
context:
space:
mode:
authorLuke Dashjr <luke-jr+git@utopios.org>2012-03-27 20:03:28 -0400
committerLuke Dashjr <luke-jr+git@utopios.org>2012-03-27 20:03:31 -0400
commitddd0d9ae54e52a299589c3655b5b2afc7c2bfd5e (patch)
tree043d3bb350cd8ff0aaa2a3e219a64981e62c5b2f /src/key.h
parentf53c5ede737b98b8353ad0b7a8c740e336357811 (diff)
downloadbitcoin-ddd0d9ae54e52a299589c3655b5b2afc7c2bfd5e.tar.xz
Minimal support for compressed-key signature recovery (for verifymessage)
Upstream commits: 11529c6e4f7288d8a64c488a726ee3821c7adefe d4d9c734c315e99136fe245c5733ca75cab9f8bf
Diffstat (limited to 'src/key.h')
-rw-r--r--src/key.h15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/key.h b/src/key.h
index df5cfeb32c..9673b2a0bc 100644
--- a/src/key.h
+++ b/src/key.h
@@ -169,6 +169,11 @@ protected:
EC_KEY* pkey;
bool fSet;
+ void SetCompressedPubKey()
+ {
+ EC_KEY_set_conv_form(pkey, POINT_CONVERSION_COMPRESSED);
+ }
+
public:
CKey()
{
@@ -346,7 +351,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);
@@ -354,7 +360,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);