aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--autotests/testfilecrypto.cpp4
-rw-r--r--lib/events/filesourceinfo.cpp11
-rw-r--r--lib/events/filesourceinfo.h9
-rw-r--r--lib/jobs/downloadfilejob.cpp4
-rw-r--r--lib/mxcreply.cpp4
-rw-r--r--lib/room.cpp3
6 files changed, 18 insertions, 17 deletions
diff --git a/autotests/testfilecrypto.cpp b/autotests/testfilecrypto.cpp
index b86114a4..29521060 100644
--- a/autotests/testfilecrypto.cpp
+++ b/autotests/testfilecrypto.cpp
@@ -12,8 +12,8 @@ using namespace Quotient;
void TestFileCrypto::encryptDecryptData()
{
QByteArray data = "ABCDEF";
- auto [file, cipherText] = EncryptedFileMetadata::encryptFile(data);
- auto decrypted = file.decryptFile(cipherText);
+ auto [file, cipherText] = encryptFile(data);
+ auto decrypted = decryptFile(cipherText, file);
// AES CTR produces ciphertext of the same size as the original
QCOMPARE(cipherText.size(), data.size());
QCOMPARE(decrypted.size(), data.size());
diff --git a/lib/events/filesourceinfo.cpp b/lib/events/filesourceinfo.cpp
index a64c7da8..43e8e44c 100644
--- a/lib/events/filesourceinfo.cpp
+++ b/lib/events/filesourceinfo.cpp
@@ -16,14 +16,15 @@
using namespace Quotient;
-QByteArray EncryptedFileMetadata::decryptFile(const QByteArray& ciphertext) const
+QByteArray Quotient::decryptFile(const QByteArray& ciphertext,
+ const EncryptedFileMetadata& metadata)
{
#ifdef Quotient_E2EE_ENABLED
- auto _key = key.k;
+ auto _key = metadata.key.k;
const auto keyBytes = QByteArray::fromBase64(
_key.replace(u'_', u'/').replace(u'-', u'+').toLatin1());
const auto sha256 =
- QByteArray::fromBase64(hashes["sha256"_ls].toLatin1());
+ QByteArray::fromBase64(metadata.hashes["sha256"_ls].toLatin1());
if (sha256
!= QCryptographicHash::hash(ciphertext, QCryptographicHash::Sha256)) {
qCWarning(E2EE) << "Hash verification failed for file";
@@ -37,7 +38,7 @@ QByteArray EncryptedFileMetadata::decryptFile(const QByteArray& ciphertext) cons
ctx, EVP_aes_256_ctr(), nullptr,
reinterpret_cast<const unsigned char*>(keyBytes.data()),
reinterpret_cast<const unsigned char*>(
- QByteArray::fromBase64(iv.toLatin1()).data()));
+ QByteArray::fromBase64(metadata.iv.toLatin1()).data()));
EVP_DecryptUpdate(
ctx, reinterpret_cast<unsigned char*>(plaintext.data()), &length,
reinterpret_cast<const unsigned char*>(ciphertext.data()),
@@ -56,7 +57,7 @@ QByteArray EncryptedFileMetadata::decryptFile(const QByteArray& ciphertext) cons
#endif
}
-std::pair<EncryptedFileMetadata, QByteArray> EncryptedFileMetadata::encryptFile(
+std::pair<EncryptedFileMetadata, QByteArray> Quotient::encryptFile(
const QByteArray& plainText)
{
#ifdef Quotient_E2EE_ENABLED
diff --git a/lib/events/filesourceinfo.h b/lib/events/filesourceinfo.h
index 885601be..8f7e3cbe 100644
--- a/lib/events/filesourceinfo.h
+++ b/lib/events/filesourceinfo.h
@@ -45,12 +45,13 @@ public:
QString iv;
QHash<QString, QString> hashes;
QString v;
-
- static std::pair<EncryptedFileMetadata, QByteArray> encryptFile(
- const QByteArray& plainText);
- QByteArray decryptFile(const QByteArray& ciphertext) const;
};
+QUOTIENT_API std::pair<EncryptedFileMetadata, QByteArray> encryptFile(
+ const QByteArray& plainText);
+QUOTIENT_API QByteArray decryptFile(const QByteArray& ciphertext,
+ const EncryptedFileMetadata& metadata);
+
template <>
struct QUOTIENT_API JsonObjectConverter<EncryptedFileMetadata> {
static void dumpTo(QJsonObject& jo, const EncryptedFileMetadata& pod);
diff --git a/lib/jobs/downloadfilejob.cpp b/lib/jobs/downloadfilejob.cpp
index 85c235c7..032b24f2 100644
--- a/lib/jobs/downloadfilejob.cpp
+++ b/lib/jobs/downloadfilejob.cpp
@@ -128,7 +128,7 @@ BaseJob::Status DownloadFileJob::prepareResult()
QByteArray encrypted = d->tempFile->readAll();
EncryptedFileMetadata file = *d->encryptedFile;
- const auto decrypted = file.decryptFile(encrypted);
+ const auto decrypted = decryptFile(encrypted, file);
d->targetFile->write(decrypted);
d->tempFile->remove();
} else {
@@ -153,7 +153,7 @@ BaseJob::Status DownloadFileJob::prepareResult()
const auto encrypted = d->tempFile->readAll();
EncryptedFileMetadata file = *d->encryptedFile;
- const auto decrypted = file.decryptFile(encrypted);
+ const auto decrypted = decryptFile(encrypted, file);
d->tempFile->write(decrypted);
} else {
#endif
diff --git a/lib/mxcreply.cpp b/lib/mxcreply.cpp
index b7993ad5..4174cfd8 100644
--- a/lib/mxcreply.cpp
+++ b/lib/mxcreply.cpp
@@ -47,9 +47,9 @@ MxcReply::MxcReply(QNetworkReply* reply, Room* room, const QString &eventId)
if(!d->m_encryptedFile.has_value()) {
d->m_device = d->m_reply;
} else {
- EncryptedFileMetadata file = *d->m_encryptedFile;
auto buffer = new QBuffer(this);
- buffer->setData(file.decryptFile(d->m_reply->readAll()));
+ buffer->setData(
+ decryptFile(d->m_reply->readAll(), *d->m_encryptedFile));
buffer->open(ReadOnly);
d->m_device = buffer;
}
diff --git a/lib/room.cpp b/lib/room.cpp
index 0cef1025..4cb01a39 100644
--- a/lib/room.cpp
+++ b/lib/room.cpp
@@ -2524,8 +2524,7 @@ void Room::uploadFile(const QString& id, const QUrl& localFilename,
QFile file(localFilename.toLocalFile());
file.open(QFile::ReadOnly);
QByteArray data;
- std::tie(fileMetadata, data) =
- EncryptedFileMetadata::encryptFile(file.readAll());
+ std::tie(fileMetadata, data) = encryptFile(file.readAll());
tempFile.write(data);
tempFile.close();
fileName = QFileInfo(tempFile).absoluteFilePath();