aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/Pl_AES_PDF.cc
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2019-11-04 19:59:19 +0100
committerJay Berkenbilt <ejb@ql.org>2019-11-09 14:18:02 +0100
commitc8cda4f965064a9c4621d8d9f889eb7037fe72bb (patch)
tree333110d755d88709c4b196f834c6f0fa1e7b68ba /libqpdf/Pl_AES_PDF.cc
parentbb427bd11774f47f553257cdc0693f77b559654d (diff)
downloadqpdf-c8cda4f965064a9c4621d8d9f889eb7037fe72bb.tar.zst
AES_PDF: switch to pluggable crypto
Diffstat (limited to 'libqpdf/Pl_AES_PDF.cc')
-rw-r--r--libqpdf/Pl_AES_PDF.cc36
1 files changed, 10 insertions, 26 deletions
diff --git a/libqpdf/Pl_AES_PDF.cc b/libqpdf/Pl_AES_PDF.cc
index 1099ab13..a6756035 100644
--- a/libqpdf/Pl_AES_PDF.cc
+++ b/libqpdf/Pl_AES_PDF.cc
@@ -3,8 +3,8 @@
#include <cstring>
#include <assert.h>
#include <stdexcept>
-#include <qpdf/rijndael.h>
#include <qpdf/QIntC.hh>
+#include <qpdf/QPDFCryptoProvider.hh>
#include <string>
#include <stdlib.h>
@@ -14,38 +14,23 @@ Pl_AES_PDF::Pl_AES_PDF(char const* identifier, Pipeline* next,
bool encrypt, unsigned char const* key,
size_t key_bytes) :
Pipeline(identifier, next),
+ crypto(QPDFCryptoProvider::getImpl()),
encrypt(encrypt),
cbc_mode(true),
first(true),
offset(0),
- nrounds(0),
use_zero_iv(false),
use_specified_iv(false),
disable_padding(false)
{
- size_t keybits = 8 * key_bytes;
- assert(key_bytes == KEYLENGTH(keybits));
- this->key = PointerHolder<unsigned char>(
- true, new unsigned char[key_bytes]);
- this->rk = PointerHolder<uint32_t>(
- true, new uint32_t[RKLENGTH(keybits)]);
- size_t rk_bytes = RKLENGTH(keybits) * sizeof(uint32_t);
- std::memcpy(this->key.getPointer(), key, key_bytes);
- std::memset(this->rk.getPointer(), 0, rk_bytes);
+ this->key = std::unique_ptr<unsigned char[]>(
+ new unsigned char[key_bytes],
+ std::default_delete<unsigned char[]>());
+ std::memcpy(this->key.get(), key, key_bytes);
std::memset(this->inbuf, 0, this->buf_size);
std::memset(this->outbuf, 0, this->buf_size);
std::memset(this->cbc_block, 0, this->buf_size);
- if (encrypt)
- {
- this->nrounds = rijndaelSetupEncrypt(
- this->rk.getPointer(), this->key.getPointer(), keybits);
- }
- else
- {
- this->nrounds = rijndaelSetupDecrypt(
- this->rk.getPointer(), this->key.getPointer(), keybits);
- }
- assert(this->nrounds == NROUNDS(keybits));
+ this->crypto->rijndael_init(encrypt, this->key.get(), key_bytes);
}
Pl_AES_PDF::~Pl_AES_PDF()
@@ -148,6 +133,7 @@ Pl_AES_PDF::finish()
}
flush(! this->disable_padding);
}
+ this->crypto->rijndael_finalize();
getNext()->finish();
}
@@ -224,8 +210,7 @@ Pl_AES_PDF::flush(bool strip_padding)
this->inbuf[i] ^= this->cbc_block[i];
}
}
- rijndaelEncrypt(this->rk.getPointer(),
- this->nrounds, this->inbuf, this->outbuf);
+ this->crypto->rijndael_process(this->inbuf, this->outbuf);
if (this->cbc_mode)
{
memcpy(this->cbc_block, this->outbuf, this->buf_size);
@@ -233,8 +218,7 @@ Pl_AES_PDF::flush(bool strip_padding)
}
else
{
- rijndaelDecrypt(this->rk.getPointer(),
- this->nrounds, this->inbuf, this->outbuf);
+ this->crypto->rijndael_process(this->inbuf, this->outbuf);
if (this->cbc_mode)
{
for (unsigned int i = 0; i < this->buf_size; ++i)