package gnu.testlet.gnu.crypto.cipher;

// ----------------------------------------------------------------------------
// $Id: TestOfRijndael.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.IBlockCipher;
import gnu.crypto.cipher.Rijndael;
import gnu.testlet.TestHarness;
import java.util.HashMap;

/**
 * <p>Conformance tests for the {@link Rijndael} implementation.</p>
 *
 * @version $Revision: 1.3 $
 */
public class TestOfRijndael 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[] {
         "0EDD33D3C621E546455BD8BA1418BEC8", "C0CC0C5DA5BD63ACD44A80774FAD5222",
         "2F0B4B71BC77851B9CA56D42EB8FF080", "6B1E2FFFE8A114009D8FE22F6DB5F876",
         "9AA042C315F94CBB97B62202F83358F5"};

      vk_192 = new String[] {
         "DE885DC87F5A92594082D02CC1E1B42C", "C749194F94673F9DD2AA1932849630C1",
         "0CEF643313912934D310297B90F56ECC", "C4495D39D4A553B225FBA02A7B1B87E1",
         "636D10B1A0BCAB541D680A7970ADC830"};

      vk_256 = new String[] {
         "E35A6DCB19B201A01EBCFA8AA22B5759", "5075C2405B76F22F553488CAE47CE90B",
         "49DF95D844A0145A7DE01C91793302D3", "E7396D778E940B8418A86120E5F421FE",
         "05F535C36FCEDE4657BE37F4087DB1EF"};

      vt_128 = new String[] {
         "3AD78E726C1EC02B7EBFE92B23D9EC34", "45BC707D29E8204D88DFBA2F0B0CAD9B",
         "161556838018F52805CDBD6202002E3F", "F5569B3AB6A6D11EFDE1BF0A64C6854A",
         "64E82B50E501FBD7DD4116921159B83E"};

      vt_192 = new String[] {
         "6CD02513E8D4DC986B4AFE087A60BD0C", "423D2772A0CA56DAABB48D2129062987",
         "1021F2A8DA70EB2219DC16804445FF98", "C636E35B402577F96974D8804295EBB8",
         "1566D2E57E8393C19E29F892EA28A9A7"};

      vt_256 = new String[] {
         "DDC6BF790C15760D8D9AEB6F9A75FD4E", "C7098C217C334D0C9BDF37EA13B0822C",
         "60F0FB0D4C56A8D4EEFEC5264204042D", "73376FBBF654D0686E0E84001477106B",
         "2F443B52BA5F0C6EA0602C7C4FD259B6"};

      mct_ecb_e_128 = new String[] {
         "C34C052CC0DA8D73451AFE5F03BE297F", "0AC15A9AFBB24D54AD99E987208272E2",
         "A3D43BFFA65D0E80092F67A314857870", "355F697E8B868B65B25A04E18D782AFA",
         "ACC863637868E3E068D2FD6E3508454A"};

      mct_ecb_e_192 = new String[] {
         "F3F6752AE8D7831138F041560631B114", "77BA00ED5412DFF27C8ED91F3C376172",
         "2D92DE893574463412BD7D121A94952F", "96650F835912F5E748422727802C6CE1",
         "5FCCD4B5F125ADC5B85A56DB32283732"};

      mct_ecb_e_256 = new String[] {
         "8B79EECC93A0EE5DFF30B4EA21636DA4", "C737317FE0846F132B23C8C2A672CE22",
         "E58B82BFBA53C0040DC610C642121168", "10B296ABB40504995DB71DDA0B7E26FB",
         "B7198D8E88BAA25234C18517E99BB70D"};

      mct_ecb_d_128 = new String[] {
         "44416AC2D1F53C583303917E6BE9EBE0", "E3FD51123B48A2E2AB1DB29894202222",
         "877B88A77AEF04F05546539E17259F53", "C7A71C1B46261602EB1EE48FDA8155A4",
         "6B6AC8E00FAF7E045ECCFC426A137221"};

      mct_ecb_d_192 = new String[] {
         "48E31E9E256718F29229319C19F15BA4", "CC01684BE9B29ED01EA7923E7D2380AA",
         "8726B4E66D6B8FBAA22D42981A5A40CC", "83B9A21A0710FDB9C603797613772ED6",
         "F15479A2B2C250F7E5C11D333D867CBD"};

      mct_ecb_d_256 = new String[] {
         "058CCFFDBBCB382D1F6F56585D8A4ADE", "15173A0EB65F5CC05E704EFE61D9E346",
         "85F083ACC676D91EDD1ABFB43935237A", "42C8F0ABC58E0BEAC32911D2DD9FA8C8",
         "5E44123D2CA07981B073BB2749F557D6"};

      mct_cbc_e_128 = new String[] {
         "8A05FC5E095AF4848A08D328D3688E3D", "192D9B3AA10BB2F7846CCBA0085C657A",
         "40D8DAF6D1FDA0A073B3BD18B7695D2E", "3EDBE80D69A1D2248CA55FC17C4EF3C5",
         "D87891CF573C99EAE4349A70CA099415"};

      mct_cbc_e_192 = new String[] {
         "7BD966D53AD8C1BB85D2ADFAE87BB104", "869C061BE9CFEAB5D285B0724A9A8970",
         "9E58A52B3840DBE16E8063A18220FEE4", "730A256C202B9D57F3C0D73AD4B6CBED",
         "E79EF11C5C1FD1AB75280BCFFCFE89D4"};

      mct_cbc_e_256 = new String[] {
         "FE3C53653E2F45B56FCD88B2CC898FF0", "7CE2ABAF8BEF23C4816DC8CE842048A7",
         "50CD14A12C6852D39654C816BFAF9AC2", "3F411DAD0E339FE281637133BF46BD13",
         "5BA2C7663A4061719A7CCC2AF2A3EE8A"};

      mct_cbc_d_128 = new String[] {
         "FACA37E0B0C85373DF706E73F7C9AF86", "F5372F9735C5685F1DA362AF6ECB2940",
         "5496A4C29C7670F61B5D5DF6181F5947", "940CC5A2AF4F1F8D1862B47BCF63E4CA",
         "08832415D97820DE305A58A9AD111A9E"};

      mct_cbc_d_192 = new String[] {
         "5DF678DD17BA4E75B61768C6ADEF7C7B", "F9604074F8FA45AC71959888DD056F9F",
         "98A957EA6DBE623B7E08F919812A3898", "AD6D29D6482764BB4BC27A87AE5CD877",
         "DA5EB591FDC48F0D9E4EBD373E5717A3"};

      mct_cbc_d_256 = new String[] {
         "4804E1818FE6297519A3E88C57310413", "D36C27EBB8FA0BC9FA368DF850FD45FB",
         "EBCB4DC84155682856D94B442BC597EE", "23AA6A6B4BE8C04E19707CA330804C4E",
         "9B1AA0F33416484BA68740E821F95CD3"};
   }

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

   // default 0-arguments constructor

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

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

   public void test(TestHarness harness) {
      harness.checkPoint("TestOfRijndael");
      cipher = new Rijndael();
      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("TestOfRijndael");
      }
   }
}
