You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2012/09/02 20:27:02 UTC

svn commit: r1380018 - in /commons/proper/codec/trunk/src: changes/changes.xml main/java/org/apache/commons/codec/digest/DigestUtils.java test/java/org/apache/commons/codec/digest/DigestUtilsTest.java

Author: ggregory
Date: Sun Sep  2 18:27:02 2012
New Revision: 1380018

URL: http://svn.apache.org/viewvc?rev=1380018&view=rev
Log:
[CODEC-157] DigestUtils: Add MD2 APIs.

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/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=1380018&r1=1380017&r2=1380018&view=diff
==============================================================================
--- commons/proper/codec/trunk/src/changes/changes.xml (original)
+++ commons/proper/codec/trunk/src/changes/changes.xml Sun Sep  2 18:27:02 2012
@@ -51,6 +51,9 @@ The <action> type attribute can be add,u
     </release>
     -->
     <release version="1.7" date="TBD" description="Feature and fix release.">
+      <action issue="CODEC-157" dev="ggregory" type="add" due-to="ggregory">
+        DigestUtils: Add MD2 APIs.
+      </action>
       <action issue="CODEC-156" dev="ggregory" type="add" due-to="ggregory">
         DigestUtils: add APIs named after standard alg name SHA-1.
       </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=1380018&r1=1380017&r2=1380018&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 Sun Sep  2 18:27:02 2012
@@ -90,6 +90,19 @@ public class DigestUtils {
     }
 
     /**
+     * Returns an MD2 MessageDigest.
+     *
+     * @return An MD2 digest instance.
+     * @throws IllegalArgumentException
+     *             when a {@link NoSuchAlgorithmException} is caught, which should never happen because MD2 is a
+     *             built-in algorithm
+     * @see MessageDigestAlgorithms#MD2
+     */
+    public static MessageDigest getMd2Digest() {
+        return getDigest(MessageDigestAlgorithms.MD2);
+    }
+
+    /**
      * Returns an MD5 MessageDigest.
      *
      * @return An MD5 digest instance.
@@ -176,6 +189,82 @@ public class DigestUtils {
     }
 
     /**
+     * Calculates the MD2 digest and returns the value as a 16 element <code>byte[]</code>.
+     *
+     * @param data
+     *            Data to digest
+     * @return MD2 digest
+     * @since 1.7
+     */
+    public static byte[] md2(byte[] data) {
+        return getMd2Digest().digest(data);
+    }
+
+    /**
+     * Calculates the MD2 digest and returns the value as a 16 element <code>byte[]</code>.
+     *
+     * @param data
+     *            Data to digest
+     * @return MD2 digest
+     * @throws IOException
+     *             On error reading from the stream
+     * @since 1.7
+     */
+    public static byte[] md2(InputStream data) throws IOException {
+        return digest(getMd2Digest(), data);
+    }
+
+    /**
+     * Calculates the MD2 digest and returns the value as a 16 element <code>byte[]</code>.
+     *
+     * @param data
+     *            Data to digest
+     * @return MD2 digest
+     * @since 1.7
+     */
+    public static byte[] md2(String data) {
+        return md2(getBytesUtf8(data));
+    }
+
+    /**
+     * Calculates the MD2 digest and returns the value as a 32 character hex string.
+     *
+     * @param data
+     *            Data to digest
+     * @return MD2 digest as a hex string
+     * @since 1.7
+     */
+    public static String md2Hex(byte[] data) {
+        return Hex.encodeHexString(md2(data));
+    }
+
+    /**
+     * Calculates the MD2 digest and returns the value as a 32 character hex string.
+     *
+     * @param data
+     *            Data to digest
+     * @return MD2 digest as a hex string
+     * @throws IOException
+     *             On error reading from the stream
+     * @since 1.7
+     */
+    public static String md2Hex(InputStream data) throws IOException {
+        return Hex.encodeHexString(md2(data));
+    }
+
+    /**
+     * Calculates the MD2 digest and returns the value as a 32 character hex string.
+     *
+     * @param data
+     *            Data to digest
+     * @return MD2 digest as a hex string
+     * @since 1.7
+     */
+    public static String md2Hex(String data) {
+        return Hex.encodeHexString(md2(data));
+    }
+
+    /**
      * Calculates the MD5 digest and returns the value as a 16 element <code>byte[]</code>.
      *
      * @param data
@@ -264,10 +353,12 @@ public class DigestUtils {
      * @param data
      *            Data to digest
      * @return SHA-1 digest
-     * @since 1.7
+     * @throws IOException
+     *             On error reading from the stream
+     * @since 1.4
      */
-    public static byte[] sha1(byte[] data) {
-        return getSha1Digest().digest(data);
+    public static byte[] sha(InputStream data) throws IOException {
+        return digest(getShaDigest(), data);
     }
 
     /**
@@ -276,12 +367,9 @@ public class DigestUtils {
      * @param data
      *            Data to digest
      * @return SHA-1 digest
-     * @throws IOException
-     *             On error reading from the stream
-     * @since 1.4
      */
-    public static byte[] sha(InputStream data) throws IOException {
-        return digest(getShaDigest(), data);
+    public static byte[] sha(String data) {
+        return sha(getBytesUtf8(data));
     }
 
     /**
@@ -290,12 +378,10 @@ public class DigestUtils {
      * @param data
      *            Data to digest
      * @return SHA-1 digest
-     * @throws IOException
-     *             On error reading from the stream
      * @since 1.7
      */
-    public static byte[] sha1(InputStream data) throws IOException {
-        return digest(getSha1Digest(), data);
+    public static byte[] sha1(byte[] data) {
+        return getSha1Digest().digest(data);
     }
 
     /**
@@ -304,9 +390,12 @@ public class DigestUtils {
      * @param data
      *            Data to digest
      * @return SHA-1 digest
+     * @throws IOException
+     *             On error reading from the stream
+     * @since 1.7
      */
-    public static byte[] sha(String data) {
-        return sha(getBytesUtf8(data));
+    public static byte[] sha1(InputStream data) throws IOException {
+        return digest(getSha1Digest(), data);
     }
 
     /**

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=1380018&r1=1380017&r2=1380018&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 Sun Sep  2 18:27:02 2012
@@ -66,6 +66,31 @@ public class DigestUtilsTest {
     }
 
     @Test
+    public void testMd2Hex() throws IOException {
+        // Examples from RFC 1319
+        assertEquals("8350e5a3e24c153df2275c9f80692773", DigestUtils.md2Hex(""));
+
+        assertEquals("32ec01ec4a6dac72c0ab96fb34c0b5d1", DigestUtils.md2Hex("a"));
+
+        assertEquals("da853b0d3f88d99b30283a69e6ded6bb", DigestUtils.md2Hex("abc"));
+
+        assertEquals("ab4f496bfb2a530b219ff33031fe06b0", DigestUtils.md2Hex("message digest"));
+
+        assertEquals("4e8ddff3650292ab5a4108c3aa47940b", DigestUtils.md2Hex("abcdefghijklmnopqrstuvwxyz"));
+
+        assertEquals(
+            "da33def2a42df13975352846c30338cd",
+            DigestUtils.md2Hex("ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789"));
+
+        assertEquals(
+            "d5976f79d83d3a0dc9806c3c66f3efd8",
+            DigestUtils.md2Hex("1234567890123456789012345678901234567890" + "1234567890123456789012345678901234567890"));
+
+        assertEquals(DigestUtils.md2Hex(testData),
+                DigestUtils.md2Hex(new ByteArrayInputStream(testData)));
+    }
+
+    @Test
     public void testMd5Hex() throws IOException {
         // Examples from RFC 1321
         assertEquals("d41d8cd98f00b204e9800998ecf8427e", DigestUtils.md5Hex(""));
@@ -91,6 +116,20 @@ public class DigestUtilsTest {
     }
 
     /**
+     * An MD2 hash converted to hex should always be 32 characters.
+     */
+    @Test
+    public void testMd2HexLength() {
+        String hashMe = "this is some string that is longer than 32 characters";
+        String hash = DigestUtils.md2Hex(getBytesUtf8(hashMe));
+        assertEquals(32, hash.length());
+
+        hashMe = "length < 32";
+        hash = DigestUtils.md2Hex(getBytesUtf8(hashMe));
+        assertEquals(32, hash.length());
+    }
+
+    /**
      * An MD5 hash converted to hex should always be 32 characters.
      */
     @Test
@@ -105,6 +144,20 @@ public class DigestUtilsTest {
     }
 
     /**
+     * An MD2 hash should always be a 16 element byte[].
+     */
+    @Test
+    public void testMd2Length() {
+        String hashMe = "this is some string that is longer than 16 characters";
+        byte[] hash = DigestUtils.md2(getBytesUtf8(hashMe));
+        assertEquals(16, hash.length);
+
+        hashMe = "length < 16";
+        hash = DigestUtils.md2(getBytesUtf8(hashMe));
+        assertEquals(16, hash.length);
+    }
+
+    /**
      * An MD5 hash should always be a 16 element byte[].
      */
     @Test