package gnu.testlet.gnu.crypto.cipher;

// ----------------------------------------------------------------------------
// $Id: TestOfAnubis.java,v 1.3 2005/10/06 04:24:19 rsdio Exp $
//
// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
//
// This file is part of GNU Crypto.
//
// GNU Crypto is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2, or (at your option)
// any later version.
//
// GNU Crypto is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; see the file COPYING.  If not, write to the
//
//    Free Software Foundation Inc.,
//    51 Franklin Street, Fifth Floor,
//    Boston, MA 02110-1301
//    USA
//
// Linking this library statically or dynamically with other modules is
// making a combined work based on this library.  Thus, the terms and
// conditions of the GNU General Public License cover the whole
// combination.
//
// As a special exception, the copyright holders of this library give
// you permission to link this library with independent modules to
// produce an executable, regardless of the license terms of these
// independent modules, and to copy and distribute the resulting
// executable under terms of your choice, provided that you also meet,
// for each linked independent module, the terms and conditions of the
// license of that module.  An independent module is a module which is
// not derived from or based on this library.  If you modify this
// library, you may extend this exception to your version of the
// library, but you are not obligated to do so.  If you do not wish to
// do so, delete this exception statement from your version.
// ----------------------------------------------------------------------------

// Tags: GNU-CRYPTO
// Uses: BaseCipherTestCase

import gnu.crypto.cipher.Anubis;
import gnu.crypto.cipher.IBlockCipher;
import gnu.testlet.TestHarness;
import java.util.HashMap;

/**
 * <p>Conformance tests for the {@link Anubis} implementation.</p>
 *
 * @version $Revision: 1.3 $
 */
public class TestOfAnubis extends BaseCipherTestCase {

   // Constants and variables
   // -------------------------------------------------------------------------

   // KAT and MCT vectors used in this test case
   private static final String[] vk_128;
   private static final String[] vk_192;
   private static final String[] vk_256;
   private static final String[] vt_128;
   private static final String[] vt_192;
   private static final String[] vt_256;
   private static final String[] mct_ecb_e_128;
   private static final String[] mct_ecb_e_192;
   private static final String[] mct_ecb_e_256;
   private static final String[] mct_ecb_d_128;
   private static final String[] mct_ecb_d_192;
   private static final String[] mct_ecb_d_256;
   private static final String[] mct_cbc_e_128;
   private static final String[] mct_cbc_e_192;
   private static final String[] mct_cbc_e_256;
   private static final String[] mct_cbc_d_128;
   private static final String[] mct_cbc_d_192;
   private static final String[] mct_cbc_d_256;

   // static initialiser
   static {
      vk_128 = new String[] {
         "B835BDC334829D8371BFA371E4B3C4FD", "6EEF5FDAC4C6E9914828AE9446A460BB",
         "3ECACEE372560B9810B5498D5E7791CC", "64F244781EE6DDD181BB5934A7A12F4E",
         "4F39939A9F45EF5F1F596E7BABA1EC6F"};

      vk_192 = new String[] {
         "7D623B52C74C64D8EBC72D579785438F", "AC166073FAA7E04A40C88455FF11BAED",
         "430ECACFD834527AE0E990668AA11B8F", "576566892CB51866C2810FF60A05FEFB",
         "53554C9CAC6727B76E294BF166F25646"};

      vk_256 = new String[] {
         "9600F07691692987F5E597DBDBAF1B0A", "1CB51DECD24FDA26926D05AD0F96AA28",
         "7E1DE6BBC06BB5BE2F6D6A719FE5B807", "99EBAA541999213EEB7AD212B21FA3A2",
         "2ED5C152EE4D0347F2C2677E0A7A43D5"};

      vt_128 = new String[] {
         "753843F8182D1A74346EA255242181E0", "741696DC3C9969A64F55DB17F5E4522F",
         "D7009A0DFDB7EA99BF4B944284C4FFE0", "708EB676B1DAE91CAAC8BFAAF060F1B9",
         "0BEF93A942AD81430B8E0AE0CC56C30E"};

      vt_192 = new String[] {
         "CEB51617789006534C2339B90E5CD678", "1EEE27469C93609DE05C1636549E485D",
         "C242A63345C449ADAEC0CD164E00C22E", "85BD1C84396110F91D4DFB426FA2E95A",
         "6E50F0079C2F870EB1A8E1A477F8FF2F"};

      vt_256 = new String[] {
         "570C7199920DE014C1825423CEB62E03", "8C26F898A7ACF62A710C3F64D50A3B63",
         "47DEEEFEC4CC45211B1E35EE0769A3BF", "4AA854C639F1585B8078B8CA7353C16B",
         "43C80353A6461328B253769F1FCE205A"};

      mct_ecb_e_128 = new String[] {
         "2A6C912A488A452F558E18C5E4CFC5BA", "47B9B72583D3E71A9B3553A1E8B58257",
         "860D8175D8A868D34557B77A0216DE0F", "D95165C080C86E3AD303B214015E0333",
         "1C4D5F272E10848513C8755BF73D78EA"};

      mct_ecb_e_192 = new String[] {
         "BDB43001BDBD82824768D56B92403380", "6C1F7A7E54C242A9C453A7223EC7AD3C",
         "E4A0C4C55605B20C3FD708C526CA5D8A", "D8139FDBF39DA3F9CDB87501D9FCA820",
         "85935A8D05CB415F4E87B07B57ADDEF8"};

      mct_ecb_e_256 = new String[] {
         "0150894308014AE25FB2EA3CEEC85210", "11F33B4127A57F2FF84C10AEF5159B94",
         "C294BD0E643D7AEED6CBAE0CCCB6BEF0", "FF4095A5432EB9CFD4C063176ACCB373",
         "84C5A38B1380D76BF8D50A346B47F563"};

      mct_ecb_d_128 = new String[] {
         "16600BC38CD79256652598F58228EFCF", "EBA185F180C7B4DB422DA0C88CD74B26",
         "C73B84FD1F5ADE0FCD444FCD46F47203", "F55FF70281CB55E99CE9DE51BE142C57",
         "42E97BDBB4ECF18F18166BC32109BF45"};

      mct_ecb_d_192 = new String[] {
         "879E3B2EEADFB4EA7B6BD46C4BE5E769", "11E607AB4460F1D50BDF748E3BA9BD57",
         "F15ACFD9E5267D85D6AC29F33FA1CBCB", "79CC26A4393A55B28738CA3A8A299FE9",
         "9B769F72D8632B6ADD1427FCF4FDF2DE"};

      mct_ecb_d_256 = new String[] {
         "0F504BDFAB77735CA40FCEBCAF47EE92", "9A448413BC6D98ABC3CAB39B8A9E6871",
         "636234AE5C2DDDFA7AE1627244CFCC90", "D3456F8048F7E5482671C7E2DEA9D762",
         "93562D9EC63F5B797588BD91E34E76A0"};

      mct_cbc_e_128 = new String[] {
         "3724E80A6C3CB054FF0E518999BBAB88", "F238302711B764856DA5A092C8289F5E",
         "2B632C0177CCCB6B4DD958924F6730DE", "04252FB295BE5FA6D32E501BABAF67DA",
         "E2A899340FE1E0302687D43F6D425798"};

      mct_cbc_e_192 = new String[] {
         "25086B9E6DE422DF5B3A62C4B9C64568", "042A05E5BCE817A9FC45AE7FE3A7D46C",
         "18F2104559B375818F3010A1C2C80C36", "71AC9391D488EE51A3C8F640A00A2B5D",
         "780A4737C44FC3F073155DB9C97BB21E"};

      mct_cbc_e_256 = new String[] {
         "022A01C9EFB90CB3D77D62F176004D85", "965CE7ABB639854D2A7929F0FD1206DF",
         "59FE9BB4E2272D0F68C7A510738AC7FC", "1F372860A508267A67356531B9596BBA",
         "E186DA9BD50AA7E30000DEF5C8A448D4"};

      mct_cbc_d_128 = new String[] {
         "5B237C6AE5BA37765A4E3938E7569F55", "CC7CD5A28DCE22C732F2371D937A726A",
         "84E078514190370771366EB9CF2D7031", "A6DEC5917B36562FDE3DBCCB76FA35BD",
         "1BD89437F976ADF10D7BFD9D852427CC"};

      mct_cbc_d_192 = new String[] {
         "430231B438EB551A8AF015ED00690E14", "62C86D437D35421720FAD2771D1065EE",
         "DFD175DD25EAC3265BA39B42450B3406", "A7BCD306586A0DC9E7949D828776DC3A",
         "C56E79EC9080F036A4454BE120540778"};

      mct_cbc_d_256 = new String[] {
         "39D0043E180C28B46D041AD3E050A1D4", "BA6EE5D10D4626ACDC642E580892B4DA",
         "01B932102B6BFCE16B7D74F4137A6DDF", "6049E4832730CA8AB3CA946DC1CFC08A",
         "0464A26509435822A9879EF7521F45AC"};
   }

   // Constructor(s)
   // -------------------------------------------------------------------------

   // default 0-arguments constructor

   // Class methods
   // -------------------------------------------------------------------------

   // Instance methods
   // -------------------------------------------------------------------------

   public void test(TestHarness harness) {
      harness.checkPoint("TestOfAnubis");
      cipher = new Anubis();
      HashMap attrib = new HashMap();
      attrib.put(IBlockCipher.CIPHER_BLOCK_SIZE, new Integer(16));
      attrib.put(IBlockCipher.KEY_MATERIAL, new byte[16]);
      try {
         cipher.init(attrib);
         String algorithm = cipher.name();
         harness.check(validityTest(), "validityTest("+algorithm+")");
         harness.check(cloneabilityTest(), "cloneabilityTest("+algorithm+")");
         harness.check(katVK(vk_128, cipher, 16), "KAT VK "+algorithm+"-128");
         harness.check(katVK(vk_192, cipher, 24), "KAT VK "+algorithm+"-192");
         harness.check(katVK(vk_256, cipher, 32), "KAT VK "+algorithm+"-256");
         harness.check(katVT(vt_128, cipher, 16), "KAT VT "+algorithm+"-128");
         harness.check(katVT(vt_192, cipher, 24), "KAT VT "+algorithm+"-192");
         harness.check(katVT(vt_256, cipher, 32), "KAT VT "+algorithm+"-256");
         harness.check(mctEncryptECB(mct_ecb_e_128, cipher, 16), "MCT ECB Encryption "+algorithm+"-128");
         harness.check(mctEncryptECB(mct_ecb_e_192, cipher, 24), "MCT ECB Encryption "+algorithm+"-192");
         harness.check(mctEncryptECB(mct_ecb_e_256, cipher, 32), "MCT ECB Encryption "+algorithm+"-256");
         harness.check(mctDecryptECB(mct_ecb_d_128, cipher, 16), "MCT ECB Decryption "+algorithm+"-128");
         harness.check(mctDecryptECB(mct_ecb_d_192, cipher, 24), "MCT ECB Decryption "+algorithm+"-192");
         harness.check(mctDecryptECB(mct_ecb_d_256, cipher, 32), "MCT ECB Decryption "+algorithm+"-256");
         harness.check(mctEncryptCBC(mct_cbc_e_128, cipher, 16), "MCT CBC Encryption "+algorithm+"-128");
         harness.check(mctEncryptCBC(mct_cbc_e_192, cipher, 24), "MCT CBC Encryption "+algorithm+"-192");
         harness.check(mctEncryptCBC(mct_cbc_e_256, cipher, 32), "MCT CBC Encryption "+algorithm+"-256");
         harness.check(mctDecryptCBC(mct_cbc_d_128, cipher, 16), "MCT CBC Decryption "+algorithm+"-128");
         harness.check(mctDecryptCBC(mct_cbc_d_192, cipher, 24), "MCT CBC Decryption "+algorithm+"-192");
         harness.check(mctDecryptCBC(mct_cbc_d_256, cipher, 32), "MCT CBC Decryption "+algorithm+"-256");
      } catch (Exception x) {
         harness.debug(x);
         harness.fail("TestOfAnubis");
      }
   }
}
