2019-11-04 18:59:19 +00:00
|
|
|
#include <qpdf/AES_PDF_native.hh>
|
2022-02-04 21:31:31 +00:00
|
|
|
|
2022-04-02 21:14:10 +00:00
|
|
|
#include <qpdf/QIntC.hh>
|
|
|
|
#include <qpdf/QPDFCryptoImpl.hh>
|
2019-11-04 18:59:19 +00:00
|
|
|
#include <qpdf/QUtil.hh>
|
2022-04-02 21:14:10 +00:00
|
|
|
#include <qpdf/rijndael.h>
|
2019-11-04 18:59:19 +00:00
|
|
|
#include <assert.h>
|
2022-04-02 21:14:10 +00:00
|
|
|
#include <cstring>
|
2019-11-04 18:59:19 +00:00
|
|
|
#include <stdexcept>
|
|
|
|
#include <stdlib.h>
|
2022-04-02 21:14:10 +00:00
|
|
|
#include <string>
|
2019-11-04 18:59:19 +00:00
|
|
|
|
2022-04-02 21:14:10 +00:00
|
|
|
AES_PDF_native::AES_PDF_native(
|
|
|
|
bool encrypt,
|
|
|
|
unsigned char const* key,
|
|
|
|
size_t key_bytes,
|
|
|
|
bool cbc_mode,
|
|
|
|
unsigned char* cbc_block) :
|
2019-11-04 18:59:19 +00:00
|
|
|
encrypt(encrypt),
|
2019-11-04 19:41:10 +00:00
|
|
|
cbc_mode(cbc_mode),
|
|
|
|
cbc_block(cbc_block),
|
2019-11-04 18:59:19 +00:00
|
|
|
nrounds(0)
|
|
|
|
{
|
|
|
|
size_t keybits = 8 * key_bytes;
|
2022-02-05 13:15:07 +00:00
|
|
|
this->key = std::make_unique<unsigned char[]>(key_bytes);
|
|
|
|
this->rk = std::make_unique<uint32_t[]>(RKLENGTH(keybits));
|
2019-11-04 18:59:19 +00:00
|
|
|
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);
|
2022-04-02 21:14:10 +00:00
|
|
|
if (encrypt) {
|
|
|
|
this->nrounds =
|
|
|
|
rijndaelSetupEncrypt(this->rk.get(), this->key.get(), keybits);
|
|
|
|
} else {
|
|
|
|
this->nrounds =
|
|
|
|
rijndaelSetupDecrypt(this->rk.get(), this->key.get(), keybits);
|
2019-11-04 18:59:19 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
AES_PDF_native::~AES_PDF_native()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
AES_PDF_native::update(unsigned char* in_data, unsigned char* out_data)
|
|
|
|
{
|
2022-04-02 21:14:10 +00:00
|
|
|
if (this->encrypt) {
|
|
|
|
if (this->cbc_mode) {
|
|
|
|
for (size_t i = 0; i < QPDFCryptoImpl::rijndael_buf_size; ++i) {
|
2022-02-08 14:18:08 +00:00
|
|
|
in_data[i] ^= this->cbc_block[i];
|
|
|
|
}
|
|
|
|
}
|
2022-04-02 21:14:10 +00:00
|
|
|
rijndaelEncrypt(this->rk.get(), this->nrounds, in_data, out_data);
|
|
|
|
if (this->cbc_mode) {
|
|
|
|
memcpy(
|
|
|
|
this->cbc_block, out_data, QPDFCryptoImpl::rijndael_buf_size);
|
2022-02-08 14:18:08 +00:00
|
|
|
}
|
2022-04-02 21:14:10 +00:00
|
|
|
} 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) {
|
2022-02-08 14:18:08 +00:00
|
|
|
out_data[i] ^= this->cbc_block[i];
|
|
|
|
}
|
2022-04-02 21:14:10 +00:00
|
|
|
memcpy(this->cbc_block, in_data, QPDFCryptoImpl::rijndael_buf_size);
|
2022-02-08 14:18:08 +00:00
|
|
|
}
|
2019-11-04 18:59:19 +00:00
|
|
|
}
|
|
|
|
}
|