diff options
| author | xiphon <xiphon@protonmail.com> | 2020-04-14 21:03:15 +0000 |
|---|---|---|
| committer | xiphon <xiphon@protonmail.com> | 2020-04-14 21:37:04 +0000 |
| commit | ea25b71ca66a7d81203bbfed7fa1a1d6fa79553f (patch) | |
| tree | 40bfaac76cba0e0f68a7b1e2b79cec0eab4841d6 /src/qt/updater.cpp | |
| parent | 8e4124f06aa6c580ee62dd1b78735bc488e21366 (diff) | |
| download | monzero-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.cpp | 55 |
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 |
