View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.apache.commons.codec.digest;
19  
20  import static org.apache.commons.codec.binary.StringUtils.getBytesUtf8;
21  import static org.junit.Assert.assertEquals;
22  import static org.junit.Assert.assertNotNull;
23  
24  import java.io.ByteArrayInputStream;
25  import java.io.IOException;
26  import java.security.MessageDigest;
27  import java.util.Random;
28  
29  import org.apache.commons.codec.binary.Hex;
30  import org.apache.commons.codec.binary.StringUtils;
31  import org.junit.Test;
32  
33  /**
34   * Tests DigestUtils methods.
35   *
36   * @version $Id$
37   */
38  public class DigestUtilsTest {
39  
40      private final byte[] testData = new byte[1024*1024];
41  
42      /* (non-Javadoc)
43       * @see junit.framework.TestCase#setUp()
44       */
45      protected void setUp() throws Exception {
46          new Random().nextBytes(testData);
47      }
48  
49      @Test
50      public void testConstructable() {
51          assertNotNull(new DigestUtils());
52      }
53  
54      @Test(expected=IllegalArgumentException.class)
55      public void testInternalNoSuchAlgorithmException() {
56          DigestUtils.getDigest("Bogus Bogus");
57      }
58  
59      @Test
60      public void testMd2Hex() throws IOException {
61          // Examples from RFC 1319
62          assertEquals("8350e5a3e24c153df2275c9f80692773", DigestUtils.md2Hex(""));
63  
64          assertEquals("32ec01ec4a6dac72c0ab96fb34c0b5d1", DigestUtils.md2Hex("a"));
65  
66          assertEquals("da853b0d3f88d99b30283a69e6ded6bb", DigestUtils.md2Hex("abc"));
67  
68          assertEquals("ab4f496bfb2a530b219ff33031fe06b0", DigestUtils.md2Hex("message digest"));
69  
70          assertEquals("4e8ddff3650292ab5a4108c3aa47940b", DigestUtils.md2Hex("abcdefghijklmnopqrstuvwxyz"));
71  
72          assertEquals(
73              "da33def2a42df13975352846c30338cd",
74              DigestUtils.md2Hex("ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789"));
75  
76          assertEquals(
77              "d5976f79d83d3a0dc9806c3c66f3efd8",
78              DigestUtils.md2Hex("1234567890123456789012345678901234567890" + "1234567890123456789012345678901234567890"));
79  
80          assertEquals(DigestUtils.md2Hex(testData),
81                  DigestUtils.md2Hex(new ByteArrayInputStream(testData)));
82      }
83  
84      /**
85       * An MD2 hash converted to hex should always be 32 characters.
86       */
87      @Test
88      public void testMd2HexLength() {
89          String hashMe = "this is some string that is longer than 32 characters";
90          String hash = DigestUtils.md2Hex(getBytesUtf8(hashMe));
91          assertEquals(32, hash.length());
92  
93          hashMe = "length < 32";
94          hash = DigestUtils.md2Hex(getBytesUtf8(hashMe));
95          assertEquals(32, hash.length());
96      }
97  
98      /**
99       * An MD2 hash should always be a 16 element byte[].
100      */
101     @Test
102     public void testMd2Length() {
103         String hashMe = "this is some string that is longer than 16 characters";
104         byte[] hash = DigestUtils.md2(getBytesUtf8(hashMe));
105         assertEquals(16, hash.length);
106 
107         hashMe = "length < 16";
108         hash = DigestUtils.md2(getBytesUtf8(hashMe));
109         assertEquals(16, hash.length);
110     }
111 
112     @Test
113     public void testMd5Hex() throws IOException {
114         // Examples from RFC 1321
115         assertEquals("d41d8cd98f00b204e9800998ecf8427e", DigestUtils.md5Hex(""));
116 
117         assertEquals("0cc175b9c0f1b6a831c399e269772661", DigestUtils.md5Hex("a"));
118 
119         assertEquals("900150983cd24fb0d6963f7d28e17f72", DigestUtils.md5Hex("abc"));
120 
121         assertEquals("f96b697d7cb7938d525a2f31aaf161d0", DigestUtils.md5Hex("message digest"));
122 
123         assertEquals("c3fcd3d76192e4007dfb496cca67e13b", DigestUtils.md5Hex("abcdefghijklmnopqrstuvwxyz"));
124 
125         assertEquals(
126             "d174ab98d277d9f5a5611c2c9f419d9f",
127             DigestUtils.md5Hex("ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789"));
128 
129         assertEquals(
130             "57edf4a22be3c955ac49da2e2107b67a",
131             DigestUtils.md5Hex("1234567890123456789012345678901234567890" + "1234567890123456789012345678901234567890"));
132 
133         assertEquals(DigestUtils.md5Hex(testData),
134                 DigestUtils.md5Hex(new ByteArrayInputStream(testData)));
135     }
136 
137     /**
138      * An MD5 hash converted to hex should always be 32 characters.
139      */
140     @Test
141     public void testMd5HexLength() {
142         String hashMe = "this is some string that is longer than 32 characters";
143         String hash = DigestUtils.md5Hex(getBytesUtf8(hashMe));
144         assertEquals(32, hash.length());
145 
146         hashMe = "length < 32";
147         hash = DigestUtils.md5Hex(getBytesUtf8(hashMe));
148         assertEquals(32, hash.length());
149     }
150 
151     /**
152      * An MD5 hash should always be a 16 element byte[].
153      */
154     @Test
155     public void testMd5Length() {
156         String hashMe = "this is some string that is longer than 16 characters";
157         byte[] hash = DigestUtils.md5(getBytesUtf8(hashMe));
158         assertEquals(16, hash.length);
159 
160         hashMe = "length < 16";
161         hash = DigestUtils.md5(getBytesUtf8(hashMe));
162         assertEquals(16, hash.length);
163     }
164 
165     @Test
166     public void testSha1Hex() throws IOException {
167         // Examples from FIPS 180-1
168         assertEquals("a9993e364706816aba3e25717850c26c9cd0d89d", DigestUtils.sha1Hex("abc"));
169 
170         assertEquals("a9993e364706816aba3e25717850c26c9cd0d89d", DigestUtils.sha1Hex(getBytesUtf8("abc")));
171 
172         assertEquals(
173             "84983e441c3bd26ebaae4aa1f95129e5e54670f1",
174             DigestUtils.sha1Hex("abcdbcdecdefdefgefghfghighij" + "hijkijkljklmklmnlmnomnopnopq"));
175         assertEquals(DigestUtils.sha1Hex(testData),
176                 DigestUtils.sha1Hex(new ByteArrayInputStream(testData)));
177     }
178 
179     @Test
180     public void testSha1UpdateWithByteArray(){
181         final String d1 = "C'est un homme qui rentre dans un café, et plouf";
182         final String d2 = "C'est un homme, c'est qu'une tête, on lui offre un cadeau: 'oh... encore un chapeau!'";
183 
184         MessageDigest messageDigest = DigestUtils.getSha1Digest();
185         messageDigest.update(d1.getBytes());
186         messageDigest.update(d2.getBytes());
187         final String expectedResult = Hex.encodeHexString(messageDigest.digest());
188 
189         messageDigest = DigestUtils.getSha1Digest();
190         DigestUtils.updateDigest(messageDigest, d1.getBytes());
191         DigestUtils.updateDigest(messageDigest, d2.getBytes());
192         final String actualResult = Hex.encodeHexString(messageDigest.digest());
193 
194         assertEquals(expectedResult, actualResult);
195     }
196 
197     @Test
198     public void testSha1UpdateWithString(){
199         final String d1 = "C'est un homme qui rentre dans un café, et plouf";
200         final String d2 = "C'est un homme, c'est qu'une tête, on lui offre un cadeau: 'oh... encore un chapeau!'";
201 
202         MessageDigest messageDigest = DigestUtils.getSha1Digest();
203         messageDigest.update(StringUtils.getBytesUtf8(d1));
204         messageDigest.update(StringUtils.getBytesUtf8(d2));
205         final String expectedResult = Hex.encodeHexString(messageDigest.digest());
206 
207         messageDigest = DigestUtils.getSha1Digest();
208         DigestUtils.updateDigest(messageDigest, d1);
209         DigestUtils.updateDigest(messageDigest, d2);
210         final String actualResult = Hex.encodeHexString(messageDigest.digest());
211 
212         assertEquals(expectedResult, actualResult);
213     }
214 
215     @Test
216     public void testSha256() throws IOException {
217     // Examples from FIPS 180-2
218     assertEquals("ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad",
219              DigestUtils.sha256Hex("abc"));
220     assertEquals("ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad",
221              DigestUtils.sha256Hex(getBytesUtf8("abc")));
222     assertEquals("248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1",
223              DigestUtils.sha256Hex("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"));
224 
225     assertEquals(DigestUtils.sha256Hex(testData),
226             DigestUtils.sha256Hex(new ByteArrayInputStream(testData)));
227     }
228 
229     @Test
230     public void testSha384() throws IOException {
231     // Examples from FIPS 180-2
232     assertEquals("cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed" +
233              "8086072ba1e7cc2358baeca134c825a7",
234              DigestUtils.sha384Hex("abc"));
235     assertEquals("cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed" +
236              "8086072ba1e7cc2358baeca134c825a7",
237              DigestUtils.sha384Hex(getBytesUtf8("abc")));
238     assertEquals("09330c33f71147e83d192fc782cd1b4753111b173b3b05d22fa08086e3b0f712" +
239             "fcc7c71a557e2db966c3e9fa91746039",
240              DigestUtils.sha384Hex("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn" +
241                        "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"));
242     assertEquals(DigestUtils.sha384Hex(testData),
243             DigestUtils.sha384Hex(new ByteArrayInputStream(testData)));
244     }
245 
246     @Test
247     public void testSha512() throws IOException {
248     // Examples from FIPS 180-2
249     assertEquals("ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a" +
250             "2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f",
251              DigestUtils.sha512Hex("abc"));
252     assertEquals("ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a" +
253              "2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f",
254              DigestUtils.sha512Hex(getBytesUtf8("abc")));
255     assertEquals("8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018" +
256              "501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909",
257              DigestUtils.sha512Hex("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn" +
258                        "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"));
259     assertEquals(DigestUtils.sha512Hex(testData),
260             DigestUtils.sha512Hex(new ByteArrayInputStream(testData)));
261 }
262 
263     @SuppressWarnings("deprecation") // deliberate tests of deprecated code
264     @Test
265     public void testShaHex() throws IOException {
266         // Examples from FIPS 180-1
267         assertEquals("a9993e364706816aba3e25717850c26c9cd0d89d", DigestUtils.shaHex("abc"));
268 
269         assertEquals("a9993e364706816aba3e25717850c26c9cd0d89d", DigestUtils.shaHex(getBytesUtf8("abc")));
270 
271         assertEquals(
272             "84983e441c3bd26ebaae4aa1f95129e5e54670f1",
273             DigestUtils.shaHex("abcdbcdecdefdefgefghfghighij" + "hijkijkljklmklmnlmnomnopnopq"));
274         assertEquals(DigestUtils.shaHex(testData),
275                 DigestUtils.shaHex(new ByteArrayInputStream(testData)));
276     }
277 
278     @SuppressWarnings("deprecation") // deliberate tests of deprecated code
279     @Test
280     public void testShaUpdateWithByteArray(){
281         final String d1 = "C'est un homme qui rentre dans un café, et plouf";
282         final String d2 = "C'est un homme, c'est qu'une tête, on lui offre un cadeau: 'oh... encore un chapeau!'";
283 
284         MessageDigest messageDigest = DigestUtils.getShaDigest();
285         messageDigest.update(d1.getBytes());
286         messageDigest.update(d2.getBytes());
287         final String expectedResult = Hex.encodeHexString(messageDigest.digest());
288 
289         messageDigest = DigestUtils.getShaDigest();
290         DigestUtils.updateDigest(messageDigest, d1.getBytes());
291         DigestUtils.updateDigest(messageDigest, d2.getBytes());
292         final String actualResult = Hex.encodeHexString(messageDigest.digest());
293 
294         assertEquals(expectedResult, actualResult);
295     }
296 
297     @SuppressWarnings("deprecation") // deliberate tests of deprecated code
298     @Test
299     public void testShaUpdateWithString(){
300         final String d1 = "C'est un homme qui rentre dans un café, et plouf";
301         final String d2 = "C'est un homme, c'est qu'une tête, on lui offre un cadeau: 'oh... encore un chapeau!'";
302 
303         MessageDigest messageDigest = DigestUtils.getShaDigest();
304         messageDigest.update(StringUtils.getBytesUtf8(d1));
305         messageDigest.update(StringUtils.getBytesUtf8(d2));
306         final String expectedResult = Hex.encodeHexString(messageDigest.digest());
307 
308         messageDigest = DigestUtils.getShaDigest();
309         DigestUtils.updateDigest(messageDigest, d1);
310         DigestUtils.updateDigest(messageDigest, d2);
311         final String actualResult = Hex.encodeHexString(messageDigest.digest());
312 
313         assertEquals(expectedResult, actualResult);
314     }
315 
316 }