From cc6f5241685f6bfd98e2a2b13dae9ebe3783486d Mon Sep 17 00:00:00 2001 From: Felix Geyer Date: Thu, 10 May 2012 19:00:36 +0200 Subject: [PATCH] Add Tools::readFromDevice() and make FileKey use it. --- src/core/Tools.cpp | 16 ++++++++++++++++ src/core/Tools.h | 1 + src/crypto/CryptoHash.cpp | 4 ++++ src/keys/FileKey.cpp | 24 +++++++++++++++++------- 4 files changed, 38 insertions(+), 7 deletions(-) diff --git a/src/core/Tools.cpp b/src/core/Tools.cpp index 6811d0785..33f2fee22 100644 --- a/src/core/Tools.cpp +++ b/src/core/Tools.cpp @@ -53,6 +53,22 @@ bool hasChild(const QObject* parent, const QObject* child) return false; } +bool readFromDevice(QIODevice* device, QByteArray& data, int size) +{ + QByteArray buffer; + buffer.resize(size); + + qint64 readResult = device->read(buffer.data(), size); + if (readResult == -1) { + return false; + } + else { + buffer.resize(readResult); + data = buffer; + return true; + } +} + bool readAllFromDevice(QIODevice* device, QByteArray& data) { QByteArray result; diff --git a/src/core/Tools.h b/src/core/Tools.h index 65c0f5e2e..e5188d175 100644 --- a/src/core/Tools.h +++ b/src/core/Tools.h @@ -28,6 +28,7 @@ namespace Tools { QString humanReadableFileSize(qint64 bytes); bool hasChild(const QObject* parent, const QObject* child); +bool readFromDevice(QIODevice* device, QByteArray& data, int size = 16384); bool readAllFromDevice(QIODevice* device, QByteArray& data); QDateTime currentDateTimeUtc(); QString imageReaderFilter(); diff --git a/src/crypto/CryptoHash.cpp b/src/crypto/CryptoHash.cpp index 31c0c934e..c9459598e 100644 --- a/src/crypto/CryptoHash.cpp +++ b/src/crypto/CryptoHash.cpp @@ -66,6 +66,10 @@ void CryptoHash::addData(const QByteArray& data) { Q_D(CryptoHash); + if (data.isEmpty()) { + return; + } + gcry_md_write(d->ctx, data.constData(), data.size()); } diff --git a/src/keys/FileKey.cpp b/src/keys/FileKey.cpp index 9063251de..b22c5b0f2 100644 --- a/src/keys/FileKey.cpp +++ b/src/keys/FileKey.cpp @@ -222,8 +222,14 @@ bool FileKey::loadBinary(QIODevice* device) return false; } - m_key = device->readAll(); - return true; + QByteArray data; + if (!Tools::readAllFromDevice(device, data) || data.size() != 32) { + return false; + } + else { + m_key = data; + return true; + } } bool FileKey::loadHex(QIODevice* device) @@ -232,7 +238,10 @@ bool FileKey::loadHex(QIODevice* device) return false; } - QByteArray data = device->readAll(); + QByteArray data; + if (!Tools::readAllFromDevice(device, data) || data.size() != 64) { + return false; + } if (!Tools::isHex(data)) { return false; @@ -253,11 +262,12 @@ bool FileKey::loadHashed(QIODevice* device) CryptoHash cryptoHash(CryptoHash::Sha256); QByteArray buffer; - - while (!device->atEnd()) { - buffer = device->read(1024); + do { + if (!Tools::readFromDevice(device, buffer)) { + return false; + } cryptoHash.addData(buffer); - } + } while (!buffer.isEmpty()); m_key = cryptoHash.result();