aboutsummaryrefslogtreecommitdiff
path: root/src/util
diff options
context:
space:
mode:
authorVasil Dimov <vd@FreeBSD.org>2019-11-22 17:17:29 +0100
committerVasil Dimov <vd@FreeBSD.org>2020-02-14 10:45:40 +0100
commitf8f0d9893d7969bdaa870fadb94ec5d0dfa8334d (patch)
tree21484d5e11ebf6cf1f707805ce766b397637beba /src/util
parent2ce3447eb1e25ec7aec4b300dabf6c1e394f1906 (diff)
downloadbitcoin-f8f0d9893d7969bdaa870fadb94ec5d0dfa8334d.tar.xz
Deduplicate the message signing code
The logic of signing a message was duplicated in 3 places: src/qt/signverifymessagedialog.cpp SignVerifyMessageDialog::on_signMessageButton_SM_clicked() src/rpc/misc.cpp signmessagewithprivkey() src/wallet/rpcwallet.cpp signmessage() Move the logic into src/util/message.cpp MessageSign() and call it from all the 3 places.
Diffstat (limited to 'src/util')
-rw-r--r--src/util/message.cpp21
-rw-r--r--src/util/message.h12
2 files changed, 33 insertions, 0 deletions
diff --git a/src/util/message.cpp b/src/util/message.cpp
index 33e9c3384b..22ace2dd75 100644
--- a/src/util/message.cpp
+++ b/src/util/message.cpp
@@ -4,6 +4,7 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <hash.h> // For CHashWriter
+#include <key.h> // For CKey
#include <key_io.h> // For DecodeDestination()
#include <pubkey.h> // For CPubKey
#include <script/standard.h> // For CTxDestination, IsValidDestination(), PKHash
@@ -51,3 +52,23 @@ MessageVerificationResult MessageVerify(
return MessageVerificationResult::OK;
}
+
+bool MessageSign(
+ const CKey& privkey,
+ const std::string& message,
+ std::string& signature)
+{
+ CHashWriter ss(SER_GETHASH, 0);
+ ss << strMessageMagic;
+ ss << message;
+
+ std::vector<unsigned char> signature_bytes;
+
+ if (!privkey.SignCompact(ss.GetHash(), signature_bytes)) {
+ return false;
+ }
+
+ signature = EncodeBase64(signature_bytes.data(), signature_bytes.size());
+
+ return true;
+}
diff --git a/src/util/message.h b/src/util/message.h
index 6adda5d3ff..1a1ba88daf 100644
--- a/src/util/message.h
+++ b/src/util/message.h
@@ -6,6 +6,8 @@
#ifndef BITCOIN_UTIL_MESSAGE_H
#define BITCOIN_UTIL_MESSAGE_H
+#include <key.h> // For CKey
+
#include <string>
extern const std::string strMessageMagic;
@@ -46,4 +48,14 @@ MessageVerificationResult MessageVerify(
const std::string& signature,
const std::string& message);
+/** Sign a message.
+ * @param[in] privkey Private key to sign with.
+ * @param[in] message The message to sign.
+ * @param[out] signature Signature, base64 encoded, only set if true is returned.
+ * @return true if signing was successful. */
+bool MessageSign(
+ const CKey& privkey,
+ const std::string& message,
+ std::string& signature);
+
#endif // BITCOIN_UTIL_MESSAGE_H