From a8715c495b218c9b9388a2e20c8202a3fa73b2c1 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Mon, 19 Oct 2009 00:36:51 +0000 Subject: add C API for R4 encryption git-svn-id: svn+q:///qpdf/trunk@825 71b93d88-0707-0410-a8cf-f5a4172ac649 --- libqpdf/Pl_AES_PDF.cc | 22 ++++++++++++++++++++-- libqpdf/QPDFWriter.cc | 9 +++++++++ libqpdf/qpdf-c.cc | 26 ++++++++++++++++++++++++++ libqpdf/qpdf/Pl_AES_PDF.hh | 3 +++ 4 files changed, 58 insertions(+), 2 deletions(-) (limited to 'libqpdf') diff --git a/libqpdf/Pl_AES_PDF.cc b/libqpdf/Pl_AES_PDF.cc index 0ceb7df7..d9754981 100644 --- a/libqpdf/Pl_AES_PDF.cc +++ b/libqpdf/Pl_AES_PDF.cc @@ -12,6 +12,8 @@ # define srandom srand #endif +bool Pl_AES_PDF::use_static_iv = false; + Pl_AES_PDF::Pl_AES_PDF(char const* identifier, Pipeline* next, bool encrypt, unsigned char const key[key_size]) : Pipeline(identifier, next), @@ -51,6 +53,12 @@ Pl_AES_PDF::disableCBC() this->cbc_mode = false; } +void +Pl_AES_PDF::useStaticIV() +{ + use_static_iv = true; +} + void Pl_AES_PDF::write(unsigned char* data, int len) { @@ -116,9 +124,19 @@ Pl_AES_PDF::initializeVector() srandom((int)QUtil::get_current_time() ^ 0xcccc); seeded_random = true; } - for (unsigned int i = 0; i < this->buf_size; ++i) + if (use_static_iv) + { + for (unsigned int i = 0; i < this->buf_size; ++i) + { + this->cbc_block[i] = 14 * (1 + i); + } + } + else { - this->cbc_block[i] = (unsigned char)((random() & 0xff0) >> 4); + for (unsigned int i = 0; i < this->buf_size; ++i) + { + this->cbc_block[i] = (unsigned char)((random() & 0xff0) >> 4); + } } } diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc index 3c1640f7..320706b0 100644 --- a/libqpdf/QPDFWriter.cc +++ b/libqpdf/QPDFWriter.cc @@ -139,6 +139,15 @@ QPDFWriter::setStaticID(bool val) this->static_id = val; } +void +QPDFWriter::setStaticAesIV(bool val) +{ + if (val) + { + Pl_AES_PDF::useStaticIV(); + } +} + void QPDFWriter::setSuppressOriginalObjectIDs(bool val) { diff --git a/libqpdf/qpdf-c.cc b/libqpdf/qpdf-c.cc index abc74c95..96de680f 100644 --- a/libqpdf/qpdf-c.cc +++ b/libqpdf/qpdf-c.cc @@ -313,6 +313,12 @@ void qpdf_set_static_ID(qpdf_data qpdf, QPDF_BOOL value) qpdf->qpdf_writer->setStaticID(value); } +void qpdf_set_static_aes_IV(qpdf_data qpdf, QPDF_BOOL value) +{ + QTC::TC("qpdf", "qpdf-c called qpdf_set_static_aes_IV"); + qpdf->qpdf_writer->setStaticAesIV(value); +} + void qpdf_set_suppress_original_object_IDs( qpdf_data qpdf, QPDF_BOOL value) { @@ -356,6 +362,26 @@ void qpdf_set_r3_encryption_parameters( QPDFWriter::r3m_all)); } +void qpdf_set_r4_encryption_parameters( + qpdf_data qpdf, char const* user_password, char const* owner_password, + QPDF_BOOL allow_accessibility, QPDF_BOOL allow_extract, + int print, int modify, QPDF_BOOL encrypt_metadata, QPDF_BOOL use_aes) +{ + QTC::TC("qpdf", "qpdf-c called qpdf_set_r4_encryption_parameters"); + qpdf->qpdf_writer->setR4EncryptionParameters( + user_password, owner_password, + allow_accessibility, allow_extract, + ((print == QPDF_R3_PRINT_LOW) ? QPDFWriter::r3p_low : + (print == QPDF_R3_PRINT_NONE) ? QPDFWriter::r3p_none : + QPDFWriter::r3p_full), + ((modify == QPDF_R3_MODIFY_ANNOTATE) ? QPDFWriter::r3m_annotate : + (modify == QPDF_R3_MODIFY_FORM) ? QPDFWriter::r3m_form : + (modify == QPDF_R3_MODIFY_ASSEMBLY) ? QPDFWriter::r3m_assembly : + (modify == QPDF_R3_MODIFY_NONE) ? QPDFWriter::r3m_none : + QPDFWriter::r3m_all), + encrypt_metadata, use_aes); +} + void qpdf_set_linearization(qpdf_data qpdf, QPDF_BOOL value) { QTC::TC("qpdf", "qpdf-c called qpdf_set_linearization"); diff --git a/libqpdf/qpdf/Pl_AES_PDF.hh b/libqpdf/qpdf/Pl_AES_PDF.hh index 888ea752..084fca7b 100644 --- a/libqpdf/qpdf/Pl_AES_PDF.hh +++ b/libqpdf/qpdf/Pl_AES_PDF.hh @@ -20,12 +20,15 @@ class DLL_EXPORT Pl_AES_PDF: public Pipeline // For testing only; PDF always uses CBC void disableCBC(); + // For testing only: use a fixed initialization vector for CBC + static void useStaticIV(); private: void flush(bool discard_padding); void initializeVector(); static unsigned int const buf_size = 16; + static bool use_static_iv; bool encrypt; bool cbc_mode; -- cgit v1.2.3-54-g00ecf