aboutsummaryrefslogtreecommitdiff
path: root/src/util/message.cpp
diff options
context:
space:
mode:
authorJeffrey Czyz <jkczyz@gmail.com>2019-12-07 20:52:38 +0100
committerVasil Dimov <vd@FreeBSD.org>2020-02-14 10:45:41 +0100
commite193a84fb28068e38d5f54fbfd6208428c5bb655 (patch)
tree3d9e920c26f874da2d9c06da07843d3fd15f4458 /src/util/message.cpp
parentf8f0d9893d7969bdaa870fadb94ec5d0dfa8334d (diff)
downloadbitcoin-e193a84fb28068e38d5f54fbfd6208428c5bb655.tar.xz
Refactor message hashing into a utility function
And add unit test for it. The purpose of using a preamble or "magic" text as part of signing and verifying a message was not given when the code was repeated in a few locations. Make a test showing how it is used to prevent inadvertently signing a transaction.
Diffstat (limited to 'src/util/message.cpp')
-rw-r--r--src/util/message.cpp26
1 files changed, 15 insertions, 11 deletions
diff --git a/src/util/message.cpp b/src/util/message.cpp
index 22ace2dd75..17603a43d2 100644
--- a/src/util/message.cpp
+++ b/src/util/message.cpp
@@ -15,7 +15,11 @@
#include <string>
#include <vector>
-const std::string strMessageMagic = "Bitcoin Signed Message:\n";
+/**
+ * Text used to signify that a signed message follows and to prevent
+ * inadvertently signing a transaction.
+ */
+const std::string MESSAGE_MAGIC = "Bitcoin Signed Message:\n";
MessageVerificationResult MessageVerify(
const std::string& address,
@@ -37,12 +41,8 @@ MessageVerificationResult MessageVerify(
return MessageVerificationResult::ERR_MALFORMED_SIGNATURE;
}
- CHashWriter ss(SER_GETHASH, 0);
- ss << strMessageMagic;
- ss << message;
-
CPubKey pubkey;
- if (!pubkey.RecoverCompact(ss.GetHash(), signature_bytes)) {
+ if (!pubkey.RecoverCompact(MessageHash(message), signature_bytes)) {
return MessageVerificationResult::ERR_PUBKEY_NOT_RECOVERED;
}
@@ -58,13 +58,9 @@ bool MessageSign(
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)) {
+ if (!privkey.SignCompact(MessageHash(message), signature_bytes)) {
return false;
}
@@ -72,3 +68,11 @@ bool MessageSign(
return true;
}
+
+uint256 MessageHash(const std::string& message)
+{
+ CHashWriter hasher(SER_GETHASH, 0);
+ hasher << MESSAGE_MAGIC << message;
+
+ return hasher.GetHash();
+}