com.licel.jcardsim.crypto.SymmetricSignatureImplTest.java Source code

Java tutorial

Introduction

Here is the source code for com.licel.jcardsim.crypto.SymmetricSignatureImplTest.java

Source

/*
 * 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));

    }
}