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" H4sIAKyNAj0AA+xc+3MTx5rNz/wVXVQqJYMx/X4sm1sLXJLrygMKzL2VSmVT /cTCsuTVjAzeLf73PT2SpZEfwdgmmBtEguVR99f9Pc75To9qaCazacz329y0 9+PwYDdP7+/g/dPyIk8P8rjdeu0P/VdXe1FGqZbyK0opM4r2f1LKKWMa73GB KqoY4xivmZFfEXrFdS/0mjWtnxLy1bRJw8mfseDNeh34uOdfZVILYGteAA9u 3bp/n9y7xle19/V2+ho/69vHk4Oj6fDVbksGjzcIRzWQ76Y5kxeT0r7x00y+ m8zGybfDyXiTbI/j1mLezu6wIQfTyaup3yd4W+qkZjHpATmazEj0YzLNadi0 02GYtZkMW+LH6f5kSvYnaViOcKGagv08Je1udXy635BJ6X75/ueX5Ps8zlM/ Is9mYTSM5MdhzOMmE4+l65VmNycSjrrhddfV2hkbf0DyEEOm5DBPG/xO+PEa xwaxpYFv666nZHJQ52xgq0fV3si3q5nneb9yMpHhuDO9OzmAQ7uwCrffDEcj EjKZNbnMRpsEI8m/tnf+8fTlTjX38OdfyL8ePn/+8OedXx5gcLs7wYB8mOem hvsHoyEsw62pH7dHdfc/PXn++B8Y//DR9o/bO7/Ag2rou+2dn5+8eEG+e/qc PCTPHj7f2X788seHz8mzl8+fPX3xZIuQFzm/L7xlbmx/giim3PrhqDl2/Bfk tcHuRons+sOM/MY8PMTePImopIvkbjQZv+p8rPbaXiAfkGaxtzIcZfL46bNf tn/+HlveLmQ8aTfJm+kQVdRO6pjFfvA6r1y7at1cDFKO7GSEMZNnIx8zuUde zKoxIejxkEeTpq1F/tNDQjlj7B4T1Cw+e/ni4WLBhw1cbQ5yHMK1/Dbmgzk0 hqWr+dFwvDd3ajQMUz896jwlk678qltN3T8cTrPYlSswkt/mOGt9GOXN9alp guHwvJb4sG3yqABTKKEuRtPczEbtcPyqWlmZqOZRaHGCil2B4/x8ILxdMS9d qeaWC+9O3qAKp6jpQz8aIq65wmLhzjT7ZjJuyJvd+SK9TXQJ3K+0Us190H6u ne9uAT6TaUtez8bDdqug0PKbyXRvq7bWB3/04WPf5D8c0JXQiRFtftvOht3H z2fjccfgiwGvxrOtOD06aCcLct9a9PUH54/YfjSaxL3Hi15wetisHY62XuKv 2iju3LlF7oDRxwDwvh/HeSdpKp67qC+W6/gk7+Ndh5MtTKrz/uuYHb9+ng+H 9d3XuHz/1sE8P3Hkm4as6RFkvM3jNL9ao0X+79YtoKVrK2Mw4iy2k+mg2Vhc vMacwuBiX2s7GrwADYNexkjTBnZDulczO8jTQXftQb30brnLzqf9DL5Nzcfc ZFNDHcnhZJjIvh+OF/v89Tfip6+a1U5XZbM1nY0HTS2wwUZ/1+sG63iyGLU0 Ms3tbDom4/yGLKt0sC4ku2SeCMY2MtYVzZ8Qjy4QtThfgNTq1nrbb8F8x+/x 6iMAzePVBE1gd5982/l3nPa5K/MXPMvTdmc6y4PbzdL87c3V5K3V5eXEd6DW Nu6SwZNjIiRvN/r7KGiDfYP/QW7fnWdxC9w4y0/L4G3P3Fpo/+mnw8qL9/by 0RyTW2cF44eH1fQ/f+gF4xhpzeLnOW6HozajmPbCYkD3O9O/nfj8oD3x+SaJ Jy8dT9kLv9Lf8NmgfrBB6FtLjz8aVg7BR8sLJ1KWJv3f8HoaXmcsVL3/9tiV rX2/l3/IR4O9sEmY7mewQnYxKI87ohscoP3TutvuBwydMaef+FUokafNtWF4 VcLcglp48j8zPxpUo7v57c7kETxtBod7vzNufx3+trFxYoHh3bu9C+/Q+Gqb GzS7w9LCjQ3yzTeIy3+SuYWtUR6/anf7NtaC1sW4H3wuf1v77Nz4/1uE2PGr htjxDw6x4H+hEHOlrxhiWDgZ4gvy5NrOyV1yIaY8hw93bgQfHrT/Bny4c5lK ai/FhwftqpLac/jwNP/VbulxVv7fPJ00q4F/EHxyGvOff7wvQY4n4n0mOZ4m wy/xrvG+DFOux/tiTJnPZ8qdc5gyX4gpf3pcjTx5/OjJPH6AW48038eGH0aq H0KaJ4iwHkQHK7bsgrcf299zDL/nHkc8qKHfuHJRLZd7PV/uNZZj9T433p62 f8kqrPE7atq8v1Xvzh3Vu2CDxYTF9FNT3p1bxmfm8YMrei2kZxX2WYHZC8vg nx0cqKXXv5H//hbhwJtzPXr3YeV/nscnz1aXxIHj78NBT3VfPw42yWj9mr0k NJZ0/qmgMSxkgLHfEofXGZ+T82EwWvy0p5Hz7uYjsFbQVRB4dis/K/6xvR4E nmN+dCH7d1G1dYnRx0X5IqrXg3I03/ehvHfw+xNQftkOuFIRnzHMz8Lnzcd5 V0NXwPk5EvIvjvPjqF4R53/Pn6uqTTdI1aZ5FE9g5uJYW8foZbDWz+P7sXZw NtbSx1G1Bx8FByc8viYcfHpVe3B1VZs+U1W7gMHo4MNV7c1B4MVU7fkIvLiq Pbhwt/tjBJ5jfnQh+8tu93FRfj2qdmHtBqjaU8MuBfPPU9WegPkHqdobg/ML qtpzcf4BqvYvhPPrULWPHz2+Ifdqzzq99upleHg1Dogh3oh7u8sJe/MJe+s1 u3fmJNJ9FbLX1dTwEG/ezwGXOR5f82l4eHjuSqemjK54gj5Rx5c6QS9L5LO4 V33a42vigU+v6v8EHvjkkv8LD5w55Rp54NJ3zJclchPupEFKXJRpPua9tNNx vR62uQGni4/PNp/+5PGFbc6ccn1sc/n79ssS+cI2Z7DNNZ1xbsid+81rIZTP +Gb+p+ahDyGHK979OFF1l7r7scz2Z/E9w2mPrwm1n/5EcvJ7hmuWCF++g/hC HGcRx6W/HlkW1U24bXoZUfFx6el6jjA3+AuSa+enT3+EueFfnvwlCery3+ss q+oLQZ1BUB926rl/n0zejJfPy3acNR0e1qfkw2Qyyn5M5s8KLLlptYUO8Mc2 54FZ1G9AZirc6PHjBb34VAY4nrQYePyMxmAwv/ANoW9L2SB/+9vfCFsOriBe WV6LxPpTDnXg2qIn83Fi2ROPhrwjedQ9B96fsnggufhRfaD+dK5urQ1rUfEP el3gOKLzGPbKefGsd3OqB6y1gGbhx2Dj/qoZnMW54VyeXfd4e9zmV3m6deCn TcYvg2armYWm28xgeIeDEu7wu3xjDeAnfAwP1qqoe1rej9um/vso5HDxtPDH eQL7/p07688j741RxPf8uHlT/xWW+kB5jQ5OEvfCsOsszVb9ZwB6qVg8fF6G Yz8iyyfZ50+9Ik7HkbstnS+h+OSS8kJSxWOypXjlrA6Jp3R7k9ymkWWeZTYu JMojV5RRp+uvKhtR/JLibiejXTYsCFakz4xnJmOK0nJhYcyEaq3aMDrpkKnh MVIaRJJcM0FDEUqVlbXIHBZmnCWfPbM5CuqUCSFm5py3sVrzJZUSDTVBRm0d Ld7lHFWKxUYXk15ZMzlRLX1w3NCcsmJW88S9NEbloIWr1jKjNhjmkjTJG5Ms D9wyVqiLRtvSsyZ1MtZHx3U0JRnuYSNrWKx+acM6T61OKQhabPARuxdGI2aB Me6F8FT24ga/aVLGODgRg06BGVmsolQXlUu3NxdjliWrEnkURVlKDZWuFMt8 FiXxlbVsU3DCaacZs7Q4xRTWTyHCKxVz6eIWYmQc8Y8y8ECplzRzraOS2AgX vb0xYXKhlskUNTPMKusd8mSyM8HYIKo1bCGlaLiyLDqarCm6UJalYCkKlsPK mlNShMgRIYQ1pECZQwkkmhw1ScvOGufaRVZUCjlwbJw5wb2myCk3IsheFkKQ TiE5LhiXKOMxUGRYaaWETMXRak0mWiiHJY18FZ+jdYypYorRLFqqenvj1krh fAgCKwupgyke2AjWmZRYl1P4Iy2KTuSsZGACWSquKCpVtobVvB9bUzxZj1Ah /h6wsAgxd7oGGrWare7qzTtjsDtskQch4CIKwytBlfLFBLuyZlOSIRVhjcxJ CUaFNtJkGhhSXZSZ11sK3kSrpXOhFGQfiUL8Mhc0FipW1gQSX+GHkcAoGCCi HikrCFw0Ineot9QoQ4PWxgSKVBWTTUTZJJUSjc6srHEtLCtWuGgT7JXMInep aGuVYVF31pLX2UYvMiAjPfWATUD9IldRamN7e4sR1ILazihaQ2NyWssCNIag qEqFd3uLkkVkJIoUuRD42wFqxchkUV80rqzBLa0tkqNMkZF7Q0vMXsNHbqy1 HRaKzg48hZ3bHKS14BEhlU1Al8XSqYcFREhSyY2kEUZAm1RHFkyIhdmQcrUG FkU8nWOigLCC8Bao5yxoH4MEenvVC+BhuQDMpOJl0rpEn7EFhA9x6qx5oRIW s7FkAFUnSpF1pjVLKmCZHvc6UxzzqI0sOOpTMGdjDC4CC7HI0HGI8QnsyKXO hXksrKP3BtSFqEmGEu95irrgkRrN4QBSpVldWVqkTBbjZZdTZFJF4QKjTBnw INi5KBaSUD4VS3tYkMqB/qwEsBF9qZBxD6RSKw1YrcOC8KC1mDlKLTGjCxCq FcicuRBR1j1+szzKKEVNpuCGZQ33khcFnEmR2Q4LSB/25SMqLflERcf4SVDU lInKuJ41bwuNsggGX7mntRswJpQFrXvr+bzLoJsltDvQeTGcClB1ENi6zdIa 3cspBbHxlC1Yxyg0KaaL5sC1sWgP0nZYgJ/AHU8oB8koV1lGrO2RC1hLubc3 iThpICYnWTzKA2hCJHG11EoKdJ4F5bRK2adYWQtcaMFNzhUsXoTu5RT9THsU OoKEmpDeCMrR4LKpZJN5109DQf5KClqhjRUJ7o2oE+Zl5mglupdTbaWi4E+h a8dPCpwAptQKvU7C/a7XC4OqKQLECt1AUXyUASvSIzHSKNmLGzRFcQkdFGlD kaF5e67R7DN2hyx3fSGj1aPA0R2Tc1JiDTQZtAkhTUGT7PUsX7KliaFqBLVe Ms8oloXb1HiOtHVZsJXIAYyEeIEdMwVNANToV0xCE/X2FqkC6mSsczmM6BxU XR1bLohP151z9sqCUSNqGsWDzhIyui4NaAEogh6/iWI5+ACcJDEZFAH2pdqZ WKLMovPUJAgRyYsEzSPz4OmIMkPv58WBS3Kv13OF5oL+LPAHsUP9oglAYwGB wXrV6TdICmgsjXZvHPpHwfCE0kaHg//9Xi/QNcBlFj2fFypBDJ4hLhyUh7bq fWetEgvWYi4Dx6A5waCEPJCQkkGUeqqmgDy7ktMBhSZQkxKUhDSyCM86T8Ed AcoD3ClNVUYQWioo+KIh0zTvVUiOGuIsJVE4U9kVSAG0FwvuN1BMocMpqqUq ASm0hVBhwSMVWICrkpOP/S7DwNxMwjnpIQKVldBFAqlKkQnNWdcXAGBI3xC4 AGUmDzlJS6VBClIKRvQYKUL4QHDVLpljMaqgj1b1YyHoSsddqBCRrYXCwH4l pGTx0NCQ2EUFAXd8L6eBFe6Yoh60FBXACPEMUZaigkJD4XSeqpyx36AgCaCe 0JTRhVA9gC8kY7/eoAWBXOizgv7NUGGluCDQTSLEHtOdNZZQ/NFAeQDTgjKG URzwgGEI+jUs1FyjtUlu0QjhHVRyqvI5uwSl0HEvpBUHLVBwXsRJIkBFFyg+ EaiDHlW9CikBoXYWdAURgmlJ54z/UHno06ipueIy6PA6crA3HKuKAXwE0ecZ cK97WUDvQSKiLll7mtGDo8NBJQdnPHRkiHMsMJw2smRcMKYlxyvg0ANIqGRK 7NcbGA3tijPIFScqj6HRMIg3tHVc6vYWUatgFIlUuSrKUHA0GAgzsDSEj+jn lDEwEjaFgxXOVz5W/sAmAhCkTNdPOYQcNA5SCM0JVrfo99YHg/DEvNazMjSY 9yCYggiDmR1aX3JQYMhnEfN6i1JmyM2qBqtmgaryQiNJYJNckdrTbwbskCuN xBxAyzjBxFzbK7QCgmXme8NUhRNJ1TCVXkEx2CD6GHgVXNurEBQcUALM0IL+ 7aWD9tIF6qqeX3SXBRwBZHYIhYdk0AgX2BurSRccBSn1ssC91yZS5AZaO0J1 SwsicrL+D6VM5/oNf6pCd1iSU+gZCiEPyow4uzHTU/i06iKBUoCikjhIIVOu 3letvAkwdlkwAlBAE9MCOYtQMqhMjbYateIZXNdTDtRDcUgQDWoHHZzbqpSR CMeguueemiR8AA0yFUuy6IHOIszGMwWMwXhvb6JKegq2hVBW3qKvAfLBo5FQ bKHTb9DBWNIhxJpnOAFGR/qREF5weuvXW0LLU8JWqocOQAOFKqBQSeBWNGov 5ooLRxKWmK6HVBGxHuCDkzicgfRiPWThXG0sFCfEEYu+WhKADtQhjjOoufld AlG1Kgvc1BMi+NVAiRuDTo4hON70sGBA89bQSoWQ3WA3lkEq8DZ57ua6F30J Z0Lp0SrqaQwFBBqDQIf0wUFc9ayBP9G/q86V/9/euyTbjmNbdipnM9QCEh+C MDUmDSCBWtaioIr6rjHA45E4npJM4ZaWpXveMw/3+9mbBNZnzvXNxiMQpBxj 73BZiPe57BtPjMW+wbJQwDTx4Rm8Ba7mocFJm+0FhCDqnAG04QSLA1lw12mI U3HlSxcQkCaI4YgAhIMriDmU8SC++JFzQ1wp80mcOa4zg6FDbpJyjPGJRcL/ rDf1kIBcL0LW4YX3GVI68lkLMnPtKLrGB6pUQUBgfNjOiy/nzCVAscOOP9uL H4UHDm34nSf2CrDf0YooSd0s+aVBALLxci93CD5taEfgVnid5/s0YHZIWAc4 We5nQq2AG1xC4mJAStu5RQwSlhG2pWE6LtAG4IoLO6EWyOayIajK4Yf7XXCL CE8FUeEYkBps6nanlyGMEw7Pv53o0MOrgIxnvWoMY2n9DVziGl7EDfV9M2gb fcd5Pedd77bpKeoJxYWERTgY3lFUDD15c8gIT/xugYduRjkC7KgfT8Zu4CD6 PbugdntT3A6eXJz6gssihgltBbbUI57AuvqDLa+L4+bc0xHgMhPjBGOBOOQH LP2/r9Di//EfBftq+AfBvhr2YN8ouFoe6Clnzdl4CCbnhs5FkP1zfZcE4sw6 /jd1I1fcziXgAhsBJ+t2EJihcHkEaPjT0EJgG+y6ImoNbr4OIsBa2kBrOVlk CXU/Ec1eA96k8u97sA/6Dn2B4kMxsakQ6qseZ8NBw1bTF7QaOlk4H7jpBuvg Bt9yAL3gcOfddtNc8Ox4xAvHPI7ayiXCnOL9o6blIOEDvRxvwlqEJ76QIIjh 0x7gLF447y4NZN8zNBSUn1u4ews4iCeBZo6M9//cRm79NAQYEQYUhRMBWfCf A42e25uG56480ECUEXM0H5DKU4FsoNOghGVMsaEhwEEH/Hri2g0MyNt5a759 M/Sc5EhYt1C5KINhsBJMSwkdS1quBVOAhfgDnA8QKwd+G7rHmb4jALuu89oN /ZkSuOqRUIBX+V/+nmwG73J/Tghggtd+Mf7ZUK6WnIfkVfANwMLN/AU8Jto0 gdpYzJgv8TguOsT31JEvVQFbG5csExguNcqQYUAWTnIcx9xuoYAqgF4AMS6c V8aeIQd4PiAdvHFJb31BEsC4zm+DFwduD/kDKvKEOOLNmMJR0zjAmUiYzrZr PZAioeKZPpANKQAXKXMJGvEcuFxsGEQe2UTAtju97xkyLHm+pWJUG942whkx mZWb/AgnlgoQBHoEyb6l4/BONA94kzHp79hNM34JIXye6DVepUEPfJAzQxTT 92kzahqvxqe1rnme4AfUmj8FSNkDkf0srg3AuXds4wQ48ST4fP7zAlh94bkA scIND/QhgBOGJE+ZgcmPM2yadeBdzyu+9XpGk5MVHpU7HhEOdrX1bPziwHfD ePJ4j3HDPWWpBW8ewhW3TwNUS610Vj2MHIy99WQ8/Zx4h/wZ0/o+YMQTyU8X sHOCYMD1iSs+x671eBNBZQq83AqvgJYQdtwvFGhRU8M9XA+eZRghNhbCQyH0 PEGDfeyhnAyxwnYYzeSmriSVv5AqDGTAkq5Pu3oMdSLkAyePqmM9DwxE5XwT Hu79ZZEuPB9+ORmq0lnxdchGxhDAer4gAni1CY4DMqnXQwBagSQl3HvZJCQB tipPoU6jsAPvmPBVGY6FS/oAGffJ0R0YUSzOyVNiPLBuT4uvD7w9m4kCYDev ChhEtkHW+HOOx1g1YrA+Lc8Z0YEJSQ95RYQHnxh4ZpDrKLslT0AEHhoxidB1 rCzWqcxx+nz1h1oP4Cn2DaBV6o0ww7Rq46nw7+XZwyWDX8G2L9Be4sT8g5JE yS9AOi2QnY1lQQbEj2CzFDBjF/T20E3PtGk9WGaswEyf6XnvjFodF67CCPB9 pC/wjfPhF41TtMpz52l+qHF/5UIcNnmLCYQdwd/afNBfaMZ1UHpDqrEtsMjj i7LRUn/qqc+8O/atASsxkDsg48mgzqPeHRQ5INUpIW1wwoH1XX4hysbzfPCC BWDCoyXMDEYVn/Te934LqBuIp8QLWvVCx3sDJU74fYCi3PW7U1AwuA6iUF7j FAD8jusvwHdeqOzndvG4MT4QVggIkBNka2Zq8kT5A2TBECoGaYSBUcNGFw44 YP/w6pD8zcvAvUC42Ho8x6LsB8JRW75QScDb/CB7MRXGA0snUTKO/4Wd3qCv zvvs9g29B7+2nhSzfhmMmhjdekIC0rIhgT/Ta+rGqcHtBZjcsTNPN+Iw7o1a h54r/hExr7CqDLOuMxs5G+0cwMIlb5daC4g98cwDTYXy4SDryzGdR9sI5wWm BmK+wfgzDAQFi5cZCM4Pp/qFqqHVQAeuP8BTQDNmAd/As3GetW3Si2N8tapc JKCLy49gt9uoEDyhxKWn7+xcK+C45YkCVq7YLEQ68ei//SkO1BjIgzjiJsPk Mo+X56hcWxnzo68cEiYqITxYNNwaJ+vdj64+7nf68lIFZxxLB1yME9PV1ZaG v7quZz3bg+m9F4+LXAS+G2xhJhgwmiqeeE9hRiAlKFKgB97DQ0AUcHMwkQvj +wU4rgC9FchDgrHgL+D+bBdqgKt/d1LHsd6gMsw7jgjYWU5oIIeZJkZ+fmnC ip1BdpCt6zjBSxjrdMRRQX0BpdkDkQUD+PBV3BXKzbf30jJvD+/gbZZfGA8s vhfFF4cDYTtxD7WaYQPX7j4LacXVRbEzwohfKrzfEdWY2j8UDVUGOwHeDUbW Xl+khOsEud0Rc7ZZS6jyU46ONIDEsUQ96r4hZnw0vHCdW7pxY/kERQHs0m2+ Bad7x5M/G+azJR0xW8XoA+4z4ks4V2DE6cPgJcKRPsSF5UQnX5zKczU+Ce0/ odXg4Qmj34gTOC+BhOFekHVctdGSUUWlB/r6vSn2ZZhFPzjBiW4i/7p7o1b8 53ZuUIJyQuSVqAJsB1XynLhlXppT/8IlWPHwvN2cOyJ5vAD2J5hbLFiy3Vqi lBhIXCR/fYDlgsQVaArYBMDmZZHARtgZLLSJyfcJGJOVnrifh6Otm4QAZ0Er 6Mc4DLYWvg1hwiJzAODzhZFEKtx5DAnjiJNHrbGVict6Iy+y4RD+G5QYzCnO cJyIyFsxOs85cITpS8DjESIIJjxz4fILiX867xQDqIpX2jESqG2FH7E/OCdT 6CmDa7Dn4bq/BPyN83hjQfNR0bkOBtAK48GTrIDgv9FgA1kWlA9YjgUCPZ6y QpwrBzfupVlaU8ULv5cBKhE/+b5tvGDkB3nbrGXBwjfwGJIfTJiLy09AJZCw pfIFEeAcbUD4cZJpANbLDdEbJjTyY6XDnn7AXLwmdQ8gEGxzgB/zDfw98TY/ 0ltPA9CLMx3PDQ0WETzIybliOXt6NU14KQrzYJvBcOgmcmWoD4hTvnAJIISr fPGB3BZGDSZiWg8GFHBOm54eUVB7FygvOCnALMaSt3LU09P/ChdgCdgCoMP5 9rcUTEkQG9TjNTq5eZkBOnkk7Zh9/ekEiJw9YQQrdOMrRmlwUgwK+Ic/IMXm wrH0yClvtoc1UaQL+42LwlZdCC+0roaX4ynA4J+0zXUbZYMDwPZx230BKpg+ QB52vvmFCM8K6MfEBI/Q49k4+idjawcKVJee3on3xi4gaR0SKHKZmlYhV8eM 7hICyI5YGXgA3r0LKdOBCRcg8E5L3lS7gdPADdyI0AQho1gpF27+3bUeuYKp 8+hHh0ylGyKgwezSMijLkjfca7aIoyYwwQXRyXh8gDeGyb1sm0XidPn1JyOF gG2jROjfCTEOYs7+oegqTERNrlMqXtARkFfgVlDAsPt66MtduIF2n+1eRQYB R8k7Vcx7/nz9cfVS8YD3ZY65+kwzolkGOIEBG0YC0B8AbWQBXIfSJfhdwTR1 mEjP91dqgHbHNEEWwbgsTrKl+4Wjonrx2gs+jhofMRkoqB/VUDuc90HC2yWf +Txg4zswL4hQA4UG3gJDlBG5w2fZUY35D5NmwBrjnwgvmLlkSRkf+qUfOt4i gU8NQkSEf7Yz38XoWrr41F1COKX3th7gMqoMEO054XrxTtjhhQbffl0IBLgH /saRIpQvLwTxMpWRd7+AsYdAqgAHFtBs1gRlQsj5nhHaT4IKF9bPkEqH/cEj b/UCp4qnTzsHjInDuW9hY8eIZHymCUhOL0QD9etNMYHoAs/K2fNYgujaMRAw dWtedu6cbtgAAB5JAmAGAIYVczkczaDBVxLEVcPnIZ1g1GfgHlK4pZjGgOKe GilYsVMmAFZ8BAsQG/gdzj08S87VLLgfBrncL8RTxtih/kFY3e+2FxhBTaFV KWlcIJ94+AIywEsm+HL4StD40GjYAd1650RdzJB1K6FucxYbJs+GeGCnRk94 jeuElMK9rnodh1mvlcKE9PHAJygM0gwBBKt0JH3O64VC7OmHuIo4sFpNIBgw nDC8kSBbp1mHdW61Zh+sN+Axggwtt0zHcpkHkFd2PcXCw46uDvIe8QXbQICw TG/PuXx+4TRuGYzJn3iG9hwZ0PZw3pCtce+RxgmFxF7giXG0ET9TLqAvBwbW gxF8cSTuUux+Yfoeax/hOaNg8AvAoO2puDMhFtxoqQmPBziG6+F0cSMjH1dY eloucEMpwq0DUAtBRn6AgiY9oRE7io6Zx4/3Pd/8XLyLkbLTDAjG8ziWl4Fh VPhrCBgmeNWDP3053zsAghHQTeuHWaS5ckXmxZOu4eIV7nCjNHM9m0UtgK4p N+f1pIuwnhtPXZGEPdKYDbdP41X4TMsQ48mRAc+miPRcNgREnPLMUAr8u/wN R33ABafFhXW3IRJKEzCGIfMd05tPn/KcCbh8fgkqbghsIqLAvoj30vVgIkx1 mdncSx57fo6CNUNykDJzo1YJYK6hX+2zIQO/kKwZqQe+GPOORNUmwuFl3mvn zqAQuB1+9woj9dz0V9w/bhpg/pUEIYG1IXJP7+DU8xpyN7wCDhB7tEuIxiNi ux6gGN5kTP7iUubHOMTHPuD4uRixfrMaEyJsZUCKzM2d9550hMdwwBdPjE86 ozVwuGaA4zwwtu3nTQ2FZAtcTgDINbn6aY7okj8+m9Y/sMe7lSvLXy6rUoB4 6cKy36/VB8tnBX3nA2zHZQeADxQTd4bRgdkf517aAq+FGyGbGlcsAJJ6c46x IvH8/a8YJb0BgGnONF3Cj5vfTx1hAA3usRrcHMz5TZDI/nKHL4913h18bvZ2 fEVjN4YT5YjtwUwitqDaxzBjqu2ZO5c5gIpgIPAdeN2w+nyiGa1yFCT0x74V 3B7MD+gEG67jiXwqHqCaOyvHXugM+ujT54Yv3m1CrxMvzunhD68cfxKiB+eB RKMGybohDg4SlOYLUm4bUq0YfCvFYsHQ3P21LhZSa35uQqfnVwZh9AUR8kAN +mOkK27kLC+4YPf1iVMreBHY8cEx8JFXRhOwSMglpGpZJGz/U7H1ILCIP14x uAMjhrWw7GFP1jbIWe7JMNLF54xwDpAwbg5D951blA8Pv+wFCR7YiceUC+4V QtvyL2yZhqkmq1G4WwgX3hKwohO//kL4hzVeOtDRzg734cTgePh7Pu2Nezr/ yF2U2PE/2EtY3Wxg+P4cdXrayyK9GKTo6eVo8mRCB+8Bn70OdP6XDQE3PKMC XFoBuMXQjA7hAqC4oOilWYaUq0mGaYVOMCeS4ddYicJZ7DEuyKr2ktfHC8kj AegAy45ogps/+3Zb0h5x4zwhb4o6jFTrgQ+4B1q2s10uDoh0zfdAB6Ec1ppZ BAjwA02tTwPsi5zwPfMC1sLA0HVUv6BgYNux+6yEDjzP2ZCAcUZoBwQeswrw K1jD9WmyAhwQ5hiofnMB3BFuJlseNu5fuTYQF7iinDJYAAHPP87LumxurMTP L1wWilbrZAbepz8wrICbe3CRsM1/kKwN+frPk7X8pT1Zi0K9dlnIObBsCM4A NAKjwyrH/0yzpZ8QUmDRzdUgacOsM+6gn5jgXRwx/fV5jgl3OWF/l+kf3L4h 14TifuREhNAiZmaAE0Gwln9Dw3J5uc092DdxEgdc79CP3efFaSFht/0Ztd0/ qbgOseaTOuLHTb9Xm1GcXyrQeO+lkI5kC4LxoFOQjo1+wfjgCtxQ+6qDEwA3 BZSFt6jPKvPHKeBCQSN88x5cRjtu4A1mGRkyGwbBrmPB7ff+aqOuiJ3WP15F Jca74HmvMGGe/PEt+IL1uAAyfDm0D1cZLZhF/vFEK+v41aqchihixkreCVhj ztky92QgMe3PVhNPjiuoOLOZtGYgpxQSr4TK9s/QH7lCCvKRw1sesAgYBKGF M7UyfsE7nFPBSWL+uhHJ8Y5VH4Mtjfmo603P4wk9T9USmoZYPN0OkrMma5bS 9mlhxnEBOCYfpaIfh2VgJa+Dez95s37r5LEA7IkbwCIhZ7ro5obyviseTA7/ nnUCZ7HS/Do4Y/iiMP6r+IYkpVSvyBfhNgK0ejz8ghkb6GzcQc8VDIzCS1Mt 74DdW3IYM69fwDpLjW13mEe23QOqf1rB0722kxtAAjYT44eg3fhkngafjMvF OVp5w+Nhub7UyCF+4kklkzMCuiryiTt78KZtM6bgWj7nRp9Sh5ccAAJ4aQZB Z6jzBz2BtYnXHskq6VQMDo8GG+RUpA17R4vw0VAJGtEQO0usosp7WXz+heeg X3A9UIlc12r2N51KrqVysz97gOMOp+GYcUe8WhfTptWcERBMkNMCZPe0PjTg wRFPyBeezFaTAT8Zse1VYJb2NPxFvYCDFSTdDf0ggVjgci0IZWyEp47TGhyk DJZwv8c9USr0da9L5eKOcTWccLj44+1t8GthYw586Lvc7WW9CAwXTtdQr9Ny aciENBWZq9u5ndgMnAGoJo3Iq3DQ3OtzBkQfcLnOrc1izcbIUK4MgQjV4pSC W4IOnz3sd2oVsHwYAekv1hYFmDdaed5HqCt0iLNBsJE3HNrdcbBQP67o4J8w i2cDPRylh8oxXQ+a0locQO73Gdm41Dw/sPjEbBQbBoHBBWdgns9ehSvHveup d+MzINOY/YAO5GkuRt186ufSRobM8Ze7jhgBT6el/uAHoMPddov0vhjcwDGj iOdIA7IfH/M2d7xNqH4FHwcOBT8Dh4zI8IOmI5ZZVHS/z0YArjrzi6gbbJjh RMmQqWyN4XkJcZfWmyMH2Fo3C9yOVzqMhFW4CsT82JOOqAn6hDfmfXsICID5 lo5UiY7e707hIsBdqFIsjzkl0MN5QPKKirqn8zH5MMzLej/cfDZQdiHJSCGc LS6tH5YCZbhg5lDhPCsfGqrVh5j7vRYPPP2VWOZiWjW/PBauwiqiGsLXx/YA fnqu8QKC4LyLnknEM2AYAKWNvh5GZY7jshNlVthCDLh2POp7Yzs/4tR4v5ob eBa7B5aJL5di7AtJBfZu0svF4yThcdHatRMs/hqmH9F6t+P4PCDv9oC9ioSf c7HWvvCb2up27hW4842WxQTL0JEJ/G/hw1+4G5847gXIMGHPqsuHoWGGi+Ue FpEAfAXTm7Ws9k8AUHnyDnmGZwH1uE2epAGHF1jEPJqnA9SfxrOhOs2qgxEm 9DTuIddh6T9fM2G47cJ4VZX7GgAPQ2Hr2SIoF7nlZHkFVPm1txBYE6JdlHsR D0T+4iZWLQcoCTU45E4JzNTDHJ8HDEBhvO1jydCLgh0Agnq1WlDyuKd+OSfO 6226jGblN0AXbNksEkeUFuLKnFpb5VXFVAuO0O9KoBIh6Nw+LQLnIkDjjDcW +tHcVRToPW9EFb//+dNxJrB/f1N4n2a7hKWmB2wT+3ttHhBua19isBdgWPDW VNt02z9hM+KyvShzwZavEPZVRp1tmlrStz6/gvL8fUSam4J0KvJ4TljnpazB rOeXzGgFmDenoQ+sIywx4c5BCR1nHY4dIxVcUwZ8gk5uGQMPi7G/+bVpecB6 NnQB2QtglICDecpAhnnOXL2UPayZSgPzIWABbMGTAcuwES9cBkfQPvvWIv6i BL7B91t9cwE+9NbQzxTL3jVy4TttBU4T3wYUmnYW4rCiue8vkYwr5SlBTpho rTJqD5g57Cbk9veK72rhORQ23zwbhLUYUuk8pLXwq4sRXT5qDffExPN8yE61 SWrAl194YNnlLQ0f3SIJvmY0hBLMiLHDmFnG/NPnkR4QXsPq4VMwQc80lw/1 B4zGd9MsWyY4ITgxD4A7ytxlwgOANUzQftKbelmFtSdQIeHlXv5ILfw+2Lzu d1r5kCOU+8j2iXlaB3/jPKyUaqV+tB+dPw3gABlQWGC0SWBMVAMyn2l7047B bpJfIMSYGXNUjDvw39zJfL/Ur8lFcHh9zS23bP4vWswG3nh/dTr6aSBhJDzD kHBn8Ix31QQZGfux5BCXA3MMwu7JthINAKr3ljAkGps/tXz7hF0CupIwtYq0 UcaEMa5fWFNbUbEqCQh6vfcN6O1Y4dte7njtKXO8Bgx/ztOKvcRLBDvhofQH TvqNS7OArrnLTeC4LVnv1eyYSUAlvEXc+02tapgBslZnPPoJT7dfDNYybJf/ uuLsqYLNKIOcGBgLx9xrhHqBJPJ2bjGjG6etfeavHgBOj6cNsS+K85OWvq16 6tZZdc7PYr0WoDX4ceh8GNudDm4aHDYvGBJQt9YCR0FsYsW19K90j0+9AOjV Bo0ZMfp8GCYXGw2GPvdg38TtAPLtd8sGX0eALVghoDf8KfOyrj3cyyDDnA8Q sTE9SRAHGvYCo2kxDrcFTTveg98CR1skhiy/yNz8iu0y1sCivogXDLAJoLsh 2naZtN+TtckOPPAraPScd3b2gZ0mwb6K8q47RQ4tt8YAGkDNQGMk4LCFxxzm r6A81z1BT1xovCLYKkWxBtrY8hnq17PeOURodUOTTwySqQ0r6h6bd5GDLazJ rZz6IvCaMBpOhz0ZEnHnJJTv08DMzcIclJXLNj5/YvCPWQ/rpjfEFdDQYTUZ tg/jZayhWZQ0DB18+M3o7wMMG1b5lACLADCknngMg37bs91vxX20DLivuIgJ 4RJFQKrabSP/spbccbaAo9oCaXnOVTDsODlc76/i9buDs2MFN+cJIlFccFVn sqke57L09DB6V2xknwDKju5lMzOjYnbMdG/S2y0Rwli2CI02esUHXhhLTQ1Y Y3mZ19JXaNg8XvXG5E07AWBADZDu9qawTEzzsOnXkh8YLd4ZomfpiAG/pfVY BatT7NzBOJ4F3RsYYgx9A5Wk/dkywpRDj5ztgzO4xbcHdqxYvfDDPu4ZzwKI u2vj+OyjvnAo8EuIaP6V+u12rwz8/MDOH6VYx4OKRh4UFVnnZtXCgZ/oFgnZ 8D1565HzGUOL16ZZeBD8iuF4RBuEfXB3A782msQmfVpfIxiA5x4ml1FDU3ZP PPFcVfq2Fy7E+xjSw/FkEOM1D7ThdNrEo0X50g+9iQbApxhwywgqRo43bf3E muyFCwbNJ47K2psDO1+gQRNjOPqqePnkzcEDeSVbIpbyuE7bxm+5pa1Um57e 6IjFXwCDZtIgYjgHLgLDwZEufwoOxDrim2Hil324lhu/tvrX3OfepYQvaqaw nsa3VFTJXgfsHGalQeefr4gHoW1h3UUucBO4u8D7xrPNFvf0qqUB/MX+gCDR PmvgT9OQl57u68K8j8dP0pHLP08wTbOa2EaAPvdSUd4Q3bAhPSFCKPwqqmjZ RvzcvjKv1AD1pfHb6CWI9sGoHP2AT8Gv4+6dufQwcZ5nwNDBYp4aCzc2kS/t U/8+zZoSi0Fwt433NDMSsdJ4TW5s86ec6m0ScNz4MtuZ3su2Ulxdr0Chdafz fR+My5N4XES7WlaLv+13jCYMN3968a2Bd78deHJDRA5pdDhtdsRa/Wi9lS/P ayt4MnAf8A7REBzcssQNI+ktkvXVFz7T3FK1c0VPw1G2+CVr+TS70Vqz3RHA 0+yx5IQC/Hwce3TFBghbmWLV7D+WAx01ITQnrOZ7U2kJODElnAa2mkeCKF4R jSgPJmAvwi7T6l/JJlTL2QEQIsiDDfiwnv5jey2sH6Mhb+ZZMSEVAJ+dBRTT nthLICwMoVklfOaLlFdsamlYWJzPV+iM38BpJaOaAEGb3Awo8scMYO4Jg4m5 ea/DUBNgFZgynL0wClAtgKq+BDyHVN9i8855rHkQZlbt8LX3fschV4UJpOFx YbjudEmUHHcjK87zK14HQz6Y3WxKB8Zl/9Ttzaa4kN6eSEYFwBuI651wcmCt YXDK2Eh4PlSDJ0bp2yqjS6rDQNEmQsenodx7qQF4JVfUg5vg/+syWeC5yxaA 9ysfQY3wYlAsyHm0Zvd5c4fHdITP7sjt04C8eF4MbTubfS3IwrCS/EW7e/ta CE5t6Wp6L5zMCv9aEHWgirXupaKXjV13xe4azLEozKzzY5WDlc/tK2izzbDL UDVKBUcZ9fZWmJ33zk9tA4OMt9osR0G2kakESOMEXgD+VxLEE0fgCUoISAJn 38c7kMHn0PHuXeYwZJyAfvCVU94hPgB+6KgzKPKX7gLoIA0DqNq5hGpd9EwD 12M57jX2FCbsCxPh8Cjbmw6r+V9DcrxRj/3zWRBFHhhhNF/gMVzWfwQePVlg v8cGl5pbD4eLx3iAPR8zmKMDbz78BtJ+HBbAJRT4sGObghUY0/6FM2zSe5/9 eOy9GXeyChM4VCb2RgQHJz2/gjasOlIGtPA4keQHjn9MOaHTpvbSlviAZXDc R4NjY4eL1sZuzQL/PL+MAC64PJa9YA1OdEFgcTuk5IGy7IXOQOLDrC9Yx8ER HPjlLDH0/37z9ZWgVQucgVpVWRWBZPOFRm1nrHPnWckqjyOIzfp4ANWQ6fO0 EB9v+DGjCwphbw+Qd9ULYXIvJ/+ca77FHiVoydgrn9lMrQdeAz4DPWoZ7nl8 3flgnHyaPYvLbuH83uAUCWsMn7HnPrghy9VasHPreXDhTt06LIqNToFZEmKG 4oa3dmmE3R5Ine7qek1fbbY3rBLVA3iERswMeOZRbSMDQj7HN9VAqAU+qdM6 Y9ziGUx5vU8PnFDb5Q0qkEF6LyIOkgG5W+5n9uWarw0Syy88mI4xE+QAs3k/ 79UwmgU9a0/sv5rBeLjHPgDIggmSaeNVPrDiEzT5xQZfsEqHJ52GtmwZw01i 8c/Ch5kB+BWL5vrDC660lhR4gIR03iMMR499M674IwnXg6u4o9gfpbPT4Xic gXb9wiFZclNiE/DB7aMWcGWaHoM769NepxklGAIuDxv4TkMwIr4qE9wxkrFM yJeTBrBW6UI+clOSxcL1/ortuIUHeJcbqoPfRmExDcj5sDZsx2+mCV/LVWYv 7a1IQI02htRk7ePXZgkFQ7bsngVqh64y28RZMcCc3K71R7SO7EQL8UK4TS7p Tqdj6eZ1fG29lh2A2bPW0TKX2YAt1XRryvd4N2uZHotF4HuHGbvrQsAvPqZf 4a7jGM8X43rwFotJ4hObSRcASwkHT/L8ytzZ3V94W+P8+hHMWLZtAU8JNPkm 2+EggyNDsAIVP2CsDum9rBfWzO3sA3eAaZgRuoEjBc8M7rNF/vGYT/tig9nk Vp63Mx0Qt24/fbD14zEbunsZE/8OQgLYXRhZhNxKifPieeInvc91HY4mOJ1j 8IK2Hv2kFS5gotn3ojEn3plIwtkgT1D1A6AT8SLhUTm+wqw18oODMrxsQTKE Ylya3fH+ihIYsYdrRgFqOM7HcvxuUhEJPn746XmBLLNjYHAqsC8QPN4E19my 06v2LM9EnZ8zQH4KoBMclazomA+yFcKHajKcwLDo8+B2DYqdyUQNZBDrmH9l UjBbK8YDzuO+MALOarrM+L24sYUcZoHmwipPfE+5zCY7gvAAC+t79plDfhAn i7G9b46iYrIfh0AhnIhE+YqwEZnHMuQbAznPygtPTKp1nW2s+Yj/tm8XqN38 acEYGD3LjrgL4XYeGlKz7tREjVbVfP/qsQSnPkDI26lJ+7nZCcvLGWwE5hsx xWECzGYROn0Zdny+mb+bGwPzV2TCMlF0EVcMBNjODQ+0ytlTu0Dnc9Z34v6c odYOq+TXm1bZjpWHRss0MwFNTPZSiIe2Z4uGTyfi9eJlHK+ZLGp13AKnNtJC XMhVjOcrsS2+A5BNynaApwBOe37hPYGueF9MkWMyJkS7O4vtAeNwRD/xEBwg oKGvdon7db4Pd8KfthFrb2BuYA6gXk42yEEoqpUT+PkRcLHxpzzudeAMn4cn GE6iCgoyfADoeB17PKRC1wO0TGABtgHLrhkg5URI6rovy3/PamECKoCux4Ag B/9kioeNnW33zheECpSdHayDi76NdNtIlgzirDfNFmjX94CGzerUO+ipHab+ 62x9n1ZYjbQj7VjRwNHxDFPrCLpGEuI3wQjhA4MnR68VcL+t0TlGu3zPkfb2 rV4jrsXq31JuRBvtASk9UIdwnsdXNg3mvJ08eD4yekyv6QW/9YKE3G3P3F2I 13UFA3hWKuJ0sTMdqH45ZuGHOx84qAjGgsx0E8Dm6wHFPARucHtTSCfev73D 1n2wHCDr6g7iGScC/02Puy9nvfGKOV8lAAyKLVnOgAAQv/uszbPLWuHMINjZ sibJBt/L5lM8/lfRIS5Mt3UXCQvan9mmTba9GzPa887w/+pcuaB3M4tTrzsd pjVR/+OHL9idmjndRzdTgEXOnAEsXYhR3Gdtok7OyeoJvTHExllFnER9k7VM 3xAEG4v7leNjI9MUe7aWHQ1SDnBY2rnzcWocQ3fOnBh0REcm3WdQS775grk6 74vPvCYot6xRlsdS1BcuupeKOvguYkKSWdT4mM5UiDBOBcTyTfNq2HEQNNDf VkvL1i3mtzYF+Hkc+6Sx8lQQFbirOAgYfb5XZC8XU2mfr7/x1Dzfw1WBDIYx syKBkmfy/DuXOaxbzZZYIABAW6vnrb9w5MD9NQ7Z8DXOdqHkj+z5qtGG9UOr hf0//l+L7f41/s9//c+bg/yvv89BPg98xdQza6GtOGjnacOJxfL1s6bcsefs kb725pyr5ke9G3D73dI7u0mk61S+2cMQcy6zf2HuuJvlN5BsLD+g9bWZBddW 24uVr5Ubv3aUHZ2p9KZjAlOMpUDCkJDWNf93+bLcT9LIPPg8zASuBWjG2WPm G6bw3nGKbvUAQTlkDoTN5+GOM5TlaEj6T9bx4T/m/aAAdpEDqVB4YDn4E6Dy q5kiIEN9jgNj3oBgQFN8BsL4GL1pX0QNz6olW/OtTLZazWrcHX8Y771N6TW4 xy2cwrdoeBcChli9BSdXjq/1bCKtx8DwY1e0jMBnfHE5tCd112OUnXfn5esJ n7iFyUDzwVEN8+NfZVZeYT2MaQeSZ5NnwMJosAgeeP4qNhbBclkOGcC4VAv9 sB4PpMeurC8Dn504icrAKW4jNa9FxtAPW5uePWo14ZnO2bHtE8g8n4L5OLMT 5P6qXKg1Y5ms+rKCEUN+ScUfu0VnrXX3G+D/UmwqEdI7fSFefc0ALk7tWrdQ V0EQvjOVdXBVxp8t6Ih2Qu+NbE8Et6CyDnG2tv5Gr1/YgFWgIf40+9u7uArt nD11jnpgU+FNMASxxoZ6YGt1Re5OILNNTelNqSZNzPypH3EiqgNwjmqPCZ/M ydiyMgDSQNZfE9we2/gNQdc1v+tFNIGsuRtBid8EXh7GRPiL3gADTEE5tkwj Ow70YdMsHCaIEpWCC4MwBrfBp1peasJ9nZsjwPHuN2AoWOnozK0Xg285D0By rwQ0NFOmo0tAc7NkswDRyc785/jJtICVqvO6O1QThIjtwNIEO1DBWzu+AxWB BJAge3Fe8D1Gh/+xgg+UHb/JxSLSWjh/J40esB6HlmOjsGDnu8c1H4edPibe EyrPlyJL/E0c2OE8m29qVX1NxmNqbkc0N5s2DhQCyG7Aa7P047E6YsUyMTGj 5cilOt2pg9ND+0rlDX1iQ55njY6wt8fRudeItdost+tCtFPkaclC4kcrd1il fU6LgH4yycUeMBwiPtSh8s3JMvGMaExNT9jQInR0mMc7ViuLmTleMvNSAftd vxymUBo9iPYPz/HGxtuBFCd8K+ID96qKeVjGGV7H3xm+u0aKa+Lha3nXJ721 SNSc9nUkp3HbhB4WRMUe7TOaE+gLtyneKCZ1jUDfDvIDOM3x1RqoPRl8hwnp llQF+xShKtiuwwES25uG4OxErJZzCVtzoDl+dwVkULGv4qNK3i/H4RrLAeFd d7fJNcjG6hbX5Pf46ts+LfCWfBggxUfdfCjw/aulAtRlB/edDxzrxQ/ZpH90 Z1lwaRtTbxGaFP0+J4+Ap65FG1YQ0bkDy/aOhEPko42RROxWb3wQHEpEeP2q dIazOnrLEcFYEU5sLuO75occXy3VyYNwBzmadZ48cR3Ym7HqbfOqzfnvEY7I Q5nisdY8wTcTV9urs9iv62tffdMZuZJDmzYcG5CxsOcVD6Ft3ht1c/EQXvvh LPBacSmIM5bGYWJfhdF6R7Nwj93Dy2KC/TrHYef/3KN9eIFy47+B271f1+2E 7YljwL1a17YskiMpTtwhVBokBqPjohqmDGl5+i8k+753NiqPNw+wahP66YbT NSPU3yx1pwkiVtkeON4slpgVBPjhgwy8e06JR7Lcvl82TD7DwkYnGZV8DAMC PzlMBwU4dQlUANCtB8wMvb2rPfF7RO2p2VSc1ZKjPaKtDIE18NPj/WWBjsM5 oXBwtBgkE4NjCGbN2Ux42DsSskWERzsPpw5deJDpJJbDqR6jp2/kgqX2wz5e Dp8vhRsZJIrZtrVzYZV/W/LKb3Rwln/dTsjiKBYsv61iP5MWARLWXyL50XEX Hc+I0QqHARnsyc7D4CW8J8cAjrrFb9Ghbry25qx/lvwu0W4Xgb3F+4/DUwL+ nmMEl4bdO7usw3oUjHi50lmgoCY1ZBfnZ5Gs/nms5XdSzHsF2Eu2cxJ3XmDj e715BuplS7PxVecNEnQOGiYx4yvnN9v6WpPtJi6kvBZEYBKsLOSUz2aj/WZD bD56DGcnhKJ5GtGiP7h7wo59gy8cE59sO8HKceqvncJAEiw9F78PvugmrgBc 3dqo7LBe7iLb7QO3Wc3yRoaC44NhJeU4gWUGlp1M6nDg590njCdHTlpmfDi6 1hwtQn8j9gCd92fHRrBKH0LttM5+YJMv5LY56Rxyd787wg/OvTbp4IKNuaZw tpUQhZOf39g9uJrjgtHAAGfAD2FML6NW+ICr9j1qFXijEyY+ABU8KJ8EFFf9 l+J/2bO+ikqwdoflsiIkmMo57ffG7GyfJijqN0KYEVCL1ku/sWMQXwu/vkik JXrBvuBsC2UAv1qvWC5XtfQr/so/PPyaPdAvjAI0N0Qjwyl+OK7z+jJ78Il8 IA7BVr7nGCVb6dyx1HzBXqcvZeS6B4wZB2rpI0ANUMZnfwM3jM+Vs2IigYzI cDJ5km5TpuDh8u4TxhEx2EFZQAqmj60ICkcr0EvL4tenrU7g1q2kNhKsOvfQ HD5VnaW1vek5FO77wsA4JGY4CdJJlE7h7p/WT6cvmbe61wxXGx8qQFG7D3h8 fmVa7D/PgFOQ6QuUre4QwJOFE6b/yVszKlv4letMGhs+1IZ7Z+VJLfcRlAPf CHfnYgsk6+X4z+qwnfiEcXxz3lF2dwPU7ksO3UVbKy+mZf91t29QE35rcpsu zeHIitFy0BRfAYtYltxy+wmYLbihYHyiawai85WDE5w2zcK6XabBwbXNIdw4 de4XLoqHeL9KGXga1kyJddcQn4EsgmPdKAQs3avGHIeJpbQvFPDovJiReKzU YF+uG/oikXabrQBvaGKFPm0MsIoP/rBnkjkwyAkO/zUOphmxmvIuTi1u8eML AAXUDvdc+RZhDy/aojNg5Hvl2e1bFkNhJu9HUC+jrLYQOzx7fv00KlKSMZgG 54TLa+jPyewozrOPH7n7mfhCyTUfkJy+bLkUjlwz8cX4L5se8t2dUmgLB4Ip 9LEZELX85Z2DXutw9Koc7LatKvAfxVrh+FWvl/Eam3y0ks/qnsIYlXHZfG+j 0I5Dpm05CNiag/Vw4p4SF/Oe/fiGJACFTjR4NcYdHI0ZizHt7YbOhL0PiddB d2PFt0VHwXaO2AE5DiE5f2L89jTgxQHbeHar193JgHpnAAGceK+bdkuG05dj Dc7Bjpb+VGfYAzzmX1tYXD8UwWw2yUPaJ0Ynu3NodkjmHqs+UdxsuE10z3f3 x2AMXiSBmb4p3qfFyBzw6qR5+2suroLdjuTSmF8R3G710YV8WJXhAPcXL/Pw IPnt8Zu7jf17HZt1OhWGz5k+G1hzWBHY971QOgz3GtmLdQSHBU10ryNhzvj8 ttdUd27h1tH3dC6S4hAEzI1zuH41w/Y3OGbzwky4gKlYsg9psHkZBvHXWFEH BBWM54XG3HgEnu19XAxxWjy9ndtQLpF2ExCHkRVzCLNZfuDagHULUI+O6VjJ EcAgOPZC01Zh+sSW/KNo338+CPlffx+E3L8pwpz+qlE9Q+VGe0bayuUuqnVL mQuO/X65Q0O/0nS3AVkqidHcfNo125jQk+lA6XeFmE8cZLtWQf8Xy05Hxfpz 9E+xy/B1/MoDxseC4Ev2Kp/bEwRfJ3NmwczatP5dN386PPnzaVBCZzChV8hN v17rhCHNvAyKtTeOv86fsgW38pYl1tdOeXQV/J/GV2G5yPIwtTyOR0Z9OnxP yIP1H78qt16pFO7UHVvV2YKQiWct14CfftKNgGEJGpz8OBz4OV6YcEjaVT57 7z1TpxbFPS0ydrQDyNAy+JlNt/zwMIu5rNo0RonDuPmg2HAg55rzuHNEWAIf h0sP0AcAPW564nSbpQc/MQlcDWAcKbxv21SwOZDYCiR/3fK1D7BJYMJ4nU4E x953q6nTW7mHtwu1P0TWbIng+k+u3NENZ1q52BnwQb8qUzN37xRQK3FWs/lw Iq8rA54zfcOtLUIHaHzzzDEsZpZGWJW63Frcq7SroTSjPa+txIIPlwG9OMWY 3q9OwvkoeQDxXivoRABwK+CTQPlpv4Y0B6uGrOnDMzsBDuVIpzvOzjp/Rs7w RbhjxLBcmCSkA8NyOFFs6mP23DBUpSGEjjzAlMDWDG/M886Yi5jTl++fKwz1 AmCLRX29OZ2vC5CS5bM7FujP0+1zOZwRgWuJZpvWyqlW8892QmvbLUp0X47N 4S7ruc3CXenq27MZBp4VdKnXvd4smesDnjdPJP36GCeuMlhUf8gE7CBNDbs3 7cJF9/eqMnv1BDIWzlqV70Koea9IjTmNL66JmOLmcCiPowrtxW11ZissUvo1 SradFkOj+yBVlyXdoSFMtnQ6WvurGXJmqmtXXCQROJmCm7es/ikLt2x36qK/ C6+rgq01RYGbl5tOlD99VYzmul9wJ8IZ1p7BLz43ywmJ30dl12LJwx2nTUci k+FOvscBaFO7+GWwhpZRVb24Ihd9He8iV0DRa8/Qv9WgXjN9fhRhv90rJm+d Jty/W7heqzqMWabTSfsX53UGqM6KyuzZjGbB3uQiHFkOlXDvlZkcx8lf99fJ 5u0UiEszmejAfxwjig/2Ps567IP0XGvzDDcvdIcHH7ZGWeTcobMWJi8sYA36 Dep+HIanvK6tRk9wKG7bK5DKbbbXSXLB9QZW4Ecnk+lyn7d/NUMrvurovyvm 4joP7LkBRodU/ao7LM6YxSre2YD1Ghdb40wu03DezzclIWh1Y+pgSLijxcTB YFNRhUbch6458hPolMrh2CD4QHX20uNoPYvS15uC/aJrLY/iSw+7aNwhZrja 4tpN3pbrqJbrDEwlVMj9aJPbcNvRl0d8jZGBSYJtL8Nm3OnQN4BzsA5tr8uJ 9q29zfKueL6mzy9bOm6zNHOuc7PrNsHsgop/oa/GUkDtueJqcti8TFrjRO1M scfjTsPWiQcUzE2f9ze6eDiN3TTo2Tl0PvOIIqhmxyV3senpMztuuObL4WW3 xTOveXFoUS16pQ+zw6QfS2wq4OlcfZqAQndTwNyufeTMKdZ0bGCBUjY3FvXp mGXXUN7nOrdkk+YFhywuZILPgF+dFFVasUtkH95vuggXVwCHbgPIzsi/k61K Nsx/FeQJtO9EJ/PNwWYUq3N5HWfH17R3oTjo7ezZhZ2chgN7kLOz8LxQ1G84 omWqDnpujsnjenuxw705LxnE/v7miNheqDwuxNHouMo3uZ/BlH75tma4TcEQ n8PA8w29Lo7fg/ZEy1f3fJczrIdk0P02LprkGC1c6OczHZix3hT6gDpbOCEH sywPOwY8vp1gsff9TtP/vYLz0utuwic4NdQR/LYTf1GEGJzspTi3G2TXHVUJ 6XGS43PPfcAqt3RjeHgYQTq8apbJ9fKAhcv5BtMash8nptsjO15OtFzmWZvx z2PH7Ieb0xIupVSxuC3GXAO4I5SZYRFfJpmD1KJYjzdgtasOE7CBkUN3t3O7 kQ4nCnSumoMzQfhYotOxZHjAr/cMNmuNmUBRgBKsOh5u1k3DdQS79E5LGpxz l90lqH6unVUmq9LPpqfYbohNA0HbxIIntZoarTCUN97NIsGroqUUKT+W8feM qt4ugkFKcQ7rFlpp1fGl+XxMIUMOx/W438uR5GWPRJ7DaH52XFgbMKWsBpzY 90NmdH0b2dyVYykQ7/kAMTDSZiiKk4fTr4xBcfCMgwIvWzfW2GQQkv3wDuf5 hlvnKwCg7muCRQ770gzCDQ2vQrxv79JYYGarM0ltKcR3goAdnOd+kS+T3ACV a/BveZxLZH2lxXMOfMdv75b8PXBQzs0FHBTNzekEDvDNmVfS5cvFWRdg8/K0 abaB5l63vfVwc8V75cKNHXNTpjnk+wLwSdgEB9a7zpx+qgMuEQCuy64hIKB1 zHxwdBnmXkHudrj7uh8u/XCfj5NbHRJ0Hq7o+Ia/OqGi2E39WD/rLh3dAfID wARY7aPIjvFYLstvuwIVOO7S13Ybk4y9/IwYjwIrI/U9vOmQF7lg0AHVwMfd 9rqtpQPuwU7Tit874I0OCxOK7a6fl7FSojlxAo3NHEF/S4L+3Pa0zs1aWmLM 47rSGkBcxbqWT6V0WXz1zTACAh7WS0aNGp92uNy4XW24izDvfCGuqvaR3cTs vE7uyb0ifUAgealvyJ8jg5DUDhK4XQtmfZqfilwCpPaOUxGYqfkJHsWEhefK LqF7+pr2uXTB6jq+CvOGn8HiW0LoBOHbwU9h3y6NobAYH67yFu6RVyp36ik5 hRAC8XWLtYnRspUTFPJMRHdGO/ZGwVTVuseZksNk0Uv3IiUXzVpP9VRrTEP9 GW6NdcERH8gOhhWdL87Dco2yFQP7oFCH7dXpagfAuSZ1uAUmGgaBZX6LLFrG Fjk/9jzdBhWj6ZH2JGtZj7rXQQBiU1V9HZAPJbLs0N2e1mrd8dtwauf2a3le l/NYB5imuw9BaujiXgeBdx7uhrFu9rXu6nyCLgY179f5dU5eNSKtq9f+hLGd mPQD9Hu6qhh3sunC6E+Bn1r1fTt6b5RVczqcSnHX46sDux8A01ptV5zhflwO sim3azwcJbJJCIwSxT9B/2DGDAoqlwCoDIvDvq4AeGRKTpI6kxVtYU00aO3Q +Zawn5vGub12G2IKk8uezPI85wO7DceHLbHuFzda3uY4JEhvdcjytFC6WVqy WaQXAMozXy7zszKYiz+Rjns1Cf/I23SkSgYqyjXi6I5viGJCcfXeZedCA8gT 2M2MOFL+IqmcWHMz7PHtu0+zG8Ra3wGaOC0wGRU/AhlzhOIe7QNnI+aXYXxT d3wgcPGNJkryz9ZaaaF9IgPna7lvGrynxbh3fd68D27s5lTuEe1E7+6ocKNz cv016taXDTlcoPOe1jxFQ1VOSHSiHuxXKrRHfkCU3VSkK7KtFwLdu6nici7C 81VCw9csOhObWBphFmckE9xgQZdsbW/aLGbKxRNxs/rlfsiJGEM1Q/7ZnFgd UjxXgON9butiT0wzSMhkbLn+SbTvH0zS+9ffJ+nZdwp7Wl1wDQG5TSd09Ka8 A67wTe2w8Mgxn84XxzfiU5yh6WJoB4Js54rAiiURnl5c6PMWJAR0YC74Wjdg NtfypLzGBkzXRTn1+io2YbnnaPfeyfU4YNJuI6/N8PK/sdbUQTOXrsRFWvmw M64uUuTwtaPZ0ic3qe35sIjzD44BwzvZVn4hTA47PepfG1BVWscvxm6HP+gs uigoRCzawOPv46qLHqC738sKCZfgWo3slzqT44sMudTZzbMmHV3QdbtN8Kzx 9pf2mqEbW+XCgoZpOAxpiaRPbKFbxu+vLidqrEtweaqb65Nbdgt4/V5TO/aY q6QDKoPds1o+1ns63v7oeQ1M+iaKoCMuzeLhAyK49mLlt2GcI3gLHf+lK8Nx WzfExsm6w2CUTcmXQe5vnuHxgAOgjug4d/VcriJzQ8G02GHsuuJoNWtYxlVS sQRGNueCkzdHlPJbY2B+wqhysmkL33TDxSLMu+K0nn3IKU69qkwAKakm8sKr ZHfPHK/R5PWmmNyzuqzwbo/DYbv5AEx8cAfJnn/lOA0wRvdgQjFdfGua9QYE 2un1VbxViHA29pLd+p1cd1LzKsLuo/7q319J/PvFKjn/ylHxINbVlvfeLa43 vSwHeZ1TezqF2OFmVjUZBFi7mTfG2QbA9YRUH5nndAqHG0S4YYD0OX9iOVig ewLjD/fU3J1LxyQHDfTd99pmr8CxgXwdXAD3MCCnycg81vP64iVXddguV5qz 8WpHnr4ntBgLCMFv+5Ihs7dAk9RbOCVIeHvxBfDLnQY/W+JrAgVUQy3PGvIG cXKVvHNSZtm0/nA8QJ22HwiMYTEu2wN6PY4x/fQ05wFOdNxXtwL5vZx3c4Se V9/NXvuSEl75dkUUaK2DVOLa4Znic4WjfN2LQ8PwtuF4piYTP7ll2XJ8DUns M44mnDlOjEcd0RTSdeDQ3ugI9zN+1Z8FKG+h791dGtYMOLj+840Zjhp2po6m gCqwCv3p1s5e6M3h3jmYmPWlHyLDvL1onxgPfPKO7j5XCGcLjgTa5M1Ku3Sk 004y87gO9UeVE15fvr+ezWlXxZCWhb6g9wGGv/pwRJ8Rop33G18GFyWz/d2o DYfWOEuecHxRUojEKqbFUnIYhxWFAEEriaZ9JXtMQoxrs4y7QVpYnbpwU6PR J8d1/sRLnKv6yoEytt5x3yCfw21g6d1n9YDoYnkxD86KGXhRyCFA7ojT9RNf lNT5Nw7hqV0ylgvAAvNiztrP6r/6I/ATxfoDI+iWPxyT/3EE1uGAkc8D1tu1 bpLgOhJO0CE0wwYafPqvOUIux60XAOQEYQVkEpp3vZetQ1YZ/eQfkMPuinju lLctjrEMaPPtIMu9+hM67KgFgK8eY20ON8Vk1A8BWBxxSK8AqHmN9XAfDZQo GFyzpmWfF1GeVhyOOdaQLiwwaOfryEm3QHRJCKpkzhLbPR2w4xSnQ2Yc7hWa 3awlJvlyFZ5z9JyhCdQybZFXWcpX5cPhgwGcKPs6ycagn9OIbN823LHfKbSs nPPkEifQt9yenh8aeLH36wt2KVC2yu7AazsWhz+C97LzZrpLfkMO1qEYQZDu FGf7YbEwGfmId7i+DL27s0JwSx8yV9xHMp2G75Claj3aLr08+Gs3arU1dY27 f8PrAh0HM3x5a0tjADLjuILrUvxD2iRpfyt7z/JYWJI/pijBDt1bv87muFyr 8EVwbQxrWMuzuhf+asgfqLxBgcA++xSFMaXcjhDD1gP/sagg7m+m0PsjvY8V e9Guy2FocLpiBhN4WN9f475iIT61wgByd4RkM+ZbeVhpFpIfvjpXyyIQK2gi BM3uOge5ncsfOpZo74B+8YCYobQSJ9NhKNFEISjdhqZvnmEFLZ44q8fh/dX5 guCGp3BI7Wn7pKnHVnFYUsT9OmcNyPI6SQCrigmdX76Lb9DoHk/Es7rdwqGI SJOpwLDvPXa40+WQXwuDXxvsHvcMzGTtVfm2xLcAg4kuas7J4SjOTRv2qD6P jbx731y0htViIxPYFQ/JYRxmIV3d8U3Bag4L4LSeyx0u/vnu5jwY9iy974s/ zfGu+gkrSGdyTApAAVKREfwj/2TgLanGYTQAVjLP5+gI/tzA6/xi6ucQAEEd z4aqOMOyFwCq6wJObHL8ajjSSLbavtOpRQ6jDqE9NvWkNH5VzVr55ICTYj9o b9oN4PNEycb1Mx0Rb3P1NU+Mp7alMWRrIR88+H38WnQBD62P5GBNo3MezsNf fi0Rd4PMV5dj7O9weW7xge41isHK47HWgO7dZFgsg3FnTG5jxpDgmu7DhNQD bPxqONJtq427SGK5LSJwzKxzKgAD7x5nyvrrxrHZzpajI3WPu1/4RKxJ+TJU NT+uonHc82UuogArrenk1hx+tCGuIPReQ/GmZW5rO5BK6U2U5zs3E3v32q7e V2oBH3eNIV50G9VeK+8KgK+39AIGvqHMNe8G1OWdfmsMbD6pYB5cAZjA1cGv sz5uO9p5+b1K2105l1M+UHhOpx+ng30edL8aafry0o8b7pqrx80oejplBV/s ON0n+p7dgknrg4arbldJr32/4XC88LeyqB+ImU7BDsuJrezZTcIOBrTlcpM3 k26cFQboaE4P4xhmRLAwyJY3fZ1F2E3uz+kq4FnMaYFlOzEPPwyL2hcggUdd lo7zhCJabJccvbQq7SAmP9M4r3auzm/ucFwO9jx7XVN9D9DShslRzp4ObsIy IPetgj3jOQZ+ooefNVSGBhKwE9dmA61B4Md98jCVFx+3fdpdcbU8eU7pNskM aujNKa9C0esnioDHFSRWY6CWtTv40HoqjBc2aY8H97CcNz5feGdWfWq1Jown p2++XDpcOnW7ZjR3hzdi93BgoYK1MYe7fcPoCyLnVUUXOZguAG65GN0Fgkt6 42Vc+ipmafHK3rjjF3mCxp/a533VGzyGnIDDus+JH1SIsVvxk3M7PYDiIa49 LkCS6WC5I2WDnCXUfUHv6yL6ae19Ow9HeWFxXV26Ait/+dOIz3GwHIef4Ik9 u1k32zcj9Ns77qcDIMCCzgO/BFGen7tHwIL564CGODoByblXTlwMGbnOyWQK bzR2S47o8sB57WTKDSP/OHPLsYWc/P3N8XYL3Sv8CZcYO+FNb1fmvrYUx71y wRj5EQqOfG16he6+bspyE4Mj9T9+OoqznM5spgXg/5jm5lHf+3TI8d6FklxR m+Y3c9pe2ttgbQzrPb6YAxIU7bXmEkMxpYXuRBuHMuf8C6leQLUyHxdU5Wis 8XFtvDtP9LLfbHbzaq8b5bK1cM/tAEoHYhf9Vt+XcDwuWIAjFzEvCNm2Jdfz cdQOEfy0vtqKY0pHwJ7dfPu8DtN2+MaaDvRvDjgdl3zEAMkBdQF60Gb8CH9n pTaWtbR4kP/MwsrH6QccTjPfCihve/XT21waFQMuN0z3hFhkGQ5DRsL3bz5w K1PpyO4ON9DlzIaiy4RkInt7tO//O2L3355//VfY0n8df2/Kde54c4Eqajt1 /c9hLtddP+amfkqT7M2B4NyuV05GpSMX6qtbiLsJA/b3yqhLd0TwC9Y0dPVT dTTmNyjMKQv9OpFLcCVW3dnfVuyf+Osrj338Qq2m5irOHgiPS59xbZ13KRuS 9W1fU9ix0j27DXeNeEEWHaZhp+yeHh/VkmmejoPvrxWowNw7dlTA8phvDPs7 wGbzto/zdAIhuuPKZid9Q6v2Frjq4hZ3DPAgxemuNry7lQkWdn4BeMBsPt3o 6srbl5O+TElDAcEeOexbOY0t838uNrDwGSJsVUgLRi4BGN9GZI3FI/CABE69 FxYxzAN/4szgvWBnYIX5hhtIH6tjjlccBWin2f+GDRYXkON1soNDX/C2dWnF ZciOQv2VruyPO8LGu8r6g/GMaY6wO1OpfaNIULQDCuWctwmdAQEG0G7WIJxP 2J9t+ctV0pVdiYB+3A7ywuma7/rK9CY2HKj9ODZnmkg4LFZ3pl994133sTxg UJtDPIHs/wJhGyf4uDXtJ+wcypuKvWA200VXH9oyfPFvrlj/XSD7/1uJfte6 BqwMxgKIaSgQH8KxJ+D/A6AAI30rDIs7qGHhZk9KtRqEa1kBUMNgm891TI4r dQA672WXrTDRVS94Nvx6+7IxtltWlAeLARw2NodtC9NVcGXu8/Egp6d82j0g LqSsZtFzN84NR/trmuiEXqfwuNuv2cN7X05Aekpvx+6JAILXtLOc25+HJmM6 4eO5xcoj/tTTHw7CUbmRPZv4JYNmoLODsn7Vkzpyzu2seAoA71kmstOcceiL f3NCbsB5u2xCFDSOeGFZnNTsr/zqSrVUpXTEzbVq7v10vfV9vOpQffP3pqkm l79q6l4LPs6aOoYYg4/W3b96qrOxWMcKuOkXVDTi6wg9u8/blzV14DrKgDR3 N1fE1i0idp1FD37R9mwDn1gMo9tOmD0h0z/BrlS/+4tc5bCm1Cz7Y5n/1ZKx N2sLn72H37E3CeN0VxcMD3t2L/eGc4h4z0/s1xhnq3UdkuaUL1EQ77Dc068J 2INDG/nGJK9pXy1KP0DQd8oHQPSbqlTsFM/jAISaxmoQu/7chtjjdY/rnyjR 31JI642doJwceIv0gA1fL9TKguv4GrRO11O4n7us4SFWO1cnjWKctBo7kHCj kOPEHqemQwgdjDYccbIw5Zfef7F8leOODvt2YfbrVpxohPrXNtYBt3I5CgpZ XGc0u4UCsFBbivK3uXPhxuSSU9DQCBpYQMwq9OxgnV/jv8pwyRTQ1yYsnFxf CxqddHYe+afwuVvjjpt3hcd0CTQ0rNn4jhPey5dcDszjw0dHCi1hEe33OTjG aAz/G6xn3Cwk+5ERV3w3h4OuZRAq176DQ9vmcILOFBcMYKyac78szOhYnM+D f4spWinDPkvwQw3FdDzf+qa9qTiA0KV5MBCjcaeNCgu2JfHGVyI0R0uv8tnQ 6FLXBK7kFFusAVx5u4XZQfEmC68VMcb04xKtvG3OxPsa21CZKoWeaKrPhYd8 OZ2K03yuY/dEoAQH/FoMZtInAGtNYD5WrWJtv02K2QI9ywvnddtLhysf7u5s 3dkBu9FGuU6Hhdqt7cJU2/lFFi5Xyc9nLroRDcO/TkQ9UVkLxSru2UXVR/7P lej9O5zD012Fj3VDGc7ycM9TdWUyBgwOskTrsEPoMJ502lPCMeKtxFSYB4se N57b7K2yVdg2hF4spSv3Wg6J2/ns8wQAPSeMzfQqZw7jRVHexymqDm/Z4nh8 g/H0E70YkiCYkFMQKlYu/vTGJOfW9OkIF4BZdHvD21/RBBYv79GGu66CVN7z zq6HwoVaRmcJcO1LQVZnA3gGyYdRnKmAwXns47BR4LZWZvdEkAj371hcPSNk AeQq7XLm6U98wBWJQDuwbcdohOjQydm46xvFnHnvg7UHAgNgoVvCLoVklciL 0x2vxf8rD5tHcQ7YceGCTByB9VBe+8GNM/2aY+KyirNofG1GPZ2ZHYG8AXx+ fDN/3FYbnoHu5qs6JC1OO8/g2ithubNmTJgdnSKwKcnl4HgJHa/Nx99cazCa 9ifgN/g3FPwyo3sEFCr8igqW4piRwB/yEmq+XaJuC+08AB4/aw5NOZkGQM4K KgBMbvqvxya2e59TdzjC9+afFg3hSg9MULJ57zF98+We7MIIyTol1Ms1UNVF ShOA1BDj+A880ft3OOcWtW42042pQsQbZU5I6EhOaPwGBHSnmWFRMGPuf9Nb 5bMYs3wdEbSR9wCif+udIaoTzG78v17ub3RA6LeaCkUoLhtBdi9nkHB5zizn paK6ugGJ7KLkCv99YapIjnvEbjOMtjBe3xgut3w9LSfnLfUV9osuuUZyHKq4 DyjmnYLLqG9Lpq5X7biqrcipuAzuC8g059qNVTbbkyOGcExl2piPnD970MOu dEx2tOtIvzhQq+D+HnMVX4LD/efuebW8xTouB5NJf/GquNVfqUP86po+aNDk DrwM+u6kguC4reuDwYBBy9zdn/Ti5N9yIY/N/WSPsys3BX9T65hj95GdfMII mJ7gGvA1GOprPEYkr9sBL7DyywvDCanyErtjH1WK5QIvmiK9qvM9l4dLXP/E h531K2durgi/gs31h02xyQV20WWkz288cPE6HtEJD+7D5AHuTeMzQ33mV1J3 K3+3cYbKbeVoV/H5uBjG0YH7LeDW4PARa/yC4q6Oa3Wwd62LNr7Xl8B92hoc N90Me9gxgTl59J2uFU7/RIn+BueeaZ+Yi0hRJ8fnuXQxuDy4CGR+5ky5VOwy ouhYBAs1U4qLG19PD3u/vWuDnKLeHIuQrYlzGV93oHDMz4+gWk4xb2ewNVg+ GoCvwhIV7jn+qm0f1vVY11zsan/xR1X0hYGCFH+1eAmGK1tDpOZ7Z4uHhdTY L8uS9gMPFsRdw+26AD1MAYqCWvUkzT+/EEp5S+jnyX/mx9EjAeMKqohH7iDF tPk1ftkmawzuteY3rF4bMKA79OLPnjJ3pia9eHVoZgKRN0gu2PbS0P6asiHr Pa28T3BAx5TZJgO8j8Hix+Mnj5yf1RFVreC1TABLZjcHv9D3rjjDWSbONHmW /okW6hoZcprDXeeGbXc1crO83UEHT3cfHjjWMuFn7wS6sZQ51/mexSYFPAKC 64R+d/rc78oSepnWhFTn4PVWnK7R0BLT3sealPvfsUo8r3muZA4409VurvC9 VsHoqlvXCGA6rQaeqznfQb8QCafKjMtlPJuZdXx642X76C6TRkYOx9m8Ja6i 0y/oEW0TeU0GW0b6tBN+DaA5+XKk4T9TImjJ/0N0bjhuxQG7yvYDYeyrC9HO CMDUFy2BKLtgE9sGs0TRcZ3Ow3XUA7RzT2w9J774dTMXgDNzZ6dbuDDE4UaU 8kf0SsA0glM6d4t1fA/MtIDptPn1V9qiWxEJdneAHELmOBctpWM2nm/o2Jos cbny93W3DbwVw19XNuFGIn4tvrwAmdBVIID1ro134R/ue3RizbJawZml1cXx TpBXDk7kpT/6UUjF3oYNKXasJ2biMPcW7L4BI9j1N8+Pr72nCw8UCNc4DUhO PZBTN4iWeu/W3g2Flr7iCUBqh7Jc10Jb58v0zz47lDk/wYKial2STccIHzDl Xuq5Wfvukm/jmfc8V1kPSOm0AwHvDHZYonVGeANq4dJUkEHlYvGD1R0tYKN9 kByPfEfLoI/nyatgOFmMZ1iFy/3O7Qiud3xVeFsoU4AivFN3u0aIbhJixiXb 6Q9LuxyzkqF50zYX4MTPWpzR3su5hpLC7tbUAjN4HFZa7ZLdYHBzXszpCiws QHSlph/jUsvj/VkC21BE2JyNRi8f/MZ8tZjFkCjXlds/UqLfcK6cL1dsegrv euecLu0vrH+YK3q/UO0FhrKcqI7H7XXXAtcAe/Cs3bgbZHIacO9PKdeJzYKd hB5sgANGn+HrDHZ5GgbjTBMdAZnYnAGqv90KYp52E/sCI7rOfjmc+7RmyPVx OVkcgXh8szNOO6/460K5+phaCAnABIjkEX9Vcdgt9RR9yzExFVhvUx8Tv45g fvnc4/I6H74WV5zAh0ofaoUxdabMruCCWVe1YPYHOOu0Psqem2u6PeBjMdab HeINE9PWEU7v1tp9RDnvC9GdSAHF4VwwCHdx57sz2l1k8aT5k1V3B+i8okuT kssHgC3Iy21uNOyzgWQIAXW8LSlb0+rz2qvJC1ScyGefp8pajlesdzsXfWAr oVwXsCzueaLi4lnAMa5qDUy6i7WAA3WKvPDHsA53DjqQCs/myPyO0Zy2vzvN EGS8iT3gd1pNkk0ePNdxWlh6VWt9XWu1lAhrsRDB5QgZuxPfNYJi1Yb92oAT 8HQO3mrGS2wCxeZOl5Y52eBnxyXnbg/Q7eqP11r+cTtz29ajvKpw/4ES/Q3O XY4hOVzrYNk2hvoNLrEaTjKco/6g8RfBk1VOA9Ev+uA8EEATNKeXvRj4Wt2n 752k6xCj6lAOtLRAPI72kwUI5gIHWATrADq8mltA0gmchE3u1n5VUgaH5zdM 2xQnzNPFc+4J+wpucWvTSfb90qE7eZfjtDGlOad8b5JzFPaJFU8w0D4cItFe J4cg3rCg+ytjiKFbAGN/WXdCasL5ugXZAH/bB9Dgp3qxSRLkW4oKijeZzrU/ pwP3vqRhBruBLF0w5DATZGHO3F9n3qRfUc20SsXA/5YmnLgFDgxxd7bnX4VV o548TnE1FbRzjeXE/gIkDwv6ju1Nh/tEXGzcy3s7ZwnxPGx/slnm+MpmQsWV Sc9CtkDF6IFvglcALB772jJes/FymLEViHa8UwSkZV0H/vNjf6i1dUFuoJ5W 8Ob5LRDAk17Xr5KeWxYMyXYDIuo2HW1eDkwt7qQ8P5nEma5rbbR6nQIchsmw NoaVCHlfHvfM22Jnd10mt5DYB3724BLlk1f5GrvthFRxIyT8nNcExr/FwpIj aWr/cyX6H6JzwCJn6tz2vTyXK/5crOrIcHxH+6YRWQCJc0IPbEJ305yJtue5 ux3BO7ZHBTliN6QWV2K5PksPGoZ9ou3ruu5W59vT1oZzqruVhUCSo4qtyr6T wlGoXCGoLw9bwO17s5Bw5K+L8Qsjh+uW6fK8JTvttkIYptMZ4Y37XLlZI3id Ey7BgJdbZoP0xDGbWNivu27iWaOq7G7o97Sgtlgf85gU2uc/4n7Wbg0Xip3u 18TJYCfc1neZ6/zSo/wpKw/cAtNuu5L9uBfAi56+v2beIeHDhSt22yCKBfyK +442wR7hmwPRzJa6uM4xTi7Odm4l8M71CGPfvoGhX1txRr3dcZ0er6Sv4vRk LGfd6WtraLIt231v3HVbOwzxXniJHc5hAR78cHZW4PMOHg44ltfoTEHEN987 Ozz51CINSJ9TpVwGhopWJ+ru29Pcwm5wJeQQXREfHMjY3UiBpf7myjWXoMT+ nO7fwIo+2N/m/hXUHBO+valrilJ966oJee0ceU+O6JUnw46/3oFicek1TnyD MxX79VqlmqWq6NX4R0r0G87VlOzIAvDj7O3YFXeupJkjVb6VcA79hPS2NjsM E38KWMKm2XqZPNr9pdDA5Kb4frve7+qIrCQmGcC+vpfKTlCNopCUoMTVgJa1 49M9DrvVsjoUEwRNS9g3LBsPNJ10bInY/UHN4CC06BykZ9RRuFg7kDk0gGSd +9De0xUGcxb37aFLkAIgZ7YgHVMfPovqTIRWrQkTJAy3HD1JwgbC+4LD/1Zw C68sPjDlbifb0YcFXW7KqGl+42IhwQdk8wJGuo7xSPh75yg+8TGisr/pGv2b nEsb7WNG8e7ZqtUqV/3aZ63b5V9xx+5AE9x+3S2PxY33r4b+60ir/ftxX4wx CGtPTofh2Yz92Wesm8swQavc0XIrD4Bbv8d37sPyDB6jjacAkYsDgbVq4tAR ipjer2keSViDizE7OT78QZzpU80TJXVhD5iDQ7lJY3wc+vO6U6dhxmwuiT/F V64GAbCCLopDzrnYysF1RxrjUfYmv9dVW3VYPWiW167MDt0qM+qkl7mIveFc K6Ad6t0grmOVNrhBvnTXEv0DJfobnAPbj1Pi2DjDw9WV3EAI7gs73RGzOFEM a7AbNlmuD/qpj7uKnero6Imd0jrk5nF8IjSfk3bloHM9XAHYvjCy6SVnUzxA kBtGZnh9dRLcx2rp2PP4VmRrMrLxznKA0YbVHa4bzB+2h9Y4ccq5x3D17LJ1 52jb5z7hoFvQw7Jt/GzD1EeO3D2i31AUoCdM/+Nrxk846I7Zs+AYLnhCZ6Od eO3Yu/8epzTCKlJyWc45VpvVFyK2q+yDwc7XdyylHRlppId3fGEOXWpR9xRk SKs1cdEd0E6DSZvS0OvaefVToW0v4LP2yfKyazfdrKITJ+zsc9tPB3njPMuN m7EWvWHRLycc2RH59YyIsIHnnASgzowO2M/1Cq7UPO+98tNuCRtzuwkeQ/Nm Pi6XWMN/zm9Pyipm7wfCj3KGI70IiKGMEz4la92gJlw5O2Exr6npxX6R4TYX fJIxuKVEECYu63WDagEPyx1u0MLz2Kaxl/0gktBcR+4WV3oN4GW/un2SCQL3 fBMUgjXHxbVo9r0jnOW2N810djv6/ZcS/V//5X/78/Pn58/Pn58/P39+/vz8 +fnz8+fnz8+fnz8/f37+/Pz5+fPz5+fPz/+yn/8bquMtYgAYAQA= --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" 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: 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 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 Mon Jun 24 08:35:42 2002 From: Casey Marshall (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: 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: 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 Tue Jun 25 08:53:07 2002 From: Casey Marshall (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: 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: 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 Thu Jun 27 12:13:33 2002 From: Casey Marshall (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: 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: 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: Content-Description: TestOf* patch Content-Disposition: attachment; filename="patch-tests.gz" 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 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: 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: <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: <3D1C554E.8080105@fl.net.au> Message-ID: <871yark1tx.fsf@pooh-sticks-bridge.tapsellferrier.co.uk> "Raif S. Naffah" 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: <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" 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" 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" 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" 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