/* * Copyright 2011 Licel LLC. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.licel.jcardsim.crypto; import javacard.security.HMACKey; import javacard.security.Key; import javacard.security.KeyBuilder; import javacard.security.Signature; import junit.framework.TestCase; import org.bouncycastle.util.Arrays; import org.bouncycastle.util.encoders.Hex; /** * Test for * <code>SymmetricSignatureImpl</code> * Test data from NXP JCOP31-36/41 JavaCard */ public class SymmetricSignatureImplTest extends TestCase { // padded etalon message String MESSAGE_8 = "C899464893435BC8"; // etalon message without padding String MESSAGE_15 = "C46A3D01F5494013F9DFF3C5392C64"; // etalon des key String DES_KEY = "71705866C930F0AE"; // etalon 3des key String DES3_KEY = "B1891A49B2EA69F21245D4A51DD132E24F247FAC6D97F007"; // etalon IV vector String IV = "F8D7DB2B902855A3"; // MESSAGE_15 MAC by card (DES key) String[] DES_MAC_15 = new String[]{ // ALG_DES_MAC8_ISO9797_M1 "2CC3B23F98A404FE", // ALG_DES_MAC8_ISO9797_M2 "D7863C7D58BD53F4" }; // MESSAGE_15 MAC by card (3DES key) String[] DES3_MAC_15 = new String[]{ // ALG_DES_MAC8_ISO9797_M1 "165DD117D24198B1", // ALG_DES_MAC8_ISO9797_M2 "C8D247D6209E2E44", // ALG_DES_MAC8_ISO9797_1_M2_ALG3 "706CAC8246DE7427", }; // MESSAGE_15 MAC by card (DES key) with non-zero IV String[] DES_MAC_15_IV = new String[]{ // ALG_DES_MAC8_ISO9797_M1 "86D64C88EFE70383", // ALG_DES_MAC8_ISO9797_M1 "1B66F319FA735F75",}; // MESSAGE_15 MAC by card (3DES key) with non-zero IV String[] DES3_MAC_15_IV = new String[]{ // ALG_DES_MAC8_ISO9797_M1 "CC4EBC98BFFFAC21", // ALG_DES_MAC8_ISO9797_M2 "EC17707C14FA1344",}; // MESSAGE_8 MAC by card (DES key) String[] DES_MAC_8 = new String[]{ // ALG_DES_MAC8_NOPAD "8E5ABFB9D5F015EE",}; // MESSAGE_8 MAC by card (3DES key) String[] DES3_MAC_8 = new String[]{ // ALG_DES_MAC8_NOPAD "DB3543BCBB4EAD86",}; // MESSAGE_8 MAC by card (DES key) with non-zero IV String[] DES_MAC_8_IV = new String[]{ // ALG_DES_MAC8_NOPAD "3CE9E2657AFCE8B6" }; // MESSAGE_8 MAC by card (3DES key) with non-zero IV String[] DES3_MAC_8_IV = new String[]{ // ALG_DES_MAC8_NOPAD "81B2369E2773858F" }; // etalon message for AES-CBC String MESSAGE_16 = "6BC1BEE22E409F96E93D7E117393172A"; // etalon aes 128 key String AES_128_KEY = "2B7E151628AED2A6ABF7158809CF4F3C"; // etalon mac String AES_CBC_MAC = "3AD77BB40D7A3660A89ECAF32466EF97"; // hmac test vectors // {SIGNATUTE_ID, ..} byte[] HMAC_IDS = { Signature.ALG_HMAC_RIPEMD160, Signature.ALG_HMAC_RIPEMD160, Signature.ALG_HMAC_RIPEMD160, Signature.ALG_HMAC_RIPEMD160, Signature.ALG_HMAC_RIPEMD160, Signature.ALG_HMAC_RIPEMD160, Signature.ALG_HMAC_RIPEMD160, Signature.ALG_HMAC_MD5, Signature.ALG_HMAC_MD5, Signature.ALG_HMAC_MD5, Signature.ALG_HMAC_MD5, Signature.ALG_HMAC_MD5, Signature.ALG_HMAC_MD5, Signature.ALG_HMAC_MD5, Signature.ALG_HMAC_SHA1, Signature.ALG_HMAC_SHA1, Signature.ALG_HMAC_SHA1, Signature.ALG_HMAC_SHA1, Signature.ALG_HMAC_SHA1, Signature.ALG_HMAC_SHA1, Signature.ALG_HMAC_SHA1, Signature.ALG_HMAC_SHA_256, Signature.ALG_HMAC_SHA_384, Signature.ALG_HMAC_SHA_512, Signature.ALG_HMAC_SHA_256, Signature.ALG_HMAC_SHA_384, Signature.ALG_HMAC_SHA_512, Signature.ALG_HMAC_SHA_256, Signature.ALG_HMAC_SHA_384, Signature.ALG_HMAC_SHA_512, Signature.ALG_HMAC_SHA_256, Signature.ALG_HMAC_SHA_384, Signature.ALG_HMAC_SHA_512, Signature.ALG_HMAC_SHA_256, Signature.ALG_HMAC_SHA_384, Signature.ALG_HMAC_SHA_512, Signature.ALG_HMAC_SHA_256, Signature.ALG_HMAC_SHA_384, Signature.ALG_HMAC_SHA_512, }; // {KEY, TEXT, MAC}, .. String[][] HMAC_TESTS = { // RFC - 2286 HMAC-RIPEMD160 test case 1 {"0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B", "4869205468657265", "24CB4BD67D20FC1A5D2ED7732DCC39377F0A5668"}, // RFC - 2286 HMAC-RIPEMD160 test case 2 {"4A656665", "7768617420646F2079612077616E7420666F72206E6F7468696E673F", "DDA6C0213A485A9E24F4742064A7F033B43C4069"}, // RFC - 2286 HMAC-RIPEMD160 test case 3 {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "B0B105360DE759960AB4F35298E116E295D8E7C1"}, // RFC - 2286 HMAC-RIPEMD160 test case 4 {"0102030405060708090A0B0C0D0E0F10111213141516171819", "CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD", "D5CA862F4D21D5E610E18B4CF1BEB97A4365ECF4"}, // RFC - 2286 HMAC-RIPEMD160 test case 5 {"0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C", "546573742057697468205472756E636174696F6E", "7619693978F91D90539AE786500FF3D8E0518E39"}, // RFC - 2286 HMAC-RIPEMD160 test case 6 {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "54657374205573696E67204C6172676572205468616E20426C6F636B2D53697A65204B6579202D2048617368204B6579204669727374", "6466CA07AC5EAC29E1BD523E5ADA7605B791FD8B"}, // RFC - 2286 HMAC-RIPEMD160 test case 7 {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "54657374205573696E67204C6172676572205468616E20426C6F636B2D53697A65204B657920616E64204C6172676572205468616E204F6E6520426C6F636B2D53697A652044617461", "69EA60798D71616CCE5FD0871E23754CD75D5A0A"}, // RFC - 2202 HMAC-MD5 test case 1 {"0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B", "4869205468657265", "9294727A3638BB1C13F48EF8158BFC9D"}, // RFC - 2202 HMAC-MD5 test case 2 {"4A656665", "7768617420646F2079612077616E7420666F72206E6F7468696E673F", "750C783E6AB0B503EAA86E310A5DB738"}, // RFC - 2202 HMAC-MD5 test case 3 {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "56BE34521D144C88DBB8C733F0E8B3F6"}, // RFC - 2202 HMAC-MD5 test case 4 {"0102030405060708090A0B0C0D0E0F10111213141516171819", "CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD", "697EAF0ACA3A3AEA3A75164746FFAA79"}, // RFC - 2202 HMAC-MD5 test case 5 {"0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C", "546573742057697468205472756E636174696F6E", "56461EF2342EDC00F9BAB995690EFD4C"}, // RFC - 2202 HMAC-MD5 test case 6 {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "54657374205573696E67204C6172676572205468616E20426C6F636B2D53697A65204B6579202D2048617368204B6579204669727374", "6B1AB7FE4BD7BF8F0B62E6CE61B9D0CD"}, // RFC - 2202 HMAC-MD5 test case 7 {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "54657374205573696E67204C6172676572205468616E20426C6F636B2D53697A65204B657920616E64204C6172676572205468616E204F6E6520426C6F636B2D53697A652044617461", "6F630FAD67CDA0EE1FB1F562DB3AA53E"}, // RFC - 2202 HMAC-SHA1 test case 1 {"0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B", "4869205468657265", "B617318655057264E28BC0B6FB378C8EF146BE00"}, // RFC - 2202 HMAC-SHA1 test case 2 {"4A656665", "7768617420646F2079612077616E7420666F72206E6F7468696E673F", "EFFCDF6AE5EB2FA2D27416D5F184DF9C259A7C79"}, // RFC - 2202 HMAC-SHA1 test case 3 {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "125D7342B9AC11CD91A39AF48AA17B4F63F175D3"}, // RFC - 2202 HMAC-SHA1 test case 4 {"0102030405060708090A0B0C0D0E0F10111213141516171819", "CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD", "4C9007F4026250C6BC8414F9BF50C86C2D7235DA"}, // RFC - 2202 HMAC-SHA1 test case 5 {"0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C", "546573742057697468205472756E636174696F6E", "4C1A03424B55E07FE7F27BE1D58BB9324A9A5A04"}, // RFC - 2202 HMAC-SHA1 test case 6 {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "54657374205573696E67204C6172676572205468616E20426C6F636B2D53697A65204B6579202D2048617368204B6579204669727374", "AA4AE5E15272D00E95705637CE8A3B55ED402112"}, // RFC - 2202 HMAC-SHA1 test case 7 {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "54657374205573696E67204C6172676572205468616E20426C6F636B2D53697A65204B657920616E64204C6172676572205468616E204F6E6520426C6F636B2D53697A652044617461", "E8E99D0F45237D786D6BBAA7965C7808BBFF1A91"}, // RFC - 4231 HMAC-SHA-256 test case 1 {"0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B", "4869205468657265", "B0344C61D8DB38535CA8AFCEAF0BF12B881DC200C9833DA726E9376C2E32CFF7"}, // RFC - 4231 HMAC-SHA-384 test case 1 {"0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B", "4869205468657265", "AFD03944D84895626B0825F4AB46907F15F9DADBE4101EC682AA034C7CEBC59CFAEA9EA9076EDE7F4AF152E8B2FA9CB6"}, // RFC - 4231 HMAC-SHA-512 test case 1 {"0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B", "4869205468657265", "87AA7CDEA5EF619D4FF0B4241A1D6CB02379F4E2CE4EC2787AD0B30545E17CDEDAA833B7D6B8A702038B274EAEA3F4E4BE9D914EEB61F1702E696C203A126854"}, // RFC - 4231 HMAC-SHA-256 test case 2 {"4A656665", "7768617420646F2079612077616E7420666F72206E6F7468696E673F", "5BDCC146BF60754E6A042426089575C75A003F089D2739839DEC58B964EC3843"}, // RFC - 4231 HMAC-SHA-384 test case 2 {"4A656665", "7768617420646F2079612077616E7420666F72206E6F7468696E673F", "AF45D2E376484031617F78D2B58A6B1B9C7EF464F5A01B47E42EC3736322445E8E2240CA5E69E2C78B3239ECFAB21649"}, // RFC - 4231 HMAC-SHA-512 test case 2 {"4A656665", "7768617420646F2079612077616E7420666F72206E6F7468696E673F", "164B7A7BFCF819E2E395FBE73B56E0A387BD64222E831FD610270CD7EA2505549758BF75C05A994A6D034F65F8F0E6FDCAEAB1A34D4A6B4B636E070A38BCE737"}, // RFC - 4231 HMAC-SHA-256 test case 3 {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "773EA91E36800E46854DB8EBD09181A72959098B3EF8C122D9635514CED565FE"}, // RFC - 4231 HMAC-SHA-384 test case 3 {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "88062608D3E6AD8A0AA2ACE014C8A86F0AA635D947AC9FEBE83EF4E55966144B2A5AB39DC13814B94E3AB6E101A34F27"}, // RFC - 4231 HMAC-SHA-512 test case 3 {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "FA73B0089D56A284EFB0F0756C890BE9B1B5DBDD8EE81A3655F83E33B2279D39BF3E848279A722C806B485A47E67C807B946A337BEE8942674278859E13292FB"}, // RFC - 4231 HMAC-SHA-256 test case 4 {"0102030405060708090A0B0C0D0E0F10111213141516171819", "CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD", "82558A389A443C0EA4CC819899F2083A85F0FAA3E578F8077A2E3FF46729665B"}, // RFC - 4231 HMAC-SHA-384 test case 4 {"0102030405060708090a0b0c0d0e0f10111213141516171819", "CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD", "3E8A69B7783C25851933AB6290AF6CA77A9981480850009CC5577C6E1F573B4E6801DD23C4A7D679CCF8A386C674CFFB"}, // RFC - 4231 HMAC-SHA-512 test case 4 {"0102030405060708090a0b0c0d0e0f10111213141516171819", "CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD", "B0BA465637458C6990E5A8C5F61D4AF7E576D97FF94B872DE76F8050361EE3DBA91CA5C11AA25EB4D679275CC5788063A5F19741120C4F2DE2ADEBEB10A298DD"}, // RFC - 4231 HMAC-SHA-256 test case 6 {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "54657374205573696E67204C6172676572205468616E20426C6F636B2D53697A65204B6579202D2048617368204B6579204669727374", "60E431591EE0B67F0D8A26AACBF5B77F8E0BC6213728C5140546040F0EE37F54"}, // RFC - 4231 HMAC-SHA-384 test case 6 {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "54657374205573696E67204C6172676572205468616E20426C6F636B2D53697A65204B6579202D2048617368204B6579204669727374", "4ECE084485813E9088D2C63A041BC5B44F9EF1012A2B588F3CD11F05033AC4C60C2EF6AB4030FE8296248DF163F44952"}, // RFC - 4231 HMAC-SHA-512 test case 6 {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "54657374205573696E67204C6172676572205468616E20426C6F636B2D53697A65204B6579202D2048617368204B6579204669727374", "80B24263C7C1A3EBB71493C1DD7BE8B49B46D1F41B4AEEC1121B013783F8F3526B56D037E05F2598BD0FD2215D6A1E5295E64F73F63F0AEC8B915A985D786598"}, // RFC - 4231 HMAC-SHA-256 test case 7 {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "5468697320697320612074657374207573696E672061206C6172676572207468616E20626C6F636B2D73697A65206B657920616E642061206C6172676572207468616E20626C6F636B2D73697A6520646174612E20546865206B6579206E6565647320746F20626520686173686564206265666F7265206265696E6720757365642062792074686520484D414320616C676F726974686D2E", "9B09FFA71B942FCB27635FBCD5B0E944BFDC63644F0713938A7F51535C3A35E2"}, // RFC - 4231 HMAC-SHA-384 test case 7 {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "5468697320697320612074657374207573696E672061206C6172676572207468616E20626C6F636B2D73697A65206B657920616E642061206C6172676572207468616E20626C6F636B2D73697A6520646174612E20546865206B6579206E6565647320746F20626520686173686564206265666F7265206265696E6720757365642062792074686520484D414320616C676F726974686D2E", "6617178E941F020D351E2F254E8FD32C602420FEB0B8FB9ADCCEBB82461E99C5A678CC31E799176D3860E6110C46523E"}, // RFC - 4231 HMAC-SHA-512 test case 7 {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "5468697320697320612074657374207573696E672061206C6172676572207468616E20626C6F636B2D73697A65206B657920616E642061206C6172676572207468616E20626C6F636B2D73697A6520646174612E20546865206B6579206E6565647320746F20626520686173686564206265666F7265206265696E6720757365642062792074686520484D414320616C676F726974686D2E", "E37B6A775DC87DBAA4DFA9F96E5E3FFDDEBD71F8867289865DF5A32D20CDC944B6022CAC3C4982B10D5EEB55C3E4DE15134676FB6DE0446065C97440FA8C6A58"}, }; public SymmetricSignatureImplTest(String testName) { super(testName); } protected void setUp() throws Exception { super.setUp(); } protected void tearDown() throws Exception { super.tearDown(); } /** * Test of sign/verify methods, of class SymmetricSignatureImpl with 3DES Key */ public void testSignVerify3DES() { SymmetricKeyImpl desKey = new SymmetricKeyImpl(KeyBuilder.TYPE_DES, KeyBuilder.LENGTH_DES3_3KEY); desKey.setKey(Hex.decode(DES3_KEY), (short) 0); testSignVerify(desKey, MESSAGE_8, MESSAGE_15, DES3_MAC_8, DES3_MAC_15, DES3_MAC_8_IV, DES3_MAC_15_IV); } /** * Test of sign/verify methods, of class SymmetricSignatureImpl with 2-key 3DES */ public void testSignVerify2x3DES() { SymmetricKeyImpl desKey = new SymmetricKeyImpl(KeyBuilder.TYPE_DES, KeyBuilder.LENGTH_DES3_2KEY); desKey.setKey(Hex.decode(DES3_KEY), (short) 0); Signature engine = Signature.getInstance(Signature.ALG_DES_MAC8_ISO9797_1_M2_ALG3, false); testEngineSignVerify(engine, desKey, null, Hex.decode(MESSAGE_15), Hex.decode(DES3_MAC_15[2])); } /** * Test of sign/verifys methods, of class SymmetricSignatureImpl with DES Key */ public void testSignVerifyDES() { SymmetricKeyImpl desKey = new SymmetricKeyImpl(KeyBuilder.TYPE_DES, KeyBuilder.LENGTH_DES); desKey.setKey(Hex.decode(DES_KEY), (short) 0); testSignVerify(desKey, MESSAGE_8, MESSAGE_15, DES_MAC_8, DES_MAC_15, DES_MAC_8_IV, DES_MAC_15_IV); } /** * Test of sign/verifys methods, of class SymmetricSignatureImpl with AES Key */ public void testSignVerifyAES() { SymmetricKeyImpl aesKey = new SymmetricKeyImpl(KeyBuilder.TYPE_AES, KeyBuilder.LENGTH_AES_128); aesKey.setKey(Hex.decode(AES_128_KEY), (short) 0); Signature engine = Signature.getInstance(Signature.ALG_AES_MAC_128_NOPAD, false); testEngineSignVerify(engine, aesKey, null, Hex.decode(MESSAGE_16), Hex.decode(AES_CBC_MAC)); } /** * Test of sign/verifys methods, of class SymmetricSignatureImpl with HMAC Key */ public void testSignVerifyHMAC() { for (int i = 0; i < HMAC_IDS.length; i++) { byte[] hmacKeyBytes = Hex.decode(HMAC_TESTS[i][0]); HMACKey hmacKey = (HMACKey)KeyBuilder.buildKey(KeyBuilder.TYPE_HMAC, (short)hmacKeyBytes.length, false); hmacKey.setKey(hmacKeyBytes, (short) 0, (short)hmacKeyBytes.length); Signature engine = Signature.getInstance(HMAC_IDS[i], false); testEngineSignVerify(engine, hmacKey, null, Hex.decode(HMAC_TESTS[i][1]), Hex.decode(HMAC_TESTS[i][2])); } } /** * Test of sign/verify methods, of class SymmetricSignatureImpl with specified key * and etalon data */ public void testSignVerify(SymmetricKeyImpl desKey, String msg8, String msg15, String[] enc8, String[] enc15, String[] enc8IV, String[] enc15IV) { // test DES MAC CBC with IV={0,0,0,0,0,0,0,0} Signature engine = Signature.getInstance(Signature.ALG_DES_MAC8_NOPAD, false); testEngineSignVerify(engine, desKey, null, Hex.decode(msg8), Hex.decode(enc8[0])); engine = Signature.getInstance(Signature.ALG_DES_MAC8_ISO9797_M1, false); testEngineSignVerify(engine, desKey, null, Hex.decode(msg15), Hex.decode(enc15[0])); engine = Signature.getInstance(Signature.ALG_DES_MAC8_ISO9797_M2, false); testEngineSignVerify(engine, desKey, null, Hex.decode(msg15), Hex.decode(enc15[1])); // test DES MAC CBC with non-zero IV byte[] iv = Hex.decode(IV); engine = Signature.getInstance(Signature.ALG_DES_MAC8_NOPAD, false); testEngineSignVerify(engine, desKey, iv, Hex.decode(msg8), Hex.decode(enc8IV[0])); engine = Signature.getInstance(Signature.ALG_DES_MAC8_ISO9797_M1, false); testEngineSignVerify(engine, desKey, iv, Hex.decode(msg15), Hex.decode(enc15IV[0])); engine = Signature.getInstance(Signature.ALG_DES_MAC8_ISO9797_M2, false); testEngineSignVerify(engine, desKey, iv, Hex.decode(msg15), Hex.decode(enc15IV[1])); } /** * Test of sign/verify methods, of class SymmetricSignatureImpl with specified key, engine * and etalon data * @param engine test engine * @param key etalon key * @param iv IV if present * @param msg etalon msg * @param macEtalon etalon signature(mac) */ public void testEngineSignVerify(Signature engine, Key key, byte[] iv, byte[] msg, byte[] macEtalon) { // sign if (iv == null) { engine.init(key, Signature.MODE_SIGN); } else { engine.init(key, Signature.MODE_SIGN, iv, (short) 0, (short) iv.length); } byte[] mac = new byte[macEtalon.length]; // engine.sign(msg, (short) 0, (short) msg.length, mac, (short) 0); assertEquals(true, Arrays.areEqual(mac, macEtalon)); // verify if (iv == null) { engine.init(key, Signature.MODE_VERIFY); } else { engine.init(key, Signature.MODE_VERIFY, iv, (short) 0, (short) iv.length); } assertEquals(true, engine.verify(msg, (short) 0, (short) msg.length, macEtalon, (short) 0, (short) macEtalon.length)); } }