// $Id: TestDigest.java 81 2007-02-25 12:45:17Z tp $ package fr.cryptohash.test; import fr.cryptohash.Digest; import fr.cryptohash.MD2; import fr.cryptohash.MD4; import fr.cryptohash.MD5; import fr.cryptohash.SHA0; import fr.cryptohash.SHA1; import fr.cryptohash.SHA224; import fr.cryptohash.SHA256; import fr.cryptohash.SHA384; import fr.cryptohash.SHA512; import fr.cryptohash.RIPEMD; import fr.cryptohash.RIPEMD128; import fr.cryptohash.RIPEMD160; import fr.cryptohash.Tiger; import fr.cryptohash.Tiger2; import fr.cryptohash.PANAMA; import fr.cryptohash.HAVAL128_3; import fr.cryptohash.HAVAL128_4; import fr.cryptohash.HAVAL128_5; import fr.cryptohash.HAVAL160_3; import fr.cryptohash.HAVAL160_4; import fr.cryptohash.HAVAL160_5; import fr.cryptohash.HAVAL192_3; import fr.cryptohash.HAVAL192_4; import fr.cryptohash.HAVAL192_5; import fr.cryptohash.HAVAL224_3; import fr.cryptohash.HAVAL224_4; import fr.cryptohash.HAVAL224_5; import fr.cryptohash.HAVAL256_3; import fr.cryptohash.HAVAL256_4; import fr.cryptohash.HAVAL256_5; import fr.cryptohash.WHIRLPOOL; import fr.cryptohash.WHIRLPOOL0; import fr.cryptohash.WHIRLPOOL1; import fr.cryptohash.HMAC; /** * This class is a program entry point; it includes tests for the * implementation of the hash functions. * * <pre> * ==========================(LICENSE BEGIN)============================ * * Copyright (c) 2007 Projet RNRT SAPHIR * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * ===========================(LICENSE END)============================= * </pre> * * @version $Revision: 81 $ * @author Thomas Pornin <thomas.pornin@cryptolog.com> */ public class TestDigest { /** * Program entry. Parameters are ignored. * * @param args the parameter input (ignored) */ public static void main(String[] args) { testMD2(); testMD4(); testMD5(); testSHA0(); testSHA1(); testSHA224(); testSHA256(); testSHA384(); testSHA512(); testRIPEMD(); testRIPEMD128(); testRIPEMD160(); testTiger(); testTiger2(); testPANAMA(); testHAVAL(); testWHIRLPOOL(); testHMAC(); } private static final void fail(String message) { throw new RuntimeException("test failed: " + message); } private static final byte[] strtobin(String str) { int blen = str.length() / 2; byte[] buf = new byte[blen]; for (int i = 0; i < blen; i ++) { String bs = str.substring(i * 2, i * 2 + 2); buf[i] = (byte)Integer.parseInt(bs, 16); } return buf; } private static final byte[] encodeLatin1(String str) { int blen = str.length(); byte[] buf = new byte[blen]; for (int i = 0; i < blen; i ++) buf[i] = (byte)str.charAt(i); return buf; } private static final boolean equals(byte[] b1, byte[] b2) { if (b1 == b2) return true; if (b1 == null || b2 == null) return false; if (b1.length != b2.length) return false; for (int i = 0; i < b1.length; i ++) if (b1[i] != b2[i]) return false; return true; } private static final void assertTrue(boolean expr) { if (!expr) fail("assertion failed"); } private static final void assertEquals(byte[] b1, byte[] b2) { if (!equals(b1, b2)) fail("byte streams are not equal"); } private static final void assertNotEquals(byte[] b1, byte[] b2) { if (equals(b1, b2)) fail("byte streams are equal"); } private static final void reportSuccess(String name) { System.out.println("===== test " + name + " passed"); } private static void testKat(Digest dig, String data, String ref) { /* * First test the hashing itself. */ byte[] buf = encodeLatin1(data); byte[] out = dig.digest(buf); byte[] exp = strtobin(ref); assertEquals(out, exp); /* * Now the update() API; this also exercise auto-reset. */ for (int i = 0; i < buf.length; i ++) dig.update(buf[i]); assertEquals(dig.digest(), exp); /* * The cloning API. */ int blen = buf.length; dig.update(buf, 0, blen / 2); Digest dig2 = dig.copy(); dig.update(buf, blen / 2, blen - (blen / 2)); assertEquals(dig.digest(), exp); dig2.update(buf, blen / 2, blen - (blen / 2)); assertEquals(dig2.digest(), exp); } private static void testKatMillionA(Digest dig, String ref) { byte[] buf = new byte[1000]; for (int i = 0; i < 1000; i ++) buf[i] = 'a'; for (int i = 0; i < 1000; i ++) dig.update(buf); assertEquals(dig.digest(), strtobin(ref)); } private static void testCollision(Digest dig, String s1, String s2) { byte[] msg1 = strtobin(s1); byte[] msg2 = strtobin(s2); assertNotEquals(msg1, msg2); assertEquals(dig.digest(msg1), dig.digest(msg2)); } /** * Test MD2 implementation. */ private static void testMD2() { Digest dig = new MD2(); testKat(dig, "", "8350e5a3e24c153df2275c9f80692773"); testKat(dig, "a", "32ec01ec4a6dac72c0ab96fb34c0b5d1"); testKat(dig, "abc", "da853b0d3f88d99b30283a69e6ded6bb"); testKat(dig, "message digest", "ab4f496bfb2a530b219ff33031fe06b0"); testKat(dig, "abcdefghijklmnopqrstuvwxyz", "4e8ddff3650292ab5a4108c3aa47940b"); testKat(dig, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstu" + "vwxyz0123456789", "da33def2a42df13975352846c30338cd"); testKat(dig, "1234567890123456789012345678901234567890123456789" + "0123456789012345678901234567890", "d5976f79d83d3a0dc9806c3c66f3efd8"); testKatMillionA(dig, "8c0a09ff1216ecaf95c8130953c62efd"); reportSuccess("MD2"); } /** * Test MD4 implementation. */ private static void testMD4() { Digest dig = new MD4(); testKat(dig, "", "31d6cfe0d16ae931b73c59d7e0c089c0"); testKat(dig, "a", "bde52cb31de33e46245e05fbdbd6fb24"); testKat(dig, "abc", "a448017aaf21d8525fc10ae87aa6729d"); testKat(dig, "message digest", "d9130a8164549fe818874806e1c7014b"); testKat(dig, "abcdefghijklmnopqrstuvwxyz", "d79e1c308aa5bbcdeea8ed63df412da9"); testKat(dig, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstu" + "vwxyz0123456789", "043f8582f241db351ce627e153e7f0e4"); testKat(dig, "1234567890123456789012345678901234567890123456789" + "0123456789012345678901234567890", "e33b4ddc9c38f2199c3e7b164fcc0536"); testKatMillionA(dig, "bbce80cc6bb65e5c6745e30d4eeca9a4"); testCollision(dig, "839c7a4d7a92cb5678a5d5b9eea5a7573c8a74deb366c3dc20" + "a083b69f5d2a3bb3719dc69891e9f95e809fd7e8b23ba631" + "8edd45e51fe39708bf9427e9c3e8b9", "839c7a4d7a92cbd678a5d529eea5a7573c8a74deb366c3dc20" + "a083b69f5d2a3bb3719dc69891e9f95e809fd7e8b23ba631" + "8edc45e51fe39708bf9427e9c3e8b9"); testCollision(dig, "839c7a4d7a92cb5678a5d5b9eea5a7573c8a74deb366c3dc20" + "a083b69f5d2a3bb3719dc69891e9f95e809fd7e8b23ba631" + "8edd45e51fe39740c213f769cfb8a7", "839c7a4d7a92cbd678a5d529eea5a7573c8a74deb366c3dc20" + "a083b69f5d2a3bb3719dc69891e9f95e809fd7e8b23ba631" + "8edc45e51fe39740c213f769cfb8a7"); reportSuccess("MD4"); } /** * Test MD5 implementation. */ private static void testMD5() { Digest dig = new MD5(); testKat(dig, "", "d41d8cd98f00b204e9800998ecf8427e"); testKat(dig, "a", "0cc175b9c0f1b6a831c399e269772661"); testKat(dig, "abc", "900150983cd24fb0d6963f7d28e17f72"); testKat(dig, "message digest", "f96b697d7cb7938d525a2f31aaf161d0"); testKat(dig, "abcdefghijklmnopqrstuvwxyz", "c3fcd3d76192e4007dfb496cca67e13b"); testKat(dig, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstu" + "vwxyz0123456789", "d174ab98d277d9f5a5611c2c9f419d9f"); testKat(dig, "1234567890123456789012345678901234567890123456789" + "0123456789012345678901234567890", "57edf4a22be3c955ac49da2e2107b67a"); testKatMillionA(dig, "7707d6ae4e027c70eea2a935c2296f21"); testCollision(dig, "d131dd02c5e6eec4693d9a0698aff95c2fcab58712467eab40" + "04583eb8fb7f8955ad340609f4b30283e488832571415a08" + "5125e8f7cdc99fd91dbdf280373c5b960b1dd1dc417b9ce4" + "d897f45a6555d535739ac7f0ebfd0c3029f166d109b18f75" + "277f7930d55ceb22e8adba79cc155ced74cbdd5fc5d36db1" + "9b0ad835cca7e3", "d131dd02c5e6eec4693d9a0698aff95c2fcab50712467eab40" + "04583eb8fb7f8955ad340609f4b30283e4888325f1415a08" + "5125e8f7cdc99fd91dbd7280373c5b960b1dd1dc417b9ce4" + "d897f45a6555d535739a47f0ebfd0c3029f166d109b18f75" + "277f7930d55ceb22e8adba794c155ced74cbdd5fc5d36db1" + "9b0a5835cca7e3"); testCollision(dig, "d131dd02c5e6eec4693d9a0698aff95c2fcab58712467eab40" + "04583eb8fb7f8955ad340609f4b30283e488832571415a08" + "5125e8f7cdc99fd91dbdf280373c5bd8823e3156348f5bae" + "6dacd436c919c6dd53e2b487da03fd02396306d248cda0e9" + "9f33420f577ee8ce54b67080a80d1ec69821bcb6a8839396" + "f9652b6ff72a70", "d131dd02c5e6eec4693d9a0698aff95c2fcab50712467eab40" + "04583eb8fb7f8955ad340609f4b30283e4888325f1415a08" + "5125e8f7cdc99fd91dbd7280373c5bd8823e3156348f5bae" + "6dacd436c919c6dd53e23487da03fd02396306d248cda0e9" + "9f33420f577ee8ce54b67080280d1ec69821bcb6a8839396" + "f965ab6ff72a70"); reportSuccess("MD5"); } /** * Test SHA-0 implementation. */ private static void testSHA0() { Digest dig = new SHA0(); testKat(dig, "abc", "0164b8a914cd2a5e74c4f7ff082c4d97f1edf880"); testKat(dig, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlm" + "nomnopnopq", "d2516ee1acfa5baf33dfc1c471e438449ef134c8"); testKatMillionA(dig, "3232affa48628a26653b5aaa44541fd90d690603"); testCollision(dig, "a766a602b65cffe773bcf25826b322b3d01b1a972684ef533e" + "3b4b7f53fe376224c08e47e959b2bc3b519880b928656824" + "7d110f70f5c5e2b4590ca3f55f52feeffd4c8fe68de83532" + "9e603cc51e7f02545410d1671d108df5a4000dcf20a43949" + "49d72cd14fbb0345cf3a295dcda89f998f87552c9a58b1bd" + "c384835e477185f96e68bebb0025d2d2b69edf21724198f6" + "88b41deb9b4913fbe696b5457ab39921e1d7591f89de8457" + "e8613c6c9e3b242879d4d8783b2d9ca9935ea526a729c06e" + "dfc50137e69330be976012cc5dfe1c14c4c68bd1db3ecb24" + "438a59a09b5db435563e0d8bdf572f77b53065cef31f32dc" + "9dbaa04146261e9994bd5cd0758e3d", "a766a602b65cffe773bcf25826b322b1d01b1ad72684ef51be" + "3b4b7fd3fe3762a4c08e45e959b2fc3b51988039286528a4" + "7d110d70f5c5e034590ce3755f52fc6ffd4c8d668de87532" + "9e603e451e7f02d45410d1e71d108df5a4000dcf20a43949" + "49d72cd14fbb0145cf3a695dcda89d198f8755ac9a58b13d" + "c384815e4771c5796e68febb0025d052b69edda17241d876" + "88b41f6b9b49117be696f5c57ab399a1e1d7199f89de8657" + "e8613cec9e3b26a879d498783b2d9e29935ea7a6a729806e" + "dfc50337e693303e9760104c5dfe5c14c4c68951db3ecba4" + "438a59209b5db435563e0d8bdf572f77b53065cef31f30dc" + "9dbae04146261c1994bd5c50758e3d"); reportSuccess("SHA-0"); } /** * Test SHA-1 implementation. */ private static void testSHA1() { Digest dig = new SHA1(); testKat(dig, "abc", "a9993e364706816aba3e25717850c26c9cd0d89d"); testKat(dig, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlm" + "nomnopnopq", "84983e441c3bd26ebaae4aa1f95129e5e54670f1"); testKatMillionA(dig, "34aa973cd4c4daa4f61eeb2bdbad27316534016f"); reportSuccess("SHA-1"); } /** * Test SHA-224 implementation. */ private static void testSHA224() { Digest dig = new SHA224(); testKat(dig, "abc", "23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7"); testKat(dig, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlm" + "nomnopnopq", "75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525"); testKatMillionA(dig, "20794655980c91d8bbb4c1ea97618a4bf03f42581948b2ee4ee7ad67"); reportSuccess("SHA-224"); } /** * Test SHA-256 implementation. */ private static void testSHA256() { Digest dig = new SHA256(); testKat(dig, "abc", "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"); testKat(dig, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlm" + "nomnopnopq", "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"); testKatMillionA(dig, "cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0"); reportSuccess("SHA-256"); } /** * Test SHA-384 implementation. */ private static void testSHA384() { Digest dig = new SHA384(); testKat(dig, "abc", "cb00753f45a35e8bb5a03d699ac65007272c32ab0eded163" + "1a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7"); testKat(dig, "abcdefghbcdefghicdefghijdefghijkefghijklfghij" + "klmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnop" + "qrsmnopqrstnopqrstu", "09330c33f71147e83d192fc782cd1b4753111b173b3b05d2" + "2fa08086e3b0f712fcc7c71a557e2db966c3e9fa91746039"); testKatMillionA(dig, "9d0e1809716474cb086e834e310a4a1ced149e9c00f24852" + "7972cec5704c2a5b07b8b3dc38ecc4ebae97ddd87f3d8985"); reportSuccess("SHA-384"); } /** * Test SHA-512 implementation. */ private static void testSHA512() { Digest dig = new SHA512(); testKat(dig, "abc", "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a" + "2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f"); testKat(dig, "abcdefghbcdefghicdefghijdefghijkefghijklfghij" + "klmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnop" + "qrsmnopqrstnopqrstu", "8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018" + "501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909"); testKatMillionA(dig, "e718483d0ce769644e2e42c7bc15b4638e1f98b13b2044285632a803afa973eb" + "de0ff244877ea60a4cb0432ce577c31beb009c5c2c49aa2e4eadb217ad8cc09b"); reportSuccess("SHA-512"); } /** * Test RIPEMD implementation. */ private static void testRIPEMD() { Digest dig = new RIPEMD(); testKat(dig, "", "9f73aa9b372a9dacfb86a6108852e2d9"); testKat(dig, "a", "486f74f790bc95ef7963cd2382b4bbc9"); testKat(dig, "abc", "3f14bad4c2f9b0ea805e5485d3d6882d"); testKat(dig, "message digest", "5f5c7ebe1abbb3c7036482942d5f9d49"); testKat(dig, "abcdefghijklmnopqrstuvwxyz", "ff6e1547494251a1cca6f005a6eaa2b4"); testKat(dig, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr" + "stuvwxyz0123456789", "ff418a5aed3763d8f2ddf88a29e62486"); testKat(dig, "12345678901234567890123456789012345678901234" + "567890123456789012345678901234567890", "dfd6b45f60fe79bbbde87c6bfc6580a5"); testCollision(dig, "8eaf9f5779f5ec09ba6a4a5711354178a410b4a29f6c2fad2c" + "20560b1179754de7aade0bf291bc787d6dbc47b1d1bd9a15" + "205da4ff047181a8584726a54e0661", "8eaf9f5779f5ec09ba6a4a5711355178a410b4a29f6c2fad2c" + "20560b1179754de7aade0bf291bc787d6dc0c7b1d1bd9a15" + "205da4ff047181a8584726a54e06e1"); testCollision(dig, "8eaf9f5779f5ec09ba6a4a5711354178a410b4a29f6c2fad2c" + "20560b1179754de7aade0bf291bc787d6dbc47b1d1bd9a15" + "205da4ff04a5a0a8588db1b6660ce7", "8eaf9f5779f5ec09ba6a4a5711355178a410b4a29f6c2fad2c" + "20560b1179754de7aade0bf291bc787d6dc0c7b1d1bd9a15" + "205da4ff04a5a0a8588db1b6660c67"); reportSuccess("RIPEMD"); } /** * Test RIPEMD-128 implementation. */ private static void testRIPEMD128() { Digest dig = new RIPEMD128(); testKat(dig, "", "cdf26213a150dc3ecb610f18f6b38b46"); testKat(dig, "a", "86be7afa339d0fc7cfc785e72f578d33"); testKat(dig, "abc", "c14a12199c66e4ba84636b0f69144c77"); testKat(dig, "message digest", "9e327b3d6e523062afc1132d7df9d1b8"); testKat(dig, "abcdefghijklmnopqrstuvwxyz", "fd2aa607f71dc8f510714922b371834e"); testKat(dig, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmn" + "lmnomnopnopq", "a1aa0689d0fafa2ddc22e88b49133a06"); testKat(dig, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr" + "stuvwxyz0123456789", "d1e959eb179c911faea4624c60c5c702"); testKat(dig, "12345678901234567890123456789012345678901234" + "567890123456789012345678901234567890", "3f45ef194732c2dbb2c4a2c769795fa3"); testKatMillionA(dig, "4a7f5723f954eba1216c9d8f6320431f"); reportSuccess("RIPEMD-128"); } /** * Test RIPEMD-160 implementation. */ private static void testRIPEMD160() { Digest dig = new RIPEMD160(); testKat(dig, "", "9c1185a5c5e9fc54612808977ee8f548b2258d31"); testKat(dig, "a", "0bdc9d2d256b3ee9daae347be6f4dc835a467ffe"); testKat(dig, "abc", "8eb208f7e05d987a9b044a8e98c6b087f15a0bfc"); testKat(dig, "message digest", "5d0689ef49d2fae572b881b123a85ffa21595f36"); testKat(dig, "abcdefghijklmnopqrstuvwxyz", "f71c27109c692c1b56bbdceb5b9d2865b3708dbc"); testKat(dig, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmn" + "lmnomnopnopq", "12a053384a9c0c88e405a06c27dcf49ada62eb2b"); testKat(dig, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr" + "stuvwxyz0123456789", "b0e20b6e3116640286ed3a87a5713079b21f5189"); testKat(dig, "12345678901234567890123456789012345678901234" + "567890123456789012345678901234567890", "9b752e45573d4b39f4dbd3323cab82bf63326bfb"); testKatMillionA(dig, "52783243c1697bdbe16d37f97f68f08325dc1528"); reportSuccess("RIPEMD-160"); } /** * Test Tiger implementation. */ private static void testTiger() { Digest dig = new Tiger(); testKat(dig, "", "3293AC630C13F0245F92BBB1766E16167A4E58492DDE73F3"); testKat(dig, "a", "77BEFBEF2E7EF8AB2EC8F93BF587A7FC613E247F5F247809"); testKat(dig, "abc", "2AAB1484E8C158F2BFB8C5FF41B57A525129131C957B5F93"); testKat(dig, "message digest", "D981F8CB78201A950DCF3048751E441C517FCA1AA55A29F6"); testKat(dig, "abcdefghijklmnopqrstuvwxyz", "1714A472EEE57D30040412BFCC55032A0B11602FF37BEEE9"); testKat(dig, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmn" + "lmnomnopnopq", "0F7BF9A19B9C58F2B7610DF7E84F0AC3A71C631E7B53F78E"); testKat(dig, "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz0123456789", "8DCEA680A17583EE502BA38A3C368651890FFBCCDC49A8CC"); testKat(dig, "1234567890123456789012345678901234567890" + "1234567890123456789012345678901234567890", "1C14795529FD9F207A958F84C52F11E887FA0CABDFD91BFD"); testKatMillionA(dig, "6DB0E2729CBEAD93D715C6A7D36302E9B3CEE0D2BC314B41"); reportSuccess("Tiger"); } /** * Test Tiger2 implementation. */ private static void testTiger2() { Digest dig = new Tiger2(); testKat(dig, "", "4441BE75F6018773C206C22745374B924AA8313FEF919F41"); testKat(dig, "a", "67E6AE8E9E968999F70A23E72AEAA9251CBC7C78A7916636"); testKat(dig, "abc", "F68D7BC5AF4B43A06E048D7829560D4A9415658BB0B1F3BF"); testKat(dig, "message digest", "E29419A1B5FA259DE8005E7DE75078EA81A542EF2552462D"); testKat(dig, "abcdefghijklmnopqrstuvwxyz", "F5B6B6A78C405C8547E91CD8624CB8BE83FC804A474488FD"); testKat(dig, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmn" + "lmnomnopnopq", "A6737F3997E8FBB63D20D2DF88F86376B5FE2D5CE36646A9"); testKat(dig, "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz0123456789", "EA9AB6228CEE7B51B77544FCA6066C8CBB5BBAE6319505CD"); testKat(dig, "1234567890123456789012345678901234567890" + "1234567890123456789012345678901234567890", "D85278115329EBAA0EEC85ECDC5396FDA8AA3A5820942FFF"); testKatMillionA(dig, "E068281F060F551628CC5715B9D0226796914D45F7717CF4"); reportSuccess("Tiger2"); } /** * Test PANAMA implementation. */ private static void testPANAMA() { Digest dig = new PANAMA(); testKat(dig, "", "aa0cc954d757d7ac7779ca3342334ca471abd47d5952ac91ed837ecd5b16922b"); testKat(dig, "T", "049d698307d8541f22870dfa0a551099d3d02bc6d57c610a06a4585ed8d35ff8"); testKat(dig, "The quick brown fox jumps over the lazy dog", "5f5ca355b90ac622b0aa7e654ef5f27e9e75111415b48b8afe3add1c6b89cba1"); testKatMillionA(dig, "af9c66fb6058e2232a5dfba063ee14b0f86f0e334e165812559435464dd9bb60"); reportSuccess("PANAMA"); } /** * Test HAVAL implementation. */ private static void testHAVAL() { Digest dig128_3 = new HAVAL128_3(); Digest dig128_4 = new HAVAL128_4(); Digest dig128_5 = new HAVAL128_5(); Digest dig160_3 = new HAVAL160_3(); Digest dig160_4 = new HAVAL160_4(); Digest dig160_5 = new HAVAL160_5(); Digest dig192_3 = new HAVAL192_3(); Digest dig192_4 = new HAVAL192_4(); Digest dig192_5 = new HAVAL192_5(); Digest dig224_3 = new HAVAL224_3(); Digest dig224_4 = new HAVAL224_4(); Digest dig224_5 = new HAVAL224_5(); Digest dig256_3 = new HAVAL256_3(); Digest dig256_4 = new HAVAL256_4(); Digest dig256_5 = new HAVAL256_5(); testKat(dig128_3, "", "C68F39913F901F3DDF44C707357A7D70"); testKat(dig128_3, "a", "0CD40739683E15F01CA5DBCEEF4059F1"); testKat(dig128_3, "HAVAL", "DC1F3C893D17CC4EDD9AE94AF76A0AF0"); testKat(dig128_3, "0123456789", "D4BE2164EF387D9F4D46EA8EFB180CF5"); testKat(dig128_3, "abcdefghijklmnopqrstuvwxyz", "DC502247FB3EB8376109EDA32D361D82"); testKat(dig128_3, "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz0123456789", "DE5EB3F7D9EB08FAE7A07D68E3047EC6"); testKat(dig160_3, "", "D353C3AE22A25401D257643836D7231A9A95F953"); testKat(dig160_3, "a", "4DA08F514A7275DBC4CECE4A347385983983A830"); testKat(dig160_3, "HAVAL", "8822BC6F3E694E73798920C77CE3245120DD8214"); testKat(dig160_3, "0123456789", "BE68981EB3EBD3F6748B081EE5D4E1818F9BA86C"); testKat(dig160_3, "abcdefghijklmnopqrstuvwxyz", "EBA9FA6050F24C07C29D1834A60900EA4E32E61B"); testKat(dig160_3, "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz0123456789", "97DC988D97CAAE757BE7523C4E8D4EA63007A4B9"); testKat(dig192_3, "", "E9C48D7903EAF2A91C5B350151EFCB175C0FC82DE2289A4E"); testKat(dig192_3, "a", "B359C8835647F5697472431C142731FF6E2CDDCACC4F6E08"); testKat(dig192_3, "HAVAL", "8DA26DDAB4317B392B22B638998FE65B0FBE4610D345CF89"); testKat(dig192_3, "0123456789", "DE561F6D818A760D65BDD2823ABE79CDD97E6CFA4021B0C8"); testKat(dig192_3, "abcdefghijklmnopqrstuvwxyz", "A25E1456E6863E7D7C74017BB3E098E086AD4BE0580D7056"); testKat(dig192_3, "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz0123456789", "DEF6653091E3005B43A61681014A066CD189009D00856EE7"); testKat(dig224_3, "", "C5AAE9D47BFFCAAF84A8C6E7CCACD60A0DD1932BE7B1A192B9214B6D"); testKat(dig224_3, "a", "731814BA5605C59B673E4CAAE4AD28EEB515B3ABC2B198336794E17B"); testKat(dig224_3, "HAVAL", "AD33E0596C575D7175E9F72361CA767C89E46E2609D88E719EE69AAA"); testKat(dig224_3, "0123456789", "EE345C97A58190BF0F38BF7CE890231AA5FCF9862BF8E7BEBBF76789"); testKat(dig224_3, "abcdefghijklmnopqrstuvwxyz", "06AE38EBC43DB58BD6B1D477C7B4E01B85A1E7B19B0BD088E33B58D1"); testKat(dig224_3, "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz0123456789", "939F7ED7801C1CE4B32BC74A4056EEE6081C999ED246907ADBA880A7"); testKat(dig256_3, "", "4F6938531F0BC8991F62DA7BBD6F7DE3FAD44562B8C6F4EBF146D5B4E46F7C17"); testKat(dig256_3, "a", "47C838FBB4081D9525A0FF9B1E2C05A98F625714E72DB289010374E27DB021D8"); testKat(dig256_3, "HAVAL", "91850C6487C9829E791FC5B58E98E372F3063256BB7D313A93F1F83B426AEDCC"); testKat(dig256_3, "0123456789", "63238D99C02BE18C3C5DB7CCE8432F51329012C228CCC17EF048A5D0FD22D4AE"); testKat(dig256_3, "abcdefghijklmnopqrstuvwxyz", "72FAD4BDE1DA8C8332FB60561A780E7F504F21547B98686824FC33FC796AFA76"); testKat(dig256_3, "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz0123456789", "899397D96489281E9E76D5E65ABAB751F312E06C06C07C9C1D42ABD31BB6A404"); testKat(dig128_4, "", "EE6BBF4D6A46A679B3A856C88538BB98"); testKat(dig128_4, "a", "5CD07F03330C3B5020B29BA75911E17D"); testKat(dig128_4, "HAVAL", "958195D3DAC591030EAA0292A37A0CF2"); testKat(dig128_4, "0123456789", "2215D3702A80025C858062C53D76CBE5"); testKat(dig128_4, "abcdefghijklmnopqrstuvwxyz", "B2A73B99775FFB17CD8781B85EC66221"); testKat(dig128_4, "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz0123456789", "CAD57C0563BDA208D66BB89EB922E2A2"); testKat(dig160_4, "", "1D33AAE1BE4146DBAACA0B6E70D7A11F10801525"); testKat(dig160_4, "a", "E0A5BE29627332034D4DD8A910A1A0E6FE04084D"); testKat(dig160_4, "HAVAL", "221BA4DD206172F12C2EBA3295FDE08D25B2F982"); testKat(dig160_4, "0123456789", "E387C743D14DF304CE5C7A552F4C19CA9B8E741C"); testKat(dig160_4, "abcdefghijklmnopqrstuvwxyz", "1C7884AF86D11AC120FE5DF75CEE792D2DFA48EF"); testKat(dig160_4, "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz0123456789", "148334AAD24B658BDC946C521CDD2B1256608C7B"); testKat(dig192_4, "", "4A8372945AFA55C7DEAD800311272523CA19D42EA47B72DA"); testKat(dig192_4, "a", "856C19F86214EA9A8A2F0C4B758B973CCE72A2D8FF55505C"); testKat(dig192_4, "HAVAL", "0C1396D7772689C46773F3DAACA4EFA982ADBFB2F1467EEA"); testKat(dig192_4, "0123456789", "C3A5420BB9D7D82A168F6624E954AAA9CDC69FB0F67D785E"); testKat(dig192_4, "abcdefghijklmnopqrstuvwxyz", "2E2E581D725E799FDA1948C75E85A28CFE1CF0C6324A1ADA"); testKat(dig192_4, "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz0123456789", "E5C9F81AE0B31FC8780FC37CB63BB4EC96496F79A9B58344"); testKat(dig224_4, "", "3E56243275B3B81561750550E36FCD676AD2F5DD9E15F2E89E6ED78E"); testKat(dig224_4, "a", "742F1DBEEAF17F74960558B44F08AA98BDC7D967E6C0AB8F799B3AC1"); testKat(dig224_4, "HAVAL", "85538FFC06F3B1C693C792C49175639666F1DDE227DA8BD000C1E6B4"); testKat(dig224_4, "0123456789", "BEBD7816F09BAEECF8903B1B9BC672D9FA428E462BA699F814841529"); testKat(dig224_4, "abcdefghijklmnopqrstuvwxyz", "A0AC696CDB2030FA67F6CC1D14613B1962A7B69B4378A9A1B9738796"); testKat(dig224_4, "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz0123456789", "3E63C95727E0CD85D42034191314401E42AB9063A94772647E3E8E0F"); testKat(dig256_4, "", "C92B2E23091E80E375DADCE26982482D197B1A2521BE82DA819F8CA2C579B99B"); testKat(dig256_4, "a", "E686D2394A49B44D306ECE295CF9021553221DB132B36CC0FF5B593D39295899"); testKat(dig256_4, "HAVAL", "E20643CFA66F5BE2145D13ED09C2FF622B3F0DA426A693FA3B3E529CA89E0D3C"); testKat(dig256_4, "0123456789", "ACE5D6E5B155F7C9159F6280327B07CBD4FF54143DC333F0582E9BCEB895C05D"); testKat(dig256_4, "abcdefghijklmnopqrstuvwxyz", "124F6EB645DC407637F8F719CC31250089C89903BF1DB8FAC21EA4614DF4E99A"); testKat(dig256_4, "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz0123456789", "46A3A1DFE867EDE652425CCD7FE8006537EAD26372251686BEA286DA152DC35A"); testKat(dig128_5, "", "184B8482A0C050DCA54B59C7F05BF5DD"); testKat(dig128_5, "a", "F23FBE704BE8494BFA7A7FB4F8AB09E5"); testKat(dig128_5, "HAVAL", "C97990F4FCC8FBA76AF935C405995355"); testKat(dig128_5, "0123456789", "466FDCD81C3477CAC6A31FFA1C999CA8"); testKat(dig128_5, "abcdefghijklmnopqrstuvwxyz", "0EFFF71D7D14344CBA1F4B25F924A693"); testKat(dig128_5, "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz0123456789", "4B27D04DDB516BDCDFEB96EB8C7C8E90"); testKat(dig160_5, "", "255158CFC1EED1A7BE7C55DDD64D9790415B933B"); testKat(dig160_5, "a", "F5147DF7ABC5E3C81B031268927C2B5761B5A2B5"); testKat(dig160_5, "HAVAL", "7730CA184CEA2272E88571A7D533E035F33B1096"); testKat(dig160_5, "0123456789", "41CC7C1267E88CEF0BB93697D0B6C8AFE59061E6"); testKat(dig160_5, "abcdefghijklmnopqrstuvwxyz", "917836A9D27EED42D406F6002E7D11A0F87C404C"); testKat(dig160_5, "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz0123456789", "6DDBDE98EA1C4F8C7F360FB9163C7C952680AA70"); testKat(dig192_5, "", "4839D0626F95935E17EE2FC4509387BBE2CC46CB382FFE85"); testKat(dig192_5, "a", "5FFA3B3548A6E2CFC06B7908CEB5263595DF67CF9C4B9341"); testKat(dig192_5, "HAVAL", "794A896D1780B76E2767CC4011BAD8885D5CE6BD835A71B8"); testKat(dig192_5, "0123456789", "A0B635746E6CFFFFD4B4A503620FEF1040C6C0C5C326476E"); testKat(dig192_5, "abcdefghijklmnopqrstuvwxyz", "85F1F1C0ECA04330CF2DE5C8C83CF85A611B696F793284DE"); testKat(dig192_5, "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz0123456789", "D651C8AC45C9050810D9FD64FC919909900C4664BE0336D0"); testKat(dig224_5, "", "4A0513C032754F5582A758D35917AC9ADF3854219B39E3AC77D1837E"); testKat(dig224_5, "a", "67B3CB8D4068E3641FA4F156E03B52978B421947328BFB9168C7655D"); testKat(dig224_5, "HAVAL", "9D7AE77B8C5C8C1C0BA854EBE3B2673C4163CFD304AD7CD527CE0C82"); testKat(dig224_5, "0123456789", "59836D19269135BC815F37B2AEB15F894B5435F2C698D57716760F2B"); testKat(dig224_5, "abcdefghijklmnopqrstuvwxyz", "1B360ACFF7806502B5D40C71D237CC0C40343D2000AE2F65CF487C94"); testKat(dig224_5, "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz0123456789", "180AED7F988266016719F60148BA2C9B4F5EC3B9758960FC735DF274"); testKat(dig256_5, "", "BE417BB4DD5CFB76C7126F4F8EEB1553A449039307B1A3CD451DBFDC0FBBE330"); testKat(dig256_5, "a", "DE8FD5EE72A5E4265AF0A756F4E1A1F65C9B2B2F47CF17ECF0D1B88679A3E22F"); testKat(dig256_5, "HAVAL", "153D2C81CD3C24249AB7CD476934287AF845AF37F53F51F5C7E2BE99BA28443F"); testKat(dig256_5, "0123456789", "357E2032774ABBF5F04D5F1DEC665112EA03B23E6E00425D0DF75EA155813126"); testKat(dig256_5, "abcdefghijklmnopqrstuvwxyz", "C9C7D8AFA159FD9E965CB83FF5EE6F58AEDA352C0EFF005548153A61551C38EE"); testKat(dig256_5, "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz0123456789", "B45CB6E62F2B1320E4F8F1B0B273D45ADD47C321FD23999DCF403AC37636D963"); testCollision(dig128_3, "8b447763189fe5d9bb3caaf2ba92cbd6444a54ee76a59f8733" + "46a31c4f5dca76428a7aa68bdc3a8d14d8e3b68d993056cd" + "5dea867bae39a7328efd54362bbbac9a3c183889927ab6b2" + "9972c4e59e0327145e55ddd8189083c9d9bbaa32c68fd7a7" + "b3f4ff96000040ac6a467fc0fbffffd216405fd016405fb0" + "e21200877f30f4", "8b487763189fe5d9bb3caaf2ba92cbd6444a54ee76a59f8733" + "46a31c4f5dca76428a7aa68bdc3a8d14d8e3b68d9930d6cd" + "5dea867bae39a7328efd54362bbbac9a3c183889927ab6ba" + "9972c4e59e0327145e55ddd8189083c9d9bbaa32c68fd7a7" + "b3f4ff96000040ac6a467fc0fbffffd216405fd016405fb0" + "e21200877f30f4"); testCollision(dig128_3, "8b447763189fe5d9bb3caaf2ba92cbd6444a54ee76a59f8733" + "46a31c4f5dca76428a7aa68bdc3a8d14d8e3b68d993056cd" + "5dea867bae39a7328efd54362bbbac9a3c183889927ab6b2" + "9972c4e59e0327145e55ddd8189083c9d9bbaa32c68fd7a7" + "b3f4ff96000040ac6a467fc0fbffffd216405fd016405fb0" + "e212006369b1f5", "8b487763189fe5d9bb3caaf2ba92cbd6444a54ee76a59f8733" + "46a31c4f5dca76428a7aa68bdc3a8d14d8e3b68d9930d6cd" + "5dea867bae39a7328efd54362bbbac9a3c183889927ab6ba" + "9972c4e59e0327145e55ddd8189083c9d9bbaa32c68fd7a7" + "b3f4ff96000040ac6a467fc0fbffffd216405fd016405fb0" + "e212006369b1f5"); reportSuccess("HAVAL"); } /** * Test WHIRLPOOL implementation. */ private static void testWHIRLPOOL() { Digest dig = new WHIRLPOOL(); Digest dig0 = new WHIRLPOOL0(); Digest dig1 = new WHIRLPOOL1(); testKat(dig, "", "19FA61D75522A4669B44E39C1D2E1726C530232130D407F89AFEE0964997F7A7" + "3E83BE698B288FEBCF88E3E03C4F0757EA8964E59B63D93708B138CC42A66EB3"); testKat(dig, "a", "8ACA2602792AEC6F11A67206531FB7D7F0DFF59413145E6973C45001D0087B42" + "D11BC645413AEFF63A42391A39145A591A92200D560195E53B478584FDAE231A"); testKat(dig, "abc", "4E2448A4C6F486BB16B6562C73B4020BF3043E3A731BCE721AE1B303D97E6D4C" + "7181EEBDB6C57E277D0E34957114CBD6C797FC9D95D8B582D225292076D4EEF5"); testKat(dig, "message digest", "378C84A4126E2DC6E56DCC7458377AAC838D00032230F53CE1F5700C0FFB4D3B" + "8421557659EF55C106B4B52AC5A4AAA692ED920052838F3362E86DBD37A8903E"); testKat(dig, "abcdefghijklmnopqrstuvwxyz", "F1D754662636FFE92C82EBB9212A484A8D38631EAD4238F5442EE13B8054E41B" + "08BF2A9251C30B6A0B8AAE86177AB4A6F68F673E7207865D5D9819A3DBA4EB3B"); testKat(dig, "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz0123456789", "DC37E008CF9EE69BF11F00ED9ABA26901DD7C28CDEC066CC6AF42E40F82F3A1E" + "08EBA26629129D8FB7CB57211B9281A65517CC879D7B962142C65F5A7AF01467"); testKat(dig, "123456789012345678901234567890" + "12345678901234567890123456789012345678901234567890", "466EF18BABB0154D25B9D38A6414F5C08784372BCCB204D6549C4AFADB601429" + "4D5BD8DF2A6C44E538CD047B2681A51A2C60481E88C5A20B2C2A80CF3A9A083B"); testKat(dig, "abcdbcdecdefdefgefghfghighijhijk", "2A987EA40F917061F5D6F0A0E4644F488A7A5A52DEEE656207C562F988E95C69" + "16BDC8031BC5BE1B7B947639FE050B56939BAAA0ADFF9AE6745B7B181C3BE3FD"); testKatMillionA(dig, "0C99005BEB57EFF50A7CF005560DDF5D29057FD86B20BFD62DECA0F1CCEA4AF5" + "1FC15490EDDC47AF32BB2B66C34FF9AD8C6008AD677F77126953B226E4ED8B01"); testKat(dig0, "", "B3E1AB6EAF640A34F784593F2074416ACCD3B8E62C620175FCA0997B1BA23473" + "39AA0D79E754C308209EA36811DFA40C1C32F1A2B9004725D987D3635165D3C8"); testKat(dig0, "The quick brown fox jumps over the lazy dog", "4F8F5CB531E3D49A61CF417CD133792CCFA501FD8DA53EE368FED20E5FE0248C" + "3A0B64F98A6533CEE1DA614C3A8DDEC791FF05FEE6D971D57C1348320F4EB42D"); testKat(dig0, "The quick brown fox jumps over the lazy eog", "228FBF76B2A93469D4B25929836A12B7D7F2A0803E43DABA0C7FC38BC11C8F2A" + "9416BBCF8AB8392EB2AB7BCB565A64AC50C26179164B26084A253CAF2E012676"); testKat(dig1, "", "470F0409ABAA446E49667D4EBE12A14387CEDBD10DD17B8243CAD550A089DC0F" + "EEA7AA40F6C2AAAB71C6EBD076E43C7CFCA0AD32567897DCB5969861049A0F5A"); testKat(dig1, "The quick brown fox jumps over the lazy dog", "3CCF8252D8BBB258460D9AA999C06EE38E67CB546CFFCF48E91F700F6FC7C183" + "AC8CC3D3096DD30A35B01F4620A1E3A20D79CD5168544D9E1B7CDF49970E87F1"); testKat(dig1, "The quick brown fox jumps over the lazy eog", "C8C15D2A0E0DE6E6885E8A7D9B8A9139746DA299AD50158F5FA9EECDDEF744F9" + "1B8B83C617080D77CB4247B1E964C2959C507AB2DB0F1F3BF3E3B299CA00CAE3"); reportSuccess("WHIRLPOOL"); } /** * Test HMAC implementation. */ private static void testHMAC() { Digest hmac; /* * From RFC 2104. */ hmac = new HMAC(new MD5(), strtobin("0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B")); testKat(hmac, "Hi There", "9294727A3638BB1C13F48EF8158BFC9D"); hmac = new HMAC(new MD5(), encodeLatin1("Jefe")); testKat(hmac, "what do ya want for nothing?", "750C783E6AB0B503EAA86E310A5DB738"); hmac = new HMAC(new MD5(), strtobin("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")); testKat(hmac, "\u00DD\u00DD\u00DD\u00DD\u00DD\u00DD\u00DD" + "\u00DD\u00DD\u00DD\u00DD\u00DD\u00DD\u00DD\u00DD" + "\u00DD\u00DD\u00DD\u00DD\u00DD\u00DD\u00DD\u00DD" + "\u00DD\u00DD\u00DD\u00DD\u00DD\u00DD\u00DD\u00DD" + "\u00DD\u00DD\u00DD\u00DD\u00DD\u00DD\u00DD\u00DD" + "\u00DD\u00DD\u00DD\u00DD\u00DD\u00DD\u00DD\u00DD" + "\u00DD\u00DD\u00DD", "56BE34521D144C88DBB8C733F0E8B3F6"); /* * From FIPS 198a. */ hmac = new HMAC(new SHA1(), strtobin("000102030405060708090A0B0C0D0E0F101112131" + "415161718191A1B1C1D1E1F20212223242526272" + "8292A2B2C2D2E2F303132333435363738393A3B3" + "C3D3E3F")); testKat(hmac, "Sample #1", "4F4CA3D5D68BA7CC0A1208C9C61E9C5DA0403C0A"); hmac = new HMAC(new SHA1(), strtobin("303132333435363738393A3B3C3D3E3F40414243")); testKat(hmac, "Sample #2", "0922D3405FAA3D194F82A45830737D5CC6C75D24"); hmac = new HMAC(new SHA1(), strtobin("505152535455565758595A5B5C5D5E5F606162636" + "465666768696A6B6C6D6E6F70717273747576777" + "8797A7B7C7D7E7F808182838485868788898A8B8" + "C8D8E8F909192939495969798999A9B9C9D9E9FA" + "0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3")); testKat(hmac, "Sample #3", "BCF41EAB8BB2D802F3D05CAF7CB092ECF8D1A3AA"); hmac = new HMAC(new SHA1(), strtobin("707172737475767778797A7B7C7D7E7F808182838" + "485868788898A8B8C8D8E8F90919293949596979" + "8999A9B9C9D9E9FA0"), 12); testKat(hmac, "Sample #4", "9EA886EFE268DBECCE420C75"); reportSuccess("HMAC"); } }