Branch data Line data Source code
# 1 : : // Copyright (c) 2011-2021 The Bitcoin Core developers
# 2 : : // Distributed under the MIT software license, see the accompanying
# 3 : : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
# 4 : :
# 5 : : #include <key_io.h>
# 6 : : #include <rpc/util.h>
# 7 : : #include <util/message.h>
# 8 : : #include <wallet/rpc/util.h>
# 9 : : #include <wallet/wallet.h>
# 10 : :
# 11 : : #include <univalue.h>
# 12 : :
# 13 : : namespace wallet {
# 14 : : RPCHelpMan signmessage()
# 15 : 1615 : {
# 16 : 1615 : return RPCHelpMan{"signmessage",
# 17 : 1615 : "\nSign a message with the private key of an address" +
# 18 : 1615 : HELP_REQUIRING_PASSPHRASE,
# 19 : 1615 : {
# 20 : 1615 : {"address", RPCArg::Type::STR, RPCArg::Optional::NO, "The bitcoin address to use for the private key."},
# 21 : 1615 : {"message", RPCArg::Type::STR, RPCArg::Optional::NO, "The message to create a signature of."},
# 22 : 1615 : },
# 23 : 1615 : RPCResult{
# 24 : 1615 : RPCResult::Type::STR, "signature", "The signature of the message encoded in base 64"
# 25 : 1615 : },
# 26 : 1615 : RPCExamples{
# 27 : 1615 : "\nUnlock the wallet for 30 seconds\n"
# 28 : 1615 : + HelpExampleCli("walletpassphrase", "\"mypassphrase\" 30") +
# 29 : 1615 : "\nCreate the signature\n"
# 30 : 1615 : + HelpExampleCli("signmessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\" \"my message\"") +
# 31 : 1615 : "\nVerify the signature\n"
# 32 : 1615 : + HelpExampleCli("verifymessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\" \"signature\" \"my message\"") +
# 33 : 1615 : "\nAs a JSON-RPC call\n"
# 34 : 1615 : + HelpExampleRpc("signmessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\", \"my message\"")
# 35 : 1615 : },
# 36 : 1615 : [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
# 37 : 1615 : {
# 38 : 26 : const std::shared_ptr<const CWallet> pwallet = GetWalletForJSONRPCRequest(request);
# 39 [ - + ]: 26 : if (!pwallet) return NullUniValue;
# 40 : :
# 41 : 26 : LOCK(pwallet->cs_wallet);
# 42 : :
# 43 : 26 : EnsureWalletIsUnlocked(*pwallet);
# 44 : :
# 45 : 26 : std::string strAddress = request.params[0].get_str();
# 46 : 26 : std::string strMessage = request.params[1].get_str();
# 47 : :
# 48 : 26 : CTxDestination dest = DecodeDestination(strAddress);
# 49 [ + + ]: 26 : if (!IsValidDestination(dest)) {
# 50 : 1 : throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid address");
# 51 : 1 : }
# 52 : :
# 53 : 25 : const PKHash* pkhash = std::get_if<PKHash>(&dest);
# 54 [ - + ]: 25 : if (!pkhash) {
# 55 : 0 : throw JSONRPCError(RPC_TYPE_ERROR, "Address does not refer to key");
# 56 : 0 : }
# 57 : :
# 58 : 25 : std::string signature;
# 59 : 25 : SigningResult err = pwallet->SignMessage(strMessage, *pkhash, signature);
# 60 [ - + ]: 25 : if (err == SigningResult::SIGNING_FAILED) {
# 61 : 0 : throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, SigningResultString(err));
# 62 [ - + ]: 25 : } else if (err != SigningResult::OK) {
# 63 : 0 : throw JSONRPCError(RPC_WALLET_ERROR, SigningResultString(err));
# 64 : 0 : }
# 65 : :
# 66 : 25 : return signature;
# 67 : 25 : },
# 68 : 1615 : };
# 69 : 1615 : }
# 70 : : } // namespace wallet
|