-
Notifications
You must be signed in to change notification settings - Fork 36.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
BIP-322 basic support #24058
BIP-322 basic support #24058
Changes from all commits
3a5816f
f0af8bd
cf2d75f
35cf639
b08d75d
3b00ed9
f57ed58
b32c238
69bd3c4
b8a55e2
63a2f59
de070b3
29b28d0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -49,9 +49,16 @@ static RPCHelpMan verifymessage() | |
throw JSONRPCError(RPC_TYPE_ERROR, "Address does not refer to key"); | ||
case MessageVerificationResult::ERR_MALFORMED_SIGNATURE: | ||
throw JSONRPCError(RPC_TYPE_ERROR, "Malformed base64 encoding"); | ||
case MessageVerificationResult::ERR_POF: | ||
throw JSONRPCError(RPC_TYPE_ERROR, "BIP-322 Proof of funds is not yet supported"); // TODO: get access to UTXO set / mempool to handle this, then remove this error code? | ||
case MessageVerificationResult::INCONCLUSIVE: | ||
return false; // TODO: switch to a string based result? mix bool and strings? | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. In 30642a1 "message: add BIP-322 verification support (without POF)" This could just fallthrough to the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The idea is that the |
||
case MessageVerificationResult::ERR_INVALID: | ||
case MessageVerificationResult::ERR_PUBKEY_NOT_RECOVERED: | ||
case MessageVerificationResult::ERR_NOT_SIGNED: | ||
return false; | ||
case MessageVerificationResult::OK_TIMELOCKED: | ||
// TODO: switch to string based result? mix bool and strings? | ||
case MessageVerificationResult::OK: | ||
return true; | ||
} | ||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -8,6 +8,8 @@ | |||||||||||||||||||||||||||||||||||||||||
#include <fs.h> | ||||||||||||||||||||||||||||||||||||||||||
#include <hash.h> // For Hash() | ||||||||||||||||||||||||||||||||||||||||||
#include <key.h> // For CKey | ||||||||||||||||||||||||||||||||||||||||||
#include <key_io.h> // EncodeDestination | ||||||||||||||||||||||||||||||||||||||||||
#include <outputtype.h> // For BIP-322 tests | ||||||||||||||||||||||||||||||||||||||||||
#include <sync.h> | ||||||||||||||||||||||||||||||||||||||||||
#include <test/util/logging.h> | ||||||||||||||||||||||||||||||||||||||||||
#include <test/util/setup_common.h> | ||||||||||||||||||||||||||||||||||||||||||
|
@@ -2605,23 +2607,55 @@ BOOST_AUTO_TEST_CASE(message_sign) | |||||||||||||||||||||||||||||||||||||||||
"Sign with a valid private key"); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
BOOST_CHECK_EQUAL(expected_signature, generated_signature); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
// BIP-322 tests | ||||||||||||||||||||||||||||||||||||||||||
// (no signing done here, as we need a wallet to do so) | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
auto pubkey = privkey.GetPubKey(); | ||||||||||||||||||||||||||||||||||||||||||
MessageVerificationResult mvr{MessageVerificationResult::OK}; | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
// LEGACY pubkey type | ||||||||||||||||||||||||||||||||||||||||||
auto dest_legacy = GetDestinationForKey(pubkey, OutputType::LEGACY); | ||||||||||||||||||||||||||||||||||||||||||
BOOST_CHECK_EQUAL("15CRxFdyRpGZLW9w8HnHvVduizdL5jKNbs", EncodeDestination(dest_legacy)); | ||||||||||||||||||||||||||||||||||||||||||
auto txs_legacy = BIP322Txs::Create(dest_legacy, message, mvr); | ||||||||||||||||||||||||||||||||||||||||||
if (!txs_legacy || mvr != MessageVerificationResult::OK) { | ||||||||||||||||||||||||||||||||||||||||||
BOOST_FAIL("Failed to create BIP-322 txs for legacy address"); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
// P2SH_SEGWIT pubkey type | ||||||||||||||||||||||||||||||||||||||||||
auto dest_p2sh_segwit = GetDestinationForKey(pubkey, OutputType::P2SH_SEGWIT); | ||||||||||||||||||||||||||||||||||||||||||
BOOST_CHECK_EQUAL("35uijJkf4rcCnGzEZsn12YJenTHToDKpr2", EncodeDestination(dest_p2sh_segwit)); | ||||||||||||||||||||||||||||||||||||||||||
auto txs_p2sh_segwit = BIP322Txs::Create(dest_p2sh_segwit, message, mvr); | ||||||||||||||||||||||||||||||||||||||||||
if (!txs_p2sh_segwit || mvr != MessageVerificationResult::OK) { | ||||||||||||||||||||||||||||||||||||||||||
BOOST_FAIL("Failed to create BIP-322 txs for p2sh-segwit address"); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
// BECH32 | ||||||||||||||||||||||||||||||||||||||||||
auto dest_bech32 = GetDestinationForKey(pubkey, OutputType::BECH32); | ||||||||||||||||||||||||||||||||||||||||||
BOOST_CHECK_EQUAL("bc1q9cy7s7nmzah0m6mt2ftmu6x723esjxqkkl4wsw", EncodeDestination(dest_bech32)); | ||||||||||||||||||||||||||||||||||||||||||
auto txs_bech32 = BIP322Txs::Create(dest_bech32, message, mvr); | ||||||||||||||||||||||||||||||||||||||||||
if (!txs_bech32 || mvr != MessageVerificationResult::OK) { | ||||||||||||||||||||||||||||||||||||||||||
BOOST_FAIL("Failed to create BIP-322 txs for bech32 address"); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
// TODO: BECH32M | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
BOOST_AUTO_TEST_CASE(message_verify) | ||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||
BOOST_CHECK_EQUAL( | ||||||||||||||||||||||||||||||||||||||||||
MessageVerify( | ||||||||||||||||||||||||||||||||||||||||||
"invalid address", | ||||||||||||||||||||||||||||||||||||||||||
"signature should be irrelevant", | ||||||||||||||||||||||||||||||||||||||||||
"AA==", | ||||||||||||||||||||||||||||||||||||||||||
"message too"), | ||||||||||||||||||||||||||||||||||||||||||
MessageVerificationResult::ERR_INVALID_ADDRESS); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
BOOST_CHECK_EQUAL( | ||||||||||||||||||||||||||||||||||||||||||
MessageVerify( | ||||||||||||||||||||||||||||||||||||||||||
"3B5fQsEXEaV8v6U3ejYc8XaKXAkyQj2MjV", | ||||||||||||||||||||||||||||||||||||||||||
"signature should be irrelevant", | ||||||||||||||||||||||||||||||||||||||||||
"AA==", | ||||||||||||||||||||||||||||||||||||||||||
"message too"), | ||||||||||||||||||||||||||||||||||||||||||
MessageVerificationResult::ERR_ADDRESS_NO_KEY); | ||||||||||||||||||||||||||||||||||||||||||
MessageVerificationResult::ERR_INVALID /* ERR_ADDRESS_NO_KEY */); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
BOOST_CHECK_EQUAL( | ||||||||||||||||||||||||||||||||||||||||||
MessageVerify( | ||||||||||||||||||||||||||||||||||||||||||
|
@@ -2635,7 +2669,7 @@ BOOST_AUTO_TEST_CASE(message_verify) | |||||||||||||||||||||||||||||||||||||||||
"1KqbBpLy5FARmTPD4VZnDDpYjkUvkr82Pm", | ||||||||||||||||||||||||||||||||||||||||||
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", | ||||||||||||||||||||||||||||||||||||||||||
"message should be irrelevant"), | ||||||||||||||||||||||||||||||||||||||||||
MessageVerificationResult::ERR_PUBKEY_NOT_RECOVERED); | ||||||||||||||||||||||||||||||||||||||||||
MessageVerificationResult::ERR_INVALID /* ERR_PUBKEY_NOT_RECOVERED */); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
BOOST_CHECK_EQUAL( | ||||||||||||||||||||||||||||||||||||||||||
MessageVerify( | ||||||||||||||||||||||||||||||||||||||||||
|
@@ -2657,6 +2691,124 @@ BOOST_AUTO_TEST_CASE(message_verify) | |||||||||||||||||||||||||||||||||||||||||
"IIcaIENoYW5jZWxsb3Igb24gYnJpbmsgb2Ygc2Vjb25kIGJhaWxvdXQgZm9yIGJhbmtzIAaHRtbCeDZINyavx14=", | ||||||||||||||||||||||||||||||||||||||||||
"Trust me"), | ||||||||||||||||||||||||||||||||||||||||||
MessageVerificationResult::OK); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
// BIP-322 tests | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
// privkey: L3VFeEujGtevx9w18HD1fhRbCH67Az2dpCymeRE1SoPK6XQtaN2k | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
BOOST_CHECK_EQUAL( | ||||||||||||||||||||||||||||||||||||||||||
MessageVerify( | ||||||||||||||||||||||||||||||||||||||||||
"bc1q9vza2e8x573nczrlzms0wvx3gsqjx7vavgkx0l", | ||||||||||||||||||||||||||||||||||||||||||
"AkcwRAIgM2gBAQqvZX15ZiysmKmQpDrG83avLIT492QBzLnQIxYCIBaTpOaD20qRlEylyxFSeEA2ba9YOixpX8z46TSDtS40ASECx/EgAxlkQpQ9hYjgGu6EBCPMVPwVIVJqO4XCsMvViHI=", | ||||||||||||||||||||||||||||||||||||||||||
""), | ||||||||||||||||||||||||||||||||||||||||||
MessageVerificationResult::OK); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
BOOST_CHECK_EQUAL( | ||||||||||||||||||||||||||||||||||||||||||
MessageVerify( | ||||||||||||||||||||||||||||||||||||||||||
"bc1q9vza2e8x573nczrlzms0wvx3gsqjx7vavgkx0l", | ||||||||||||||||||||||||||||||||||||||||||
"AkcwRAIgZRfIY3p7/DoVTty6YZbWS71bc5Vct9p9Fia83eRmw2QCICK/ENGfwLtptFluMGs2KsqoNSk89pO7F29zJLUx9a/sASECx/EgAxlkQpQ9hYjgGu6EBCPMVPwVIVJqO4XCsMvViHI=", | ||||||||||||||||||||||||||||||||||||||||||
"Hello World"), | ||||||||||||||||||||||||||||||||||||||||||
MessageVerificationResult::OK); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
kallewoof marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||
// BIP322 signature created using buidl-python library with same parameters as test on line 2596 | ||||||||||||||||||||||||||||||||||||||||||
BOOST_CHECK_EQUAL( | ||||||||||||||||||||||||||||||||||||||||||
MessageVerify( | ||||||||||||||||||||||||||||||||||||||||||
"bc1q9vza2e8x573nczrlzms0wvx3gsqjx7vavgkx0l", | ||||||||||||||||||||||||||||||||||||||||||
"AkgwRQIhAOzyynlqt93lOKJr+wmmxIens//zPzl9tqIOua93wO6MAiBi5n5EyAcPScOjf1lAqIUIQtr3zKNeavYabHyR8eGhowEhAsfxIAMZZEKUPYWI4BruhAQjzFT8FSFSajuFwrDL1Yhy", | ||||||||||||||||||||||||||||||||||||||||||
"Hello World"), | ||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+2717
to
+2718
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I get this value in my implementation, yet it is not reflected in the BIP |
||||||||||||||||||||||||||||||||||||||||||
MessageVerificationResult::OK); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
kallewoof marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||
// 2-of-3 p2sh multisig BIP322 signature (created with the buidl-python library) | ||||||||||||||||||||||||||||||||||||||||||
// Keys are defined as (HDRootWIF, bip322_path) | ||||||||||||||||||||||||||||||||||||||||||
// Key1 (L4DksdGZ4KQJfcLHD5Dv25fu8Rxyv7hHi2RjZR4TYzr8c6h9VNrp, m/45'/0/0/1) | ||||||||||||||||||||||||||||||||||||||||||
// Key2 (KzSRqnCVwjzY8id2X5oHEJWXkSHwKUYaAXusjwgkES8BuQPJnPNu, m/45'/0/0/3) | ||||||||||||||||||||||||||||||||||||||||||
// Key3 (L1zt9Rw7HrU7jaguMbVzhiX8ffuVkmMis5wLHddXYuHWYf8u8uRj, m/45'/0/0/6) | ||||||||||||||||||||||||||||||||||||||||||
// BIP322 includes signs from Key2 and Key3 | ||||||||||||||||||||||||||||||||||||||||||
BOOST_CHECK_EQUAL( | ||||||||||||||||||||||||||||||||||||||||||
MessageVerify( | ||||||||||||||||||||||||||||||||||||||||||
"3LnYoUkFrhyYP3V7rq3mhpwALz1XbCY9Uq", | ||||||||||||||||||||||||||||||||||||||||||
"AAAAAAHNcfHaNfl8f/+ZC2gTr8aF+0KgppYjKM94egaNm/u1ZAAAAAD8AEcwRAIhAJ6hdj61vLDP+aFa30qUZQmrbBfE0kiOObYvt5nqPSxsAh9IrOKFwflfPRUcQ/5e0REkdFHVP2GGdUsMgDet+sNlAUcwRAIgH3eW/VyFDoXvCasd8qxgwj5NDVo0weXvM6qyGXLCR5YCIEwjbEV6fS6RWP6QsKOcMwvlGr1/SgdCC6pW4eH87/YgAUxpUiECKJfGy28imLcuAeNBLHCNv3NRP5jnJwFDNRXCYNY/vJ4hAv1RQtaZs7+vKqQeWl2rb/jd/gMxkEjUnjZdDGPDZkMLIQL65cH2X5O7LujjTLDL2l8Pxy0Y2UUR99u1qCfjdz7dklOuAAAAAAEAAAAAAAAAAAFqAAAAAA==", | ||||||||||||||||||||||||||||||||||||||||||
"This will be a p2sh 2-of-3 multisig BIP 322 signed message"), | ||||||||||||||||||||||||||||||||||||||||||
MessageVerificationResult::OK); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
// 3-of-3 p2wsh multisig BIP322 signature (created with the buidl-python library) | ||||||||||||||||||||||||||||||||||||||||||
// Keys are defined as (HDRootWIF, bip322_path) | ||||||||||||||||||||||||||||||||||||||||||
// Key1 (L4DksdGZ4KQJfcLHD5Dv25fu8Rxyv7hHi2RjZR4TYzr8c6h9VNrp, m/45'/0/0/6) | ||||||||||||||||||||||||||||||||||||||||||
// Key2 (KzSRqnCVwjzY8id2X5oHEJWXkSHwKUYaAXusjwgkES8BuQPJnPNu, m/45'/0/0/9) | ||||||||||||||||||||||||||||||||||||||||||
// Key3 (L1zt9Rw7HrU7jaguMbVzhiX8ffuVkmMis5wLHddXYuHWYf8u8uRj, m/45'/0/0/11) | ||||||||||||||||||||||||||||||||||||||||||
BOOST_CHECK_EQUAL( | ||||||||||||||||||||||||||||||||||||||||||
MessageVerify( | ||||||||||||||||||||||||||||||||||||||||||
"bc1qlqtuzpmazp2xmcutlwv0qvggdvem8vahkc333usey4gskug8nutsz53msw", "BQBIMEUCIQDQoXvGKLH58exuujBOta+7+GN7vi0lKwiQxzBpuNuXuAIgIE0XYQlFDOfxbegGYYzlf+tqegleAKE6SXYIa1U+uCcBRzBEAiATegywVl6GWrG9jJuPpNwtgHKyVYCX2yfuSSDRFATAaQIgTLlU6reLQsSIrQSF21z3PtUO2yAUseUWGZqRUIE7VKoBSDBFAiEAgxtpidsU0Z4u/+5RB9cyeQtoCW5NcreLJmWXZ8kXCZMCIBR1sXoEinhZE4CF9P9STGIcMvCuZjY6F5F0XTVLj9SjAWlTIQP3dyWvTZjUENWJowMWBsQrrXCUs20Gu5YF79CG5Ga0XSEDwqI5GVBOuFkFzQOGH5eTExSAj2Z/LDV/hbcvAPQdlJMhA17FuuJd+4wGuj+ZbVxEsFapTKAOwyhfw9qpch52JKxbU64=", | ||||||||||||||||||||||||||||||||||||||||||
"This will be a p2wsh 3-of-3 multisig BIP 322 signed message"), | ||||||||||||||||||||||||||||||||||||||||||
MessageVerificationResult::OK); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
// Single key p2tr BIP322 signature (created with the buidl-python library) | ||||||||||||||||||||||||||||||||||||||||||
// PrivateKeyWIF L3VFeEujGtevx9w18HD1fhRbCH67Az2dpCymeRE1SoPK6XQtaN2k | ||||||||||||||||||||||||||||||||||||||||||
BOOST_CHECK_EQUAL( | ||||||||||||||||||||||||||||||||||||||||||
MessageVerify( | ||||||||||||||||||||||||||||||||||||||||||
"bc1ppv609nr0vr25u07u95waq5lucwfm6tde4nydujnu8npg4q75mr5sxq8lt3", | ||||||||||||||||||||||||||||||||||||||||||
"AUHd69PrJQEv+oKTfZ8l+WROBHuy9HKrbFCJu7U1iK2iiEy1vMU5EfMtjc+VSHM7aU0SDbak5IUZRVno2P5mjSafAQ==", | ||||||||||||||||||||||||||||||||||||||||||
"Hello World"), | ||||||||||||||||||||||||||||||||||||||||||
MessageVerificationResult::OK); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
// Same p2tr BIP322 signature as above (created with the buidl-python library) | ||||||||||||||||||||||||||||||||||||||||||
// Signature should not verify against the message | ||||||||||||||||||||||||||||||||||||||||||
BOOST_CHECK_EQUAL( | ||||||||||||||||||||||||||||||||||||||||||
MessageVerify( | ||||||||||||||||||||||||||||||||||||||||||
"bc1ppv609nr0vr25u07u95waq5lucwfm6tde4nydujnu8npg4q75mr5sxq8lt3", | ||||||||||||||||||||||||||||||||||||||||||
"AUHd69PrJQEv+oKTfZ8l+WROBHuy9HKrbFCJu7U1iK2iiEy1vMU5EfMtjc+VSHM7aU0SDbak5IUZRVno2P5mjSafAQ==", | ||||||||||||||||||||||||||||||||||||||||||
"Hello World - This should fail"), | ||||||||||||||||||||||||||||||||||||||||||
MessageVerificationResult::ERR_INVALID); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
// wrong address | ||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is a test case that demonstrates the issue with taproot signatures that @richerandprettier refers to. It seems that p2tr signatures validate against any message under the current impl. Is there some extra configuration required to setup bitcoin with schnorr & taproot, wondering if these sigs are processed at all? I ran this against the buidl-python code - buidl-bitcoin/buidl-python#140 - and get the expected results. Will dig into the code when i get some time.
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks for the test! Immensely helpful. Looking into what's causing the issue now. |
||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
BOOST_CHECK_EQUAL( | ||||||||||||||||||||||||||||||||||||||||||
MessageVerify( | ||||||||||||||||||||||||||||||||||||||||||
"bc1qkecg9ly2xwxqgdy9egpuy87qc9x26smpts562s", | ||||||||||||||||||||||||||||||||||||||||||
"AkcwRAIgM2gBAQqvZX15ZiysmKmQpDrG83avLIT492QBzLnQIxYCIBaTpOaD20qRlEylyxFSeEA2ba9YOixpX8z46TSDtS40ASECx/EgAxlkQpQ9hYjgGu6EBCPMVPwVIVJqO4XCsMvViHI=", | ||||||||||||||||||||||||||||||||||||||||||
""), | ||||||||||||||||||||||||||||||||||||||||||
MessageVerificationResult::ERR_INVALID); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
BOOST_CHECK_EQUAL( | ||||||||||||||||||||||||||||||||||||||||||
MessageVerify( | ||||||||||||||||||||||||||||||||||||||||||
"bc1qkecg9ly2xwxqgdy9egpuy87qc9x26smpts562s", | ||||||||||||||||||||||||||||||||||||||||||
"AkcwRAIgZRfIY3p7/DoVTty6YZbWS71bc5Vct9p9Fia83eRmw2QCICK/ENGfwLtptFluMGs2KsqoNSk89pO7F29zJLUx9a/sASECx/EgAxlkQpQ9hYjgGu6EBCPMVPwVIVJqO4XCsMvViHI=", | ||||||||||||||||||||||||||||||||||||||||||
"Hello World"), | ||||||||||||||||||||||||||||||||||||||||||
MessageVerificationResult::ERR_INVALID); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
// wrong signature / message (signatures swapped) | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
BOOST_CHECK_EQUAL( | ||||||||||||||||||||||||||||||||||||||||||
MessageVerify( | ||||||||||||||||||||||||||||||||||||||||||
"bc1q9vza2e8x573nczrlzms0wvx3gsqjx7vavgkx0l", | ||||||||||||||||||||||||||||||||||||||||||
"AkcwRAIgZRfIY3p7/DoVTty6YZbWS71bc5Vct9p9Fia83eRmw2QCICK/ENGfwLtptFluMGs2KsqoNSk89pO7F29zJLUx9a/sASECx/EgAxlkQpQ9hYjgGu6EBCPMVPwVIVJqO4XCsMvViHI=", | ||||||||||||||||||||||||||||||||||||||||||
""), | ||||||||||||||||||||||||||||||||||||||||||
MessageVerificationResult::ERR_INVALID); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
BOOST_CHECK_EQUAL( | ||||||||||||||||||||||||||||||||||||||||||
MessageVerify( | ||||||||||||||||||||||||||||||||||||||||||
"bc1q9vza2e8x573nczrlzms0wvx3gsqjx7vavgkx0l", | ||||||||||||||||||||||||||||||||||||||||||
"AkcwRAIgM2gBAQqvZX15ZiysmKmQpDrG83avLIT492QBzLnQIxYCIBaTpOaD20qRlEylyxFSeEA2ba9YOixpX8z46TSDtS40ASECx/EgAxlkQpQ9hYjgGu6EBCPMVPwVIVJqO4XCsMvViHI=", | ||||||||||||||||||||||||||||||||||||||||||
"Hello World"), | ||||||||||||||||||||||||||||||||||||||||||
MessageVerificationResult::ERR_INVALID); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
// invalid address | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
BOOST_CHECK_EQUAL( | ||||||||||||||||||||||||||||||||||||||||||
MessageVerify( | ||||||||||||||||||||||||||||||||||||||||||
"bc1q9vza2e8x573nczrlzms0wvx3gsqjx7vavgkx1l", | ||||||||||||||||||||||||||||||||||||||||||
"AkcwRAIgM2gBAQqvZX15ZiysmKmQpDrG83avLIT492QBzLnQIxYCIBaTpOaD20qRlEylyxFSeEA2ba9YOixpX8z46TSDtS40ASECx/EgAxlkQpQ9hYjgGu6EBCPMVPwVIVJqO4XCsMvViHI=", | ||||||||||||||||||||||||||||||||||||||||||
""), | ||||||||||||||||||||||||||||||||||||||||||
MessageVerificationResult::ERR_INVALID_ADDRESS); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
// malformed signature | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
BOOST_CHECK_EQUAL( | ||||||||||||||||||||||||||||||||||||||||||
MessageVerify( | ||||||||||||||||||||||||||||||||||||||||||
"bc1q9vza2e8x573nczrlzms0wvx3gsqjx7vavgkx0l", | ||||||||||||||||||||||||||||||||||||||||||
"AkcwRAIgClVQ8S9yX1h8YThlGElD9lOrQbOwbFDjkYb0ebfiq+oCIDHgb/X9WNalNNtqTXb465ufbv9JuLxcJf8qi7DP6yOXASECx/EgAxlkQpQ9hYjgGu6EBCPMVPwVIVJqO4XCsMvViHI", | ||||||||||||||||||||||||||||||||||||||||||
""), | ||||||||||||||||||||||||||||||||||||||||||
MessageVerificationResult::ERR_MALFORMED_SIGNATURE); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
BOOST_AUTO_TEST_CASE(message_hash) | ||||||||||||||||||||||||||||||||||||||||||
|
@@ -2670,10 +2822,20 @@ BOOST_AUTO_TEST_CASE(message_hash) | |||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
const uint256 signature_hash = Hash(unsigned_tx); | ||||||||||||||||||||||||||||||||||||||||||
const uint256 message_hash1 = Hash(prefixed_message); | ||||||||||||||||||||||||||||||||||||||||||
const uint256 message_hash2 = MessageHash(unsigned_tx); | ||||||||||||||||||||||||||||||||||||||||||
const uint256 message_hash2 = MessageHash(unsigned_tx, MessageSignatureFormat::LEGACY); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
BOOST_CHECK_EQUAL(message_hash1, message_hash2); | ||||||||||||||||||||||||||||||||||||||||||
BOOST_CHECK_NE(message_hash1, signature_hash); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
// BIP-322 tests | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
const uint256 signature_hash_0x = MessageHash("", MessageSignatureFormat::FULL); | ||||||||||||||||||||||||||||||||||||||||||
const uint256 signature_hash_Hello_World = MessageHash("Hello World", MessageSignatureFormat::FULL); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
std::vector<unsigned char> vec(signature_hash_0x.begin(), signature_hash_0x.end()); | ||||||||||||||||||||||||||||||||||||||||||
BOOST_CHECK_EQUAL("c90c269c4f8fcbe6880f72a721ddfbf1914268a794cbb21cfafee13770ae19f1", HexStr(vec)); | ||||||||||||||||||||||||||||||||||||||||||
vec = std::vector<unsigned char>(signature_hash_Hello_World.begin(), signature_hash_Hello_World.end()); | ||||||||||||||||||||||||||||||||||||||||||
BOOST_CHECK_EQUAL("f0eb03b1a75ac6d9847f55c624a99169b5dccba2a31f5b23bea77ba270de0a7a", HexStr(vec)); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
BOOST_AUTO_TEST_CASE(remove_prefix) | ||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In 8f9c561 "add basic BIP-322 message signing support"
I think this should just be
Message verification failed
. It could passthrough to theERR_NOT_SIGNED
result.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would like to avoid using the same message for different errors, as it makes troubleshooting more difficult. That said, maybe "Some check failed" is not the right wording here...