diff --git a/libqpdf/QPDF_encryption.cc b/libqpdf/QPDF_encryption.cc index dde7cb2..5a7839d 100644 --- a/libqpdf/QPDF_encryption.cc +++ b/libqpdf/QPDF_encryption.cc @@ -931,12 +931,7 @@ QPDF::decryptStream( bool is_root_metadata, std::unique_ptr& decrypt_pipeline) { - std::string type; - if (stream_dict.getKey("/Type").isName()) { - type = stream_dict.getKey("/Type").getName(); - } - if (type == "/XRef") { - QTC::TC("qpdf", "QPDF_encryption xref stream from encrypted file"); + if (Name(stream_dict["/Type"]) == "/XRef") { return; } bool use_aes = false; @@ -945,26 +940,20 @@ QPDF::decryptStream( std::string method_source = "/StmF from /Encrypt dictionary"; if (stream_dict.getKey("/Filter").isOrHasName("/Crypt")) { - if (stream_dict.getKey("/DecodeParms").isDictionary()) { - QPDFObjectHandle decode_parms = stream_dict.getKey("/DecodeParms"); - if (decode_parms.isDictionaryOfType("/CryptFilterDecodeParms")) { - QTC::TC("qpdf", "QPDF_encryption stream crypt filter"); - method = encp->interpretCF(decode_parms.getKey("/Name")); + if (Dictionary decode_parms = stream_dict["/DecodeParms"]) { + if (Name(decode_parms["/Type"]) == "/CryptFilterDecodeParms") { + method = encp->interpretCF(decode_parms["/Name"]); method_source = "stream's Crypt decode parameters"; } - } else if ( - stream_dict.getKey("/DecodeParms").isArray() && - stream_dict.getKey("/Filter").isArray()) { - auto filter = stream_dict.getKey("/Filter"); - auto decode = stream_dict.getKey("/DecodeParms"); + } else { + Array filter = stream_dict["/Filter"]; + Array decode = stream_dict.getKey("/DecodeParms"); if (filter.size() == decode.size()) { - int i = 0; - for (auto const& item: filter.as_array()) { - if (item.isNameAndEquals("/Crypt")) { - auto crypt_params = decode.getArrayItem(i); - if (crypt_params.isDictionary() && - crypt_params.getKey("/Name").isName()) { - method = encp->interpretCF(crypt_params.getKey("/Name")); + size_t i = 0; + for (Name item: filter) { + if (item == "/Crypt") { + if (Name name = decode[i]["/Name"]) { + method = encp->interpretCF(name); method_source = "stream's Crypt decode parameters (array)"; } break; @@ -976,8 +965,7 @@ QPDF::decryptStream( } if (method == e_unknown) { - if ((!encp->encrypt_metadata) && is_root_metadata) { - QTC::TC("qpdf", "QPDF_encryption cleartext metadata"); + if (!encp->encrypt_metadata && is_root_metadata) { method = e_none; } else { method = encp->cf_stream; @@ -1002,13 +990,13 @@ QPDF::decryptStream( default: // filter local to this stream. - qpdf_for_warning.warn(QPDFExc( - qpdf_e_damaged_pdf, - file->getName(), - "", - file->getLastOffset(), - "unknown encryption filter for streams (check " + method_source + - "); streams may be decrypted improperly")); + qpdf_for_warning.warn( + {qpdf_e_damaged_pdf, + file->getName(), + "", + file->getLastOffset(), + "unknown encryption filter for streams (check " + method_source + + "); streams may be decrypted improperly"}); // To avoid repeated warnings, reset cf_stream. Assume we'd want to use AES if V == 4. encp->cf_stream = e_aes; use_aes = true; @@ -1017,11 +1005,9 @@ QPDF::decryptStream( } std::string key = getKeyForObject(encp, og, use_aes); if (use_aes) { - QTC::TC("qpdf", "QPDF_encryption aes decode stream"); decrypt_pipeline = std::make_unique("AES stream decryption", pipeline, false, key); } else { - QTC::TC("qpdf", "QPDF_encryption rc4 decode stream"); decrypt_pipeline = std::make_unique("RC4 stream decryption", pipeline, key); } pipeline = decrypt_pipeline.get(); diff --git a/qpdf/qpdf.testcov b/qpdf/qpdf.testcov index 2b46d76..9f535e5 100644 --- a/qpdf/qpdf.testcov +++ b/qpdf/qpdf.testcov @@ -96,7 +96,6 @@ QPDF recovered stream length 0 QPDF found wrong endstream in recovery 0 QPDF_Stream pipeStreamData with null pipeline 0 QPDFWriter not recompressing /FlateDecode 0 -QPDF_encryption xref stream from encrypted file 0 QPDFJob unable to filter 0 QUtil non-trivial UTF-16 0 QPDF xref overwrite invalid objgen 0 @@ -141,16 +140,12 @@ qpdf-c called qpdf_set_minimum_pdf_version 0 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 QPDF_encryption aes decode string 0 -QPDF_encryption cleartext metadata 0 -QPDF_encryption aes decode stream 0 QPDFWriter forcing object stream disable 0 QPDFWriter forced version disabled encryption 0 qpdf-c called qpdf_set_r4_encryption_parameters_insecure 0 qpdf-c called qpdf_set_static_aes_IV 0 -QPDF_encryption stream crypt filter 0 QPDF ERR object stream with wrong type 0 QPDF object gone after xref reconstruction 0 qpdf-c called qpdf_has_error 0