Added MD4-option and some cleanups

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1574732 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Andreas Beeker 2014-03-06 00:53:09 +00:00
parent 51863e5267
commit 3fe86eca24
5 changed files with 24 additions and 17 deletions

View File

@ -29,6 +29,7 @@ public enum HashAlgorithm {
md5 ( "MD5", -1, "MD5", 16, "HmacMD5", false),
// although sunjc2 supports md2, hmac-md2 is only supported by bouncycastle
md2 ( "MD2", -1, "MD2", 16, "Hmac-MD2", true),
md4 ( "MD4", -1, "MD4", 16, "Hmac-MD4", true),
ripemd128("RipeMD128", -1, "RIPEMD-128", 16, "HMac-RipeMD128", true),
ripemd160("RipeMD160", -1, "RIPEMD-160", 20, "HMac-RipeMD160", true),
whirlpool("Whirlpool", -1, "WHIRLPOOL", 64, "HMac-Whirlpool", true),

View 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);
}
/**

View File

@ -85,7 +85,7 @@ public class StandardEncryptor extends Encryptor {
try {
byte encryptedVerifier[] = cipher.doFinal(verifier);
MessageDigest hashAlgo = MessageDigest.getInstance(ver.getHashAlgorithm().jceId);
MessageDigest hashAlgo = CryptoFunctions.getMessageDigest(ver.getHashAlgorithm());
byte calcVerifierHash[] = hashAlgo.digest(verifier);
// 2.3.3 EncryptionVerifier ...

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

View File

@ -16,6 +16,9 @@
==================================================================== */
package org.apache.poi.poifs.crypt;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
@ -23,17 +26,17 @@ import java.security.GeneralSecurityException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import junit.framework.TestCase;
import org.apache.poi.POIDataSamples;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.junit.Test;
/**
* @author Maxim Valyanskiy
* @author Gary King
*/
public class TestDecryptor extends TestCase {
public void testPasswordVerification() throws IOException, GeneralSecurityException {
public class TestDecryptor {
@Test
public void passwordVerification() throws IOException, GeneralSecurityException {
POIFSFileSystem fs = new POIFSFileSystem(POIDataSamples.getPOIFSInstance().openResourceAsStream("protect.xlsx"));
EncryptionInfo info = new EncryptionInfo(fs);
@ -43,7 +46,8 @@ public class TestDecryptor extends TestCase {
assertTrue(d.verifyPassword(Decryptor.DEFAULT_PASSWORD));
}
public void testDecrypt() throws IOException, GeneralSecurityException {
@Test
public void decrypt() throws IOException, GeneralSecurityException {
POIFSFileSystem fs = new POIFSFileSystem(POIDataSamples.getPOIFSInstance().openResourceAsStream("protect.xlsx"));
EncryptionInfo info = new EncryptionInfo(fs);
@ -55,7 +59,8 @@ public class TestDecryptor extends TestCase {
zipOk(fs, d);
}
public void testAgile() throws IOException, GeneralSecurityException {
@Test
public void agile() throws IOException, GeneralSecurityException {
POIFSFileSystem fs = new POIFSFileSystem(POIDataSamples.getPOIFSInstance().openResourceAsStream("protected_agile.docx"));
EncryptionInfo info = new EncryptionInfo(fs);
@ -83,7 +88,9 @@ public class TestDecryptor extends TestCase {
}
}
}
public void testDataLength() throws Exception {
@Test
public void dataLength() throws Exception {
POIFSFileSystem fs = new POIFSFileSystem(POIDataSamples.getPOIFSInstance().openResourceAsStream("protected_agile.docx"));
EncryptionInfo info = new EncryptionInfo(fs);