001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    
018    package org.apache.commons.codec.digest;
019    
020    import static org.apache.commons.codec.binary.StringUtils.getBytesUtf8;
021    import static org.junit.Assert.assertEquals;
022    import static org.junit.Assert.assertNotNull;
023    
024    import java.io.ByteArrayInputStream;
025    import java.io.IOException;
026    import java.security.MessageDigest;
027    import java.util.Random;
028    
029    import org.apache.commons.codec.binary.Hex;
030    import org.apache.commons.codec.binary.StringUtils;
031    import org.junit.Test;
032    
033    /**
034     * Tests DigestUtils methods.
035     *
036     * @version $Id: DigestUtilsTest.html 889935 2013-12-11 05:05:13Z ggregory $
037     */
038    public class DigestUtilsTest {
039    
040        private final byte[] testData = new byte[1024*1024];
041    
042        /* (non-Javadoc)
043         * @see junit.framework.TestCase#setUp()
044         */
045        protected void setUp() throws Exception {
046            new Random().nextBytes(testData);
047        }
048    
049        @Test
050        public void testConstructable() {
051            assertNotNull(new DigestUtils());
052        }
053    
054        @Test(expected=IllegalArgumentException.class)
055        public void testInternalNoSuchAlgorithmException() {
056            DigestUtils.getDigest("Bogus Bogus");
057        }
058    
059        @Test
060        public void testMd2Hex() throws IOException {
061            // Examples from RFC 1319
062            assertEquals("8350e5a3e24c153df2275c9f80692773", DigestUtils.md2Hex(""));
063    
064            assertEquals("32ec01ec4a6dac72c0ab96fb34c0b5d1", DigestUtils.md2Hex("a"));
065    
066            assertEquals("da853b0d3f88d99b30283a69e6ded6bb", DigestUtils.md2Hex("abc"));
067    
068            assertEquals("ab4f496bfb2a530b219ff33031fe06b0", DigestUtils.md2Hex("message digest"));
069    
070            assertEquals("4e8ddff3650292ab5a4108c3aa47940b", DigestUtils.md2Hex("abcdefghijklmnopqrstuvwxyz"));
071    
072            assertEquals(
073                "da33def2a42df13975352846c30338cd",
074                DigestUtils.md2Hex("ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789"));
075    
076            assertEquals(
077                "d5976f79d83d3a0dc9806c3c66f3efd8",
078                DigestUtils.md2Hex("1234567890123456789012345678901234567890" + "1234567890123456789012345678901234567890"));
079    
080            assertEquals(DigestUtils.md2Hex(testData),
081                    DigestUtils.md2Hex(new ByteArrayInputStream(testData)));
082        }
083    
084        /**
085         * An MD2 hash converted to hex should always be 32 characters.
086         */
087        @Test
088        public void testMd2HexLength() {
089            String hashMe = "this is some string that is longer than 32 characters";
090            String hash = DigestUtils.md2Hex(getBytesUtf8(hashMe));
091            assertEquals(32, hash.length());
092    
093            hashMe = "length < 32";
094            hash = DigestUtils.md2Hex(getBytesUtf8(hashMe));
095            assertEquals(32, hash.length());
096        }
097    
098        /**
099         * 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    }