diff options
author | Jeffrey Czyz <jkczyz@gmail.com> | 2019-12-07 20:52:38 +0100 |
---|---|---|
committer | Vasil Dimov <vd@FreeBSD.org> | 2020-02-14 10:45:41 +0100 |
commit | e193a84fb28068e38d5f54fbfd6208428c5bb655 (patch) | |
tree | 3d9e920c26f874da2d9c06da07843d3fd15f4458 /src/util/message.cpp | |
parent | f8f0d9893d7969bdaa870fadb94ec5d0dfa8334d (diff) | |
download | bitcoin-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.cpp | 26 |
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(); +} |