diff options
author | Jay Berkenbilt <ejb@ql.org> | 2019-11-04 20:41:10 +0100 |
---|---|---|
committer | Jay Berkenbilt <ejb@ql.org> | 2019-11-09 14:18:02 +0100 |
commit | d1ffe46c04e87a297fed50ba0ff79213cdee7a5e (patch) | |
tree | f17faec6741f1ff02ebc5b59fc6071550ca2c099 /libqpdf/AES_PDF_native.cc | |
parent | c8cda4f965064a9c4621d8d9f889eb7037fe72bb (diff) | |
download | qpdf-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.cc | 27 |
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); + } } } |