|
|
|
@ -366,6 +366,48 @@ UniValue verifymessage(const UniValue& params, bool fHelp)
|
|
|
|
|
return (pubkey.GetID() == keyID);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
UniValue signmessagewithprivkey(const UniValue& params, bool fHelp)
|
|
|
|
|
{
|
|
|
|
|
if (fHelp || params.size() != 2)
|
|
|
|
|
throw runtime_error(
|
|
|
|
|
"signmessagewithprivkey \"privkey\" \"message\"\n"
|
|
|
|
|
"\nSign a message with the private key of an address\n"
|
|
|
|
|
"\nArguments:\n"
|
|
|
|
|
"1. \"privkey\" (string, required) The private key to sign the message with.\n"
|
|
|
|
|
"2. \"message\" (string, required) The message to create a signature of.\n"
|
|
|
|
|
"\nResult:\n"
|
|
|
|
|
"\"signature\" (string) The signature of the message encoded in base 64\n"
|
|
|
|
|
"\nExamples:\n"
|
|
|
|
|
"\nCreate the signature\n"
|
|
|
|
|
+ HelpExampleCli("signmessagewithprivkey", "\"privkey\" \"my message\"") +
|
|
|
|
|
"\nVerify the signature\n"
|
|
|
|
|
+ HelpExampleCli("verifymessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\" \"signature\" \"my message\"") +
|
|
|
|
|
"\nAs json rpc\n"
|
|
|
|
|
+ HelpExampleRpc("signmessagewithprivkey", "\"privkey\", \"my message\"")
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
string strPrivkey = params[0].get_str();
|
|
|
|
|
string strMessage = params[1].get_str();
|
|
|
|
|
|
|
|
|
|
CBitcoinSecret vchSecret;
|
|
|
|
|
bool fGood = vchSecret.SetString(strPrivkey);
|
|
|
|
|
if (!fGood)
|
|
|
|
|
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid private key");
|
|
|
|
|
CKey key = vchSecret.GetKey();
|
|
|
|
|
if (!key.IsValid())
|
|
|
|
|
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Private key outside allowed range");
|
|
|
|
|
|
|
|
|
|
CHashWriter ss(SER_GETHASH, 0);
|
|
|
|
|
ss << strMessageMagic;
|
|
|
|
|
ss << strMessage;
|
|
|
|
|
|
|
|
|
|
vector<unsigned char> vchSig;
|
|
|
|
|
if (!key.SignCompact(ss.GetHash(), vchSig))
|
|
|
|
|
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Sign failed");
|
|
|
|
|
|
|
|
|
|
return EncodeBase64(&vchSig[0], vchSig.size());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
UniValue setmocktime(const UniValue& params, bool fHelp)
|
|
|
|
|
{
|
|
|
|
|
if (fHelp || params.size() != 1)
|
|
|
|
@ -404,6 +446,7 @@ static const CRPCCommand commands[] =
|
|
|
|
|
{ "util", "validateaddress", &validateaddress, true }, /* uses wallet if enabled */
|
|
|
|
|
{ "util", "createmultisig", &createmultisig, true },
|
|
|
|
|
{ "util", "verifymessage", &verifymessage, true },
|
|
|
|
|
{ "util", "signmessagewithprivkey", &signmessagewithprivkey, true },
|
|
|
|
|
|
|
|
|
|
/* Not shown in help */
|
|
|
|
|
{ "hidden", "setmocktime", &setmocktime, true },
|
|
|
|
|