From Casey Marshall <rsdio@metastatic.org>  Wed Jun  5 01:15:08 2002
From: Casey Marshall <rsdio@metastatic.org> (Casey Marshall)
Date: Tue, 4 Jun 2002 17:15:08 -0700 (PDT)
Subject: [Classpathx-crypto] [patch] Serpent cipher
Message-ID: <Pine.LNX.4.44L0.0206041655440.11817-100000@gradius.dreamhost.com>

Hello,

I've been doing some studying in cryptography, came across GNU classpathx,
and have been working on implementing some ciphers using the crypto API.

The patch which follows (which is longish, but I didn't want to do an
attachment---please admonish if this is poor etiquette) is an
implementation of Serpent which appears correct in a few tests. It does
not, as far as I know, refer to any non-free techniques---is uses some
optimized S-box functions found by Dag Arne Osvik which are implemented
in a GPL'd ADA implementation from http://www.ii.uib.no/~gisle/serpent.html.

The patch is based on a recent CVS checkout and updates the gcj
Makefile.{in,am}, the classes Registry and CipherFactory, and adds the
Serpent class itself. Classpathx is welcome to use it.

Cheers,

-- 
Casey Marshall < rsdio@metastatic.org > http://metastatic.org/

=== cut here ===
diff -Naurw crypto/gcj/source/Makefile.am crypto.1/gcj/source/Makefile.am
--- crypto/gcj/source/Makefile.am	Wed May 29 02:02:35 2002
+++ crypto.1/gcj/source/Makefile.am	Tue Jun  4 16:04:52 2002
@@ -86,6 +86,7 @@
  gnu/crypto/cipher/Khazad.java \
  gnu/crypto/cipher/NullCipher.java \
  gnu/crypto/cipher/Rijndael.java \
+ gnu/crypto/cipher/Serpent.java \
  gnu/crypto/cipher/Square.java \
  gnu/crypto/cipher/Twofish.java \
  gnu/crypto/hash/BaseHash.java \
diff -Naurw crypto/gcj/source/Makefile.in crypto.1/gcj/source/Makefile.in
--- crypto/gcj/source/Makefile.in	Wed May 29 02:02:35 2002
+++ crypto.1/gcj/source/Makefile.in	Tue Jun  4 16:05:44 2002
@@ -203,6 +176,7 @@
  gnu/crypto/cipher/Khazad.java \
  gnu/crypto/cipher/NullCipher.java \
  gnu/crypto/cipher/Rijndael.java \
+ gnu/crypto/cipher/Serpent.java \
  gnu/crypto/cipher/Square.java \
  gnu/crypto/cipher/Twofish.java \
  gnu/crypto/hash/BaseHash.java \
@@ -297,9 +271,9 @@
 	gnu/crypto/cipher/IBlockCipher.lo \
 	gnu/crypto/cipher/IBlockCipherSpi.lo \
 	gnu/crypto/cipher/Khazad.lo gnu/crypto/cipher/NullCipher.lo \
-	gnu/crypto/cipher/Rijndael.lo gnu/crypto/cipher/Square.lo \
-	gnu/crypto/cipher/Twofish.lo gnu/crypto/hash/BaseHash.lo \
-	gnu/crypto/hash/HashFactory.lo \
+	gnu/crypto/cipher/Rijndael.lo gnu/crypto/cipher/Serpent.lo \
+	gnu/crypto/cipher/Square.lo gnu/crypto/cipher/Twofish.lo \
+	gnu/crypto/hash/BaseHash.lo gnu/crypto/hash/HashFactory.lo \
 	gnu/crypto/hash/IMessageDigest.lo gnu/crypto/hash/MD5.lo \
 	gnu/crypto/hash/RipeMD128.lo gnu/crypto/hash/RipeMD160.lo \
 	gnu/crypto/hash/Sha160.lo gnu/crypto/hash/Whirlpool.lo \
@@ -388,6 +366,7 @@
 @AMDEP_TRUE@	gnu/crypto/cipher/$(DEPDIR)/Khazad.Plo \
 @AMDEP_TRUE@	gnu/crypto/cipher/$(DEPDIR)/NullCipher.Plo \
 @AMDEP_TRUE@	gnu/crypto/cipher/$(DEPDIR)/Rijndael.Plo \
+@AMDEP_TRUE@	gnu/crypto/cipher/$(DEPDIR)/Serpent.Plo \
 @AMDEP_TRUE@	gnu/crypto/cipher/$(DEPDIR)/Square.Plo \
 @AMDEP_TRUE@	gnu/crypto/cipher/$(DEPDIR)/Twofish.Plo \
 @AMDEP_TRUE@	gnu/crypto/hash/$(DEPDIR)/BaseHash.Plo \
@@ -561,6 +534,9 @@
 gnu/crypto/cipher/Rijndael.lo: gnu/crypto/cipher/Rijndael.java \
 	gnu/crypto/cipher/.dirstamp \
 	gnu/crypto/cipher/$(DEPDIR)/.dirstamp
+gnu/crypto/cipher/Serpent.lo: gnu/crypto/cipher/Serpent.java \
+	gnu/crypto/cipher/.dirstamp \
+	gnu/crypto/cipher/$(DEPDIR)/.dirstamp
 gnu/crypto/cipher/Square.lo: gnu/crypto/cipher/Square.java \
 	gnu/crypto/cipher/.dirstamp \
 	gnu/crypto/cipher/$(DEPDIR)/.dirstamp
@@ -880,6 +852,8 @@
 	-rm -f gnu/crypto/cipher/NullCipher.lo
 	-rm -f gnu/crypto/cipher/Rijndael.$(OBJEXT)
 	-rm -f gnu/crypto/cipher/Rijndael.lo
+	-rm -f gnu/crypto/cipher/Serpent.$(OBJEXT)
+	-rm -f gnu/crypto/cipher/Serpent.lo
 	-rm -f gnu/crypto/cipher/Square.$(OBJEXT)
 	-rm -f gnu/crypto/cipher/Square.lo
 	-rm -f gnu/crypto/cipher/Twofish.$(OBJEXT)
@@ -1075,6 +1049,7 @@
 @AMDEP_TRUE@@am__include@ @am__quote@gnu/crypto/cipher/$(DEPDIR)/Khazad.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@gnu/crypto/cipher/$(DEPDIR)/NullCipher.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@gnu/crypto/cipher/$(DEPDIR)/Rijndael.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@gnu/crypto/cipher/$(DEPDIR)/Serpent.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@gnu/crypto/cipher/$(DEPDIR)/Square.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@gnu/crypto/cipher/$(DEPDIR)/Twofish.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@gnu/crypto/hash/$(DEPDIR)/BaseHash.Plo@am__quote@
@@ -1340,6 +1315,24 @@
 @AMDEP_TRUE@	$(GCJDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 	$(LIBTOOL) --mode=compile $(GCJ) $(AM_GCJFLAGS) $(GCJFLAGS) -c -o gnu/crypto/cipher/Rijndael.lo `test -f 'gnu/crypto/cipher/Rijndael.java' || echo '$(srcdir)/'`gnu/crypto/cipher/Rijndael.java

+gnu/crypto/cipher/Serpent.o: gnu/crypto/cipher/Serpent.java
+@AMDEP_TRUE@	source='gnu/crypto/cipher/Serpent.java' object='gnu/crypto/cipher/Serpent.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@	depfile='gnu/crypto/cipher/$(DEPDIR)/Serpent.Po' tmpdepfile='gnu/crypto/cipher/$(DEPDIR)/Serpent.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@	$(GCJDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+	$(GCJ) $(AM_GCJFLAGS) $(GCJFLAGS) -c -o gnu/crypto/cipher/Serpent.o `test -f 'gnu/crypto/cipher/Serpent.java' || echo '$(srcdir)/'`gnu/crypto/cipher/Serpent.java
+
+gnu/crypto/cipher/Serpent.obj: gnu/crypto/cipher/Serpent.java
+@AMDEP_TRUE@	source='gnu/crypto/cipher/Serpent.java' object='gnu/crypto/cipher/Serpent.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@	depfile='gnu/crypto/cipher/$(DEPDIR)/Serpent.Po' tmpdepfile='gnu/crypto/cipher/$(DEPDIR)/Serpent.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@	$(GCJDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+	$(GCJ) $(AM_GCJFLAGS) $(GCJFLAGS) -c -o gnu/crypto/cipher/Serpent.obj `cygpath -w gnu/crypto/cipher/Serpent.java`
+
+gnu/crypto/cipher/Serpent.lo: gnu/crypto/cipher/Serpent.java
+@AMDEP_TRUE@	source='gnu/crypto/cipher/Serpent.java' object='gnu/crypto/cipher/Serpent.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@	depfile='gnu/crypto/cipher/$(DEPDIR)/Serpent.Plo' tmpdepfile='gnu/crypto/cipher/$(DEPDIR)/Serpent.TPlo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@	$(GCJDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+	$(LIBTOOL) --mode=compile $(GCJ) $(AM_GCJFLAGS) $(GCJFLAGS) -c -o gnu/crypto/cipher/Serpent.lo `test -f 'gnu/crypto/cipher/Serpent.java' || echo '$(srcdir)/'`gnu/crypto/cipher/Serpent.java
+
 gnu/crypto/cipher/Square.o: gnu/crypto/cipher/Square.java
 @AMDEP_TRUE@	source='gnu/crypto/cipher/Square.java' object='gnu/crypto/cipher/Square.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@	depfile='gnu/crypto/cipher/$(DEPDIR)/Square.Po' tmpdepfile='gnu/crypto/cipher/$(DEPDIR)/Square.TPo' @AMDEPBACKSLASH@
diff -Naurw crypto/source/gnu/crypto/Registry.java crypto.1/source/gnu/crypto/Registry.java
--- crypto/source/gnu/crypto/Registry.java	Fri Jan 11 13:58:27 2002
+++ crypto.1/source/gnu/crypto/Registry.java	Tue Jun  4 16:24:53 2002
@@ -45,6 +45,7 @@
    String ANUBIS_CIPHER =   "anubis";
    String KHAZAD_CIPHER =   "khazad";
    String RIJNDAEL_CIPHER = "rijndael";
+   String SERPENT_CIPHER =  "serpent";
    String SQUARE_CIPHER =   "square";
    String TWOFISH_CIPHER =  "twofish";
    String NULL_CIPHER =     "null";
diff -Naurw crypto/source/gnu/crypto/cipher/CipherFactory.java crypto.1/source/gnu/crypto/cipher/CipherFactory.java
--- crypto/source/gnu/crypto/cipher/CipherFactory.java	Fri Jan 11 13:57:28 2002
+++ crypto.1/source/gnu/crypto/cipher/CipherFactory.java	Tue Jun  4 16:18:25 2002
@@ -82,6 +82,8 @@
       } else if (name.equalsIgnoreCase(RIJNDAEL_CIPHER)
               || name.equalsIgnoreCase(AES_CIPHER)) {
          result = new Rijndael();
+      } else if (name.equalsIgnoreCase(SERPENT_CIPHER)) {
+         result = new Serpent();
       } else if (name.equalsIgnoreCase(SQUARE_CIPHER)) {
          result = new Square();
       } else if (name.equalsIgnoreCase(TWOFISH_CIPHER)) {
@@ -108,6 +110,7 @@
       hs.add(ANUBIS_CIPHER);
       hs.add(KHAZAD_CIPHER);
       hs.add(RIJNDAEL_CIPHER);
+      hs.add(SERPENT_CIPHER);
       hs.add(SQUARE_CIPHER);
       hs.add(TWOFISH_CIPHER);
       hs.add(NULL_CIPHER);
diff -Naurw crypto/source/gnu/crypto/cipher/Serpent.java crypto.1/source/gnu/crypto/cipher/Serpent.java
--- crypto/source/gnu/crypto/cipher/Serpent.java	Wed Dec 31 16:00:00 1969
+++ crypto.1/source/gnu/crypto/cipher/Serpent.java	Tue Jun  4 14:21:54 2002
@@ -0,0 +1,740 @@
+package gnu.crypto.cipher;
+
+// ----------------------------------------------------------------------------
+// $Id: 2002-June.txt,v 1.1 2002/10/27 09:40:41 raif Exp $
+//
+// Copyright (C) 2001 Free Software Foundation, Inc.
+//
+// This program 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 of the License or (at your option) any
+// later version.
+//
+// This program 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.,
+//    59 Temple Place - Suite 330,
+//    Boston, MA 02111-1307
+//    USA
+//
+// As a special exception, if you link this library with other files to produce
+// an executable, this library does not by itself cause the resulting
+// executable to be covered by the GNU General Public License.  This exception
+// does not however invalidate any other reasons why the executable file might
+// be covered by the GNU General Public License.
+// ----------------------------------------------------------------------------
+
+import gnu.crypto.Registry;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.security.InvalidKeyException;
+
+/**
+ * Serpent is a 32-round substitution-permutation network block cipher,
+ * operating on 128-bit blocks and accepting keys of 128, 192, and 256
+ * bits in length. At each round the plaintext is XORed with a 128 bit
+ * portion of the session key -- a 4224 bit key computed from the input
+ * key -- then one of eight S-boxes are applied, and finally a simple
+ * linear transformation is done. Decryption does the exact same thing
+ * in reverse order, and using the eight inverses of the S-boxes.
+ * <p>
+ * Serpent was designed by Ross Anderson, Eli Biham, and Lars Knudsen as
+ * a proposed cipher for the Advanced Encryption Standard.
+ * <p>
+ * Reference: <a
+ * href="http://www.cl.cam.ac.uk/~rja14/serpent.html">Serpent: A
+ * Candidate Block Cipher for the Advanced Encryption Standard.</a>
+ * <p>
+ * Serpent can be sped up greatly by replacing S-box substitution with a
+ * sequence of binary operations, and the optimal implementation depends
+ * upon finding the fastest sequence of binary operations that reproduce
+ * this substitution. This implementation uses the S-boxes discovered by
+ * <a href="http://www.ii.uib.no/~osvik/">Dag Arne Osvik</a>, which are
+ * optimized for the Pentium family of processors.
+ *
+ * @version $Revision: 1.1 $
+ */
+public class Serpent extends BaseCipher {
+
+ // Constants and variables
+   // -----------------------------------------------------------------
+
+   private static final String NAME = "serpent";
+
+   private static final int DEFAULT_KEY_SIZE = 32;
+   private static final int DEFAULT_BLOCK_SIZE = 16;
+   private static final int ROUNDS = 32;
+
+   /** The fractional part of the golden ratio, (sqrt(5)+1)/2. */
+   private static final int PHI = 0x9e3779b9;
+
+   // Constructors
+   // -----------------------------------------------------------------
+
+   /** Trivial zero-argument constructor. */
+   public Serpent() {
+      super(Registry.SERPENT_CIPHER, DEFAULT_BLOCK_SIZE, DEFAULT_KEY_SIZE);
+   }
+
+   // Implementation of the Cloneable interface
+   // -----------------------------------------------------------------
+
+   public Object clone() {
+      return new Serpent();
+   }
+
+ // Implementations of abstract methods from BaseCipher
+   // -----------------------------------------------------------------
+
+   public Iterator blockSizes() {
+      return Collections.singleton(new Integer(DEFAULT_BLOCK_SIZE)).iterator();
+   }
+
+   public Iterator keySizes() {
+      return new Iterator() {
+         int i = 0;
+         // Support 128, 192, and 256 bit keys.
+         Integer[] keySizes = {
+            new Integer(16), new Integer(24), new Integer(32)
+         };
+
+         public boolean hasNext() {
+            return i < keySizes.length;
+         }
+
+         public Object next() {
+            if (hasNext()) {
+               return keySizes[i++];
+            }
+            return null;
+         }
+
+         public void remove() {
+            throw new UnsupportedOperationException();
+         }
+      };
+   }
+
+   public Object
+   makeKey(byte[] key, int blockSize) throws InvalidKeyException {
+      // Not strictly true, but here to conform with the AES proposal.
+      // This restriction can be removed if deemed necessary.
+      if (key.length != 16 && key.length != 24 && key.length != 32) {
+         throw new InvalidKeyException("Key length is not 16, 24, or 32 bytes");
+      }
+
+      // Here w is our "pre-key".
+      int[] w = new int[4*(ROUNDS+1)];
+      int i, j;
+      for (i = 0, j = key.length-4; i < 8 && j >= 0; i++) {
+         w[i] = (key[j  ] & 0xff) << 24 | (key[j+1] & 0xff) << 16 |
+                (key[j+2] & 0xff) << 8  | (key[j+3] & 0xff);
+         j -= 4;
+      }
+      // Pad key if < 256 bits.
+      if (i != 8) {
+         w[i] = 1;
+      }
+      // Transform using w_i-8 ... w_i-1
+      for (i = 8; i < 16; i++) {
+         int t = w[i-8] ^ w[i-5] ^ w[i-3] ^ w[i-1] ^ PHI ^ (i-8);
+         w[i] = t << 11 | t >>> 21;
+      }
+      // Translate by 8.
+      for (i = 0; i < 8; i++) {
+         w[i] = w[i+8];
+      }
+      // Transform the rest of the key.
+      for (i = 8; i < w.length; i++) {
+         int t = w[i-8] ^ w[i-5] ^ w[i-3] ^ w[i-1] ^ PHI ^ i;
+         w[i] = t << 11 | t >>> 21;
+      }
+
+      // After these s-boxes the pre-key (w, above) will become the
+      // session key (w, below).
+      sbox3(w[  0], w[  1], w[  2], w[  3], w,   0);
+      sbox2(w[  4], w[  5], w[  6], w[  7], w,   4);
+      sbox1(w[  8], w[  9], w[ 10], w[ 11], w,   8);
+      sbox0(w[ 12], w[ 13], w[ 14], w[ 15], w,  12);
+      sbox7(w[ 16], w[ 17], w[ 18], w[ 19], w,  16);
+      sbox6(w[ 20], w[ 21], w[ 22], w[ 23], w,  20);
+      sbox5(w[ 24], w[ 25], w[ 26], w[ 27], w,  24);
+      sbox4(w[ 28], w[ 29], w[ 30], w[ 31], w,  28);
+      sbox3(w[ 32], w[ 33], w[ 34], w[ 35], w,  32);
+      sbox2(w[ 36], w[ 37], w[ 38], w[ 39], w,  36);
+      sbox1(w[ 40], w[ 41], w[ 42], w[ 43], w,  40);
+      sbox0(w[ 44], w[ 45], w[ 46], w[ 47], w,  44);
+      sbox7(w[ 48], w[ 49], w[ 50], w[ 51], w,  48);
+      sbox6(w[ 52], w[ 53], w[ 54], w[ 55], w,  52);
+      sbox5(w[ 56], w[ 57], w[ 58], w[ 59], w,  56);
+      sbox4(w[ 60], w[ 61], w[ 62], w[ 63], w,  60);
+      sbox3(w[ 64], w[ 65], w[ 66], w[ 67], w,  64);
+      sbox2(w[ 68], w[ 69], w[ 70], w[ 71], w,  68);
+      sbox1(w[ 72], w[ 73], w[ 74], w[ 75], w,  72);
+      sbox0(w[ 76], w[ 77], w[ 78], w[ 79], w,  76);
+      sbox7(w[ 80], w[ 81], w[ 82], w[ 83], w,  80);
+      sbox6(w[ 84], w[ 85], w[ 86], w[ 87], w,  84);
+      sbox5(w[ 88], w[ 89], w[ 90], w[ 91], w,  88);
+      sbox4(w[ 92], w[ 93], w[ 94], w[ 95], w,  92);
+      sbox3(w[ 96], w[ 97], w[ 98], w[ 99], w,  96);
+      sbox2(w[100], w[101], w[102], w[103], w, 100);
+      sbox1(w[104], w[105], w[106], w[107], w, 104);
+      sbox0(w[108], w[109], w[110], w[111], w, 108);
+      sbox7(w[112], w[113], w[114], w[115], w, 112);
+      sbox6(w[116], w[117], w[118], w[119], w, 116);
+      sbox5(w[120], w[121], w[122], w[123], w, 120);
+      sbox4(w[124], w[125], w[126], w[127], w, 124);
+      sbox3(w[128], w[129], w[130], w[131], w, 128);
+
+      return w;
+   }
+
+   public
+   void encrypt(byte[] in, int i, byte[] out, int o, Object K, int bs) {
+      int[] key = (int[]) K;
+      int[] x = new int[4];
+      x[3] = (in[i++] & 0xff) << 24 | (in[i++] & 0xff) << 16 |
+             (in[i++] & 0xff) <<  8 | (in[i++] & 0xff);
+      x[2] = (in[i++] & 0xff) << 24 | (in[i++] & 0xff) << 16 |
+             (in[i++] & 0xff) <<  8 | (in[i++] & 0xff);
+      x[1] = (in[i++] & 0xff) << 24 | (in[i++] & 0xff) << 16 |
+             (in[i++] & 0xff) <<  8 | (in[i++] & 0xff);
+      x[0] = (in[i++] & 0xff) << 24 | (in[i++] & 0xff) << 16 |
+             (in[i++] & 0xff) <<  8 | (in[i++] & 0xff);
+
+      sbox0(key[  0]^x[0], key[  1]^x[1], key[  2]^x[2], key[  3]^x[3], x, 0);
+      transform(x);
+      sbox1(key[  4]^x[0], key[  5]^x[1], key[  6]^x[2], key[  7]^x[3], x, 0);
+      transform(x);
+      sbox2(key[  8]^x[0], key[  9]^x[1], key[ 10]^x[2], key[ 11]^x[3], x, 0);
+      transform(x);
+      sbox3(key[ 12]^x[0], key[ 13]^x[1], key[ 14]^x[2], key[ 15]^x[3], x, 0);
+      transform(x);
+      sbox4(key[ 16]^x[0], key[ 17]^x[1], key[ 18]^x[2], key[ 19]^x[3], x, 0);
+      transform(x);
+      sbox5(key[ 20]^x[0], key[ 21]^x[1], key[ 22]^x[2], key[ 23]^x[3], x, 0);
+      transform(x);
+      sbox6(key[ 24]^x[0], key[ 25]^x[1], key[ 26]^x[2], key[ 27]^x[3], x, 0);
+      transform(x);
+      sbox7(key[ 28]^x[0], key[ 29]^x[1], key[ 30]^x[2], key[ 31]^x[3], x, 0);
+      transform(x);
+      sbox0(key[ 32]^x[0], key[ 33]^x[1], key[ 34]^x[2], key[ 35]^x[3], x, 0);
+      transform(x);
+      sbox1(key[ 36]^x[0], key[ 37]^x[1], key[ 38]^x[2], key[ 39]^x[3], x, 0);
+      transform(x);
+      sbox2(key[ 40]^x[0], key[ 41]^x[1], key[ 42]^x[2], key[ 43]^x[3], x, 0);
+      transform(x);
+      sbox3(key[ 44]^x[0], key[ 45]^x[1], key[ 46]^x[2], key[ 47]^x[3], x, 0);
+      transform(x);
+      sbox4(key[ 48]^x[0], key[ 49]^x[1], key[ 50]^x[2], key[ 51]^x[3], x, 0);
+      transform(x);
+      sbox5(key[ 52]^x[0], key[ 53]^x[1], key[ 54]^x[2], key[ 55]^x[3], x, 0);
+      transform(x);
+      sbox6(key[ 56]^x[0], key[ 57]^x[1], key[ 58]^x[2], key[ 59]^x[3], x, 0);
+      transform(x);
+      sbox7(key[ 60]^x[0], key[ 61]^x[1], key[ 62]^x[2], key[ 63]^x[3], x, 0);
+      transform(x);
+      sbox0(key[ 64]^x[0], key[ 65]^x[1], key[ 66]^x[2], key[ 67]^x[3], x, 0);
+      transform(x);
+      sbox1(key[ 68]^x[0], key[ 69]^x[1], key[ 70]^x[2], key[ 71]^x[3], x, 0);
+      transform(x);
+      sbox2(key[ 72]^x[0], key[ 73]^x[1], key[ 74]^x[2], key[ 75]^x[3], x, 0);
+      transform(x);
+      sbox3(key[ 76]^x[0], key[ 77]^x[1], key[ 78]^x[2], key[ 79]^x[3], x, 0);
+      transform(x);
+      sbox4(key[ 80]^x[0], key[ 81]^x[1], key[ 82]^x[2], key[ 83]^x[3], x, 0);
+      transform(x);
+      sbox5(key[ 84]^x[0], key[ 85]^x[1], key[ 86]^x[2], key[ 87]^x[3], x, 0);
+      transform(x);
+      sbox6(key[ 88]^x[0], key[ 89]^x[1], key[ 90]^x[2], key[ 91]^x[3], x, 0);
+      transform(x);
+      sbox7(key[ 92]^x[0], key[ 93]^x[1], key[ 94]^x[2], key[ 95]^x[3], x, 0);
+      transform(x);
+      sbox0(key[ 96]^x[0], key[ 97]^x[1], key[ 98]^x[2], key[ 99]^x[3], x, 0);
+      transform(x);
+      sbox1(key[100]^x[0], key[101]^x[1], key[102]^x[2], key[103]^x[3], x, 0);
+      transform(x);
+      sbox2(key[104]^x[0], key[105]^x[1], key[106]^x[2], key[107]^x[3], x, 0);
+      transform(x);
+      sbox3(key[108]^x[0], key[109]^x[1], key[110]^x[2], key[111]^x[3], x, 0);
+      transform(x);
+      sbox4(key[112]^x[0], key[113]^x[1], key[114]^x[2], key[115]^x[3], x, 0);
+      transform(x);
+      sbox5(key[116]^x[0], key[117]^x[1], key[118]^x[2], key[119]^x[3], x, 0);
+      transform(x);
+      sbox6(key[120]^x[0], key[121]^x[1], key[122]^x[2], key[123]^x[3], x, 0);
+      transform(x);
+      sbox7(key[124]^x[0], key[125]^x[1], key[126]^x[2], key[127]^x[3], x, 0);
+
+      x[0] ^= key[128];
+      x[1] ^= key[129];
+      x[2] ^= key[130];
+      x[3] ^= key[131];
+
+      for (int j = x.length-1; j >= 0; j--) {
+         out[o++] = (byte) (x[j] >>> 24);
+         out[o++] = (byte) (x[j] >>> 16);
+         out[o++] = (byte) (x[j] >>>  8);
+         out[o++] = (byte)  x[j];
+      }
+   }
+
+   public
+   void decrypt(byte[] in, int i, byte[] out, int o, Object K, int bs) {
+      int[] key = (int[]) K;
+      int[] x = new int[4];
+      x[3] = (in[i++] & 0xff) << 24 | (in[i++] & 0xff) << 16 |
+             (in[i++] & 0xff) <<  8 | (in[i++] & 0xff);
+      x[2] = (in[i++] & 0xff) << 24 | (in[i++] & 0xff) << 16 |
+             (in[i++] & 0xff) <<  8 | (in[i++] & 0xff);
+      x[1] = (in[i++] & 0xff) << 24 | (in[i++] & 0xff) << 16 |
+             (in[i++] & 0xff) <<  8 | (in[i++] & 0xff);
+      x[0] = (in[i++] & 0xff) << 24 | (in[i++] & 0xff) << 16 |
+             (in[i++] & 0xff) <<  8 | (in[i++] & 0xff);
+
+      sboxI7(key[128]^x[0], key[129]^x[1], key[130]^x[2], key[131]^x[3], x, 0);
+      transformInv(x, key, 124);
+      sboxI6(x[0], x[1], x[2], x[3], x, 0);
+      transformInv(x, key, 120);
+      sboxI5(x[0], x[1], x[2], x[3], x, 0);
+      transformInv(x, key, 116);
+      sboxI4(x[0], x[1], x[2], x[3], x, 0);
+      transformInv(x, key, 112);
+      sboxI3(x[0], x[1], x[2], x[3], x, 0);
+      transformInv(x, key, 108);
+      sboxI2(x[0], x[1], x[2], x[3], x, 0);
+      transformInv(x, key, 104);
+      sboxI1(x[0], x[1], x[2], x[3], x, 0);
+      transformInv(x, key, 100);
+      sboxI0(x[0], x[1], x[2], x[3], x, 0);
+      transformInv(x, key,  96);
+      sboxI7(x[0], x[1], x[2], x[3], x, 0);
+      transformInv(x, key,  92);
+      sboxI6(x[0], x[1], x[2], x[3], x, 0);
+      transformInv(x, key,  88);
+      sboxI5(x[0], x[1], x[2], x[3], x, 0);
+      transformInv(x, key,  84);
+      sboxI4(x[0], x[1], x[2], x[3], x, 0);
+      transformInv(x, key,  80);
+      sboxI3(x[0], x[1], x[2], x[3], x, 0);
+      transformInv(x, key,  76);
+      sboxI2(x[0], x[1], x[2], x[3], x, 0);
+      transformInv(x, key,  72);
+      sboxI1(x[0], x[1], x[2], x[3], x, 0);
+      transformInv(x, key,  68);
+      sboxI0(x[0], x[1], x[2], x[3], x, 0);
+      transformInv(x, key,  64);
+      sboxI7(x[0], x[1], x[2], x[3], x, 0);
+      transformInv(x, key,  60);
+      sboxI6(x[0], x[1], x[2], x[3], x, 0);
+      transformInv(x, key,  56);
+      sboxI5(x[0], x[1], x[2], x[3], x, 0);
+      transformInv(x, key,  52);
+      sboxI4(x[0], x[1], x[2], x[3], x, 0);
+      transformInv(x, key,  48);
+      sboxI3(x[0], x[1], x[2], x[3], x, 0);
+      transformInv(x, key,  44);
+      sboxI2(x[0], x[1], x[2], x[3], x, 0);
+      transformInv(x, key,  40);
+      sboxI1(x[0], x[1], x[2], x[3], x, 0);
+      transformInv(x, key,  36);
+      sboxI0(x[0], x[1], x[2], x[3], x, 0);
+      transformInv(x, key,  32);
+      sboxI7(x[0], x[1], x[2], x[3], x, 0);
+      transformInv(x, key,  28);
+      sboxI6(x[0], x[1], x[2], x[3], x, 0);
+      transformInv(x, key,  24);
+      sboxI5(x[0], x[1], x[2], x[3], x, 0);
+      transformInv(x, key,  20);
+      sboxI4(x[0], x[1], x[2], x[3], x, 0);
+      transformInv(x, key,  16);
+      sboxI3(x[0], x[1], x[2], x[3], x, 0);
+      transformInv(x, key,  12);
+      sboxI2(x[0], x[1], x[2], x[3], x, 0);
+      transformInv(x, key,   8);
+      sboxI1(x[0], x[1], x[2], x[3], x, 0);
+      transformInv(x, key,   4);
+      sboxI0(x[0], x[1], x[2], x[3], x, 0);
+
+      x[0] ^= key[0];
+      x[1] ^= key[1];
+      x[2] ^= key[2];
+      x[3] ^= key[3];
+
+      for (int j = x.length-1; j >= 0; j--) {
+         out[o++] = (byte) (x[j] >>> 24);
+         out[o++] = (byte) (x[j] >>> 16);
+         out[o++] = (byte) (x[j] >>>  8);
+         out[o++] = (byte)  x[j];
+      }
+   }
+
+ // Own methods
+   // -----------------------------------------------------------------
+
+   /** Serpent's linear transformation. */
+   private void transform(int[] x) {
+      x[0] = x[0] << 13 | x[0] >>> 19;
+      x[2] = x[2] << 3 | x[2] >>> 29;
+      x[1] = x[1] ^ x[0] ^ x[2];
+      x[3] = x[3] ^ x[2] ^ (x[0] << 3);
+      x[1] = x[1] << 1 | x[1] >>> 31;
+      x[3] = x[3] << 7 | x[3] >>> 25;
+      x[0] = x[0] ^ x[1] ^ x[3];
+      x[2] = x[2] ^ x[3] ^ (x[1] << 7);
+      x[0] = x[0] << 5 | x[0] >>> 27;
+      x[2] = x[2] << 22 | x[2] >>> 10;
+   }
+
+   /**
+    * The inverse linear transformation. The XOR with the key is done
+    * here to save space above.
+    *
+    * @param x The current block being decrypted.
+    * @param key The session key.
+    * @param off The index in the key to start from.
+    */
+   private void transformInv(int[] x, int[] key, int off) {
+      x[0] ^= key[off++];
+      x[1] ^= key[off++];
+      x[2] ^= key[off++];
+      x[3] ^= key[off++];
+
+      x[2] = x[2] >>> 22 | x[2] << 10;
+      x[0] = x[0] >>> 5 | x[0] << 27;
+      x[2] = x[2] ^ x[3] ^ (x[1] << 7);
+      x[0] = x[0] ^ x[1] ^ x[3];
+      x[3] = x[3] >>> 7 | x[3] << 25;
+      x[1] = x[1] >>> 1 | x[1] << 31;
+      x[3] = x[3] ^ x[2] ^ (x[0] << 3);
+      x[1] = x[1] ^ x[0] ^ x[2];
+      x[2] = x[2] >>> 3 | x[2] << 29;
+      x[0] = x[0] >>> 13 | x[0] << 19;
+   }
+
+   // Bit-flip madness methods
+   //
+   // The following S-Box functions were developed by Dag Arne Osvik,
+   // and are described in his paper, "Speeding up Serpent". They are
+   // optimized to perform on the Pentium chips, but work well here too.
+   //
+   // The methods below are Copyright (C) 2000 Dag Arne Osvik.
+
+   // These methods may be de-assembler-ized (more than one operation in
+   // each statement) for readability (?) and speed (??).
+
+   /** S-Box 0. */
+   private void sbox0(int r0, int r1, int r2, int r3, int[] w, int off) {
+      int r4 = r1 ^ r2;
+      r3 ^= r0;
+      r1 = r1 & r3 ^ r0;
+      r0 = (r0 | r3) ^ r4;
+      r4 ^= r3;
+      r3 ^= r2;
+      r2 = (r2 | r1) ^ r4;
+      r4 = ~r4 | r1;
+      r1 ^= r3 ^ r4;
+      r3 |= r0;
+      w[off  ] = r1 ^ r3;
+      w[off+1] = r4 ^ r3;
+      w[off+2] = r2;
+      w[off+3] = r0;
+   }
+
+   /** The inverse of S-Box 0. */
+   private void sboxI0(int r0, int r1, int r2, int r3, int[] w, int off) {
+      int r4 = r1;
+      r2 = ~r2;
+      r1 = (r1 | r0) ^ r2;
+      r4 = ~r4;
+      r2 |= r4;
+      r1 ^= r3;
+      r0 ^= r4;
+      r2 ^= r0;
+      r0 &= r3;
+      r4 ^= r0;
+      r0 = (r0 | r1) ^ r2;
+      r3 = r3 ^ r4 ^ r0 ^ r1;
+      r2 = (r2 ^ r1) & r3;
+      w[off  ] = r0;
+      w[off+1] = r4 ^ r2;
+      w[off+2] = r1;
+      w[off+3] = r3;
+   }
+
+   /** S-Box 1. */
+   private void sbox1(int r0, int r1, int r2, int r3, int[] w, int off) {
+      r0 = ~r0;
+      int r4 = r0;
+      r2 = ~r2;
+      r0 &= r1;
+      r2 ^= r0;
+      r0 |= r3;
+      r3 ^= r2;
+      r1 ^= r0;
+      r0 ^= r4;
+      r4 |= r1;
+      r1 ^= r3;
+      r2 = (r2 | r0) & r4;
+      r0 ^= r1;
+      w[off  ] = r2;
+      w[off+1] = r0 & r2 ^ r4;
+      w[off+2] = r3;
+      w[off+3] = r1 & r2 ^ r0;
+   }
+
+   /** The inverse of S-Box 1. */
+   private void sboxI1(int r0, int r1, int r2, int r3, int[] w, int off) {
+      int r4 = r1;
+      r1 ^= r3;
+      r3 = r3 & r1 ^ r0;
+      r4 ^= r2;
+      r2 ^= r3;
+      r0 = (r0 | r1) ^ r4 | r2;
+      r1 ^= r3;
+      r0 ^= r1;
+      r1 = (r1 | r3) ^ r0;
+      r4 = ~r4 ^ r1;
+      w[off  ] = r4;
+      w[off+1] = r0;
+      w[off+2] = r3 ^ ((r1 | r0) ^ r0 | r4);
+      w[off+3] = r2;
+   }
+
+   /** S-Box 2. */
+   private void sbox2(int r0, int r1, int r2, int r3, int[] w, int off) {
+      int r4 = r0;
+      r0 = r0 & r2 ^ r3;
+      r2 = r2 ^ r1 ^ r0;
+      r3 = (r3 | r4) ^ r1;
+      r4 ^= r2;
+      r1 = r3;
+      r3 = (r3 | r4) ^ r0;
+      r0 &= r1;
+      r4 ^= r0;
+      w[off  ] = r2;
+      w[off+1] = r3;
+      w[off+2] = r1 ^ r3 ^ r4;
+      w[off+3] = ~r4;
+   }
+
+   /** The inverse of S-Box 2. */
+   private void sboxI2(int r0, int r1, int r2, int r3, int[] w, int off) {
+      r2 ^= r3;
+      r3 ^= r0;
+      int r4 = r3;
+      r3 = r3 & r2 ^ r1;
+      r1 = (r1 | r2) ^ r4;
+      r4 &= r3;
+      r2 ^= r3;
+      r4 = r4 & r0 ^ r2;
+      r3 = ~r3;
+      r2 = (r2 & r1 | r0) ^ r3;
+      r0 = (r0 ^ r3) & r1;
+      w[off  ] = r1;
+      w[off+1] = r4;
+      w[off+2] = r2;
+      w[off+3] = r3 ^ r4 ^ r0;
+   }
+
+   /** S-Box 3. */
+   private void sbox3(int r0, int r1, int r2, int r3, int[] w, int off) {
+      int r4 = r0;
+      r0 |= r3;
+      r3 ^= r1;
+      r1 &= r4;
+      r4 = r4 ^ r2 | r1;
+      r2 ^= r3;
+      r3 = r3 & r0 ^ r4;
+      r0 ^= r1;
+      r4 = r4 & r0 ^ r2;
+      r1 = (r1 ^ r3 | r0) ^ r2;
+      r0 ^= r3;
+      w[off  ] = (r1 | r3) ^ r0;
+      w[off+1] = r1;
+      w[off+2] = r3;
+      w[off+3] = r4;
+   }
+
+   /** Inverse of S-Box 3. */
+   private void sboxI3(int r0, int r1, int r2, int r3, int[] w, int off) {
+      int r4 = r2;
+      r2 ^= r1;
+      r0 ^= r2;
+      r4 = r4 & r2 ^ r0;
+      r0 &= r1;
+      r1 ^= r3;
+      r3 |= r4;
+      r2 ^= r3;
+      r0 ^= r3;
+      r1 ^= r4;
+      r3 = r3 & r2 ^ r1;
+      r1 = (r1 ^ r0 | r2) ^ r4;
+      w[off  ] = r2;
+      w[off+1] = r1;
+      w[off+2] = r3;
+      w[off+3] = r0 ^ r3 ^ r1;
+   }
+
+   /** S-Box 4. */
+   private void sbox4(int r0, int r1, int r2, int r3, int[] w, int off) {
+      r1 ^= r3;
+      int r4 = r1;
+      r3 = ~r3;
+      r2 ^= r3;
+      r3 ^= r0;
+      r1 = r1 & r3 ^ r2;
+      r4 ^= r3;
+      r0 ^= r4;
+      r2 = r2 & r4 ^ r0;
+      r0 &= r1;
+      r3 ^= r0;
+      r4 = (r4 | r1) ^ r0;
+      w[off  ] = r1;
+      w[off+1] = r4 ^ (r2 & r3);
+      w[off+2] = ~((r0 | r3) ^ r2);
+      w[off+3] = r3;
+   }
+
+   /** Inverse of S-Box 4. */
+   private void sboxI4(int r0, int r1, int r2, int r3, int[] w, int off) {
+      int r4 = r2;
+      r2 = r2 & r3 ^ r1;
+      r1 = (r1 | r3) & r0;
+      r4 = r4 ^ r2 ^ r1;
+      r1 &= r2;
+      r0 = ~r0;
+      r3 ^= r4;
+      r1 ^= r3;
+      r3 = r3 & r0 ^ r2;
+      r0 ^= r1;
+      r3 ^= r0;
+      w[off  ] = r0;
+      w[off+1] = r3 ^ r0;
+      w[off+2] = (r2 & r0 ^ r4 | r3) ^ r1;
+      w[off+3] = r4;
+   }
+
+   /** S-Box 5. */
+   private void sbox5(int r0, int r1, int r2, int r3, int[] w, int off) {
+      r0 ^= r1;
+      r1 ^= r3;
+      int r4 = r1;
+      r3 = ~r3;
+      r1 &= r0;
+      r2 ^= r3;
+      r1 ^= r2;
+      r2 |= r4;
+      r4 ^= r3;
+      r3 = r3 & r1 ^ r0;
+      r4 = r4 ^ r1 ^ r2;
+      w[off  ] = r1;
+      w[off+1] = r3;
+      w[off+2] = r0 & r3 ^ r4;
+      w[off+3] = ~(r2 ^ r0) ^ (r4 | r3);
+   }
+
+   /** Inverse of S-Box 5. */
+   private void sboxI5(int r0, int r1, int r2, int r3, int[] w, int off) {
+      int r4 = r3;
+      r1 = ~r1;
+      r2 ^= r1;
+      r3 = (r3 | r0) ^ r2;
+      r4 ^= r3;
+      r2 = (r2 | r1) & r0 ^ r4;
+      r4 = (r4 | r0) ^ r1 ^ r2;
+      r1 = r1 & r2 ^ r3;
+      r3 &= r4;
+      r4 ^= r1;
+      w[off  ] = r1;
+      w[off+1] = ~r4;
+      w[off+2] = r3 ^ r4 ^ r0;
+      w[off+3] = r2;
+   }
+
+   /** S-Box 6. */
+   private void sbox6(int r0, int r1, int r2, int r3, int[] w, int off) {
+      int r4 = r3;
+      r2 = ~r2;
+      r3 = r3 & r0 ^ r2;
+      r0 ^= r4;
+      r2 = (r2 | r4) ^ r0;
+      r1 ^= r3;
+      r0 |= r1;
+      r2 ^= r1;
+      r4 ^= r0;
+      r0 = (r0 | r3) ^ r2;
+      r4 = r4 ^ r3 ^ r0;
+      w[off  ] = r0;
+      w[off+1] = r1;
+      w[off+2] = r4;
+      w[off+3] = r2 & r4 ^ ~r3;
+   }
+
+   /** Inverse of S-Box 6. */
+   private void sboxI6(int r0, int r1, int r2, int r3, int[] w, int off) {
+      int r4 = r2;
+      r0 ^= r2;
+      r2 &= r0;
+      r4 ^= r3;
+      r3 ^= r1;
+      r2 = ~r2 ^ r3;
+      r4 |= r0;
+      r0 ^= r2;
+      r3 ^= r4;
+      r4 ^= r1;
+      r1 = r1 & r3 ^ r0;
+      r0 = r0 ^ r3 | r2;
+      w[off  ] = r1;
+      w[off+1] = r2;
+      w[off+2] = r4 ^ r0;
+      w[off+3] = r3 ^ r1;
+   }
+
+   /** S-Box 7. */
+   private void sbox7(int r0, int r1, int r2, int r3, int[] w, int off) {
+      int r4 = r1;
+      r1 = (r1 | r2) ^ r3;
+      r4 ^= r2;
+      r2 ^= r1;
+      r3 = (r3 | r4) & r0;
+      r4 ^= r2;
+      r3 ^= r1;
+      r1 = (r1 | r4) ^ r0;
+      r0 = (r0 | r4) ^ r2;
+      r1 ^= r4;
+      r2 ^= r1;
+      w[off  ] = r4 ^ (~r2 | r0);
+      w[off+1] = r3;
+      w[off+2] = r1 & r0 ^ r4;
+      w[off+3] = r0;
+   }
+
+   /** Inverse of S-Box 7. */
+   private void sboxI7(int r0, int r1, int r2, int r3, int[] w, int off) {
+      int r4 = r2;
+      r2 = ~(r2 ^ r0);
+      r0 &= r3;
+      r4 |= r3;
+      r3 ^= r1;
+      r1 |= r0;
+      r0 ^= r2;
+      r2 &= r4;
+      r3 &= r4;
+      r1 ^= r2;
+      r2 ^= r0;
+      r0 = (r0 | r2) ^ r3;
+      r4 ^= r1;
+      w[off  ] = r3 ^ r4 ^ r2;
+      w[off+1] = r0;
+      w[off+2] = r1;
+      w[off+3] = (r4 | r0) ^ r2;
+   }
+}



From raif@fl.net.au  Thu Jun  6 12:10:34 2002
From: raif@fl.net.au (Raif S. Naffah)
Date: Thu, 6 Jun 2002 21:10:34 +1000
Subject: [Classpathx-crypto] [patch] Serpent cipher
References: <Pine.LNX.4.44L0.0206041655440.11817-100000@gradius.dreamhost.com>
Message-ID: <00e501c20d4a$c8750b50$5b02b5ca@solomon>

hello Casey,

----- Original Message -----
From: "Casey Marshall" <mstatic@metastatic.org>
To: <classpathx-crypto@gnu.org>
Sent: Wednesday, June 05, 2002 10:15 AM
Subject: [Classpathx-crypto] [patch] Serpent cipher


> Hello,
>
> I've been doing some studying in cryptography, came across GNU classpathx,
> and have been working on implementing some ciphers using the crypto API.
>
> The patch which follows (which is longish, but I didn't want to do an
> attachment---please admonish if this is poor etiquette) is an
> implementation of Serpent which appears correct in a few tests. It does
> not, as far as I know, refer to any non-free techniques---is uses some
> optimized S-box functions found by Dag Arne Osvik which are implemented
> in a GPL'd ADA implementation from
http://www.ii.uib.no/~gisle/serpent.html.

thanks a bunch for your contribution :-)

we dont have an established etiquette for contributions in this project,
besides the coding style :-) but i'm sure we'll come up with something
intelligent as we go.


> The patch is based on a recent CVS checkout and updates the gcj
> Makefile.{in,am}, the classes Registry and CipherFactory, and adds the
> Serpent class itself. Classpathx is welcome to use it...

i'll add the patches during this weekend, along with some classes and
algorithms i've been working on (HMAC, UMAC, etc...).


btw, do you have (access to) the test vectors for Serpent?  we should have a
junit test case to exercise and produce/compare some of the test vectors for
every algorithm so as to certify correctness (e.g.
source/test/cipher/TestOfSquare).

thanks again for your contribution + cheers;
rsn



From Casey Marshall <rsdio@metastatic.org>  Thu Jun  6 23:45:55 2002
From: Casey Marshall <rsdio@metastatic.org> (Casey Marshall)
Date: Thu, 6 Jun 2002 15:45:55 -0700 (PDT)
Subject: [Classpathx-crypto] [patch] Serpent cipher
In-Reply-To: <00e501c20d4a$c8750b50$5b02b5ca@solomon>
Message-ID: <Pine.LNX.4.44L0.0206061522510.19442-100000@gradius.dreamhost.com>

On Thu, 6 Jun 2002, Raif S. Naffah wrote:

> btw, do you have (access to) the test vectors for Serpent?  we should have a
> junit test case to exercise and produce/compare some of the test vectors for
> every algorithm so as to certify correctness (e.g.
> source/test/cipher/TestOfSquare).
>

Earlier today I generated some KAT and Monte-Carlo test vectors and
compared them to those included in the Serpent team's AES submission.
The implementation appears correct (at least, my faith in it is a bit
stronger). I'll see about putting together a test case for it, however.

Also, a question: it appears as though the library is working with the
assumption that all of its ciphers are not stateful, ie something like:

	cipher.encryptBlock(pt, 0, ct, 0);
	cipher.decryptBlock(ct, 0, cpt, 0);

will result in pt==cpt (and this is the case, I think, with all the
current cipher algorithms, as well as most others that I'm familiar with).
This isn't strictly true, for example, for ARCFOUR, whose s-boxes evolve
over time. So would stateful ciphers need to be careful about this (e.g.
keeping s-boxes for encryption and decryption), or could one assume that
this is not, in practice, the case?

(Bonus: yes, ARCFOUR is a stream cipher, so would a seperate interface
(IStreamCipher) be a solution?)

Cheers,

-- 
Casey Marshall < rsdio@metastatic.org > http://metastatic.org/




From raif@fl.net.au  Fri Jun  7 14:20:11 2002
From: raif@fl.net.au (Raif S. Naffah)
Date: Fri, 7 Jun 2002 23:20:11 +1000
Subject: [Classpathx-crypto] [patch] Serpent cipher
References: <Pine.LNX.4.44L0.0206061522510.19442-100000@gradius.dreamhost.com>
Message-ID: <001101c20e26$0e958020$3702b5ca@solomon>

hello Casey,

my comments are in-lined below.


cheers;
rsn
----- Original Message -----
From: "Casey Marshall" <mstatic@metastatic.org>
To: "Raif S. Naffah" <raif@fl.net.au>
Cc: <classpathx-crypto@gnu.org>
Sent: Friday, June 07, 2002 8:45 AM
Subject: Re: [Classpathx-crypto] [patch] Serpent cipher


> On Thu, 6 Jun 2002, Raif S. Naffah wrote:
>
> > btw, do you have (access to) the test vectors for Serpent?  we should
have a
> > junit test case to exercise and produce/compare some of the test vectors
for
> > every algorithm so as to certify correctness (e.g.
> > source/test/cipher/TestOfSquare).
> >
>
> Earlier today I generated some KAT and Monte-Carlo test vectors and
> compared them to those included in the Serpent team's AES submission.
> The implementation appears correct (at least, my faith in it is a bit
> stronger). I'll see about putting together a test case for it, however.

thanks again :-)


> Also, a question: it appears as though the library is working with the
> assumption that all of its ciphers are not stateful, ie something like:
>
> cipher.encryptBlock(pt, 0, ct, 0);
> cipher.decryptBlock(ct, 0, cpt, 0);
>
> will result in pt==cpt (and this is the case, I think, with all the
> current cipher algorithms, as well as most others that I'm familiar with).
> This isn't strictly true...

this is always true with symmetric key block ciphers.

>..., for example, for ARCFOUR, whose s-boxes evolve
> over time. So would stateful ciphers need to be careful about this (e.g.
> keeping s-boxes for encryption and decryption), or could one assume that
> this is not, in practice, the case?

the thing to clarify here is that:

a. both types of ciphers are stateful, yet
b. one type (the symmetric-key block-ciphers eg. aes, rijndael, serpent, and
all gnu.crypto.cipher classes) is invertible, while the other (not yet
implemented in gnu.crypto) is not.


> (Bonus: yes, ARCFOUR is a stream cipher, so would a seperate interface
> (IStreamCipher) be a solution?)

yes! as far as i know, it's the only solution.

for other types of stream ciphers, have a look at some newly designed stream
ciphers, submitted in the NESSIE project --see
https://www.cosic.esat.kuleuven.ac.be/nessie/workshop/submissions.html.


>
> Cheers,
>
> --
> Casey Marshall < rsdio@metastatic.org > http://metastatic.org/
>
>
>
> _______________________________________________
> Classpathx-crypto mailing list
> Classpathx-crypto@gnu.org
> http://mail.gnu.org/mailman/listinfo/classpathx-crypto
>




From Casey Marshall <rsdio@metastatic.org>  Sun Jun  9 00:36:49 2002
From: Casey Marshall <rsdio@metastatic.org> (Casey Marshall)
Date: Sat, 8 Jun 2002 16:36:49 -0700 (PDT)
Subject: [Classpathx-crypto] TestOfSerpent
Message-ID: <Pine.LNX.4.44L0.0206081552170.31164-101000@gradius.dreamhost.com>

  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

--1439763957-1167906377-1023579409=:31164
Content-Type: TEXT/PLAIN; charset=US-ASCII

As promised, attached is a pared-down version of a test suite for
Serpent. It runs all the variable-key and variable-text known-answer
tests, and the first ten of each of the monte carlo tests provided in
the Serpent team's submission. It also runs the BaseCipher's default
symmetry test.

This version comes from a test suite that tests all known-answer and all
monte carlo tests -- which seemed a bit excessive. It is available at:

	http://www.metastatic.org/src/serpent-test-full.tar.gz

It is 117 kilobytes compressed, and is slow.

I figured that this version provided a good enough compromise, and can be
trimmed even further by simply deleting answers from the bottoms of the
test arrays.

If GNU's mailing lists (or you) do not like attachments, the trimmed
version can also be found at:

	http://www.metastatic.org/src/serpent-test.tar.gz

Cheers,

-- 
Casey Marshall < rsdio@metastatic.org > http://metastatic.org/
Also: regular expressions are fun.

--1439763957-1167906377-1023579409=:31164
Content-Type: APPLICATION/octet-stream; name="serpent-test.tar.gz"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.4.44L0.0206081636490.31164@gradius.dreamhost.com>
Content-Description: TestOfSerpent
Content-Disposition: attachment; filename="serpent-test.tar.gz"

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
--1439763957-1167906377-1023579409=:31164--


From raif@fl.net.au  Sun Jun  9 01:18:21 2002
From: raif@fl.net.au (Raif S. Naffah)
Date: Sun, 09 Jun 2002 10:18:21 +1000
Subject: [Classpathx-crypto] TestOfSerpent
References: <Pine.LNX.4.44L0.0206081552170.31164-101000@gradius.dreamhost.com>
Message-ID: <3D029ECD.6060809@fl.net.au>

hello Casey,

Casey Marshall wrote:
> As promised, attached is a pared-down version of a test suite for
> Serpent. It runs all the variable-key and variable-text known-answer
> tests, and the first ten of each of the monte carlo tests provided in
> the Serpent team's submission. It also runs the BaseCipher's default
> symmetry test.

that's simply beautiful.  i think all cipher test cases should follow 
this model.

> 
> This version comes from a test suite that tests all known-answer and all
> monte carlo tests -- which seemed a bit excessive. It is available at:
> 
> 	http://www.metastatic.org/src/serpent-test-full.tar.gz
> 
> It is 117 kilobytes compressed, and is slow.

is this the inverse of the NistKAT and NistMCT (in gnu.crypto.tools) tools?

since we will be using code from these tools for the test cases, should 
we look into re-factoring that code to improve code re-usability across 
the library?


> I figured that this version provided a good enough compromise, and can be
> trimmed even further by simply deleting answers from the bottoms of the
> test arrays.
> 
> If GNU's mailing lists (or you) do not like attachments, the trimmed
> version can also be found at:
> 
> 	http://www.metastatic.org/src/serpent-test.tar.gz
> 
> Cheers,
> 




From raif@fl.net.au  Sun Jun  9 01:34:44 2002
From: raif@fl.net.au (Raif S. Naffah)
Date: Sun, 09 Jun 2002 10:34:44 +1000
Subject: [Classpathx-crypto] latest commits
References: <Pine.LNX.4.44L0.0206081552170.31164-101000@gradius.dreamhost.com>
Message-ID: <3D02A2A4.6080806@fl.net.au>

i've committed to the cvs in the last few days the following:

1. Casey Marshall's contribution of Serpent and its test case;

2. a new package gnu.crypto.mac that includes:

* HMAC implementation that allows constructing the HMAC over all 
implemented (now and in the future) hash algorithms (in gnu.crypto.hash),

* UMac32 and UHash32 as described in Krovetz & al. submission to the 
NESSIE --which is also an IETF draft,

3. OFB block cipher mode of operations as described in NIST's 
recommendations;

4. a new UMacGenerator pseudo-random number generator, described in 
Krovetz & al. paper using the AES;

5. updated the home page to reflect the new additions;

6. added Casey to the list of AUTHORS;

7. updated the GNU build-related files in the top level as well as in 
gcj/ and gcj/source --i finally was able to run aclocal, autoconf and 
automake using the cygwin distribution.  pls note that automake (on my 
cygwin installation is 1.6.1 which required me to change some of the 
files that were failing cause were relying on version 1.6a.  if this 
causes others build envs to break, then raise your hand.

8. removed some NIST MCT test cases for Anubis with key sizes > 256.

9. removed superfluous characters from some source files that were 
causing some interpreters to barf.

things remaining for the first public release are:

* an implementation of the UST (David McGrew's IETF draft),
* re-visiting of the test hierarchy and -may be- re-factoring of some 
gnu.crypto.tool classes,
* consensus on the effectiveness of both ANT and GNU build-related tools.


cheers;
rsn






From nferrier@tapsellferrier.co.uk  Sun Jun  9 15:05:36 2002
From: nferrier@tapsellferrier.co.uk (Nic Ferrier)
Date: 09 Jun 2002 15:05:36 +0100
Subject: [Classpathx-crypto] latest commits
In-Reply-To: <3D02A2A4.6080806@fl.net.au>
References: <Pine.LNX.4.44L0.0206081552170.31164-101000@gradius.dreamhost.com>
 <3D02A2A4.6080806@fl.net.au>
Message-ID: <87ofek4ken.fsf@pooh-sticks-bridge.tapsellferrier.co.uk>

"Raif S. Naffah" <raif@fl.net.au> writes:

> 7. updated the GNU build-related files in the top level as well as in  
> gcj/ and gcj/source --i finally was able to run aclocal, autoconf and  
> automake using the cygwin distribution.  pls note that automake (on my  
> cygwin installation is 1.6.1 which required me to change some of the  
> files that were failing cause were relying on version 1.6a.  if this  
> causes others build envs to break, then raise your hand. 

Did you look at the automakejar stuff? It has been recieved with
enthusiasm on other GNU java projects and hopefully will become
something of a standard for us.

I put an example tar in the classpathx ftp dir.


Nic



From Casey Marshall <rsdio@metastatic.org>  Sun Jun  9 20:42:10 2002
From: Casey Marshall <rsdio@metastatic.org> (Casey Marshall)
Date: Sun, 9 Jun 2002 12:42:10 -0700 (PDT)
Subject: [Classpathx-crypto] TestOfSerpent
In-Reply-To: <3D029ECD.6060809@fl.net.au>
Message-ID: <Pine.LNX.4.44L0.0206091209260.23182-100000@gradius.dreamhost.com>

Raif S. Naffah wrote:

> > This version comes from a test suite that tests all known-answer and all
> > monte carlo tests -- which seemed a bit excessive. It is available at:
> >
> > 	http://www.metastatic.org/src/serpent-test-full.tar.gz
> >
> > It is 117 kilobytes compressed, and is slow.
>
> is this the inverse of the NistKAT and NistMCT (in gnu.crypto.tools) tools?
>

After a fashion, yes.

> since we will be using code from these tools for the test cases, should
> we look into re-factoring that code to improve code re-usability across
> the library?
>

It did not even occur to me to use that code; I like this idea, however
--- one could envision a point where writing a full-conformance test for
a particular algorithm would amount to simply including the appropriate
test vectors and pointing the program at them. It seems smarter than
keeping large, static String arrays.

-- 
Casey Marshall < rsdio@metastatic.org > http://metastatic.org/



From raif@fl.net.au  Mon Jun 10 03:24:46 2002
From: raif@fl.net.au (Raif S. Naffah)
Date: Mon, 10 Jun 2002 12:24:46 +1000
Subject: [Classpathx-crypto] latest commits
References: <Pine.LNX.4.44L0.0206081552170.31164-101000@gradius.dreamhost.com>	<3D02A2A4.6080806@fl.net.au> <87ofek4ken.fsf@pooh-sticks-bridge.tapsellferrier.co.uk>
Message-ID: <3D040DEE.2020809@fl.net.au>

hello Nic,

trying to use this failed last time i tried it --see my previous post 
dated 25/4.


cheers;
rsn

Nic Ferrier wrote:
> "Raif S. Naffah" <raif@fl.net.au> writes:
> 
> 
>>7. updated the GNU build-related files in the top level as well as in  
>>gcj/ and gcj/source --i finally was able to run aclocal, autoconf and  
>>automake using the cygwin distribution.  pls note that automake (on my  
>>cygwin installation is 1.6.1 which required me to change some of the  
>>files that were failing cause were relying on version 1.6a.  if this  
>>causes others build envs to break, then raise your hand. 
> 
> 
> Did you look at the automakejar stuff? It has been recieved with
> enthusiasm on other GNU java projects and hopefully will become
> something of a standard for us.
> 
> I put an example tar in the classpathx ftp dir.
> 
> 
> Nic
> 
> 
> _______________________________________________
> Classpathx-crypto mailing list
> Classpathx-crypto@gnu.org
> http://mail.gnu.org/mailman/listinfo/classpathx-crypto
> 
> .
> 




From raif@fl.net.au  Mon Jun 10 03:36:49 2002
From: raif@fl.net.au (Raif S. Naffah)
Date: Mon, 10 Jun 2002 12:36:49 +1000
Subject: [Classpathx-crypto] TestOfSerpent
References: <Pine.LNX.4.44L0.0206091209260.23182-100000@gradius.dreamhost.com>
Message-ID: <3D0410C1.4090100@fl.net.au>

Casey Marshall wrote:
> Raif S. Naffah wrote:
> 
> [...]
>>since we will be using code from these tools for the test cases, should
>>we look into re-factoring that code to improve code re-usability across
>>the library?
>>
> 
> 
> It did not even occur to me to use that code; I like this idea, however
> --- one could envision a point where writing a full-conformance test for
> a particular algorithm would amount to simply including the appropriate
> test vectors and pointing the program at them. It seems smarter than
> keeping large, static String arrays.

absolutely.  Nistxxx tools _emit_ the test vectors, but they also 
include the code to verify the inverse operation of what they generate.

re-factoring that code and re-using your patterns (from TestOfSerpent) 
would allow:

a. ending up with new tools (or added functionality to the existing 
ones) that _read_ the conformance test vectors and verify them, this 
time instead of _writing_ them out.

b. exposing some methods in these tools, or have'em all use common 
Helper(s) to do their job and making writing TestOf<block-ciphers> as 
simple as feeding the test-case a collection of files (or a directory 
where those files would be found).


does this make sense?


cheers;
rsn





From Casey Marshall <rsdio@metastatic.org>  Wed Jun 12 04:10:03 2002
From: Casey Marshall <rsdio@metastatic.org> (Casey Marshall)
Date: Tue, 11 Jun 2002 20:10:03 -0700 (PDT)
Subject: [Classpathx-crypto] MD4
Message-ID: <Pine.LNX.4.44L0.0206111954210.4424-101000@gradius.dreamhost.com>

  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

--1439763957-2107575277-1023851403=:4424
Content-Type: TEXT/PLAIN; charset=US-ASCII

Hello,

I had written an implementation of MD4 for another project (now undergoing
a complete rewrite) and have reworked it into more of a GNU style than JCE
style (the program didn't need anything except MD4 -- and an incorrect
version at that -- so genericity seemed useless). It was quite easy to make
a patch for Classpathx.

Classpathx is welcome to incorporate it, if you like (I know MD4 is not
used as much as other algorithms). The patch (gzipped) is attached.

-- 
Casey Marshall < rsdio@metastaic.org > http://metastatic.org/

--1439763957-2107575277-1023851403=:4424
Content-Type: APPLICATION/octet-stream; name="patch-mdfour.gz"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.4.44L0.0206112010030.4424@gradius.dreamhost.com>
Content-Description: MD4 Patch
Content-Disposition: attachment; filename="patch-mdfour.gz"

H4sICCq3Bj0AA3BhdGNoLW1kZm91cgDtXPt3Gsly/tk+yf9QV2ezAYNg3oDQ
KuYlW3stWQE5XsfR3dPMNGJsmOHOQ4975fztqe55D8NDFuQmZ62zi2Cm+uvq
+qqqq1GNDXMygcML4jugOw8Lz67f6F/qru07Oq2fk690Ys5ojczDuzVxxf2X
h4eH6xFenDom/OpbAA2QpCOlcSQJIAmC9LJSqWyCf3HlUz5YFEHUjlT1SFSC
wa9fw6EoKVUNKuxXA16/fglwY/n1UJspcaf1t/hySnTPdh5qX8gtgf/65wKp
s3PquuSG9s0b6nprBM/7any3UnBXWTN2aC7oeV+UmptlNGGNzGhK0gLGVkSa
1npLm9YmIk0rT6R2JDe3JBIHLxEpqSkimxonEn9tTeS2PK6lcS2LW5C4BYeb
KCxgMDRfatiQ3piuF609tvUGwTSnG0Rz5MrCkVJE7iaULMuKfCSkWNYkRjK+
hhwDjDzHtG5geHY54Cb7/W1n9BZ+gQMHjTg38MpBOy04ettJSeHPgTslh0ti
yG9KhonNDRVFKmkRZUlEYSgcp/7qVagU5pgmmC64D5ZtPcxt3wXPjhRGN4BX
9eWV/I53ckthOAi/DdfF/r6GgsIB67kvHMLZOycPgDlWEI9UoTjAn4KW8gXM
GKnU3WwwX8DXZuQLwY9DXX/mod0segdBnJTK7UjgG9CZS8GcQMkic1qjf/XJ
zD27sWyH9ohLSxHz5TL8fRUqyjDIytaQSgJZWQWppLUMvQh/GGwo+ScU9Wcz
+Pln+FNwqebS2eQKM1WJY/NEKLR4IhTFJEjwZ+rWiGGUsnGSTBjeTkXH0r3Y
MPHC4xtKPCIa41DPdyzo2bMZ1T3Tttyab81tdF6TjGd0RL3S1A2n+La9T8eZ
dZMrRYJb+HAk+uIjNaBPdZC5twkC/gdiS2tt5bsxStpnWzwCtMRnhaqA1FQl
jVNTWRD9K242LLvXwgkYGBr4ZaVeh8Md/nDAn86Mn/gb/tKzFw+OeTP1oNQr
cx2rcOpQCiN74t0Rh8Kp7VsGYfRV4czSa8XDcD04FoD5+gNGv4MZFb302HEN
0349px5xPQTRa7Zzc5JMfzXFpLhw7BsHa0R8O2FTu+HUbXiwfdCJhZ5ksN3B
HPsexpgHxDLqtgPclx7wAsdCNakD3pSCR525C/aEf3hz8QHeUIs6ZAaX/nhm
6vDO1KmF0UpwbnbFnSLr4wcuzhbP4QoM0AZqoowDt9Rx8TNI0SQRIipVIh7T
2wF7wcaUUdkHDjgjXjKUm7HQBMlKDcB6i6FP7QUuaorAuPY7E+06puC7dOLP
qoCS8PHs6u37D1ccr3PxCT52hsPOxdWnNkp7Uxsl6C0NsMz5YmYiNC7NIZb3
wFZwPhj23qJ8p3v27uzqE66CI52eXV0MRiM4fT+EDlx2hldnvQ/vOkO4/DC8
fD8a1HC/onSTkSch2hwzIRjoCObMTVb/CRl2UcOZAVNyS5FpnZq3qB+GN/rY
NiTObNwx2To5oJcyZxvcUD9WPkLv/eWns4s3qPbZBCzbq8KdY6JD4U6MMrFK
+LM+AqqRmNqCK4r2pHA5IzqtwshneLIsxCJd2/XYuPMOgCBhQj4UZaER3f0w
6sTTdlxcs7uguolrpPc6XQQzYu5nYTAzra/B4mbm2CHOA18y2Nwf2fJ4RYEL
N3w9cGCMG3pPdd9jybaaHWvYKI8mYF5vemwDwThDj+LGCrYVrEM4TILBJkDH
02304SRgVlODhubOHS+G48VTT+079EoHnfyWzEw0MGWhEq7IocTFDQPupsEs
KS04l3OWfDjekzTaQ0p9WcGQsh0vncCjarZddNP3zFntA74EKf7VK9xKX8Hx
4qRj8eikc2p53N2Y9w/x1xAjwvX+1WUFAsyDwwnmCXY6Qfe/sdGLp/Mah2ES
d5jXmB0WGEy+42JOCjwcUCWMFbTu319zd8ptOTXc3b9xlBi0ylItksBMzjjT
kRPT4MYOBmKYLUwdU/0DxhrORkN3qsbaoANgGmO+hb9uiWOy4pcsMAvpJCgK
4MzjtfGMcYpAE9wreCYnVoii1o7rixP2IbLVkE5QC0un7lH2lj3jH1h0Hc/M
kytc9jGBqUMnvxxMPW9xVK/f3d3VTOpN2F5UdyY6+1+UJaHm3XsHJ6jzcZ2c
QHgIPIzQgtMgdGJ7H4+deKphLSQJFcVZA1XqoS780+toz/hpSG9N9u4ndh1j
fxG4qD4jbsAwvfeoZbjQxb2UlcOsYOTlFt94LdxILc/lxDBzsphgCTW4v0PH
BghAuYPizytABy3wQKSOzO7Igwt4ODkcI//AUnKVbYaihkHpRfrx5eKvhWPe
snAPSgIMaAsj1bQ86J+9GYyufn83uHhzxU49otaOlp5owShlasROijstxjrO
AmheVZSYDjCe2fpXlyuhKU9Sovvufe/PiQ6aEumwckQHxYR7raGokiyI7Q3w
XJhOdIOMm60Nwj0u3GqOiaFP6AbhPhcWBVlSlYaW15pJECwXqqBXwcjfjVE+
X8Nv4XGEfRK16xQF3PZYTiywouA7M3Kf84a7KRYalg2YzzHsMBONKV4wLRxS
W2v68OgbuIDAjryy2Nd6pwMBjyqdQUsWuw25p7b6jYHQE5qtHjuto2b/FIeF
47Nj415iIe+D4baiJ9NiFrNMD/du8280SL/6lJgWW1IcpVXMkZ4bYTAZ5peI
4iM3mKOFIN3quPkxbyacBe7IzNro2cCiK3LjCOe1a2IeBLEmZv07UJGfKZMj
p+tjrJTib1uiY1s1G3rVTBCEh71vOZdhyCwOWWGamoE5BT8Ypy/UCBLKBGuk
nbk+jq6Ps9f16LqevW5E142cPLdhNIZ9yM3jT3DDQIESM/nn63I4K79c0zFh
0VJunehBZzzZonHxADO1jT26Vh3YwbE2I9ZNrce04aUORiB1Jlha5guDLSBD
/t+Pv+DhG8IVJjSFh/PoawdmpIL1L5UjZIx+QxAwtAjb1HGfmvJ9arNOju2h
NrxUYyzADfWGvNpMqxbeCxPKL5nvSzh9ZZbIwnclAicnJ9As56+I2tIlSSlX
l7HGidh4CWu8jDVeg6UnYvoSlr6Mpa/BMhIxYwnLWMYyIqz4O6l2juzAovlo
jii5tU2D1f7Uw2zqYRGS5oTFb6cNLFy7MSwL0l4bWEz2c6iB841te0bxHJJ8
Q7XkgGG+D78wK7G6uObZwWZQir8UqwWql8rlpWSU86gFMbo8qNNzsb3PYsGP
b5jVebL4l6IkFwojisFSNw6x4BhUrQz/BiVVg0PAE/0RlERJ4O/bOafFgeHu
yS9EOBVoXgeikTze+SxcRwmpjBt3U4jB+JGWV1K/hLvD8THI7fTYELlSSWHw
IRulShyY+Qp61BOk0dmeII1++ARpWXqKtCI8Sbp4lQCF0qqW3rtCJ8Uha6MG
U6LlTmxnHu4u6ENV7kf2ZILxlPNEwsowVoexQsxIzTZhXx8xCZNVclXuskIb
Px2zShjMSiX75fFvn83rwKs/BxMxC/yMrjSZlEORx5R4lF4KxdHBoPkkcazt
nyIuKcmX5cmSCUsspI2uy1LLGN/oLKvo+MZgkZQ2D4EKLhbz78+gl+ER3/73
uIwfjHIZA+y3zyBctxNZhOWLklEySP8lWcKYBTlxByNAJAgyDhFJmcOHiOJ1
Sha14YgNlDTSiI1yKiVyRANBSIholDl8iChdZ9Knzi0poqSeQhTFVGIJEHW+
0ABRL3P4EFG+TsmiDTliCyXHacRWub21HZWd21HduR21nduxsXM7Nndux9au
7SgKu7ajKO7ajqK0azuK8s7tqOzcjur2diywJAI/cgs+QjhHnCTxt3CvkqbU
aLVa329ZnOaRW/QRQu7i9FE8Q2JpNW9ptdDSOM0jt/AjhFzGgVU8Q2x5aOUs
D61Cy+M0j9zijxByG7tc8QwJE3KeCbnQo1fyIO6dB3XvPLT2zoO8dx5WMb07
HrR98yCuiund8bAqpnfHwyqmd8dDY+88rIrp3fGwKqY38ZBlYgx/QS3+wjae
9J6gUaNFx0T8LtsTxOO42Ry9hJlYu5W3ditvbQPxOG52Z1nCfMqOy9fNcLOZ
fgkzsaiat6ia9+y8PVdhPsOe4iqOnmNPbQ/2XMXRc+wp7sE/W3uwp7oHe8p7
sOcqzOf45yqOnmPPxh7suYqjTfbMWJSQdgA/HrcD3XW9HRjGSL4q+gZbdbV9
wY9vLL8X/CV+U2vbsvT6/rZl+RdXUx9+JRaIDRCbR1LjSJW3atAsgsr2Y7cy
/diayDt1xUx35sL3SgfZDuvR2w7rvk3+3ECNM+ugCgdRC85B0ohYMPy8rzLh
VDcDKsqujhbmxpHrJ62sGaoUTqqEk64duWGlkcasC403VQyJZdjzzELSN5gB
L4cXbwoUCnpfA7FQs21dMljLVv6YEt3sjCnh7263zOPk3LB5pKhLDZdqc1W/
JaK1991uuaptkqu5Rcvlj3bJH+2S/9/aJdd2S+LGurZd8ke35B+wWzLph7ya
LjU9hM7N9s9j82REnVvUEy4d+5a1JKKzhc0Sx3UTS7fj8cno8uy4Pj4pc0Bi
kAUK1I4X39OUhztN3JeX2c47AewWPXrR7Z1aMzVj0IdUcsv7mijpKEJrbNFU
tNxP0uPmDFtH9miPfN/OHqZa88CKh24RPBDSmc1Y24NbXEStkCuooFZIvhjh
HsfKJ2iCKB/JEhbgvKooLJ9WgeRqJ/FIaKVKeP4gEb6mnyMKnzsihsGbOtjL
+8nHqenMFrY9q7ksrZfKSeVdKB8+vbidMGsBTiQrayWVNGbuWaRgyMZHjhJT
JaAbKMwKruUwK/q0GnglSo5FGYlcqoDFhpgpgRnY/87DRiueNfpR9/6oe3/U
vT/q3j9Q3fvFt0yvNkG3o3e287V2FXRkrrnLHqlcL8H9KS/COjh9k98f+hau
s11cffMnf7L/5EF7pRxuN4U3i59pwrKUNcXxSoztNS7vcItq+Gx1X3tqUR7v
f3FdHhnrD1SLx0YohY9PsIfPlypzfvEfU4yHeoZPevBmyTkxrVDdz9dAnBs3
pXDirjXHt0rZmu9bISgbAqFgYX97HCKpEpH70OaG/z2bJWgeZeoVNEjjUSrT
7ZmN0dTjT5l/PCCRxwVSx7tyfFo6SBqwD6qpRwZT/3JA0pyJOd7Tp1AaRAkZ
7rNtpxPcm9OQR3BQCfisYY726ftJ6T4NWMRdvPLOTpccr8xfsK2idEAOajfU
67LHv0rlKmuqFTMjwn7dOfsrVTI66jZPS4YBRu8X7Nmkbn+gSr2uLPYHsjxQ
NElRB4J62u13+9ppV1IOVjERrhlpQKTirve5Uf4OPkLg55HR7e2ZjrG+RIi8
E0I6itIUxEancyqJ/aYqqac9UegMmnhFa0it/npC2Lr3RAmDfhYpGaPvl57s
s3zLoaPshKp+C6vbTlPUFFVpnQ6aYrPZQPK0gdhrCKLSXUtVzhr7IS03yfNi
araYkjHdM3MYWAad3EzNL19nc8te/NVxPf/27v7hb0ssStpuWGy0kDBZaHY6
arfb6w8Gneagr8n9U0WU+p3W+oCLjbKnqIvxn8edq5vmyB+7+6avwwx4+ubt
2a9/fnd+8f7y34ejqw//8fG3T/+5mlhBlGRF1RrN1hLFmrQTigVFPm2qTelU
UsR+V1bF3kCTGgNRlQeNU2GwYZNL225PLKeneBbRA3ZQfLjw59QxdXe/XMe0
Cbt5t8R+U9gJ+1jYdJV+v9fqyU3cVFv4e9DoYtY+7fUEVdbWsp836H4cID/L
s3yAPXbL1PmH1qO5Gfhju+wRr+z1cgo58+zy8xh/VlEbm28bqlM4XP/YPgX1
YTaX8UUFY4oW9H+8GoyNtK2nfnv5P4pPoGVjVQAA
--1439763957-2107575277-1023851403=:4424--


From raif@fl.net.au  Wed Jun 12 11:32:26 2002
From: raif@fl.net.au (Raif S. Naffah)
Date: Wed, 12 Jun 2002 20:32:26 +1000
Subject: [Classpathx-crypto] MD4
References: <Pine.LNX.4.44L0.0206111954210.4424-101000@gradius.dreamhost.com>
Message-ID: <3D07233A.30608@fl.net.au>

hello Casey,

Casey Marshall wrote:
> Hello,
> 
> I had written an implementation of MD4 for another project (now undergoing
> a complete rewrite) and have reworked it into more of a GNU style than JCE
> style (the program didn't need anything except MD4 -- and an incorrect
> version at that -- so genericity seemed useless). It was quite easy to make
> a patch for Classpathx.

got it.


> Classpathx is welcome to incorporate it, if you like (I know MD4 is not
> used as much as other algorithms). The patch (gzipped) is attached.

done :-)  thanks for your contribution.

i'll update the web page later this week + cheers;
rsn



From olivier@zipworld.com.au  Sat Jun 15 08:46:21 2002
From: olivier@zipworld.com.au (Olivier LF)
Date: Sat, 15 Jun 2002 17:46:21 +1000
Subject: [Classpathx-crypto] DOS characters in shell scripts.
Message-ID: <20020615074621.GA8468@zipworld.com.au>

Raif,

I have checkout the latest and noticed that all shell scripts and
Makefiles have the DOS end-of-line character sequence (with the extra
^M).

As a result, all the gcj tool chain was broken on Unix!
I have fixed all the files under crypto/gcj and also changed few
exe permissions for the shell scripts.
For some of the files I had to remove them from CVS altogether and re-import.

It should be working again now. 
Next time you checkout, I recommend to remove the gcj directory and 
checkout a fresh copy. Some CVS clients don't pick up the difference
between Unix and DOS ending and fail to update files correspondingly.



It is VERY important that all shell scripts and Makefiles use the Unix
ending otherwise they won't work under Unix platforms (only Cygwin
quietly filters the extra ^M)..

In fact, it would propably be better if ALL the source code had the Unix
ending, as the Primary target of the gnu project is GNU / Unix systems
rather than Windows platforms.

Olivier

PS: I'll start working on the JUnit test harness for GCJ soonish.

-- 
----------------------------------------------------------------------
Olivier Louchart-Fletcher
Email: olivier@zipworld.com.au


From nferrier@tapsellferrier.co.uk  Sat Jun 15 19:44:30 2002
From: nferrier@tapsellferrier.co.uk (Nic Ferrier)
Date: 15 Jun 2002 19:44:30 +0100
Subject: [Classpathx-crypto] DOS characters in shell scripts.
In-Reply-To: <20020615074621.GA8468@zipworld.com.au>
References: <20020615074621.GA8468@zipworld.com.au>
Message-ID: <873cvol6up.fsf@pooh-sticks-bridge.tapsellferrier.co.uk>

Olivier LF <olivier@zipworld.com.au> writes:

> In fact, it would propably be better if ALL the source code had the Unix 
> ending, as the Primary target of the gnu project is GNU / Unix systems 
> rather than Windows platforms. 

It would certainly make life easier. However, Raif does not have a
GNU system available to him, if someone donated one, I'm sure he'd
use it.

In the mean time he's doing excellent work contributing to the
ClasspathX project.


Nic Ferrier
ClasspathX Maintainer.



From raif@fl.net.au  Sun Jun 16 03:25:23 2002
From: raif@fl.net.au (Raif S. Naffah)
Date: Sun, 16 Jun 2002 12:25:23 +1000
Subject: [Classpathx-crypto] DOS characters in shell scripts.
References: <20020615074621.GA8468@zipworld.com.au>
Message-ID: <3D0BF713.7000500@fl.net.au>

hello Olivier and Nic,

thanks Nic for your encouragement and support.  my comments are in-lined 
below.


Olivier LF wrote:
> Raif,
> 
> I have checkout the latest and noticed that all shell scripts and
> Makefiles have the DOS end-of-line character sequence (with the extra
> ^M).

yes you're right; i just checked them with (gVIM + Cream) --which i 
should have done instead of using that "intelligent" expensive IDE (you 
know what i'm talking about!).

i'll try to remember doing that every time i touch these files.


> As a result, all the gcj tool chain was broken on Unix!

sorry about that.


> I have fixed all the files under crypto/gcj and also changed few
> exe permissions for the shell scripts.
> For some of the files I had to remove them from CVS altogether and re-import.
> It should be working again now.

thanks.


> Next time you checkout, I recommend to remove the gcj directory...

noted.


> It is VERY important that all shell scripts and Makefiles use the Unix
> ending otherwise they won't work under Unix platforms (only Cygwin
> quietly filters the extra ^M)..
> 
> In fact, it would propably be better if ALL the source code had the Unix
> ending, as the Primary target of the gnu project is GNU / Unix systems
> rather than Windows platforms.

if you check the java sources, you'll notive that this is the case.  i 
think the tool i use wants to be too smart when it comes to (what i 
considers) plain text files.

> 
> Olivier
> 
> PS: I'll start working on the JUnit test harness for GCJ soonish.

good to hear.


cheers;
rsn



From olivier@zipworld.com.au  Sun Jun 16 07:47:04 2002
From: olivier@zipworld.com.au (Olivier LF)
Date: Sun, 16 Jun 2002 16:47:04 +1000
Subject: [Classpathx-crypto] DOS characters in shell scripts.
In-Reply-To: <3D0BF713.7000500@fl.net.au>
References: <20020615074621.GA8468@zipworld.com.au> <3D0BF713.7000500@fl.net.au>
Message-ID: <20020616064704.GA1962@zipworld.com.au>

On Sun, Jun 16, 2002 at 12:25:23PM +1000, Raif S. Naffah wrote:
> hello Olivier and Nic,
> 
> thanks Nic for your encouragement and support.  my comments are in-lined 
> below.
> 

Ooops! I am not sure if I sounded aggressive! That was not the
intention. I am very sorry, if it is the case.

> yes you're right; i just checked them with (gVIM + Cream) --which i 
> should have done instead of using that "intelligent" expensive IDE (you 
> know what i'm talking about!).
> 
> i'll try to remember doing that every time i touch these files.

One thing that is good, the cvs diff at savanah does pick up the
difference for modified files. That is if you change the content of a file
and also convert it to unix ending, the file will be fully updated.
Strangely enought, it does not work if the only change is a convertion to
Unix ending!

> >In fact, it would propably be better if ALL the source code had the Unix
> >ending, as the Primary target of the gnu project is GNU / Unix systems
> >rather than Windows platforms.
> 
> if you check the java sources, you'll notive that this is the case.  i 
> think the tool i use wants to be too smart when it comes to (what i 
> considers) plain text files.

I did open a few files in the test package while working on the JUnit
compilation. Some are actually a mix up of DOS and Unix ending (most
lines with DOS ending, few with Unix).
Anyway, it does not seem to matter much for the java sources, shell
scripts and makefiles are more critical.

> >PS: I'll start working on the JUnit test harness for GCJ soonish.
> 
> good to hear.
> 

It does work! I ran the test suite, it reports:

101 tests, 13 failures.

The failures are not really failures, they all seem to boil down to
java.security.Exception from requests for algorithms not available in the
gcj standard lib (as opposed to jdk).

I need to work more on the makefile before I am ready to commit the
update.

Oli

-- 
----------------------------------------------------------------------
Olivier Louchart-Fletcher
Email: olivier@zipworld.com.au


From raif@fl.net.au  Sun Jun 16 09:22:12 2002
From: raif@fl.net.au (Raif S. Naffah)
Date: Sun, 16 Jun 2002 18:22:12 +1000
Subject: [Classpathx-crypto] DOS characters in shell scripts.
References: <20020615074621.GA8468@zipworld.com.au> <3D0BF713.7000500@fl.net.au> <20020616064704.GA1962@zipworld.com.au>
Message-ID: <3D0C4AB4.7020906@fl.net.au>

Olivier LF wrote:
> ...
>>>PS: I'll start working on the JUnit test harness for GCJ soonish.
>> ...
> 
> It does work! I ran the test suite, it reports:
> 
> 101 tests, 13 failures.
> 
> The failures are not really failures, they all seem to boil down to
> java.security.Exception from requests for algorithms not available in the
> gcj standard lib (as opposed to jdk)...

the current codebase --with the gnu.crypto.jce package, which consists 
of adapters for use by the JCA/JCE-- runs fine using sun's java 
interpreter; i.e. all tests pass.  with that package, the gnu.crypto 
implements the MD5, SHA-1 (hash) and DSS (signature) that are standard 
jdk (without the need for any JCE cleanroom or otherwise add-on).

is it feasible/wothwhile for the people doing the gcj to include the 
gnu.crypto in their release?

i guess a more exhaustive list of what is failing might give us -me- a 
better clue of what is still missing.


cheers;
rsn



From nferrier@tapsellferrier.co.uk  Sun Jun 16 12:45:40 2002
From: nferrier@tapsellferrier.co.uk (Nic Ferrier)
Date: 16 Jun 2002 12:45:40 +0100
Subject: [Classpathx-crypto] DOS characters in shell scripts.
In-Reply-To: <3D0BF713.7000500@fl.net.au>
References: <20020615074621.GA8468@zipworld.com.au>
 <3D0BF713.7000500@fl.net.au>
Message-ID: <87znxvjvkr.fsf@pooh-sticks-bridge.tapsellferrier.co.uk>

"Raif S. Naffah" <raif@fl.net.au> writes:

> yes you're right; i just checked them with (gVIM + Cream) --which i  
> should have done instead of using that "intelligent" expensive IDE (you  
> know what i'm talking about!). 

A suggestion: use emacs on Windows, it does all the line ending
conversion for you.



Nic



From Casey Marshall <rsdio@metastatic.org>  Tue Jun 18 00:01:28 2002
From: Casey Marshall <rsdio@metastatic.org> (Casey Marshall)
Date: Mon, 17 Jun 2002 16:01:28 -0700 (PDT)
Subject: [Classpathx-crypto] PATCH: NIST cipher tester
Message-ID: <Pine.LNX.4.44L0.0206171531480.28747-200000@gradius.dreamhost.com>

  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

--1439763957-861381847-1024354888=:28747
Content-Type: TEXT/PLAIN; charset=US-ASCII

Hello,

I've put together a (fairly simple) cipher testing program that will read
in the standard test vector files that the NIST AES submissions required;
all that is involved in testing an algorithm foo with a 128 bit block size
is putting all the test vectors in a directory `tv/foo-128', then
instantiating the class test.cipher.NISTCipherTest. The class loads test
files with the `getResource' method of java.lang.Class, so the vector
files can simply be put into gnu-crypto-test.jar.

The patch only adds the class itself, and updates the build scripts and
test.cipher.AllTests. I didn't include the test files for the three AES
submitted ciphers in Classpathx, because they're probably far too big for
this mailing list.

I've also noted that in the file `Makefile.in' there is a line that says
`gnu/crypto/mac/UMash32.java' which I'm guessing should have read
`gnu/crypto/mac/UMac32.java'.

Cheers,

-- 
Casey Marshall < rsdio@metastatic.org > http://metastatic.org/

--1439763957-861381847-1024354888=:28747
Content-Type: TEXT/PLAIN; charset=US-ASCII; name=patch-test
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.4.44L0.0206171601280.28747@gradius.dreamhost.com>
Content-Description: NIST cipher test patch
Content-Disposition: attachment; filename=patch-test

ZGlmZiAtTmF1cncgY3J5cHRvL01ha2VmaWxlLmluIGNyeXB0by4xL01ha2Vm
aWxlLmluDQotLS0gY3J5cHRvL01ha2VmaWxlLmluCUZyaSBKdW4gIDcgMjI6
NDc6NDUgMjAwMg0KKysrIGNyeXB0by4xL01ha2VmaWxlLmluCVN1biBKdW4g
MTYgMTk6NTI6NDYgMjAwMg0KQEAgLTQ4LDcgKzQ4LDcgQEANCiAJJChTT1VS
Q0VESVIpL2dudS9jcnlwdG8vbWFjL0lNYWMuamF2YSBcDQogCSQoU09VUkNF
RElSKS9nbnUvY3J5cHRvL21hYy9NYWNGYWN0b3J5LmphdmEgXA0KIAkkKFNP
VVJDRURJUikvZ251L2NyeXB0by9tYWMvVUhhc2gzMi5qYXZhIFwNCi0JJChT
T1VSQ0VESVIpL2dudS9jcnlwdG8vbWFjL1VNYXNoMzIuamF2YSBcDQorCSQo
U09VUkNFRElSKS9nbnUvY3J5cHRvL21hYy9VTWFjMzIuamF2YSBcDQogCVwN
CiAJJChTT1VSQ0VESVIpL2dudS9jcnlwdG8vbW9kZS9CYXNlTW9kZS5qYXZh
IFwNCiAJJChTT1VSQ0VESVIpL2dudS9jcnlwdG8vbW9kZS9DVFIuamF2YSBc
DQpAQCAtMTAwLDggKzEwMCwxMCBAQA0KIAkkKFNPVVJDRURJUikvdGVzdC9j
aXBoZXIvVGVzdE9mS2hhemFkLmphdmEgXA0KIAkkKFNPVVJDRURJUikvdGVz
dC9jaXBoZXIvVGVzdE9mTnVsbENpcGhlci5qYXZhIFwNCiAJJChTT1VSQ0VE
SVIpL3Rlc3QvY2lwaGVyL1Rlc3RPZlJpam5kYWVsLmphdmEgXA0KKwkkKFNP
VVJDRURJUikvdGVzdC9jaXBoZXIvVGVzdE9mU2VycGVudC5qYXZhIFwNCiAJ
JChTT1VSQ0VESVIpL3Rlc3QvY2lwaGVyL1Rlc3RPZlNxdWFyZS5qYXZhIFwN
CiAJJChTT1VSQ0VESVIpL3Rlc3QvY2lwaGVyL1Rlc3RPZlR3b2Zpc2guamF2
YSBcDQorCSQoU09VUkNFRElSKS90ZXN0L2NpcGhlci9OSVNUQ2lwaGVyVGVz
dC5qYXZhIFwNCiAJXA0KIAkkKFNPVVJDRURJUikvdGVzdC9oYXNoL0FsbFRl
c3RzLmphdmEgXA0KIAkkKFNPVVJDRURJUikvdGVzdC9oYXNoL1Rlc3RPZkhh
c2hGYWN0b3J5LmphdmEgXA0KQEAgLTE0Miw5ICsxNDQsMTggQEANCiAJJChT
T1VSQ0VESVIpL3Rlc3Qvc2lnL3JzYS9UZXN0T2ZSU0FDb2RlYy5qYXZhIFwN
CiAJJChTT1VSQ0VESVIpL3Rlc3Qvc2lnL3JzYS9UZXN0T2ZSU0FLZXlHZW5l
cmF0aW9uLmphdmEgXA0KIAkkKFNPVVJDRURJUikvdGVzdC9zaWcvcnNhL1Rl
c3RPZlJTQVBTU1NpZ25hdHVyZS5qYXZhIFwNCisJXA0KKwl0di9yaWpuZGFl
bC0xMjgvY2JjX2RfbS50eHQgdHYvcmlqbmRhZWwtMTI4L2NiY19lX20udHh0
IFwNCisJdHYvcmlqbmRhZWwtMTI4L2VjYl9kX20udHh0IHR2L3Jpam5kYWVs
LTEyOC9lY2JfZV9tLnR4dCBcDQorCXR2L3Jpam5kYWVsLTEyOC9lY2Jfdmsu
dHh0IHR2L3Jpam5kYWVsLTEyOC9lY2JfdnQudHh0IFwNCisJdHYvc2VycGVu
dC0xMjgvY2JjX2RfbS50eHQgdHYvc2VycGVudC0xMjgvY2JjX2VfbS50eHQg
XA0KKwl0di9zZXJwZW50LTEyOC9lY2JfZF9tLnR4dCB0di9zZXJwZW50LTEy
OC9lY2JfZV9tLnR4dCBcDQorCXR2L3NlcnBlbnQtMTI4L2VjYl92ay50eHQg
dHYvc2VycGVudC0xMjgvZWNiX3Z0LnR4dCBcDQorCXR2L3R3b2Zpc2gtMTI4
L2NiY19kX20udHh0IHR2L3R3b2Zpc2gtMTI4L2NiY19lX20udHh0IFwNCisJ
dHYvdHdvZmlzaC0xMjgvZWNiX2RfbS50eHQgdHYvdHdvZmlzaC0xMjgvZWNi
X2VfbS50eHQgXA0KKwl0di90d29maXNoLTEyOC9lY2JfdmsudHh0IHR2L3R3
b2Zpc2gtMTI4L2VjYl92dC50eHQNCiANCiBQS0dGSUxFUyA9DQotDQogDQog
I2EgbWFuZ2xpbmcgb2YgdGhlIFNPVVJDRUZJTEVTIGxpc3QgYWJvdmUNCiAj
VGhpcyBpcyBub3QgcXVpdGUgcGVyZmVjdCwgd2UndmUgaGFkIHRvIGhhcmRj
b2RlIHRoZQ0KZGlmZiAtTmF1cncgY3J5cHRvL2J1aWxkLnhtbCBjcnlwdG8u
MS9idWlsZC54bWwNCi0tLSBjcnlwdG8vYnVpbGQueG1sCUZyaSBKdW4gIDcg
MjI6NTE6MTUgMjAwMg0KKysrIGNyeXB0by4xL2J1aWxkLnhtbAlTdW4gSnVu
IDE2IDE5OjE2OjUwIDIwMDINCkBAIC0xMTUsNyArMTE1LDkgQEANCiAgICA8
L3RhcmdldD4NCiANCiAgICA8dGFyZ2V0IG5hbWU9Imphci10ZXN0IiBkZXBl
bmRzPSJjb21waWxlLXRlc3QiPg0KLSAgICAgIDxqYXIgamFyZmlsZT0iJHt0
ZXN0Lmphcn0iIGJhc2VkaXI9IiR7Y2xhc3Nlcy5kaXJ9IiBpbmNsdWRlcz0i
dGVzdC8qKiIvPg0KKyAgICAgIDxqYXIgamFyZmlsZT0iJHt0ZXN0Lmphcn0i
IGJhc2VkaXI9IiR7Y2xhc3Nlcy5kaXJ9IiBpbmNsdWRlcz0idGVzdC8qKiI+
DQorICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9IiBpbmNsdWRl
cz0idHYvKioiLz4NCisgICAgICA8L2phcj4NCiAgICA8L3RhcmdldD4NCiAN
CiAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUtdGVzdCIgZGVwZW5kcz0iamFy
Ij4NCmRpZmYgLU5hdXJ3IGNyeXB0by9zb3VyY2UvdGVzdC9jaXBoZXIvQWxs
VGVzdHMuamF2YSBjcnlwdG8uMS9zb3VyY2UvdGVzdC9jaXBoZXIvQWxsVGVz
dHMuamF2YQ0KLS0tIGNyeXB0by9zb3VyY2UvdGVzdC9jaXBoZXIvQWxsVGVz
dHMuamF2YQlTYXQgSnVuICA4IDE3OjA5OjA5IDIwMDINCisrKyBjcnlwdG8u
MS9zb3VyY2UvdGVzdC9jaXBoZXIvQWxsVGVzdHMuamF2YQlTdW4gSnVuIDE2
IDE5OjAzOjQ2IDIwMDINCkBAIC03Myw2ICs3MywxMCBAQA0KICAgICAgIHJl
c3VsdC5hZGRUZXN0KFRlc3RPZlNxdWFyZS5zdWl0ZSgpKTsNDQogICAgICAg
cmVzdWx0LmFkZFRlc3QoVGVzdE9mVHdvZmlzaC5zdWl0ZSgpKTsNDQogDQ0K
KyAgICAgIHJlc3VsdC5hZGRUZXN0KG5ldyBOSVNUQ2lwaGVyVGVzdCgicmlq
bmRhZWwiLCAxNikpOw0KKyAgICAgIHJlc3VsdC5hZGRUZXN0KG5ldyBOSVNU
Q2lwaGVyVGVzdCgic2VycGVudCIsIDE2KSk7DQorICAgICAgcmVzdWx0LmFk
ZFRlc3QobmV3IE5JU1RDaXBoZXJUZXN0KCJ0d29maXNoIiwgMTYpKTsNCisN
CiAgICAgICByZXR1cm4gcmVzdWx0Ow0NCiAgICB9DQ0KIA0NCmRpZmYgLU5h
dXJ3IGNyeXB0by9zb3VyY2UvdGVzdC9jaXBoZXIvTklTVENpcGhlclRlc3Qu
amF2YSBjcnlwdG8uMS9zb3VyY2UvdGVzdC9jaXBoZXIvTklTVENpcGhlclRl
c3QuamF2YQ0KLS0tIGNyeXB0by9zb3VyY2UvdGVzdC9jaXBoZXIvTklTVENp
cGhlclRlc3QuamF2YQlXZWQgRGVjIDMxIDE2OjAwOjAwIDE5NjkNCisrKyBj
cnlwdG8uMS9zb3VyY2UvdGVzdC9jaXBoZXIvTklTVENpcGhlclRlc3QuamF2
YQlNb24gSnVuIDE3IDE1OjIyOjM5IDIwMDINCkBAIC0wLDAgKzEsMzEwIEBA
DQorcGFja2FnZSB0ZXN0LmNpcGhlcjsNCisNCisvLyAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0NCisvLyAkSWQkDQorLy8NCisvLyBDb3B5cmln
aHQgKEMpIDIwMDIgIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIElu
Yy4NCisvLw0KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5
b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQorLy8gaXQg
dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBhcyBwdWJsaXNoZWQgYnkNCisvLyB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBv
cg0KKy8vIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQor
Ly8NCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhv
cGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCisvLyBidXQgV0lUSE9VVCBB
TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50
eSBvZg0KKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCisvLyBHTlUgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KKy8vDQorLy8gWW91
IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVy
YWwgUHVibGljIExpY2Vuc2UNCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3Jh
bTsgaWYgbm90LCB3cml0ZSB0byB0aGUNCisvLw0KKy8vICAgIEZyZWUgU29m
dHdhcmUgRm91bmRhdGlvbiwgSW5jLiwNCisvLyAgICA1OSBUZW1wbGUgUGxh
Y2UsIFN1aXRlIDMzMCwNCisvLyAgICBCb3N0b24sIE1BICAwMjExMS0xMzA3
DQorLy8gICAgVVNBDQorLy8NCisvLyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9u
LCBpZiB5b3UgbGluayB0aGlzIGxpYnJhcnkgd2l0aCBvdGhlciBmaWxlcyB0
bw0KKy8vIHByb2R1Y2UgYW4gZXhlY3V0YWJsZSwgdGhpcyBsaWJyYXJ5IGRv
ZXMgbm90IGJ5IGl0c2VsZiBjYXVzZSB0aGUNCisvLyByZXN1bHRpbmcgZXhl
Y3V0YWJsZSB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZS4NCisvLyBUaGlzIGV4Y2VwdGlvbiBkb2VzIG5vdCBob3dl
dmVyIGludmFsaWRhdGUgYW55IG90aGVyIHJlYXNvbnMgd2h5IHRoZQ0KKy8v
IGV4ZWN1dGFibGUgZmlsZSBtaWdodCBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZS4NCisvLw0KKy8vIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFz
aE1hcDsNCisNCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCitpbXBv
cnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsNCitpbXBvcnQgamF2YS5p
by5MaW5lTnVtYmVyUmVhZGVyOw0KKw0KK2ltcG9ydCBqYXZhLm5ldC5VUkw7
DQorDQoraW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCisNCitp
bXBvcnQgZ251LmNyeXB0by5jaXBoZXIuQ2lwaGVyRmFjdG9yeTsNCitpbXBv
cnQgZ251LmNyeXB0by5jaXBoZXIuSUJsb2NrQ2lwaGVyOw0KK2ltcG9ydCBn
bnUuY3J5cHRvLnV0aWwuVXRpbDsNCisNCisvKioNCisgKiA8cD5BIGdlbmVy
aWMgY2lwaGVyIGNvbmZvcm1hbmNlIHRlc3QgYWdhaW5zdCBOSVNULXN0eWxl
IHRlc3QgdmVjdG9ycy4gVG8NCisgKiBpbXBsZW1lbnQgYSB0ZXN0IGZvciBh
IHBhcnRpY3VsYXIgY2lwaGVyLCBpbmNsdWRlIHRoZSBmaWxlcyBgZWNiX3Z0
LnR4dCcsDQorICogYGVjYl92ay50eHQnLCBgZWNiX2VfbS50eHQnLCBgZWNi
X2RfbS50eHQnLCBgY2JjX2VfbS50eHQnLCBhbmQNCisgKiBgY2JjX2RfbS50
eHQnIGluIHRoZSBkaXJlY3RvcnkgYHR2L2NpcGhlcm5hbWUtYmxvY2tzaXpl
Jy48L3A+DQorICoNCisgKiA8cD5UaGF0IGlzLCB0byB0ZXN0IFJpam5kYWVs
IHdpdGggYSAxMjggYml0IGJsb2NrIHNpemUsIHB1dCB0aGUgYXBwcm9wcmlh
dGUNCisgKiAoYW5kIGFwcHJvcHJpYXRlbHkgbmFtZWQpIGZpbGVzIGludG8g
dGhlIGRpcmVjdG9yeSBgdHYvcmlqbmRhZWwtMTI4Jy4gVGhlbg0KKyAqIGNy
ZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggZS5nLjwvcD4N
CisgKg0KKyAqIDxibG9ja3F1b3RlPjxjb2RlPnRlc3QgPSBuZXcgTklTVENp
cGhlclRlc3QoInJpam5kYWVsIiwgMTYpOzwvY29kZT4NCisgKiA8L2Jsb2Nr
cXVvdGU+DQorICoNCisgKiA8cD5BbmQgdXNlIDxjb2RlPnRlc3Q8L2NvZGU+
IGFzIHlvdXIgdGVzdCBjYXNlLjwvcD4NCisgKg0KKyAqIDxwPk5vdGUgdGhh
dCBhIGZ1bGwtY29uZm9ybWFuY2UgdGVzdCB3aWxsIGxpa2VseSB0YWtlIGEg
d2hpbGUgdG8gZmluaXNoDQorICogKGl0IHdvdWxkIGhhdmUgdG8gZG8gNDgs
MDAxLDE1MiBlbmNyeXB0aW9ucyBvciBkZWNyeXB0aW9ucykuPC9wPg0KKyAq
DQorICogPHA+UmVmZXJlbmNlczo8L3A+DQorICogPG9sPg0KKyAqICAgIDxs
aT48YSBocmVmPSJodHRwOi8vY3NyYy5uaXN0Lmdvdi9lbmNyeXB0aW9uL2Fl
cy9rYXRtY3Qva2F0bWN0Lmh0bSI+S25vd24NCisgKiAgICBBbnN3ZXIgVGVz
dHMgYW5kIE1vbnRlIENhcmxvIFRlc3RzIGZvciBBRVMgU3VibWlzc2lvbnM8
L2E+IGZvciBhbg0KKyAqICAgIGV4cGxhbmF0aW9uIG9mIHRoZSB0ZXN0cyBh
bmQgdGhlIGZvcm1hdCBvZiB0aGUgcmVzdWx0aW5nIGZpbGVzLjwvbGk+DQor
ICogPC9vbD4NCisgKg0KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgDQorICov
DQorcHVibGljIGNsYXNzIE5JU1RDaXBoZXJUZXN0IGV4dGVuZHMgVGVzdENh
c2Ugew0KKw0KKyAgIC8vIENvbnN0YW50cyBhbmQgdmFyaWFibGVzDQorICAg
Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorICAgLy8gZmls
ZSBuYW1lcy4NCisgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBF
Q0JfVksgPSAiZWNiX3ZrLnR4dCI7DQorICAgcHJvdGVjdGVkIHN0YXRpYyBm
aW5hbCBTdHJpbmcgRUNCX1ZUID0gImVjYl92dC50eHQiOw0KKyAgIHByb3Rl
Y3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVDQl9FX00gPSAiZWNiX2VfbS50
eHQiOw0KKyAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVDQl9E
X00gPSAiZWNiX2RfbS50eHQiOw0KKyAgIHByb3RlY3RlZCBzdGF0aWMgZmlu
YWwgU3RyaW5nIENCQ19FX00gPSAiY2JjX2VfbS50eHQiOw0KKyAgIHByb3Rl
Y3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENCQ19EX00gPSAiY2JjX2RfbS50
eHQiOw0KKw0KKyAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEVOQ1JZ
UFRJT04gPSAwOw0KKyAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERF
Q1JZUFRJT04gPSAxOw0KKw0KKyAgIHByb3RlY3RlZCBJQmxvY2tDaXBoZXIg
Y2lwaGVyOw0KKyAgIHByb3RlY3RlZCBIYXNoTWFwIGF0dHJpYjsNCisgICBw
cm90ZWN0ZWQgVVJMIGVjYl92azsNCisgICBwcm90ZWN0ZWQgVVJMIGVjYl92
dDsNCisgICBwcm90ZWN0ZWQgVVJMIGVjYl9lX207DQorICAgcHJvdGVjdGVk
IFVSTCBlY2JfZF9tOw0KKyAgIHByb3RlY3RlZCBVUkwgY2JjX2VfbTsNCisg
ICBwcm90ZWN0ZWQgVVJMIGNiY19kX207DQorDQorICAgLy8gQ29uc3RydWN0
b3JzDQorICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQor
ICAgcHVibGljIE5JU1RDaXBoZXJUZXN0KFN0cmluZyBhbGdvcml0aG0sIGlu
dCBibG9ja1NpemUpIHsNCisgICAgICBzdXBlcihhbGdvcml0aG0pOw0KKyAg
ICAgIGNpcGhlciA9IENpcGhlckZhY3RvcnkuZ2V0SW5zdGFuY2UoYWxnb3Jp
dGhtKTsNCisgICAgICBhdHRyaWIgPSBuZXcgSGFzaE1hcCgpOw0KKyAgICAg
IGF0dHJpYi5wdXQoY2lwaGVyLkNJUEhFUl9CTE9DS19TSVpFLCBuZXcgSW50
ZWdlcihibG9ja1NpemUpKTsNCisgICAgICBhdHRyaWIucHV0KGNpcGhlci5L
RVlfTUFURVJJQUwsIG5ldyBieXRlW2NpcGhlci5kZWZhdWx0S2V5U2l6ZSgp
XSk7DQorICAgICAgdHJ5IHsNCisgICAgICAgICBjaXBoZXIuaW5pdChhdHRy
aWIpOw0KKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IH0NCisgICB9
DQorDQorICAgLy8gSW5zdGFuY2UgbWV0aG9kcy4NCisgICAvLyAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisgICBwdWJsaWMgdm9pZCBzZXRV
cCgpIHsNCisgICAgICBTdHJpbmcgcHJlZml4ID0gIi90di8iICsgY2lwaGVy
Lm5hbWUoKS50b0xvd2VyQ2FzZSgpICsgIi8iOw0KKyAgICAgIGVjYl92ayA9
IE5JU1RDaXBoZXJUZXN0LmNsYXNzLmdldFJlc291cmNlKHByZWZpeCArIEVD
Ql9WSyk7DQorICAgICAgZWNiX3Z0ID0gTklTVENpcGhlclRlc3QuY2xhc3Mu
Z2V0UmVzb3VyY2UocHJlZml4ICsgRUNCX1ZUKTsNCisgICAgICBlY2JfZV9t
ID0gTklTVENpcGhlclRlc3QuY2xhc3MuZ2V0UmVzb3VyY2UocHJlZml4ICsg
RUNCX0VfTSk7DQorICAgICAgZWNiX2RfbSA9IE5JU1RDaXBoZXJUZXN0LmNs
YXNzLmdldFJlc291cmNlKHByZWZpeCArIEVDQl9EX00pOw0KKyAgICAgIGNi
Y19lX20gPSBOSVNUQ2lwaGVyVGVzdC5jbGFzcy5nZXRSZXNvdXJjZShwcmVm
aXggKyBDQkNfRV9NKTsNCisgICAgICBjYmNfZF9tID0gTklTVENpcGhlclRl
c3QuY2xhc3MuZ2V0UmVzb3VyY2UocHJlZml4ICsgQ0JDX0RfTSk7DQorICAg
fQ0KKw0KKyAgIHB1YmxpYyB2b2lkIHJ1blRlc3QoKSB7DQorICAgICAgU3Ry
aW5nIHMgPSAiQ29uZm9ybWFuY2UoIiArIGNpcGhlci5uYW1lKCkgKyAiKTog
IjsNCisgICAgICB0cnkgew0KKyAgICAgICAgIGlmIChlY2JfdmsgIT0gbnVs
bCkgew0KKyAgICAgICAgICAgIFZhclRlc3QoZWNiX3ZrLm9wZW5TdHJlYW0o
KSk7DQorICAgICAgICAgfQ0KKyAgICAgICAgIGlmIChlY2JfdnQgIT0gbnVs
bCkgew0KKyAgICAgICAgICAgIFZhclRlc3QoZWNiX3Z0Lm9wZW5TdHJlYW0o
KSk7DQorICAgICAgICAgfQ0KKyAgICAgICAgIGlmIChlY2JfZV9tICE9IG51
bGwpIHsNCisgICAgICAgICAgICBNQ1Rlc3RFQ0IoZWNiX2VfbS5vcGVuU3Ry
ZWFtKCksIEVOQ1JZUFRJT04pOw0KKyAgICAgICAgIH0NCisgICAgICAgICBp
ZiAoZWNiX2RfbSAhPSBudWxsKSB7DQorICAgICAgICAgICAgTUNUZXN0RUNC
KGVjYl9kX20ub3BlblN0cmVhbSgpLCBERUNSWVBUSU9OKTsNCisgICAgICAg
ICB9DQorICAgICAgICAgaWYgKGNiY19lX20gIT0gbnVsbCkgew0KKyAgICAg
ICAgICAgIE1DVGVzdENCQyhjYmNfZV9tLm9wZW5TdHJlYW0oKSwgRU5DUllQ
VElPTik7DQorICAgICAgICAgfQ0KKyAgICAgICAgIGlmIChjYmNfZF9tICE9
IG51bGwpIHsNCisgICAgICAgICAgICBNQ1Rlc3RDQkMoY2JjX2RfbS5vcGVu
U3RyZWFtKCksIERFQ1JZUFRJT04pOw0KKyAgICAgICAgIH0NCisgICAgICB9
IGNhdGNoIChFeGNlcHRpb24gZSkgew0KKyAgICAgICAgIGZhaWwocyArIGUu
Z2V0TWVzc2FnZSgpKTsNCisgICAgICB9DQorICAgfQ0KKw0KKyAgIC8vIE93
biBtZXRob2RzLg0KKyAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQ0KKw0KKyAgIC8qKiBWYXJpYWJsZS1rZXkgYW5kIHZhcmlhYmxlLXRleHQg
dGVzdC4gKi8NCisgICBwcm90ZWN0ZWQgdm9pZCBWYXJUZXN0KElucHV0U3Ry
ZWFtIHR2SW4pIHRocm93cyBFeGNlcHRpb24gew0KKyAgICAgIExpbmVOdW1i
ZXJSZWFkZXIgaW4gPSBuZXcgTGluZU51bWJlclJlYWRlcihuZXcgSW5wdXRT
dHJlYW1SZWFkZXIodHZJbikpOw0KKyAgICAgIFN0cmluZyBsaW5lOw0KKyAg
ICAgIGJ5dGVbXSBrZXkgPSBuZXcgYnl0ZVtjaXBoZXIuZGVmYXVsdEtleVNp
emUoKV07DQorICAgICAgYnl0ZVtdIHB0ID0gbmV3IGJ5dGVbY2lwaGVyLmN1
cnJlbnRCbG9ja1NpemUoKV07DQorICAgICAgYnl0ZVtdIGN0ID0gbmV3IGJ5
dGVbY2lwaGVyLmN1cnJlbnRCbG9ja1NpemUoKV07DQorICAgICAgYnl0ZVtd
IGVjdCA9IG5ldyBieXRlW2NpcGhlci5jdXJyZW50QmxvY2tTaXplKCldOw0K
KyAgICAgIHdoaWxlICgobGluZSA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwp
IHsNCisgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCJLRVlTSVpFPSIp
KSB7DQorICAgICAgICAgICAgaW50IGtzID0gSW50ZWdlci5wYXJzZUludChs
aW5lLnN1YnN0cmluZyhsaW5lLmluZGV4T2YoJz0nKSsxKSk7DQorICAgICAg
ICAgICAga2V5ID0gbmV3IGJ5dGVba3MgLyA4XTsNCisgICAgICAgICB9IGVs
c2UgaWYgKGxpbmUuc3RhcnRzV2l0aCgiUFQ9IikpIHsNCisgICAgICAgICAg
ICBzdHJpbmdUb0J5dGVzKHB0LCBsaW5lLnN1YnN0cmluZyhsaW5lLmluZGV4
T2YoJz0nKSsxKSk7DQorICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0
c1dpdGgoIktFWT0iKSkgew0KKyAgICAgICAgICAgIHN0cmluZ1RvQnl0ZXMo
a2V5LCBsaW5lLnN1YnN0cmluZyhsaW5lLmluZGV4T2YoJz0nKSsxKSk7DQor
ICAgICAgICAgICAgYXR0cmliLnB1dChjaXBoZXIuS0VZX01BVEVSSUFMLCBr
ZXkpOw0KKyAgICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCJD
VD0iKSkgew0KKyAgICAgICAgICAgIHN0cmluZ1RvQnl0ZXMoZWN0LCBsaW5l
LnN1YnN0cmluZyhsaW5lLmluZGV4T2YoJz0nKSsxKSk7DQorICAgICAgICAg
ICAgY2lwaGVyLnJlc2V0KCk7DQorICAgICAgICAgICAgY2lwaGVyLmluaXQo
YXR0cmliKTsNCisgICAgICAgICAgICBjaXBoZXIuZW5jcnlwdEJsb2NrKHB0
LCAwLCBjdCwgMCk7DQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShVdGlsLmFy
ZUVxdWFsKGN0LCBlY3QpKTsNCisgICAgICAgICB9DQorCSAvLyBPdGhlciBs
aW5lcyBhcmUgaWdub3JlZC4NCisgICAgICB9DQorICAgICAgaW4uY2xvc2Uo
KTsNCisgICB9DQorDQorICAgLyoqIEVsZWN0cm9uaWMgY29kZWJvb2sgbW9k
ZSBtb250ZSBjYXJsbyB0ZXN0LiAqLw0KKyAgIHByb3RlY3RlZCB2b2lkIE1D
VGVzdEVDQihJbnB1dFN0cmVhbSB0dkluLCBpbnQgbW9kZSkgdGhyb3dzIEV4
Y2VwdGlvbiB7DQorICAgICAgTGluZU51bWJlclJlYWRlciBpbiA9IG5ldyBM
aW5lTnVtYmVyUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcih0dkluKSk7
DQorICAgICAgU3RyaW5nIGxpbmU7DQorICAgICAgYnl0ZVtdIGtleSA9IG5l
dyBieXRlW2NpcGhlci5kZWZhdWx0S2V5U2l6ZSgpXTsNCisgICAgICBieXRl
W10gcHQgPSBuZXcgYnl0ZVtjaXBoZXIuY3VycmVudEJsb2NrU2l6ZSgpXTsN
CisgICAgICBieXRlW10gY3QgPSBuZXcgYnl0ZVtjaXBoZXIuY3VycmVudEJs
b2NrU2l6ZSgpXTsNCisgICAgICBieXRlW10gZXQgPSBuZXcgYnl0ZVtjaXBo
ZXIuY3VycmVudEJsb2NrU2l6ZSgpXTsNCisgICAgICB3aGlsZSAoKGxpbmUg
PSBpbi5yZWFkTGluZSgpKSAhPSBudWxsKSB7DQorICAgICAgICAgaWYgKGxp
bmUuc3RhcnRzV2l0aCgiS0VZU0laRT0iKSkgew0KKyAgICAgICAgICAgIGlu
dCBrcyA9IEludGVnZXIucGFyc2VJbnQobGluZS5zdWJzdHJpbmcobGluZS5p
bmRleE9mKCc9JykrMSkpOw0KKyAgICAgICAgICAgIGtleSA9IG5ldyBieXRl
W2tzIC8gOF07DQorICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dp
dGgoIlBUPSIpKSB7DQorICAgICAgICAgICAgaWYgKG1vZGUgPT0gREVDUllQ
VElPTikgew0KKyAgICAgICAgICAgICAgIHN0cmluZ1RvQnl0ZXMoZXQsIGxp
bmUuc3Vic3RyaW5nKGxpbmUuaW5kZXhPZignPScpKzEpKTsNCisgICAgICAg
ICAgICAgICBjaXBoZXIucmVzZXQoKTsNCisgICAgICAgICAgICAgICBjaXBo
ZXIuaW5pdChhdHRyaWIpOw0KKyAgICAgICAgICAgICAgIGZvciAoaW50IGkg
PSAwOyBpIDwgMTAwMDA7IGkrKykgew0KKyAgICAgICAgICAgICAgICAgIGNp
cGhlci5kZWNyeXB0QmxvY2soY3QsIDAsIHB0LCAwKTsNCisgICAgICAgICAg
ICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHB0LCAwLCBjdCwgMCwgcHQubGVu
Z3RoKTsNCisgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgYXNz
ZXJ0VHJ1ZShVdGlsLmFyZUVxdWFsKHB0LCBldCkpOw0KKyAgICAgICAgICAg
IH0gZWxzZSB7DQorICAgICAgICAgICAgICAgc3RyaW5nVG9CeXRlcyhwdCwg
bGluZS5zdWJzdHJpbmcobGluZS5pbmRleE9mKCc9JykrMSkpOw0KKyAgICAg
ICAgICAgIH0NCisgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0
aCgiS0VZPSIpKSB7DQorICAgICAgICAgICAgc3RyaW5nVG9CeXRlcyhrZXks
IGxpbmUuc3Vic3RyaW5nKGxpbmUuaW5kZXhPZignPScpKzEpKTsNCisgICAg
ICAgICAgICBhdHRyaWIucHV0KGNpcGhlci5LRVlfTUFURVJJQUwsIGtleSk7
DQorICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoIkNUPSIp
KSB7DQorICAgICAgICAgICAgaWYgKG1vZGUgPT0gRU5DUllQVElPTikgew0K
KyAgICAgICAgICAgICAgIHN0cmluZ1RvQnl0ZXMoZXQsIGxpbmUuc3Vic3Ry
aW5nKGxpbmUuaW5kZXhPZignPScpKzEpKTsNCisgICAgICAgICAgICAgICBj
aXBoZXIucmVzZXQoKTsNCisgICAgICAgICAgICAgICBjaXBoZXIuaW5pdChh
dHRyaWIpOw0KKyAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwg
MTAwMDA7IGkrKykgew0KKyAgICAgICAgICAgICAgICAgIGNpcGhlci5lbmNy
eXB0QmxvY2socHQsIDAsIGN0LCAwKTsNCisgICAgICAgICAgICAgICAgICBT
eXN0ZW0uYXJyYXljb3B5KGN0LCAwLCBwdCwgMCwgY3QubGVuZ3RoKTsNCisg
ICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShV
dGlsLmFyZUVxdWFsKGN0LCBldCkpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7
DQorICAgICAgICAgICAgICAgc3RyaW5nVG9CeXRlcyhjdCwgbGluZS5zdWJz
dHJpbmcobGluZS5pbmRleE9mKCc9JykrMSkpOw0KKyAgICAgICAgICAgIH0N
CisgICAgICAgICB9DQorCSAvLyBPdGhlciBsaW5lcyBhcmUgaWdub3JlZC4N
CisgICAgICB9DQorICAgICAgaW4uY2xvc2UoKTsNCisgICB9DQorDQorICAg
LyoqIENpcGhlciBibG9jayBjaGFpbmluZyBtb2RlIG1vbnRlIGNhcmxvIHRl
c3QuICovDQorICAgcHJvdGVjdGVkIHZvaWQgTUNUZXN0Q0JDKElucHV0U3Ry
ZWFtIHR2SW4sIGludCBtb2RlKSB0aHJvd3MgRXhjZXB0aW9uIHsNCisgICAg
ICBMaW5lTnVtYmVyUmVhZGVyIGluID0gbmV3IExpbmVOdW1iZXJSZWFkZXIo
bmV3IElucHV0U3RyZWFtUmVhZGVyKHR2SW4pKTsNCisgICAgICBTdHJpbmcg
bGluZTsNCisgICAgICBieXRlW10ga2V5ID0gbmV3IGJ5dGVbY2lwaGVyLmRl
ZmF1bHRLZXlTaXplKCldOw0KKyAgICAgIGJ5dGVbXSBwdCA9IG5ldyBieXRl
W2NpcGhlci5jdXJyZW50QmxvY2tTaXplKCldOw0KKyAgICAgIGJ5dGVbXSBj
dCA9IG5ldyBieXRlW2NpcGhlci5jdXJyZW50QmxvY2tTaXplKCldOw0KKyAg
ICAgIGJ5dGVbXSBldCA9IG5ldyBieXRlW2NpcGhlci5jdXJyZW50QmxvY2tT
aXplKCldOw0KKyAgICAgIGJ5dGVbXSBsYXN0ID0gbmV3IGJ5dGVbY2lwaGVy
LmN1cnJlbnRCbG9ja1NpemUoKV07DQorICAgICAgYnl0ZVtdIGl2ID0gbmV3
IGJ5dGVbY2lwaGVyLmN1cnJlbnRCbG9ja1NpemUoKV07DQorICAgICAgd2hp
bGUgKChsaW5lID0gaW4ucmVhZExpbmUoKSkgIT0gbnVsbCkgew0KKyAgICAg
ICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoIktFWVNJWkU9IikpIHsNCisgICAg
ICAgICAgICBpbnQga3MgPSBJbnRlZ2VyLnBhcnNlSW50KGxpbmUuc3Vic3Ry
aW5nKGxpbmUuaW5kZXhPZignPScpKzEpKTsNCisgICAgICAgICAgICBrZXkg
PSBuZXcgYnl0ZVtrcyAvIDhdOw0KKyAgICAgICAgICAgIGlmIChtb2RlID09
IEVOQ1JZUFRJT04pIHsNCisgICAgICAgICAgICAgICBmb3IgKGludCBpID0g
MDsgaSA8IGN0Lmxlbmd0aDsgaSsrKSB7DQorICAgICAgICAgICAgICAgICAg
Y3RbaV0gPSAwOw0KKyAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9
IGVsc2Ugew0KKyAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwg
cHQubGVuZ3RoOyBpKyspIHsNCisgICAgICAgICAgICAgICAgICBwdFtpXSA9
IDA7DQorICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAg
ICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aCgiUFQ9IikpIHsNCisg
ICAgICAgICAgICBpZiAobW9kZSA9PSBERUNSWVBUSU9OKSB7DQorICAgICAg
ICAgICAgICAgc3RyaW5nVG9CeXRlcyhldCwgbGluZS5zdWJzdHJpbmcobGlu
ZS5pbmRleE9mKCc9JykrMSkpOw0KKyAgICAgICAgICAgICAgIGNpcGhlci5y
ZXNldCgpOw0KKyAgICAgICAgICAgICAgIGNpcGhlci5pbml0KGF0dHJpYik7
DQorICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwMDsg
aSsrKSB7DQorICAgICAgICAgICAgICAgICAgY2lwaGVyLmRlY3J5cHRCbG9j
ayhjdCwgMCwgcHQsIDApOw0KKyAgICAgICAgICAgICAgICAgIGZvciAoaW50
IGogPSAwOyBqIDwgcHQubGVuZ3RoOyBqKyspIHsNCisgICAgICAgICAgICAg
ICAgICAgICBwdFtqXSBePSBpdltqXTsNCisgICAgICAgICAgICAgICAgICB9
DQorICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShjdCwgMCwg
aXYsIDAsIGN0Lmxlbmd0aCk7DQorICAgICAgICAgICAgICAgICAgU3lzdGVt
LmFycmF5Y29weShwdCwgMCwgY3QsIDAsIHB0Lmxlbmd0aCk7DQorICAgICAg
ICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgIGFzc2VydFRydWUoVXRpbC5h
cmVFcXVhbChwdCwgZXQpKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAg
ICAgICAgICAgICAgIHN0cmluZ1RvQnl0ZXMocHQsIGxpbmUuc3Vic3RyaW5n
KGxpbmUuaW5kZXhPZignPScpKzEpKTsNCisgICAgICAgICAgICB9DQorICAg
ICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoIktFWT0iKSkgew0K
KyAgICAgICAgICAgIHN0cmluZ1RvQnl0ZXMoa2V5LCBsaW5lLnN1YnN0cmlu
ZyhsaW5lLmluZGV4T2YoJz0nKSsxKSk7DQorICAgICAgICAgICAgYXR0cmli
LnB1dChjaXBoZXIuS0VZX01BVEVSSUFMLCBrZXkpOw0KKyAgICAgICAgIH0g
ZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCJDVD0iKSkgew0KKyAgICAgICAg
ICAgIGlmIChtb2RlID09IEVOQ1JZUFRJT04pIHsNCisgICAgICAgICAgICAg
ICBzdHJpbmdUb0J5dGVzKGV0LCBsaW5lLnN1YnN0cmluZyhsaW5lLmluZGV4
T2YoJz0nKSsxKSk7DQorICAgICAgICAgICAgICAgY2lwaGVyLnJlc2V0KCk7
DQorICAgICAgICAgICAgICAgY2lwaGVyLmluaXQoYXR0cmliKTsNCisgICAg
ICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDAwOyBpKyspIHsN
CisgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHB0Lmxl
bmd0aDsgaisrKSB7DQorICAgICAgICAgICAgICAgICAgICAgcHRbal0gXj0g
aXZbal07DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAg
ICAgIFN5c3RlbS5hcnJheWNvcHkoY3QsIDAsIGxhc3QsIDAsIGN0Lmxlbmd0
aCk7DQorICAgICAgICAgICAgICAgICAgY2lwaGVyLmVuY3J5cHRCbG9jayhw
dCwgMCwgY3QsIDApOw0KKyAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJh
eWNvcHkoY3QsIDAsIGl2LCAwLCBjdC5sZW5ndGgpOw0KKyAgICAgICAgICAg
ICAgICAgIFN5c3RlbS5hcnJheWNvcHkobGFzdCwgMCwgcHQsIDAsIGxhc3Qu
bGVuZ3RoKTsNCisgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAg
YXNzZXJ0VHJ1ZShVdGlsLmFyZUVxdWFsKGN0LCBldCkpOw0KKyAgICAgICAg
ICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgc3RyaW5nVG9CeXRlcyhj
dCwgbGluZS5zdWJzdHJpbmcobGluZS5pbmRleE9mKCc9JykrMSkpOw0KKyAg
ICAgICAgICAgIH0NCisgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRz
V2l0aCgiSVY9IikpIHsNCisgICAgICAgICAgICBzdHJpbmdUb0J5dGVzKGl2
LCBsaW5lLnN1YnN0cmluZyhsaW5lLmluZGV4T2YoJz0nKSsxKSk7DQorICAg
ICAgICAgfQ0KKwkgLy8gT3RoZXIgbGluZXMgYXJlIGlnbm9yZWQuDQorICAg
ICAgfQ0KKyAgICAgIGluLmNsb3NlKCk7DQorICAgfQ0KKw0KKwwgLy8gQ2xh
c3MgbWV0aG9kcy4NCisgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQ0KKw0KKyAgIC8qKiBDb252ZXJ0IGEgaGV4YWRlY2ltYWwgc3RyaW5nIHRv
IGEgYnl0ZSBhcnJheS4gKi8NCisgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQg
c3RyaW5nVG9CeXRlcyhieXRlW10gYnVmLCBTdHJpbmcgc3RyKSB7DQorICAg
ICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWYubGVuZ3RoICYmIGkgKiAyIDwg
c3RyLmxlbmd0aCgpOyBpKyspIHsNCisgICAgICAgICBidWZbaV0gPSAoYnl0
ZSkgSW50ZWdlci5wYXJzZUludChzdHIuc3Vic3RyaW5nKGkqMiwgaSoyKzIp
LCAxNik7DQorICAgICAgfQ0KKyAgIH0NCit9DQo=
--1439763957-861381847-1024354888=:28747--


From raif@fl.net.au  Tue Jun 18 11:39:51 2002
From: raif@fl.net.au (Raif S. Naffah)
Date: Tue, 18 Jun 2002 20:39:51 +1000
Subject: [Classpathx-crypto] DOS characters in shell scripts.
References: <20020615074621.GA8468@zipworld.com.au>	<3D0BF713.7000500@fl.net.au> <87znxvjvkr.fsf@pooh-sticks-bridge.tapsellferrier.co.uk>
Message-ID: <3D0F0DF7.8030204@fl.net.au>

hello Nic,

Nic Ferrier wrote:
> "Raif S. Naffah" <raif@fl.net.au> writes:
> 
> 
>>yes you're right; i just checked them with (gVIM + Cream) --which i  
>>should have done instead of using that "intelligent" expensive IDE (you  
>>know what i'm talking about!). 
> 
> 
> A suggestion: use emacs on Windows, it does all the line ending
> conversion for you.

i'll pass on this one.  the features that the IDE i use has, far 
outweigh the few problems that it causes.  vim is enough to help me 
show/fix line-ending problems if/when they appear.


cheers;
rsn



From raif@fl.net.au  Tue Jun 18 11:53:17 2002
From: raif@fl.net.au (Raif S. Naffah)
Date: Tue, 18 Jun 2002 20:53:17 +1000
Subject: [Classpathx-crypto] PATCH: NIST cipher tester
References: <Pine.LNX.4.44L0.0206171531480.28747-200000@gradius.dreamhost.com>
Message-ID: <3D0F111D.70906@fl.net.au>

hello Casey,

thanks for your contribution :-)  it's a nice addition to the test suite 
of this library.

may i rename the "NISTCipherTest" to "TestOfNISTVectors" ?  it looks 
nicer with the other classes + i think conveys better what it is 
supposed to do.

...and yes, you guessed right; it is UMac32!

i'll generate (the test vectors) and test the new class before i check 
in the lot with all the corrections/amendements.


cheers;
rsn

Casey Marshall wrote:
> Hello,
> 
> I've put together a (fairly simple) cipher testing program that will read
> in the standard test vector files that the NIST AES submissions required;
> all that is involved in testing an algorithm foo with a 128 bit block size
> is putting all the test vectors in a directory `tv/foo-128', then
> instantiating the class test.cipher.NISTCipherTest. The class loads test
> files with the `getResource' method of java.lang.Class, so the vector
> files can simply be put into gnu-crypto-test.jar.
> 
> The patch only adds the class itself, and updates the build scripts and
> test.cipher.AllTests. I didn't include the test files for the three AES
> submitted ciphers in Classpathx, because they're probably far too big for
> this mailing list.
> 
> I've also noted that in the file `Makefile.in' there is a line that says
> `gnu/crypto/mac/UMash32.java' which I'm guessing should have read
> `gnu/crypto/mac/UMac32.java'.
> 
> Cheers,
> 
> ...



From raif@fl.net.au  Sun Jun 23 07:07:57 2002
From: raif@fl.net.au (Raif S. Naffah)
Date: Sun, 23 Jun 2002 16:07:57 +1000
Subject: [Classpathx-crypto] latest check-ins
Message-ID: <3D1565BD.3070006@fl.net.au>

hello there,

yesterday, i checked-in the following:

* latest contributions from Casey,
* modified versions of NistKat and NistMCT to generate the test vectors 
in separate files which makes using them, from Casey's 
TestOfNistVectors, straightforward.
* modified the build.xml to output the NIST test vectors in a 
subdirectory "nist" under tv/ and the NESSIE tests under the 
sub-directory "nessie" under tv/.
* corrections to the Makefile.in (in root directory),
* amendements to the same as well the both Makefile.am and Makefile.in 
(in gcj) and the Makefile.in (in gcj/source) to (a) include the new 
source(s) and (b) to invoke the NistKat and NistMCT tools with the new 
options.
* updated Casey's contributions in AUTHORS.

i think the modifications in the gcj related makefiles are incomplete. 
can somebody with a working gcj test this please.

i'll talk about the testing side of the library in a separate message.


cheers;
rsn



From raif@fl.net.au  Sun Jun 23 08:32:15 2002
From: raif@fl.net.au (Raif S. Naffah)
Date: Sun, 23 Jun 2002 17:32:15 +1000
Subject: [Classpathx-crypto] on testing (long)
Message-ID: <3D15797F.4020203@fl.net.au>

hello there,

test.cipher.TestOfSerpent is a model for testing a cipher's correctness, 
and i would like us to think on how we can use this pattern for testing 
all our symmetric key block ciphers.

things to consider:

* we should also test for the cloneability of our ciphers.  this can be 
as as easy as:

    a. initialise a cipher instance,
    b. encrypt one block,
    c. clone the cipher,
    d. encrypt a second block with both the cipher and its clone,
    e. verify that the result from both is the same.
    f. repeat the exercise with decryption.

* the TestOfSerpent uses test vector values that are hard-coded in the 
class.  should we (a) continue doing that, (b) use something similar to 
TestOfNistVectors where the test vector values are read from files in a 
pre-designated location, or (c) combine both approaches?

having hard-coded values that must be processed correctly for the test 
to pass, works around the fact that TestOfNistVectors does not fail if 
it cannot locate the files it is expecting.

besides, having hard-coded values inside the test-case, allows 
application of the (more or less) same pattern to non-NIST ciphers.

i'd go with (c).

* if we go with (b) or (c), how many hard-coded test vectors should we 
use?  --all of them is out of the question because of size and speed. 
theoretically one value should be enough, but 3 is more "re-assuring."

* should there be any special criteria for selecting the agreed number 
of test-vectors? or throwing a dice would suffice?

* once we have coded those TestOfxxx for our ciphers.  should we still 
keep the selfTest() method in the API and implementations?

in its actual form the setlfTest() for the ciphers only test for 
symmetry, which may be true even for incorrectly implemented ciphers. 
in other words it's almost useless!

we should change it to either (a) something similar to the selfTest() of 
hash algorithms, (b) something similar to the TestOfxxx discussed above 
with some hard-coded test vectors, or (c) get rid of it altogether!

* if we get rid of the selfTest() method in the API, how can we 
guarrantee that noone/nothing would replace our "tested" implementations 
with their (probably) insecure/leaking ones?  would a signed jar be enough?

* the test vectors generated by, at least, the NistKat and NistMCT tools 
should be included in the distribution, since they are used by the 
TestOfNistVectors, which (a) if amended to be more rigourous, and (b) 
passes all its tests for the test vector files, would constitute a 
comprehensive "bill-of-health" for the correctness of a cipher's 
implementation.

relying on the NistKat and NistMCT tools to generate them in-situ is not 
a valid option IMO.  a conscientious user would download these test 
vectors from a different source (NIST itself, the home page of the 
algorithm designers, or a trustworthy site/distribution), and only then 
run the TestOfNistVectors over them.

so am i contradicting myself? no.  am i putting more stringent 
conditions on what to distribute and how to distribute it? may be.

let me explain.

+ the NistKat and NistMCT tools are used only for (a) generating test 
vectors for new cipher implementation, and (b) for bootstraping the process.

+ once the test vector files are generated, they are "certified" (by a 
process which i still dont know how).  the end result would be a 
signed-jar for each of the NIST-compatible algorithms; eg. aes-tv.jar 
for the AES test vectors.

+ the gnu-crypto.jar is signed.

+ the TestOfNistVectors, or similar class, would use the cipher 
implementation from the gnu-crypto signed jar with the test vectors from 
the cipher's test vectors signed jar to assert the correctness of that 
cipher.

does it make sense?

* whatever we come with from the discussion of the previous point, a 
third jar, grouping the test vectors, and separate from the 
gnu-crypto.jar and gnu-crypto-test.jar should be considered.


comments and suggestions are welcome + cheers;
rsn



From Casey Marshall <rsdio@metastatic.org>  Mon Jun 24 08:35:42 2002
From: Casey Marshall <rsdio@metastatic.org> (Casey Marshall)
Date: Mon, 24 Jun 2002 00:35:42 -0700 (PDT)
Subject: [Classpathx-crypto] on testing (long)
In-Reply-To: <3D15797F.4020203@fl.net.au>
Message-ID: <Pine.LNX.4.44L0.0206232244130.25014-100000@gradius.dreamhost.com>

On Sun, 23 Jun 2002, Raif S. Naffah wrote:

>
> [...]
>
> i'd go with (c).
>
> * if we go with (b) or (c), how many hard-coded test vectors should we
> use?  --all of them is out of the question because of size and speed.
> theoretically one value should be enough, but 3 is more "re-assuring."
>
> * should there be any special criteria for selecting the agreed number
> of test-vectors? or throwing a dice would suffice?
>

I would go with (c), too. As far as the number of test cases to hard-code,
I would recommend *at least* two of each of the monte-carlo tests, so there
is at least one change of key. This is because if a test only does the
first monte-carlo test, a problem with endianess *could* sneak by, since
the all-zero key looks the same regardless of endianness (this did happen
early on when I was working on the Serpent implementation, when I only
checked the all-zero key).

For the known-answer tests I would recommend using texts/keys where a bit
is set somewhere in each byte/nybble/word, to try to cover a range, not
just the first few.

Other than that I would simply use a Comfortable Round Number.

> * once we have coded those TestOfxxx for our ciphers.  should we still
> keep the selfTest() method in the API and implementations?
>
> in its actual form the setlfTest() for the ciphers only test for
> symmetry, which may be true even for incorrectly implemented ciphers.
> in other words it's almost useless!
>
> we should change it to either (a) something similar to the selfTest() of
> hash algorithms, (b) something similar to the TestOfxxx discussed above
> with some hard-coded test vectors, or (c) get rid of it altogether!
>

I would go for encrypting a known text, comparing the ciphertext with a
known answer, then decrypting it to see if it results in the plaintext.

-- 
Casey Marshall < rsdio@metastatic.org > http://metastatic.org/



From raif@fl.net.au  Mon Jun 24 11:38:48 2002
From: raif@fl.net.au (Raif S. Naffah)
Date: Mon, 24 Jun 2002 20:38:48 +1000
Subject: [Classpathx-crypto] on testing (long)
References: <Pine.LNX.4.44L0.0206232244130.25014-100000@gradius.dreamhost.com>
Message-ID: <3D16F6B8.8060203@fl.net.au>


Casey Marshall wrote:
> On Sun, 23 Jun 2002, Raif S. Naffah wrote:
> 
> 
>>[...]
>>
>>i'd go with (c).
>>
>>* if we go with (b) or (c), how many hard-coded test vectors should we
>>use?  --all of them is out of the question because of size and speed.
>>theoretically one value should be enough, but 3 is more "re-assuring."
>>
>>* should there be any special criteria for selecting the agreed number
>>of test-vectors? or throwing a dice would suffice?
>>
> 
> 
> I would go with (c), too. As far as the number of test cases to hard-code,
> I would recommend *at least* two of each of the monte-carlo tests, so there
> is at least one change of key. This is because if a test only does the
> first monte-carlo test, a problem with endianess *could* sneak by, since
> the all-zero key looks the same regardless of endianness (this did happen
> early on when I was working on the Serpent implementation, when I only
> checked the all-zero key).

good point!


> For the known-answer tests I would recommend using texts/keys where a bit
> is set somewhere in each byte/nybble/word, to try to cover a range, not
> just the first few.
> 
> Other than that I would simply use a Comfortable Round Number.

let's say 5 values for each test, which makes a total of 30 --including 
the KAT ones.  the position of the bits for the latter, should be 
selected at random.


>>* once we have coded those TestOfxxx for our ciphers.  should we still
>>keep the selfTest() method in the API and implementations?
>>
>>in its actual form the setlfTest() for the ciphers only test for
>>symmetry, which may be true even for incorrectly implemented ciphers.
>>in other words it's almost useless!
>>
>>we should change it to either (a) something similar to the selfTest() of
>>hash algorithms, (b) something similar to the TestOfxxx discussed above
>>with some hard-coded test vectors, or (c) get rid of it altogether!
>>
> 
> I would go for encrypting a known text, comparing the ciphertext with a
> known answer, then decrypting it to see if it results in the plaintext.

so a symmetry test but with known values.  yup; sounds good.


how do you want to split the work?


cheers;
rsn



From Casey Marshall <rsdio@metastatic.org>  Tue Jun 25 08:53:07 2002
From: Casey Marshall <rsdio@metastatic.org> (Casey Marshall)
Date: Tue, 25 Jun 2002 00:53:07 -0700 (PDT)
Subject: [Classpathx-crypto] on testing (long)
In-Reply-To: <3D16F6B8.8060203@fl.net.au>
Message-ID: <Pine.LNX.4.44L0.0206250013150.17379-100000@gradius.dreamhost.com>

On Mon, 24 Jun 2002, Raif S. Naffah wrote:

> > For the known-answer tests I would recommend using texts/keys where a bit
> > is set somewhere in each byte/nybble/word, to try to cover a range, not
> > just the first few.
> >
> > Other than that I would simply use a Comfortable Round Number.
>
> let's say 5 values for each test, which makes a total of 30 --including
> the KAT ones.  the position of the bits for the latter, should be
> selected at random.
>

I think for the KA tests the number of tests should depend on the length of
the key/text, by (say) using the word 0x80000000 at all the possible word
(dynner, 32 bit) aligned offsets, e.g.

   8000000000000000000000000000000000000000
   0000000080000000000000000000000000000000
   ...etc.

just because it is seems less arbitrary and spans the space of keys/texts.

> [...]
>
> how do you want to split the work?
>

I could do the TestOfXxxx classes, maybe make a general superclass that
does the work, and subclasses that simply fill in the test vectors.

-- 
Casey Marshall < rsdio@metastatic.org > http://metastatic.org/



From raif@fl.net.au  Tue Jun 25 10:03:40 2002
From: raif@fl.net.au (Raif S. Naffah)
Date: Tue, 25 Jun 2002 19:03:40 +1000
Subject: [Classpathx-crypto] on testing (long)
References: <Pine.LNX.4.44L0.0206250013150.17379-100000@gradius.dreamhost.com>
Message-ID: <3D1831EC.3090302@fl.net.au>

Casey Marshall wrote:
> On Mon, 24 Jun 2002, Raif S. Naffah wrote:
> 
> 
>>>For the known-answer tests I would recommend using texts/keys where a bit
>>>is set somewhere in each byte/nybble/word, to try to cover a range, not
>>>just the first few.
>>>
>>>Other than that I would simply use a Comfortable Round Number.
>>
>>let's say 5 values for each test, which makes a total of 30 --including
>>the KAT ones.  the position of the bits for the latter, should be
>>selected at random.
>>
> 
> 
> I think for the KA tests the number of tests should depend on the length of
> the key/text, by (say) using the word 0x80000000 at all the possible word
> (dynner, 32 bit) aligned offsets, e.g.
> 
>    8000000000000000000000000000000000000000
>    0000000080000000000000000000000000000000
>    ...etc.
> 
> just because it is seems less arbitrary and spans the space of keys/texts.

i'm not sure.  if the cipher is not correctly implemented, it's highly 
unlikely to pass some KATs and fails others.

even if this is the case, a cipher implementation should be deemed 
correct iff it passes *all* the tests!


>>[...]
>>
>>how do you want to split the work?
>>
> 
> 
> I could do the TestOfXxxx classes, maybe make a general superclass that
> does the work, and subclasses that simply fill in the test vectors.

excellent;  a base test-case for the TestOfxxx ciphers would be great!

i'll do the selfTest() implementations.

ps. checkout the latest TestOfSerpent and Util before you start.


cheers;
rsn



From Casey Marshall <rsdio@metastatic.org>  Thu Jun 27 12:13:33 2002
From: Casey Marshall <rsdio@metastatic.org> (Casey Marshall)
Date: Thu, 27 Jun 2002 04:13:33 -0700 (PDT)
Subject: [Classpathx-crypto] on testing (long) [plus patch]
In-Reply-To: <3D1831EC.3090302@fl.net.au>
Message-ID: <Pine.LNX.4.44L0.0206270337110.11003-101000@gradius.dreamhost.com>

  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

--1439763957-1681508471-1025176231=:11003
Content-Type: TEXT/PLAIN; charset=US-ASCII
Content-ID: <Pine.LNX.4.44L0.0206270412151.16549@gradius.dreamhost.com>

Patch for the test classes is attached. It consists of a base test class
and the five TestOf* classes modified to make use of it.

On Tue, 25 Jun 2002, Raif S. Naffah wrote:

> Casey Marshall wrote:
> >
> > I think for the KA tests the number of tests should depend on the length of
> > the key/text, by (say) using the word 0x80000000 at all the possible word
> > (dynner, 32 bit) aligned offsets, e.g.
> >
> >    8000000000000000000000000000000000000000
> >    0000000080000000000000000000000000000000
> >    ...etc.
> >
> > just because it is seems less arbitrary and spans the space of keys/texts.
>
> i'm not sure.  if the cipher is not correctly implemented, it's highly
> unlikely to pass some KATs and fails others.
>
> even if this is the case, a cipher implementation should be deemed
> correct iff it passes *all* the tests!
>

Absolutely. I decided to just use sequential texts (shift one bit to the
right each time) instead of random/arbitrary ones. It is simpler to program
and to produce tests, and the monte carlo tests exercise the algorithms
enough that errors are unlikely to sneak by.

Cheers + goodnight,

-- 
Casey Marshall < rsdio@metastatic.org > http://metastatic.org/

--1439763957-1681508471-1025176231=:11003
Content-Type: APPLICATION/OCTET-STREAM; name="patch-tests.gz"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.4.44L0.0206270410310.11003@gradius.dreamhost.com>
Content-Description: TestOf* patch
Content-Disposition: attachment; filename="patch-tests.gz"

H4sICM3xGj0AA3BhdGNoLXRlc3RzAOxca3PbNpf+3Mzsf8BmMx05lmXeL3aa
CXhrvW0uYyvbzXayGZqiLMayqJek7Hg7+e/7ACAlkpYl2ZGbdsaaxJbJg4OD
c3nOAQlgkAyHZO9NOMtIlF1Pi3Q/T2dZFO8XcV7sR8l0FGf7TpjHffzd+xxe
hiVdT15L+WRvb29Trj/8Hg+IF0dElYlsHEgS/hHZNuwnu7u7m3f5Q380I/85
mxDFJJJ2IKkHqkQUSVKevHpF9qSuRHblrmbL5NWrJ7vTMDoPz2LCuPUEt8Mn
u0929/fJ3hY/nOGzo8Ez9oX/4abT6yw5GxWk4+5w8bokyOKYnKTD4irMYhKk
s8kgLJJ00iVHk6g3b9ofJTmZZulZFl4QfB2yZnnZ7JBcpzMShROSxYMkL7Lk
dFbEJClIOBnspxm5SAfJ8BoXOC90EWekGDENZBc5SYf8j5/fvCc/x5M4C8fk
3ex0nETktySKJ3lMQvTNruQjWOv0mpMzwTm7JcIfkjgBTUYu4yzH30SpOqk4
QqhOWDC5M5JOWZsdCHvNGY7DYtH0dhUsRjogyYRzH6VTDGoExhj7VTIek9OY
zPJ4OBt3CSjJ70f9X96+73N+9M0H8js9PqZv+h8OQV2MUlDEl7HglVxMxwlY
Y2hZOCmu2Qhe+8fuL6CnztFvR/0PGAXnFBz13/gnJyR4e0woeUeP+0fu+9/o
MXn3/vjd2xO/R8hJHK9T8rDkdpFCl4O4CJNxvhj9B1g4h4TjARmFlzEsHcXJ
JeRDYMKtNjHiOJ2c8XFyhkVNnYckL+UbJuOYuG/ffTh68zPEPhqSSVp0yVWW
wKGKlNHMRcLnNu/lztutqHSb9GOoMybvxmEUkz1yMmP8VFWa0zhpXjCvf02J
pMiyvCerklndfH9C573SHEPOp3GUYIjxlyieinBJhjwKxsnkXIxtnJxmYXbN
R0xS7o5sdDkbBsY9mEXCfxE28Zc4mhXh6TjuNtsOUtBDA8zpkyKPx0OEGRyK
6yqL89m4SCZnnM2CB+sAfhelcOFFvNxuGeiZ+/Z8MJzfvOtRegWnzODjl+E4
gX5jFinliLI4zNNJTq5GopeaFNyUFwxuOL87SfQAYPhkFxGVZgX5PJskRW8I
t4uv0uy8x0DcBZgf1mmA6b1ZkYx7v4T56HU4rd88m8x6ZWYQ6N07csZpdO5W
UH6TjrN6jx8C6J8/f7JLniNWz9jwMW7Bh2cEGDgvQYQhKjTGoDOsSBgsxBfx
pBB+foYYnHBmcMq4YGF4PkmvJjBRfgUE65F+umgDIt4FqEIyDbMiiWbjMCt5
dzmffHYajcM8F44IAK/AbX5jkIpQTcfj9Arud8Da8bYv0vFL/gWfF+PkZcAg
sGrOJI5KuQgDteucdMqbf77icfMfGML7aWfnK7mIAYeDnV7FrT+KGYSIQVVA
dFphRoYxvUheTl7sJy/FCCtK8I/DaFTCU8WNkaDzX2mfJYLXbn+n92If8tZl
P5orbYWA3VJBGNykSFhoMGKhznlnPBpZl/FgVTdhpSLBmryI0kH8MmdI9WKf
fxdekcXFLEPIhRWbUrZlfs1x7quAIMGPXX07/O8vX770uDVL1hWvMBfGShG7
YXY2EwoQBo8Q6EU2i4o0uzmOt3DULBmU2DAs03tePC+Hk0MJcBeOk7jHoI2j
y9w35xLAd6fAx2km9MmKpFVaQ3eT+KrVF0PiSdzQ94v90jnFX9OX/VLCvMtG
PZejyuZwfq4g3M2EWd8cnfRFdO1VXjwZcG4XKdrtRWE2TiuWV6MEbgeieK4K
lmEvQjgeAHweVdQ/gWIvpnGRFKLcYMAAF59FI5YMmNsLd2VicG8YMEas4R5C
8iIp2JUOruTJRYJo3in9Lz/kvLg5WboawrVYb3lxDeOy6K9Kr0YXjF5WrC6q
YEW4t6IbnNMpippzWG4cT86KUQ7dThsKPY6HGO4kivOD6tYNRHgRklEWD396
OiqK6cH+fpRnUW+CSqp3ll7uozHDS+hhP4zz/fOwuIiK8ldvVFw8ffkrU3/F
kAor9IXskPQ1swNxuR3E1VJTSPjQVM4KOnh8+JJfD+eM4i/TcTgRiFrzXcFU
YB2zXHVvnnhFQr/VyV5V5eez4/gyYd+eseuoI6Yi3YWnCKgwKoSnkWpKAXmK
eAI3rlIT+ZOlDQjKi3iBNkK4yxBhcsqEqO5vNWUKlrQEU4FkGPNY+C/yODAh
AiCV+hJCIHiLOGJeWQLaCerkydkfH8ll8QmudbgBla1sQAXHXEt1vlGP5xv1
eL5Jj3DVT3F0+inepOMa8fr+F8R3EGNwFzEGdxFjsKkY0Wm0uTZK4s3EEMR3
EGNjbZTEm4tRaaNFXq8MSW2uX4tlkVEfLoAXwlT40hHSkwlKhR2GLYR/8tk0
zjr8ohj115qkHKDK9PpwWMMLY3yek3dxxkAXVVEFcXss9zTSL8OcLs+eIR/P
Apvzcp4peInqdSrm01VhXN6saF6BB+b1Vd3Y53OZqdCbsFsBVJ43q+jLqrw/
r/raBOeCl8iZVQLBSLoCQIu4xlJUdgQeEbOZb4jiWaQhFAMRqpkuGYZj9vCC
Tb2uEj5P4k33lzvpaYoyjmc5Qv7r15rl4bflQLvLPJTJhlSf70DYLL3KiV/N
DBfOUs6LSFiwhyDkJ16ElRc7pf/gw0aI3qZFScH/LjUVzTKUCwXv/yT5v7iz
87HdLrpnu/PTervzfEFwfvqH9BE3O+zODpG+WNL8nhhLbzorOmVXv/ofPr2m
ff/4iP7WRdvFwFgB0WFqSsBMOsSvF3PXEsbGtd1dHl4/VL4B54wLrp35pQRF
e0d03LhelkJ8kJ0p3FyCp7NfggpVdOffy/7+SD724n/N4BodNsXsFamwcicq
dnZq8S0+pZNxT+KsvrIf+SgZFp36AL9WX2pe2YKFldHKwuUxXO8drv3HcGWf
abGdcL0RgI3LrSD8hgj/LmE7Lb45bOsz2MUsrAzZWV6Fq+867GF+3GNRUnER
DxbKUVWPKvgDntaDmsW8qRaiJBwW/GEJ58Uf1mCOm4XVbPjvHPXJlqP+tesL
3UPPd4x93n5b8X97PH4ngBjfuSEP3C753LiQDodgA2vvkVtZ3BFemmixxVpg
Hvk1HOCdfBadfEYnsoQPvpa863jBkAaUPxEbnxt38Tm5zov4osfjlL3B6UQC
rcZRhVql7AuNtBBGfDYBvk36na7q9uvdwfMH1m4Zat6izV3SGc8734On7EDB
iyvkxx+5ynFjucJRWH7+SP73J9bmj8+7bWYfW8O5VQrmoy/ArdXvnNvtve+i
KZeACbC8vy1kh0H84NlhOg4RrdtMDguO/+Dc4MWPuWFZbrhzh4+54a65oQTn
8UqQJrflhhIyRG6ow/3a3FBPJN+eG6bfkhumN3LD9B65YSpyw3SruWF6h9ww
fcjcsGLm4Dru48zhL5g5QM+P2aHW7u4zh7JhcnnPrAL0/8cmlvvlE056LkjP
m3h0voSc8Mc65xyOkkt8WZ1E7j1R2dbMJLlc3c+NduPmlGb8OKf5585ptpW3
Huc0q+Y0j1nrW+c0j1lrCfI87Cxo+kCzoO+TTu+c5Zpzs+XKeJybfYe52Ql7
KcQhvXoZy7B9n7+QZbBQZqp0ErMcElXr6gnfGnJLBgJCsozBcwOj5y+e2kif
XLIVmyXOX6bJoHw/NUfZ2vA57hwugwSoJPnI4lJiOkzqShXYMG9VUlYvBzsd
ceFHIn1hbvDy5UsiL6iZGy54Ny0BtnW9M9JGx8vsltz2XvKm4WoLaY746j0o
/S9cS3PCF7eS/PoCnWbXYk1t03ZiPSK3Gbt7Eo+H/AV0beCsZV0LYZ5j1tyH
J3ae5hX9U0RCiXdsIRHa75KnOwfkabe6PCfdqb20JFFYoA7qLDJ53FT5MEzG
ZYXQuwzHs/jtsBPXOdwWDP1aGCxfQZSvVkW5cGZDRZTUt6sBYMYRrlqQIxYo
dufljWzsNBD0m5mzVbwVc0XbLnNFNxbMVeU7WHT5KpN1Ju3fyaT9jRUjKMUq
1w1Neh/mG5v0Hsy/m0njMaYJWTphu2Ewn8I04ZxPvFY9YFxj58br9A2t3Wiz
SnNk2afRurESeDN3eJjeN/WXB+n97+1QrZn/WoeqvYPb2KFqbe6h1Frrxpru
TR3qIXrf3KEeoPfv5lDlY5VTNoEj0SjEHHRytjWMYo9A7opRrM3945S1bqzP
vyNGbbX3O2PUNnv/u7vUPVHqTi5Va3P/SK2r9T4otdXe74xS2+z9L3SpfUKr
fWTV/kexU6u+p7G+V6vayfuQu8Zqj9yzeMo2FrI5PnNPjOqQ71WeTWu7Zedb
7fhOycu4tiem5efzTXPiCYPYkHvjUTCU9fXJYJNTRsSOWDqZnSb5+pNGblCv
OW3kBv0P/VnMTxwhGjsqRDcOJIudxSGvPXFkCavaqSPqgW4f6PLi1BG5a8ns
2BFFttmxI3vLjh35tyd7+LflvfaC47OjwQG5IXL3ksg9hY93X1b2JY3ISqmD
LEyGsN+UPOMMBJcbR5bIa04sqbXd0pklgtn2Di0R/LZ5aong2Dy2ZIUevuHg
EsFwKyeXCFZbO7pEsGucXVJTwTZPLxEc7318SU0qsu4AkznZqhNM5kRLjzCZ
331/Qmtdb/MUE8Hx248xEXy2eI6JYLjFg0wEwzvJ9CDwin8rDjM5XH2bn3Wy
moQ71w0a9qxtlnCC49lkMk8ftx6LInD/cBVJ4+SUpYSLo1PKZPX8OX6irnDT
Cd+Wzx6mF/PN/vxMBd5v66iUHm8lmt7cmH/A09IzfpuFSFlriH359Sy2ZG++
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
LQd2+SD0lmsZ3tXnbFv1lgsKcPV53OI5Plm95SrpG+3yiekt6b7llo6TK82a
VDSrZjuI6L/maowJRWv5bDxVLX+TRa8qS7BcNYc8rAWZQtqF5pQvoosIcga3
okzpJargK22QYOwgcONmmSm4HqmVpIxc27aUs/ExkmLqPV6O0DPuGEtWJhc3
rJvb0ILJVKnWbtiwnFGyM8ql0vC3RhskZ7tLinShlFv2HY9rbSxyi2q41ipS
lJRME4UYjFXxGDBi59T52vqBVir1wlaRPAVPjxuLa9k1baq3WuWbRT7bF8tU
6zaRqAAouiRCNMx5JktRs/XZ2q6mOW/V+KqCcjpnxaOcIznFGkeE3kXoN815
TcXgkrZqKzLNrWvAWwYKbyNbjLbRsayMTG6VVXGudRIFDl26WnSUelaJWHft
/TUliYLlmguc4EKyXouBZhbdIzxdu2LdtgWlbQOtja1R3hOxtVlP1qPgdcEc
ikQAkz0N1BV27LrJiYr3o0XxWE3BfVPSJiN85IxQo+fslBLxmLa8ZonnEiEf
cnfF2brXLr0WP62OhevNtEP/wofQtO2j6wL4EIz60XXCexituz66bnAPw6wf
XUe0A5r1VjqM/zh9+dOL5ydnuyoxVo7fSYuxcsa+aozhYmP/K+0eYv+rlUEf
FRlHRcZRkXFUZBwVGfsA7AeiyLhC/t9ek3F150OrMhbXPeoyBosclRl3U2Ys
2NHHqs1YOMhRnbHyOqozjuqMozpjG7k9qjOO6ox7V2cseOyN+ox5iC0o4l4C
jWtE80FINDaQvZ1FGktc4CjT2MQAP3Ghxv03xlKtVmurLcHo5l1w3udKOWmn
KbcybIguquCfrwkHBZuke0IiFaPrqXpjxuZEXWWXo84lyk7XzCV52cfdMvWu
rrX9yLqZ3nujpLVTiiv1ZqRZUvad4rD8zikpZ4rVvrMrOXPMwRhlOlnrqW9o
fLS9MVZtRL4W6QCV2Hh2ikxVphTddMYNRxGAY80OQwjRdq7VpKTZGnIcrCrD
Jl5VWg/OWm1ZG7auWq0MBs6q+9DGRmHSDMhXy9Ul72020h4kKZNi1pliu96q
oGqVdVK5pOydroFUihxVwtPY9e0EdmiM1axPoZasORuFq+uWS0+UkjHZRz/0
evAq+mKc8rIx2Uj/G+uISmoulsZqbMbDteMRCU6ktPMpSiuhwjoy2JCpQzOO
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
nlo3eyL/+Wlyb72SdvBpn928kja7cSVtq27sxvPna22zbWtts8Uh19fa5m76
9a6KsZsFY1Ncff75JPj65vyP/R9nZ/JF0BtUY//3b9Py8MZBvZ2uM0jKvvny
/I+f3bQgOD95sR44m31+gwDNzqZVwbWrhZPCf50s7eoW11VpaxcXx8OX1hZn
69VkE5aPK46z2YGXoWbTJVdWHOdDHRcc5+lo64Lj1el4e0pKS8+3vN64eLzV
Rcj38IC30aJNozroiuX194clyHeHz7Zc7sqcgoLBP9XamdmTEJ5qEB8BwsvX
DcueV/noatVzmJ9x1fNqiq6vhr7fWVorhVtRwu0ihHuzQLXFsbcUwG3Rv91e
/ra44KX47bPfX1n+L8s7Wufbi9YZ5NvnF3/5dtka00Lss9mrq8Xgq4XZr4cD
zi+GA57O/jb+aXHOq+//qp7hzUfyzuOZ+l9Si/dOgWGneO/dX8YJefF65Ve8
/v37lye4mzzbYlq++PH5q5NvT3599Or7aV/S16unXB0138z26Pzi6UzJmKf/
cKV1Jy1P79xS04aplYMuX5KpvgCVaf/9j+dnj+Sy018uXmc88pv+8+sfL6dv
voP3r6fPHj8eb3f65MnyX97O/ucH0fc8evPD6d8v8FyPZ7/7HWz1zXz9+4uz
k5/+6+KHlausWnIy/fKkGPds9c3N8/JRGp7N/oZncwfDW/NJGx6V9N6GxzWu
GX5XIH33KLMns51xdB1YfncQsBwP2Ayd5xcfB3R+dwhHurgjdJ5fvHOki03Q
eR0pJZE+R7Hxz5OfX79ZOvKmOZmtgYKPbxbuhKPDLKzH0euweZyFDbNwN1Bd
nYUdQfVkE6h+twFUT3YG1T8VYbit5PkmfkTnbwyxE4w+nb3ciKLy0cKjS3+a
7LYiD5mb72sx++MDeNh0s5eXN3uJm2n57g/8uObqd/VHvP7865uLkx+/kH0P
v8regkfzM+bnXz/n7WaXXjuDezv4ipHX+vloqVffL+Zig7VAu14+m/3nH2Af
/HDDE769bSxsssFYtO0RF2y2xsUyvd8/LuYHnK0eQYcJnAX631PgnP59OvgP
M8Zr3QGzzUFyNv+f1gTW2w8jRMWZDhmiGwjBOCd/uzhYiK65+tlul38CJ5c7
nL1/FJib+XAogHy9FQWWa833hQIHyp/v6McHDANro/fDwIHJnQ6IA5so6SeO
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
USP+QxSIsSDzTUhpvZnxosJBr87Rpu3FruE9hESjDoTqd8Mq/FIrXCHOEtac
tH1cuV2xMnzAbZW3KsTAvOCV8Dm1BkrPzo40KTGmXUf3SmIkKoVxHNOl++J1
DgmcVxfWJvBYgZOWFLZoAEKV3CKQYsms07RMO5WtRe3vcCpPXpbaHHhmlUgC
cZaY2rejNL5CYdgsnoyrYSGSicSodNDodhOppWuVpIascuVV7YGLxjX0oNqv
nLdM5mA7XkO0Y5AMjMTjmnptl0VNybumP6+qWlU66aC8kjlZEKNTTg1D2TTA
JskgsGJL0mwcfX7WwEJoec/zvJu/qoPkUbKhitYepAgDhoB/RFzAxNtZv4q9
SSIT+CvoFFHaGHyukYr2/N42wSPIpp3wGml7zhkMq6ELlijtt7qR0IK6htcu
rSapdzs3LepBCqHtC3lVeCUpl6y21nlSFAFjd/ytpZteJCkozUNRjftWU6aL
qstcSO3F7OeGQF3rIhIxdPkkALTw06vq1zWbZ6sI0v6h0TjjrFsqQ2lCBdFt
TGPd9cERwbSfZ33QnGzCCgmrGB11LQDLrW4kFDUGab6Lz0UFC1LilRIHMGHd
bVNFZfKJpVMrXvRSHjZlTqRKYkvezr5qXDTlR+rYSccbGeCpClNenTSf7gGZ
E0AfAoFdtXZj+pIcVK8jL9va6dhQQ3KSSsOV0lYNwBSg1NSvXS2/BilsPbIJ
nLi63IfAD6BMb3YbB6E+mQogIj2AFjTPeZWiSVGfPs+/KyDXIKIkMRO8nxWa
jZWY0UIgqNqo2o6/F80VnDQfXgeWWqA8Nm7UOLtTPrazqjdVm9Q0e3jUGauJ
2RkJMW9DoWaDuSlRqEu0EzznqPHOkklU2+i93elEj/UiHplJ+mksRfcYGCFa
xVVbKxSBlLcoIRkgL/E1Q80lHkh+hnDtZkwBWTXUnqQKo1TNX5Dm1Cj4g8Hc
dErTZEczO2+yJWme2rkO9WMDlrpH7jjqHAyvQyVImn0LPPW2NXLH7G7jvrSj
EACmJDy1Ams/mZQJywIykvnuL1cqOZibjyEUnWUDKOZJOrhCq+m2+0AmFoqs
2kpV1b2UIFXORSwjRO22lmc30jpoQPhP5/ddUaxDjmLYhPaC0XCvonGvcZag
JXGQtOYqgJzwuIt3JALBzJ6qkEd0OoAAjWl6vWY3DjP2SZvcKeskmHSt9y5F
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
tmrKbQY6i2oUwMSyqMlkV4WEbUKQJVmcNVetgUPnNKv9M0D7lk01wqlAOms+
nXr8MdJc1Gmnc/TJzOVTj3r61x+tz3p/+tk/TW9ePi0v//LJ6xc/f/Xizcul
/VwNwD9fnn3yYXv58w/471/13/7PN9PL9t7/mP443T77nv1Gn/7Rz372s29z
9f/2wZv2dG7L01N4MuEXMf3ClCd8yP7opz/96bf76v/2wYdvnv7PN8+fXNal
jP1FiLqU+9Hf/M3Tz+y71vinn/KvGp/+5m9+9LNPpuWj6fdtdD+/t13zl//H
j37G/37+86effY//bFf8q/fXXzx97p7f/eOTfc+NB/65dT834cm62yK8nJ71
p8ufP3n6q3GB7SqnF5/85eWz33/4+umd00/Gjz1dX7b29NsX/fWfuOjT9cWb
5yvR8sXzd5/ef768d/ezH3z47BUh9cXvX05/eOI/u37w1e0Hf/n0lxdvnpbp
+dPLtj57RYyd3xB5n71+mp6vP3/x8ukPLzCfv/AH28X4FnWOf6j1e/mHV08v
+vjN3/7T757+tj1vLwnUv34zf0zU/odnS3v+qj1NfLn+5NWHbX2a/zI+rnvf
rvcFD/DLp/aMD718+mN7+YrfP7m33/L2ktzWO9Nr3fnLpxef6Gd+wu3+Zbvi
x2SOT3/2q9bhs8ddn549H1/w4YtPeLAPuTYL8KdnH3/8NLenN69af/Pxu098
8um/v//B3/3qdx9sFzz80z8//ffDb35z+KcP/vmXfPz1hy/4SPtj2y727A+f
fPyMa/N4L6fnr/+ip/jHy29Of8fnD8f3/+H9D/6ZJ9kudX3/g3+6/Pa3T9df
/ebp8PTrw28+eP/0u384/Obp17/7za9/9dvLe09Pv23t65a6v73cH16womt7
PT37+NX9Evwz7/oVd/nx+vTh9MfGO1/asz9yj3g7FvZN3ubHL57/fjzrdsXX
d4v6y6dXt3vszz5uT6df/fqf3/+nv+XW3+9Pz1+8fvfpTy+fYVuvX+gzd3fF
P19mzMOW3/30Y7HiSixre/r1x9PSnn729Ns3uqT35rMPHV+8ei03+MfDk3HW
2p9px/rTv/3dbw93X314xaO/+qQtz3jU9uelfbK5EC4ov/j42fOPtkf8+Nn8
cnr5l/HkTy+GeeohX+lpePz1zXIzaDyp/bktb15LdOHd/Q+vL/gBVkJu8Oz1
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
cGDB/YU1OdqDy4fT2fAnOZzj2R4uD9biD9eQ4sFcj9zRqZiC+R5w67NL58h3
7T+tYTgnTNXJdYzJZ0/cOV9O+aBewuPxK5fl662lXC+lnm08XogRx9Mhe0LB
IRFzz6Eejo/v/8SbD/lqU7qezukUT+WUsopHyiW588P7P6arP55dPTkezZyJ
E4oypxiO9VxyflhyzQ720RKG3fFwUlXaucZjSOfTMadyeoj62R6IPYd0LAk7
xMeOhrh/MQei5JF3sVuWp7t8PkAj//w1SL59uh3+s4/aXz6vyH1L9QMbPn3B
htzfv92SfPtlY5fo7jbvt1pun/7x00/f5keBNH76p08/1ubg/ePd/3P7uS1v
vnv72bGr81lS/YLNmHtM+HTbi3nYeWn3V/hGq/TFwuVft0wffKtl+uA7LtP2
c1s6/c9ZpvZxW16/fPFcFOLF2uYXLz7Sfg7A8QXY6mfL9PLjF0+3bTp99zdY
u388XbbPX07Hb7qCu5/51uu4++ldMv4vvKhr+3aLem7fflHvfuY7LOrdT+9S
+X/Oot4I4azjkqflQ/iXmOT3Zaun4+lb26p+5rvbqn56BwX+Sy/rd7TWb7Ws
dz/z3a31fln/g6z1W5XIffCnF/3Zqw+/aY3c/ce/UZHc/Q/8W6vk9tfal8m5
X3h3XyZXrKrknK3/yVVy9/f8Q5ncD2VyP5TJ/VAm90OZ3L8lvv5vUiZ3C/z/
8XVyty/+vgvl3l72h0q5/YL8UCr33Url3gKj/6/Wyr01j/8diuV+qBP6oU7o
hzqhH+qEfqgT+qFO6PMI9isLhW4e9hYd/psKhR4h5n+JSqEvhnlvN92+tlTo
MxjwWBPz/99aoQfo97gwPxQL/QcXC6Xj9ew1qfVgT96ZdArHa4mXo7Uu2Gt5
KI65av53yIeLtNpDrCWcTzWf4/WgCp3rw6eTtflqa86neDieawr8R4ohnKvk
q0N4LGA4JBfM4XDxMZ8v5/O11uqTVPttceWxWMg43fqVX46nfInmFNIpeh2Y
Z3ty4YuLhT66SZd8+Xoc4+FythqZYo0J12CdPaZ0yedjubrr9aFyoUrMwlwB
rjHGg3endLLOX1I6XQvP8LAe7nw8XC6XUyrufDrVmE/uHO1Rcwgv/Njh4fj/
cDmZg7dXaRScEzd1LKUcargmb2I5PRYL2YPeRfaXXGLWJ9IlFesO5mquhy8p
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
JPGvP/p/Aa7jnGvxJAIA
--1439763957-1681508471-1025176231=:11003--


From raif@fl.net.au  Fri Jun 28 13:23:42 2002
From: raif@fl.net.au (Raif S. Naffah)
Date: Fri, 28 Jun 2002 22:23:42 +1000
Subject: [Classpathx-crypto] on testing (long) [plus patch]
References: <Pine.LNX.4.44L0.0206270337110.11003-101000@gradius.dreamhost.com>
Message-ID: <3D1C554E.8080105@fl.net.au>


Casey Marshall wrote:
> Patch for the test classes is attached. It consists of a base test class
> and the five TestOf* classes modified to make use of it.
> 
> On Tue, 25 Jun 2002, Raif S. Naffah wrote:
> 
> 
>>Casey Marshall wrote:
>>
>>>I think for the KA tests the number of tests should depend on the length of
>>>the key/text, by (say) using the word 0x80000000 at all the possible word
>>>(dynner, 32 bit) aligned offsets, e.g.
>>>
>>>   8000000000000000000000000000000000000000
>>>   0000000080000000000000000000000000000000
>>>   ...etc.
>>>
>>>just because it is seems less arbitrary and spans the space of keys/texts.
>>
>>i'm not sure.  if the cipher is not correctly implemented, it's highly
>>unlikely to pass some KATs and fails others.
>>
>>even if this is the case, a cipher implementation should be deemed
>>correct iff it passes *all* the tests!
>>
> 
> 
> Absolutely. I decided to just use sequential texts (shift one bit to the
> right each time) instead of random/arbitrary ones. It is simpler to program
> and to produce tests, and the monte carlo tests exercise the algorithms
> enough that errors are unlikely to sneak by.

i havent had a chance to look at your code yet --was busy getting my cvs 
  client working again-- but i'll checkin this stuff along with mine 
during the weekend.

the log entries will be shorter than usual since i wont be using wincvs 
for some time; unless someone can point out how to get vim configured to 
be the editor for use with the cvs cmd-line client tool.

> 
> Cheers + goodnight,
> 

goodnight + have a nice weekend;
rsn





From raif@fl.net.au  Fri Jun 28 13:39:34 2002
From: raif@fl.net.au (Raif S. Naffah)
Date: Fri, 28 Jun 2002 22:39:34 +1000
Subject: [Classpathx-crypto] on testing (long) [plus patch]
References: <Pine.LNX.4.44L0.0206270337110.11003-101000@gradius.dreamhost.com> <3D1C554E.8080105@fl.net.au>
Message-ID: <3D1C5906.5030100@fl.net.au>

Raif S. Naffah wrote:
> 
> ...
> 
> the log entries will be shorter than usual since i wont be using wincvs 
> for some time; unless someone can point out how to get vim configured to 
> be the editor for use with the cvs cmd-line client tool.

found it!


cheers;
rsn



From nferrier@tapsellferrier.co.uk  Fri Jun 28 13:46:50 2002
From: nferrier@tapsellferrier.co.uk (Nic Ferrier)
Date: 28 Jun 2002 13:46:50 +0100
Subject: [Classpathx-crypto] on testing (long) [plus patch]
In-Reply-To: <3D1C554E.8080105@fl.net.au>
References: <Pine.LNX.4.44L0.0206270337110.11003-101000@gradius.dreamhost.com>
 <3D1C554E.8080105@fl.net.au>
Message-ID: <871yark1tx.fsf@pooh-sticks-bridge.tapsellferrier.co.uk>

"Raif S. Naffah" <raif@fl.net.au> writes:

> the log entries will be shorter than usual since i wont be using wincvs
> for some time; unless someone can point out how to get vim configured to
> be the editor for use with the cvs cmd-line client tool.

the env var: EDITOR needs to be set to the path of your editor (in
this case, vim).

On windoze machines you sometimes have trouble with CVS not finding
the pserver password file but that shouldn't matter if you're using
ssh.


What else is there?


Nic



From raif@fl.net.au  Fri Jun 28 13:48:30 2002
From: raif@fl.net.au (Raif S. Naffah)
Date: Fri, 28 Jun 2002 22:48:30 +1000
Subject: [Classpathx-crypto] on testing (long) [plus patch]
References: <Pine.LNX.4.44L0.0206270337110.11003-101000@gradius.dreamhost.com>	<3D1C554E.8080105@fl.net.au> <871yark1tx.fsf@pooh-sticks-bridge.tapsellferrier.co.uk>
Message-ID: <3D1C5B1E.7090706@fl.net.au>


Nic Ferrier wrote:
> "Raif S. Naffah" <raif@fl.net.au> writes:
> 
> 
>>the log entries will be shorter than usual since i wont be using wincvs
>>for some time; unless someone can point out how to get vim configured to
>>be the editor for use with the cvs cmd-line client tool.
> 
> 
> the env var: EDITOR needs to be set to the path of your editor (in
> this case, vim).

yes.  i shouldve done man cvs!


> On windoze machines you sometimes have trouble with CVS not finding
> the pserver password file but that shouldn't matter if you're using
> ssh.
> 
> 
> What else is there?

world peace? ;-)


thanks buddy + cheers;
rsn



From raif@fl.net.au  Sat Jun 29 15:21:37 2002
From: raif@fl.net.au (Raif S. Naffah)
Date: Sun, 30 Jun 2002 00:21:37 +1000
Subject: [Classpathx-crypto] on testing - today and tomorrow
References: <3D15797F.4020203@fl.net.au>
Message-ID: <3D1DC271.4060605@fl.net.au>

A. where we're at
-------------------

earlier i wrote:
 > ...
 > test.cipher.TestOfSerpent is a model for testing a cipher's 
correctness...

today's checkin concludes that part which leaves the library in the
following state:

* hash and cipher algorithms have a selfTest() method which is
guarranteed to be called by the respective Factories when asked to
provide a specific implementation.

* the selfTest() method when invoked for the first time, compares the
result of processing a designated input against a knwon pre-computed
output value.  when the two values agree, a "validity" flag is set to true.

* the cached value of the validity flag is re-used in recurrent 
invocations of the selfTest() methods.

* all the TestOfxxx cipher test-cases now follow a similar pattern which 
consists of:

    a. test the validity;
    b. test the cloneability;
    c. run 5 tests each of KAT VK, VT, MCT ECB Encryption and
       Decryption for one block size and each key-size in the set
       formed by the intersection of (i) the cipher's supported key
       sizes and (ii) the set of the following 3 values: 128, 192
       and 256.

* in addition, the top-level test harness, runs a general verification 
test if previously generated test vectors are found in a pre-deisngated 
location (tv/nist/...).  this test assumes the input test vector files 
follow a naming and have a specific format described by NIST --and hence 
may have been generated by 3rd parties using other tools than this library.

* the NIST tools, have been changed to allow generation of similar test 
vector files.


B. where do we go from here
-----------------------------

1. review the hash TestOfxxx and see if a similar pattern can be applied 
and/or is it worth it.

2. include in the build process the generation, in a separate jar, of 
the (at least) the NIST test vectors.

3. ensure that all the build tools (ant, top-level make, and preferably 
automakejar, as well as gcj/make):

    a. run the same tests,
    b. build the same deliverables.

ant's build.xml should be the reference.


once this list is done then we're ready for the first public release.


C. what's next for the near future
------------------------------------

1. do we go for the signed test-vector jars?
2. do we (PGP) sign our distribution?
3. can we get the library integrated with the gcj release --from 
Olivier's tests it sounded like our JCE adapters fill a missing niche in 
their distribution?


D. what's next for the medium-term future
-------------------------------------------

1. start the adapters for the javax.security SPIs.
2. what to do with ASN.1 related stuff?
3. work out a process for selecting new algorithms to implement.


comments, suggestions, volunteers are more than welcome ;-)


cheers;
rsn



From nferrier@tapsellferrier.co.uk  Sat Jun 29 22:50:30 2002
From: nferrier@tapsellferrier.co.uk (Nic Ferrier)
Date: 29 Jun 2002 22:50:30 +0100
Subject: [Classpathx-crypto] on testing - today and tomorrow
In-Reply-To: <3D1DC271.4060605@fl.net.au>
References: <3D15797F.4020203@fl.net.au> <3D1DC271.4060605@fl.net.au>
Message-ID: <87n0tdiwk9.fsf@pooh-sticks-bridge.tapsellferrier.co.uk>

"Raif S. Naffah" <raif@fl.net.au> writes:

> comments, suggestions, volunteers are more than welcome ;-)

Well done. Excellent work.

I hope soon to have some more time to sort out the automakejar
issues. I have a Windoze pc at work so I'll install cygwin on it and
see if I can get it all working.


I would help with the GCJ issues but my GCJ is broken right now /8-<



Nic



From raif@fl.net.au  Sun Jun 30 04:54:53 2002
From: raif@fl.net.au (Raif S. Naffah)
Date: Sun, 30 Jun 2002 13:54:53 +1000
Subject: [Classpathx-crypto] on testing - today and tomorrow
References: <3D15797F.4020203@fl.net.au> <3D1DC271.4060605@fl.net.au> <87n0tdiwk9.fsf@pooh-sticks-bridge.tapsellferrier.co.uk>
Message-ID: <3D1E810D.4030306@fl.net.au>

Nic Ferrier wrote:
> "Raif S. Naffah" <raif@fl.net.au> writes:
> 
> 
>>comments, suggestions, volunteers are more than welcome ;-)
> 
> 
> Well done. Excellent work.

thanks.


> I hope soon to have some more time to sort out the automakejar
> issues. I have a Windoze pc at work so I'll install cygwin on it and
> see if I can get it all working.
> 
> 
> I would help with the GCJ issues but my GCJ is broken right now /8-<

is there a particular person you'd recommend to talk to about 
integrating gnu.crypto with the GNU java classes (java.security.* packages)?


cheers;
rsn



From nferrier@tapsellferrier.co.uk  Sun Jun 30 09:17:40 2002
From: nferrier@tapsellferrier.co.uk (Nic Ferrier)
Date: 30 Jun 2002 09:17:40 +0100
Subject: [Classpathx-crypto] on testing - today and tomorrow
In-Reply-To: <3D1E810D.4030306@fl.net.au>
References: <3D15797F.4020203@fl.net.au> <3D1DC271.4060605@fl.net.au>
 <87n0tdiwk9.fsf@pooh-sticks-bridge.tapsellferrier.co.uk>
 <3D1E810D.4030306@fl.net.au>
Message-ID: <87k7ohi3iz.fsf@pooh-sticks-bridge.tapsellferrier.co.uk>

"Raif S. Naffah" <raif@fl.net.au> writes:

> > I would help with the GCJ issues but my GCJ is broken right now /8-<
> 
> is there a particular person you'd recommend to talk to about
> integrating gnu.crypto with the GNU java classes (java.security.* packages)?

You should just pitch on the Classpath list.

Do you guys have a JCA/JCE implementation?


Nic