aboutsummaryrefslogtreecommitdiff
path: root/lib/jobs
diff options
context:
space:
mode:
authorTobias Fella <fella@posteo.de>2021-08-31 00:09:59 +0200
committerTobias Fella <fella@posteo.de>2021-12-01 21:56:59 +0100
commit8636c7028b45ee8de3125bcf4df40ad60ed949a0 (patch)
treea05ffdb2e0e36ef19fd6395834112c72646f7684 /lib/jobs
parentb35a736da2b09fe5cc0091f9fbd370d057503a54 (diff)
downloadlibquotient-8636c7028b45ee8de3125bcf4df40ad60ed949a0.tar.gz
libquotient-8636c7028b45ee8de3125bcf4df40ad60ed949a0.zip
Add mxc protocol to the networkaccessmanager
Diffstat (limited to 'lib/jobs')
-rw-r--r--lib/jobs/downloadfilejob.cpp48
-rw-r--r--lib/jobs/downloadfilejob.h3
2 files changed, 14 insertions, 37 deletions
diff --git a/lib/jobs/downloadfilejob.cpp b/lib/jobs/downloadfilejob.cpp
index e82271eb..2fba1973 100644
--- a/lib/jobs/downloadfilejob.cpp
+++ b/lib/jobs/downloadfilejob.cpp
@@ -9,20 +9,8 @@
#ifdef Quotient_E2EE_ENABLED
# include <QCryptographicHash>
-# include <openssl/evp.h>
-
-QByteArray decrypt(const QByteArray &ciphertext, const QByteArray &key, const QByteArray &iv)
-{
- QByteArray plaintext(ciphertext.size(), 0);
- EVP_CIPHER_CTX *ctx;
- int length;
- ctx = EVP_CIPHER_CTX_new();
- EVP_DecryptInit_ex(ctx, EVP_aes_256_ctr(), NULL, (const unsigned char *)key.data(), (const unsigned char *)iv.data());
- EVP_DecryptUpdate(ctx, (unsigned char *)plaintext.data(), &length, (const unsigned char *)ciphertext.data(), ciphertext.size());
- EVP_DecryptFinal_ex(ctx, (unsigned char *)plaintext.data() + length, &length);
- EVP_CIPHER_CTX_free(ctx);
- return plaintext;
-}
+# include "encryptionmanager.h"
+# include "events/encryptedfile.h"
#endif
using namespace Quotient;
@@ -39,9 +27,7 @@ public:
QScopedPointer<QFile> tempFile;
#ifdef Quotient_E2EE_ENABLED
- QByteArray key;
- QByteArray iv;
- QByteArray sha256;
+ Omittable<EncryptedFile> encryptedFile;
#endif
};
@@ -63,18 +49,13 @@ DownloadFileJob::DownloadFileJob(const QString& serverName,
#ifdef Quotient_E2EE_ENABLED
DownloadFileJob::DownloadFileJob(const QString& serverName,
const QString& mediaId,
- const QString& key,
- const QString& iv,
- const QString& sha256,
+ const EncryptedFile file,
const QString& localFilename)
: GetContentJob(serverName, mediaId)
, d(localFilename.isEmpty() ? new Private : new Private(localFilename))
{
setObjectName(QStringLiteral("DownloadFileJob"));
- auto _key = key;
- d->key = QByteArray::fromBase64(_key.replace(QLatin1Char('_'), QLatin1Char('/')).replace(QLatin1Char('-'), QLatin1Char('+')).toLatin1());
- d->iv = QByteArray::fromBase64(iv.toLatin1());
- d->sha256 = QByteArray::fromBase64(sha256.toLatin1());
+ d->encryptedFile = file;
}
#endif
QString DownloadFileJob::targetFileName() const
@@ -140,14 +121,12 @@ BaseJob::Status DownloadFileJob::prepareResult()
{
if (d->targetFile) {
#ifdef Quotient_E2EE_ENABLED
- if(d->key.size() != 0) {
+ if (d->encryptedFile.has_value()) {
d->tempFile->seek(0);
QByteArray encrypted = d->tempFile->readAll();
- if(d->sha256 != QCryptographicHash::hash(encrypted, QCryptographicHash::Sha256)) {
- qCWarning(E2EE) << "Hash verification failed for file";
- return IncorrectResponse;
- }
- auto decrypted = decrypt(encrypted, d->key, d->iv);
+
+ EncryptedFile file = *d->encryptedFile;
+ auto decrypted = EncryptionManager::decryptFile(encrypted, &file);
d->targetFile->write(decrypted);
d->tempFile->remove();
} else {
@@ -167,15 +146,12 @@ BaseJob::Status DownloadFileJob::prepareResult()
#endif
} else {
#ifdef Quotient_E2EE_ENABLED
- if(d->key.size() != 0) {
+ if (d->encryptedFile.has_value()) {
d->tempFile->seek(0);
auto encrypted = d->tempFile->readAll();
- if(d->sha256 != QCryptographicHash::hash(encrypted, QCryptographicHash::Sha256)) {
- qCWarning(E2EE) << "Hash verification failed for file";
- return IncorrectResponse;
- }
- auto decrypted = decrypt(encrypted, d->key, d->iv);
+ EncryptedFile file = *d->encryptedFile;
+ auto decrypted = EncryptionManager::decryptFile(encrypted, &file);
d->tempFile->write(decrypted);
} else {
#endif
diff --git a/lib/jobs/downloadfilejob.h b/lib/jobs/downloadfilejob.h
index f000b991..67a3e95f 100644
--- a/lib/jobs/downloadfilejob.h
+++ b/lib/jobs/downloadfilejob.h
@@ -4,6 +4,7 @@
#pragma once
#include "csapi/content-repo.h"
+#include "events/encryptedfile.h"
namespace Quotient {
class DownloadFileJob : public GetContentJob {
@@ -15,7 +16,7 @@ public:
const QString& localFilename = {});
#ifdef Quotient_E2EE_ENABLED
- DownloadFileJob(const QString& serverName, const QString& mediaId, const QString& key, const QString& iv, const QString& sha256, const QString& localFilename = {});
+ DownloadFileJob(const QString& serverName, const QString& mediaId, const EncryptedFile file, const QString& localFilename = {});
#endif
QString targetFileName() const;