mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-11 14:38:29 +01:00
Deduplicate the message verifying code
The logic of verifying a message was duplicated in 2 places: src/qt/signverifymessagedialog.cpp SignVerifyMessageDialog::on_verifyMessageButton_VM_clicked() src/rpc/misc.cpp verifymessage() with the only difference being the result handling. Move the logic into a dedicated src/util/message.cpp MessageVerify() which returns a set of result codes, call it from the 2 places and just handle the results differently in the callers.
This commit is contained in:
@@ -11,7 +11,7 @@
|
||||
#include <qt/walletmodel.h>
|
||||
|
||||
#include <key_io.h>
|
||||
#include <util/validation.h> // For strMessageMagic
|
||||
#include <util/message.h> // For strMessageMagic, MessageVerify()
|
||||
#include <wallet/wallet.h>
|
||||
|
||||
#include <vector>
|
||||
@@ -189,51 +189,57 @@ void SignVerifyMessageDialog::on_addressBookButton_VM_clicked()
|
||||
|
||||
void SignVerifyMessageDialog::on_verifyMessageButton_VM_clicked()
|
||||
{
|
||||
CTxDestination destination = DecodeDestination(ui->addressIn_VM->text().toStdString());
|
||||
if (!IsValidDestination(destination)) {
|
||||
const std::string& address = ui->addressIn_VM->text().toStdString();
|
||||
const std::string& signature = ui->signatureIn_VM->text().toStdString();
|
||||
const std::string& message = ui->messageIn_VM->document()->toPlainText().toStdString();
|
||||
|
||||
const auto result = MessageVerify(address, signature, message);
|
||||
|
||||
if (result == MessageVerificationResult::OK) {
|
||||
ui->statusLabel_VM->setStyleSheet("QLabel { color: green; }");
|
||||
} else {
|
||||
ui->statusLabel_VM->setStyleSheet("QLabel { color: red; }");
|
||||
ui->statusLabel_VM->setText(tr("The entered address is invalid.") + QString(" ") + tr("Please check the address and try again."));
|
||||
return;
|
||||
}
|
||||
if (!boost::get<PKHash>(&destination)) {
|
||||
|
||||
switch (result) {
|
||||
case MessageVerificationResult::OK:
|
||||
ui->statusLabel_VM->setText(
|
||||
QString("<nobr>") + tr("Message verified.") + QString("</nobr>")
|
||||
);
|
||||
return;
|
||||
case MessageVerificationResult::ERR_INVALID_ADDRESS:
|
||||
ui->statusLabel_VM->setText(
|
||||
tr("The entered address is invalid.") + QString(" ") +
|
||||
tr("Please check the address and try again.")
|
||||
);
|
||||
return;
|
||||
case MessageVerificationResult::ERR_ADDRESS_NO_KEY:
|
||||
ui->addressIn_VM->setValid(false);
|
||||
ui->statusLabel_VM->setStyleSheet("QLabel { color: red; }");
|
||||
ui->statusLabel_VM->setText(tr("The entered address does not refer to a key.") + QString(" ") + tr("Please check the address and try again."));
|
||||
ui->statusLabel_VM->setText(
|
||||
tr("The entered address does not refer to a key.") + QString(" ") +
|
||||
tr("Please check the address and try again.")
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
bool fInvalid = false;
|
||||
std::vector<unsigned char> vchSig = DecodeBase64(ui->signatureIn_VM->text().toStdString().c_str(), &fInvalid);
|
||||
|
||||
if (fInvalid)
|
||||
{
|
||||
case MessageVerificationResult::ERR_MALFORMED_SIGNATURE:
|
||||
ui->signatureIn_VM->setValid(false);
|
||||
ui->statusLabel_VM->setStyleSheet("QLabel { color: red; }");
|
||||
ui->statusLabel_VM->setText(tr("The signature could not be decoded.") + QString(" ") + tr("Please check the signature and try again."));
|
||||
ui->statusLabel_VM->setText(
|
||||
tr("The signature could not be decoded.") + QString(" ") +
|
||||
tr("Please check the signature and try again.")
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
CHashWriter ss(SER_GETHASH, 0);
|
||||
ss << strMessageMagic;
|
||||
ss << ui->messageIn_VM->document()->toPlainText().toStdString();
|
||||
|
||||
CPubKey pubkey;
|
||||
if (!pubkey.RecoverCompact(ss.GetHash(), vchSig))
|
||||
{
|
||||
case MessageVerificationResult::ERR_PUBKEY_NOT_RECOVERED:
|
||||
ui->signatureIn_VM->setValid(false);
|
||||
ui->statusLabel_VM->setStyleSheet("QLabel { color: red; }");
|
||||
ui->statusLabel_VM->setText(tr("The signature did not match the message digest.") + QString(" ") + tr("Please check the signature and try again."));
|
||||
ui->statusLabel_VM->setText(
|
||||
tr("The signature did not match the message digest.") + QString(" ") +
|
||||
tr("Please check the signature and try again.")
|
||||
);
|
||||
return;
|
||||
case MessageVerificationResult::ERR_NOT_SIGNED:
|
||||
ui->statusLabel_VM->setText(
|
||||
QString("<nobr>") + tr("Message verification failed.") + QString("</nobr>")
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(CTxDestination(PKHash(pubkey)) == destination)) {
|
||||
ui->statusLabel_VM->setStyleSheet("QLabel { color: red; }");
|
||||
ui->statusLabel_VM->setText(QString("<nobr>") + tr("Message verification failed.") + QString("</nobr>"));
|
||||
return;
|
||||
}
|
||||
|
||||
ui->statusLabel_VM->setStyleSheet("QLabel { color: green; }");
|
||||
ui->statusLabel_VM->setText(QString("<nobr>") + tr("Message verified.") + QString("</nobr>"));
|
||||
}
|
||||
|
||||
void SignVerifyMessageDialog::on_clearButton_VM_clicked()
|
||||
|
||||
Reference in New Issue
Block a user