Author: tilman Date: Wed Apr 29 18:47:20 2015 New Revision: 1676815 URL: http://svn.apache.org/r1676815 Log: PDFBOX-2781: remove / ignore the CF, StmF, and StrF entries if V is not 4 or 5.
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/encryption/PDEncryption.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/encryption/PublicKeySecurityHandler.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/encryption/StandardSecurityHandler.java Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/encryption/PDEncryption.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/encryption/PDEncryption.java?rev=1676815&r1=1676814&r2=1676815&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/encryption/PDEncryption.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/encryption/PDEncryption.java Wed Apr 29 18:47:20 2015 @@ -591,6 +591,13 @@ public class PDEncryption return perms; } + /** + * remove CF, StmF, and StrF entries. This is to be called if V is not 4 or 5. + */ + public void removeV45filters() + { + dictionary.setItem(COSName.CF, null); + dictionary.setItem(COSName.STM_F, null); + dictionary.setItem(COSName.STR_F, null); + } } - - \ No newline at end of file Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/encryption/PublicKeySecurityHandler.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/encryption/PublicKeySecurityHandler.java?rev=1676815&r1=1676814&r2=1676815&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/encryption/PublicKeySecurityHandler.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/encryption/PublicKeySecurityHandler.java Wed Apr 29 18:47:20 2015 @@ -297,6 +297,10 @@ public final class PublicKeySecurityHand dictionary.setFilter(FILTER); dictionary.setLength(this.keyLength); dictionary.setVersion(2); + + // remove CF, StmF, and StrF entries that may be left from a previous encryption + dictionary.removeV45filters(); + dictionary.setSubFilter(SUBFILTER); // create the 20 bytes seed Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/encryption/StandardSecurityHandler.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/encryption/StandardSecurityHandler.java?rev=1676815&r1=1676814&r2=1676815&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/encryption/StandardSecurityHandler.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/encryption/StandardSecurityHandler.java Wed Apr 29 18:47:20 2015 @@ -99,7 +99,7 @@ public final class StandardSecurityHandl /** * Computes the version number of the StandardSecurityHandler * regarding the encryption key length. - * See PDF Spec 1.6 p 93 + * See PDF Spec 1.6 p 93 and PDF 1.7 AEL3 * * @return The computed version number. */ @@ -245,17 +245,21 @@ public final class StandardSecurityHandl validatePerms(encryption, dicPermissions, encryptMetadata); } - // detect whether AES encryption is used. This assumes that the encryption algo is - // stored in the PDCryptFilterDictionary - PDCryptFilterDictionary stdCryptFilterDictionary = encryption.getStdCryptFilterDictionary(); - - if (stdCryptFilterDictionary != null) + if (encryption.getVersion() == 4 || encryption.getVersion() == 5) { - COSName cryptFilterMethod = stdCryptFilterDictionary.getCryptFilterMethod(); - if (cryptFilterMethod != null) - { - setAES("AESV2".equalsIgnoreCase(cryptFilterMethod.getName()) || - "AESV3".equalsIgnoreCase(cryptFilterMethod.getName())); + // detect whether AES encryption is used. This assumes that the encryption algo is + // stored in the PDCryptFilterDictionary + // However, crypt filters are used only when V is 4 or 5. + PDCryptFilterDictionary stdCryptFilterDictionary = encryption.getStdCryptFilterDictionary(); + + if (stdCryptFilterDictionary != null) + { + COSName cryptFilterMethod = stdCryptFilterDictionary.getCryptFilterMethod(); + if (cryptFilterMethod != null) + { + setAES("AESV2".equalsIgnoreCase(cryptFilterMethod.getName()) + || "AESV3".equalsIgnoreCase(cryptFilterMethod.getName())); + } } } } @@ -332,6 +336,11 @@ public final class StandardSecurityHandl int revision = computeRevisionNumber(); encryptionDictionary.setFilter(FILTER); encryptionDictionary.setVersion(version); + if (version != 4 && version != 5) + { + // remove CF, StmF, and StrF entries that may be left from a previous encryption + encryptionDictionary.removeV45filters(); + } encryptionDictionary.setRevision(revision); encryptionDictionary.setLength(keyLength);