You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2015/04/29 20:47:21 UTC

svn commit: r1676815 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/encryption: PDEncryption.java PublicKeySecurityHandler.java StandardSecurityHandler.java

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