Commit 4ccc9330a8144660af5ac8f392d1fb8cb77422f0

Authored by Jay Berkenbilt
1 parent 67e353e4

only seed randon number generater once for aes-cbc, try to avoid compressing Metadata streams

git-svn-id: svn+q:///qpdf/trunk@818 71b93d88-0707-0410-a8cf-f5a4172ac649
ChangeLog
  1 +2009-10-18 Jay Berkenbilt <ejb@ql.org>
  2 +
  3 + * libqpdf/QPDFWriter.cc (unparseObject): avoid compressing
  4 + Metadata streams if possible.
  5 +
  6 +2009-10-04 Jay Berkenbilt <ejb@ql.org>
  7 +
  8 + * Implement support AES encrypt and crypt filters. Implementation
  9 + is not fully tested due to lack of test data but has been tested
  10 + for several cases.
  11 +
1 12 2009-10-04 Jay Berkenbilt <ejb@ql.org>
2 13  
3 14 * Add methods to QPDFWriter and corresponding command line
... ...
libqpdf/Pl_AES_PDF.cc
... ... @@ -108,17 +108,22 @@ Pl_AES_PDF::finish()
108 108 void
109 109 Pl_AES_PDF::initializeVector()
110 110 {
111   - std::string seed_str;
112   - seed_str += QUtil::int_to_string((int)QUtil::get_current_time());
113   - seed_str += " QPDF aes random";
114   - MD5 m;
115   - m.encodeString(seed_str.c_str());
116   - MD5::Digest digest;
117   - m.digest(digest);
118   - assert(sizeof(digest) >= sizeof(unsigned int));
119   - unsigned int seed;
120   - memcpy((void*)(&seed), digest, sizeof(unsigned int));
121   - srandom(seed);
  111 + static bool seeded_random = false;
  112 + if (! seeded_random)
  113 + {
  114 + std::string seed_str;
  115 + seed_str += QUtil::int_to_string((int)QUtil::get_current_time());
  116 + seed_str += " QPDF aes random";
  117 + MD5 m;
  118 + m.encodeString(seed_str.c_str());
  119 + MD5::Digest digest;
  120 + m.digest(digest);
  121 + assert(sizeof(digest) >= sizeof(unsigned int));
  122 + unsigned int seed;
  123 + memcpy((void*)(&seed), digest, sizeof(unsigned int));
  124 + srandom(seed);
  125 + seeded_random = true;
  126 + }
122 127 for (unsigned int i = 0; i < this->buf_size; ++i)
123 128 {
124 129 this->cbc_block[i] = (unsigned char)((random() & 0xff0) >> 4);
... ...
libqpdf/QPDFWriter.cc
... ... @@ -860,6 +860,12 @@ QPDFWriter::unparseObject(QPDFObjectHandle object, int level,
860 860 }
861 861 QPDFObjectHandle stream_dict = object.getDict();
862 862  
  863 + bool is_metadata = false;
  864 + if (stream_dict.getKey("/Type").isName() &&
  865 + (stream_dict.getKey("/Type").getName() == "/Metadata"))
  866 + {
  867 + is_metadata = true;
  868 + }
863 869 bool filter = (this->stream_data_mode != s_preserve);
864 870 if (this->stream_data_mode == s_compress)
865 871 {
... ... @@ -878,7 +884,14 @@ QPDFWriter::unparseObject(QPDFObjectHandle object, int level,
878 884 }
879 885 bool normalize = false;
880 886 bool compress = false;
881   - if (this->normalize_content && normalized_streams.count(old_id))
  887 + if (is_metadata &&
  888 + ((! this->encrypted) || (this->encrypt_metadata == false)))
  889 + {
  890 + QTC::TC("qpdf", "QPDFWriter not compressing metadata");
  891 + filter = true;
  892 + compress = false;
  893 + }
  894 + else if (this->normalize_content && normalized_streams.count(old_id))
882 895 {
883 896 normalize = true;
884 897 filter = true;
... ... @@ -907,10 +920,7 @@ QPDFWriter::unparseObject(QPDFObjectHandle object, int level,
907 920 }
908 921  
909 922 this->cur_stream_length = stream_data.getPointer()->getSize();
910   - if (this->encrypted &&
911   - stream_dict.getKey("/Type").isName() &&
912   - (stream_dict.getKey("/Type").getName() == "/Metadata") &&
913   - (! this->encrypt_metadata))
  923 + if (is_metadata && this->encrypted && (! this->encrypt_metadata))
914 924 {
915 925 // Don't encrypt stream data for the metadata stream
916 926 this->cur_data_key.clear();
... ...
qpdf/qpdf.testcov
... ... @@ -160,3 +160,4 @@ qpdf-c called qpdf_force_pdf_version 0
160 160 qpdf-c called qpdf_init_write multiple times 0
161 161 QPDF_encryption rc4 decode string 0
162 162 QPDF_encryption rc4 decode stream 0
  163 +QPDFWriter not compressing metadata 0
... ...