2
1
mirror of https://github.com/qpdf/qpdf.git synced 2024-12-22 19:08:59 +00:00
qpdf/libqpdf/AES_PDF_native.cc
Jay Berkenbilt cb769c62e5 WHITESPACE ONLY -- expand tabs in source code
This comment expands all tabs using an 8-character tab-width. You
should ignore this commit when using git blame or use git blame -w.

In the early days, I used to use tabs where possible for indentation,
since emacs did this automatically. In recent years, I have switched
to only using spaces, which means qpdf source code has been a mixture
of spaces and tabs. I have avoided cleaning this up because of not
wanting gratuitous whitespaces change to cloud the output of git
blame, but I changed my mind after discussing with users who view qpdf
source code in editors/IDEs that have other tab widths by default and
in light of the fact that I am planning to start applying automatic
code formatting soon.
2022-02-08 11:51:15 -05:00

78 lines
2.1 KiB
C++

#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>
#include <qpdf/QPDFCryptoImpl.hh>
AES_PDF_native::AES_PDF_native(bool encrypt, unsigned char const* key,
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;
this->key = std::make_unique<unsigned char[]>(key_bytes);
this->rk = std::make_unique<uint32_t[]>(RKLENGTH(keybits));
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)
{
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);
}
}
}