]> source.dussan.org Git - poi.git/commitdiff
JCE policy fix
authorAndreas Beeker <kiwiwings@apache.org>
Wed, 25 Dec 2013 01:04:29 +0000 (01:04 +0000)
committerAndreas Beeker <kiwiwings@apache.org>
Wed, 25 Dec 2013 01:04:29 +0000 (01:04 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1553342 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/poifs/crypt/CryptoFunctions.java
src/ooxml/java/org/apache/poi/poifs/crypt/agile/AgileDecryptor.java
src/ooxml/java/org/apache/poi/poifs/crypt/agile/AgileEncryptor.java
src/ooxml/testcases/org/apache/poi/poifs/crypt/TestAgileEncryptionParameters.java
src/ooxml/testcases/org/apache/poi/poifs/crypt/TestCertificateEncryption.java
src/ooxml/testcases/org/apache/poi/poifs/crypt/TestEncryptor.java

index 33876fc975358e6d80c4c6c514e3f3f3b3e8bdd3..42ca4341980a8544dea3f11c6a1b5eecc364861e 100644 (file)
@@ -22,12 +22,14 @@ import java.security.GeneralSecurityException;
 import java.security.MessageDigest;\r
 import java.security.Provider;\r
 import java.security.Security;\r
+import java.security.spec.AlgorithmParameterSpec;\r
 import java.util.Arrays;\r
 \r
 import javax.crypto.Cipher;\r
 import javax.crypto.Mac;\r
 import javax.crypto.SecretKey;\r
 import javax.crypto.spec.IvParameterSpec;\r
+import javax.crypto.spec.RC2ParameterSpec;\r
 \r
 import org.apache.poi.EncryptedDocumentException;\r
 import org.apache.poi.util.LittleEndian;\r
@@ -188,8 +190,13 @@ public class CryptoFunctions {
             if (vec == null) {\r
                 cipher.init(cipherMode, key);\r
             } else {\r
-                IvParameterSpec iv = new IvParameterSpec(vec);\r
-                cipher.init(cipherMode, key, iv);\r
+                AlgorithmParameterSpec aps;\r
+                if (cipherAlgorithm == CipherAlgorithm.rc2) {\r
+                    aps = new RC2ParameterSpec(key.getEncoded().length*8, vec);\r
+                } else {\r
+                    aps = new IvParameterSpec(vec);\r
+                }\r
+                cipher.init(cipherMode, key, aps);\r
             }\r
             return cipher;\r
         } catch (GeneralSecurityException e) {\r
index 7e45786db9c569cb4cbdc718126678332b8ad400..193e7a766b2891634504b60bbaff0a0ca643e3b1 100644 (file)
@@ -29,12 +29,14 @@ import java.security.GeneralSecurityException;
 import java.security.KeyPair;
 import java.security.MessageDigest;
 import java.security.cert.X509Certificate;
+import java.security.spec.AlgorithmParameterSpec;
 import java.util.Arrays;
 
 import javax.crypto.Cipher;
 import javax.crypto.Mac;
 import javax.crypto.SecretKey;
 import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.RC2ParameterSpec;
 import javax.crypto.spec.SecretKeySpec;
 
 import org.apache.poi.EncryptedDocumentException;
@@ -383,7 +385,14 @@ public class AgileDecryptor extends Decryptor {
             LittleEndian.putInt(blockKey, 0, index);
             EncryptionHeader header = info.getHeader();
             byte[] iv = generateIv(header.getHashAlgorithmEx(), header.getKeySalt(), blockKey, getBlockSizeInBytes());
-            _cipher.init(Cipher.DECRYPT_MODE, getSecretKey(), new IvParameterSpec(iv));
+            AlgorithmParameterSpec aps;
+            if (header.getCipherAlgorithm() == CipherAlgorithm.rc2) {
+                aps = new RC2ParameterSpec(getSecretKey().getEncoded().length*8, iv);
+            } else {
+                aps = new IvParameterSpec(iv);
+            }
+            
+            _cipher.init(Cipher.DECRYPT_MODE, getSecretKey(), aps);
             if (_lastIndex != index)
                 _stream.skip((index - _lastIndex) << 12);
 
index 455c8cd4d7770643b1378edc243d33a9c093fc02..aa538a99081e6bf81bb67ae51c58adfc3b107696 100644 (file)
@@ -41,6 +41,7 @@ import java.security.GeneralSecurityException;
 import java.security.MessageDigest;\r
 import java.security.SecureRandom;\r
 import java.security.cert.CertificateEncodingException;\r
+import java.security.spec.AlgorithmParameterSpec;\r
 import java.util.HashMap;\r
 import java.util.Map;\r
 import java.util.Random;\r
@@ -49,9 +50,11 @@ import javax.crypto.Cipher;
 import javax.crypto.Mac;\r
 import javax.crypto.SecretKey;\r
 import javax.crypto.spec.IvParameterSpec;\r
+import javax.crypto.spec.RC2ParameterSpec;\r
 import javax.crypto.spec.SecretKeySpec;\r
 \r
 import org.apache.poi.EncryptedDocumentException;\r
+import org.apache.poi.poifs.crypt.CipherAlgorithm;\r
 import org.apache.poi.poifs.crypt.CryptoFunctions;\r
 import org.apache.poi.poifs.crypt.DataSpaceMapUtils;\r
 import org.apache.poi.poifs.crypt.EncryptionHeader;\r
@@ -315,7 +318,14 @@ public class AgileEncryptor extends Encryptor {
             LittleEndian.putInt(blockKey, 0, index);\r
             byte[] iv = generateIv(header.getHashAlgorithmEx(), header.getKeySalt(), blockKey, blockSize);\r
             try {\r
-                _cipher.init(Cipher.ENCRYPT_MODE, getSecretKey(), new IvParameterSpec(iv));\r
+                AlgorithmParameterSpec aps;\r
+                if (header.getCipherAlgorithm() == CipherAlgorithm.rc2) {\r
+                    aps = new RC2ParameterSpec(getSecretKey().getEncoded().length*8, iv);\r
+                } else {\r
+                    aps = new IvParameterSpec(iv);\r
+                }\r
+                \r
+                _cipher.init(Cipher.ENCRYPT_MODE, getSecretKey(), aps);\r
                 int ciLen = _cipher.doFinal(_chunk, 0, posInChunk, _chunk);\r
                 out.write(_chunk, 0, ciLen);\r
             } catch (GeneralSecurityException e) {\r
index 469286606f57156dfd344aec2c15f6a1bb890251..131a5c2e49636e475df74be505106b8bba09fad1 100644 (file)
@@ -28,9 +28,12 @@ import java.util.ArrayList;
 import java.util.Collection;\r
 import java.util.List;\r
 \r
+import javax.crypto.Cipher;\r
+\r
 import org.apache.poi.POIDataSamples;\r
 import org.apache.poi.poifs.filesystem.POIFSFileSystem;\r
 import org.apache.poi.util.IOUtils;\r
+import org.junit.Assume;\r
 import org.junit.BeforeClass;\r
 import org.junit.Test;\r
 import org.junit.runner.RunWith;\r
@@ -77,6 +80,9 @@ public class TestAgileEncryptionParameters {
     \r
     @Test\r
     public void testAgileEncryptionModes() throws Exception {\r
+        int maxKeyLen = Cipher.getMaxAllowedKeyLength(ca.jceId);\r
+        Assume.assumeTrue("Please install JCE Unlimited Strength Jurisdiction Policy files", maxKeyLen >= ca.defaultKeySize);\r
+        \r
         ByteArrayOutputStream bos = new ByteArrayOutputStream();\r
 \r
         POIFSFileSystem fsEnc = new POIFSFileSystem();\r
index d74719cc00f40867643f5a61f2ab7488fa4fb1cb..4b2ffb2b4e954adba4fa6e7e4e3583b85cc8bc59 100644 (file)
@@ -157,7 +157,7 @@ public class TestCertificateEncryption {
     @Test\r
     public void testCertificateEncryption() throws Exception {\r
         POIFSFileSystem fs = new POIFSFileSystem();\r
-        EncryptionInfo info = new EncryptionInfo(fs, EncryptionMode.agile, CipherAlgorithm.aes192, HashAlgorithm.sha1, -1, -1, ChainingMode.cbc);\r
+        EncryptionInfo info = new EncryptionInfo(fs, EncryptionMode.agile, CipherAlgorithm.aes128, HashAlgorithm.sha1, -1, -1, ChainingMode.cbc);\r
         AgileEncryptionVerifier aev = (AgileEncryptionVerifier)info.getVerifier();\r
         CertData certData = loadKeystore();\r
         aev.addCertificate(certData.x509);\r
index 957ec10973f2e1c3bbab30536eaf056836111720..b04da659dcfbeb44d135fef7c55136b26b8d1fe4 100644 (file)
@@ -30,6 +30,8 @@ import java.io.InputStream;
 import java.io.OutputStream;\r
 import java.util.Iterator;\r
 \r
+import javax.crypto.Cipher;\r
+\r
 import org.apache.poi.POIDataSamples;\r
 import org.apache.poi.poifs.crypt.agile.AgileEncryptionHeader;\r
 import org.apache.poi.poifs.filesystem.DirectoryNode;\r
@@ -39,11 +41,15 @@ import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
 import org.apache.poi.poifs.filesystem.POIFSFileSystem;\r
 import org.apache.poi.util.BoundedInputStream;\r
 import org.apache.poi.util.IOUtils;\r
+import org.junit.Assume;\r
 import org.junit.Test;\r
 \r
 public class TestEncryptor {\r
     @Test\r
     public void testAgileEncryption() throws Exception {\r
+        int maxKeyLen = Cipher.getMaxAllowedKeyLength("AES");\r
+        Assume.assumeTrue("Please install JCE Unlimited Strength Jurisdiction Policy files for AES 256", maxKeyLen == 2147483647);\r
+\r
         File file = POIDataSamples.getDocumentInstance().getFile("bug53475-password-is-pass.docx");\r
         String pass = "pass";\r
         NPOIFSFileSystem nfs = new NPOIFSFileSystem(file);\r