aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/AES_PDF_native.cc
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2019-11-04 19:59:19 +0100
committerJay Berkenbilt <ejb@ql.org>2019-11-09 14:18:02 +0100
commitc8cda4f965064a9c4621d8d9f889eb7037fe72bb (patch)
tree333110d755d88709c4b196f834c6f0fa1e7b68ba /libqpdf/AES_PDF_native.cc
parentbb427bd11774f47f553257cdc0693f77b559654d (diff)
downloadqpdf-c8cda4f965064a9c4621d8d9f889eb7037fe72bb.tar.zst
AES_PDF: switch to pluggable crypto
Diffstat (limited to 'libqpdf/AES_PDF_native.cc')
-rw-r--r--libqpdf/AES_PDF_native.cc55
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);
+ }
+}