Commit 4ccc9330a8144660af5ac8f392d1fb8cb77422f0
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
Showing
4 changed files
with
43 additions
and
16 deletions
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 |