From eae8370cd9c4e6ac748931a425721303561bd6ac Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Fri, 14 Jun 2013 20:40:20 -0400 Subject: [PATCH] Add optional /Length key in crypt filter dictionary --- ChangeLog | 4 ++++ libqpdf/QPDFWriter.cc | 6 +++++- qpdf/qtest/qpdf/V4-aes-clearmeta.pdf | 4 ++-- qpdf/qtest/qpdf/V4-aes.pdf | 4 ++-- qpdf/qtest/qpdf/V4-clearmeta.pdf | Bin 15214 -> 15225 bytes qpdf/qtest/qpdf/V4.pdf | Bin 14770 -> 14781 bytes qpdf/qtest/qpdf/c-r4.pdf | Bin 10881 -> 10892 bytes qpdf/qtest/qpdf/c-r5-in.pdf | Bin 11195 -> 11206 bytes qpdf/qtest/qpdf/c-r6-in.pdf | Bin 11195 -> 11206 bytes 9 files changed, 13 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5dafe0bc..13c964d2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2013-06-14 Jay Berkenbilt + * Add /Length key to crypt filter dictionary for encrypted files. + This key is optional, but some version of MacOS reportedly fail to + open encrypted PDF files without this key. + * Bug fix: properly handle object stream generation when the original file has some compressible objects with generation != 0. diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc index dde6e559..8d169f3b 100644 --- a/libqpdf/QPDFWriter.cc +++ b/libqpdf/QPDFWriter.cc @@ -726,8 +726,12 @@ QPDFWriter::setEncryptionParametersInternal( std::string method = (this->encrypt_use_aes ? ((V < 5) ? "/AESV2" : "/AESV3") : "/V2"); + // The PDF spec says the /Length key is optional, but the PDF + // previewer on some versions of MacOS won't open encrypted + // files without it. encryption_dictionary["/CF"] = - "<< /StdCF << /AuthEvent /DocOpen /CFM " + method + " >> >>"; + "<< /StdCF << /AuthEvent /DocOpen /CFM " + method + + " /Length " + std::string((V < 5) ? "16" : "32") + " >> >>"; } this->encrypted = true; diff --git a/qpdf/qtest/qpdf/V4-aes-clearmeta.pdf b/qpdf/qtest/qpdf/V4-aes-clearmeta.pdf index 61c57f5c..07edd079 100644 --- a/qpdf/qtest/qpdf/V4-aes-clearmeta.pdf +++ b/qpdf/qtest/qpdf/V4-aes-clearmeta.pdf @@ -327,7 +327,7 @@ endobj << /Dest [ 30 0 R /XYZ null null null ] /Parent 73 0 R /Title <0e1c2a38465462707e8c9aa8b6c4d2e04e0071f73ffb55e63fee8c296c57a5116ad91676f573b1c2fe59aca102ad3421cc50bd84f88f518cd8bbd9962c7a59d0> /Type /Outline >> endobj 79 0 obj -<< /CF << /StdCF << /AuthEvent /DocOpen /CFM /AESV2 >> >> /EncryptMetadata false /Filter /Standard /Length 128 /O <36451bd39d753b7c1d10922c28e6665aa4f3353fb0348b536893e3b1db5c579b> /P -4 /R 4 /StmF /StdCF /StrF /StdCF /U /V 4 >> +<< /CF << /StdCF << /AuthEvent /DocOpen /CFM /AESV2 /Length 16 >> >> /EncryptMetadata false /Filter /Standard /Length 128 /O <36451bd39d753b7c1d10922c28e6665aa4f3353fb0348b536893e3b1db5c579b> /P -4 /R 4 /StmF /StdCF /StrF /StdCF /U /V 4 >> endobj xref 0 80 @@ -413,5 +413,5 @@ xref 0000014817 00000 n trailer << /Info 2 0 R /Root 1 0 R /Size 80 /ID [<66d36a30a97e0f16f39955c6221e0c2a><31415926535897932384626433832795>] /Encrypt 79 0 R >> startxref -15129 +15140 %%EOF diff --git a/qpdf/qtest/qpdf/V4-aes.pdf b/qpdf/qtest/qpdf/V4-aes.pdf index a779a500..8bb68a1b 100644 --- a/qpdf/qtest/qpdf/V4-aes.pdf +++ b/qpdf/qtest/qpdf/V4-aes.pdf @@ -306,7 +306,7 @@ endobj << /Dest [ 30 0 R /XYZ null null null ] /Parent 73 0 R /Title <0e1c2a38465462707e8c9aa8b6c4d2e0a57e63f459f8a8428dfc859f799038f972379574e01ef823841a76dbefaa14665223960437217436968f6261cc32feb9> /Type /Outline >> endobj 79 0 obj -<< /CF << /StdCF << /AuthEvent /DocOpen /CFM /AESV2 >> >> /Filter /Standard /Length 128 /O <36451bd39d753b7c1d10922c28e6665aa4f3353fb0348b536893e3b1db5c579b> /P -4 /R 4 /StmF /StdCF /StrF /StdCF /U <32c27288b9ec6a4fab94e6188828595c0122456a91bae5134273a6db134c87c4> /V 4 >> +<< /CF << /StdCF << /AuthEvent /DocOpen /CFM /AESV2 /Length 16 >> >> /Filter /Standard /Length 128 /O <36451bd39d753b7c1d10922c28e6665aa4f3353fb0348b536893e3b1db5c579b> /P -4 /R 4 /StmF /StdCF /StrF /StdCF /U <32c27288b9ec6a4fab94e6188828595c0122456a91bae5134273a6db134c87c4> /V 4 >> endobj xref 0 80 @@ -392,5 +392,5 @@ xref 0000014404 00000 n trailer << /Info 2 0 R /Root 1 0 R /Size 80 /ID [<66d36a30a97e0f16f39955c6221e0c2a><31415926535897932384626433832795>] /Encrypt 79 0 R >> startxref -14693 +14704 %%EOF diff --git a/qpdf/qtest/qpdf/V4-clearmeta.pdf b/qpdf/qtest/qpdf/V4-clearmeta.pdf index 01325cc532740da296980b9cc4eed75d0301884a..7d5786c0472e5cccda36169b3fdf224f3c0ce6f8 100644 GIT binary patch delta 33 ocmaD?_Oon5r!kklPikIzNrr-<+2#)8yX>5%rd+D3uKsRZ0P3|1UjP6A delta 22 dcmexa_O5J0r}5?~#&_5`O-#5{RbBnvxBz=N2u1(^ diff --git a/qpdf/qtest/qpdf/V4.pdf b/qpdf/qtest/qpdf/V4.pdf index 2848782e8f282383ed024b605c0563d4e17ec245..0827f6e1d31cef85597a4d201a06cb314c61fd4d 100644 GIT binary patch delta 33 pcmdl~ytjD66GJY2pVYkck_-hyv(1kUkFj$a8gi+sy863u0RZSh3v>Vg delta 22 ecmdm6ys3D@6T{8#4Ue*O8W?b?s=E5SaRC5&TL@bK diff --git a/qpdf/qtest/qpdf/c-r4.pdf b/qpdf/qtest/qpdf/c-r4.pdf index d985109f4f9d111d8b9bb1a64c992d1ad000ad43..89efb6a7427432d0c6c37a01435faed7e4291184 100644 GIT binary patch delta 45 zcmZn+?Frprt-+=5lbV-alA&N|w%JNUf{DGBjluPo`mf26TJoGGhFq$uuKsRZ07h>N A;Q#;t delta 60 zcmeAPZ4BLDt+ClnL!3!pl#RjliTZo4)V!49lA_eaTo5ZiDT}MPB(bQZq9`?u%h15o N*nmq_)z#mP3jk^~68``I diff --git a/qpdf/qtest/qpdf/c-r5-in.pdf b/qpdf/qtest/qpdf/c-r5-in.pdf index 19c67a30dbf07af2c8e3e1314e9ecc707421652b..b2b249a59eb720d9d824e912b7f25ba9f16daf60 100644 GIT binary patch delta 694 zcmdlTek^>0fY`*xqMSaddFdq?3Kj;F3#F|mXNsM~6zmqa!xU7Kz#_O4n_z$>7M0Jj z3D!wrQ7I~oAy|p&9A_B}Ro0VlVG}Hr#iEi!4vXM?Y=UO;SX7?HCYYjtMdfd7f|C@n zsMJ)#B6t9sV7M|CmG7_#wyL11e5isYEH|s7sRE@8FEuQJ53vbWsAEyduaU>44^3;v zMw@Fi_?ZosoMT{^H9^CaD>W~rxTGjGF&D(jPs-vdE=epZsVGWK<1#d`Fg4{;Rdw}u G;{pJJ%kU2X delta 627 zcmX>WzB_z_fEb5QYF>IthJwY!2jY{9q^%}rik-v|>lU}e5L1%C6x)eKEI<-d-E%Br zbyAq>M5WQiDlpvPEQ7AbYVs{CVuiAp>Nw;u#pYuXGn20fY`*xqMSaddFdq?3Kj;F3#F|mXNsM~6zmqa!xU7Kz#_O4n_z$>7M0Jj z3D!wrQ7I~oAy|p&9A_B}Ro0VlVG}Hr#iEi!4vXM?Y=UO;SX7?HCYYjtMdfd7f|C@n zsMJ)#B6t9sV7M|CmG7_#wyL11e5isYEH|s7sRE@8FEuQJ53vbWsAEyduaU>44^3;v zMw@Fi_?ZosoMT{^H9^CaD>W~rxTGjGF&D(jPs-vdE=epZsVGWK<1#d`Fg4{;Rdw}u G;{pJJ%kU2X delta 627 zcmX>WzB_z_fEb5QYF>IthJwY!2jY{9q^%}rik-v|>lU}e5L1%C6x)eKEI<-d-E%Br zbyAq>M5WQiDlpvPEQ7AbYVs{CVuiAp>Nw;u#pYuXGn2