From Casey Marshall Wed Jun 5 01:15:08 2002 From: Casey Marshall (Casey Marshall) Date: Tue, 4 Jun 2002 17:15:08 -0700 (PDT) Subject: [Classpathx-crypto] [patch] Serpent cipher Message-ID: 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. + *

+ * Serpent was designed by Ross Anderson, Eli Biham, and Lars Knudsen as + * a proposed cipher for the Advanced Encryption Standard. + *

+ * Reference: Serpent: A + * Candidate Block Cipher for the Advanced Encryption Standard. + *

+ * 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 + * Dag Arne Osvik, 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: Message-ID: <00e501c20d4a$c8750b50$5b02b5ca@solomon> hello Casey, ----- Original Message ----- From: "Casey Marshall" To: 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 Thu Jun 6 23:45:55 2002 From: Casey Marshall (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: 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: Message-ID: <001101c20e26$0e958020$3702b5ca@solomon> hello Casey, my comments are in-lined below. cheers; rsn ----- Original Message ----- From: "Casey Marshall" To: "Raif S. Naffah" Cc: 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 Sun Jun 9 00:36:49 2002 From: Casey Marshall (Casey Marshall) Date: Sat, 8 Jun 2002 16:36:49 -0700 (PDT) Subject: [Classpathx-crypto] TestOfSerpent Message-ID: 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: 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: 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: 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: <3D02A2A4.6080806@fl.net.au> Message-ID: <87ofek4ken.fsf@pooh-sticks-bridge.tapsellferrier.co.uk> "Raif S. Naffah" 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 Sun Jun 9 20:42:10 2002 From: Casey Marshall (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: 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: <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" 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: 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 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 Wed Jun 12 04:10:03 2002 From: Casey Marshall (Casey Marshall) Date: Tue, 11 Jun 2002 20:10:03 -0700 (PDT) Subject: [Classpathx-crypto] MD4 Message-ID: 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: Content-Description: MD4 Patch Content-Disposition: attachment; filename="patch-mdfour.gz" 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 --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: 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 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" 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 Tue Jun 18 00:01:28 2002 From: Casey Marshall (Casey Marshall) Date: Mon, 17 Jun 2002 16:01:28 -0700 (PDT) Subject: [Classpathx-crypto] PATCH: NIST cipher tester Message-ID: 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: 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" 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: 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