aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/AES_PDF_native.cc
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2019-11-04 20:41:10 +0100
committerJay Berkenbilt <ejb@ql.org>2019-11-09 14:18:02 +0100
commitd1ffe46c04e87a297fed50ba0ff79213cdee7a5e (patch)
treef17faec6741f1ff02ebc5b59fc6071550ca2c099 /libqpdf/AES_PDF_native.cc
parentc8cda4f965064a9c4621d8d9f889eb7037fe72bb (diff)
downloadqpdf-d1ffe46c04e87a297fed50ba0ff79213cdee7a5e.tar.zst
AES_PDF: move CBC logic from pipeline to AES_PDF implementation
Diffstat (limited to 'libqpdf/AES_PDF_native.cc')
-rw-r--r--libqpdf/AES_PDF_native.cc27
1 files changed, 26 insertions, 1 deletions
diff --git a/libqpdf/AES_PDF_native.cc b/libqpdf/AES_PDF_native.cc
index d6907ee3..697b3a37 100644
--- a/libqpdf/AES_PDF_native.cc
+++ b/libqpdf/AES_PDF_native.cc
@@ -7,10 +7,14 @@
#include <qpdf/QIntC.hh>
#include <string>
#include <stdlib.h>
+#include <qpdf/QPDFCryptoImpl.hh>
AES_PDF_native::AES_PDF_native(bool encrypt, unsigned char const* key,
- size_t key_bytes) :
+ size_t key_bytes, bool cbc_mode,
+ unsigned char* cbc_block) :
encrypt(encrypt),
+ cbc_mode(cbc_mode),
+ cbc_block(cbc_block),
nrounds(0)
{
size_t keybits = 8 * key_bytes;
@@ -44,12 +48,33 @@ AES_PDF_native::update(unsigned char* in_data, unsigned char* out_data)
{
if (this->encrypt)
{
+ if (this->cbc_mode)
+ {
+ for (size_t i = 0; i < QPDFCryptoImpl::rijndael_buf_size; ++i)
+ {
+ in_data[i] ^= this->cbc_block[i];
+ }
+ }
rijndaelEncrypt(this->rk.get(),
this->nrounds, in_data, out_data);
+ if (this->cbc_mode)
+ {
+ memcpy(this->cbc_block, out_data,
+ QPDFCryptoImpl::rijndael_buf_size);
+ }
}
else
{
rijndaelDecrypt(this->rk.get(),
this->nrounds, in_data, out_data);
+ if (this->cbc_mode)
+ {
+ for (size_t i = 0; i < QPDFCryptoImpl::rijndael_buf_size; ++i)
+ {
+ out_data[i] ^= this->cbc_block[i];
+ }
+ memcpy(this->cbc_block, in_data,
+ QPDFCryptoImpl::rijndael_buf_size);
+ }
}
}