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 2009-10-04 Jay Berkenbilt <ejb@ql.org> 12 2009-10-04 Jay Berkenbilt <ejb@ql.org>
2 13
3 * Add methods to QPDFWriter and corresponding command line 14 * Add methods to QPDFWriter and corresponding command line
libqpdf/Pl_AES_PDF.cc
@@ -108,17 +108,22 @@ Pl_AES_PDF::finish() @@ -108,17 +108,22 @@ Pl_AES_PDF::finish()
108 void 108 void
109 Pl_AES_PDF::initializeVector() 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 for (unsigned int i = 0; i < this->buf_size; ++i) 127 for (unsigned int i = 0; i < this->buf_size; ++i)
123 { 128 {
124 this->cbc_block[i] = (unsigned char)((random() & 0xff0) >> 4); 129 this->cbc_block[i] = (unsigned char)((random() & 0xff0) >> 4);
libqpdf/QPDFWriter.cc
@@ -860,6 +860,12 @@ QPDFWriter::unparseObject(QPDFObjectHandle object, int level, @@ -860,6 +860,12 @@ QPDFWriter::unparseObject(QPDFObjectHandle object, int level,
860 } 860 }
861 QPDFObjectHandle stream_dict = object.getDict(); 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 bool filter = (this->stream_data_mode != s_preserve); 869 bool filter = (this->stream_data_mode != s_preserve);
864 if (this->stream_data_mode == s_compress) 870 if (this->stream_data_mode == s_compress)
865 { 871 {
@@ -878,7 +884,14 @@ QPDFWriter::unparseObject(QPDFObjectHandle object, int level, @@ -878,7 +884,14 @@ QPDFWriter::unparseObject(QPDFObjectHandle object, int level,
878 } 884 }
879 bool normalize = false; 885 bool normalize = false;
880 bool compress = false; 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 normalize = true; 896 normalize = true;
884 filter = true; 897 filter = true;
@@ -907,10 +920,7 @@ QPDFWriter::unparseObject(QPDFObjectHandle object, int level, @@ -907,10 +920,7 @@ QPDFWriter::unparseObject(QPDFObjectHandle object, int level,
907 } 920 }
908 921
909 this->cur_stream_length = stream_data.getPointer()->getSize(); 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 // Don't encrypt stream data for the metadata stream 925 // Don't encrypt stream data for the metadata stream
916 this->cur_data_key.clear(); 926 this->cur_data_key.clear();
qpdf/qpdf.testcov
@@ -160,3 +160,4 @@ qpdf-c called qpdf_force_pdf_version 0 @@ -160,3 +160,4 @@ qpdf-c called qpdf_force_pdf_version 0
160 qpdf-c called qpdf_init_write multiple times 0 160 qpdf-c called qpdf_init_write multiple times 0
161 QPDF_encryption rc4 decode string 0 161 QPDF_encryption rc4 decode string 0
162 QPDF_encryption rc4 decode stream 0 162 QPDF_encryption rc4 decode stream 0
  163 +QPDFWriter not compressing metadata 0