aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog11
-rw-r--r--libqpdf/Pl_AES_PDF.cc27
-rw-r--r--libqpdf/QPDFWriter.cc20
-rw-r--r--qpdf/qpdf.testcov1
4 files changed, 43 insertions, 16 deletions
diff --git a/ChangeLog b/ChangeLog
index 0f18cfc6..fe79bdfe 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2009-10-18 Jay Berkenbilt <ejb@ql.org>
+
+ * libqpdf/QPDFWriter.cc (unparseObject): avoid compressing
+ Metadata streams if possible.
+
+2009-10-04 Jay Berkenbilt <ejb@ql.org>
+
+ * Implement support AES encrypt and crypt filters. Implementation
+ is not fully tested due to lack of test data but has been tested
+ for several cases.
+
2009-10-04 Jay Berkenbilt <ejb@ql.org>
* Add methods to QPDFWriter and corresponding command line
diff --git a/libqpdf/Pl_AES_PDF.cc b/libqpdf/Pl_AES_PDF.cc
index c3fd03a9..1e5f81ab 100644
--- a/libqpdf/Pl_AES_PDF.cc
+++ b/libqpdf/Pl_AES_PDF.cc
@@ -108,17 +108,22 @@ Pl_AES_PDF::finish()
void
Pl_AES_PDF::initializeVector()
{
- std::string seed_str;
- seed_str += QUtil::int_to_string((int)QUtil::get_current_time());
- seed_str += " QPDF aes random";
- MD5 m;
- m.encodeString(seed_str.c_str());
- MD5::Digest digest;
- m.digest(digest);
- assert(sizeof(digest) >= sizeof(unsigned int));
- unsigned int seed;
- memcpy((void*)(&seed), digest, sizeof(unsigned int));
- srandom(seed);
+ static bool seeded_random = false;
+ if (! seeded_random)
+ {
+ std::string seed_str;
+ seed_str += QUtil::int_to_string((int)QUtil::get_current_time());
+ seed_str += " QPDF aes random";
+ MD5 m;
+ m.encodeString(seed_str.c_str());
+ MD5::Digest digest;
+ m.digest(digest);
+ assert(sizeof(digest) >= sizeof(unsigned int));
+ unsigned int seed;
+ memcpy((void*)(&seed), digest, sizeof(unsigned int));
+ srandom(seed);
+ seeded_random = true;
+ }
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 6cfa6fb9..76567db0 100644
--- a/libqpdf/QPDFWriter.cc
+++ b/libqpdf/QPDFWriter.cc
@@ -860,6 +860,12 @@ QPDFWriter::unparseObject(QPDFObjectHandle object, int level,
}
QPDFObjectHandle stream_dict = object.getDict();
+ bool is_metadata = false;
+ if (stream_dict.getKey("/Type").isName() &&
+ (stream_dict.getKey("/Type").getName() == "/Metadata"))
+ {
+ is_metadata = true;
+ }
bool filter = (this->stream_data_mode != s_preserve);
if (this->stream_data_mode == s_compress)
{
@@ -878,7 +884,14 @@ QPDFWriter::unparseObject(QPDFObjectHandle object, int level,
}
bool normalize = false;
bool compress = false;
- if (this->normalize_content && normalized_streams.count(old_id))
+ if (is_metadata &&
+ ((! this->encrypted) || (this->encrypt_metadata == false)))
+ {
+ QTC::TC("qpdf", "QPDFWriter not compressing metadata");
+ filter = true;
+ compress = false;
+ }
+ else if (this->normalize_content && normalized_streams.count(old_id))
{
normalize = true;
filter = true;
@@ -907,10 +920,7 @@ QPDFWriter::unparseObject(QPDFObjectHandle object, int level,
}
this->cur_stream_length = stream_data.getPointer()->getSize();
- if (this->encrypted &&
- stream_dict.getKey("/Type").isName() &&
- (stream_dict.getKey("/Type").getName() == "/Metadata") &&
- (! this->encrypt_metadata))
+ if (is_metadata && this->encrypted && (! this->encrypt_metadata))
{
// Don't encrypt stream data for the metadata stream
this->cur_data_key.clear();
diff --git a/qpdf/qpdf.testcov b/qpdf/qpdf.testcov
index a5d5a386..ebbd9cb0 100644
--- a/qpdf/qpdf.testcov
+++ b/qpdf/qpdf.testcov
@@ -160,3 +160,4 @@ qpdf-c called qpdf_force_pdf_version 0
qpdf-c called qpdf_init_write multiple times 0
QPDF_encryption rc4 decode string 0
QPDF_encryption rc4 decode stream 0
+QPDFWriter not compressing metadata 0