aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPieter Wuille <pieter.wuille@gmail.com>2011-09-21 17:03:28 +0200
committerPieter Wuille <pieter.wuille@gmail.com>2011-09-27 19:48:22 +0200
commit3a570dc80a7391b7f3943cb83849055318e0217a (patch)
treeeaeff0cbd1ca56a5c0be12eabb776a76379eea75
parent01cc526318ff9f0ee6fb675ffe3be4ca7f3cda7a (diff)
Use key recovery for message signatures
Instead of encoding the public key inside the signature string, use key recovery to do verification. This allows 88-character base64-encoded signature strings instead of 188-character ones.
-rw-r--r--src/bitcoinrpc.cpp34
1 files changed, 9 insertions, 25 deletions
diff --git a/src/bitcoinrpc.cpp b/src/bitcoinrpc.cpp
index c8a0076bfa..8468e56105 100644
--- a/src/bitcoinrpc.cpp
+++ b/src/bitcoinrpc.cpp
@@ -554,15 +554,10 @@ Value signmessage(const Array& params, bool fHelp)
ss << strMessage;
vector<unsigned char> vchSig;
- if (!key.Sign(Hash(ss.begin(), ss.end()), vchSig))
+ if (!key.SignCompact(Hash(ss.begin(), ss.end()), vchSig))
throw JSONRPCError(-5, "Sign failed");
- CDataStream sres(SER_NETWORK);
- sres << key.GetPubKey(); // public key
- sres << vchSig; // signature;
-
- vector<unsigned char> vchRet(sres.begin(), sres.end());
- return EncodeBase64(&vchRet[0], vchRet.size());
+ return EncodeBase64(&vchSig[0], vchSig.size());
}
Value verifymessage(const Array& params, bool fHelp)
@@ -581,31 +576,20 @@ Value verifymessage(const Array& params, bool fHelp)
throw JSONRPCError(-3, "Invalid address");
bool fInvalid = false;
- vector<unsigned char> vchResult = DecodeBase64(strSign.c_str(), &fInvalid);
+ vector<unsigned char> vchSig = DecodeBase64(strSign.c_str(), &fInvalid);
if (fInvalid)
throw JSONRPCError(-5, "Malformed base64 encoding");
- CDataStream sres(vchResult);
-
- std::vector<unsigned char> vchPubKey;
- sres >> vchPubKey;
- std::vector<unsigned char> vchSig;
- sres >> vchSig;
+ CDataStream ss(SER_GETHASH);
+ ss << strMessageMagic;
+ ss << strMessage;
CKey key;
- if (!key.SetPubKey(vchPubKey))
- throw JSONRPCError(-5, "Invalid public key in signature");
-
- if (key.GetAddress() == addr)
- {
- CDataStream ss(SER_GETHASH);
- ss << strMessageMagic;
- ss << strMessage;
- return key.Verify(Hash(ss.begin(), ss.end()), vchSig);
- }
- else
+ if (!key.SetCompactSignature(Hash(ss.begin(), ss.end()), vchSig))
return false;
+
+ return (key.GetAddress() == addr);
}