Author: ggregory Date: Sat May 14 01:33:23 2016 New Revision: 1743778 URL: http://svn.apache.org/viewvc?rev=1743778&view=rev Log: [CODEC-211] Create enum MessageDigestAlgorithm and deprecate class MessageDigestAlgorithms
Added: commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/MessageDigestAlgorithm.java commons/proper/codec/trunk/src/test/java/org/apache/commons/codec/digest/MessageDigestAlgorithmTest.java Modified: commons/proper/codec/trunk/src/changes/changes.xml commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/DigestUtils.java commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/MessageDigestAlgorithms.java commons/proper/codec/trunk/src/test/java/org/apache/commons/codec/digest/DigestUtilsTest.java Modified: commons/proper/codec/trunk/src/changes/changes.xml URL: http://svn.apache.org/viewvc/commons/proper/codec/trunk/src/changes/changes.xml?rev=1743778&r1=1743777&r2=1743778&view=diff ============================================================================== --- commons/proper/codec/trunk/src/changes/changes.xml (original) +++ commons/proper/codec/trunk/src/changes/changes.xml Sat May 14 01:33:23 2016 @@ -47,6 +47,7 @@ The <action> type attribute can be add,u <action dev="ggregory" type="fix" issue="CODEC-207" due-to="Gary Gregory">Charsets Javadoc breaks build when using Java 8</action> <action dev="ggregory" type="fix" issue="CODEC-199" due-to="Yossi Tamari">Bug in HW rule in Soundex</action> <action dev="ggregory" type="fix" issue="CODEC-209" due-to="Gary Gregory">Javadoc for SHA-224 DigestUtils methods should mention Java 1.8.0 restriction instead of 1.4.0.</action> + <action dev="ggregory" type="add" issue="CODEC-211" due-to="Gary Gregory">Create enum MessageDigestAlgorithm and deprecate class MessageDigestAlgorithms</action> <action dev="ggregory" type="add" issue="CODEC-210" due-to="Gary Gregory">Add DigestUtils.getDigest(String, MessageDigest)</action> <action dev="ggregory" type="add" issue="CODEC-208" due-to="Gary Gregory">Make some DigestUtils APIs public</action> <action dev="ggregory" type="add" issue="CODEC-206" due-to="Gary Gregory">Add java.io.File APIs to DigestUtils</action> Modified: commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/DigestUtils.java URL: http://svn.apache.org/viewvc/commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/DigestUtils.java?rev=1743778&r1=1743777&r2=1743778&view=diff ============================================================================== --- commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/DigestUtils.java (original) +++ commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/DigestUtils.java Sat May 14 01:33:23 2016 @@ -40,6 +40,22 @@ public class DigestUtils { private static final int STREAM_BUFFER_LENGTH = 1024; /** + * Read through an ByteBuffer and returns the digest for the data. Provided for symmetry with other methods. + * + * @param messageDigest + * The MessageDigest to use (e.g. MD5) + * @param data + * Data to digest + * @return the digest + * @throws IOException + * On error reading from the stream + * @since 1.11 + */ + public static byte[] digest(final MessageDigest messageDigest, final byte[] data) { + return messageDigest.digest(data); + } + + /** * Read through an ByteBuffer and returns the digest for the data * * @param messageDigest @@ -110,14 +126,16 @@ public class DigestUtils { } /** - * Returns a <code>MessageDigest</code> for the given <code>algorithm</code> or a default if there is a problem getting the algorithm. + * Returns a <code>MessageDigest</code> for the given <code>algorithm</code> or a default if there is a problem + * getting the algorithm. * * @param algorithm - * the name of the algorithm requested. See <a - * href="http://docs.oracle.com/javase/6/docs/technotes/guides/security/crypto/CryptoSpec.html#AppA" - * >Appendix A in the Java Cryptography Architecture Reference Guide</a> for information about standard + * the name of the algorithm requested. See + * <a href="http://docs.oracle.com/javase/6/docs/technotes/guides/security/crypto/CryptoSpec.html#AppA" > + * Appendix A in the Java Cryptography Architecture Reference Guide</a> for information about standard * algorithm names. - * @param defaultMessageDigest The default MessageDigest. + * @param defaultMessageDigest + * The default MessageDigest. * @return A digest instance. * @see MessageDigest#getInstance(String) * @throws IllegalArgumentException @@ -143,7 +161,7 @@ public class DigestUtils { * @since 1.7 */ public static MessageDigest getMd2Digest() { - return getDigest(MessageDigestAlgorithms.MD2); + return MessageDigestAlgorithm.MD2.getMessageDigest(); } /** @@ -156,7 +174,7 @@ public class DigestUtils { * @see MessageDigestAlgorithms#MD5 */ public static MessageDigest getMd5Digest() { - return getDigest(MessageDigestAlgorithms.MD5); + return MessageDigestAlgorithm.MD5.getMessageDigest(); } /** @@ -170,7 +188,7 @@ public class DigestUtils { * @since 1.7 */ public static MessageDigest getSha1Digest() { - return getDigest(MessageDigestAlgorithms.SHA_1); + return MessageDigestAlgorithm.SHA_1.getMessageDigest(); } /** @@ -186,7 +204,7 @@ public class DigestUtils { * @see MessageDigestAlgorithms#SHA_224 */ public static MessageDigest getSha224Digest() { - return getDigest(MessageDigestAlgorithms.SHA_224); + return MessageDigestAlgorithm.SHA_224.getMessageDigest(); } /** @@ -202,7 +220,7 @@ public class DigestUtils { * @see MessageDigestAlgorithms#SHA_256 */ public static MessageDigest getSha256Digest() { - return getDigest(MessageDigestAlgorithms.SHA_256); + return MessageDigestAlgorithm.SHA_256.getMessageDigest(); } /** @@ -218,7 +236,7 @@ public class DigestUtils { * @see MessageDigestAlgorithms#SHA_384 */ public static MessageDigest getSha384Digest() { - return getDigest(MessageDigestAlgorithms.SHA_384); + return MessageDigestAlgorithm.SHA_384.getMessageDigest(); } /** @@ -234,7 +252,7 @@ public class DigestUtils { * @see MessageDigestAlgorithms#SHA_512 */ public static MessageDigest getSha512Digest() { - return getDigest(MessageDigestAlgorithms.SHA_512); + return MessageDigestAlgorithm.SHA_512.getMessageDigest(); } /** Added: commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/MessageDigestAlgorithm.java URL: http://svn.apache.org/viewvc/commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/MessageDigestAlgorithm.java?rev=1743778&view=auto ============================================================================== --- commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/MessageDigestAlgorithm.java (added) +++ commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/MessageDigestAlgorithm.java Sat May 14 01:33:23 2016 @@ -0,0 +1,167 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.commons.codec.digest; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +/** + * Standard {@link MessageDigest} algorithm names from the <cite>Java Cryptography Architecture Standard Algorithm Name + * Documentation</cite>. + * <p> + * This enum is immutable and thread-safe. + * </p> + * + * @see <a href="http://docs.oracle.com/javase/6/docs/technotes/guides/security/StandardNames.html">Java Cryptography + * Architecture Standard Algorithm Name Documentation</a> + * @since 1.11 + * @version $Id: MessageDigestAlgorithm.java 1637936 2014-11-10 16:47:29Z ggregory $ + */ +public enum MessageDigestAlgorithm { + + /** + * The MD2 message digest algorithm defined in RFC 1319. + */ + MD2("MD2"), + + /** + * The MD5 message digest algorithm defined in RFC 1321. + */ + MD5("MD5"), + + /** + * The SHA-1 hash algorithm defined in the FIPS PUB 180-2. + */ + SHA_1("SHA-1"), + + /** + * The SHA-224 hash algorithm defined in the FIPS PUB 180-4. + * <p> + * Java 8 only. + * </p> + */ + SHA_224("SHA-224"), + + /** + * The SHA-256 hash algorithm defined in the FIPS PUB 180-2. + */ + SHA_256("SHA-256"), + + /** + * The SHA-384 hash algorithm defined in the FIPS PUB 180-2. + */ + SHA_384("SHA-384"), + + /** + * The SHA-512 hash algorithm defined in the FIPS PUB 180-2. + */ + SHA_512("SHA-512"); + + private final String algorithm; + + private MessageDigestAlgorithm(String algorithm) { + this.algorithm = algorithm; + } + + /** + * Read through a byte[] and returns the digest for the data + * + * @param data + * Data to digest + * @return the digest + * @throws IOException + * On error reading from the stream + */ + public byte[] digest(byte[] data) throws IOException { + return getMessageDigest().digest(data); + } + + /** + * Read through a ByteBuffer and returns the digest for the data + * + * @param data + * Data to digest + * @return the digest + * @throws IOException + * On error reading from the stream + */ + public byte[] digest(ByteBuffer data) throws IOException { + return DigestUtils.digest(getMessageDigest(), data); + } + + /** + * Read through a File and returns the digest for the data + * + * @param data + * Data to digest + * @return the digest + * @throws IOException + * On error reading from the stream + */ + public byte[] digest(File data) throws IOException { + return DigestUtils.digest(getMessageDigest(), data); + } + + /** + * Read through an InputStream and returns the digest for the data + * + * @param data + * Data to digest + * @return the digest + * @throws IOException + * On error reading from the stream + */ + public byte[] digest(InputStream data) throws IOException { + return DigestUtils.digest(getMessageDigest(), data); + } + + /** + * Gets the algorithm name. + * + * @return the algorithm name. + */ + public String getAlgorithm() { + return algorithm; + } + + /** + * Returns a <code>MessageDigest</code> for this <code>algorithm</code>. + * + * @return A digest instance. + * @see MessageDigest#getInstance(String) + * @throws IllegalArgumentException + * when a {@link NoSuchAlgorithmException} is caught. + */ + public MessageDigest getMessageDigest() { + return DigestUtils.getDigest(algorithm); + } + + /** + * Whether a MessageDigest for this algorithm can be created. + * + * @return Whether a MessageDigest for this algorithm can be created. + */ + public boolean isAvailable() { + return DigestUtils.getDigest(algorithm, null) != null; + } + +} Modified: commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/MessageDigestAlgorithms.java URL: http://svn.apache.org/viewvc/commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/MessageDigestAlgorithms.java?rev=1743778&r1=1743777&r2=1743778&view=diff ============================================================================== --- commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/MessageDigestAlgorithms.java (original) +++ commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/MessageDigestAlgorithms.java Sat May 14 01:33:23 2016 @@ -25,13 +25,14 @@ import java.security.MessageDigest; * <p> * This class is immutable and thread-safe. * </p> - * TODO 2.0 This should be an enum. * * @see <a href="http://docs.oracle.com/javase/6/docs/technotes/guides/security/StandardNames.html">Java Cryptography * Architecture Standard Algorithm Name Documentation</a> * @since 1.7 + * @deprecated Use the enum {@link MessageDigestAlgorithm}. * @version $Id$ */ +@Deprecated public class MessageDigestAlgorithms { private MessageDigestAlgorithms() { @@ -54,11 +55,11 @@ public class MessageDigestAlgorithms { public static final String SHA_1 = "SHA-1"; /** - * The SHA-224 hash algorithm defined in the FIPS PUB 180-4. + * The SHA-224 hash algorithm defined in the FIPS PUB 180-4. * <p> * Java 8 only. * </p> - * + * * @since 1.11 */ public static final String SHA_224 = "SHA-224"; Modified: commons/proper/codec/trunk/src/test/java/org/apache/commons/codec/digest/DigestUtilsTest.java URL: http://svn.apache.org/viewvc/commons/proper/codec/trunk/src/test/java/org/apache/commons/codec/digest/DigestUtilsTest.java?rev=1743778&r1=1743777&r2=1743778&view=diff ============================================================================== --- commons/proper/codec/trunk/src/test/java/org/apache/commons/codec/digest/DigestUtilsTest.java (original) +++ commons/proper/codec/trunk/src/test/java/org/apache/commons/codec/digest/DigestUtilsTest.java Sat May 14 01:33:23 2016 @@ -50,6 +50,18 @@ public class DigestUtilsTest { private File testFile; + private void assumeJava8() { + Assume.assumeTrue(SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA_1_8)); + } + + byte[] getTestData() { + return testData; + } + + File getTestFile() { + return testFile; + } + @Before public void setUp() throws Exception { new Random().nextBytes(testData); @@ -311,10 +323,6 @@ public class DigestUtilsTest { // Examples from FIPS 180-4? } - private void assumeJava8() { - Assume.assumeTrue(SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA_1_8)); - } - @Test public void testSha224HexFile() throws IOException { assumeJava8(); Added: commons/proper/codec/trunk/src/test/java/org/apache/commons/codec/digest/MessageDigestAlgorithmTest.java URL: http://svn.apache.org/viewvc/commons/proper/codec/trunk/src/test/java/org/apache/commons/codec/digest/MessageDigestAlgorithmTest.java?rev=1743778&view=auto ============================================================================== --- commons/proper/codec/trunk/src/test/java/org/apache/commons/codec/digest/MessageDigestAlgorithmTest.java (added) +++ commons/proper/codec/trunk/src/test/java/org/apache/commons/codec/digest/MessageDigestAlgorithmTest.java Sat May 14 01:33:23 2016 @@ -0,0 +1,128 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.codec.digest; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Assume; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; + +/** + * Tests {@link MessageDigestAlgorithm}. + * + * @since 1.11 + */ +@RunWith(Parameterized.class) +public class MessageDigestAlgorithmTest { + + @Parameters(name = "{0}") + public static Object[] data() { + return MessageDigestAlgorithm.values(); + } + + private DigestUtilsTest digestUtilsTest; + + private final MessageDigestAlgorithm messageDigestAlgorithm; + + public MessageDigestAlgorithmTest(MessageDigestAlgorithm messageDigestAlgorithm) { + this.messageDigestAlgorithm = messageDigestAlgorithm; + } + + private byte[] digestTestData() throws IOException { + return messageDigestAlgorithm.digest(getTestData()); + } + + private byte[] getTestData() { + return digestUtilsTest.getTestData(); + } + + private File getTestFile() { + return digestUtilsTest.getTestFile(); + } + + @Before + public void setUp() throws Exception { + digestUtilsTest = new DigestUtilsTest(); + digestUtilsTest.setUp(); + } + + @After + public void tearDown() throws Exception { + digestUtilsTest.tearDown(); + digestUtilsTest = null; + } + + @Test + public void testAlgorithm() throws IOException, NoSuchAlgorithmException { + final String algorithm = messageDigestAlgorithm.getAlgorithm(); + Assert.assertNotNull(algorithm); + Assert.assertFalse(algorithm.isEmpty()); + Assume.assumeTrue(messageDigestAlgorithm.isAvailable()); + MessageDigest.getInstance(algorithm); + } + + @Test + public void testDigestByteArray() throws IOException { + Assume.assumeTrue(messageDigestAlgorithm.isAvailable()); + Assert.assertArrayEquals(digestTestData(), + DigestUtils.digest(messageDigestAlgorithm.getMessageDigest(), getTestData())); + Assert.assertArrayEquals(digestTestData(), messageDigestAlgorithm.digest(getTestData())); + } + + @Test + public void testDigestByteBuffer() throws IOException { + Assume.assumeTrue(messageDigestAlgorithm.isAvailable()); + Assert.assertArrayEquals(digestTestData(), + DigestUtils.digest(messageDigestAlgorithm.getMessageDigest(), ByteBuffer.wrap(getTestData()))); + Assert.assertArrayEquals(digestTestData(), messageDigestAlgorithm.digest(ByteBuffer.wrap(getTestData()))); + } + + @Test + public void testDigestFile() throws IOException { + Assume.assumeTrue(messageDigestAlgorithm.isAvailable()); + Assert.assertArrayEquals(digestTestData(), + DigestUtils.digest(messageDigestAlgorithm.getMessageDigest(), getTestFile())); + Assert.assertArrayEquals(digestTestData(), messageDigestAlgorithm.digest(getTestFile())); + } + + @Test + public void testDigestInputStream() throws IOException { + Assume.assumeTrue(messageDigestAlgorithm.isAvailable()); + Assert.assertArrayEquals(digestTestData(), + DigestUtils.digest(messageDigestAlgorithm.getMessageDigest(), new ByteArrayInputStream(getTestData()))); + Assert.assertArrayEquals(digestTestData(), messageDigestAlgorithm.digest(new ByteArrayInputStream(getTestData()))); + } + + @Test + public void testGetMessageDigest() throws IOException, NoSuchAlgorithmException { + Assume.assumeTrue(messageDigestAlgorithm.isAvailable()); + final MessageDigest messageDigest = messageDigestAlgorithm.getMessageDigest(); + Assert.assertEquals(messageDigestAlgorithm.getAlgorithm(), messageDigest.getAlgorithm()); + } + +}