package gnu.testlet.gnu.crypto.prng; // ---------------------------------------------------------------------------- // $Id: TestOfARCFour.java,v 1.3 2005/10/06 04:24:20 rsdio Exp $ // // Copyright (C) 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 import gnu.crypto.Registry; import gnu.crypto.prng.ARCFour; import gnu.crypto.prng.IRandom; import gnu.crypto.prng.PRNGFactory; import gnu.crypto.util.Util; import gnu.testlet.TestHarness; import gnu.testlet.Testlet; import java.util.Arrays; import java.util.HashMap; /** * <p>Conformance tests for the ARCFOUR keystream generator.</p> * * @version $Revision: 1.3 $ */ public class TestOfARCFour implements Testlet { // Constants and variables. // ----------------------------------------------------------------------- private byte[] pt, kb, ct; private HashMap attrib = new HashMap(); private IRandom keystream; // Constructors. // ----------------------------------------------------------------------- // default 0-arguments constructor // Class methods. // ----------------------------------------------------------------------- // Instance methods. // ----------------------------------------------------------------------- // Test vectors are from "draft-kaukonen-cipher-arcfour-03.txt", which is // about as official as anything associated with ARCFOUR gets. public void test(TestHarness harness) { harness.checkPoint("TestOfARCFour.testVectorOne"); // PLAIN=0000000000000000 // KEY=0123456789ABCDEF // CIPHER=7494C2E7104B0879 try { attrib.clear(); keystream = PRNGFactory.getInstance(Registry.ARCFOUR_PRNG); pt = new byte[8]; kb = Util.toBytesFromString("0123456789ABCDEF"); ct = Util.toBytesFromString("7494C2E7104B0879"); attrib.put(ARCFour.ARCFOUR_KEY_MATERIAL, kb); keystream.init(attrib); byte[] sb = new byte[8]; keystream.nextBytes(sb, 0, 8); harness.check(Arrays.equals(ct, sb)); } catch (Exception e) { harness.debug(e); harness.fail("TestOfARCFour.testVectorOne"); } harness.checkPoint("TestOfARCFour.testVectorTwo"); // PLAIN=DCEE4CF92C // KEY=618A63D2FB // CIPHER=F13829C9DE try { attrib.clear(); keystream = PRNGFactory.getInstance(Registry.ARCFOUR_PRNG); pt = Util.toBytesFromString("DCEE4CF92C"); kb = Util.toBytesFromString("618A63D2FB"); ct = Util.toBytesFromString("F13829C9DE"); attrib.put(ARCFour.ARCFOUR_KEY_MATERIAL, kb); keystream.init(attrib); byte[] cct = new byte[pt.length]; for (int i = 0; i < pt.length; i++) { cct[i] = (byte) (pt[i] ^ keystream.nextByte()); } harness.check(Arrays.equals(cct, ct)); } catch (Exception e) { harness.debug(e); harness.fail("TestOfARCFour.testVectorTwo"); } harness.checkPoint("TestOfARCFour.testVectorThree"); // PLAIN=527569736C696E6E756E206C61756C75206B6F7276697373 // 73616E692C2074E4686BE470E46964656E2070E4E46C6CE4 // 2074E47973696B75752E204B6573E479F66E206F6E206F6E // 6E69206F6D616E616E692C206B61736B6973617675756E20 // 6C61616B736F7420766572686F75752E20456E206D612069 // 6C6F697473652C20737572652068756F6B61612C206D7574 // 7461206D657473E46E2074756D6D757573206D756C6C6520 // 74756F6B61612E205075756E746F2070696C76656E2C206D // 692068756B6B75752C207369696E746F20766172616E2074 // 75756C6973656E2C206D69206E756B6B75752E2054756F6B // 7375742076616E616D6F6E206A61207661726A6F74207665 // 656E2C206E69697374E420737964E46D656E69206C61756C // 756E207465656E2E202D2045696E6F204C65696E6F // KEY=29041972FB42BA5FC7127712F13829C9 // CIPHER=358186999001E6B5DAF05ECEEB7EEE21E0689C1F00EEA81F // 7DD2CAAEE1D2763E68AF0EAD33D66C268BC946C484FBE94C // 5F5E0B86A59279E4F824E7A640BD223210B0A61160B7BCE9 // 86EA65688003596B630A6B90F8E0CAF6912A98EB872176E8 // 3C202CAA64166D2CCE57FF1BCA57B213F0ED1AA72FB8EA52 // B0BE01CD1E412867720B326EB389D011BD70D8AF035FB0D8 // 589DBCE3C666F5EA8D4C7954C50C3F340B0467F81B425961 // C11843074DF620F208404B394CF9D37FF54B5F1AD8F6EA7D // A3C561DFA7281F964463D2CC35A4D1B03490DEC51B0711FB // D6F55F79234D5B7C766622A66DE92BE996461D5E4DC878EF // 9BCA030521E8351E4BAED2FD04F9467368C4AD6AC186D082 // 45B263A2666D1F6C5420F1599DFD9F438921C2F5A463938C // E0982265EEF70179BC553F339EB1A4C1AF5F6A547F try { attrib.clear(); keystream = PRNGFactory.getInstance(Registry.ARCFOUR_PRNG); pt = Util.toBytesFromString( "527569736C696E6E756E206C61756C75206B6F7276697373"+ "73616E692C2074E4686BE470E46964656E2070E4E46C6CE4"+ "2074E47973696B75752E204B6573E479F66E206F6E206F6E"+ "6E69206F6D616E616E692C206B61736B6973617675756E20"+ "6C61616B736F7420766572686F75752E20456E206D612069"+ "6C6F697473652C20737572652068756F6B61612C206D7574"+ "7461206D657473E46E2074756D6D757573206D756C6C6520"+ "74756F6B61612E205075756E746F2070696C76656E2C206D"+ "692068756B6B75752C207369696E746F20766172616E2074"+ "75756C6973656E2C206D69206E756B6B75752E2054756F6B"+ "7375742076616E616D6F6E206A61207661726A6F74207665"+ "656E2C206E69697374E420737964E46D656E69206C61756C"+ "756E207465656E2E202D2045696E6F204C65696E6F"); kb = Util.toBytesFromString("29041972FB42BA5FC7127712F13829C9"); ct = Util.toBytesFromString( "358186999001E6B5DAF05ECEEB7EEE21E0689C1F00EEA81F"+ "7DD2CAAEE1D2763E68AF0EAD33D66C268BC946C484FBE94C"+ "5F5E0B86A59279E4F824E7A640BD223210B0A61160B7BCE9"+ "86EA65688003596B630A6B90F8E0CAF6912A98EB872176E8"+ "3C202CAA64166D2CCE57FF1BCA57B213F0ED1AA72FB8EA52"+ "B0BE01CD1E412867720B326EB389D011BD70D8AF035FB0D8"+ "589DBCE3C666F5EA8D4C7954C50C3F340B0467F81B425961"+ "C11843074DF620F208404B394CF9D37FF54B5F1AD8F6EA7D"+ "A3C561DFA7281F964463D2CC35A4D1B03490DEC51B0711FB"+ "D6F55F79234D5B7C766622A66DE92BE996461D5E4DC878EF"+ "9BCA030521E8351E4BAED2FD04F9467368C4AD6AC186D082"+ "45B263A2666D1F6C5420F1599DFD9F438921C2F5A463938C"+ "E0982265EEF70179BC553F339EB1A4C1AF5F6A547F"); attrib.put(ARCFour.ARCFOUR_KEY_MATERIAL, kb); keystream.init(attrib); byte[] cct = new byte[pt.length]; for (int i = 0; i < pt.length; i++) { cct[i] = (byte) (pt[i] ^ keystream.nextByte()); } harness.check(Arrays.equals(cct, ct)); } catch (Exception e) { harness.debug(e); harness.fail("TestOfARCFour.testVectorThree"); } harness.checkPoint("TestOfARCFour.testCloneability"); try { attrib.clear(); keystream = PRNGFactory.getInstance(Registry.ARCFOUR_PRNG); attrib.put(ARCFour.ARCFOUR_KEY_MATERIAL, new byte[0]); byte[] b1 = new byte[16]; byte[] b2 = new byte[16]; IRandom r1 = PRNGFactory.getInstance(Registry.ARCFOUR_PRNG); r1.init(attrib); r1.nextBytes(b1, 0, b1.length); IRandom r2 = (IRandom) r1.clone(); r1.nextBytes(b1, 0, b1.length); r2.nextBytes(b2, 0, b1.length); harness.check(Arrays.equals(b1, b2)); } catch (Exception e) { harness.debug(e); harness.fail("TestOfARCFour.testCloneability"); } } }