diff options
author | Jay Berkenbilt <ejb@ql.org> | 2019-11-04 19:59:19 +0100 |
---|---|---|
committer | Jay Berkenbilt <ejb@ql.org> | 2019-11-09 14:18:02 +0100 |
commit | c8cda4f965064a9c4621d8d9f889eb7037fe72bb (patch) | |
tree | 333110d755d88709c4b196f834c6f0fa1e7b68ba /libqpdf/AES_PDF_native.cc | |
parent | bb427bd11774f47f553257cdc0693f77b559654d (diff) | |
download | qpdf-c8cda4f965064a9c4621d8d9f889eb7037fe72bb.tar.zst |
AES_PDF: switch to pluggable crypto
Diffstat (limited to 'libqpdf/AES_PDF_native.cc')
-rw-r--r-- | libqpdf/AES_PDF_native.cc | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/libqpdf/AES_PDF_native.cc b/libqpdf/AES_PDF_native.cc new file mode 100644 index 00000000..d6907ee3 --- /dev/null +++ b/libqpdf/AES_PDF_native.cc @@ -0,0 +1,55 @@ +#include <qpdf/AES_PDF_native.hh> +#include <qpdf/QUtil.hh> +#include <cstring> +#include <assert.h> +#include <stdexcept> +#include <qpdf/rijndael.h> +#include <qpdf/QIntC.hh> +#include <string> +#include <stdlib.h> + +AES_PDF_native::AES_PDF_native(bool encrypt, unsigned char const* key, + size_t key_bytes) : + encrypt(encrypt), + nrounds(0) +{ + size_t keybits = 8 * key_bytes; + this->key = std::unique_ptr<unsigned char[]>( + new unsigned char[key_bytes], + std::default_delete<unsigned char[]>()); + this->rk = std::unique_ptr<uint32_t[]>( + new uint32_t[RKLENGTH(keybits)], + std::default_delete<uint32_t[]>()); + size_t rk_bytes = RKLENGTH(keybits) * sizeof(uint32_t); + std::memcpy(this->key.get(), key, key_bytes); + std::memset(this->rk.get(), 0, rk_bytes); + if (encrypt) + { + this->nrounds = rijndaelSetupEncrypt( + this->rk.get(), this->key.get(), keybits); + } + else + { + this->nrounds = rijndaelSetupDecrypt( + this->rk.get(), this->key.get(), keybits); + } +} + +AES_PDF_native::~AES_PDF_native() +{ +} + +void +AES_PDF_native::update(unsigned char* in_data, unsigned char* out_data) +{ + if (this->encrypt) + { + rijndaelEncrypt(this->rk.get(), + this->nrounds, in_data, out_data); + } + else + { + rijndaelDecrypt(this->rk.get(), + this->nrounds, in_data, out_data); + } +} |