aboutsummaryrefslogtreecommitdiff
path: root/src/qt/updater.cpp
diff options
context:
space:
mode:
authorxiphon <xiphon@protonmail.com>2020-04-14 21:03:15 +0000
committerxiphon <xiphon@protonmail.com>2020-04-14 21:37:04 +0000
commitea25b71ca66a7d81203bbfed7fa1a1d6fa79553f (patch)
tree40bfaac76cba0e0f68a7b1e2b79cec0eab4841d6 /src/qt/updater.cpp
parent8e4124f06aa6c580ee62dd1b78735bc488e21366 (diff)
downloadmonzero-gui-ea25b71ca66a7d81203bbfed7fa1a1d6fa79553f.tar.gz
monzero-gui-ea25b71ca66a7d81203bbfed7fa1a1d6fa79553f.tar.xz
monzero-gui-ea25b71ca66a7d81203bbfed7fa1a1d6fa79553f.zip
updater: fetch signed hashes from getmonero.org, verify downloads
Diffstat (limited to 'src/qt/updater.cpp')
-rw-r--r--src/qt/updater.cpp55
1 files changed, 46 insertions, 9 deletions
diff --git a/src/qt/updater.cpp b/src/qt/updater.cpp
index 5968c2b5..17d6eddb 100644
--- a/src/qt/updater.cpp
+++ b/src/qt/updater.cpp
@@ -30,6 +30,7 @@
#include <openpgp/hash.h>
+#include "network.h"
#include "utils.h"
Updater::Updater()
@@ -39,17 +40,41 @@ Updater::Updater()
m_maintainers.emplace_back(fileGetContents(":/monero/utils/gpg_keys/luigi1111.asc").toStdString());
}
-QPair<QString, QString> Updater::verifySignaturesAndHashSum(
+QByteArray Updater::fetchSignedHash(
+ const QString &binaryFilename,
+ const QByteArray &hashFromDns,
+ QPair<QString, QString> &signers) const
+{
+ static constexpr const char hashesTxtUrl[] = "https://web.getmonero.org/downloads/hashes.txt";
+ static constexpr const char hashesTxtSigUrl[] = "https://web.getmonero.org/downloads/hashes.txt.sig";
+
+ const Network network;
+ std::string hashesTxt = network.get(hashesTxtUrl);
+ std::string hashesTxtSig = network.get(hashesTxtSigUrl);
+
+ const QByteArray signedHash = verifyParseSignedHahes(
+ QByteArray(&hashesTxt[0], hashesTxt.size()),
+ QByteArray(&hashesTxtSig[0], hashesTxtSig.size()),
+ binaryFilename,
+ signers);
+
+ if (signedHash != hashFromDns)
+ {
+ throw std::runtime_error("DNS hash mismatch");
+ }
+
+ return signedHash;
+}
+
+QByteArray Updater::verifyParseSignedHahes(
const QByteArray &armoredSignedHashes,
const QByteArray &secondDetachedSignature,
const QString &binaryFilename,
- const void *binaryData,
- size_t binarySize) const
+ QPair<QString, QString> &signers) const
{
- QString firstSigner;
- const QString signedMessage = verifySignature(armoredSignedHashes, firstSigner);
+ const QString signedMessage = verifySignature(armoredSignedHashes, signers.first);
- QString secondSigner = verifySignature(
+ signers.second = verifySignature(
epee::span<const uint8_t>(
reinterpret_cast<const uint8_t *>(armoredSignedHashes.data()),
armoredSignedHashes.size()),
@@ -57,19 +82,31 @@ QPair<QString, QString> Updater::verifySignaturesAndHashSum(
reinterpret_cast<const uint8_t *>(secondDetachedSignature.data()),
secondDetachedSignature.size())));
- if (firstSigner == secondSigner)
+ if (signers.first == signers.second)
{
throw std::runtime_error("both signatures were generated by the same person");
}
- const QByteArray signedHash = parseShasumOutput(signedMessage, binaryFilename);
+ return parseShasumOutput(signedMessage, binaryFilename);
+}
+
+QPair<QString, QString> Updater::verifySignaturesAndHashSum(
+ const QByteArray &armoredSignedHashes,
+ const QByteArray &secondDetachedSignature,
+ const QString &binaryFilename,
+ const void *binaryData,
+ size_t binarySize) const
+{
+ QPair<QString, QString> signers;
+ const QByteArray signedHash =
+ verifyParseSignedHahes(armoredSignedHashes, secondDetachedSignature, binaryFilename, signers);
const QByteArray calculatedHash = getHash(binaryData, binarySize);
if (signedHash != calculatedHash)
{
throw std::runtime_error("hash sum mismatch");
}
- return {firstSigner, secondSigner};
+ return signers;
}
QByteArray Updater::getHash(const void *data, size_t size) const