From ea25b71ca66a7d81203bbfed7fa1a1d6fa79553f Mon Sep 17 00:00:00 2001 From: xiphon Date: Tue, 14 Apr 2020 21:03:15 +0000 Subject: updater: fetch signed hashes from getmonero.org, verify downloads --- src/qt/updater.cpp | 55 +++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 46 insertions(+), 9 deletions(-) (limited to 'src/qt/updater.cpp') 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 +#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 Updater::verifySignaturesAndHashSum( +QByteArray Updater::fetchSignedHash( + const QString &binaryFilename, + const QByteArray &hashFromDns, + QPair &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 &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( reinterpret_cast(armoredSignedHashes.data()), armoredSignedHashes.size()), @@ -57,19 +82,31 @@ QPair Updater::verifySignaturesAndHashSum( reinterpret_cast(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 Updater::verifySignaturesAndHashSum( + const QByteArray &armoredSignedHashes, + const QByteArray &secondDetachedSignature, + const QString &binaryFilename, + const void *binaryData, + size_t binarySize) const +{ + QPair 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 -- cgit v1.2.3