You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ba...@apache.org on 2008/03/08 08:49:56 UTC

svn commit: r634903 - in /commons/proper/codec/trunk/src: java/org/apache/commons/codec/digest/DigestUtils.java test/org/apache/commons/codec/digest/DigestUtilsTest.java

Author: bayard
Date: Fri Mar  7 23:49:46 2008
New Revision: 634903

URL: http://svn.apache.org/viewvc?rev=634903&view=rev
Log:
Applying CODEC-52; Niklas Gustavsson's enhancement to have InputStream variants for DigestUtil's digest methods

Modified:
    commons/proper/codec/trunk/src/java/org/apache/commons/codec/digest/DigestUtils.java
    commons/proper/codec/trunk/src/test/org/apache/commons/codec/digest/DigestUtilsTest.java

Modified: commons/proper/codec/trunk/src/java/org/apache/commons/codec/digest/DigestUtils.java
URL: http://svn.apache.org/viewvc/commons/proper/codec/trunk/src/java/org/apache/commons/codec/digest/DigestUtils.java?rev=634903&r1=634902&r2=634903&view=diff
==============================================================================
--- commons/proper/codec/trunk/src/java/org/apache/commons/codec/digest/DigestUtils.java (original)
+++ commons/proper/codec/trunk/src/java/org/apache/commons/codec/digest/DigestUtils.java Fri Mar  7 23:49:46 2008
@@ -17,6 +17,8 @@
 
 package org.apache.commons.codec.digest;
 
+import java.io.IOException;
+import java.io.InputStream;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 
@@ -30,6 +32,8 @@
  */
 public class DigestUtils {
 
+    private static final int STREAM_BUFFER_LENGTH = 1024;
+
     /**
      * Returns a <code>MessageDigest</code> for the given <code>algorithm</code>.
      * 
@@ -116,6 +120,26 @@
     }
 
     /**
+     * Read through an InputStream and returns the digest for the data
+     * 
+     * @param digest The MessageDigest to use (e.g. MD5)
+     * @param data Data to digest
+     * @return MD5 digest
+     * @throws IOException On error reading from the stream
+     */
+    private static byte[] digest(MessageDigest digest, InputStream data) throws IOException {
+        byte[] buffer = new byte[STREAM_BUFFER_LENGTH];
+        int read = data.read(buffer, 0, STREAM_BUFFER_LENGTH);
+        
+        while(read > -1) {
+            digest.update(buffer, 0, read);
+            read = data.read(buffer, 0, STREAM_BUFFER_LENGTH);
+        }
+        
+        return digest.digest();
+    }
+    
+    /**
      * Calculates the MD5 digest and returns the value as a 16 element <code>byte[]</code>.
      * 
      * @param data
@@ -132,6 +156,18 @@
      * @param data
      *            Data to digest
      * @return MD5 digest
+     * @throws IOException On error reading from the stream
+     */
+    public static byte[] md5(InputStream data) throws IOException {
+        return digest(getMd5Digest(), data);
+    }
+
+    /**
+     * Calculates the MD5 digest and returns the value as a 16 element <code>byte[]</code>.
+     * 
+     * @param data
+     *            Data to digest
+     * @return MD5 digest
      */
     public static byte[] md5(String data) {
         return md5(data.getBytes());
@@ -160,6 +196,18 @@
     }
 
     /**
+     * Calculates the MD5 digest and returns the value as a 32 character hex string.
+     * 
+     * @param data
+     *            Data to digest
+     * @return MD5 digest as a hex string
+     * @throws IOException On error reading from the stream
+     */
+    public static String md5Hex(InputStream data) throws IOException {
+        return new String(Hex.encodeHex(md5(data)));
+    }
+
+    /**
      * Calculates the SHA-1 digest and returns the value as a <code>byte[]</code>.
      * 
      * @param data
@@ -182,6 +230,18 @@
     }
 
     /**
+     * Calculates the SHA-1 digest and returns the value as a <code>byte[]</code>.
+     * 
+     * @param data
+     *            Data to digest
+     * @return SHA-1 digest
+     * @throws IOException On error reading from the stream
+     */
+    public static byte[] sha(InputStream data) throws IOException {
+        return digest(getShaDigest(), data);
+    }
+
+    /**
      * Calculates the SHA-256 digest and returns the value as a <code>byte[]</code>.
      * <p>
      * Throws a <code>RuntimeException</code> on JRE versions prior to 1.4.0.
@@ -210,6 +270,21 @@
     }
 
     /**
+     * Calculates the SHA-256 digest and returns the value as a <code>byte[]</code>.
+     * <p>
+     * Throws a <code>RuntimeException</code> on JRE versions prior to 1.4.0.
+     * </p>
+     * 
+     * @param data
+     *            Data to digest
+     * @return SHA-256 digest
+     * @throws IOException On error reading from the stream
+     */
+    public static byte[] sha256(InputStream data) throws IOException {
+        return digest(getSha256Digest(), data);
+    }
+
+    /**
      * Calculates the SHA-256 digest and returns the value as a hex string.
      * <p>
      * Throws a <code>RuntimeException</code> on JRE versions prior to 1.4.0.
@@ -238,6 +313,21 @@
     }
 
     /**
+     * Calculates the SHA-256 digest and returns the value as a hex string.
+     * <p>
+     * Throws a <code>RuntimeException</code> on JRE versions prior to 1.4.0.
+     * </p>
+     * 
+     * @param data
+     *            Data to digest
+     * @return SHA-256 digest as a hex string
+     * @throws IOException On error reading from the stream
+     */
+    public static String sha256Hex(InputStream data) throws IOException {
+        return new String(Hex.encodeHex(sha256(data)));
+    }
+
+    /**
      * Calculates the SHA-384 digest and returns the value as a <code>byte[]</code>.
      * <p>
      * Throws a <code>RuntimeException</code> on JRE versions prior to 1.4.0.
@@ -265,6 +355,21 @@
     public static byte[] sha384(String data) {
         return sha384(data.getBytes());
     }
+    
+    /**
+     * Calculates the SHA-384 digest and returns the value as a <code>byte[]</code>.
+     * <p>
+     * Throws a <code>RuntimeException</code> on JRE versions prior to 1.4.0.
+     * </p>
+     * 
+     * @param data
+     *            Data to digest
+     * @return SHA-384 digest
+     * @throws IOException On error reading from the stream
+     */
+    public static byte[] sha384(InputStream data) throws IOException {
+        return digest(getSha384Digest(), data);
+    }
 
     /**
      * Calculates the SHA-384 digest and returns the value as a hex string.
@@ -295,6 +400,21 @@
     }
 
     /**
+     * Calculates the SHA-384 digest and returns the value as a hex string.
+     * <p>
+     * Throws a <code>RuntimeException</code> on JRE versions prior to 1.4.0.
+     * </p>
+     * 
+     * @param data
+     *            Data to digest
+     * @return SHA-384 digest as a hex string
+     * @throws IOException On error reading from the stream
+     */
+    public static String sha384Hex(InputStream data) throws IOException {
+        return new String(Hex.encodeHex(sha384(data)));
+    }
+
+    /**
      * Calculates the SHA-512 digest and returns the value as a <code>byte[]</code>.
      * <p>
      * Throws a <code>RuntimeException</code> on JRE versions prior to 1.4.0.
@@ -323,6 +443,21 @@
     }
 
     /**
+     * Calculates the SHA-512 digest and returns the value as a <code>byte[]</code>.
+     * <p>
+     * Throws a <code>RuntimeException</code> on JRE versions prior to 1.4.0.
+     * </p>
+     * 
+     * @param data
+     *            Data to digest
+     * @return SHA-512 digest
+     * @throws IOException On error reading from the stream
+     */
+    public static byte[] sha512(InputStream data) throws IOException {
+        return digest(getSha512Digest(), data);
+    }
+
+    /**
      * Calculates the SHA-512 digest and returns the value as a hex string.
      * <p>
      * Throws a <code>RuntimeException</code> on JRE versions prior to 1.4.0.
@@ -351,6 +486,21 @@
     }
 
     /**
+     * Calculates the SHA-512 digest and returns the value as a hex string.
+     * <p>
+     * Throws a <code>RuntimeException</code> on JRE versions prior to 1.4.0.
+     * </p>
+     * 
+     * @param data
+     *            Data to digest
+     * @return SHA-512 digest as a hex string
+     * @throws IOException On error reading from the stream
+     */
+    public static String sha512Hex(InputStream data) throws IOException {
+        return new String(Hex.encodeHex(sha512(data)));
+    }
+
+    /**
      * Calculates the SHA-1 digest and returns the value as a hex string.
      * 
      * @param data
@@ -369,6 +519,18 @@
      * @return SHA-1 digest as a hex string
      */
     public static String shaHex(String data) {
+        return new String(Hex.encodeHex(sha(data)));
+    }
+
+    /**
+     * Calculates the SHA-1 digest and returns the value as a hex string.
+     * 
+     * @param data
+     *            Data to digest
+     * @return SHA-1 digest as a hex string
+     * @throws IOException On error reading from the stream
+     */
+    public static String shaHex(InputStream data) throws IOException {
         return new String(Hex.encodeHex(sha(data)));
     }
 }

Modified: commons/proper/codec/trunk/src/test/org/apache/commons/codec/digest/DigestUtilsTest.java
URL: http://svn.apache.org/viewvc/commons/proper/codec/trunk/src/test/org/apache/commons/codec/digest/DigestUtilsTest.java?rev=634903&r1=634902&r2=634903&view=diff
==============================================================================
--- commons/proper/codec/trunk/src/test/org/apache/commons/codec/digest/DigestUtilsTest.java (original)
+++ commons/proper/codec/trunk/src/test/org/apache/commons/codec/digest/DigestUtilsTest.java Fri Mar  7 23:49:46 2008
@@ -17,6 +17,10 @@
 
 package org.apache.commons.codec.digest;
 
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.util.Random;
+
 import junit.framework.TestCase;
 
 /**
@@ -27,6 +31,15 @@
  */
 public class DigestUtilsTest extends TestCase {
 
+    private byte[] testData = new byte[1024*1024];
+    
+    /* (non-Javadoc)
+     * @see junit.framework.TestCase#setUp()
+     */
+    protected void setUp() throws Exception {
+        new Random().nextBytes(testData);
+    }
+
     public void testInternalNoSuchAlgorithmException() {
         try {
             DigestUtils.getDigest("Bogus Bogus");
@@ -36,7 +49,7 @@
         }
     }
 
-    public void testMd5Hex() {
+    public void testMd5Hex() throws IOException {
         // Examples from RFC 1321
         assertEquals("d41d8cd98f00b204e9800998ecf8427e", DigestUtils.md5Hex(""));
 
@@ -55,8 +68,11 @@
         assertEquals(
             "57edf4a22be3c955ac49da2e2107b67a",
             DigestUtils.md5Hex("1234567890123456789012345678901234567890" + "1234567890123456789012345678901234567890"));
-    }
 
+        assertEquals(DigestUtils.md5Hex(testData),
+                DigestUtils.md5Hex(new ByteArrayInputStream(testData)));
+    }
+    
     /**
 	 * An MD5 hash converted to hex should always be 32 characters.
 	 */
@@ -83,7 +99,7 @@
         assertEquals(16, hash.length);
     }
 
-    public void testSha256() {
+    public void testSha256() throws IOException {
 	// Examples from FIPS 180-2
 	assertEquals("ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad",
 		     DigestUtils.sha256Hex("abc"));
@@ -91,9 +107,12 @@
 		     DigestUtils.sha256Hex("abc".getBytes()));
 	assertEquals("248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1",
 		     DigestUtils.sha256Hex("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"));
+    
+    assertEquals(DigestUtils.sha256Hex(testData),
+            DigestUtils.sha256Hex(new ByteArrayInputStream(testData)));
     }
 
-    public void testSha384() {
+    public void testSha384() throws IOException {
 	// Examples from FIPS 180-2
 	assertEquals("cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed" + 
 		     "8086072ba1e7cc2358baeca134c825a7",
@@ -105,9 +124,11 @@
 	        "fcc7c71a557e2db966c3e9fa91746039",
 		     DigestUtils.sha384Hex("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn" +
 					   "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"));
+    assertEquals(DigestUtils.sha384Hex(testData),
+            DigestUtils.sha384Hex(new ByteArrayInputStream(testData)));
     }    
 
-    public void testSha512() {
+    public void testSha512() throws IOException {
 	// Examples from FIPS 180-2
 	assertEquals("ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a" +
 	        "2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f",
@@ -119,9 +140,11 @@
 		     "501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909",
 		     DigestUtils.sha512Hex("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn" + 
 					   "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"));
-    }
+    assertEquals(DigestUtils.sha512Hex(testData),
+            DigestUtils.sha512Hex(new ByteArrayInputStream(testData)));
+}
 
-    public void testShaHex() {
+    public void testShaHex() throws IOException {
         // Examples from FIPS 180-1
         assertEquals("a9993e364706816aba3e25717850c26c9cd0d89d", DigestUtils.shaHex("abc"));
 
@@ -130,5 +153,8 @@
         assertEquals(
             "84983e441c3bd26ebaae4aa1f95129e5e54670f1",
             DigestUtils.shaHex("abcdbcdecdefdefgefghfghighij" + "hijkijkljklmklmnlmnomnopnopq"));
+        assertEquals(DigestUtils.shaHex(testData),
+                DigestUtils.shaHex(new ByteArrayInputStream(testData)));
+
     }    
 }