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 | 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(); | ... | ... |