diff --git a/ChangeLog b/ChangeLog index 0f18cfc6..fe79bdfe 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2009-10-18 Jay Berkenbilt + + * libqpdf/QPDFWriter.cc (unparseObject): avoid compressing + Metadata streams if possible. + +2009-10-04 Jay Berkenbilt + + * 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 * 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