]> source.dussan.org Git - poi.git/commitdiff
Added MD4-option and some cleanups
authorAndreas Beeker <kiwiwings@apache.org>
Thu, 6 Mar 2014 00:53:09 +0000 (00:53 +0000)
committerAndreas Beeker <kiwiwings@apache.org>
Thu, 6 Mar 2014 00:53:09 +0000 (00:53 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1574732 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/poifs/crypt/HashAlgorithm.java
src/java/org/apache/poi/poifs/crypt/standard/StandardDecryptor.java
src/java/org/apache/poi/poifs/crypt/standard/StandardEncryptor.java
src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSettings.java
src/ooxml/testcases/org/apache/poi/poifs/crypt/TestDecryptor.java

index cd62883ac443a67442318dfc5e708d7ed84e9018..51217184baf0634c119c265c6a89e5fe7c2de099 100644 (file)
@@ -29,6 +29,7 @@ public enum HashAlgorithm {
     md5      (      "MD5",     -1,        "MD5", 16,        "HmacMD5", false),\r
     // although sunjc2 supports md2, hmac-md2 is only supported by bouncycastle\r
     md2      (      "MD2",     -1,        "MD2", 16,       "Hmac-MD2", true),\r
+    md4      (      "MD4",     -1,        "MD4", 16,       "Hmac-MD4", true),\r
     ripemd128("RipeMD128",     -1, "RIPEMD-128", 16, "HMac-RipeMD128", true),\r
     ripemd160("RipeMD160",     -1, "RIPEMD-160", 20, "HMac-RipeMD160", true),\r
     whirlpool("Whirlpool",     -1,  "WHIRLPOOL", 64, "HMac-Whirlpool", true),\r
index 18729a1ff069c890bc4c28e33a438478446a0389..a3bef188a64b2a404d450778ef31060911033953 100644 (file)
@@ -22,7 +22,6 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.security.GeneralSecurityException;
 import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
 import java.util.Arrays;
 
 import javax.crypto.Cipher;
@@ -61,7 +60,7 @@ public class StandardDecryptor extends Decryptor {
             byte encryptedVerifier[] = ver.getEncryptedVerifier();
             byte verifier[] = cipher.doFinal(encryptedVerifier);
             setVerifier(verifier);
-            MessageDigest sha1 = MessageDigest.getInstance(ver.getHashAlgorithm().jceId);
+            MessageDigest sha1 = CryptoFunctions.getMessageDigest(ver.getHashAlgorithm());
             byte[] calcVerifierHash = sha1.digest(verifier);
             byte encryptedVerifierHash[] = ver.getEncryptedVerifierHash();
             byte decryptedVerifierHash[] = cipher.doFinal(encryptedVerifierHash);
@@ -108,12 +107,8 @@ public class StandardDecryptor extends Decryptor {
             buff[i] = (byte) (buff[i] ^ hash[i]);
         }
 
-        try {
-            MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
-            return sha1.digest(buff);
-        } catch (NoSuchAlgorithmException e) {
-            throw new EncryptedDocumentException("hash algo not supported", e);
-        }
+        MessageDigest sha1 = CryptoFunctions.getMessageDigest(HashAlgorithm.sha1);
+        return sha1.digest(buff);
     }
 
     /**
index 236eac124a90c95fc4638d2b534be15b8d79b020..8a6ba176ffa4b019e833a439814328e1c3c07363 100644 (file)
@@ -85,7 +85,7 @@ public class StandardEncryptor extends Encryptor {
         \r
         try {\r
             byte encryptedVerifier[] = cipher.doFinal(verifier); \r
-            MessageDigest hashAlgo = MessageDigest.getInstance(ver.getHashAlgorithm().jceId);\r
+            MessageDigest hashAlgo = CryptoFunctions.getMessageDigest(ver.getHashAlgorithm());\r
             byte calcVerifierHash[] = hashAlgo.digest(verifier);\r
             \r
             // 2.3.3 EncryptionVerifier ...\r
index 1f521621b6bf9ac42b5a36eef3c668dd9de1d595..dab349a274d1593dc743746425e59be224efa281 100644 (file)
@@ -205,7 +205,10 @@ public class XWPFSettings extends POIXMLDocumentPart {
                 providerType = STCryptProv.RSA_FULL;
                 sid = 1;
                 break;
-            // md4 is not supported by JCE
+            case md4:
+                providerType = STCryptProv.RSA_FULL;
+                sid = 2;
+                break;
             case md5:
                 providerType = STCryptProv.RSA_FULL;
                 sid = 3;
@@ -274,6 +277,7 @@ public class XWPFSettings extends POIXMLDocumentPart {
         HashAlgorithm hashAlgo;
         switch (sid.intValue()) {
         case 1: hashAlgo = HashAlgorithm.md2; break;
+        case 2: hashAlgo = HashAlgorithm.md4; break;
         case 3: hashAlgo = HashAlgorithm.md5; break;
         case 4: hashAlgo = HashAlgorithm.sha1; break;
         case 12: hashAlgo = HashAlgorithm.sha256; break;
index 95a94c4667f8c8ccf6b6bb87a7320754dab6ebea..48bc7a15a3fd3eac9b2c887332bf6577106b559b 100644 (file)
@@ -16,6 +16,9 @@
 ==================================================================== */\r
 package org.apache.poi.poifs.crypt;\r
 \r
+import static org.junit.Assert.assertEquals;\r
+import static org.junit.Assert.assertTrue;\r
+\r
 import java.io.ByteArrayInputStream;\r
 import java.io.IOException;\r
 import java.io.InputStream;\r
@@ -23,17 +26,17 @@ import java.security.GeneralSecurityException;
 import java.util.zip.ZipEntry;\r
 import java.util.zip.ZipInputStream;\r
 \r
-import junit.framework.TestCase;\r
-\r
 import org.apache.poi.POIDataSamples;\r
 import org.apache.poi.poifs.filesystem.POIFSFileSystem;\r
+import org.junit.Test;\r
 \r
 /**\r
  *  @author Maxim Valyanskiy\r
  *  @author Gary King\r
  */\r
-public class TestDecryptor extends TestCase {\r
-    public void testPasswordVerification() throws IOException, GeneralSecurityException {\r
+public class TestDecryptor {\r
+    @Test\r
+    public void passwordVerification() throws IOException, GeneralSecurityException {\r
         POIFSFileSystem fs = new POIFSFileSystem(POIDataSamples.getPOIFSInstance().openResourceAsStream("protect.xlsx"));\r
 \r
         EncryptionInfo info = new EncryptionInfo(fs);\r
@@ -43,7 +46,8 @@ public class TestDecryptor extends TestCase {
         assertTrue(d.verifyPassword(Decryptor.DEFAULT_PASSWORD));\r
     }\r
 \r
-    public void testDecrypt() throws IOException, GeneralSecurityException {\r
+    @Test\r
+    public void decrypt() throws IOException, GeneralSecurityException {\r
         POIFSFileSystem fs = new POIFSFileSystem(POIDataSamples.getPOIFSInstance().openResourceAsStream("protect.xlsx"));\r
 \r
         EncryptionInfo info = new EncryptionInfo(fs);\r
@@ -55,7 +59,8 @@ public class TestDecryptor extends TestCase {
         zipOk(fs, d);\r
     }\r
 \r
-    public void testAgile() throws IOException, GeneralSecurityException {\r
+    @Test\r
+    public void agile() throws IOException, GeneralSecurityException {\r
         POIFSFileSystem fs = new POIFSFileSystem(POIDataSamples.getPOIFSInstance().openResourceAsStream("protected_agile.docx"));\r
 \r
         EncryptionInfo info = new EncryptionInfo(fs);\r
@@ -83,7 +88,9 @@ public class TestDecryptor extends TestCase {
             }\r
         }\r
     }\r
-    public void testDataLength() throws Exception {\r
+\r
+    @Test\r
+    public void dataLength() throws Exception {\r
         POIFSFileSystem fs = new POIFSFileSystem(POIDataSamples.getPOIFSInstance().openResourceAsStream("protected_agile.docx"));\r
 \r
         EncryptionInfo info = new EncryptionInfo(fs);\r