OpenSSL 0.9.5a merge
authorbeck <beck@openbsd.org>
Sat, 15 Apr 2000 06:18:28 +0000 (06:18 +0000)
committerbeck <beck@openbsd.org>
Sat, 15 Apr 2000 06:18:28 +0000 (06:18 +0000)
366 files changed:
lib/libcrypto/Makefile
lib/libcrypto/Makefile.ssl
lib/libcrypto/asn1/asn1_err.c
lib/libcrypto/asn1/p5_pbe.c
lib/libcrypto/asn1/p5_pbev2.c
lib/libcrypto/asn1/t_req.c
lib/libcrypto/asn1/x_pubkey.c
lib/libcrypto/bf/Makefile.ssl
lib/libcrypto/bf/Makefile.uni
lib/libcrypto/bf/asm/b-win32.asm
lib/libcrypto/bio/Makefile.ssl
lib/libcrypto/bio/b_print.c
lib/libcrypto/bio/bio.h
lib/libcrypto/bio/bio_err.c
lib/libcrypto/bio/bio_lib.c
lib/libcrypto/bio/bss_bio.c
lib/libcrypto/bio/bss_log.c
lib/libcrypto/bn/Makefile.ssl
lib/libcrypto/bn/asm/bn-win32.asm
lib/libcrypto/bn/asm/x86w16.asm
lib/libcrypto/bn/asm/x86w32.asm
lib/libcrypto/bn/bn.h
lib/libcrypto/bn/bn_err.c
lib/libcrypto/bn/bn_mont.c
lib/libcrypto/bn/bn_mul.c
lib/libcrypto/bn/bntest.c
lib/libcrypto/buffer/buf_err.c
lib/libcrypto/cast/Makefile.ssl
lib/libcrypto/cast/Makefile.uni
lib/libcrypto/cast/asm/c-win32.asm
lib/libcrypto/cast/cast_lcl.h
lib/libcrypto/comp/comp_err.c
lib/libcrypto/conf/conf_err.c
lib/libcrypto/cpt_err.c
lib/libcrypto/crypto-lib.com
lib/libcrypto/des/DES.pod
lib/libcrypto/des/MODES.DES
lib/libcrypto/des/Makefile.PL
lib/libcrypto/des/Makefile.lit
lib/libcrypto/des/Makefile.ssl
lib/libcrypto/des/Makefile.uni
lib/libcrypto/des/PC1
lib/libcrypto/des/PC2
lib/libcrypto/des/asm/d-win32.asm
lib/libcrypto/des/asm/y-win32.asm
lib/libcrypto/des/des.c
lib/libcrypto/des/des.h
lib/libcrypto/des/des.man
lib/libcrypto/des/des.pl
lib/libcrypto/des/des.pod [new file with mode: 0644]
lib/libcrypto/des/des_crypt.man
lib/libcrypto/des/des_locl.h
lib/libcrypto/des/destest.c
lib/libcrypto/des/doIP
lib/libcrypto/des/doPC1
lib/libcrypto/des/doPC2
lib/libcrypto/des/fcrypt.c
lib/libcrypto/des/fcrypt_b.c
lib/libcrypto/des/ncbc_enc.c
lib/libcrypto/des/podd.h
lib/libcrypto/des/qud_cksm.c
lib/libcrypto/des/rand_key.c
lib/libcrypto/des/set_key.c
lib/libcrypto/des/shifts.pl
lib/libcrypto/des/sk.h
lib/libcrypto/des/testdes.pl
lib/libcrypto/dh/dh_err.c
lib/libcrypto/doc/DH_set_method.pod
lib/libcrypto/doc/DSA_set_method.pod
lib/libcrypto/doc/EVP_OpenInit.pod [new file with mode: 0644]
lib/libcrypto/doc/EVP_SealInit.pod [new file with mode: 0644]
lib/libcrypto/doc/EVP_SignInit.pod [new file with mode: 0644]
lib/libcrypto/doc/EVP_VerifyInit.pod [new file with mode: 0644]
lib/libcrypto/doc/RAND_add.pod
lib/libcrypto/doc/RAND_set_rand_method.pod
lib/libcrypto/doc/RSA_set_method.pod
lib/libcrypto/doc/rsa.pod
lib/libcrypto/dsa/dsa_err.c
lib/libcrypto/dsa/dsa_key.c
lib/libcrypto/err/err.c
lib/libcrypto/evp/evp_err.c
lib/libcrypto/evp/evp_pkey.c
lib/libcrypto/evp/names.c
lib/libcrypto/hmac/hmac.c
lib/libcrypto/lhash/lhash.c
lib/libcrypto/lhash/lhash.h
lib/libcrypto/md5/Makefile.ssl
lib/libcrypto/md5/Makefile.uni
lib/libcrypto/md5/asm/m5-win32.asm
lib/libcrypto/md5/md5_locl.h
lib/libcrypto/mem_dbg.c
lib/libcrypto/objects/o_names.c
lib/libcrypto/objects/obj_err.c
lib/libcrypto/objects/objects.h
lib/libcrypto/opensslv.h
lib/libcrypto/pem/pem_err.c
lib/libcrypto/pem/pem_lib.c
lib/libcrypto/perlasm/x86asm.pl
lib/libcrypto/perlasm/x86ms.pl
lib/libcrypto/perlasm/x86unix.pl
lib/libcrypto/pkcs12/p12_crt.c
lib/libcrypto/pkcs12/p12_key.c
lib/libcrypto/pkcs12/p12_kiss.c
lib/libcrypto/pkcs12/p12_mutl.c
lib/libcrypto/pkcs12/pk12err.c
lib/libcrypto/pkcs12/pkcs12.h
lib/libcrypto/pkcs7/README
lib/libcrypto/pkcs7/pk7_doit.c
lib/libcrypto/pkcs7/pkcs7err.c
lib/libcrypto/rand/md_rand.c
lib/libcrypto/rand/rand.h
lib/libcrypto/rand/rand_egd.c
lib/libcrypto/rand/rand_err.c
lib/libcrypto/rand/rand_lib.c
lib/libcrypto/rand/randfile.c
lib/libcrypto/rc2/Makefile.uni
lib/libcrypto/rc4/Makefile.ssl
lib/libcrypto/rc4/Makefile.uni
lib/libcrypto/rc4/asm/r4-win32.asm
lib/libcrypto/rc5/Makefile.ssl
lib/libcrypto/rc5/Makefile.uni
lib/libcrypto/rc5/asm/r5-win32.asm
lib/libcrypto/ripemd/Makefile.ssl
lib/libcrypto/ripemd/Makefile.uni
lib/libcrypto/ripemd/asm/rm-win32.asm
lib/libcrypto/ripemd/rmd_locl.h
lib/libcrypto/rsa/rsa_err.c
lib/libcrypto/sha/Makefile.ssl
lib/libcrypto/sha/Makefile.uni
lib/libcrypto/sha/asm/s1-win32.asm
lib/libcrypto/sha/asm/sha1-586.pl
lib/libcrypto/sha/sha_locl.h
lib/libcrypto/util/libeay.num
lib/libcrypto/util/mk1mf.pl
lib/libcrypto/util/mkerr.pl
lib/libcrypto/util/pl/BC-32.pl
lib/libcrypto/util/pl/Mingw32.pl
lib/libcrypto/util/selftest.pl
lib/libcrypto/util/sep_lib.sh
lib/libcrypto/x509/x509.h
lib/libcrypto/x509/x509_err.c
lib/libcrypto/x509/x509_trs.c
lib/libcrypto/x509/x509_vfy.c
lib/libcrypto/x509/x509name.c
lib/libcrypto/x509v3/v3_purp.c
lib/libcrypto/x509v3/v3err.c
lib/libcrypto/x509v3/x509v3.h
lib/libssl/s3_clnt.c
lib/libssl/s3_lib.c
lib/libssl/s3_srvr.c
lib/libssl/src/MacOS/GetHTTPS.src/GetHTTPS.cpp
lib/libssl/src/MacOS/OpenSSL.mcp.hqx
lib/libssl/src/MacOS/Randomizer.cpp [new file with mode: 0644]
lib/libssl/src/MacOS/Randomizer.h [new file with mode: 0644]
lib/libssl/src/apps/CA.pl
lib/libssl/src/apps/Makefile.ssl
lib/libssl/src/apps/app_rand.c
lib/libssl/src/apps/ca.c
lib/libssl/src/apps/dh.c
lib/libssl/src/apps/dhparam.c
lib/libssl/src/apps/eay.c
lib/libssl/src/apps/gendh.c
lib/libssl/src/apps/gendsa.c
lib/libssl/src/apps/genrsa.c
lib/libssl/src/apps/makeapps.com
lib/libssl/src/apps/openssl.c
lib/libssl/src/apps/pkcs12.c
lib/libssl/src/apps/progs.h
lib/libssl/src/apps/rand.c [new file with mode: 0644]
lib/libssl/src/apps/req.c
lib/libssl/src/apps/rsa.c
lib/libssl/src/apps/rsa/01.pem
lib/libssl/src/apps/rsa/1.txt
lib/libssl/src/apps/rsa/SecureServer.pem
lib/libssl/src/apps/rsa/s.txt
lib/libssl/src/apps/s_apps.h
lib/libssl/src/apps/s_cb.c
lib/libssl/src/apps/s_client.c
lib/libssl/src/apps/s_socket.c
lib/libssl/src/apps/smime.c
lib/libssl/src/apps/speed.c
lib/libssl/src/apps/spkac.c
lib/libssl/src/apps/testdsa.h
lib/libssl/src/apps/testrsa.h
lib/libssl/src/apps/tkca
lib/libssl/src/apps/winrand.c [new file with mode: 0644]
lib/libssl/src/apps/x509.c
lib/libssl/src/crypto/Makefile
lib/libssl/src/crypto/Makefile.ssl
lib/libssl/src/crypto/asn1/asn1_err.c
lib/libssl/src/crypto/asn1/p5_pbe.c
lib/libssl/src/crypto/asn1/p5_pbev2.c
lib/libssl/src/crypto/asn1/t_req.c
lib/libssl/src/crypto/asn1/x_pubkey.c
lib/libssl/src/crypto/bf/Makefile.ssl
lib/libssl/src/crypto/bf/Makefile.uni
lib/libssl/src/crypto/bf/asm/b-win32.asm
lib/libssl/src/crypto/bio/Makefile.ssl
lib/libssl/src/crypto/bio/b_print.c
lib/libssl/src/crypto/bio/bio.h
lib/libssl/src/crypto/bio/bio_err.c
lib/libssl/src/crypto/bio/bio_lib.c
lib/libssl/src/crypto/bio/bss_bio.c
lib/libssl/src/crypto/bio/bss_log.c
lib/libssl/src/crypto/bn/Makefile.ssl
lib/libssl/src/crypto/bn/asm/bn-win32.asm
lib/libssl/src/crypto/bn/asm/x86w16.asm
lib/libssl/src/crypto/bn/asm/x86w32.asm
lib/libssl/src/crypto/bn/bn.h
lib/libssl/src/crypto/bn/bn_err.c
lib/libssl/src/crypto/bn/bn_mont.c
lib/libssl/src/crypto/bn/bn_mul.c
lib/libssl/src/crypto/bn/bntest.c
lib/libssl/src/crypto/buffer/buf_err.c
lib/libssl/src/crypto/cast/Makefile.ssl
lib/libssl/src/crypto/cast/Makefile.uni
lib/libssl/src/crypto/cast/asm/c-win32.asm
lib/libssl/src/crypto/cast/cast_lcl.h
lib/libssl/src/crypto/comp/comp_err.c
lib/libssl/src/crypto/conf/conf_err.c
lib/libssl/src/crypto/cpt_err.c
lib/libssl/src/crypto/crypto-lib.com
lib/libssl/src/crypto/des/DES.pod
lib/libssl/src/crypto/des/MODES.DES
lib/libssl/src/crypto/des/Makefile.PL
lib/libssl/src/crypto/des/Makefile.lit
lib/libssl/src/crypto/des/Makefile.ssl
lib/libssl/src/crypto/des/Makefile.uni
lib/libssl/src/crypto/des/PC1
lib/libssl/src/crypto/des/PC2
lib/libssl/src/crypto/des/asm/d-win32.asm
lib/libssl/src/crypto/des/asm/y-win32.asm
lib/libssl/src/crypto/des/des.c
lib/libssl/src/crypto/des/des.h
lib/libssl/src/crypto/des/des.man
lib/libssl/src/crypto/des/des.pl
lib/libssl/src/crypto/des/des.pod [new file with mode: 0644]
lib/libssl/src/crypto/des/des_crypt.man
lib/libssl/src/crypto/des/des_locl.h
lib/libssl/src/crypto/des/destest.c
lib/libssl/src/crypto/des/doIP
lib/libssl/src/crypto/des/doPC1
lib/libssl/src/crypto/des/doPC2
lib/libssl/src/crypto/des/fcrypt.c
lib/libssl/src/crypto/des/fcrypt_b.c
lib/libssl/src/crypto/des/ncbc_enc.c
lib/libssl/src/crypto/des/podd.h
lib/libssl/src/crypto/des/qud_cksm.c
lib/libssl/src/crypto/des/rand_key.c
lib/libssl/src/crypto/des/set_key.c
lib/libssl/src/crypto/des/shifts.pl
lib/libssl/src/crypto/des/sk.h
lib/libssl/src/crypto/des/testdes.pl
lib/libssl/src/crypto/dh/dh_err.c
lib/libssl/src/crypto/dsa/dsa_err.c
lib/libssl/src/crypto/dsa/dsa_key.c
lib/libssl/src/crypto/err/err.c
lib/libssl/src/crypto/evp/evp_err.c
lib/libssl/src/crypto/evp/evp_pkey.c
lib/libssl/src/crypto/evp/names.c
lib/libssl/src/crypto/hmac/hmac.c
lib/libssl/src/crypto/lhash/lhash.c
lib/libssl/src/crypto/lhash/lhash.h
lib/libssl/src/crypto/md5/Makefile.ssl
lib/libssl/src/crypto/md5/Makefile.uni
lib/libssl/src/crypto/md5/asm/m5-win32.asm
lib/libssl/src/crypto/md5/md5_locl.h
lib/libssl/src/crypto/mem_dbg.c
lib/libssl/src/crypto/objects/o_names.c
lib/libssl/src/crypto/objects/obj_err.c
lib/libssl/src/crypto/objects/objects.h
lib/libssl/src/crypto/opensslv.h
lib/libssl/src/crypto/pem/pem_err.c
lib/libssl/src/crypto/pem/pem_lib.c
lib/libssl/src/crypto/perlasm/x86asm.pl
lib/libssl/src/crypto/perlasm/x86ms.pl
lib/libssl/src/crypto/perlasm/x86unix.pl
lib/libssl/src/crypto/pkcs12/p12_crt.c
lib/libssl/src/crypto/pkcs12/p12_key.c
lib/libssl/src/crypto/pkcs12/p12_kiss.c
lib/libssl/src/crypto/pkcs12/p12_mutl.c
lib/libssl/src/crypto/pkcs12/pk12err.c
lib/libssl/src/crypto/pkcs12/pkcs12.h
lib/libssl/src/crypto/pkcs7/README
lib/libssl/src/crypto/pkcs7/pk7_doit.c
lib/libssl/src/crypto/pkcs7/pkcs7err.c
lib/libssl/src/crypto/rand/md_rand.c
lib/libssl/src/crypto/rand/rand.h
lib/libssl/src/crypto/rand/rand_egd.c
lib/libssl/src/crypto/rand/rand_err.c
lib/libssl/src/crypto/rand/rand_lib.c
lib/libssl/src/crypto/rand/randfile.c
lib/libssl/src/crypto/rc2/Makefile.uni
lib/libssl/src/crypto/rc4/Makefile.ssl
lib/libssl/src/crypto/rc4/Makefile.uni
lib/libssl/src/crypto/rc4/asm/r4-win32.asm
lib/libssl/src/crypto/rc5/Makefile.ssl
lib/libssl/src/crypto/rc5/Makefile.uni
lib/libssl/src/crypto/rc5/asm/r5-win32.asm
lib/libssl/src/crypto/ripemd/Makefile.ssl
lib/libssl/src/crypto/ripemd/Makefile.uni
lib/libssl/src/crypto/ripemd/asm/rm-win32.asm
lib/libssl/src/crypto/ripemd/rmd_locl.h
lib/libssl/src/crypto/rsa/rsa_err.c
lib/libssl/src/crypto/sha/Makefile.ssl
lib/libssl/src/crypto/sha/Makefile.uni
lib/libssl/src/crypto/sha/asm/s1-win32.asm
lib/libssl/src/crypto/sha/asm/sha1-586.pl
lib/libssl/src/crypto/sha/sha_locl.h
lib/libssl/src/crypto/x509/x509.h
lib/libssl/src/crypto/x509/x509_err.c
lib/libssl/src/crypto/x509/x509_trs.c
lib/libssl/src/crypto/x509/x509_vfy.c
lib/libssl/src/crypto/x509/x509name.c
lib/libssl/src/crypto/x509v3/v3_purp.c
lib/libssl/src/crypto/x509v3/v3err.c
lib/libssl/src/crypto/x509v3/x509v3.h
lib/libssl/src/doc/apps/CA.pl.pod
lib/libssl/src/doc/apps/dgst.pod
lib/libssl/src/doc/apps/dhparam.pod
lib/libssl/src/doc/apps/genrsa.pod
lib/libssl/src/doc/apps/openssl.pod
lib/libssl/src/doc/apps/rand.pod [new file with mode: 0644]
lib/libssl/src/doc/apps/s_client.pod
lib/libssl/src/doc/apps/x509.pod
lib/libssl/src/doc/crypto/DH_set_method.pod
lib/libssl/src/doc/crypto/DSA_set_method.pod
lib/libssl/src/doc/crypto/EVP_OpenInit.pod [new file with mode: 0644]
lib/libssl/src/doc/crypto/EVP_SealInit.pod [new file with mode: 0644]
lib/libssl/src/doc/crypto/EVP_SignInit.pod [new file with mode: 0644]
lib/libssl/src/doc/crypto/EVP_VerifyInit.pod [new file with mode: 0644]
lib/libssl/src/doc/crypto/RAND_add.pod
lib/libssl/src/doc/crypto/RAND_set_rand_method.pod
lib/libssl/src/doc/crypto/RSA_set_method.pod
lib/libssl/src/doc/crypto/blowfish.pod
lib/libssl/src/doc/crypto/des.pod [new file with mode: 0644]
lib/libssl/src/doc/crypto/des_modes.pod
lib/libssl/src/doc/crypto/rsa.pod
lib/libssl/src/ms/mingw32.bat [new file with mode: 0644]
lib/libssl/src/ms/test.bat
lib/libssl/src/rsaref/rsar_err.c
lib/libssl/src/shlib/Makefile.hpux10-cc [new file with mode: 0644]
lib/libssl/src/shlib/hpux10-cc.sh [new file with mode: 0644]
lib/libssl/src/ssl/s3_clnt.c
lib/libssl/src/ssl/s3_lib.c
lib/libssl/src/ssl/s3_srvr.c
lib/libssl/src/ssl/ssl.h
lib/libssl/src/ssl/ssl_cert.c
lib/libssl/src/ssl/ssl_ciph.c
lib/libssl/src/ssl/ssl_err.c
lib/libssl/src/ssl/ssl_lib.c
lib/libssl/src/ssl/ssl_txt.c
lib/libssl/src/ssl/ssltest.c
lib/libssl/src/util/libeay.num
lib/libssl/src/util/mk1mf.pl
lib/libssl/src/util/mkerr.pl
lib/libssl/src/util/pl/BC-32.pl
lib/libssl/src/util/pl/Mingw32.pl
lib/libssl/src/util/selftest.pl
lib/libssl/src/util/sep_lib.sh
lib/libssl/ssl.h
lib/libssl/ssl_cert.c
lib/libssl/ssl_ciph.c
lib/libssl/ssl_err.c
lib/libssl/ssl_lib.c
lib/libssl/ssl_txt.c

index 24b7f32..b980f54 100644 (file)
@@ -40,7 +40,7 @@ LIBOBJ= cryptlib.o mem.o mem_dbg.o cversion.o ex_data.o tmdiff.o cpt_err.o ebcdi
 SRC= $(LIBSRC)
 
 EXHEADER= crypto.h tmdiff.h opensslv.h opensslconf.h ebcdic.h
-HEADER=        cryptlib.h buildinf.h $(EXHEADER)
+HEADER=        cryptlib.h buildinf.h md32_common.h $(EXHEADER)
 
 ALL=    $(GENERAL) $(SRC) $(HEADER)
 
index cab75d9..f9b3358 100644 (file)
@@ -40,7 +40,7 @@ LIBOBJ= cryptlib.o mem.o mem_dbg.o cversion.o ex_data.o tmdiff.o cpt_err.o ebcdi
 SRC= $(LIBSRC)
 
 EXHEADER= crypto.h tmdiff.h opensslv.h opensslconf.h ebcdic.h
-HEADER=        cryptlib.h buildinf.h $(EXHEADER)
+HEADER=        cryptlib.h buildinf.h md32_common.h $(EXHEADER)
 
 ALL=    $(GENERAL) $(SRC) $(HEADER)
 
index b183814..cecd555 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index 64e9023..a147ac3 100644 (file)
@@ -129,7 +129,7 @@ X509_ALGOR *PKCS5_pbe_set(int alg, int iter, unsigned char *salt,
        }
        pbe->salt->length = saltlen;
        if (salt) memcpy (pbe->salt->data, salt, saltlen);
-       else if (RAND_bytes (pbe->salt->data, saltlen) <= 0)
+       else if (RAND_pseudo_bytes (pbe->salt->data, saltlen) < 0)
                return NULL;
 
        if (!(astype = ASN1_TYPE_new())) {
index 4ce06a9..1bbdb10 100644 (file)
@@ -194,7 +194,8 @@ X509_ALGOR *PKCS5_pbe2_set(const EVP_CIPHER *cipher, int iter,
        if(!(scheme->parameter = ASN1_TYPE_new())) goto merr;
 
        /* Create random IV */
-       RAND_pseudo_bytes(iv, EVP_CIPHER_iv_length(cipher));
+       if (RAND_pseudo_bytes(iv, EVP_CIPHER_iv_length(cipher)) < 0)
+               goto err;
 
        /* Dummy cipherinit to just setup the IV */
        EVP_CipherInit(&ctx, cipher, NULL, iv, 0);
@@ -212,7 +213,7 @@ X509_ALGOR *PKCS5_pbe2_set(const EVP_CIPHER *cipher, int iter,
        if (!(osalt->data = Malloc (saltlen))) goto merr;
        osalt->length = saltlen;
        if (salt) memcpy (osalt->data, salt, saltlen);
-       else if (RAND_bytes (osalt->data, saltlen) <= 0) goto merr;
+       else if (RAND_pseudo_bytes (osalt->data, saltlen) < 0) goto merr;
 
        if(iter <= 0) iter = PKCS5_DEFAULT_ITER;
        if(!ASN1_INTEGER_set(kdf->iter, iter)) goto merr;
index 81dd635..ea1af09 100644 (file)
@@ -119,7 +119,7 @@ int X509_REQ_print(BIO *bp, X509_REQ *x)
 
        pkey=X509_REQ_get_pubkey(x);
 #ifndef NO_RSA
-       if (pkey->type == EVP_PKEY_RSA)
+       if (pkey != NULL && pkey->type == EVP_PKEY_RSA)
                {
                BIO_printf(bp,"%12sRSA Public Key: (%d bit)\n","",
                        BN_num_bits(pkey->pkey.rsa->n));
@@ -128,7 +128,7 @@ int X509_REQ_print(BIO *bp, X509_REQ *x)
        else 
 #endif
 #ifndef NO_DSA
-               if (pkey->type == EVP_PKEY_DSA)
+               if (pkey != NULL && pkey->type == EVP_PKEY_DSA)
                {
                BIO_printf(bp,"%12sDSA Public Key:\n","");
                DSA_print(bp,pkey->pkey.dsa,16);
@@ -137,7 +137,8 @@ int X509_REQ_print(BIO *bp, X509_REQ *x)
 #endif
                BIO_printf(bp,"%12sUnknown Public Key:\n","");
 
-       EVP_PKEY_free(pkey);
+       if (pkey != NULL)
+           EVP_PKEY_free(pkey);
 
        /* may not be */
        sprintf(str,"%8sAttributes:\n","");
index 81e9815..7a05d57 100644 (file)
@@ -183,8 +183,10 @@ int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey)
 
        Free(s);
 
+#if 0
        CRYPTO_add(&pkey->references,1,CRYPTO_LOCK_EVP_PKEY);
        pk->pkey=pkey;
+#endif
 
        if (*x != NULL)
                X509_PUBKEY_free(*x);
index 15f6a63..cf2f7dd 100644 (file)
@@ -49,7 +49,7 @@ lib:  $(LIBOBJ)
 
 # elf
 asm/bx86-elf.o: asm/bx86unix.cpp
-       $(CPP) -DELF asm/bx86unix.cpp | as -o asm/bx86-elf.o
+       $(CPP) -DELF -x c asm/bx86unix.cpp | as -o asm/bx86-elf.o
 
 # solaris
 asm/bx86-sol.o: asm/bx86unix.cpp
@@ -65,7 +65,7 @@ asm/bx86-out.o: asm/bx86unix.cpp
 asm/bx86bsdi.o: asm/bx86unix.cpp
        $(CPP) -DBSDI asm/bx86unix.cpp | sed 's/ :/:/' | as -o asm/bx86bsdi.o
 
-asm/bx86unix.cpp:
+asm/bx86unix.cpp: asm/bf-586.pl ../perlasm/x86asm.pl ../perlasm/cbc.pl
        (cd asm; $(PERL) bf-586.pl cpp $(PROCESSOR) >bx86unix.cpp)
 
 files:
index f67e5ca..e69de29 100644 (file)
@@ -1,157 +0,0 @@
-# Targets
-# make          - twidle the options yourself :-)
-# make cc       - standard cc options
-# make gcc      - standard gcc options
-# make x86-elf  - linux-elf etc
-# make x86-out  - linux-a.out, FreeBSD etc
-# make x86-solaris
-# make x86-bdsi
-
-DIR=   bf
-TOP=   .
-# use BF_PTR2 for intel boxes,
-# BF_PTR for sparc and MIPS/SGI
-# use nothing for Alpha and HP.
-
-# There are 3 possible performance options, experiment :-)
-#OPTS= -DBF_PTR  # usr for sparc and MIPS/SGI
-#OPTS= -DBF_PTR2 # use for pentium
-OPTS=           # use for pentium pro, Alpha and HP
-
-MAKE=make -f Makefile
-#CC=cc
-#CFLAG= -O
-
-CC=gcc
-#CFLAG= -O4 -funroll-loops -fomit-frame-pointer
-CFLAG= -O3 -fomit-frame-pointer
-
-CFLAGS=$(OPTS) $(CFLAG)
-CPP=$(CC) -E
-AS=as
-RANLIB=ranlib
-
-# Assember version of bf_encrypt().
-BF_ENC=bf_enc.o                # normal C version
-#BF_ENC=asm/bx86-elf.o # elf format x86
-#BF_ENC=asm/bx86-out.o # a.out format x86
-#BF_ENC=asm/bx86-sol.o # solaris format x86 
-#BF_ENC=asm/bx86bsdi.o # bsdi format x86 
-
-LIBDIR=/usr/local/lib
-BINDIR=/usr/local/bin
-INCDIR=/usr/local/include
-MANDIR=/usr/local/man
-MAN1=1
-MAN3=3
-SHELL=/bin/sh
-LIBOBJ=bf_skey.o bf_ecb.o $(BF_ENC) bf_cfb64.o bf_ofb64.o
-LIBSRC=bf_skey.c bf_ecb.c bf_enc.c bf_cfb64.c bf_ofb64.c
-
-GENERAL=Makefile Makefile.ssl Makefile.uni asm bf_locl.org README \
-       COPYRIGHT blowfish.doc INSTALL
-
-TESTING=    bftest bfspeed bf_opts
-TESTING_SRC=bftest.c bfspeed.c bf_opts.c
-HEADERS=bf_locl.h blowfish.h bf_pi.h
-
-ALL=   $(GENERAL) $(TESTING_SRC) $(LIBSRC) $(HEADERS)
-
-BLIB=  libblowfish.a
-
-all: $(BLIB) $(TESTING)
-
-cc:
-       $(MAKE) CC=cc CFLAGS="-O $(OPTS) $(CFLAG)" all
-
-gcc:
-       $(MAKE) CC=gcc CFLAGS="-O3 -fomit-frame-pointer $(OPTS) $(CFLAG)" all
-
-x86-elf:
-       $(MAKE) BF_ENC='asm/bx86-elf.o' CC=$(CC) CFLAGS="-DELF $(OPTS) $(CFLAG)" all
-
-x86-out:
-       $(MAKE) BF_ENC='asm/bx86-out.o' CC=$(CC) CFLAGS="-DOUT $(OPTS) $(CFLAG)" all
-
-x86-solaris:
-       $(MAKE) BF_ENC='asm/bx86-sol.o' CC=$(CC) CFLAGS="-DSOL $(OPTS) $(CFLAG)" all
-
-x86-bsdi:
-       $(MAKE) BF_ENC='asm/bx86bsdi.o' CC=$(CC) CFLAGS="-DBSDI $(OPTS) $(CFLAG)" all
-
-# elf
-asm/bx86-elf.o: asm/bx86unix.cpp
-       $(CPP) -DELF asm/bx86unix.cpp | $(AS) -o asm/bx86-elf.o
-
-# solaris
-asm/bx86-sol.o: asm/bx86unix.cpp
-       $(CC) -E -DSOL asm/bx86unix.cpp | sed 's/^#.*//' > asm/bx86-sol.s
-       as -o asm/bx86-sol.o asm/bx86-sol.s
-       rm -f asm/bx86-sol.s
-
-# a.out
-asm/bx86-out.o: asm/bx86unix.cpp
-       $(CPP) -DOUT asm/bx86unix.cpp | $(AS) -o asm/bx86-out.o
-
-# bsdi
-asm/bx86bsdi.o: asm/bx86unix.cpp
-       $(CPP) -DBSDI asm/bx86unix.cpp | $(AS) -o asm/bx86bsdi.o
-
-asm/bx86unix.cpp:
-       (cd asm; perl bf-586.pl cpp >bx86unix.cpp)
-       
-test:  all
-       ./bftest
-
-$(BLIB): $(LIBOBJ)
-       /bin/rm -f $(BLIB)
-       ar cr $(BLIB) $(LIBOBJ)
-       $(RANLIB) $(BLIB)
-
-bftest: bftest.o $(BLIB)
-       $(CC) $(CFLAGS) -o bftest bftest.o $(BLIB)
-
-bfspeed: bfspeed.o $(BLIB)
-       $(CC) $(CFLAGS) -o bfspeed bfspeed.o $(BLIB)
-
-bf_opts: bf_opts.o $(BLIB)
-       $(CC) $(CFLAGS) -o bf_opts bf_opts.o $(BLIB)
-
-tags:
-       ctags $(TESTING_SRC) $(LIBBF)
-
-tar:
-       tar chf libbf.tar $(ALL)
-
-shar:
-       shar $(ALL) >libbf.shar
-
-depend:
-       makedepend $(LIBBF) $(TESTING_SRC)
-
-clean:
-       /bin/rm -f *.o tags core $(TESTING) $(BLIB) .nfs* *.old *.bak asm/*.o 
-
-dclean:
-       sed -e '/^# DO NOT DELETE THIS LINE/ q' Makefile >Makefile.new
-       mv -f Makefile.new Makefile
-
-# Eric is probably going to choke when he next looks at this --tjh
-install: $(BLIB)
-       if test $(INSTALLTOP); then \
-           echo SSL style install; \
-           cp $(BLIB) $(INSTALLTOP)/lib; \
-               $(RANLIB) $(BLIB); \
-           chmod 644 $(INSTALLTOP)/lib/$(BLIB); \
-           cp blowfish.h $(INSTALLTOP)/include; \
-           chmod 644 $(INSTALLTOP)/include/blowfish.h; \
-       else \
-           echo Standalone install; \
-           cp $(BLIB) $(LIBDIR)/$(BLIB); \
-               $(RANLIB) $(BLIB); \
-           chmod 644 $(LIBDIR)/$(BLIB); \
-           cp blowfish.h $(INCDIR)/blowfish.h; \
-           chmod 644 $(INCDIR)/blowfish.h; \
-       fi
-
-# DO NOT DELETE THIS LINE -- make depend depends on it.
index 138c99d..e69de29 100644 (file)
@@ -1,906 +0,0 @@
-       ; Don't even think of reading this code
-       ; It was automatically generated by bf-586.pl
-       ; Which is a perl program used to generate the x86 assember for
-       ; any of elf, a.out, BSDI,Win32, or Solaris
-       ; eric <eay@cryptsoft.com>
-       ; 
-       TITLE   bf-586.asm
-        .486
-.model FLAT
-_TEXT  SEGMENT
-PUBLIC _BF_encrypt
-
-_BF_encrypt PROC NEAR
-       ; 
-       push    ebp
-       push    ebx
-       mov     ebx,            DWORD PTR 12[esp]
-       mov     ebp,            DWORD PTR 16[esp]
-       push    esi
-       push    edi
-       ; Load the 2 words
-       mov     edi,            DWORD PTR [ebx]
-       mov     esi,            DWORD PTR 4[ebx]
-       xor     eax,            eax
-       mov     ebx,            DWORD PTR [ebp]
-       xor     ecx,            ecx
-       xor     edi,            ebx
-       ; 
-       ; Round 0
-       mov     edx,            DWORD PTR 4[ebp]
-       mov     ebx,            edi
-       xor     esi,            edx
-       shr     ebx,            16
-       mov     edx,            edi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     esi,            ebx
-       ; 
-       ; Round 1
-       mov     edx,            DWORD PTR 8[ebp]
-       mov     ebx,            esi
-       xor     edi,            edx
-       shr     ebx,            16
-       mov     edx,            esi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     edi,            ebx
-       ; 
-       ; Round 2
-       mov     edx,            DWORD PTR 12[ebp]
-       mov     ebx,            edi
-       xor     esi,            edx
-       shr     ebx,            16
-       mov     edx,            edi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     esi,            ebx
-       ; 
-       ; Round 3
-       mov     edx,            DWORD PTR 16[ebp]
-       mov     ebx,            esi
-       xor     edi,            edx
-       shr     ebx,            16
-       mov     edx,            esi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     edi,            ebx
-       ; 
-       ; Round 4
-       mov     edx,            DWORD PTR 20[ebp]
-       mov     ebx,            edi
-       xor     esi,            edx
-       shr     ebx,            16
-       mov     edx,            edi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     esi,            ebx
-       ; 
-       ; Round 5
-       mov     edx,            DWORD PTR 24[ebp]
-       mov     ebx,            esi
-       xor     edi,            edx
-       shr     ebx,            16
-       mov     edx,            esi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     edi,            ebx
-       ; 
-       ; Round 6
-       mov     edx,            DWORD PTR 28[ebp]
-       mov     ebx,            edi
-       xor     esi,            edx
-       shr     ebx,            16
-       mov     edx,            edi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     esi,            ebx
-       ; 
-       ; Round 7
-       mov     edx,            DWORD PTR 32[ebp]
-       mov     ebx,            esi
-       xor     edi,            edx
-       shr     ebx,            16
-       mov     edx,            esi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     edi,            ebx
-       ; 
-       ; Round 8
-       mov     edx,            DWORD PTR 36[ebp]
-       mov     ebx,            edi
-       xor     esi,            edx
-       shr     ebx,            16
-       mov     edx,            edi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     esi,            ebx
-       ; 
-       ; Round 9
-       mov     edx,            DWORD PTR 40[ebp]
-       mov     ebx,            esi
-       xor     edi,            edx
-       shr     ebx,            16
-       mov     edx,            esi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     edi,            ebx
-       ; 
-       ; Round 10
-       mov     edx,            DWORD PTR 44[ebp]
-       mov     ebx,            edi
-       xor     esi,            edx
-       shr     ebx,            16
-       mov     edx,            edi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     esi,            ebx
-       ; 
-       ; Round 11
-       mov     edx,            DWORD PTR 48[ebp]
-       mov     ebx,            esi
-       xor     edi,            edx
-       shr     ebx,            16
-       mov     edx,            esi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     edi,            ebx
-       ; 
-       ; Round 12
-       mov     edx,            DWORD PTR 52[ebp]
-       mov     ebx,            edi
-       xor     esi,            edx
-       shr     ebx,            16
-       mov     edx,            edi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     esi,            ebx
-       ; 
-       ; Round 13
-       mov     edx,            DWORD PTR 56[ebp]
-       mov     ebx,            esi
-       xor     edi,            edx
-       shr     ebx,            16
-       mov     edx,            esi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     edi,            ebx
-       ; 
-       ; Round 14
-       mov     edx,            DWORD PTR 60[ebp]
-       mov     ebx,            edi
-       xor     esi,            edx
-       shr     ebx,            16
-       mov     edx,            edi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     esi,            ebx
-       ; 
-       ; Round 15
-       mov     edx,            DWORD PTR 64[ebp]
-       mov     ebx,            esi
-       xor     edi,            edx
-       shr     ebx,            16
-       mov     edx,            esi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       ; Load parameter 0 (16) enc=1
-       mov     eax,            DWORD PTR 20[esp]
-       xor     edi,            ebx
-       mov     edx,            DWORD PTR 68[ebp]
-       xor     esi,            edx
-       mov     DWORD PTR 4[eax],edi
-       mov     DWORD PTR [eax],esi
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-_BF_encrypt ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _BF_decrypt
-
-_BF_decrypt PROC NEAR
-       ; 
-       push    ebp
-       push    ebx
-       mov     ebx,            DWORD PTR 12[esp]
-       mov     ebp,            DWORD PTR 16[esp]
-       push    esi
-       push    edi
-       ; Load the 2 words
-       mov     edi,            DWORD PTR [ebx]
-       mov     esi,            DWORD PTR 4[ebx]
-       xor     eax,            eax
-       mov     ebx,            DWORD PTR 68[ebp]
-       xor     ecx,            ecx
-       xor     edi,            ebx
-       ; 
-       ; Round 16
-       mov     edx,            DWORD PTR 64[ebp]
-       mov     ebx,            edi
-       xor     esi,            edx
-       shr     ebx,            16
-       mov     edx,            edi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     esi,            ebx
-       ; 
-       ; Round 15
-       mov     edx,            DWORD PTR 60[ebp]
-       mov     ebx,            esi
-       xor     edi,            edx
-       shr     ebx,            16
-       mov     edx,            esi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     edi,            ebx
-       ; 
-       ; Round 14
-       mov     edx,            DWORD PTR 56[ebp]
-       mov     ebx,            edi
-       xor     esi,            edx
-       shr     ebx,            16
-       mov     edx,            edi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     esi,            ebx
-       ; 
-       ; Round 13
-       mov     edx,            DWORD PTR 52[ebp]
-       mov     ebx,            esi
-       xor     edi,            edx
-       shr     ebx,            16
-       mov     edx,            esi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     edi,            ebx
-       ; 
-       ; Round 12
-       mov     edx,            DWORD PTR 48[ebp]
-       mov     ebx,            edi
-       xor     esi,            edx
-       shr     ebx,            16
-       mov     edx,            edi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     esi,            ebx
-       ; 
-       ; Round 11
-       mov     edx,            DWORD PTR 44[ebp]
-       mov     ebx,            esi
-       xor     edi,            edx
-       shr     ebx,            16
-       mov     edx,            esi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     edi,            ebx
-       ; 
-       ; Round 10
-       mov     edx,            DWORD PTR 40[ebp]
-       mov     ebx,            edi
-       xor     esi,            edx
-       shr     ebx,            16
-       mov     edx,            edi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     esi,            ebx
-       ; 
-       ; Round 9
-       mov     edx,            DWORD PTR 36[ebp]
-       mov     ebx,            esi
-       xor     edi,            edx
-       shr     ebx,            16
-       mov     edx,            esi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     edi,            ebx
-       ; 
-       ; Round 8
-       mov     edx,            DWORD PTR 32[ebp]
-       mov     ebx,            edi
-       xor     esi,            edx
-       shr     ebx,            16
-       mov     edx,            edi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     esi,            ebx
-       ; 
-       ; Round 7
-       mov     edx,            DWORD PTR 28[ebp]
-       mov     ebx,            esi
-       xor     edi,            edx
-       shr     ebx,            16
-       mov     edx,            esi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     edi,            ebx
-       ; 
-       ; Round 6
-       mov     edx,            DWORD PTR 24[ebp]
-       mov     ebx,            edi
-       xor     esi,            edx
-       shr     ebx,            16
-       mov     edx,            edi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     esi,            ebx
-       ; 
-       ; Round 5
-       mov     edx,            DWORD PTR 20[ebp]
-       mov     ebx,            esi
-       xor     edi,            edx
-       shr     ebx,            16
-       mov     edx,            esi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     edi,            ebx
-       ; 
-       ; Round 4
-       mov     edx,            DWORD PTR 16[ebp]
-       mov     ebx,            edi
-       xor     esi,            edx
-       shr     ebx,            16
-       mov     edx,            edi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     esi,            ebx
-       ; 
-       ; Round 3
-       mov     edx,            DWORD PTR 12[ebp]
-       mov     ebx,            esi
-       xor     edi,            edx
-       shr     ebx,            16
-       mov     edx,            esi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     edi,            ebx
-       ; 
-       ; Round 2
-       mov     edx,            DWORD PTR 8[ebp]
-       mov     ebx,            edi
-       xor     esi,            edx
-       shr     ebx,            16
-       mov     edx,            edi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     esi,            ebx
-       ; 
-       ; Round 1
-       mov     edx,            DWORD PTR 4[ebp]
-       mov     ebx,            esi
-       xor     edi,            edx
-       shr     ebx,            16
-       mov     edx,            esi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       ; Load parameter 0 (1) enc=0
-       mov     eax,            DWORD PTR 20[esp]
-       xor     edi,            ebx
-       mov     edx,            DWORD PTR [ebp]
-       xor     esi,            edx
-       mov     DWORD PTR 4[eax],edi
-       mov     DWORD PTR [eax],esi
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-_BF_decrypt ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _BF_cbc_encrypt
-
-_BF_cbc_encrypt PROC NEAR
-       ; 
-       push    ebp
-       push    ebx
-       push    esi
-       push    edi
-       mov     ebp,            DWORD PTR 28[esp]
-       ; getting iv ptr from parameter 4
-       mov     ebx,            DWORD PTR 36[esp]
-       mov     esi,            DWORD PTR [ebx]
-       mov     edi,            DWORD PTR 4[ebx]
-       push    edi
-       push    esi
-       push    edi
-       push    esi
-       mov     ebx,            esp
-       mov     esi,            DWORD PTR 36[esp]
-       mov     edi,            DWORD PTR 40[esp]
-       ; getting encrypt flag from parameter 5
-       mov     ecx,            DWORD PTR 56[esp]
-       ; get and push parameter 3
-       mov     eax,            DWORD PTR 48[esp]
-       push    eax
-       push    ebx
-       cmp     ecx,            0
-       jz      $L000decrypt
-       and     ebp,            4294967288
-       mov     eax,            DWORD PTR 8[esp]
-       mov     ebx,            DWORD PTR 12[esp]
-       jz      $L001encrypt_finish
-L002encrypt_loop:
-       mov     ecx,            DWORD PTR [esi]
-       mov     edx,            DWORD PTR 4[esi]
-       xor     eax,            ecx
-       xor     ebx,            edx
-       bswap   eax
-       bswap   ebx
-       mov     DWORD PTR 8[esp],eax
-       mov     DWORD PTR 12[esp],ebx
-       call    _BF_encrypt
-       mov     eax,            DWORD PTR 8[esp]
-       mov     ebx,            DWORD PTR 12[esp]
-       bswap   eax
-       bswap   ebx
-       mov     DWORD PTR [edi],eax
-       mov     DWORD PTR 4[edi],ebx
-       add     esi,            8
-       add     edi,            8
-       sub     ebp,            8
-       jnz     L002encrypt_loop
-$L001encrypt_finish:
-       mov     ebp,            DWORD PTR 52[esp]
-       and     ebp,            7
-       jz      $L003finish
-       xor     ecx,            ecx
-       xor     edx,            edx
-       mov     ebp,            DWORD PTR $L004cbc_enc_jmp_table[ebp*4]
-       jmp      ebp
-L005ej7:
-       mov     dh,             BYTE PTR 6[esi]
-       shl     edx,            8
-L006ej6:
-       mov     dh,             BYTE PTR 5[esi]
-L007ej5:
-       mov     dl,             BYTE PTR 4[esi]
-L008ej4:
-       mov     ecx,            DWORD PTR [esi]
-       jmp     $L009ejend
-L010ej3:
-       mov     ch,             BYTE PTR 2[esi]
-       shl     ecx,            8
-L011ej2:
-       mov     ch,             BYTE PTR 1[esi]
-L012ej1:
-       mov     cl,             BYTE PTR [esi]
-$L009ejend:
-       xor     eax,            ecx
-       xor     ebx,            edx
-       bswap   eax
-       bswap   ebx
-       mov     DWORD PTR 8[esp],eax
-       mov     DWORD PTR 12[esp],ebx
-       call    _BF_encrypt
-       mov     eax,            DWORD PTR 8[esp]
-       mov     ebx,            DWORD PTR 12[esp]
-       bswap   eax
-       bswap   ebx
-       mov     DWORD PTR [edi],eax
-       mov     DWORD PTR 4[edi],ebx
-       jmp     $L003finish
-$L000decrypt:
-       and     ebp,            4294967288
-       mov     eax,            DWORD PTR 16[esp]
-       mov     ebx,            DWORD PTR 20[esp]
-       jz      $L013decrypt_finish
-L014decrypt_loop:
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-       bswap   eax
-       bswap   ebx
-       mov     DWORD PTR 8[esp],eax
-       mov     DWORD PTR 12[esp],ebx
-       call    _BF_decrypt
-       mov     eax,            DWORD PTR 8[esp]
-       mov     ebx,            DWORD PTR 12[esp]
-       bswap   eax
-       bswap   ebx
-       mov     ecx,            DWORD PTR 16[esp]
-       mov     edx,            DWORD PTR 20[esp]
-       xor     ecx,            eax
-       xor     edx,            ebx
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-       mov     DWORD PTR [edi],ecx
-       mov     DWORD PTR 4[edi],edx
-       mov     DWORD PTR 16[esp],eax
-       mov     DWORD PTR 20[esp],ebx
-       add     esi,            8
-       add     edi,            8
-       sub     ebp,            8
-       jnz     L014decrypt_loop
-$L013decrypt_finish:
-       mov     ebp,            DWORD PTR 52[esp]
-       and     ebp,            7
-       jz      $L003finish
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-       bswap   eax
-       bswap   ebx
-       mov     DWORD PTR 8[esp],eax
-       mov     DWORD PTR 12[esp],ebx
-       call    _BF_decrypt
-       mov     eax,            DWORD PTR 8[esp]
-       mov     ebx,            DWORD PTR 12[esp]
-       bswap   eax
-       bswap   ebx
-       mov     ecx,            DWORD PTR 16[esp]
-       mov     edx,            DWORD PTR 20[esp]
-       xor     ecx,            eax
-       xor     edx,            ebx
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-L015dj7:
-       ror     edx,            16
-       mov     BYTE PTR 6[edi],dl
-       shr     edx,            16
-L016dj6:
-       mov     BYTE PTR 5[edi],dh
-L017dj5:
-       mov     BYTE PTR 4[edi],dl
-L018dj4:
-       mov     DWORD PTR [edi],ecx
-       jmp     $L019djend
-L020dj3:
-       ror     ecx,            16
-       mov     BYTE PTR 2[edi],cl
-       shl     ecx,            16
-L021dj2:
-       mov     BYTE PTR 1[esi],ch
-L022dj1:
-       mov     BYTE PTR [esi], cl
-$L019djend:
-       jmp     $L003finish
-$L003finish:
-       mov     ecx,            DWORD PTR 60[esp]
-       add     esp,            24
-       mov     DWORD PTR [ecx],eax
-       mov     DWORD PTR 4[ecx],ebx
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-$L004cbc_enc_jmp_table:
-       DD      0
-       DD      L012ej1
-       DD      L011ej2
-       DD      L010ej3
-       DD      L008ej4
-       DD      L007ej5
-       DD      L006ej6
-       DD      L005ej7
-L023cbc_dec_jmp_table:
-       DD      0
-       DD      L022dj1
-       DD      L021dj2
-       DD      L020dj3
-       DD      L018dj4
-       DD      L017dj5
-       DD      L016dj6
-       DD      L015dj7
-_BF_cbc_encrypt ENDP
-_TEXT  ENDS
-END
index 2e7480e..755f255 100644 (file)
@@ -172,8 +172,10 @@ bss_acpt.o: ../../include/openssl/opensslconf.h
 bss_acpt.o: ../../include/openssl/opensslv.h ../../include/openssl/safestack.h
 bss_acpt.o: ../../include/openssl/stack.h ../cryptlib.h
 bss_bio.o: ../../include/openssl/bio.h ../../include/openssl/crypto.h
-bss_bio.o: ../../include/openssl/err.h ../../include/openssl/opensslv.h
-bss_bio.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h
+bss_bio.o: ../../include/openssl/e_os.h ../../include/openssl/e_os2.h
+bss_bio.o: ../../include/openssl/err.h ../../include/openssl/opensslconf.h
+bss_bio.o: ../../include/openssl/opensslv.h ../../include/openssl/safestack.h
+bss_bio.o: ../../include/openssl/stack.h
 bss_conn.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
 bss_conn.o: ../../include/openssl/crypto.h ../../include/openssl/e_os.h
 bss_conn.o: ../../include/openssl/e_os2.h ../../include/openssl/err.h
index 2a5e8b5..b11b501 100644 (file)
@@ -64,6 +64,8 @@
 #include <stdarg.h>
 #include <string.h>
 #include <ctype.h>
+#include <assert.h>
+#include <limits.h>
 #include "cryptlib.h"
 #ifndef NO_SYS_TYPES_H
 #include <sys/types.h>
 
 #ifdef BN_LLONG
 # ifndef HAVE_LONG_LONG
-#  define HAVE_LONG_LONG
+#  define HAVE_LONG_LONG 1
 # endif
 #endif
 
 static void dopr (char *buffer, size_t maxlen, size_t *retlen,
        const char *format, va_list args);
+#ifdef USE_ALLOCATING_PRINT
+static void doapr (char **buffer, size_t *retlen,
+       const char *format, va_list args);
+#endif
 
 int BIO_printf (BIO *bio, ...)
        {
@@ -85,15 +91,32 @@ int BIO_printf (BIO *bio, ...)
        char *format;
        int ret;
        size_t retlen;
+#ifdef USE_ALLOCATING_PRINT
+       char *hugebuf;
+#else
        MS_STATIC char hugebuf[1024*2]; /* 10k in one chunk is the limit */
+#endif
 
        va_start(args, bio);
        format=va_arg(args, char *);
 
+#ifndef USE_ALLOCATING_PRINT
        hugebuf[0]='\0';
        dopr(hugebuf, sizeof(hugebuf), &retlen, format, args);
-       ret=BIO_write(bio, hugebuf, (int)retlen);
+#else
+       hugebuf = NULL;
+       CRYPTO_push_info("doapr()");
+       doapr(&hugebuf, &retlen, format, args);
+       if (hugebuf)
+               {
+#endif
+               ret=BIO_write(bio, hugebuf, (int)retlen);
 
+#ifdef USE_ALLOCATING_PRINT
+               Free(hugebuf);
+               }
+       CRYPTO_pop_info();
+#endif
        va_end(args);
        return(ret);
        }
@@ -131,10 +154,26 @@ int BIO_printf (BIO *bio, ...)
 #define LLONG long
 #endif
 
-static void fmtstr     (char *, size_t *, size_t, char *, int, int, int);
-static void fmtint     (char *, size_t *, size_t, LLONG, int, int, int, int);
-static void fmtfp      (char *, size_t *, size_t, LDOUBLE, int, int, int);
-static void dopr_outch (char *, size_t *, size_t, int);
+static void fmtstr     (void (*)(char **, size_t *, size_t *, int),
+                       char **, size_t *, size_t *, const char *, int, int,
+                       int);
+static void fmtint     (void (*)(char **, size_t *, size_t *, int),
+                       char **, size_t *, size_t *, LLONG, int, int, int, int);
+static void fmtfp      (void (*)(char **, size_t *, size_t *, int),
+                       char **, size_t *, size_t *, LDOUBLE, int, int, int);
+#ifndef USE_ALLOCATING_PRINT
+static int dopr_isbig (size_t, size_t);
+static int dopr_copy (size_t);
+static void dopr_outch (char **, size_t *, size_t *, int);
+#else
+static int doapr_isbig (size_t, size_t);
+static int doapr_copy (size_t);
+static void doapr_outch (char **, size_t *, size_t *, int);
+#endif
+static void _dopr(void (*)(char **, size_t *, size_t *, int),
+                 int (*)(size_t, size_t), int (*)(size_t),
+                 char **buffer, size_t *maxlen, size_t *retlen,
+                 const char *format, va_list args);
 
 /* format read states */
 #define DP_S_DEFAULT    0
@@ -165,6 +204,7 @@ static void dopr_outch (char *, size_t *, size_t, int);
 #define char_to_int(p) (p - '0')
 #define MAX(p,q) ((p >= q) ? p : q)
 
+#ifndef USE_ALLOCATING_PRINT
 static void
 dopr(
     char *buffer,
@@ -172,6 +212,35 @@ dopr(
     size_t *retlen,
     const char *format,
     va_list args)
+{
+    _dopr(dopr_outch, dopr_isbig, dopr_copy,
+         &buffer, &maxlen, retlen, format, args);
+}
+
+#else
+static void
+doapr(
+    char **buffer,
+    size_t *retlen,
+    const char *format,
+    va_list args)
+{
+    size_t dummy_maxlen = 0;
+    _dopr(doapr_outch, doapr_isbig, doapr_copy,
+         buffer, &dummy_maxlen, retlen, format, args);
+}
+#endif
+
+static void
+_dopr(
+    void (*outch_fn)(char **, size_t *, size_t *, int),
+    int (*isbig_fn)(size_t, size_t),
+    int (*copy_fn)(size_t),
+    char **buffer,
+    size_t *maxlen,
+    size_t *retlen,
+    const char *format,
+    va_list args)
 {
     char ch;
     LLONG value;
@@ -190,7 +259,7 @@ dopr(
     ch = *format++;
 
     while (state != DP_S_DONE) {
-        if ((ch == '\0') || (currlen >= maxlen))
+        if ((ch == '\0') || (*isbig_fn)(currlen, *maxlen))
             state = DP_S_DONE;
 
         switch (state) {
@@ -198,7 +267,7 @@ dopr(
             if (ch == '%')
                 state = DP_S_FLAGS;
             else
-                dopr_outch(buffer, &currlen, maxlen, ch);
+                (*outch_fn)(buffer, &currlen, maxlen, ch);
             ch = *format++;
             break;
         case DP_S_FLAGS:
@@ -304,7 +373,8 @@ dopr(
                     value = va_arg(args, int);
                     break;
                 }
-                fmtint(buffer, &currlen, maxlen, value, 10, min, max, flags);
+                fmtint(outch_fn, buffer, &currlen, maxlen,
+                      value, 10, min, max, flags);
                 break;
             case 'X':
                 flags |= DP_F_UP;
@@ -329,7 +399,7 @@ dopr(
                         unsigned int);
                     break;
                 }
-                fmtint(buffer, &currlen, maxlen, value,
+                fmtint(outch_fn, buffer, &currlen, maxlen, value,
                        ch == 'o' ? 8 : (ch == 'u' ? 10 : 16),
                        min, max, flags);
                 break;
@@ -338,7 +408,8 @@ dopr(
                     fvalue = va_arg(args, LDOUBLE);
                 else
                     fvalue = va_arg(args, double);
-                fmtfp(buffer, &currlen, maxlen, fvalue, min, max, flags);
+                fmtfp(outch_fn, buffer, &currlen, maxlen,
+                     fvalue, min, max, flags);
                 break;
             case 'E':
                 flags |= DP_F_UP;
@@ -357,19 +428,19 @@ dopr(
                     fvalue = va_arg(args, double);
                 break;
             case 'c':
-                dopr_outch(buffer, &currlen, maxlen,
+                (*outch_fn)(buffer, &currlen, maxlen,
                     va_arg(args, int));
                 break;
             case 's':
                 strvalue = va_arg(args, char *);
                 if (max < 0)
-                    max = maxlen;
-                fmtstr(buffer, &currlen, maxlen, strvalue,
-                    flags, min, max);
+                    max = (*copy_fn)(*maxlen);
+                fmtstr(outch_fn, buffer, &currlen, maxlen, strvalue,
+                      flags, min, max);
                 break;
             case 'p':
                 value = (long)va_arg(args, void *);
-                fmtint(buffer, &currlen, maxlen,
+                fmtint(outch_fn, buffer, &currlen, maxlen,
                     value, 16, min, max, flags);
                 break;
             case 'n': /* XXX */
@@ -392,7 +463,7 @@ dopr(
                 }
                 break;
             case '%':
-                dopr_outch(buffer, &currlen, maxlen, ch);
+                (*outch_fn)(buffer, &currlen, maxlen, ch);
                 break;
             case 'w':
                 /* not supported yet, treat as next char */
@@ -413,19 +484,20 @@ dopr(
             break;
         }
     }
-    if (currlen >= maxlen - 1)
-        currlen = maxlen - 1;
-    buffer[currlen] = '\0';
+    if (currlen >= *maxlen - 1)
+        currlen = *maxlen - 1;
+    (*buffer)[currlen] = '\0';
     *retlen = currlen;
     return;
 }
 
 static void
 fmtstr(
-    char *buffer,
+    void (*outch_fn)(char **, size_t *, size_t *, int),
+    char **buffer,
     size_t *currlen,
-    size_t maxlen,
-    char *value,
+    size_t *maxlen,
+    const char *value,
     int flags,
     int min,
     int max)
@@ -444,16 +516,16 @@ fmtstr(
         padlen = -padlen;
 
     while ((padlen > 0) && (cnt < max)) {
-        dopr_outch(buffer, currlen, maxlen, ' ');
+        (*outch_fn)(buffer, currlen, maxlen, ' ');
         --padlen;
         ++cnt;
     }
     while (*value && (cnt < max)) {
-        dopr_outch(buffer, currlen, maxlen, *value++);
+        (*outch_fn)(buffer, currlen, maxlen, *value++);
         ++cnt;
     }
     while ((padlen < 0) && (cnt < max)) {
-        dopr_outch(buffer, currlen, maxlen, ' ');
+        (*outch_fn)(buffer, currlen, maxlen, ' ');
         ++padlen;
         ++cnt;
     }
@@ -461,9 +533,10 @@ fmtstr(
 
 static void
 fmtint(
-    char *buffer,
+    void (*outch_fn)(char **, size_t *, size_t *, int),
+    char **buffer,
     size_t *currlen,
-    size_t maxlen,
+    size_t *maxlen,
     LLONG value,
     int base,
     int min,
@@ -517,28 +590,28 @@ fmtint(
 
     /* spaces */
     while (spadlen > 0) {
-        dopr_outch(buffer, currlen, maxlen, ' ');
+        (*outch_fn)(buffer, currlen, maxlen, ' ');
         --spadlen;
     }
 
     /* sign */
     if (signvalue)
-        dopr_outch(buffer, currlen, maxlen, signvalue);
+        (*outch_fn)(buffer, currlen, maxlen, signvalue);
 
     /* zeros */
     if (zpadlen > 0) {
         while (zpadlen > 0) {
-            dopr_outch(buffer, currlen, maxlen, '0');
+            (*outch_fn)(buffer, currlen, maxlen, '0');
             --zpadlen;
         }
     }
     /* digits */
     while (place > 0)
-        dopr_outch(buffer, currlen, maxlen, convert[--place]);
+        (*outch_fn)(buffer, currlen, maxlen, convert[--place]);
 
     /* left justified spaces */
     while (spadlen < 0) {
-        dopr_outch(buffer, currlen, maxlen, ' ');
+        (*outch_fn)(buffer, currlen, maxlen, ' ');
         ++spadlen;
     }
     return;
@@ -577,9 +650,10 @@ round(LDOUBLE value)
 
 static void
 fmtfp(
-    char *buffer,
+    void (*outch_fn)(char **, size_t *, size_t *, int),
+    char **buffer,
     size_t *currlen,
-    size_t maxlen,
+    size_t *maxlen,
     LDOUBLE fvalue,
     int min,
     int max,
@@ -657,54 +731,114 @@ fmtfp(
 
     if ((flags & DP_F_ZERO) && (padlen > 0)) {
         if (signvalue) {
-            dopr_outch(buffer, currlen, maxlen, signvalue);
+            (*outch_fn)(buffer, currlen, maxlen, signvalue);
             --padlen;
             signvalue = 0;
         }
         while (padlen > 0) {
-            dopr_outch(buffer, currlen, maxlen, '0');
+            (*outch_fn)(buffer, currlen, maxlen, '0');
             --padlen;
         }
     }
     while (padlen > 0) {
-        dopr_outch(buffer, currlen, maxlen, ' ');
+        (*outch_fn)(buffer, currlen, maxlen, ' ');
         --padlen;
     }
     if (signvalue)
-        dopr_outch(buffer, currlen, maxlen, signvalue);
+        (*outch_fn)(buffer, currlen, maxlen, signvalue);
 
     while (iplace > 0)
-        dopr_outch(buffer, currlen, maxlen, iconvert[--iplace]);
+        (*outch_fn)(buffer, currlen, maxlen, iconvert[--iplace]);
 
     /*
      * Decimal point. This should probably use locale to find the correct
      * char to print out.
      */
     if (max > 0) {
-        dopr_outch(buffer, currlen, maxlen, '.');
+        (*outch_fn)(buffer, currlen, maxlen, '.');
 
         while (fplace > 0)
-            dopr_outch(buffer, currlen, maxlen, fconvert[--fplace]);
+            (*outch_fn)(buffer, currlen, maxlen, fconvert[--fplace]);
     }
     while (zpadlen > 0) {
-        dopr_outch(buffer, currlen, maxlen, '0');
+        (*outch_fn)(buffer, currlen, maxlen, '0');
         --zpadlen;
     }
 
     while (padlen < 0) {
-        dopr_outch(buffer, currlen, maxlen, ' ');
+        (*outch_fn)(buffer, currlen, maxlen, ' ');
         ++padlen;
     }
 }
 
+static int
+dopr_copy(
+    size_t len)
+{
+    return len;
+}
+
+#ifdef USE_ALLOCATING_PRINT
+static int
+doapr_copy(
+    size_t len)
+{
+    /* Return as high an integer as possible */
+    return INT_MAX;
+}
+#endif
+
+static int
+dopr_isbig(
+    size_t currlen,
+    size_t maxlen)
+{
+    return currlen > maxlen;
+}
+
+#ifdef USE_ALLOCATING_PRINT
+static int
+doapr_isbig(
+    size_t currlen,
+    size_t maxlen)
+{
+    return 0;
+}
+#endif
+
 static void
 dopr_outch(
-    char *buffer,
+    char **buffer,
     size_t *currlen,
-    size_t maxlen,
+    size_t *maxlen,
+    int c)
+{
+    if (*currlen < *maxlen)
+        (*buffer)[(*currlen)++] = (char)c;
+    return;
+}
+
+#ifdef USE_ALLOCATING_PRINT
+static void
+doapr_outch(
+    char **buffer,
+    size_t *currlen,
+    size_t *maxlen,
     int c)
 {
-    if (*currlen < maxlen)
-        buffer[(*currlen)++] = (char)c;
+    if (*buffer == NULL) {
+       if (*maxlen == 0)
+           *maxlen = 1024;
+       *buffer = Malloc(*maxlen);
+    }
+    while (*currlen >= *maxlen) {
+       *maxlen += 1024;
+       *buffer = Realloc(*buffer, *maxlen);
+    }
+    /* What to do if *buffer is NULL? */
+    assert(*buffer != NULL);
+
+    (*buffer)[(*currlen)++] = (char)c;
     return;
 }
+#endif
index bc08401..ebdb181 100644 (file)
@@ -507,7 +507,7 @@ int BIO_set(BIO *a,BIO_METHOD *type);
 int    BIO_free(BIO *a);
 int    BIO_read(BIO *b, void *data, int len);
 int    BIO_gets(BIO *bp,char *buf, int size);
-int    BIO_write(BIO *b, const char *data, int len);
+int    BIO_write(BIO *b, const void *data, int len);
 int    BIO_puts(BIO *bp,const char *buf);
 long   BIO_ctrl(BIO *bp,int cmd,long larg,void *parg);
 long   BIO_callback_ctrl(BIO *bp,int cmd,void (*fp)());
index b5f07de..f38e7b9 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index cf8e615..e88dcc8 100644 (file)
@@ -169,7 +169,7 @@ int BIO_read(BIO *b, void *out, int outl)
        return(i);
        }
 
-int BIO_write(BIO *b, const char *in, int inl)
+int BIO_write(BIO *b, const void *in, int inl)
        {
        int i;
        long (*cb)();
index 0d0f935..1e2d749 100644 (file)
 
 #include <openssl/bio.h>
 #include <openssl/err.h>
+#include <openssl/err.h>
 #include <openssl/crypto.h>
 
+#include "openssl/e_os.h"
+#ifndef SSIZE_MAX
+# define SSIZE_MAX INT_MAX
+#endif
+
 static int bio_new(BIO *bio);
 static int bio_free(BIO *bio);
 static int bio_read(BIO *bio, char *buf, int size);
@@ -205,10 +211,10 @@ static int bio_read(BIO *bio, char *buf, int size_)
  */
 /* WARNING: The non-copying interface is largely untested as of yet
  * and may contain bugs. */
-static size_t bio_nread0(BIO *bio, char **buf)
+static ssize_t bio_nread0(BIO *bio, char **buf)
        {
        struct bio_bio_st *b, *peer_b;
-       size_t num;
+       ssize_t num;
        
        BIO_clear_retry_flags(bio);
 
@@ -243,15 +249,20 @@ static size_t bio_nread0(BIO *bio, char **buf)
        return num;
        }
 
-static size_t bio_nread(BIO *bio, char **buf, size_t num)
+static ssize_t bio_nread(BIO *bio, char **buf, size_t num_)
        {
        struct bio_bio_st *b, *peer_b;
-       size_t available;
+       ssize_t num, available;
+
+       if (num_ > SSIZE_MAX)
+               num = SSIZE_MAX;
+       else
+               num = (ssize_t)num_;
 
        available = bio_nread0(bio, buf);
        if (num > available)
                num = available;
-       if (num == 0)
+       if (num <= 0)
                return num;
 
        b = bio->ptr;
@@ -351,7 +362,7 @@ static int bio_write(BIO *bio, char *buf, int num_)
  * (example usage:  bio_nwrite0(), write to buffer, bio_nwrite()
  *  or just         bio_nwrite(), write to buffer)
  */
-static size_t bio_nwrite0(BIO *bio, char **buf)
+static ssize_t bio_nwrite0(BIO *bio, char **buf)
        {
        struct bio_bio_st *b;
        size_t num;
@@ -399,15 +410,20 @@ static size_t bio_nwrite0(BIO *bio, char **buf)
        return num;
        }
 
-static size_t bio_nwrite(BIO *bio, char **buf, size_t num)
+static ssize_t bio_nwrite(BIO *bio, char **buf, size_t num_)
        {
        struct bio_bio_st *b;
-       size_t space;
+       ssize_t num, space;
+
+       if (num_ > SSIZE_MAX)
+               num = SSIZE_MAX;
+       else
+               num = (ssize_t)num_;
 
        space = bio_nwrite0(bio, buf);
        if (num > space)
                num = space;
-       if (num == 0)
+       if (num <= 0)
                return num;
        b = bio->ptr;
        assert(b != NULL);
@@ -509,6 +525,11 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr)
                ret = 1;
                break;
 
+       case BIO_C_NREAD0:
+               /* prepare for non-copying read */
+               ret = (long) bio_nread0(bio, ptr);
+               break;
+               
        case BIO_C_NREAD:
                /* non-copying read */
                ret = (long) bio_nread(bio, ptr, (size_t) num);
index 4308b19..497eb1a 100644 (file)
@@ -57,8 +57,8 @@
        Why BIO_s_log?
 
        BIO_s_log is useful for system daemons (or services under NT).
-       It is one-way BIO, it sends all stuff to syslogd (or event log
-       under NT).
+       It is one-way BIO, it sends all stuff to syslogd (on system that
+       commonly use that), or event log (on NT), or OPCOM (on OpenVMS).
 
 */
 
 #include <stdio.h>
 #include <errno.h>
 
-#ifndef WIN32
-#ifdef __ultrix
-#include <sys/syslog.h>
-#else
-#include <syslog.h>
-#endif
-#else
-#include <process.h>
+#if defined(WIN32)
+#  include <process.h>
+#elif defined(VMS) || defined(__VMS)
+#  include <opcdef.h>
+#  include <descrip.h>
+#  include <lib$routines.h>
+#  include <starlet.h>
+#elif defined(__ultrix)
+#  include <sys/syslog.h>
+#elif !defined(MSDOS) /* Unix */
+#  include <syslog.h>
 #endif
 
 #include "cryptlib.h"
 #include <openssl/buffer.h>
 #include <openssl/err.h>
+
 #ifndef NO_SYSLOG
 
+#if defined(WIN32)
+#define LOG_EMERG      0
+#define LOG_ALERT      1
+#define LOG_CRIT       2
+#define LOG_ERR                3
+#define LOG_WARNING    4
+#define LOG_NOTICE     5
+#define LOG_INFO       6
+#define LOG_DEBUG      7
+
+#define LOG_DAEMON     (3<<3)
+#elif defined(VMS)
+/* On VMS, we don't really care about these, but we need them to compile */
+#define LOG_EMERG      0
+#define LOG_ALERT      1
+#define LOG_CRIT       2
+#define LOG_ERR                3
+#define LOG_WARNING    4
+#define LOG_NOTICE     5
+#define LOG_INFO       6
+#define LOG_DEBUG      7
+
+#define LOG_DAEMON     OPC$M_NM_NTWORK
+#endif
 
 static int MS_CALLBACK slg_write(BIO *h,char *buf,int num);
 static int MS_CALLBACK slg_puts(BIO *h,char *str);
 static long MS_CALLBACK slg_ctrl(BIO *h,int cmd,long arg1,char *arg2);
 static int MS_CALLBACK slg_new(BIO *h);
 static int MS_CALLBACK slg_free(BIO *data);
-static int xopenlog(BIO* bp, const char* name, int level);
-static int xcloselog(BIO* bp);
+static void xopenlog(BIO* bp, const char* name, int level);
+static void xsyslog(BIO* bp, int priority, const char* string);
+static void xcloselog(BIO* bp);
 
 static BIO_METHOD methods_slg=
        {
@@ -113,11 +142,7 @@ static int MS_CALLBACK slg_new(BIO *bi)
        bi->init=1;
        bi->num=0;
        bi->ptr=NULL;
-#ifndef WIN32
        xopenlog(bi, "application", LOG_DAEMON);
-#else
-       xopenlog(bi, "application", 0);
-#endif
        return(1);
        }
 
@@ -133,43 +158,14 @@ static int MS_CALLBACK slg_write(BIO *b, char *in, int inl)
        int ret= inl;
        char* buf= in;
        char* pp;
-#if defined(WIN32)
-       LPCSTR lpszStrings[2];
-       WORD evtype= EVENTLOG_ERROR_TYPE;
-       int pid = _getpid();
-       char pidbuf[20];
-#else
        int priority;
-#endif
 
        if((buf= (char *)Malloc(inl+ 1)) == NULL){
                return(0);
        }
        strncpy(buf, in, inl);
        buf[inl]= '\0';
-#if defined(WIN32)
-       if(strncmp(buf, "ERR ", 4) == 0){
-               evtype= EVENTLOG_ERROR_TYPE;
-               pp= buf+ 4;
-       }else if(strncmp(buf, "WAR ", 4) == 0){
-               evtype= EVENTLOG_WARNING_TYPE;
-               pp= buf+ 4;
-       }else if(strncmp(buf, "INF ", 4) == 0){
-               evtype= EVENTLOG_INFORMATION_TYPE;
-               pp= buf+ 4;
-       }else{
-               evtype= EVENTLOG_ERROR_TYPE;
-               pp= buf;
-       }
 
-       sprintf(pidbuf, "[%d] ", pid);
-       lpszStrings[0] = pidbuf;
-       lpszStrings[1] = pp;
-
-       if(b->ptr)
-               ReportEvent(b->ptr, evtype, 0, 1024, NULL, 2, 0,
-                               lpszStrings, NULL);
-#else
        if(strncmp(buf, "ERR ", 4) == 0){
                priority= LOG_ERR;
                pp= buf+ 4;
@@ -184,8 +180,8 @@ static int MS_CALLBACK slg_write(BIO *b, char *in, int inl)
                pp= buf;
        }
 
-       syslog(priority, "%s", pp);
-#endif
+       xsyslog(b, priority, pp);
+
        Free(buf);
        return(ret);
        }
@@ -213,28 +209,128 @@ static int MS_CALLBACK slg_puts(BIO *bp, char *str)
        return(ret);
        }
 
-static int xopenlog(BIO* bp, const char* name, int level)
-{
 #if defined(WIN32)
-       if((bp->ptr= (char *)RegisterEventSource(NULL, name)) == NULL){
-               return(0);
-       }
-#else
-       openlog(name, LOG_PID|LOG_CONS, level);
-#endif
-       return(1);
+
+static void xopenlog(BIO* bp, const char* name, int level)
+{
+       bp->ptr= (char *)RegisterEventSource(NULL, name);
 }
 
-static int xcloselog(BIO* bp)
+static void xsyslog(BIO *bp, int priority, const char *string)
+{
+       LPCSTR lpszStrings[2];
+       WORD evtype= EVENTLOG_ERROR_TYPE;
+       int pid = _getpid();
+       char pidbuf[20];
+
+       switch (priority)
+               {
+       case LOG_ERR:
+               evtype = EVENTLOG_ERROR_TYPE;
+               break;
+       case LOG_WARNING:
+               evtype = EVENTLOG_WARNING_TYPE;
+               break;
+       case LOG_INFO:
+               evtype = EVENTLOG_INFORMATION_TYPE;
+               break;
+       default:
+               evtype = EVENTLOG_ERROR_TYPE;
+               break;
+               }
+
+       sprintf(pidbuf, "[%d] ", pid);
+       lpszStrings[0] = pidbuf;
+       lpszStrings[1] = string;
+
+       if(bp->ptr)
+               ReportEvent(bp->ptr, evtype, 0, 1024, NULL, 2, 0,
+                               lpszStrings, NULL);
+}
+       
+static void xcloselog(BIO* bp)
 {
-#if defined(WIN32)
        if(bp->ptr)
                DeregisterEventSource((HANDLE)(bp->ptr));
        bp->ptr= NULL;
-#else
+}
+
+#elif defined(VMS)
+
+static int VMS_OPC_target = LOG_DAEMON;
+
+static void xopenlog(BIO* bp, const char* name, int level)
+{
+       VMS_OPC_target = level; 
+}
+
+static void xsyslog(BIO *bp, int priority, const char *string)
+{
+       struct dsc$descriptor_s opc_dsc;
+       struct opcdef *opcdef_p;
+       char buf[10240];
+       unsigned int len;
+        struct dsc$descriptor_s buf_dsc;
+       $DESCRIPTOR(fao_cmd, "!AZ: !AZ");
+       char *priority_tag;
+
+       switch (priority)
+         {
+         case LOG_EMERG: priority_tag = "Emergency"; break;
+         case LOG_ALERT: priority_tag = "Alert"; break;
+         case LOG_CRIT: priority_tag = "Critical"; break;
+         case LOG_ERR: priority_tag = "Error"; break;
+         case LOG_WARNING: priority_tag = "Warning"; break;
+         case LOG_NOTICE: priority_tag = "Notice"; break;
+         case LOG_INFO: priority_tag = "Info"; break;
+         case LOG_DEBUG: priority_tag = "DEBUG"; break;
+         }
+
+       buf_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
+       buf_dsc.dsc$b_class = DSC$K_CLASS_S;
+       buf_dsc.dsc$a_pointer = buf;
+       buf_dsc.dsc$w_length = sizeof(buf) - 1;
+
+       lib$sys_fao(&fao_cmd, &len, &buf_dsc, priority_tag, string);
+
+       /* we know there's an 8 byte header.  That's documented */
+       opcdef_p = (struct opcdef *) Malloc(8 + len);
+       opcdef_p->opc$b_ms_type = OPC$_RQ_RQST;
+       memcpy(opcdef_p->opc$z_ms_target_classes, &VMS_OPC_target, 3);
+       opcdef_p->opc$l_ms_rqstid = 0;
+       memcpy(&opcdef_p->opc$l_ms_text, buf, len);
+
+       opc_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
+       opc_dsc.dsc$b_class = DSC$K_CLASS_S;
+       opc_dsc.dsc$a_pointer = (char *)opcdef_p;
+       opc_dsc.dsc$w_length = len + 8;
+
+       sys$sndopr(opc_dsc, 0);
+
+       Free(opcdef_p);
+}
+
+static void xcloselog(BIO* bp)
+{
+}
+
+#else /* Unix */
+
+static void xopenlog(BIO* bp, const char* name, int level)
+{
+       openlog(name, LOG_PID|LOG_CONS, level);
+}
+
+static void xsyslog(BIO *bp, int priority, const char *string)
+{
+       syslog(priority, "%s", string);
+}
+
+static void xcloselog(BIO* bp)
+{
        closelog();
-#endif
-       return(1);
 }
 
-#endif
+#endif /* Unix */
+
+#endif /* NO_SYSLOG */
index fa23a43..beb9c1b 100644 (file)
@@ -5,6 +5,7 @@
 DIR=   bn
 TOP=   ../..
 CC=    cc
+CPP=    $(CC) -E
 INCLUDES= -I.. -I../../include
 CFLAG=-g
 INSTALL_PREFIX=
@@ -72,10 +73,10 @@ lib:        $(LIBOBJ)
 
 # elf
 asm/bn86-elf.o: asm/bn86unix.cpp
-       $(CPP) -DELF asm/bn86unix.cpp | as -o asm/bn86-elf.o
+       $(CPP) -DELF -x c asm/bn86unix.cpp | as -o asm/bn86-elf.o
 
 asm/co86-elf.o: asm/co86unix.cpp
-       $(CPP) -DELF asm/co86unix.cpp | as -o asm/co86-elf.o
+       $(CPP) -DELF -x c asm/co86unix.cpp | as -o asm/co86-elf.o
 
 # solaris
 asm/bn86-sol.o: asm/bn86unix.cpp
@@ -102,10 +103,10 @@ asm/bn86bsdi.o: asm/bn86unix.cpp
 asm/co86bsdi.o: asm/co86unix.cpp
        $(CPP) -DBSDI asm/co86unix.cpp | sed 's/ :/:/' | as -o asm/co86bsdi.o
 
-asm/bn86unix.cpp: asm/bn-586.pl
+asm/bn86unix.cpp: asm/bn-586.pl ../perlasm/x86asm.pl
        (cd asm; $(PERL) bn-586.pl cpp >bn86unix.cpp )
 
-asm/co86unix.cpp: asm/co-586.pl
+asm/co86unix.cpp: asm/co-586.pl ../perlasm/x86asm.pl
        (cd asm; $(PERL) co-586.pl cpp >co86unix.cpp )
 
 asm/sparcv8.o: asm/sparcv8.S
index 871bd88..e69de29 100644 (file)
-       ; Don't even think of reading this code
-       ; It was automatically generated by bn-586.pl
-       ; Which is a perl program used to generate the x86 assember for
-       ; any of elf, a.out, BSDI,Win32, or Solaris
-       ; eric <eay@cryptsoft.com>
-       ; 
-       TITLE   bn-586.asm
-        .386
-.model FLAT
-_TEXT  SEGMENT
-PUBLIC _bn_mul_add_words
-
-_bn_mul_add_words PROC NEAR
-       push    ebp
-       push    ebx
-       push    esi
-       push    edi
-       ; 
-       xor     esi,            esi
-       mov     edi,            DWORD PTR 20[esp]
-       mov     ecx,            DWORD PTR 28[esp]
-       mov     ebx,            DWORD PTR 24[esp]
-       and     ecx,            4294967288
-       mov     ebp,            DWORD PTR 32[esp]
-       push    ecx
-       jz      $L000maw_finish
-L001maw_loop:
-       mov     DWORD PTR [esp],ecx
-       ; Round 0
-       mov     eax,            DWORD PTR [ebx]
-       mul     ebp
-       add     eax,            esi
-       mov     esi,            DWORD PTR [edi]
-       adc     edx,            0
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR [edi],eax
-       mov     esi,            edx
-       ; Round 4
-       mov     eax,            DWORD PTR 4[ebx]
-       mul     ebp
-       add     eax,            esi
-       mov     esi,            DWORD PTR 4[edi]
-       adc     edx,            0
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 4[edi],eax
-       mov     esi,            edx
-       ; Round 8
-       mov     eax,            DWORD PTR 8[ebx]
-       mul     ebp
-       add     eax,            esi
-       mov     esi,            DWORD PTR 8[edi]
-       adc     edx,            0
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 8[edi],eax
-       mov     esi,            edx
-       ; Round 12
-       mov     eax,            DWORD PTR 12[ebx]
-       mul     ebp
-       add     eax,            esi
-       mov     esi,            DWORD PTR 12[edi]
-       adc     edx,            0
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 12[edi],eax
-       mov     esi,            edx
-       ; Round 16
-       mov     eax,            DWORD PTR 16[ebx]
-       mul     ebp
-       add     eax,            esi
-       mov     esi,            DWORD PTR 16[edi]
-       adc     edx,            0
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 16[edi],eax
-       mov     esi,            edx
-       ; Round 20
-       mov     eax,            DWORD PTR 20[ebx]
-       mul     ebp
-       add     eax,            esi
-       mov     esi,            DWORD PTR 20[edi]
-       adc     edx,            0
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 20[edi],eax
-       mov     esi,            edx
-       ; Round 24
-       mov     eax,            DWORD PTR 24[ebx]
-       mul     ebp
-       add     eax,            esi
-       mov     esi,            DWORD PTR 24[edi]
-       adc     edx,            0
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 24[edi],eax
-       mov     esi,            edx
-       ; Round 28
-       mov     eax,            DWORD PTR 28[ebx]
-       mul     ebp
-       add     eax,            esi
-       mov     esi,            DWORD PTR 28[edi]
-       adc     edx,            0
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 28[edi],eax
-       mov     esi,            edx
-       ; 
-       mov     ecx,            DWORD PTR [esp]
-       add     ebx,            32
-       add     edi,            32
-       sub     ecx,            8
-       jnz     L001maw_loop
-$L000maw_finish:
-       mov     ecx,            DWORD PTR 32[esp]
-       and     ecx,            7
-       jnz     $L002maw_finish2
-       jmp     $L003maw_end
-$L002maw_finish2:
-       ; Tail Round 0
-       mov     eax,            DWORD PTR [ebx]
-       mul     ebp
-       add     eax,            esi
-       mov     esi,            DWORD PTR [edi]
-       adc     edx,            0
-       add     eax,            esi
-       adc     edx,            0
-       dec     ecx
-       mov     DWORD PTR [edi],eax
-       mov     esi,            edx
-       jz      $L003maw_end
-       ; Tail Round 1
-       mov     eax,            DWORD PTR 4[ebx]
-       mul     ebp
-       add     eax,            esi
-       mov     esi,            DWORD PTR 4[edi]
-       adc     edx,            0
-       add     eax,            esi
-       adc     edx,            0
-       dec     ecx
-       mov     DWORD PTR 4[edi],eax
-       mov     esi,            edx
-       jz      $L003maw_end
-       ; Tail Round 2
-       mov     eax,            DWORD PTR 8[ebx]
-       mul     ebp
-       add     eax,            esi
-       mov     esi,            DWORD PTR 8[edi]
-       adc     edx,            0
-       add     eax,            esi
-       adc     edx,            0
-       dec     ecx
-       mov     DWORD PTR 8[edi],eax
-       mov     esi,            edx
-       jz      $L003maw_end
-       ; Tail Round 3
-       mov     eax,            DWORD PTR 12[ebx]
-       mul     ebp
-       add     eax,            esi
-       mov     esi,            DWORD PTR 12[edi]
-       adc     edx,            0
-       add     eax,            esi
-       adc     edx,            0
-       dec     ecx
-       mov     DWORD PTR 12[edi],eax
-       mov     esi,            edx
-       jz      $L003maw_end
-       ; Tail Round 4
-       mov     eax,            DWORD PTR 16[ebx]
-       mul     ebp
-       add     eax,            esi
-       mov     esi,            DWORD PTR 16[edi]
-       adc     edx,            0
-       add     eax,            esi
-       adc     edx,            0
-       dec     ecx
-       mov     DWORD PTR 16[edi],eax
-       mov     esi,            edx
-       jz      $L003maw_end
-       ; Tail Round 5
-       mov     eax,            DWORD PTR 20[ebx]
-       mul     ebp
-       add     eax,            esi
-       mov     esi,            DWORD PTR 20[edi]
-       adc     edx,            0
-       add     eax,            esi
-       adc     edx,            0
-       dec     ecx
-       mov     DWORD PTR 20[edi],eax
-       mov     esi,            edx
-       jz      $L003maw_end
-       ; Tail Round 6
-       mov     eax,            DWORD PTR 24[ebx]
-       mul     ebp
-       add     eax,            esi
-       mov     esi,            DWORD PTR 24[edi]
-       adc     edx,            0
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 24[edi],eax
-       mov     esi,            edx
-$L003maw_end:
-       mov     eax,            esi
-       pop     ecx
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-_bn_mul_add_words ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _bn_mul_words
-
-_bn_mul_words PROC NEAR
-       push    ebp
-       push    ebx
-       push    esi
-       push    edi
-       ; 
-       xor     esi,            esi
-       mov     edi,            DWORD PTR 20[esp]
-       mov     ebx,            DWORD PTR 24[esp]
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     ecx,            DWORD PTR 32[esp]
-       and     ebp,            4294967288
-       jz      $L004mw_finish
-L005mw_loop:
-       ; Round 0
-       mov     eax,            DWORD PTR [ebx]
-       mul     ecx
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR [edi],eax
-       mov     esi,            edx
-       ; Round 4
-       mov     eax,            DWORD PTR 4[ebx]
-       mul     ecx
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 4[edi],eax
-       mov     esi,            edx
-       ; Round 8
-       mov     eax,            DWORD PTR 8[ebx]
-       mul     ecx
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 8[edi],eax
-       mov     esi,            edx
-       ; Round 12
-       mov     eax,            DWORD PTR 12[ebx]
-       mul     ecx
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 12[edi],eax
-       mov     esi,            edx
-       ; Round 16
-       mov     eax,            DWORD PTR 16[ebx]
-       mul     ecx
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 16[edi],eax
-       mov     esi,            edx
-       ; Round 20
-       mov     eax,            DWORD PTR 20[ebx]
-       mul     ecx
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 20[edi],eax
-       mov     esi,            edx
-       ; Round 24
-       mov     eax,            DWORD PTR 24[ebx]
-       mul     ecx
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 24[edi],eax
-       mov     esi,            edx
-       ; Round 28
-       mov     eax,            DWORD PTR 28[ebx]
-       mul     ecx
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 28[edi],eax
-       mov     esi,            edx
-       ; 
-       add     ebx,            32
-       add     edi,            32
-       sub     ebp,            8
-       jz      $L004mw_finish
-       jmp     L005mw_loop
-$L004mw_finish:
-       mov     ebp,            DWORD PTR 28[esp]
-       and     ebp,            7
-       jnz     $L006mw_finish2
-       jmp     $L007mw_end
-$L006mw_finish2:
-       ; Tail Round 0
-       mov     eax,            DWORD PTR [ebx]
-       mul     ecx
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR [edi],eax
-       mov     esi,            edx
-       dec     ebp
-       jz      $L007mw_end
-       ; Tail Round 1
-       mov     eax,            DWORD PTR 4[ebx]
-       mul     ecx
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 4[edi],eax
-       mov     esi,            edx
-       dec     ebp
-       jz      $L007mw_end
-       ; Tail Round 2
-       mov     eax,            DWORD PTR 8[ebx]
-       mul     ecx
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 8[edi],eax
-       mov     esi,            edx
-       dec     ebp
-       jz      $L007mw_end
-       ; Tail Round 3
-       mov     eax,            DWORD PTR 12[ebx]
-       mul     ecx
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 12[edi],eax
-       mov     esi,            edx
-       dec     ebp
-       jz      $L007mw_end
-       ; Tail Round 4
-       mov     eax,            DWORD PTR 16[ebx]
-       mul     ecx
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 16[edi],eax
-       mov     esi,            edx
-       dec     ebp
-       jz      $L007mw_end
-       ; Tail Round 5
-       mov     eax,            DWORD PTR 20[ebx]
-       mul     ecx
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 20[edi],eax
-       mov     esi,            edx
-       dec     ebp
-       jz      $L007mw_end
-       ; Tail Round 6
-       mov     eax,            DWORD PTR 24[ebx]
-       mul     ecx
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 24[edi],eax
-       mov     esi,            edx
-$L007mw_end:
-       mov     eax,            esi
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-_bn_mul_words ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _bn_sqr_words
-
-_bn_sqr_words PROC NEAR
-       push    ebp
-       push    ebx
-       push    esi
-       push    edi
-       ; 
-       mov     esi,            DWORD PTR 20[esp]
-       mov     edi,            DWORD PTR 24[esp]
-       mov     ebx,            DWORD PTR 28[esp]
-       and     ebx,            4294967288
-       jz      $L008sw_finish
-L009sw_loop:
-       ; Round 0
-       mov     eax,            DWORD PTR [edi]
-       mul     eax
-       mov     DWORD PTR [esi],eax
-       mov     DWORD PTR 4[esi],edx
-       ; Round 4
-       mov     eax,            DWORD PTR 4[edi]
-       mul     eax
-       mov     DWORD PTR 8[esi],eax
-       mov     DWORD PTR 12[esi],edx
-       ; Round 8
-       mov     eax,            DWORD PTR 8[edi]
-       mul     eax
-       mov     DWORD PTR 16[esi],eax
-       mov     DWORD PTR 20[esi],edx
-       ; Round 12
-       mov     eax,            DWORD PTR 12[edi]
-       mul     eax
-       mov     DWORD PTR 24[esi],eax
-       mov     DWORD PTR 28[esi],edx
-       ; Round 16
-       mov     eax,            DWORD PTR 16[edi]
-       mul     eax
-       mov     DWORD PTR 32[esi],eax
-       mov     DWORD PTR 36[esi],edx
-       ; Round 20
-       mov     eax,            DWORD PTR 20[edi]
-       mul     eax
-       mov     DWORD PTR 40[esi],eax
-       mov     DWORD PTR 44[esi],edx
-       ; Round 24
-       mov     eax,            DWORD PTR 24[edi]
-       mul     eax
-       mov     DWORD PTR 48[esi],eax
-       mov     DWORD PTR 52[esi],edx
-       ; Round 28
-       mov     eax,            DWORD PTR 28[edi]
-       mul     eax
-       mov     DWORD PTR 56[esi],eax
-       mov     DWORD PTR 60[esi],edx
-       ; 
-       add     edi,            32
-       add     esi,            64
-       sub     ebx,            8
-       jnz     L009sw_loop
-$L008sw_finish:
-       mov     ebx,            DWORD PTR 28[esp]
-       and     ebx,            7
-       jz      $L010sw_end
-       ; Tail Round 0
-       mov     eax,            DWORD PTR [edi]
-       mul     eax
-       mov     DWORD PTR [esi],eax
-       dec     ebx
-       mov     DWORD PTR 4[esi],edx
-       jz      $L010sw_end
-       ; Tail Round 1
-       mov     eax,            DWORD PTR 4[edi]
-       mul     eax
-       mov     DWORD PTR 8[esi],eax
-       dec     ebx
-       mov     DWORD PTR 12[esi],edx
-       jz      $L010sw_end
-       ; Tail Round 2
-       mov     eax,            DWORD PTR 8[edi]
-       mul     eax
-       mov     DWORD PTR 16[esi],eax
-       dec     ebx
-       mov     DWORD PTR 20[esi],edx
-       jz      $L010sw_end
-       ; Tail Round 3
-       mov     eax,            DWORD PTR 12[edi]
-       mul     eax
-       mov     DWORD PTR 24[esi],eax
-       dec     ebx
-       mov     DWORD PTR 28[esi],edx
-       jz      $L010sw_end
-       ; Tail Round 4
-       mov     eax,            DWORD PTR 16[edi]
-       mul     eax
-       mov     DWORD PTR 32[esi],eax
-       dec     ebx
-       mov     DWORD PTR 36[esi],edx
-       jz      $L010sw_end
-       ; Tail Round 5
-       mov     eax,            DWORD PTR 20[edi]
-       mul     eax
-       mov     DWORD PTR 40[esi],eax
-       dec     ebx
-       mov     DWORD PTR 44[esi],edx
-       jz      $L010sw_end
-       ; Tail Round 6
-       mov     eax,            DWORD PTR 24[edi]
-       mul     eax
-       mov     DWORD PTR 48[esi],eax
-       mov     DWORD PTR 52[esi],edx
-$L010sw_end:
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-_bn_sqr_words ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _bn_div_words
-
-_bn_div_words PROC NEAR
-       push    ebp
-       push    ebx
-       push    esi
-       push    edi
-       mov     edx,            DWORD PTR 20[esp]
-       mov     eax,            DWORD PTR 24[esp]
-       mov     ebx,            DWORD PTR 28[esp]
-       div     ebx
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-_bn_div_words ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _bn_add_words
-
-_bn_add_words PROC NEAR
-       push    ebp
-       push    ebx
-       push    esi
-       push    edi
-       ; 
-       mov     ebx,            DWORD PTR 20[esp]
-       mov     esi,            DWORD PTR 24[esp]
-       mov     edi,            DWORD PTR 28[esp]
-       mov     ebp,            DWORD PTR 32[esp]
-       xor     eax,            eax
-       and     ebp,            4294967288
-       jz      $L011aw_finish
-L012aw_loop:
-       ; Round 0
-       mov     ecx,            DWORD PTR [esi]
-       mov     edx,            DWORD PTR [edi]
-       add     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       add     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR [ebx],ecx
-       ; Round 1
-       mov     ecx,            DWORD PTR 4[esi]
-       mov     edx,            DWORD PTR 4[edi]
-       add     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       add     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR 4[ebx],ecx
-       ; Round 2
-       mov     ecx,            DWORD PTR 8[esi]
-       mov     edx,            DWORD PTR 8[edi]
-       add     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       add     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR 8[ebx],ecx
-       ; Round 3
-       mov     ecx,            DWORD PTR 12[esi]
-       mov     edx,            DWORD PTR 12[edi]
-       add     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       add     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR 12[ebx],ecx
-       ; Round 4
-       mov     ecx,            DWORD PTR 16[esi]
-       mov     edx,            DWORD PTR 16[edi]
-       add     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       add     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR 16[ebx],ecx
-       ; Round 5
-       mov     ecx,            DWORD PTR 20[esi]
-       mov     edx,            DWORD PTR 20[edi]
-       add     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       add     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR 20[ebx],ecx
-       ; Round 6
-       mov     ecx,            DWORD PTR 24[esi]
-       mov     edx,            DWORD PTR 24[edi]
-       add     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       add     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR 24[ebx],ecx
-       ; Round 7
-       mov     ecx,            DWORD PTR 28[esi]
-       mov     edx,            DWORD PTR 28[edi]
-       add     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       add     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR 28[ebx],ecx
-       ; 
-       add     esi,            32
-       add     edi,            32
-       add     ebx,            32
-       sub     ebp,            8
-       jnz     L012aw_loop
-$L011aw_finish:
-       mov     ebp,            DWORD PTR 32[esp]
-       and     ebp,            7
-       jz      $L013aw_end
-       ; Tail Round 0
-       mov     ecx,            DWORD PTR [esi]
-       mov     edx,            DWORD PTR [edi]
-       add     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       add     ecx,            edx
-       adc     eax,            0
-       dec     ebp
-       mov     DWORD PTR [ebx],ecx
-       jz      $L013aw_end
-       ; Tail Round 1
-       mov     ecx,            DWORD PTR 4[esi]
-       mov     edx,            DWORD PTR 4[edi]
-       add     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       add     ecx,            edx
-       adc     eax,            0
-       dec     ebp
-       mov     DWORD PTR 4[ebx],ecx
-       jz      $L013aw_end
-       ; Tail Round 2
-       mov     ecx,            DWORD PTR 8[esi]
-       mov     edx,            DWORD PTR 8[edi]
-       add     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       add     ecx,            edx
-       adc     eax,            0
-       dec     ebp
-       mov     DWORD PTR 8[ebx],ecx
-       jz      $L013aw_end
-       ; Tail Round 3
-       mov     ecx,            DWORD PTR 12[esi]
-       mov     edx,            DWORD PTR 12[edi]
-       add     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       add     ecx,            edx
-       adc     eax,            0
-       dec     ebp
-       mov     DWORD PTR 12[ebx],ecx
-       jz      $L013aw_end
-       ; Tail Round 4
-       mov     ecx,            DWORD PTR 16[esi]
-       mov     edx,            DWORD PTR 16[edi]
-       add     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       add     ecx,            edx
-       adc     eax,            0
-       dec     ebp
-       mov     DWORD PTR 16[ebx],ecx
-       jz      $L013aw_end
-       ; Tail Round 5
-       mov     ecx,            DWORD PTR 20[esi]
-       mov     edx,            DWORD PTR 20[edi]
-       add     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       add     ecx,            edx
-       adc     eax,            0
-       dec     ebp
-       mov     DWORD PTR 20[ebx],ecx
-       jz      $L013aw_end
-       ; Tail Round 6
-       mov     ecx,            DWORD PTR 24[esi]
-       mov     edx,            DWORD PTR 24[edi]
-       add     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       add     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR 24[ebx],ecx
-$L013aw_end:
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-_bn_add_words ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _bn_sub_words
-
-_bn_sub_words PROC NEAR
-       push    ebp
-       push    ebx
-       push    esi
-       push    edi
-       ; 
-       mov     ebx,            DWORD PTR 20[esp]
-       mov     esi,            DWORD PTR 24[esp]
-       mov     edi,            DWORD PTR 28[esp]
-       mov     ebp,            DWORD PTR 32[esp]
-       xor     eax,            eax
-       and     ebp,            4294967288
-       jz      $L014aw_finish
-L015aw_loop:
-       ; Round 0
-       mov     ecx,            DWORD PTR [esi]
-       mov     edx,            DWORD PTR [edi]
-       sub     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       sub     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR [ebx],ecx
-       ; Round 1
-       mov     ecx,            DWORD PTR 4[esi]
-       mov     edx,            DWORD PTR 4[edi]
-       sub     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       sub     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR 4[ebx],ecx
-       ; Round 2
-       mov     ecx,            DWORD PTR 8[esi]
-       mov     edx,            DWORD PTR 8[edi]
-       sub     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       sub     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR 8[ebx],ecx
-       ; Round 3
-       mov     ecx,            DWORD PTR 12[esi]
-       mov     edx,            DWORD PTR 12[edi]
-       sub     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       sub     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR 12[ebx],ecx
-       ; Round 4
-       mov     ecx,            DWORD PTR 16[esi]
-       mov     edx,            DWORD PTR 16[edi]
-       sub     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       sub     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR 16[ebx],ecx
-       ; Round 5
-       mov     ecx,            DWORD PTR 20[esi]
-       mov     edx,            DWORD PTR 20[edi]
-       sub     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       sub     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR 20[ebx],ecx
-       ; Round 6
-       mov     ecx,            DWORD PTR 24[esi]
-       mov     edx,            DWORD PTR 24[edi]
-       sub     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       sub     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR 24[ebx],ecx
-       ; Round 7
-       mov     ecx,            DWORD PTR 28[esi]
-       mov     edx,            DWORD PTR 28[edi]
-       sub     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       sub     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR 28[ebx],ecx
-       ; 
-       add     esi,            32
-       add     edi,            32
-       add     ebx,            32
-       sub     ebp,            8
-       jnz     L015aw_loop
-$L014aw_finish:
-       mov     ebp,            DWORD PTR 32[esp]
-       and     ebp,            7
-       jz      $L016aw_end
-       ; Tail Round 0
-       mov     ecx,            DWORD PTR [esi]
-       mov     edx,            DWORD PTR [edi]
-       sub     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       sub     ecx,            edx
-       adc     eax,            0
-       dec     ebp
-       mov     DWORD PTR [ebx],ecx
-       jz      $L016aw_end
-       ; Tail Round 1
-       mov     ecx,            DWORD PTR 4[esi]
-       mov     edx,            DWORD PTR 4[edi]
-       sub     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       sub     ecx,            edx
-       adc     eax,            0
-       dec     ebp
-       mov     DWORD PTR 4[ebx],ecx
-       jz      $L016aw_end
-       ; Tail Round 2
-       mov     ecx,            DWORD PTR 8[esi]
-       mov     edx,            DWORD PTR 8[edi]
-       sub     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       sub     ecx,            edx
-       adc     eax,            0
-       dec     ebp
-       mov     DWORD PTR 8[ebx],ecx
-       jz      $L016aw_end
-       ; Tail Round 3
-       mov     ecx,            DWORD PTR 12[esi]
-       mov     edx,            DWORD PTR 12[edi]
-       sub     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       sub     ecx,            edx
-       adc     eax,            0
-       dec     ebp
-       mov     DWORD PTR 12[ebx],ecx
-       jz      $L016aw_end
-       ; Tail Round 4
-       mov     ecx,            DWORD PTR 16[esi]
-       mov     edx,            DWORD PTR 16[edi]
-       sub     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       sub     ecx,            edx
-       adc     eax,            0
-       dec     ebp
-       mov     DWORD PTR 16[ebx],ecx
-       jz      $L016aw_end
-       ; Tail Round 5
-       mov     ecx,            DWORD PTR 20[esi]
-       mov     edx,            DWORD PTR 20[edi]
-       sub     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       sub     ecx,            edx
-       adc     eax,            0
-       dec     ebp
-       mov     DWORD PTR 20[ebx],ecx
-       jz      $L016aw_end
-       ; Tail Round 6
-       mov     ecx,            DWORD PTR 24[esi]
-       mov     edx,            DWORD PTR 24[edi]
-       sub     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       sub     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR 24[ebx],ecx
-$L016aw_end:
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-_bn_sub_words ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _bn_mul_comba8
-
-_bn_mul_comba8 PROC NEAR
-       push    esi
-       mov     esi,            DWORD PTR 12[esp]
-       push    edi
-       mov     edi,            DWORD PTR 20[esp]
-       push    ebp
-       push    ebx
-       xor     ebx,            ebx
-       mov     eax,            DWORD PTR [esi]
-       xor     ecx,            ecx
-       mov     edx,            DWORD PTR [edi]
-       ; ################## Calculate word 0
-       xor     ebp,            ebp
-       ; mul a[0]*b[0]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR [edi]
-       adc     ebp,            0
-       mov     DWORD PTR [eax],ebx
-       mov     eax,            DWORD PTR 4[esi]
-       ; saved r[0]
-       ; ################## Calculate word 1
-       xor     ebx,            ebx
-       ; mul a[1]*b[0]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR [esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 4[edi]
-       adc     ebx,            0
-       ; mul a[0]*b[1]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR [edi]
-       adc     ebx,            0
-       mov     DWORD PTR 4[eax],ecx
-       mov     eax,            DWORD PTR 8[esi]
-       ; saved r[1]
-       ; ################## Calculate word 2
-       xor     ecx,            ecx
-       ; mul a[2]*b[0]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 4[esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 4[edi]
-       adc     ecx,            0
-       ; mul a[1]*b[1]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR [esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 8[edi]
-       adc     ecx,            0
-       ; mul a[0]*b[2]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR [edi]
-       adc     ecx,            0
-       mov     DWORD PTR 8[eax],ebp
-       mov     eax,            DWORD PTR 12[esi]
-       ; saved r[2]
-       ; ################## Calculate word 3
-       xor     ebp,            ebp
-       ; mul a[3]*b[0]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 8[esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 4[edi]
-       adc     ebp,            0
-       ; mul a[2]*b[1]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 4[esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 8[edi]
-       adc     ebp,            0
-       ; mul a[1]*b[2]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR [esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 12[edi]
-       adc     ebp,            0
-       ; mul a[0]*b[3]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR [edi]
-       adc     ebp,            0
-       mov     DWORD PTR 12[eax],ebx
-       mov     eax,            DWORD PTR 16[esi]
-       ; saved r[3]
-       ; ################## Calculate word 4
-       xor     ebx,            ebx
-       ; mul a[4]*b[0]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 12[esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 4[edi]
-       adc     ebx,            0
-       ; mul a[3]*b[1]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 8[esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 8[edi]
-       adc     ebx,            0
-       ; mul a[2]*b[2]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 4[esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 12[edi]
-       adc     ebx,            0
-       ; mul a[1]*b[3]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR [esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 16[edi]
-       adc     ebx,            0
-       ; mul a[0]*b[4]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR [edi]
-       adc     ebx,            0
-       mov     DWORD PTR 16[eax],ecx
-       mov     eax,            DWORD PTR 20[esi]
-       ; saved r[4]
-       ; ################## Calculate word 5
-       xor     ecx,            ecx
-       ; mul a[5]*b[0]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 16[esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 4[edi]
-       adc     ecx,            0
-       ; mul a[4]*b[1]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 12[esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 8[edi]
-       adc     ecx,            0
-       ; mul a[3]*b[2]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 8[esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 12[edi]
-       adc     ecx,            0
-       ; mul a[2]*b[3]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 4[esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 16[edi]
-       adc     ecx,            0
-       ; mul a[1]*b[4]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR [esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 20[edi]
-       adc     ecx,            0
-       ; mul a[0]*b[5]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR [edi]
-       adc     ecx,            0
-       mov     DWORD PTR 20[eax],ebp
-       mov     eax,            DWORD PTR 24[esi]
-       ; saved r[5]
-       ; ################## Calculate word 6
-       xor     ebp,            ebp
-       ; mul a[6]*b[0]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 20[esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 4[edi]
-       adc     ebp,            0
-       ; mul a[5]*b[1]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 16[esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 8[edi]
-       adc     ebp,            0
-       ; mul a[4]*b[2]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 12[esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 12[edi]
-       adc     ebp,            0
-       ; mul a[3]*b[3]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 8[esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 16[edi]
-       adc     ebp,            0
-       ; mul a[2]*b[4]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 4[esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 20[edi]
-       adc     ebp,            0
-       ; mul a[1]*b[5]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR [esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 24[edi]
-       adc     ebp,            0
-       ; mul a[0]*b[6]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR [edi]
-       adc     ebp,            0
-       mov     DWORD PTR 24[eax],ebx
-       mov     eax,            DWORD PTR 28[esi]
-       ; saved r[6]
-       ; ################## Calculate word 7
-       xor     ebx,            ebx
-       ; mul a[7]*b[0]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 24[esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 4[edi]
-       adc     ebx,            0
-       ; mul a[6]*b[1]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 20[esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 8[edi]
-       adc     ebx,            0
-       ; mul a[5]*b[2]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 16[esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 12[edi]
-       adc     ebx,            0
-       ; mul a[4]*b[3]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 12[esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 16[edi]
-       adc     ebx,            0
-       ; mul a[3]*b[4]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 8[esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 20[edi]
-       adc     ebx,            0
-       ; mul a[2]*b[5]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 4[esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 24[edi]
-       adc     ebx,            0
-       ; mul a[1]*b[6]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR [esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 28[edi]
-       adc     ebx,            0
-       ; mul a[0]*b[7]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 4[edi]
-       adc     ebx,            0
-       mov     DWORD PTR 28[eax],ecx
-       mov     eax,            DWORD PTR 28[esi]
-       ; saved r[7]
-       ; ################## Calculate word 8
-       xor     ecx,            ecx
-       ; mul a[7]*b[1]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 24[esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 8[edi]
-       adc     ecx,            0
-       ; mul a[6]*b[2]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 20[esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 12[edi]
-       adc     ecx,            0
-       ; mul a[5]*b[3]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 16[esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 16[edi]
-       adc     ecx,            0
-       ; mul a[4]*b[4]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 12[esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 20[edi]
-       adc     ecx,            0
-       ; mul a[3]*b[5]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 8[esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 24[edi]
-       adc     ecx,            0
-       ; mul a[2]*b[6]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 4[esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 28[edi]
-       adc     ecx,            0
-       ; mul a[1]*b[7]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 8[edi]
-       adc     ecx,            0
-       mov     DWORD PTR 32[eax],ebp
-       mov     eax,            DWORD PTR 28[esi]
-       ; saved r[8]
-       ; ################## Calculate word 9
-       xor     ebp,            ebp
-       ; mul a[7]*b[2]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 24[esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 12[edi]
-       adc     ebp,            0
-       ; mul a[6]*b[3]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 20[esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 16[edi]
-       adc     ebp,            0
-       ; mul a[5]*b[4]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 16[esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 20[edi]
-       adc     ebp,            0
-       ; mul a[4]*b[5]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 12[esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 24[edi]
-       adc     ebp,            0
-       ; mul a[3]*b[6]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 8[esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 28[edi]
-       adc     ebp,            0
-       ; mul a[2]*b[7]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 12[edi]
-       adc     ebp,            0
-       mov     DWORD PTR 36[eax],ebx
-       mov     eax,            DWORD PTR 28[esi]
-       ; saved r[9]
-       ; ################## Calculate word 10
-       xor     ebx,            ebx
-       ; mul a[7]*b[3]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 24[esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 16[edi]
-       adc     ebx,            0
-       ; mul a[6]*b[4]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 20[esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 20[edi]
-       adc     ebx,            0
-       ; mul a[5]*b[5]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 16[esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 24[edi]
-       adc     ebx,            0
-       ; mul a[4]*b[6]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 12[esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 28[edi]
-       adc     ebx,            0
-       ; mul a[3]*b[7]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 16[edi]
-       adc     ebx,            0
-       mov     DWORD PTR 40[eax],ecx
-       mov     eax,            DWORD PTR 28[esi]
-       ; saved r[10]
-       ; ################## Calculate word 11
-       xor     ecx,            ecx
-       ; mul a[7]*b[4]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 24[esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 20[edi]
-       adc     ecx,            0
-       ; mul a[6]*b[5]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 20[esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 24[edi]
-       adc     ecx,            0
-       ; mul a[5]*b[6]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 16[esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 28[edi]
-       adc     ecx,            0
-       ; mul a[4]*b[7]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 20[edi]
-       adc     ecx,            0
-       mov     DWORD PTR 44[eax],ebp
-       mov     eax,            DWORD PTR 28[esi]
-       ; saved r[11]
-       ; ################## Calculate word 12
-       xor     ebp,            ebp
-       ; mul a[7]*b[5]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 24[esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 24[edi]
-       adc     ebp,            0
-       ; mul a[6]*b[6]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 20[esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 28[edi]
-       adc     ebp,            0
-       ; mul a[5]*b[7]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 24[edi]
-       adc     ebp,            0
-       mov     DWORD PTR 48[eax],ebx
-       mov     eax,            DWORD PTR 28[esi]
-       ; saved r[12]
-       ; ################## Calculate word 13
-       xor     ebx,            ebx
-       ; mul a[7]*b[6]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 24[esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 28[edi]
-       adc     ebx,            0
-       ; mul a[6]*b[7]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 28[edi]
-       adc     ebx,            0
-       mov     DWORD PTR 52[eax],ecx
-       mov     eax,            DWORD PTR 28[esi]
-       ; saved r[13]
-       ; ################## Calculate word 14
-       xor     ecx,            ecx
-       ; mul a[7]*b[7]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ebx,            edx
-       adc     ecx,            0
-       mov     DWORD PTR 56[eax],ebp
-       ; saved r[14]
-       ; save r[15]
-       mov     DWORD PTR 60[eax],ebx
-       pop     ebx
-       pop     ebp
-       pop     edi
-       pop     esi
-       ret
-_bn_mul_comba8 ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _bn_mul_comba4
-
-_bn_mul_comba4 PROC NEAR
-       push    esi
-       mov     esi,            DWORD PTR 12[esp]
-       push    edi
-       mov     edi,            DWORD PTR 20[esp]
-       push    ebp
-       push    ebx
-       xor     ebx,            ebx
-       mov     eax,            DWORD PTR [esi]
-       xor     ecx,            ecx
-       mov     edx,            DWORD PTR [edi]
-       ; ################## Calculate word 0
-       xor     ebp,            ebp
-       ; mul a[0]*b[0]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR [edi]
-       adc     ebp,            0
-       mov     DWORD PTR [eax],ebx
-       mov     eax,            DWORD PTR 4[esi]
-       ; saved r[0]
-       ; ################## Calculate word 1
-       xor     ebx,            ebx
-       ; mul a[1]*b[0]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR [esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 4[edi]
-       adc     ebx,            0
-       ; mul a[0]*b[1]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR [edi]
-       adc     ebx,            0
-       mov     DWORD PTR 4[eax],ecx
-       mov     eax,            DWORD PTR 8[esi]
-       ; saved r[1]
-       ; ################## Calculate word 2
-       xor     ecx,            ecx
-       ; mul a[2]*b[0]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 4[esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 4[edi]
-       adc     ecx,            0
-       ; mul a[1]*b[1]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR [esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 8[edi]
-       adc     ecx,            0
-       ; mul a[0]*b[2]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR [edi]
-       adc     ecx,            0
-       mov     DWORD PTR 8[eax],ebp
-       mov     eax,            DWORD PTR 12[esi]
-       ; saved r[2]
-       ; ################## Calculate word 3
-       xor     ebp,            ebp
-       ; mul a[3]*b[0]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 8[esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 4[edi]
-       adc     ebp,            0
-       ; mul a[2]*b[1]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 4[esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 8[edi]
-       adc     ebp,            0
-       ; mul a[1]*b[2]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR [esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 12[edi]
-       adc     ebp,            0
-       ; mul a[0]*b[3]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 4[edi]
-       adc     ebp,            0
-       mov     DWORD PTR 12[eax],ebx
-       mov     eax,            DWORD PTR 12[esi]
-       ; saved r[3]
-       ; ################## Calculate word 4
-       xor     ebx,            ebx
-       ; mul a[3]*b[1]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 8[esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 8[edi]
-       adc     ebx,            0
-       ; mul a[2]*b[2]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 4[esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 12[edi]
-       adc     ebx,            0
-       ; mul a[1]*b[3]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 8[edi]
-       adc     ebx,            0
-       mov     DWORD PTR 16[eax],ecx
-       mov     eax,            DWORD PTR 12[esi]
-       ; saved r[4]
-       ; ################## Calculate word 5
-       xor     ecx,            ecx
-       ; mul a[3]*b[2]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 8[esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 12[edi]
-       adc     ecx,            0
-       ; mul a[2]*b[3]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 12[edi]
-       adc     ecx,            0
-       mov     DWORD PTR 20[eax],ebp
-       mov     eax,            DWORD PTR 12[esi]
-       ; saved r[5]
-       ; ################## Calculate word 6
-       xor     ebp,            ebp
-       ; mul a[3]*b[3]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ecx,            edx
-       adc     ebp,            0
-       mov     DWORD PTR 24[eax],ebx
-       ; saved r[6]
-       ; save r[7]
-       mov     DWORD PTR 28[eax],ecx
-       pop     ebx
-       pop     ebp
-       pop     edi
-       pop     esi
-       ret
-_bn_mul_comba4 ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _bn_sqr_comba8
-
-_bn_sqr_comba8 PROC NEAR
-       push    esi
-       push    edi
-       push    ebp
-       push    ebx
-       mov     edi,            DWORD PTR 20[esp]
-       mov     esi,            DWORD PTR 24[esp]
-       xor     ebx,            ebx
-       xor     ecx,            ecx
-       mov     eax,            DWORD PTR [esi]
-       ; ############### Calculate word 0
-       xor     ebp,            ebp
-       ; sqr a[0]*a[0]
-       mul     eax
-       add     ebx,            eax
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR [esi]
-       adc     ebp,            0
-       mov     DWORD PTR [edi],ebx
-       mov     eax,            DWORD PTR 4[esi]
-       ; saved r[0]
-       ; ############### Calculate word 1
-       xor     ebx,            ebx
-       ; sqr a[1]*a[0]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebx,            0
-       add     ecx,            eax
-       adc     ebp,            edx
-       mov     eax,            DWORD PTR 8[esi]
-       adc     ebx,            0
-       mov     DWORD PTR 4[edi],ecx
-       mov     edx,            DWORD PTR [esi]
-       ; saved r[1]
-       ; ############### Calculate word 2
-       xor     ecx,            ecx
-       ; sqr a[2]*a[0]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ecx,            0
-       add     ebp,            eax
-       adc     ebx,            edx
-       mov     eax,            DWORD PTR 4[esi]
-       adc     ecx,            0
-       ; sqr a[1]*a[1]
-       mul     eax
-       add     ebp,            eax
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR [esi]
-       adc     ecx,            0
-       mov     DWORD PTR 8[edi],ebp
-       mov     eax,            DWORD PTR 12[esi]
-       ; saved r[2]
-       ; ############### Calculate word 3
-       xor     ebp,            ebp
-       ; sqr a[3]*a[0]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebp,            0
-       add     ebx,            eax
-       adc     ecx,            edx
-       mov     eax,            DWORD PTR 8[esi]
-       adc     ebp,            0
-       mov     edx,            DWORD PTR 4[esi]
-       ; sqr a[2]*a[1]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebp,            0
-       add     ebx,            eax
-       adc     ecx,            edx
-       mov     eax,            DWORD PTR 16[esi]
-       adc     ebp,            0
-       mov     DWORD PTR 12[edi],ebx
-       mov     edx,            DWORD PTR [esi]
-       ; saved r[3]
-       ; ############### Calculate word 4
-       xor     ebx,            ebx
-       ; sqr a[4]*a[0]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebx,            0
-       add     ecx,            eax
-       adc     ebp,            edx
-       mov     eax,            DWORD PTR 12[esi]
-       adc     ebx,            0
-       mov     edx,            DWORD PTR 4[esi]
-       ; sqr a[3]*a[1]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebx,            0
-       add     ecx,            eax
-       adc     ebp,            edx
-       mov     eax,            DWORD PTR 8[esi]
-       adc     ebx,            0
-       ; sqr a[2]*a[2]
-       mul     eax
-       add     ecx,            eax
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR [esi]
-       adc     ebx,            0
-       mov     DWORD PTR 16[edi],ecx
-       mov     eax,            DWORD PTR 20[esi]
-       ; saved r[4]
-       ; ############### Calculate word 5
-       xor     ecx,            ecx
-       ; sqr a[5]*a[0]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ecx,            0
-       add     ebp,            eax
-       adc     ebx,            edx
-       mov     eax,            DWORD PTR 16[esi]
-       adc     ecx,            0
-       mov     edx,            DWORD PTR 4[esi]
-       ; sqr a[4]*a[1]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ecx,            0
-       add     ebp,            eax
-       adc     ebx,            edx
-       mov     eax,            DWORD PTR 12[esi]
-       adc     ecx,            0
-       mov     edx,            DWORD PTR 8[esi]
-       ; sqr a[3]*a[2]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ecx,            0
-       add     ebp,            eax
-       adc     ebx,            edx
-       mov     eax,            DWORD PTR 24[esi]
-       adc     ecx,            0
-       mov     DWORD PTR 20[edi],ebp
-       mov     edx,            DWORD PTR [esi]
-       ; saved r[5]
-       ; ############### Calculate word 6
-       xor     ebp,            ebp
-       ; sqr a[6]*a[0]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebp,            0
-       add     ebx,            eax
-       adc     ecx,            edx
-       mov     eax,            DWORD PTR 20[esi]
-       adc     ebp,            0
-       mov     edx,            DWORD PTR 4[esi]
-       ; sqr a[5]*a[1]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebp,            0
-       add     ebx,            eax
-       adc     ecx,            edx
-       mov     eax,            DWORD PTR 16[esi]
-       adc     ebp,            0
-       mov     edx,            DWORD PTR 8[esi]
-       ; sqr a[4]*a[2]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebp,            0
-       add     ebx,            eax
-       adc     ecx,            edx
-       mov     eax,            DWORD PTR 12[esi]
-       adc     ebp,            0
-       ; sqr a[3]*a[3]
-       mul     eax
-       add     ebx,            eax
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR [esi]
-       adc     ebp,            0
-       mov     DWORD PTR 24[edi],ebx
-       mov     eax,            DWORD PTR 28[esi]
-       ; saved r[6]
-       ; ############### Calculate word 7
-       xor     ebx,            ebx
-       ; sqr a[7]*a[0]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebx,            0
-       add     ecx,            eax
-       adc     ebp,            edx
-       mov     eax,            DWORD PTR 24[esi]
-       adc     ebx,            0
-       mov     edx,            DWORD PTR 4[esi]
-       ; sqr a[6]*a[1]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebx,            0
-       add     ecx,            eax
-       adc     ebp,            edx
-       mov     eax,            DWORD PTR 20[esi]
-       adc     ebx,            0
-       mov     edx,            DWORD PTR 8[esi]
-       ; sqr a[5]*a[2]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebx,            0
-       add     ecx,            eax
-       adc     ebp,            edx
-       mov     eax,            DWORD PTR 16[esi]
-       adc     ebx,            0
-       mov     edx,            DWORD PTR 12[esi]
-       ; sqr a[4]*a[3]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebx,            0
-       add     ecx,            eax
-       adc     ebp,            edx
-       mov     eax,            DWORD PTR 28[esi]
-       adc     ebx,            0
-       mov     DWORD PTR 28[edi],ecx
-       mov     edx,            DWORD PTR 4[esi]
-       ; saved r[7]
-       ; ############### Calculate word 8
-       xor     ecx,            ecx
-       ; sqr a[7]*a[1]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ecx,            0
-       add     ebp,            eax
-       adc     ebx,            edx
-       mov     eax,            DWORD PTR 24[esi]
-       adc     ecx,            0
-       mov     edx,            DWORD PTR 8[esi]
-       ; sqr a[6]*a[2]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ecx,            0
-       add     ebp,            eax
-       adc     ebx,            edx
-       mov     eax,            DWORD PTR 20[esi]
-       adc     ecx,            0
-       mov     edx,            DWORD PTR 12[esi]
-       ; sqr a[5]*a[3]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ecx,            0
-       add     ebp,            eax
-       adc     ebx,            edx
-       mov     eax,            DWORD PTR 16[esi]
-       adc     ecx,            0
-       ; sqr a[4]*a[4]
-       mul     eax
-       add     ebp,            eax
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 8[esi]
-       adc     ecx,            0
-       mov     DWORD PTR 32[edi],ebp
-       mov     eax,            DWORD PTR 28[esi]
-       ; saved r[8]
-       ; ############### Calculate word 9
-       xor     ebp,            ebp
-       ; sqr a[7]*a[2]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebp,            0
-       add     ebx,            eax
-       adc     ecx,            edx
-       mov     eax,            DWORD PTR 24[esi]
-       adc     ebp,            0
-       mov     edx,            DWORD PTR 12[esi]
-       ; sqr a[6]*a[3]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebp,            0
-       add     ebx,            eax
-       adc     ecx,            edx
-       mov     eax,            DWORD PTR 20[esi]
-       adc     ebp,            0
-       mov     edx,            DWORD PTR 16[esi]
-       ; sqr a[5]*a[4]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebp,            0
-       add     ebx,            eax
-       adc     ecx,            edx
-       mov     eax,            DWORD PTR 28[esi]
-       adc     ebp,            0
-       mov     DWORD PTR 36[edi],ebx
-       mov     edx,            DWORD PTR 12[esi]
-       ; saved r[9]
-       ; ############### Calculate word 10
-       xor     ebx,            ebx
-       ; sqr a[7]*a[3]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebx,            0
-       add     ecx,            eax
-       adc     ebp,            edx
-       mov     eax,            DWORD PTR 24[esi]
-       adc     ebx,            0
-       mov     edx,            DWORD PTR 16[esi]
-       ; sqr a[6]*a[4]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebx,            0
-       add     ecx,            eax
-       adc     ebp,            edx
-       mov     eax,            DWORD PTR 20[esi]
-       adc     ebx,            0
-       ; sqr a[5]*a[5]
-       mul     eax
-       add     ecx,            eax
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 16[esi]
-       adc     ebx,            0
-       mov     DWORD PTR 40[edi],ecx
-       mov     eax,            DWORD PTR 28[esi]
-       ; saved r[10]
-       ; ############### Calculate word 11
-       xor     ecx,            ecx
-       ; sqr a[7]*a[4]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ecx,            0
-       add     ebp,            eax
-       adc     ebx,            edx
-       mov     eax,            DWORD PTR 24[esi]
-       adc     ecx,            0
-       mov     edx,            DWORD PTR 20[esi]
-       ; sqr a[6]*a[5]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ecx,            0
-       add     ebp,            eax
-       adc     ebx,            edx
-       mov     eax,            DWORD PTR 28[esi]
-       adc     ecx,            0
-       mov     DWORD PTR 44[edi],ebp
-       mov     edx,            DWORD PTR 20[esi]
-       ; saved r[11]
-       ; ############### Calculate word 12
-       xor     ebp,            ebp
-       ; sqr a[7]*a[5]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebp,            0
-       add     ebx,            eax
-       adc     ecx,            edx
-       mov     eax,            DWORD PTR 24[esi]
-       adc     ebp,            0
-       ; sqr a[6]*a[6]
-       mul     eax
-       add     ebx,            eax
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 24[esi]
-       adc     ebp,            0
-       mov     DWORD PTR 48[edi],ebx
-       mov     eax,            DWORD PTR 28[esi]
-       ; saved r[12]
-       ; ############### Calculate word 13
-       xor     ebx,            ebx
-       ; sqr a[7]*a[6]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebx,            0
-       add     ecx,            eax
-       adc     ebp,            edx
-       mov     eax,            DWORD PTR 28[esi]
-       adc     ebx,            0
-       mov     DWORD PTR 52[edi],ecx
-       ; saved r[13]
-       ; ############### Calculate word 14
-       xor     ecx,            ecx
-       ; sqr a[7]*a[7]
-       mul     eax
-       add     ebp,            eax
-       adc     ebx,            edx
-       adc     ecx,            0
-       mov     DWORD PTR 56[edi],ebp
-       ; saved r[14]
-       mov     DWORD PTR 60[edi],ebx
-       pop     ebx
-       pop     ebp
-       pop     edi
-       pop     esi
-       ret
-_bn_sqr_comba8 ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _bn_sqr_comba4
-
-_bn_sqr_comba4 PROC NEAR
-       push    esi
-       push    edi
-       push    ebp
-       push    ebx
-       mov     edi,            DWORD PTR 20[esp]
-       mov     esi,            DWORD PTR 24[esp]
-       xor     ebx,            ebx
-       xor     ecx,            ecx
-       mov     eax,            DWORD PTR [esi]
-       ; ############### Calculate word 0
-       xor     ebp,            ebp
-       ; sqr a[0]*a[0]
-       mul     eax
-       add     ebx,            eax
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR [esi]
-       adc     ebp,            0
-       mov     DWORD PTR [edi],ebx
-       mov     eax,            DWORD PTR 4[esi]
-       ; saved r[0]
-       ; ############### Calculate word 1
-       xor     ebx,            ebx
-       ; sqr a[1]*a[0]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebx,            0
-       add     ecx,            eax
-       adc     ebp,            edx
-       mov     eax,            DWORD PTR 8[esi]
-       adc     ebx,            0
-       mov     DWORD PTR 4[edi],ecx
-       mov     edx,            DWORD PTR [esi]
-       ; saved r[1]
-       ; ############### Calculate word 2
-       xor     ecx,            ecx
-       ; sqr a[2]*a[0]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ecx,            0
-       add     ebp,            eax
-       adc     ebx,            edx
-       mov     eax,            DWORD PTR 4[esi]
-       adc     ecx,            0
-       ; sqr a[1]*a[1]
-       mul     eax
-       add     ebp,            eax
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR [esi]
-       adc     ecx,            0
-       mov     DWORD PTR 8[edi],ebp
-       mov     eax,            DWORD PTR 12[esi]
-       ; saved r[2]
-       ; ############### Calculate word 3
-       xor     ebp,            ebp
-       ; sqr a[3]*a[0]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebp,            0
-       add     ebx,            eax
-       adc     ecx,            edx
-       mov     eax,            DWORD PTR 8[esi]
-       adc     ebp,            0
-       mov     edx,            DWORD PTR 4[esi]
-       ; sqr a[2]*a[1]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebp,            0
-       add     ebx,            eax
-       adc     ecx,            edx
-       mov     eax,            DWORD PTR 12[esi]
-       adc     ebp,            0
-       mov     DWORD PTR 12[edi],ebx
-       mov     edx,            DWORD PTR 4[esi]
-       ; saved r[3]
-       ; ############### Calculate word 4
-       xor     ebx,            ebx
-       ; sqr a[3]*a[1]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebx,            0
-       add     ecx,            eax
-       adc     ebp,            edx
-       mov     eax,            DWORD PTR 8[esi]
-       adc     ebx,            0
-       ; sqr a[2]*a[2]
-       mul     eax
-       add     ecx,            eax
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 8[esi]
-       adc     ebx,            0
-       mov     DWORD PTR 16[edi],ecx
-       mov     eax,            DWORD PTR 12[esi]
-       ; saved r[4]
-       ; ############### Calculate word 5
-       xor     ecx,            ecx
-       ; sqr a[3]*a[2]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ecx,            0
-       add     ebp,            eax
-       adc     ebx,            edx
-       mov     eax,            DWORD PTR 12[esi]
-       adc     ecx,            0
-       mov     DWORD PTR 20[edi],ebp
-       ; saved r[5]
-       ; ############### Calculate word 6
-       xor     ebp,            ebp
-       ; sqr a[3]*a[3]
-       mul     eax
-       add     ebx,            eax
-       adc     ecx,            edx
-       adc     ebp,            0
-       mov     DWORD PTR 24[edi],ebx
-       ; saved r[6]
-       mov     DWORD PTR 28[edi],ecx
-       pop     ebx
-       pop     ebp
-       pop     edi
-       pop     esi
-       ret
-_bn_sqr_comba4 ENDP
-_TEXT  ENDS
-END
index 80a9ed6..e69de29 100644 (file)
@@ -1,297 +0,0 @@
-;      Static Name Aliases
-;
-       TITLE   bn_mulw.c
-       .8087
-F_TEXT SEGMENT  WORD PUBLIC 'CODE'
-F_TEXT ENDS
-_DATA  SEGMENT  WORD PUBLIC 'DATA'
-_DATA  ENDS
-_CONST SEGMENT  WORD PUBLIC 'CONST'
-_CONST ENDS
-_BSS   SEGMENT  WORD PUBLIC 'BSS'
-_BSS   ENDS
-DGROUP GROUP   _CONST, _BSS, _DATA
-       ASSUME DS: DGROUP, SS: DGROUP
-F_TEXT      SEGMENT
-       ASSUME  CS: F_TEXT
-       PUBLIC  _bn_mul_add_words
-_bn_mul_add_words      PROC FAR
-; Line 58
-       push    bp
-       push    bx
-       push    si
-       push    di
-       push    ds
-       push    es
-       mov     bp,sp
-;      w = 26
-;      num = 24
-;      ap = 20
-;      rp = 16
-       xor     si,si                   ;c=0;
-       mov     di,WORD PTR [bp+16]     ; load r
-       mov     ds,WORD PTR [bp+18]     ; load r
-       mov     bx,WORD PTR [bp+20]     ; load a
-       mov     es,WORD PTR [bp+22]     ; load a
-       mov     cx,WORD PTR [bp+26]     ; load w
-       mov     bp,WORD PTR [bp+24]     ; load num
-
-       shr     bp,1    ; div count by 4 and do groups of 4
-       shr     bp,1
-       je      $L555
-
-$L546:
-       mov     ax,cx
-       mul     WORD PTR es:[bx]        ; w* *a
-       add     ax,WORD PTR ds:[di]     ; + *r
-       adc     dx,0
-       adc     ax,si
-       adc     dx,0
-       mov     WORD PTR ds:[di],ax
-       mov     si,dx
-       ;
-       mov     ax,cx
-       mul     WORD PTR es:[bx+2]      ; w* *a
-       add     ax,WORD PTR ds:[di+2]   ; + *r
-       adc     dx,0
-       adc     ax,si
-       adc     dx,0
-       mov     WORD PTR ds:[di+2],ax
-       mov     si,dx
-       ;
-       mov     ax,cx
-       mul     WORD PTR es:[bx+4]      ; w* *a
-       add     ax,WORD PTR ds:[di+4]   ; + *r
-       adc     dx,0
-       adc     ax,si
-       adc     dx,0
-       mov     WORD PTR ds:[di+4],ax
-       mov     si,dx
-       ;
-       mov     ax,cx
-       mul     WORD PTR es:[bx+6]      ; w* *a
-       add     ax,WORD PTR ds:[di+6]   ; + *r
-       adc     dx,0
-       adc     ax,si
-       adc     dx,0
-       mov     WORD PTR ds:[di+6],ax
-       mov     si,dx
-       ;
-       add     bx,8
-       add     di,8
-       ;
-       dec     bp
-       je      $L555
-       jmp     $L546
-;
-;
-$L555:
-       mov     bp,sp
-       mov     bp,WORD PTR [bp+24]     ; load num
-       and     bp,3
-       dec     bp
-       js      $L547
-
-       mov     ax,cx
-       mul     WORD PTR es:[bx]        ; w* *a
-       add     ax,WORD PTR ds:[di]     ; + *r
-       adc     dx,0
-       adc     ax,si
-       adc     dx,0
-       mov     WORD PTR ds:[di],ax
-       mov     si,dx
-       dec     bp
-       js      $L547                   ; Note that we are now testing for -1
-       ;
-       mov     ax,cx
-       mul     WORD PTR es:[bx+2]      ; w* *a
-       add     ax,WORD PTR ds:[di+2]   ; + *r
-       adc     dx,0
-       adc     ax,si
-       adc     dx,0
-       mov     WORD PTR ds:[di+2],ax
-       mov     si,dx
-       dec     bp
-       js      $L547
-       ;
-       mov     ax,cx
-       mul     WORD PTR es:[bx+4]      ; w* *a
-       add     ax,WORD PTR ds:[di+4]   ; + *r
-       adc     dx,0
-       adc     ax,si
-       adc     dx,0
-       mov     WORD PTR ds:[di+4],ax
-       mov     si,dx
-$L547:
-       mov     ax,si
-       pop     es
-       pop     ds
-       pop     di
-       pop     si
-       pop     bx
-       pop     bp
-       ret     
-       nop     
-
-_bn_mul_add_words      ENDP
-       PUBLIC  _bn_mul_words
-_bn_mul_words  PROC FAR
-; Line 76
-       push    bp
-       push    bx
-       push    si
-       push    di
-       push    ds
-       push    es
-       xor     si,si
-       mov     bp,sp
-       mov     di,WORD PTR [bp+16]     ; r
-       mov     ds,WORD PTR [bp+18]
-       mov     bx,WORD PTR [bp+20]     ; a
-       mov     es,WORD PTR [bp+22]
-       mov     cx,WORD PTR [bp+26]     ; w
-       mov     bp,WORD PTR [bp+24]     ; num 
-$FC743:
-       mov     ax,cx
-       mul     WORD PTR es:[bx]
-       add     ax,si
-       adc     dx,0
-       mov     WORD PTR ds:[di],ax
-       mov     si,dx
-       dec     bp
-       je      $L764
-       ;
-       mov     ax,cx
-       mul     WORD PTR es:[bx+2]
-       add     ax,si
-       adc     dx,0
-       mov     WORD PTR ds:[di+2],ax
-       mov     si,dx
-       dec     bp
-       je      $L764
-       ;
-       mov     ax,cx
-       mul     WORD PTR es:[bx+4]
-       add     ax,si
-       adc     dx,0
-       mov     WORD PTR ds:[di+4],ax
-       mov     si,dx
-       dec     bp
-       je      $L764
-       ;
-       mov     ax,cx
-       mul     WORD PTR es:[bx+6]
-       add     ax,si
-       adc     dx,0
-       mov     WORD PTR ds:[di+6],ax
-       mov     si,dx
-       dec     bp
-       je      $L764
-       ;
-       add     bx,8
-       add     di,8
-       jmp     $FC743
-       nop
-$L764:
-       mov     ax,si
-       pop     es
-       pop     ds
-       pop     di
-       pop     si
-       pop     bx
-       pop     bp
-       ret     
-       nop     
-_bn_mul_words  ENDP
-       PUBLIC  _bn_sqr_words
-_bn_sqr_words  PROC FAR
-; Line 92
-       push    bp
-       push    bx
-       push    si
-       push    di
-       push    ds
-       push    es
-       mov     bp,sp
-       mov     si,WORD PTR [bp+16]
-       mov     ds,WORD PTR [bp+18]
-       mov     di,WORD PTR [bp+20]
-       mov     es,WORD PTR [bp+22]
-       mov     bx,WORD PTR [bp+24]
-
-       mov     bp,bx   ; save a memory lookup later
-       shr     bx,1    ; div count by 4 and do groups of 4
-       shr     bx,1
-       je      $L666
-
-$L765:
-       mov     ax,WORD PTR es:[di]
-       mul     ax
-       mov     WORD PTR ds:[si],ax
-       mov     WORD PTR ds:[si+2],dx
-       ;
-       mov     ax,WORD PTR es:[di+2]
-       mul     ax
-       mov     WORD PTR ds:[si+4],ax
-       mov     WORD PTR ds:[si+6],dx
-       ;
-       mov     ax,WORD PTR es:[di+4]
-       mul     ax
-       mov     WORD PTR ds:[si+8],ax
-       mov     WORD PTR ds:[si+10],dx
-       ;
-       mov     ax,WORD PTR es:[di+6]
-       mul     ax
-       mov     WORD PTR ds:[si+12],ax
-       mov     WORD PTR ds:[si+14],dx
-       ;
-       add     di,8
-       add     si,16
-       dec     bx
-       je      $L666
-       jmp     $L765
-$L666:
-       and     bp,3
-       dec     bp      ; The copied value of bx (num)
-       js      $L645
-       ;
-       mov     ax,WORD PTR es:[di]
-       mul     ax
-       mov     WORD PTR ds:[si],ax
-       mov     WORD PTR ds:[si+2],dx
-       dec     bp
-       js      $L645
-       ;
-       mov     ax,WORD PTR es:[di+2]
-       mul     ax
-       mov     WORD PTR ds:[si+4],ax
-       mov     WORD PTR ds:[si+6],dx
-       dec     bp
-       js      $L645
-       ;
-       mov     ax,WORD PTR es:[di+4]
-       mul     ax
-       mov     WORD PTR ds:[si+8],ax
-       mov     WORD PTR ds:[si+10],dx
-$L645:
-       pop     es
-       pop     ds
-       pop     di
-       pop     si
-       pop     bx
-       pop     bp
-       ret     
-
-_bn_sqr_words  ENDP
-       PUBLIC  _bn_div64
-_bn_div64      PROC FAR
-       push    bp
-       mov     bp,sp
-       mov     dx, WORD PTR [bp+6]
-       mov     ax, WORD PTR [bp+8]
-       div     WORD PTR [bp+10]
-       pop     bp
-       ret     
-_bn_div64      ENDP
-F_TEXT ENDS
-END
index 957d71e..e69de29 100644 (file)
@@ -1,360 +0,0 @@
-;      Static Name Aliases
-;
-       TITLE   bn_mulw.c
-       .386
-F_TEXT SEGMENT  WORD USE16 PUBLIC 'CODE'
-F_TEXT ENDS
-_DATA  SEGMENT  WORD USE16 PUBLIC 'DATA'
-_DATA  ENDS
-_CONST SEGMENT  WORD USE16 PUBLIC 'CONST'
-_CONST ENDS
-_BSS   SEGMENT  WORD USE16 PUBLIC 'BSS'
-_BSS   ENDS
-DGROUP GROUP   _CONST, _BSS, _DATA
-       ASSUME DS: DGROUP, SS: DGROUP
-F_TEXT      SEGMENT
-       ASSUME  CS: F_TEXT
-       PUBLIC  _bn_mul_add_words
-_bn_mul_add_words      PROC FAR
-; Line 58
-       push    bp
-       push    bx
-       push    esi
-       push    di
-       push    ds
-       push    es
-       mov     bp,sp
-;      w = 28
-;      num = 26
-;      ap = 22
-;      rp = 18
-       xor     esi,esi                 ;c=0;
-       mov     di,WORD PTR [bp+18]     ; load r
-       mov     ds,WORD PTR [bp+20]     ; load r
-       mov     bx,WORD PTR [bp+22]     ; load a
-       mov     es,WORD PTR [bp+24]     ; load a
-       mov     ecx,DWORD PTR [bp+28]   ; load w
-       mov     bp,WORD PTR [bp+26]     ; load num
-       shr     bp,1    ; div count by 4 and do groups of 4
-       shr     bp,1
-       je      $L555
-
-$L546:
-       mov     eax,ecx
-       mul     DWORD PTR es:[bx]       ; w* *a
-       add     eax,DWORD PTR ds:[di]   ; + *r
-       adc     edx,0
-       adc     eax,esi
-       adc     edx,0
-       mov     DWORD PTR ds:[di],eax
-       mov     esi,edx
-       ;
-       mov     eax,ecx
-       mul     DWORD PTR es:[bx+4]     ; w* *a
-       add     eax,DWORD PTR ds:[di+4] ; + *r
-       adc     edx,0
-       adc     eax,esi
-       adc     edx,0
-       mov     DWORD PTR ds:[di+4],eax
-       mov     esi,edx
-       ;
-       mov     eax,ecx
-       mul     DWORD PTR es:[bx+8]     ; w* *a
-       add     eax,DWORD PTR ds:[di+8] ; + *r
-       adc     edx,0
-       adc     eax,esi
-       adc     edx,0
-       mov     DWORD PTR ds:[di+8],eax
-       mov     esi,edx
-       ;
-       mov     eax,ecx
-       mul     DWORD PTR es:[bx+12]    ; w* *a
-       add     eax,DWORD PTR ds:[di+12]        ; + *r
-       adc     edx,0
-       adc     eax,esi
-       adc     edx,0
-       mov     DWORD PTR ds:[di+12],eax
-       mov     esi,edx
-       ;
-       add     bx,16
-       add     di,16
-       ;
-       dec     bp
-       je      $L555
-       jmp     $L546
-;
-;
-$L555:
-       mov     bp,sp
-       mov     bp,WORD PTR [bp+26]     ; load num
-       and     bp,3
-       dec     bp
-       js      $L547m
-
-       mov     eax,ecx
-       mul     DWORD PTR es:[bx]       ; w* *a
-       add     eax,DWORD PTR ds:[di]   ; + *r
-       adc     edx,0
-       adc     eax,esi
-       adc     edx,0
-       mov     DWORD PTR ds:[di],eax
-       mov     esi,edx
-       dec     bp
-       js      $L547m                  ; Note that we are now testing for -1
-       ;
-       mov     eax,ecx
-       mul     DWORD PTR es:[bx+4]     ; w* *a
-       add     eax,DWORD PTR ds:[di+4] ; + *r
-       adc     edx,0
-       adc     eax,esi
-       adc     edx,0
-       mov     DWORD PTR ds:[di+4],eax
-       mov     esi,edx
-       dec     bp
-       js      $L547m
-       ;
-       mov     eax,ecx
-       mul     DWORD PTR es:[bx+8]     ; w* *a
-       add     eax,DWORD PTR ds:[di+8] ; + *r
-       adc     edx,0
-       adc     eax,esi
-       adc     edx,0
-       mov     DWORD PTR ds:[di+8],eax
-       mov     esi,edx
-$L547m:
-       mov     eax,esi
-       mov     edx,esi
-       shr     edx,16
-       pop     es
-       pop     ds
-       pop     di
-       pop     esi
-       pop     bx
-       pop     bp
-       ret     
-       nop     
-_bn_mul_add_words      ENDP
-
-       PUBLIC  _bn_mul_words
-_bn_mul_words  PROC FAR
-; Line 76
-       push    bp
-       push    bx
-       push    esi
-       push    di
-       push    ds
-       push    es
-       xor     esi,esi
-       mov     bp,sp
-       mov     di,WORD PTR [bp+18]     ; r
-       mov     ds,WORD PTR [bp+20]
-       mov     bx,WORD PTR [bp+22]     ; a
-       mov     es,WORD PTR [bp+24]
-       mov     ecx,DWORD PTR [bp+28]   ; w
-       mov     bp,WORD PTR [bp+26]     ; num 
-
-$FC743:
-       mov     eax,ecx
-       mul     DWORD PTR es:[bx]
-       add     eax,esi
-       adc     edx,0
-       mov     DWORD PTR ds:[di],eax
-       mov     esi,edx
-       dec     bp
-       je      $L764
-       ;
-       mov     eax,ecx
-       mul     DWORD PTR es:[bx+4]
-       add     eax,esi
-       adc     edx,0
-       mov     DWORD PTR ds:[di+4],eax
-       mov     esi,edx
-       dec     bp
-       je      $L764
-       ;
-       mov     eax,ecx
-       mul     DWORD PTR es:[bx+8]
-       add     eax,esi
-       adc     edx,0
-       mov     DWORD PTR ds:[di+8],eax
-       mov     esi,edx
-       dec     bp
-       je      $L764
-       ;
-       mov     eax,ecx
-       mul     DWORD PTR es:[bx+12]
-       add     eax,esi
-       adc     edx,0
-       mov     DWORD PTR ds:[di+12],eax
-       mov     esi,edx
-       dec     bp
-       je      $L764
-       ;
-       add     bx,16
-       add     di,16
-       jmp     $FC743
-       nop
-$L764:
-       mov     eax,esi
-       mov     edx,esi
-       shr     edx,16
-       pop     es
-       pop     ds
-       pop     di
-       pop     esi
-       pop     bx
-       pop     bp
-       ret     
-       nop     
-_bn_mul_words  ENDP
-       PUBLIC  _bn_sqr_words
-_bn_sqr_words  PROC FAR
-; Line 92
-       push    bp
-       push    bx
-       push    si
-       push    di
-       push    ds
-       push    es
-       mov     bp,sp
-       mov     si,WORD PTR [bp+16]
-       mov     ds,WORD PTR [bp+18]
-       mov     di,WORD PTR [bp+20]
-       mov     es,WORD PTR [bp+22]
-       mov     bx,WORD PTR [bp+24]
-
-       mov     bp,bx   ; save a memory lookup later
-       shr     bx,1    ; div count by 4 and do groups of 4
-       shr     bx,1
-       je      $L666
-
-$L765:
-       mov     eax,DWORD PTR es:[di]
-       mul     eax
-       mov     DWORD PTR ds:[si],eax
-       mov     DWORD PTR ds:[si+4],edx
-       ;
-       mov     eax,DWORD PTR es:[di+4]
-       mul     eax
-       mov     DWORD PTR ds:[si+8],eax
-       mov     DWORD PTR ds:[si+12],edx
-       ;
-       mov     eax,DWORD PTR es:[di+8]
-       mul     eax
-       mov     DWORD PTR ds:[si+16],eax
-       mov     DWORD PTR ds:[si+20],edx
-       ;
-       mov     eax,DWORD PTR es:[di+12]
-       mul     eax
-       mov     DWORD PTR ds:[si+24],eax
-       mov     DWORD PTR ds:[si+28],edx
-       ;
-       add     di,16
-       add     si,32
-       dec     bx
-       je      $L666
-       jmp     $L765
-$L666:
-       and     bp,3
-       dec     bp      ; The copied value of bx (num)
-       js      $L645
-       ;
-       mov     eax,DWORD PTR es:[di]
-       mul     eax
-       mov     DWORD PTR ds:[si],eax
-       mov     DWORD PTR ds:[si+4],edx
-       dec     bp
-       js      $L645
-       ;
-       mov     eax,DWORD PTR es:[di+4]
-       mul     eax
-       mov     DWORD PTR ds:[si+8],eax
-       mov     DWORD PTR ds:[si+12],edx
-       dec     bp
-       js      $L645
-       ;
-       mov     eax,DWORD PTR es:[di+8]
-       mul     eax
-       mov     DWORD PTR ds:[si+16],eax
-       mov     DWORD PTR ds:[si+20],edx
-$L645:
-       pop     es
-       pop     ds
-       pop     di
-       pop     si
-       pop     bx
-       pop     bp
-       ret     
-_bn_sqr_words  ENDP
-
-       PUBLIC  _bn_div64
-_bn_div64      PROC FAR
-       push    bp
-       mov     bp,sp
-       mov     edx, DWORD PTR [bp+6]
-       mov     eax, DWORD PTR [bp+10]
-       div     DWORD PTR [bp+14]
-       mov     edx,eax
-       shr     edx,16
-       pop     bp
-       ret     
-_bn_div64      ENDP
-
-       PUBLIC  _bn_add_words
-_bn_add_words  PROC FAR
-; Line 58
-       push    bp
-       push    bx
-       push    esi
-       push    di
-       push    ds
-       push    es
-       mov     bp,sp
-;      w = 28
-;      num = 26
-;      ap = 22
-;      rp = 18
-       xor     esi,esi                 ;c=0;
-       mov     bx,WORD PTR [bp+18]     ; load low r
-       mov     si,WORD PTR [bp+22]     ; load a
-       mov     es,WORD PTR [bp+24]     ; load a
-       mov     di,WORD PTR [bp+26]     ; load b
-       mov     ds,WORD PTR [bp+28]     ; load b
-
-       mov     dx,WORD PTR [bp+30]     ; load num
-       xor     ecx,ecx
-       dec     dx
-       js      $L547a
-
-$L5477:
-       mov     eax,DWORD PTR es:[si]   ; *a
-       add     eax,ecx
-       mov     ecx,0
-       adc     ecx,0
-       add     si,4                    ; a++
-       add     eax,DWORD PTR ds:[di]   ; + *b
-       adc     ecx,0
-       mov     ds,WORD PTR [bp+20]
-       add     di,4
-       mov     DWORD PTR ds:[bx],eax
-       mov     ds,WORD PTR [bp+28]
-       add     bx,4
-       dec     dx
-       js      $L547a                  ; Note that we are now testing for -1
-       jmp     $L5477
-       ;
-$L547a:
-       mov     eax,ecx
-       mov     edx,ecx
-       shr     edx,16
-       pop     es
-       pop     ds
-       pop     di
-       pop     esi
-       pop     bx
-       pop     bp
-       ret     
-       nop     
-_bn_add_words  ENDP
-F_TEXT ENDS
-END
index d882261..009b0eb 100644 (file)
@@ -89,7 +89,7 @@ extern "C" {
  * For machines with only one compiler (or shared libraries), this should
  * be on.  Again this in only really a problem on machines
  * using "long long's", are 32bit, and are not using my assembler code. */
-#if defined(MSDOS) || defined(WINDOWS) || defined(linux)
+#if defined(MSDOS) || defined(WINDOWS) || defined(WIN32) || defined(linux)
 #define BN_DIV2W
 #endif
 
index f3b9497..988270b 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index 7bb0b91..598fecb 100644 (file)
@@ -73,6 +73,7 @@ int BN_mod_mul_montgomery(BIGNUM *r, BIGNUM *a, BIGNUM *b,
                          BN_MONT_CTX *mont, BN_CTX *ctx)
        {
        BIGNUM *tmp,*tmp2;
+       int ret=0;
 
        BN_CTX_start(ctx);
        tmp = BN_CTX_get(ctx);
@@ -101,10 +102,10 @@ int BN_mod_mul_montgomery(BIGNUM *r, BIGNUM *a, BIGNUM *b,
                }
        /* reduce from aRR to aR */
        if (!BN_from_montgomery(r,tmp,mont,ctx)) goto err;
-       BN_CTX_end(ctx);
-       return(1);
+       ret=1;
 err:
-       return(0);
+       BN_CTX_end(ctx);
+       return(ret);
        }
 
 int BN_from_montgomery(BIGNUM *ret, BIGNUM *a, BN_MONT_CTX *mont,
index eb007e1..3e8baaa 100644 (file)
@@ -61,6 +61,9 @@
 #include "bn_lcl.h"
 
 #ifdef BN_RECURSION
+/* Karatsuba recursive multiplication algorithm
+ * (cf. Knuth, The Art of Computer Programming, Vol. 2) */
+
 /* r is 2*n2 words in size,
  * a and b are both n2 words in size.
  * n2 must be a power of 2.
index 41c22f5..0a97af6 100644 (file)
@@ -234,7 +234,8 @@ int main(int argc, char *argv[])
 /**/
        exit(0);
 err:
-       BIO_puts(out,"1\n"); /* make sure bc fails if we are piping to it */
+       BIO_puts(out,"1\n"); /* make sure the Perl script fed by bc notices
+                             * the failure, see test_bn in test/Makefile.ssl*/
        BIO_flush(out);
        ERR_load_crypto_strings();
        ERR_print_errors_fp(stderr);
index 7f9fd1f..2f971a5 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index 763148e..4c70d1e 100644 (file)
@@ -52,7 +52,7 @@ lib:  $(LIBOBJ)
 
 # elf
 asm/cx86-elf.o: asm/cx86unix.cpp
-       $(CPP) -DELF asm/cx86unix.cpp | as -o asm/cx86-elf.o
+       $(CPP) -DELF -x c asm/cx86unix.cpp | as -o asm/cx86-elf.o
 
 # solaris
 asm/cx86-sol.o: asm/cx86unix.cpp
@@ -68,7 +68,7 @@ asm/cx86-out.o: asm/cx86unix.cpp
 asm/cx86bsdi.o: asm/cx86unix.cpp
        $(CPP) -DBSDI asm/cx86unix.cpp | sed 's/ :/:/' | as -o asm/cx86bsdi.o
 
-asm/cx86unix.cpp: asm/cast-586.pl
+asm/cx86unix.cpp: asm/cast-586.pl ../perlasm/x86asm.pl ../perlasm/cbc.pl
        (cd asm; $(PERL) cast-586.pl cpp $(PROCESSOR) >cx86unix.cpp)
 
 files:
index a587089..e69de29 100644 (file)
@@ -1,124 +0,0 @@
-# Targets
-# make          - twidle the options yourself :-)
-# make cc       - standard cc options
-# make gcc      - standard gcc options
-# make x86-elf  - linux-elf etc
-# make x86-out  - linux-a.out, FreeBSD etc
-# make x86-solaris
-# make x86-bdsi
-
-# There are 3 possible performance options, experiment :-)
-#OPTS= -DBF_PTR
-#OPTS= -DBF_PTR2
-OPTS=
-
-DIR=    cast
-TOP=    .
-CC=     gcc
-CFLAG= -O3 -fomit-frame-pointer
-
-CPP=    $(CC) -E
-INCLUDES=
-INSTALLTOP=/usr/local/lib
-MAKE=           make
-MAKEDEPEND=     makedepend
-MAKEFILE=       Makefile.uni
-AR=             ar r
-RANLIB=         ranlib
-
-CAST_ENC=c_enc.o
-# or use
-#CAST_ENC=asm/cx86-elf.o
-#CAST_ENC=asm/cx86-out.o
-#CAST_ENC=asm/cx86-sol.o
-#CAST_ENC=asm/cx86bdsi.o
-
-CFLAGS= $(OPTS) $(INCLUDES) $(CFLAG) -DFULL_TEST
-
-GENERAL=Makefile
-TEST=casttest
-APP1=cast_spd
-APP2=castopts
-APPS=$(APP1) $(APP2)
-
-LIB=libcast.a
-LIBSRC=c_skey.c c_ecb.c c_enc.c c_cfb64.c c_ofb64.c
-LIBOBJ=c_skey.o c_ecb.o $(CAST_ENC) c_cfb64.o c_ofb64.o
-
-SRC= $(LIBSRC)
-
-EXHEADER= cast.h
-HEADER= cast_lcl.h $(EXHEADER)
-
-ALL=    $(GENERAL) $(SRC) $(HEADER)
-
-all:    $(LIB) $(TEST) $(APPS)
-
-$(LIB):    $(LIBOBJ)
-       $(AR) $(LIB) $(LIBOBJ)
-       $(RANLIB) $(LIB)
-# elf
-asm/cx86-elf.o: asm/cx86unix.cpp
-       $(CPP) -DELF asm/cx86unix.cpp | as -o asm/cx86-elf.o
-
-# solaris
-asm/cx86-sol.o: asm/cx86unix.cpp
-       $(CC) -E -DSOL asm/cx86unix.cpp | sed 's/^#.*//' > asm/cx86-sol.s
-       as -o asm/cx86-sol.o asm/cx86-sol.s
-       rm -f asm/cx86-sol.s
-
-# a.out
-asm/cx86-out.o: asm/cx86unix.cpp
-       $(CPP) -DOUT asm/cx86unix.cpp | as -o asm/cx86-out.o
-
-# bsdi
-asm/cx86bsdi.o: asm/cx86unix.cpp
-       $(CPP) -DBSDI asm/cx86unix.cpp | as -o asm/cx86bsdi.o
-
-asm/cx86unix.cpp:
-       (cd asm; perl cast-586.pl cpp >cx86unix.cpp)
-
-test:  $(TEST)
-       ./$(TEST)
-
-$(TEST): $(TEST).c $(LIB)
-       $(CC) -o $(TEST) $(CFLAGS) $(TEST).c $(LIB)
-
-$(APP1): $(APP1).c $(LIB)
-       $(CC) -o $(APP1) $(CFLAGS) $(APP1).c $(LIB)
-
-$(APP2): $(APP2).c $(LIB)
-       $(CC) -o $(APP2) $(CFLAGS) $(APP2).c $(LIB)
-
-lint:
-       lint -DLINT $(INCLUDES) $(SRC)>fluff
-
-depend:
-       $(MAKEDEPEND) $(INCLUDES) $(PROGS) $(LIBSRC)
-
-dclean:
-       perl -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) >Makefile.new
-       mv -f Makefile.new $(MAKEFILE)
-
-clean:
-       /bin/rm -f $(LIB) $(TEST) $(APPS) *.o asm/*.o *.obj lib tags core .pure .nfs* *.old *.bak fluff
-
-cc:
-       $(MAKE) CC="cc" CFLAG="-O" all
-
-gcc:
-       $(MAKE) CC="gcc" CFLAGS="-O3 -fomit-frame-pointer" all
-
-x86-elf:
-       $(MAKE) CAST_ENC="asm/cx86-elf.o" CFLAG="-DELF $(CFLAGS)" all
-
-x86-out:
-       $(MAKE) CAST_ENC="asm/cx86-out.o" CFLAG="-DOUT $(CFLAGS)" all
-
-x86-solaris:
-       $(MAKE) CAST_ENC="asm/cx86-sol.o" CFLAG="-DSOL $(CFLAGS)" all
-
-x86-bdsi:
-       $(MAKE) CAST_ENC="asm/cx86-bdsi.o" CFLAG="-DBDSI $(CFLAGS)" all
-
-# DO NOT DELETE THIS LINE -- make depend depends on it.
index ba78a3c..e69de29 100644 (file)
@@ -1,953 +0,0 @@
-       ; Don't even think of reading this code
-       ; It was automatically generated by cast-586.pl
-       ; Which is a perl program used to generate the x86 assember for
-       ; any of elf, a.out, BSDI,Win32, or Solaris
-       ; eric <eay@cryptsoft.com>
-       ; 
-       TITLE   cast-586.asm
-        .486
-.model FLAT
-_TEXT  SEGMENT
-PUBLIC _CAST_encrypt
-EXTERN _CAST_S_table0:DWORD
-EXTERN _CAST_S_table1:DWORD
-EXTERN _CAST_S_table2:DWORD
-EXTERN _CAST_S_table3:DWORD
-
-_CAST_encrypt PROC NEAR
-       ; 
-       push    ebp
-       push    ebx
-       mov     ebx,            DWORD PTR 12[esp]
-       mov     ebp,            DWORD PTR 16[esp]
-       push    esi
-       push    edi
-       ; Load the 2 words
-       mov     edi,            DWORD PTR [ebx]
-       mov     esi,            DWORD PTR 4[ebx]
-       ; Get short key flag
-       mov     eax,            DWORD PTR 128[ebp]
-       push    eax
-       xor     eax,            eax
-       ; round 0
-       mov     edx,            DWORD PTR [ebp]
-       mov     ecx,            DWORD PTR 4[ebp]
-       add     edx,            esi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       add     ecx,            ebx
-       xor     edi,            ecx
-       ; round 1
-       mov     edx,            DWORD PTR 8[ebp]
-       mov     ecx,            DWORD PTR 12[ebp]
-       xor     edx,            edi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       xor     ecx,            ebx
-       xor     esi,            ecx
-       ; round 2
-       mov     edx,            DWORD PTR 16[ebp]
-       mov     ecx,            DWORD PTR 20[ebp]
-       sub     edx,            esi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       sub     ecx,            ebx
-       xor     edi,            ecx
-       ; round 3
-       mov     edx,            DWORD PTR 24[ebp]
-       mov     ecx,            DWORD PTR 28[ebp]
-       add     edx,            edi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       add     ecx,            ebx
-       xor     esi,            ecx
-       ; round 4
-       mov     edx,            DWORD PTR 32[ebp]
-       mov     ecx,            DWORD PTR 36[ebp]
-       xor     edx,            esi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       xor     ecx,            ebx
-       xor     edi,            ecx
-       ; round 5
-       mov     edx,            DWORD PTR 40[ebp]
-       mov     ecx,            DWORD PTR 44[ebp]
-       sub     edx,            edi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       sub     ecx,            ebx
-       xor     esi,            ecx
-       ; round 6
-       mov     edx,            DWORD PTR 48[ebp]
-       mov     ecx,            DWORD PTR 52[ebp]
-       add     edx,            esi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       add     ecx,            ebx
-       xor     edi,            ecx
-       ; round 7
-       mov     edx,            DWORD PTR 56[ebp]
-       mov     ecx,            DWORD PTR 60[ebp]
-       xor     edx,            edi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       xor     ecx,            ebx
-       xor     esi,            ecx
-       ; round 8
-       mov     edx,            DWORD PTR 64[ebp]
-       mov     ecx,            DWORD PTR 68[ebp]
-       sub     edx,            esi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       sub     ecx,            ebx
-       xor     edi,            ecx
-       ; round 9
-       mov     edx,            DWORD PTR 72[ebp]
-       mov     ecx,            DWORD PTR 76[ebp]
-       add     edx,            edi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       add     ecx,            ebx
-       xor     esi,            ecx
-       ; round 10
-       mov     edx,            DWORD PTR 80[ebp]
-       mov     ecx,            DWORD PTR 84[ebp]
-       xor     edx,            esi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       xor     ecx,            ebx
-       xor     edi,            ecx
-       ; round 11
-       mov     edx,            DWORD PTR 88[ebp]
-       mov     ecx,            DWORD PTR 92[ebp]
-       sub     edx,            edi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       sub     ecx,            ebx
-       xor     esi,            ecx
-       ; test short key flag
-       pop     edx
-       or      edx,            edx
-       jnz     $L000cast_enc_done
-       ; round 12
-       mov     edx,            DWORD PTR 96[ebp]
-       mov     ecx,            DWORD PTR 100[ebp]
-       add     edx,            esi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       add     ecx,            ebx
-       xor     edi,            ecx
-       ; round 13
-       mov     edx,            DWORD PTR 104[ebp]
-       mov     ecx,            DWORD PTR 108[ebp]
-       xor     edx,            edi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       xor     ecx,            ebx
-       xor     esi,            ecx
-       ; round 14
-       mov     edx,            DWORD PTR 112[ebp]
-       mov     ecx,            DWORD PTR 116[ebp]
-       sub     edx,            esi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       sub     ecx,            ebx
-       xor     edi,            ecx
-       ; round 15
-       mov     edx,            DWORD PTR 120[ebp]
-       mov     ecx,            DWORD PTR 124[ebp]
-       add     edx,            edi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       add     ecx,            ebx
-       xor     esi,            ecx
-$L000cast_enc_done:
-       nop
-       mov     eax,            DWORD PTR 20[esp]
-       mov     DWORD PTR 4[eax],edi
-       mov     DWORD PTR [eax],esi
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-_CAST_encrypt ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _CAST_decrypt
-EXTERN _CAST_S_table0:DWORD
-EXTERN _CAST_S_table1:DWORD
-EXTERN _CAST_S_table2:DWORD
-EXTERN _CAST_S_table3:DWORD
-
-_CAST_decrypt PROC NEAR
-       ; 
-       push    ebp
-       push    ebx
-       mov     ebx,            DWORD PTR 12[esp]
-       mov     ebp,            DWORD PTR 16[esp]
-       push    esi
-       push    edi
-       ; Load the 2 words
-       mov     edi,            DWORD PTR [ebx]
-       mov     esi,            DWORD PTR 4[ebx]
-       ; Get short key flag
-       mov     eax,            DWORD PTR 128[ebp]
-       or      eax,            eax
-       jnz     $L001cast_dec_skip
-       xor     eax,            eax
-       ; round 15
-       mov     edx,            DWORD PTR 120[ebp]
-       mov     ecx,            DWORD PTR 124[ebp]
-       add     edx,            esi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       add     ecx,            ebx
-       xor     edi,            ecx
-       ; round 14
-       mov     edx,            DWORD PTR 112[ebp]
-       mov     ecx,            DWORD PTR 116[ebp]
-       sub     edx,            edi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       sub     ecx,            ebx
-       xor     esi,            ecx
-       ; round 13
-       mov     edx,            DWORD PTR 104[ebp]
-       mov     ecx,            DWORD PTR 108[ebp]
-       xor     edx,            esi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       xor     ecx,            ebx
-       xor     edi,            ecx
-       ; round 12
-       mov     edx,            DWORD PTR 96[ebp]
-       mov     ecx,            DWORD PTR 100[ebp]
-       add     edx,            edi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       add     ecx,            ebx
-       xor     esi,            ecx
-$L001cast_dec_skip:
-       ; round 11
-       mov     edx,            DWORD PTR 88[ebp]
-       mov     ecx,            DWORD PTR 92[ebp]
-       sub     edx,            esi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       sub     ecx,            ebx
-       xor     edi,            ecx
-       ; round 10
-       mov     edx,            DWORD PTR 80[ebp]
-       mov     ecx,            DWORD PTR 84[ebp]
-       xor     edx,            edi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       xor     ecx,            ebx
-       xor     esi,            ecx
-       ; round 9
-       mov     edx,            DWORD PTR 72[ebp]
-       mov     ecx,            DWORD PTR 76[ebp]
-       add     edx,            esi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       add     ecx,            ebx
-       xor     edi,            ecx
-       ; round 8
-       mov     edx,            DWORD PTR 64[ebp]
-       mov     ecx,            DWORD PTR 68[ebp]
-       sub     edx,            edi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       sub     ecx,            ebx
-       xor     esi,            ecx
-       ; round 7
-       mov     edx,            DWORD PTR 56[ebp]
-       mov     ecx,            DWORD PTR 60[ebp]
-       xor     edx,            esi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       xor     ecx,            ebx
-       xor     edi,            ecx
-       ; round 6
-       mov     edx,            DWORD PTR 48[ebp]
-       mov     ecx,            DWORD PTR 52[ebp]
-       add     edx,            edi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       add     ecx,            ebx
-       xor     esi,            ecx
-       ; round 5
-       mov     edx,            DWORD PTR 40[ebp]
-       mov     ecx,            DWORD PTR 44[ebp]
-       sub     edx,            esi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       sub     ecx,            ebx
-       xor     edi,            ecx
-       ; round 4
-       mov     edx,            DWORD PTR 32[ebp]
-       mov     ecx,            DWORD PTR 36[ebp]
-       xor     edx,            edi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       xor     ecx,            ebx
-       xor     esi,            ecx
-       ; round 3
-       mov     edx,            DWORD PTR 24[ebp]
-       mov     ecx,            DWORD PTR 28[ebp]
-       add     edx,            esi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       add     ecx,            ebx
-       xor     edi,            ecx
-       ; round 2
-       mov     edx,            DWORD PTR 16[ebp]
-       mov     ecx,            DWORD PTR 20[ebp]
-       sub     edx,            edi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       sub     ecx,            ebx
-       xor     esi,            ecx
-       ; round 1
-       mov     edx,            DWORD PTR 8[ebp]
-       mov     ecx,            DWORD PTR 12[ebp]
-       xor     edx,            esi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       xor     ecx,            ebx
-       xor     edi,            ecx
-       ; round 0
-       mov     edx,            DWORD PTR [ebp]
-       mov     ecx,            DWORD PTR 4[ebp]
-       add     edx,            edi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       add     ecx,            ebx
-       xor     esi,            ecx
-       nop
-       mov     eax,            DWORD PTR 20[esp]
-       mov     DWORD PTR 4[eax],edi
-       mov     DWORD PTR [eax],esi
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-_CAST_decrypt ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _CAST_cbc_encrypt
-
-_CAST_cbc_encrypt PROC NEAR
-       ; 
-       push    ebp
-       push    ebx
-       push    esi
-       push    edi
-       mov     ebp,            DWORD PTR 28[esp]
-       ; getting iv ptr from parameter 4
-       mov     ebx,            DWORD PTR 36[esp]
-       mov     esi,            DWORD PTR [ebx]
-       mov     edi,            DWORD PTR 4[ebx]
-       push    edi
-       push    esi
-       push    edi
-       push    esi
-       mov     ebx,            esp
-       mov     esi,            DWORD PTR 36[esp]
-       mov     edi,            DWORD PTR 40[esp]
-       ; getting encrypt flag from parameter 5
-       mov     ecx,            DWORD PTR 56[esp]
-       ; get and push parameter 3
-       mov     eax,            DWORD PTR 48[esp]
-       push    eax
-       push    ebx
-       cmp     ecx,            0
-       jz      $L002decrypt
-       and     ebp,            4294967288
-       mov     eax,            DWORD PTR 8[esp]
-       mov     ebx,            DWORD PTR 12[esp]
-       jz      $L003encrypt_finish
-L004encrypt_loop:
-       mov     ecx,            DWORD PTR [esi]
-       mov     edx,            DWORD PTR 4[esi]
-       xor     eax,            ecx
-       xor     ebx,            edx
-       bswap   eax
-       bswap   ebx
-       mov     DWORD PTR 8[esp],eax
-       mov     DWORD PTR 12[esp],ebx
-       call    _CAST_encrypt
-       mov     eax,            DWORD PTR 8[esp]
-       mov     ebx,            DWORD PTR 12[esp]
-       bswap   eax
-       bswap   ebx
-       mov     DWORD PTR [edi],eax
-       mov     DWORD PTR 4[edi],ebx
-       add     esi,            8
-       add     edi,            8
-       sub     ebp,            8
-       jnz     L004encrypt_loop
-$L003encrypt_finish:
-       mov     ebp,            DWORD PTR 52[esp]
-       and     ebp,            7
-       jz      $L005finish
-       xor     ecx,            ecx
-       xor     edx,            edx
-       mov     ebp,            DWORD PTR $L006cbc_enc_jmp_table[ebp*4]
-       jmp      ebp
-L007ej7:
-       xor     edx,            edx
-       mov     dh,             BYTE PTR 6[esi]
-       shl     edx,            8
-L008ej6:
-       mov     dh,             BYTE PTR 5[esi]
-L009ej5:
-       mov     dl,             BYTE PTR 4[esi]
-L010ej4:
-       mov     ecx,            DWORD PTR [esi]
-       jmp     $L011ejend
-L012ej3:
-       mov     ch,             BYTE PTR 2[esi]
-       xor     ecx,            ecx
-       shl     ecx,            8
-L013ej2:
-       mov     ch,             BYTE PTR 1[esi]
-L014ej1:
-       mov     cl,             BYTE PTR [esi]
-$L011ejend:
-       xor     eax,            ecx
-       xor     ebx,            edx
-       bswap   eax
-       bswap   ebx
-       mov     DWORD PTR 8[esp],eax
-       mov     DWORD PTR 12[esp],ebx
-       call    _CAST_encrypt
-       mov     eax,            DWORD PTR 8[esp]
-       mov     ebx,            DWORD PTR 12[esp]
-       bswap   eax
-       bswap   ebx
-       mov     DWORD PTR [edi],eax
-       mov     DWORD PTR 4[edi],ebx
-       jmp     $L005finish
-$L002decrypt:
-       and     ebp,            4294967288
-       mov     eax,            DWORD PTR 16[esp]
-       mov     ebx,            DWORD PTR 20[esp]
-       jz      $L015decrypt_finish
-L016decrypt_loop:
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-       bswap   eax
-       bswap   ebx
-       mov     DWORD PTR 8[esp],eax
-       mov     DWORD PTR 12[esp],ebx
-       call    _CAST_decrypt
-       mov     eax,            DWORD PTR 8[esp]
-       mov     ebx,            DWORD PTR 12[esp]
-       bswap   eax
-       bswap   ebx
-       mov     ecx,            DWORD PTR 16[esp]
-       mov     edx,            DWORD PTR 20[esp]
-       xor     ecx,            eax
-       xor     edx,            ebx
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-       mov     DWORD PTR [edi],ecx
-       mov     DWORD PTR 4[edi],edx
-       mov     DWORD PTR 16[esp],eax
-       mov     DWORD PTR 20[esp],ebx
-       add     esi,            8
-       add     edi,            8
-       sub     ebp,            8
-       jnz     L016decrypt_loop
-$L015decrypt_finish:
-       mov     ebp,            DWORD PTR 52[esp]
-       and     ebp,            7
-       jz      $L005finish
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-       bswap   eax
-       bswap   ebx
-       mov     DWORD PTR 8[esp],eax
-       mov     DWORD PTR 12[esp],ebx
-       call    _CAST_decrypt
-       mov     eax,            DWORD PTR 8[esp]
-       mov     ebx,            DWORD PTR 12[esp]
-       bswap   eax
-       bswap   ebx
-       mov     ecx,            DWORD PTR 16[esp]
-       mov     edx,            DWORD PTR 20[esp]
-       xor     ecx,            eax
-       xor     edx,            ebx
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-L017dj7:
-       ror     edx,            16
-       mov     BYTE PTR 6[edi],dl
-       shr     edx,            16
-L018dj6:
-       mov     BYTE PTR 5[edi],dh
-L019dj5:
-       mov     BYTE PTR 4[edi],dl
-L020dj4:
-       mov     DWORD PTR [edi],ecx
-       jmp     $L021djend
-L022dj3:
-       ror     ecx,            16
-       mov     BYTE PTR 2[edi],cl
-       shl     ecx,            16
-L023dj2:
-       mov     BYTE PTR 1[esi],ch
-L024dj1:
-       mov     BYTE PTR [esi], cl
-$L021djend:
-       jmp     $L005finish
-$L005finish:
-       mov     ecx,            DWORD PTR 60[esp]
-       add     esp,            24
-       mov     DWORD PTR [ecx],eax
-       mov     DWORD PTR 4[ecx],ebx
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-$L006cbc_enc_jmp_table:
-       DD      0
-       DD      L014ej1
-       DD      L013ej2
-       DD      L012ej3
-       DD      L010ej4
-       DD      L009ej5
-       DD      L008ej6
-       DD      L007ej7
-L025cbc_dec_jmp_table:
-       DD      0
-       DD      L024dj1
-       DD      L023dj2
-       DD      L022dj3
-       DD      L020dj4
-       DD      L019dj5
-       DD      L018dj6
-       DD      L017dj7
-_CAST_cbc_encrypt ENDP
-_TEXT  ENDS
-END
index cfe3842..5fab8a4 100644 (file)
                          *((c)++)=(unsigned char)(((l)>> 8L)&0xff), \
                          *((c)++)=(unsigned char)(((l)     )&0xff))
 
-#if defined(WIN32)
+#if defined(WIN32) && defined(_MSC_VER)
 #define ROTL(a,n)     (_lrotl(a,n))
 #else
 #define ROTL(a,n)     ((((a)<<(n))&0xffffffffL)|((a)>>(32-(n))))
index 77a3f70..c10282a 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index eb4b3cf..5c1ca59 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index c2a2dd4..dadd8d8 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index 79d8677..8ddeafb 100644 (file)
@@ -186,7 +186,7 @@ $ LIB_DES = "set_key,ecb_enc,cbc_enc,"+ -
        "enc_read,enc_writ,ofb64enc,"+ -
        "ofb_enc,str2key,pcbc_enc,qud_cksm,rand_key,"+ -
        "des_enc,fcrypt_b,read2pwd,"+ -
-       "fcrypt,xcbc_enc,read_pwd,rpc_enc,cbc_cksm,supp,ede_cbcm_enc"
+       "fcrypt,xcbc_enc,read_pwd,rpc_enc,cbc_cksm,ede_cbcm_enc"
 $ LIB_RC2 = "rc2_ecb,rc2_skey,rc2_cbc,rc2cfb64,rc2ofb64"
 $ LIB_RC4 = "rc4_skey,rc4_enc"
 $ LIB_RC5 = "rc5_skey,rc5_ecb,rc5_enc,rc5cfb64,rc5ofb64"
@@ -208,7 +208,7 @@ $ LIB_BIO = "bio_lib,bio_cb,bio_err,"+ -
        "bss_mem,bss_null,bss_fd,"+ -
        "bss_file,bss_sock,bss_conn,"+ -
        "bf_null,bf_buff,b_print,b_dump,"+ -
-       "b_sock,bss_acpt,bf_nbio,bss_rtcp,bss_bio" ! + ",bss_log" for syslog
+       "b_sock,bss_acpt,bf_nbio,bss_rtcp,bss_bio,bss_log"
 $ LIB_STACK = "stack"
 $ LIB_LHASH = "lhash,lh_stats"
 $ LIB_RAND = "md_rand,randfile,rand_lib,rand_err,rand_egd"
@@ -266,7 +266,7 @@ $!
 $! Setup exceptional compilations
 $!
 $ COMPILEWITH_CC3 = ",bss_rtcp,"
-$ COMPILEWITH_CC4 = ",a_utctm,"
+$ COMPILEWITH_CC4 = ",a_utctm,bss_log,"
 $ COMPILEWITH_CC5 = ",md2_dgst,md5_dgst,mdc2dgst,sha_dgst,sha1dgst," + -
                     "rmd_dgst,bf_enc,"
 $!
@@ -1441,6 +1441,7 @@ $!
 $ IF P7 .NES. ""
 $ THEN
 $   ENCRYPT_TYPES = P7
+$! NYI:   ENCRYPT_PROGRAMS = P7
 $ ENDIF
 $!
 $!  Time To RETURN...
index 8a739e7..e69de29 100644 (file)
@@ -1,16 +0,0 @@
-crypt  <=      crypt(buf,salt)
-key    <=      set_odd_parity(key)
-int    <=      is_weak_key(key)
-keysched<=     set_key(key)
-key    <=      ecb_encrypt(string8,ks,enc)
-key    <=      ecb3_encrypt(input,ks1,ks2,enc)
-string <=      cbc_encrypt(input,ks,ivec,enc)                  => ivec 
-string <=      cbc3_encrypt(input,ks1,ks2,ivec1,ivec2,enc)     => ivec1&ivec2 
-ck1,ck2        <=      cbc_cksum(input,ks,ivec)                        => ivec
-string <=      pcbc_encrypt(input,ks,ivec,enc)                 => ivec 
-string <=      ofb_encrypt(input,numbits,ks,ivec)              => ivec
-string <=      cfb_encrypt(input,numbits,ks,ivec,enc)          => ivec
-key    <=      random_key()
-key    <=      string_to_key(string)
-key1,key2<=    string_to_2keys(string)
-
index 0cbc44f..e69de29 100644 (file)
@@ -1,84 +0,0 @@
-Modes of DES
-Quite a bit of the following information has been taken from
-       AS 2805.5.2
-       Australian Standard
-       Electronic funds transfer - Requirements for interfaces,
-       Part 5.2: Modes of operation for an n-bit block cipher algorithm
-       Appendix A
-
-There are several different modes in which DES can be used, they are
-as follows.
-
-Electronic Codebook Mode (ECB) (des_ecb_encrypt())
-- 64 bits are enciphered at a time.
-- The order of the blocks can be rearranged without detection.
-- The same plaintext block always produces the same ciphertext block
-  (for the same key) making it vulnerable to a 'dictionary attack'.
-- An error will only affect one ciphertext block.
-
-Cipher Block Chaining Mode (CBC) (des_cbc_encrypt())
-- a multiple of 64 bits are enciphered at a time.
-- The CBC mode produces the same ciphertext whenever the same
-  plaintext is encrypted using the same key and starting variable.
-- The chaining operation makes the ciphertext blocks dependent on the
-  current and all preceding plaintext blocks and therefore blocks can not
-  be rearranged.
-- The use of different starting variables prevents the same plaintext
-  enciphering to the same ciphertext.
-- An error will affect the current and the following ciphertext blocks.
-
-Cipher Feedback Mode (CFB) (des_cfb_encrypt())
-- a number of bits (j) <= 64 are enciphered at a time.
-- The CFB mode produces the same ciphertext whenever the same
-  plaintext is encrypted using the same key and starting variable.
-- The chaining operation makes the ciphertext variables dependent on the
-  current and all preceding variables and therefore j-bit variables are
-  chained together and con not be rearranged.
-- The use of different starting variables prevents the same plaintext
-  enciphering to the same ciphertext.
-- The strength of the CFB mode depends on the size of k (maximal if
-  j == k).  In my implementation this is always the case.
-- Selection of a small value for j will require more cycles through
-  the encipherment algorithm per unit of plaintext and thus cause
-  greater processing overheads.
-- Only multiples of j bits can be enciphered.
-- An error will affect the current and the following ciphertext variables.
-
-Output Feedback Mode (OFB) (des_ofb_encrypt())
-- a number of bits (j) <= 64 are enciphered at a time.
-- The OFB mode produces the same ciphertext whenever the same
-  plaintext enciphered using the same key and starting variable.  More
-  over, in the OFB mode the same key stream is produced when the same
-  key and start variable are used.  Consequently, for security reasons
-  a specific start variable should be used only once for a given key.
-- The absence of chaining makes the OFB more vulnerable to specific attacks.
-- The use of different start variables values prevents the same
-  plaintext enciphering to the same ciphertext, by producing different
-  key streams.
-- Selection of a small value for j will require more cycles through
-  the encipherment algorithm per unit of plaintext and thus cause
-  greater processing overheads.
-- Only multiples of j bits can be enciphered.
-- OFB mode of operation does not extend ciphertext errors in the
-  resultant plaintext output.  Every bit error in the ciphertext causes
-  only one bit to be in error in the deciphered plaintext.
-- OFB mode is not self-synchronising.  If the two operation of
-  encipherment and decipherment get out of synchronism, the system needs
-  to be re-initialised.
-- Each re-initialisation should use a value of the start variable
-different from the start variable values used before with the same
-key.  The reason for this is that an identical bit stream would be
-produced each time from the same parameters.  This would be
-susceptible to a 'known plaintext' attack.
-
-Triple ECB Mode (des_ecb3_encrypt())
-- Encrypt with key1, decrypt with key2 and encrypt with key1 again.
-- As for ECB encryption but increases the effective key length to 112 bits.
-- If both keys are the same it is equivalent to encrypting once with
-  just one key.
-
-Triple CBC Mode (des_3cbc_encrypt())
-- Encrypt with key1, decrypt with key2 and encrypt with key1 again.
-- As for CBC encryption but increases the effective key length to 112 bits.
-- If both keys are the same it is equivalent to encrypting once with
-  just one key.
index b54a243..e69de29 100644 (file)
@@ -1,14 +0,0 @@
-use ExtUtils::MakeMaker;
-# See lib/ExtUtils/MakeMaker.pm for details of how to influence
-# the contents of the Makefile being created.
-&writeMakefile(
-       'potential_libs' => '',   # e.g., '-lm' 
-       'INC' => '',     # e.g., '-I/usr/include/other' 
-       'DISTNAME' => 'DES',
-       'VERSION' => '0.1',
-       'DEFINE' => '-DPERL5',
-       'OBJECT' => 'DES.o cbc_cksm.o cbc_enc.o ecb_enc.o pcbc_enc.o \
-       rand_key.o set_key.o str2key.o \
-       enc_read.o enc_writ.o fcrypt.o cfb_enc.o \
-       ecb3_enc.o ofb_enc.o cbc3_enc.o des_enc.o',
-       );
index c09f696..e69de29 100644 (file)
@@ -1,250 +0,0 @@
-# You must select the correct terminal control system to be used to
-# turn character echo off when reading passwords.  There a 5 systems
-# SGTTY   - the old BSD system
-# TERMIO  - most system V boxes
-# TERMIOS - SGI (ala IRIX).
-# VMS     - the DEC operating system
-# MSDOS   - we all know what it is :-)
-# read_pwd.c makes a reasonable guess at what is correct.
-
-# Targets
-# make          - twidle the options yourself :-)
-# make cc       - standard cc options
-# make gcc      - standard gcc options
-# make x86-elf  - linux-elf etc
-# make x86-out  - linux-a.out, FreeBSD etc
-# make x86-solaris
-# make x86-bdsi
-
-# If you are on a DEC Alpha, edit des.h and change the DES_LONG
-# define to 'unsigned int'.  I have seen this give a %20 speedup.
-
-OPTS0= -DLIBDES_LIT -DRAND -DTERMIO #-DNOCONST
-
-# Version 1.94 has changed the strings_to_key function so that it is
-# now compatible with MITs when the string is longer than 8 characters.
-# If you wish to keep the old version, uncomment the following line.
-# This will affect the -E/-D options on des(1).
-#OPTS1= -DOLD_STR_TO_KEY
-
-# There are 4 possible performance options
-# -DDES_PTR
-# -DDES_RISC1
-# -DDES_RISC2 (only one of DES_RISC1 and DES_RISC2)
-# -DDES_UNROLL
-# after the initial build, run 'des_opts' to see which options are best
-# for your platform.  There are some listed in options.txt
-#OPTS2= -DDES_PTR 
-#OPTS3= -DDES_RISC1 # or DES_RISC2
-#OPTS4= -DDES_UNROLL
-
-OPTS= $(OPTS0) $(OPTS1) $(OPTS2) $(OPTS3) $(OPTS4)
-
-MAKE=make -f Makefile
-#CC=cc
-#CFLAG= -O
-
-CC=gcc
-#CFLAG= -O4 -funroll-loops -fomit-frame-pointer
-CFLAG= -O3 -fomit-frame-pointer
-
-CFLAGS=$(OPTS) $(CFLAG)
-CPP=$(CC) -E
-AS=as
-
-# Assember version of des_encrypt*().
-DES_ENC=des_enc.o fcrypt_b.o           # normal C version
-#DES_ENC=asm/dx86-elf.o        asm/yx86-elf.o  # elf format x86
-#DES_ENC=asm/dx86-out.o        asm/yx86-out.o  # a.out format x86
-#DES_ENC=asm/dx86-sol.o        asm/yx86-sol.o  # solaris format x86 
-#DES_ENC=asm/dx86bsdi.o        asm/yx86basi.o  # bsdi format x86 
-
-LIBDIR=/usr/local/lib
-BINDIR=/usr/local/bin
-INCDIR=/usr/local/include
-MANDIR=/usr/local/man
-MAN1=1
-MAN3=3
-SHELL=/bin/sh
-OBJ_LIT=cbc_enc.o ecb_enc.o $(DES_ENC) fcrypt.o set_key.o
-OBJ_FULL=cbc_cksm.o $(OBJ_LIT) pcbc_enc.o \
-       xcbc_enc.o qud_cksm.o \
-       cfb64ede.o cfb64enc.o cfb_enc.o ecb3_enc.o \
-       enc_read.o enc_writ.o ofb64ede.o ofb64enc.o ofb_enc.o  \
-       rand_key.o read_pwd.o read2pwd.o rpc_enc.o  str2key.o supp.o
-
-GENERAL_LIT=COPYRIGHT INSTALL README VERSION Makefile des_crypt.man \
-       des.doc options.txt asm
-GENERAL_FULL=$(GENERAL_LIT) FILES Imakefile times vms.com KERBEROS MODES.DES \
-       des.man DES.pm DES.pod DES.xs Makefile.PL dess.cpp des3s.cpp \
-       Makefile.uni typemap t Makefile.ssl makefile.bc Makefile.lit \
-       des.org des_locl.org
-TESTING_LIT=   destest speed des_opts
-TESTING_FULL=  rpw $(TESTING_LIT)
-TESTING_SRC_LIT=destest.c speed.c des_opts.c
-TESTING_SRC_FULL=rpw.c $(TESTING_SRC_LIT)
-HEADERS_LIT=des_ver.h des.h des_locl.h podd.h sk.h spr.h
-HEADERS_FULL= $(HEADERS_LIT) rpc_des.h
-LIBDES_LIT=cbc_enc.c ecb_enc.c fcrypt.c set_key.c des_enc.c fcrypt_b.c
-LIBDES_FULL= cbc_cksm.c pcbc_enc.c qud_cksm.c \
-       cfb64ede.c cfb64enc.c cfb_enc.c ecb3_enc.c \
-       enc_read.c enc_writ.c ofb64ede.c ofb64enc.c ofb_enc.c  \
-       rand_key.c rpc_enc.c  str2key.c  supp.c \
-       xcbc_enc.c $(LIBDES_LIT) read_pwd.c read2pwd.c
-
-PERL=  des.pl testdes.pl doIP doPC1 doPC2 PC1 PC2 shifts.pl
-
-OBJ=   $(OBJ_LIT)
-GENERAL=$(GENERAL_LIT)
-TESTING=$(TESTING_LIT)
-TESTING_SRC=$(TESTING_SRC_LIT)
-HEADERS=$(HEADERS_LIT)
-LIBDES=        $(LIBDES_LIT)
-
-ALL=   $(GENERAL) $(TESTING_SRC) $(LIBDES) $(PERL) $(HEADERS)
-
-DLIB=  libdes.a
-
-all: $(DLIB) $(TESTING)
-
-cc:
-       $(MAKE) CC=cc CFLAGS="-O $(OPTS) $(CFLAG)" all
-
-gcc:
-       $(MAKE) CC=gcc CFLAGS="-O3 -fomit-frame-pointer $(OPTS) $(CFLAG)" all
-
-x86-elf:
-       $(MAKE) DES_ENC='asm/dx86-elf.o asm/yx86-elf.o' CC=$(CC) CFLAGS="-DELF $(OPTS) $(CFLAG)" all
-
-x86-out:
-       $(MAKE) DES_ENC='asm/dx86-out.o asm/yx86-out.o' CC=$(CC) CFLAGS="-DOUT $(OPTS) $(CFLAG)" all
-
-x86-solaris:
-       $(MAKE) DES_ENC='asm/dx86-sol.o asm/yx86-sol.o' CC=$(CC) CFLAGS="-DSOL $(OPTS) $(CFLAG)" all
-
-x86-bsdi:
-       $(MAKE) DES_ENC='asm/dx86bsdi.o asm/yx86bsdi.o' CC=$(CC) CFLAGS="-DBSDI $(OPTS) $(CFLAG)" all
-
-# elf
-asm/dx86-elf.o: asm/dx86unix.cpp
-       $(CPP) -DELF asm/dx86unix.cpp | $(AS) -o asm/dx86-elf.o
-
-asm/yx86-elf.o: asm/yx86unix.cpp
-       $(CPP) -DELF asm/yx86unix.cpp | $(AS) -o asm/yx86-elf.o
-
-# solaris
-asm/dx86-sol.o: asm/dx86unix.cpp
-       $(CC) -E -DSOL asm/dx86unix.cpp | sed 's/^#.*//' > asm/dx86-sol.s
-       as -o asm/dx86-sol.o asm/dx86-sol.s
-       rm -f asm/dx86-sol.s
-
-asm/yx86-sol.o: asm/yx86unix.cpp
-       $(CC) -E -DSOL asm/yx86unix.cpp | sed 's/^#.*//' > asm/yx86-sol.s
-       as -o asm/yx86-sol.o asm/yx86-sol.s
-       rm -f asm/yx86-sol.s
-
-# a.out
-asm/dx86-out.o: asm/dx86unix.cpp
-       $(CPP) -DOUT asm/dx86unix.cpp | $(AS) -o asm/dx86-out.o
-
-asm/yx86-out.o: asm/yx86unix.cpp
-       $(CPP) -DOUT asm/yx86unix.cpp | $(AS) -o asm/yx86-out.o
-
-# bsdi
-asm/dx86bsdi.o: asm/dx86unix.cpp
-       $(CPP) -DBSDI asm/dx86unix.cpp | $(AS) -o asm/dx86bsdi.o
-
-asm/yx86bsdi.o: asm/yx86unix.cpp
-       $(CPP) -DBSDI asm/yx86unix.cpp | $(AS) -o asm/yx86bsdi.o
-
-asm/dx86unix.cpp:
-       (cd asm; perl des-586.pl cpp >dx86unix.cpp)
-
-asm/yx86unix.cpp:
-       (cd asm; perl crypt586.pl cpp >yx86unix.cpp)
-
-test:  all
-       ./destest
-
-$(DLIB): $(OBJ)
-       /bin/rm -f $(DLIB)
-       ar cr $(DLIB) $(OBJ)
-       -if test -s /bin/ranlib; then /bin/ranlib $(DLIB); \
-       else if test -s /usr/bin/ranlib; then /usr/bin/ranlib $(DLIB); \
-       else exit 0; fi; fi
-
-des_opts: des_opts.o $(DLIB)
-       $(CC) $(CFLAGS) -o des_opts des_opts.o $(DLIB)
-
-destest: destest.o $(DLIB)
-       $(CC) $(CFLAGS) -o destest destest.o $(DLIB)
-
-rpw: rpw.o $(DLIB)
-       $(CC) $(CFLAGS) -o rpw rpw.o $(DLIB)
-
-speed: speed.o $(DLIB)
-       $(CC) $(CFLAGS) -o speed speed.o $(DLIB)
-
-des: des.o $(DLIB)
-       $(CC) $(CFLAGS) -o des des.o $(DLIB)
-
-tags:
-       ctags $(TESTING_SRC) $(LIBDES)
-
-tar_lit:
-       /bin/mv Makefile Makefile.tmp
-       /bin/cp Makefile.lit Makefile
-       tar chf libdes-l.tar $(LIBDES_LIT) $(HEADERS_LIT) \
-               $(GENERAL_LIT) $(TESTING_SRC_LIT)
-       /bin/rm -f Makefile
-       /bin/mv Makefile.tmp Makefile
-
-tar:
-       tar chf libdes.tar $(ALL)
-
-shar:
-       shar $(ALL) >libdes.shar
-
-depend:
-       makedepend $(LIBDES) $(TESTING_SRC)
-
-clean:
-       /bin/rm -f *.o tags core $(TESTING) $(DLIB) .nfs* *.old *.bak asm/*.o 
-
-dclean:
-       sed -e '/^# DO NOT DELETE THIS LINE/ q' Makefile >Makefile.new
-       mv -f Makefile.new Makefile
-
-# Eric is probably going to choke when he next looks at this --tjh
-install:
-       if test $(INSTALLTOP); then \
-           echo SSL style install; \
-           cp $(DLIB) $(INSTALLTOP)/lib; \
-           if test -s /bin/ranlib; then \
-               /bin/ranlib $(INSTALLTOP)/lib/$(DLIB); \
-           else \
-               if test -s /usr/bin/ranlib; then \
-               /usr/bin/ranlib $(INSTALLTOP)/lib/$(DLIB); \
-           fi; fi; \
-           chmod 644 $(INSTALLTOP)/lib/$(DLIB); \
-           cp des.h $(INSTALLTOP)/include; \
-           chmod 644 $(INSTALLTOP)/include/des.h; \
-       else \
-           echo Standalone install; \
-           cp $(DLIB) $(LIBDIR)/$(DLIB); \
-           if test -s /bin/ranlib; then \
-             /bin/ranlib $(LIBDIR)/$(DLIB); \
-           else \
-             if test -s /usr/bin/ranlib; then \
-               /usr/bin/ranlib $(LIBDIR)/$(DLIB); \
-             fi; \
-           fi; \
-           chmod 644 $(LIBDIR)/$(DLIB); \
-           cp des_crypt.man $(MANDIR)/man$(MAN3)/des_crypt.$(MAN3); \
-           chmod 644 $(MANDIR)/man$(MAN3)/des_crypt.$(MAN3); \
-           cp des.man $(MANDIR)/man$(MAN1)/des.$(MAN1); \
-           chmod 644 $(MANDIR)/man$(MAN1)/des.$(MAN1); \
-           cp des.h $(INCDIR)/des.h; \
-           chmod 644 $(INCDIR)/des.h; \
-       fi
-# DO NOT DELETE THIS LINE -- make depend depends on it.
index 4197665..3eb0738 100644 (file)
@@ -32,21 +32,21 @@ LIBSRC=     cbc_cksm.c cbc_enc.c  cfb64enc.c cfb_enc.c  \
        fcrypt.c ofb64enc.c ofb_enc.c  pcbc_enc.c \
        qud_cksm.c rand_key.c read_pwd.c rpc_enc.c  set_key.c  \
        des_enc.c fcrypt_b.c read2pwd.c \
-       fcrypt.c xcbc_enc.c \
-       str2key.c  cfb64ede.c ofb64ede.c supp.c ede_cbcm_enc.c
+       xcbc_enc.c \
+       str2key.c  cfb64ede.c ofb64ede.c ede_cbcm_enc.c
 
 LIBOBJ= set_key.o  ecb_enc.o  cbc_enc.o \
        ecb3_enc.o cfb64enc.o cfb64ede.o cfb_enc.o  ofb64ede.o \
        enc_read.o enc_writ.o ofb64enc.o \
        ofb_enc.o  str2key.o  pcbc_enc.o qud_cksm.o rand_key.o \
        ${DES_ENC} read2pwd.o \
-       fcrypt.o xcbc_enc.o read_pwd.o rpc_enc.o  cbc_cksm.o supp.o \
+       fcrypt.o xcbc_enc.o read_pwd.o rpc_enc.o  cbc_cksm.o \
        ede_cbcm_enc.o
 
 SRC= $(LIBSRC)
 
 EXHEADER= des.h
-HEADER=        des_locl.h rpc_des.h podd.h sk.h spr.h des_ver.h $(EXHEADER)
+HEADER=        des_locl.h rpc_des.h spr.h des_ver.h $(EXHEADER)
 
 ALL=    $(GENERAL) $(SRC) $(HEADER)
 
@@ -65,10 +65,10 @@ des: des.o cbc3_enc.o lib
 
 # elf
 asm/dx86-elf.o: asm/dx86unix.cpp
-       $(CPP) -DELF asm/dx86unix.cpp | as -o asm/dx86-elf.o
+       $(CPP) -DELF -x c asm/dx86unix.cpp | as -o asm/dx86-elf.o
 
 asm/yx86-elf.o: asm/yx86unix.cpp
-       $(CPP) -DELF asm/yx86unix.cpp | as -o asm/yx86-elf.o
+       $(CPP) -DELF -x c asm/yx86unix.cpp | as -o asm/yx86-elf.o
 
 # solaris
 asm/dx86-sol.o: asm/dx86unix.cpp
@@ -95,10 +95,10 @@ asm/dx86bsdi.o: asm/dx86unix.cpp
 asm/yx86bsdi.o: asm/yx86unix.cpp
        $(CPP) -DBSDI asm/yx86unix.cpp | sed 's/ :/:/' | as -o asm/yx86bsdi.o
 
-asm/dx86unix.cpp: asm/des-586.pl
+asm/dx86unix.cpp: asm/des-586.pl ../perlasm/x86asm.pl ../perlasm/cbc.pl
        (cd asm; $(PERL) des-586.pl cpp >dx86unix.cpp)
 
-asm/yx86unix.cpp: asm/crypt586.pl
+asm/yx86unix.cpp: asm/crypt586.pl ../perlasm/x86asm.pl
        (cd asm; $(PERL) crypt586.pl cpp >yx86unix.cpp)
 
 files:
@@ -172,10 +172,8 @@ enc_writ.o: ../../include/openssl/err.h ../../include/openssl/opensslconf.h
 enc_writ.o: ../../include/openssl/opensslv.h ../../include/openssl/rand.h
 enc_writ.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h
 enc_writ.o: ../cryptlib.h des_locl.h
-fcrypt.o: ../../include/openssl/des.h ../../include/openssl/des.h
-fcrypt.o: ../../include/openssl/e_os2.h ../../include/openssl/e_os2.h
-fcrypt.o: ../../include/openssl/opensslconf.h
-fcrypt.o: ../../include/openssl/opensslconf.h des_locl.h des_locl.h
+fcrypt.o: ../../include/openssl/des.h ../../include/openssl/e_os2.h
+fcrypt.o: ../../include/openssl/opensslconf.h des_locl.h
 fcrypt_b.o: ../../include/openssl/des.h ../../include/openssl/e_os2.h
 fcrypt_b.o: ../../include/openssl/opensslconf.h des_locl.h
 ofb64ede.o: ../../include/openssl/des.h ../../include/openssl/e_os2.h
@@ -201,10 +199,8 @@ read_pwd.o: ../../include/openssl/stack.h ../cryptlib.h des_locl.h
 rpc_enc.o: ../../include/openssl/des.h ../../include/openssl/e_os2.h
 rpc_enc.o: ../../include/openssl/opensslconf.h des_locl.h des_ver.h rpc_des.h
 set_key.o: ../../include/openssl/des.h ../../include/openssl/e_os2.h
-set_key.o: ../../include/openssl/opensslconf.h des_locl.h podd.h sk.h
+set_key.o: ../../include/openssl/opensslconf.h des_locl.h
 str2key.o: ../../include/openssl/des.h ../../include/openssl/e_os2.h
 str2key.o: ../../include/openssl/opensslconf.h des_locl.h
-supp.o: ../../include/openssl/des.h ../../include/openssl/e_os2.h
-supp.o: ../../include/openssl/opensslconf.h des_locl.h
 xcbc_enc.o: ../../include/openssl/des.h ../../include/openssl/e_os2.h
 xcbc_enc.o: ../../include/openssl/opensslconf.h des_locl.h
index ec19d75..e69de29 100644 (file)
@@ -1,251 +0,0 @@
-# You must select the correct terminal control system to be used to
-# turn character echo off when reading passwords.  There a 5 systems
-# SGTTY   - the old BSD system
-# TERMIO  - most system V boxes
-# TERMIOS - SGI (ala IRIX).
-# VMS     - the DEC operating system
-# MSDOS   - we all know what it is :-)
-# read_pwd.c makes a reasonable guess at what is correct.
-
-# Targets
-# make          - twidle the options yourself :-)
-# make cc       - standard cc options
-# make gcc      - standard gcc options
-# make x86-elf  - linux-elf etc
-# make x86-out  - linux-a.out, FreeBSD etc
-# make x86-solaris
-# make x86-bdsi
-
-# If you are on a DEC Alpha, edit des.h and change the DES_LONG
-# define to 'unsigned int'.  I have seen this give a %20 speedup.
-
-OPTS0= -DRAND -DTERMIO #-DNOCONST
-
-# Version 1.94 has changed the strings_to_key function so that it is
-# now compatible with MITs when the string is longer than 8 characters.
-# If you wish to keep the old version, uncomment the following line.
-# This will affect the -E/-D options on des(1).
-#OPTS1= -DOLD_STR_TO_KEY
-
-# There are 4 possible performance options
-# -DDES_PTR
-# -DDES_RISC1
-# -DDES_RISC2 (only one of DES_RISC1 and DES_RISC2)
-# -DDES_UNROLL
-# after the initial build, run 'des_opts' to see which options are best
-# for your platform.  There are some listed in options.txt
-#OPTS2= -DDES_PTR 
-#OPTS3= -DDES_RISC1 # or DES_RISC2
-#OPTS4= -DDES_UNROLL
-
-OPTS= $(OPTS0) $(OPTS1) $(OPTS2) $(OPTS3) $(OPTS4)
-
-MAKE=make -f Makefile
-#CC=cc
-#CFLAG= -O
-
-CC=gcc
-#CFLAG= -O4 -funroll-loops -fomit-frame-pointer
-CFLAG= -O3 -fomit-frame-pointer
-
-CFLAGS=$(OPTS) $(CFLAG)
-CPP=$(CC) -E
-AS=as
-RANLIB=ranlib
-
-# Assember version of des_encrypt*().
-DES_ENC=des_enc.o fcrypt_b.o           # normal C version
-#DES_ENC=asm/dx86-elf.o        asm/yx86-elf.o  # elf format x86
-#DES_ENC=asm/dx86-out.o        asm/yx86-out.o  # a.out format x86
-#DES_ENC=asm/dx86-sol.o        asm/yx86-sol.o  # solaris format x86 
-#DES_ENC=asm/dx86bsdi.o        asm/yx86basi.o  # bsdi format x86 
-
-LIBDIR=/usr/local/lib
-BINDIR=/usr/local/bin
-INCDIR=/usr/local/include
-MANDIR=/usr/local/man
-MAN1=1
-MAN3=3
-SHELL=/bin/sh
-OBJ_LIT=cbc_enc.o ecb_enc.o $(DES_ENC) fcrypt.o set_key.o
-OBJ_FULL=cbc_cksm.o $(OBJ_LIT) pcbc_enc.o \
-       xcbc_enc.o qud_cksm.o cbc3_enc.o \
-       cfb64ede.o cfb64enc.o cfb_enc.o ecb3_enc.o \
-       enc_read.o enc_writ.o ofb64ede.o ofb64enc.o ofb_enc.o  \
-       rand_key.o read_pwd.o read2pwd.o rpc_enc.o  str2key.o supp.o
-
-GENERAL_LIT=COPYRIGHT INSTALL README VERSION Makefile des_crypt.man \
-       des.doc options.txt asm
-GENERAL_FULL=$(GENERAL_LIT) FILES Imakefile times vms.com KERBEROS MODES.DES \
-       des.man DES.pm DES.pod DES.xs Makefile.PL dess.cpp des3s.cpp \
-       Makefile.uni typemap t Makefile.ssl makefile.bc Makefile.lit \
-       des.org des_locl.org
-TESTING_LIT=   destest speed des_opts
-TESTING_FULL=  rpw des $(TESTING_LIT)
-TESTING_SRC_LIT=destest.c speed.c des_opts.c
-TESTING_SRC_FULL=rpw.c des.c $(TESTING_SRC_LIT)
-HEADERS_LIT=des_ver.h des.h des_locl.h podd.h sk.h spr.h
-HEADERS_FULL= $(HEADERS_LIT) rpc_des.h
-LIBDES_LIT=cbc_enc.c ecb_enc.c fcrypt.c set_key.c des_enc.c fcrypt_b.c
-LIBDES_FULL= cbc_cksm.c pcbc_enc.c qud_cksm.c cbc3_enc.c \
-       cfb64ede.c cfb64enc.c cfb_enc.c ecb3_enc.c \
-       enc_read.c enc_writ.c ofb64ede.c ofb64enc.c ofb_enc.c  \
-       rand_key.c rpc_enc.c  str2key.c  supp.c \
-       xcbc_enc.c $(LIBDES_LIT) read_pwd.c read2pwd.c
-
-PERL=  des.pl testdes.pl doIP doPC1 doPC2 PC1 PC2 shifts.pl
-
-OBJ=   $(OBJ_FULL)
-GENERAL=$(GENERAL_FULL)
-TESTING=$(TESTING_FULL)
-TESTING_SRC=$(TESTING_SRC_FULL)
-HEADERS=$(HEADERS_FULL)
-LIBDES=        $(LIBDES_FULL)
-
-ALL=   $(GENERAL) $(TESTING_SRC) $(LIBDES) $(PERL) $(HEADERS)
-
-DLIB=  libdes.a
-
-all: $(DLIB) $(TESTING)
-
-cc:
-       $(MAKE) CC=cc CFLAGS="-O $(OPTS) $(CFLAG)" all
-
-gcc:
-       $(MAKE) CC=gcc CFLAGS="-O3 -fomit-frame-pointer $(OPTS) $(CFLAG)" all
-
-x86-elf:
-       $(MAKE) DES_ENC='asm/dx86-elf.o asm/yx86-elf.o' CC=$(CC) CFLAGS="-DELF $(OPTS) $(CFLAG)" all
-
-x86-out:
-       $(MAKE) DES_ENC='asm/dx86-out.o asm/yx86-out.o' CC=$(CC) CFLAGS="-DOUT $(OPTS) $(CFLAG)" all
-
-x86-solaris:
-       $(MAKE) DES_ENC='asm/dx86-sol.o asm/yx86-sol.o' CC=$(CC) CFLAGS="-DSOL $(OPTS) $(CFLAG)" all
-
-x86-bsdi:
-       $(MAKE) DES_ENC='asm/dx86bsdi.o asm/yx86bsdi.o' CC=$(CC) CFLAGS="-DBSDI $(OPTS) $(CFLAG)" all
-
-# elf
-asm/dx86-elf.o: asm/dx86unix.cpp
-       $(CPP) -DELF asm/dx86unix.cpp | $(AS) -o asm/dx86-elf.o
-
-asm/yx86-elf.o: asm/yx86unix.cpp
-       $(CPP) -DELF asm/yx86unix.cpp | $(AS) -o asm/yx86-elf.o
-
-# solaris
-asm/dx86-sol.o: asm/dx86unix.cpp
-       $(CC) -E -DSOL asm/dx86unix.cpp | sed 's/^#.*//' > asm/dx86-sol.s
-       as -o asm/dx86-sol.o asm/dx86-sol.s
-       rm -f asm/dx86-sol.s
-
-asm/yx86-sol.o: asm/yx86unix.cpp
-       $(CC) -E -DSOL asm/yx86unix.cpp | sed 's/^#.*//' > asm/yx86-sol.s
-       as -o asm/yx86-sol.o asm/yx86-sol.s
-       rm -f asm/yx86-sol.s
-
-# a.out
-asm/dx86-out.o: asm/dx86unix.cpp
-       $(CPP) -DOUT asm/dx86unix.cpp | $(AS) -o asm/dx86-out.o
-
-asm/yx86-out.o: asm/yx86unix.cpp
-       $(CPP) -DOUT asm/yx86unix.cpp | $(AS) -o asm/yx86-out.o
-
-# bsdi
-asm/dx86bsdi.o: asm/dx86unix.cpp
-       $(CPP) -DBSDI asm/dx86unix.cpp | $(AS) -o asm/dx86bsdi.o
-
-asm/yx86bsdi.o: asm/yx86unix.cpp
-       $(CPP) -DBSDI asm/yx86unix.cpp | $(AS) -o asm/yx86bsdi.o
-
-asm/dx86unix.cpp:
-       (cd asm; perl des-586.pl cpp >dx86unix.cpp)
-
-asm/yx86unix.cpp:
-       (cd asm; perl crypt586.pl cpp >yx86unix.cpp)
-
-test:  all
-       ./destest
-
-$(DLIB): $(OBJ)
-       /bin/rm -f $(DLIB)
-       ar cr $(DLIB) $(OBJ)
-       $(RANLIB) $(DLIB)
-
-des_opts: des_opts.o $(DLIB)
-       $(CC) $(CFLAGS) -o des_opts des_opts.o $(DLIB)
-
-destest: destest.o $(DLIB)
-       $(CC) $(CFLAGS) -o destest destest.o $(DLIB)
-
-rpw: rpw.o $(DLIB)
-       $(CC) $(CFLAGS) -o rpw rpw.o $(DLIB)
-
-speed: speed.o $(DLIB)
-       $(CC) $(CFLAGS) -o speed speed.o $(DLIB)
-
-des: des.o $(DLIB)
-       $(CC) $(CFLAGS) -o des des.o $(DLIB)
-
-tags:
-       ctags $(TESTING_SRC) $(LIBDES)
-
-tar_lit:
-       /bin/mv Makefile Makefile.tmp
-       /bin/cp Makefile.lit Makefile
-       for i in $(HEADERS_LIT) $(LIBDES_LIT) $(GENERAL_LIT) $(TESTING_SRC_LIT) ;\
-       do \
-               n="$$n des/$$i"; \
-       done; \
-       ( cd .. ; tar chf - $$n )| gzip > libdes-l.tgz
-       /bin/rm -f Makefile
-       /bin/mv Makefile.tmp Makefile
-
-tar:
-       mv Makefile Makefile.tmp
-       /bin/cp Makefile.uni Makefile
-       for i in $(ALL) ;\
-       do \
-               n="$$n des/$$i"; \
-       done; \
-       ( cd .. ; tar chf - $$n )| gzip > libdes.tgz
-       /bin/rm -f Makefile
-       /bin/mv Makefile.tmp Makefile
-
-shar:
-       shar $(ALL) >libdes.shar
-
-depend:
-       makedepend $(LIBDES) $(TESTING_SRC)
-
-clean:
-       /bin/rm -f *.o tags core $(TESTING) $(DLIB) .nfs* *.old *.bak asm/*.o 
-
-dclean:
-       sed -e '/^# DO NOT DELETE THIS LINE/ q' Makefile >Makefile.new
-       mv -f Makefile.new Makefile
-
-# Eric is probably going to choke when he next looks at this --tjh
-install: des
-       if test $(INSTALLTOP); then \
-           echo SSL style install; \
-           cp $(DLIB) $(INSTALLTOP)/lib; \
-               $(RANLIB) $(DLIB); \
-           chmod 644 $(INSTALLTOP)/lib/$(DLIB); \
-           cp des.h $(INSTALLTOP)/include; \
-           chmod 644 $(INSTALLTOP)/include/des.h; \
-       else \
-           echo Standalone install; \
-           cp $(DLIB) $(LIBDIR)/$(DLIB); \
-               $(RANLIB) $(DLIB); \
-           chmod 644 $(LIBDIR)/$(DLIB); \
-           cp des $(BINDIR)/des; \
-           chmod 711 $(BINDIR)/des; \
-           cp des_crypt.man $(MANDIR)/man$(MAN3)/des_crypt.$(MAN3); \
-           chmod 644 $(MANDIR)/man$(MAN3)/des_crypt.$(MAN3); \
-           cp des.man $(MANDIR)/man$(MAN1)/des.$(MAN1); \
-           chmod 644 $(MANDIR)/man$(MAN1)/des.$(MAN1); \
-           cp des.h $(INCDIR)/des.h; \
-           chmod 644 $(INCDIR)/des.h; \
-       fi
-# DO NOT DELETE THIS LINE -- make depend depends on it.
index efb8348..e69de29 100644 (file)
@@ -1,28 +0,0 @@
-#!/usr/local/bin/perl
-
-@PC1=(  57,49,41,33,25,17, 9,
-        1,58,50,42,34,26,18,
-       10, 2,59,51,43,35,27,
-       19,11, 3,60,52,44,36,
-       "-","-","-","-",
-       63,55,47,39,31,23,15,
-        7,62,54,46,38,30,22,
-       14, 6,61,53,45,37,29,
-       21,13, 5,28,20,12, 4,
-       "-","-","-","-",
-       );
-
-foreach (@PC1)
-       {
-       if ($_ ne "-")
-               {
-               $_--;
-               $_=int($_/8)*8+7-($_%8);
-               printf "%2d  ",$_;
-               }
-       else
-               { print "--  "; }
-       print "\n" if (((++$i) % 8) == 0);
-       print "\n" if ((($i) % 32) == 0);
-       }
-
index 2d56027..e69de29 100644 (file)
@@ -1,57 +0,0 @@
-#!/usr/local/bin/perl
-
-@PC2_C=(14,17,11,24, 1, 5,
-        3,28,15, 6,21,10,
-       23,19,12, 4,26, 8,
-       16, 7,27,20,13, 2,
-       );
-
-@PC2_D=(41,52,31,37,47,55,
-       30,40,51,45,33,48,
-       44,49,39,56,34,53,
-       46,42,50,36,29,32,
-       );
-
-foreach (@PC2_C) {
-       if ($_ ne "-")
-               {
-               $_--;
-               printf "%2d  ",$_; }
-       else { print "--  "; }
-       $C{$_}=1;
-       print "\n" if (((++$i) % 8) == 0);
-       }
-$i=0;
-print "\n";
-foreach (@PC2_D) {
-       if ($_ ne "-")
-               {
-               $_-=29;
-               printf "%2d  ",$_; }
-       else { print "--  "; }
-       $D{$_}=1;
-       print "\n" if (((++$i) % 8) == 0); }
-
-print "\n";
-foreach $i (0 .. 27)
-       {
-       $_=$C{$i};
-       if ($_ ne "-") {printf "%2d ",$_;}
-       else { print "--  "; }
-       print "\n" if (((++$i) % 8) == 0);
-       }
-print "\n";
-
-print "\n";
-foreach $i (0 .. 27)
-       {
-       $_=$D{$i};
-       if ($_ ne "-") {printf "%2d  ",$_;}
-       else { print "--  "; }
-       print "\n" if (((++$i) % 8) == 0);
-       }
-print "\n";
-sub numsort
-       {
-       $a-$b;
-       }
index 9e3dc9c..e69de29 100644 (file)
-       ; Don't even think of reading this code
-       ; It was automatically generated by des-586.pl
-       ; Which is a perl program used to generate the x86 assember for
-       ; any of elf, a.out, BSDI,Win32, or Solaris
-       ; eric <eay@cryptsoft.com>
-       ; 
-       TITLE   des-586.asm
-        .386
-.model FLAT
-_TEXT  SEGMENT
-PUBLIC _des_encrypt
-EXTRN   _des_SPtrans:DWORD
-_des_encrypt PROC NEAR
-       push    esi
-       push    edi
-       ; 
-       ; Load the 2 words
-       mov     esi,            DWORD PTR 12[esp]
-       xor     ecx,            ecx
-       push    ebx
-       push    ebp
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 28[esp]
-       mov     edi,            DWORD PTR 4[esi]
-       ; 
-       ; IP
-       rol     eax,            4
-       mov     esi,            eax
-       xor     eax,            edi
-       and     eax,            0f0f0f0f0h
-       xor     esi,            eax
-       xor     edi,            eax
-       ; 
-       rol     edi,            20
-       mov     eax,            edi
-       xor     edi,            esi
-       and     edi,            0fff0000fh
-       xor     eax,            edi
-       xor     esi,            edi
-       ; 
-       rol     eax,            14
-       mov     edi,            eax
-       xor     eax,            esi
-       and     eax,            033333333h
-       xor     edi,            eax
-       xor     esi,            eax
-       ; 
-       rol     esi,            22
-       mov     eax,            esi
-       xor     esi,            edi
-       and     esi,            003fc03fch
-       xor     eax,            esi
-       xor     edi,            esi
-       ; 
-       rol     eax,            9
-       mov     esi,            eax
-       xor     eax,            edi
-       and     eax,            0aaaaaaaah
-       xor     esi,            eax
-       xor     edi,            eax
-       ; 
-       rol     edi,            1
-       mov     ebp,            DWORD PTR 24[esp]
-       cmp     ebx,            0
-       je      $L000start_decrypt
-       ; 
-       ; Round 0
-       mov     eax,            DWORD PTR [ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 4[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 1
-       mov     eax,            DWORD PTR 8[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 12[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 2
-       mov     eax,            DWORD PTR 16[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 20[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 3
-       mov     eax,            DWORD PTR 24[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 28[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 4
-       mov     eax,            DWORD PTR 32[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 36[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 5
-       mov     eax,            DWORD PTR 40[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 44[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 6
-       mov     eax,            DWORD PTR 48[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 52[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 7
-       mov     eax,            DWORD PTR 56[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 60[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 8
-       mov     eax,            DWORD PTR 64[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 68[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 9
-       mov     eax,            DWORD PTR 72[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 76[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 10
-       mov     eax,            DWORD PTR 80[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 84[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 11
-       mov     eax,            DWORD PTR 88[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 92[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 12
-       mov     eax,            DWORD PTR 96[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 100[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 13
-       mov     eax,            DWORD PTR 104[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 108[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 14
-       mov     eax,            DWORD PTR 112[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 116[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 15
-       mov     eax,            DWORD PTR 120[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 124[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       jmp     $L001end
-$L000start_decrypt:
-       ; 
-       ; Round 15
-       mov     eax,            DWORD PTR 120[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 124[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 14
-       mov     eax,            DWORD PTR 112[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 116[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 13
-       mov     eax,            DWORD PTR 104[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 108[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 12
-       mov     eax,            DWORD PTR 96[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 100[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 11
-       mov     eax,            DWORD PTR 88[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 92[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 10
-       mov     eax,            DWORD PTR 80[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 84[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 9
-       mov     eax,            DWORD PTR 72[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 76[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 8
-       mov     eax,            DWORD PTR 64[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 68[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 7
-       mov     eax,            DWORD PTR 56[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 60[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 6
-       mov     eax,            DWORD PTR 48[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 52[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 5
-       mov     eax,            DWORD PTR 40[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 44[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 4
-       mov     eax,            DWORD PTR 32[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 36[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 3
-       mov     eax,            DWORD PTR 24[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 28[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 2
-       mov     eax,            DWORD PTR 16[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 20[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 1
-       mov     eax,            DWORD PTR 8[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 12[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 0
-       mov     eax,            DWORD PTR [ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 4[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-$L001end:
-       ; 
-       ; FP
-       mov     edx,            DWORD PTR 20[esp]
-       ror     esi,            1
-       mov     eax,            edi
-       xor     edi,            esi
-       and     edi,            0aaaaaaaah
-       xor     eax,            edi
-       xor     esi,            edi
-       ; 
-       rol     eax,            23
-       mov     edi,            eax
-       xor     eax,            esi
-       and     eax,            003fc03fch
-       xor     edi,            eax
-       xor     esi,            eax
-       ; 
-       rol     edi,            10
-       mov     eax,            edi
-       xor     edi,            esi
-       and     edi,            033333333h
-       xor     eax,            edi
-       xor     esi,            edi
-       ; 
-       rol     esi,            18
-       mov     edi,            esi
-       xor     esi,            eax
-       and     esi,            0fff0000fh
-       xor     edi,            esi
-       xor     eax,            esi
-       ; 
-       rol     edi,            12
-       mov     esi,            edi
-       xor     edi,            eax
-       and     edi,            0f0f0f0f0h
-       xor     esi,            edi
-       xor     eax,            edi
-       ; 
-       ror     eax,            4
-       mov     DWORD PTR [edx],eax
-       mov     DWORD PTR 4[edx],esi
-       pop     ebp
-       pop     ebx
-       pop     edi
-       pop     esi
-       ret
-_des_encrypt ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _des_encrypt2
-EXTRN   _des_SPtrans:DWORD
-_des_encrypt2 PROC NEAR
-       push    esi
-       push    edi
-       ; 
-       ; Load the 2 words
-       mov     eax,            DWORD PTR 12[esp]
-       xor     ecx,            ecx
-       push    ebx
-       push    ebp
-       mov     esi,            DWORD PTR [eax]
-       mov     ebx,            DWORD PTR 28[esp]
-       rol     esi,            3
-       mov     edi,            DWORD PTR 4[eax]
-       rol     edi,            3
-       mov     ebp,            DWORD PTR 24[esp]
-       cmp     ebx,            0
-       je      $L002start_decrypt
-       ; 
-       ; Round 0
-       mov     eax,            DWORD PTR [ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 4[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 1
-       mov     eax,            DWORD PTR 8[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 12[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 2
-       mov     eax,            DWORD PTR 16[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 20[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 3
-       mov     eax,            DWORD PTR 24[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 28[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 4
-       mov     eax,            DWORD PTR 32[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 36[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 5
-       mov     eax,            DWORD PTR 40[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 44[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 6
-       mov     eax,            DWORD PTR 48[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 52[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 7
-       mov     eax,            DWORD PTR 56[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 60[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 8
-       mov     eax,            DWORD PTR 64[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 68[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 9
-       mov     eax,            DWORD PTR 72[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 76[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 10
-       mov     eax,            DWORD PTR 80[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 84[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 11
-       mov     eax,            DWORD PTR 88[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 92[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 12
-       mov     eax,            DWORD PTR 96[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 100[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 13
-       mov     eax,            DWORD PTR 104[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 108[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 14
-       mov     eax,            DWORD PTR 112[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 116[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 15
-       mov     eax,            DWORD PTR 120[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 124[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       jmp     $L003end
-$L002start_decrypt:
-       ; 
-       ; Round 15
-       mov     eax,            DWORD PTR 120[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 124[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 14
-       mov     eax,            DWORD PTR 112[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 116[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 13
-       mov     eax,            DWORD PTR 104[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 108[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 12
-       mov     eax,            DWORD PTR 96[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 100[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 11
-       mov     eax,            DWORD PTR 88[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 92[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 10
-       mov     eax,            DWORD PTR 80[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 84[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 9
-       mov     eax,            DWORD PTR 72[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 76[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 8
-       mov     eax,            DWORD PTR 64[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 68[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 7
-       mov     eax,            DWORD PTR 56[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 60[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 6
-       mov     eax,            DWORD PTR 48[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 52[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 5
-       mov     eax,            DWORD PTR 40[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 44[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 4
-       mov     eax,            DWORD PTR 32[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 36[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 3
-       mov     eax,            DWORD PTR 24[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 28[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 2
-       mov     eax,            DWORD PTR 16[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 20[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 1
-       mov     eax,            DWORD PTR 8[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 12[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 0
-       mov     eax,            DWORD PTR [ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 4[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-$L003end:
-       ; 
-       ; Fixup
-       ror     edi,            3
-       mov     eax,            DWORD PTR 20[esp]
-       ror     esi,            3
-       mov     DWORD PTR [eax],edi
-       mov     DWORD PTR 4[eax],esi
-       pop     ebp
-       pop     ebx
-       pop     edi
-       pop     esi
-       ret
-_des_encrypt2 ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _des_encrypt3
-
-_des_encrypt3 PROC NEAR
-       push    ebx
-       mov     ebx,            DWORD PTR 8[esp]
-       push    ebp
-       push    esi
-       push    edi
-       ; 
-       ; Load the data words
-       mov     edi,            DWORD PTR [ebx]
-       mov     esi,            DWORD PTR 4[ebx]
-       sub     esp,            12
-       ; 
-       ; IP
-       rol     edi,            4
-       mov     edx,            edi
-       xor     edi,            esi
-       and     edi,            0f0f0f0f0h
-       xor     edx,            edi
-       xor     esi,            edi
-       ; 
-       rol     esi,            20
-       mov     edi,            esi
-       xor     esi,            edx
-       and     esi,            0fff0000fh
-       xor     edi,            esi
-       xor     edx,            esi
-       ; 
-       rol     edi,            14
-       mov     esi,            edi
-       xor     edi,            edx
-       and     edi,            033333333h
-       xor     esi,            edi
-       xor     edx,            edi
-       ; 
-       rol     edx,            22
-       mov     edi,            edx
-       xor     edx,            esi
-       and     edx,            003fc03fch
-       xor     edi,            edx
-       xor     esi,            edx
-       ; 
-       rol     edi,            9
-       mov     edx,            edi
-       xor     edi,            esi
-       and     edi,            0aaaaaaaah
-       xor     edx,            edi
-       xor     esi,            edi
-       ; 
-       ror     edx,            3
-       ror     esi,            2
-       mov     DWORD PTR 4[ebx],esi
-       mov     eax,            DWORD PTR 36[esp]
-       mov     DWORD PTR [ebx],edx
-       mov     edi,            DWORD PTR 40[esp]
-       mov     esi,            DWORD PTR 44[esp]
-       mov     DWORD PTR 8[esp],1
-       mov     DWORD PTR 4[esp],eax
-       mov     DWORD PTR [esp],ebx
-       call    _des_encrypt2
-       mov     DWORD PTR 8[esp],0
-       mov     DWORD PTR 4[esp],edi
-       mov     DWORD PTR [esp],ebx
-       call    _des_encrypt2
-       mov     DWORD PTR 8[esp],1
-       mov     DWORD PTR 4[esp],esi
-       mov     DWORD PTR [esp],ebx
-       call    _des_encrypt2
-       add     esp,            12
-       mov     edi,            DWORD PTR [ebx]
-       mov     esi,            DWORD PTR 4[ebx]
-       ; 
-       ; FP
-       rol     esi,            2
-       rol     edi,            3
-       mov     eax,            edi
-       xor     edi,            esi
-       and     edi,            0aaaaaaaah
-       xor     eax,            edi
-       xor     esi,            edi
-       ; 
-       rol     eax,            23
-       mov     edi,            eax
-       xor     eax,            esi
-       and     eax,            003fc03fch
-       xor     edi,            eax
-       xor     esi,            eax
-       ; 
-       rol     edi,            10
-       mov     eax,            edi
-       xor     edi,            esi
-       and     edi,            033333333h
-       xor     eax,            edi
-       xor     esi,            edi
-       ; 
-       rol     esi,            18
-       mov     edi,            esi
-       xor     esi,            eax
-       and     esi,            0fff0000fh
-       xor     edi,            esi
-       xor     eax,            esi
-       ; 
-       rol     edi,            12
-       mov     esi,            edi
-       xor     edi,            eax
-       and     edi,            0f0f0f0f0h
-       xor     esi,            edi
-       xor     eax,            edi
-       ; 
-       ror     eax,            4
-       mov     DWORD PTR [ebx],eax
-       mov     DWORD PTR 4[ebx],esi
-       pop     edi
-       pop     esi
-       pop     ebp
-       pop     ebx
-       ret
-_des_encrypt3 ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _des_decrypt3
-
-_des_decrypt3 PROC NEAR
-       push    ebx
-       mov     ebx,            DWORD PTR 8[esp]
-       push    ebp
-       push    esi
-       push    edi
-       ; 
-       ; Load the data words
-       mov     edi,            DWORD PTR [ebx]
-       mov     esi,            DWORD PTR 4[ebx]
-       sub     esp,            12
-       ; 
-       ; IP
-       rol     edi,            4
-       mov     edx,            edi
-       xor     edi,            esi
-       and     edi,            0f0f0f0f0h
-       xor     edx,            edi
-       xor     esi,            edi
-       ; 
-       rol     esi,            20
-       mov     edi,            esi
-       xor     esi,            edx
-       and     esi,            0fff0000fh
-       xor     edi,            esi
-       xor     edx,            esi
-       ; 
-       rol     edi,            14
-       mov     esi,            edi
-       xor     edi,            edx
-       and     edi,            033333333h
-       xor     esi,            edi
-       xor     edx,            edi
-       ; 
-       rol     edx,            22
-       mov     edi,            edx
-       xor     edx,            esi
-       and     edx,            003fc03fch
-       xor     edi,            edx
-       xor     esi,            edx
-       ; 
-       rol     edi,            9
-       mov     edx,            edi
-       xor     edi,            esi
-       and     edi,            0aaaaaaaah
-       xor     edx,            edi
-       xor     esi,            edi
-       ; 
-       ror     edx,            3
-       ror     esi,            2
-       mov     DWORD PTR 4[ebx],esi
-       mov     esi,            DWORD PTR 36[esp]
-       mov     DWORD PTR [ebx],edx
-       mov     edi,            DWORD PTR 40[esp]
-       mov     eax,            DWORD PTR 44[esp]
-       mov     DWORD PTR 8[esp],0
-       mov     DWORD PTR 4[esp],eax
-       mov     DWORD PTR [esp],ebx
-       call    _des_encrypt2
-       mov     DWORD PTR 8[esp],1
-       mov     DWORD PTR 4[esp],edi
-       mov     DWORD PTR [esp],ebx
-       call    _des_encrypt2
-       mov     DWORD PTR 8[esp],0
-       mov     DWORD PTR 4[esp],esi
-       mov     DWORD PTR [esp],ebx
-       call    _des_encrypt2
-       add     esp,            12
-       mov     edi,            DWORD PTR [ebx]
-       mov     esi,            DWORD PTR 4[ebx]
-       ; 
-       ; FP
-       rol     esi,            2
-       rol     edi,            3
-       mov     eax,            edi
-       xor     edi,            esi
-       and     edi,            0aaaaaaaah
-       xor     eax,            edi
-       xor     esi,            edi
-       ; 
-       rol     eax,            23
-       mov     edi,            eax
-       xor     eax,            esi
-       and     eax,            003fc03fch
-       xor     edi,            eax
-       xor     esi,            eax
-       ; 
-       rol     edi,            10
-       mov     eax,            edi
-       xor     edi,            esi
-       and     edi,            033333333h
-       xor     eax,            edi
-       xor     esi,            edi
-       ; 
-       rol     esi,            18
-       mov     edi,            esi
-       xor     esi,            eax
-       and     esi,            0fff0000fh
-       xor     edi,            esi
-       xor     eax,            esi
-       ; 
-       rol     edi,            12
-       mov     esi,            edi
-       xor     edi,            eax
-       and     edi,            0f0f0f0f0h
-       xor     esi,            edi
-       xor     eax,            edi
-       ; 
-       ror     eax,            4
-       mov     DWORD PTR [ebx],eax
-       mov     DWORD PTR 4[ebx],esi
-       pop     edi
-       pop     esi
-       pop     ebp
-       pop     ebx
-       ret
-_des_decrypt3 ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _des_ncbc_encrypt
-
-_des_ncbc_encrypt PROC NEAR
-       ; 
-       push    ebp
-       push    ebx
-       push    esi
-       push    edi
-       mov     ebp,            DWORD PTR 28[esp]
-       ; getting iv ptr from parameter 4
-       mov     ebx,            DWORD PTR 36[esp]
-       mov     esi,            DWORD PTR [ebx]
-       mov     edi,            DWORD PTR 4[ebx]
-       push    edi
-       push    esi
-       push    edi
-       push    esi
-       mov     ebx,            esp
-       mov     esi,            DWORD PTR 36[esp]
-       mov     edi,            DWORD PTR 40[esp]
-       ; getting encrypt flag from parameter 5
-       mov     ecx,            DWORD PTR 56[esp]
-       ; get and push parameter 5
-       push    ecx
-       ; get and push parameter 3
-       mov     eax,            DWORD PTR 52[esp]
-       push    eax
-       push    ebx
-       cmp     ecx,            0
-       jz      $L004decrypt
-       and     ebp,            4294967288
-       mov     eax,            DWORD PTR 12[esp]
-       mov     ebx,            DWORD PTR 16[esp]
-       jz      $L005encrypt_finish
-L006encrypt_loop:
-       mov     ecx,            DWORD PTR [esi]
-       mov     edx,            DWORD PTR 4[esi]
-       xor     eax,            ecx
-       xor     ebx,            edx
-       mov     DWORD PTR 12[esp],eax
-       mov     DWORD PTR 16[esp],ebx
-       call    _des_encrypt
-       mov     eax,            DWORD PTR 12[esp]
-       mov     ebx,            DWORD PTR 16[esp]
-       mov     DWORD PTR [edi],eax
-       mov     DWORD PTR 4[edi],ebx
-       add     esi,            8
-       add     edi,            8
-       sub     ebp,            8
-       jnz     L006encrypt_loop
-$L005encrypt_finish:
-       mov     ebp,            DWORD PTR 56[esp]
-       and     ebp,            7
-       jz      $L007finish
-       xor     ecx,            ecx
-       xor     edx,            edx
-       mov     ebp,            DWORD PTR $L008cbc_enc_jmp_table[ebp*4]
-       jmp      ebp
-L009ej7:
-       mov     dh,             BYTE PTR 6[esi]
-       shl     edx,            8
-L010ej6:
-       mov     dh,             BYTE PTR 5[esi]
-L011ej5:
-       mov     dl,             BYTE PTR 4[esi]
-L012ej4:
-       mov     ecx,            DWORD PTR [esi]
-       jmp     $L013ejend
-L014ej3:
-       mov     ch,             BYTE PTR 2[esi]
-       shl     ecx,            8
-L015ej2:
-       mov     ch,             BYTE PTR 1[esi]
-L016ej1:
-       mov     cl,             BYTE PTR [esi]
-$L013ejend:
-       xor     eax,            ecx
-       xor     ebx,            edx
-       mov     DWORD PTR 12[esp],eax
-       mov     DWORD PTR 16[esp],ebx
-       call    _des_encrypt
-       mov     eax,            DWORD PTR 12[esp]
-       mov     ebx,            DWORD PTR 16[esp]
-       mov     DWORD PTR [edi],eax
-       mov     DWORD PTR 4[edi],ebx
-       jmp     $L007finish
-$L004decrypt:
-       and     ebp,            4294967288
-       mov     eax,            DWORD PTR 20[esp]
-       mov     ebx,            DWORD PTR 24[esp]
-       jz      $L017decrypt_finish
-L018decrypt_loop:
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-       mov     DWORD PTR 12[esp],eax
-       mov     DWORD PTR 16[esp],ebx
-       call    _des_encrypt
-       mov     eax,            DWORD PTR 12[esp]
-       mov     ebx,            DWORD PTR 16[esp]
-       mov     ecx,            DWORD PTR 20[esp]
-       mov     edx,            DWORD PTR 24[esp]
-       xor     ecx,            eax
-       xor     edx,            ebx
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-       mov     DWORD PTR [edi],ecx
-       mov     DWORD PTR 4[edi],edx
-       mov     DWORD PTR 20[esp],eax
-       mov     DWORD PTR 24[esp],ebx
-       add     esi,            8
-       add     edi,            8
-       sub     ebp,            8
-       jnz     L018decrypt_loop
-$L017decrypt_finish:
-       mov     ebp,            DWORD PTR 56[esp]
-       and     ebp,            7
-       jz      $L007finish
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-       mov     DWORD PTR 12[esp],eax
-       mov     DWORD PTR 16[esp],ebx
-       call    _des_encrypt
-       mov     eax,            DWORD PTR 12[esp]
-       mov     ebx,            DWORD PTR 16[esp]
-       mov     ecx,            DWORD PTR 20[esp]
-       mov     edx,            DWORD PTR 24[esp]
-       xor     ecx,            eax
-       xor     edx,            ebx
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-L019dj7:
-       ror     edx,            16
-       mov     BYTE PTR 6[edi],dl
-       shr     edx,            16
-L020dj6:
-       mov     BYTE PTR 5[edi],dh
-L021dj5:
-       mov     BYTE PTR 4[edi],dl
-L022dj4:
-       mov     DWORD PTR [edi],ecx
-       jmp     $L023djend
-L024dj3:
-       ror     ecx,            16
-       mov     BYTE PTR 2[edi],cl
-       shl     ecx,            16
-L025dj2:
-       mov     BYTE PTR 1[esi],ch
-L026dj1:
-       mov     BYTE PTR [esi], cl
-$L023djend:
-       jmp     $L007finish
-$L007finish:
-       mov     ecx,            DWORD PTR 64[esp]
-       add     esp,            28
-       mov     DWORD PTR [ecx],eax
-       mov     DWORD PTR 4[ecx],ebx
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-$L008cbc_enc_jmp_table:
-       DD      0
-       DD      L016ej1
-       DD      L015ej2
-       DD      L014ej3
-       DD      L012ej4
-       DD      L011ej5
-       DD      L010ej6
-       DD      L009ej7
-L027cbc_dec_jmp_table:
-       DD      0
-       DD      L026dj1
-       DD      L025dj2
-       DD      L024dj3
-       DD      L022dj4
-       DD      L021dj5
-       DD      L020dj6
-       DD      L019dj7
-_des_ncbc_encrypt ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _des_ede3_cbc_encrypt
-
-_des_ede3_cbc_encrypt PROC NEAR
-       ; 
-       push    ebp
-       push    ebx
-       push    esi
-       push    edi
-       mov     ebp,            DWORD PTR 28[esp]
-       ; getting iv ptr from parameter 6
-       mov     ebx,            DWORD PTR 44[esp]
-       mov     esi,            DWORD PTR [ebx]
-       mov     edi,            DWORD PTR 4[ebx]
-       push    edi
-       push    esi
-       push    edi
-       push    esi
-       mov     ebx,            esp
-       mov     esi,            DWORD PTR 36[esp]
-       mov     edi,            DWORD PTR 40[esp]
-       ; getting encrypt flag from parameter 7
-       mov     ecx,            DWORD PTR 64[esp]
-       ; get and push parameter 5
-       mov     eax,            DWORD PTR 56[esp]
-       push    eax
-       ; get and push parameter 4
-       mov     eax,            DWORD PTR 56[esp]
-       push    eax
-       ; get and push parameter 3
-       mov     eax,            DWORD PTR 56[esp]
-       push    eax
-       push    ebx
-       cmp     ecx,            0
-       jz      $L028decrypt
-       and     ebp,            4294967288
-       mov     eax,            DWORD PTR 16[esp]
-       mov     ebx,            DWORD PTR 20[esp]
-       jz      $L029encrypt_finish
-L030encrypt_loop:
-       mov     ecx,            DWORD PTR [esi]
-       mov     edx,            DWORD PTR 4[esi]
-       xor     eax,            ecx
-       xor     ebx,            edx
-       mov     DWORD PTR 16[esp],eax
-       mov     DWORD PTR 20[esp],ebx
-       call    _des_encrypt3
-       mov     eax,            DWORD PTR 16[esp]
-       mov     ebx,            DWORD PTR 20[esp]
-       mov     DWORD PTR [edi],eax
-       mov     DWORD PTR 4[edi],ebx
-       add     esi,            8
-       add     edi,            8
-       sub     ebp,            8
-       jnz     L030encrypt_loop
-$L029encrypt_finish:
-       mov     ebp,            DWORD PTR 60[esp]
-       and     ebp,            7
-       jz      $L031finish
-       xor     ecx,            ecx
-       xor     edx,            edx
-       mov     ebp,            DWORD PTR $L032cbc_enc_jmp_table[ebp*4]
-       jmp      ebp
-L033ej7:
-       mov     dh,             BYTE PTR 6[esi]
-       shl     edx,            8
-L034ej6:
-       mov     dh,             BYTE PTR 5[esi]
-L035ej5:
-       mov     dl,             BYTE PTR 4[esi]
-L036ej4:
-       mov     ecx,            DWORD PTR [esi]
-       jmp     $L037ejend
-L038ej3:
-       mov     ch,             BYTE PTR 2[esi]
-       shl     ecx,            8
-L039ej2:
-       mov     ch,             BYTE PTR 1[esi]
-L040ej1:
-       mov     cl,             BYTE PTR [esi]
-$L037ejend:
-       xor     eax,            ecx
-       xor     ebx,            edx
-       mov     DWORD PTR 16[esp],eax
-       mov     DWORD PTR 20[esp],ebx
-       call    _des_encrypt3
-       mov     eax,            DWORD PTR 16[esp]
-       mov     ebx,            DWORD PTR 20[esp]
-       mov     DWORD PTR [edi],eax
-       mov     DWORD PTR 4[edi],ebx
-       jmp     $L031finish
-$L028decrypt:
-       and     ebp,            4294967288
-       mov     eax,            DWORD PTR 24[esp]
-       mov     ebx,            DWORD PTR 28[esp]
-       jz      $L041decrypt_finish
-L042decrypt_loop:
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-       mov     DWORD PTR 16[esp],eax
-       mov     DWORD PTR 20[esp],ebx
-       call    _des_decrypt3
-       mov     eax,            DWORD PTR 16[esp]
-       mov     ebx,            DWORD PTR 20[esp]
-       mov     ecx,            DWORD PTR 24[esp]
-       mov     edx,            DWORD PTR 28[esp]
-       xor     ecx,            eax
-       xor     edx,            ebx
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-       mov     DWORD PTR [edi],ecx
-       mov     DWORD PTR 4[edi],edx
-       mov     DWORD PTR 24[esp],eax
-       mov     DWORD PTR 28[esp],ebx
-       add     esi,            8
-       add     edi,            8
-       sub     ebp,            8
-       jnz     L042decrypt_loop
-$L041decrypt_finish:
-       mov     ebp,            DWORD PTR 60[esp]
-       and     ebp,            7
-       jz      $L031finish
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-       mov     DWORD PTR 16[esp],eax
-       mov     DWORD PTR 20[esp],ebx
-       call    _des_decrypt3
-       mov     eax,            DWORD PTR 16[esp]
-       mov     ebx,            DWORD PTR 20[esp]
-       mov     ecx,            DWORD PTR 24[esp]
-       mov     edx,            DWORD PTR 28[esp]
-       xor     ecx,            eax
-       xor     edx,            ebx
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-L043dj7:
-       ror     edx,            16
-       mov     BYTE PTR 6[edi],dl
-       shr     edx,            16
-L044dj6:
-       mov     BYTE PTR 5[edi],dh
-L045dj5:
-       mov     BYTE PTR 4[edi],dl
-L046dj4:
-       mov     DWORD PTR [edi],ecx
-       jmp     $L047djend
-L048dj3:
-       ror     ecx,            16
-       mov     BYTE PTR 2[edi],cl
-       shl     ecx,            16
-L049dj2:
-       mov     BYTE PTR 1[esi],ch
-L050dj1:
-       mov     BYTE PTR [esi], cl
-$L047djend:
-       jmp     $L031finish
-$L031finish:
-       mov     ecx,            DWORD PTR 76[esp]
-       add     esp,            32
-       mov     DWORD PTR [ecx],eax
-       mov     DWORD PTR 4[ecx],ebx
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-$L032cbc_enc_jmp_table:
-       DD      0
-       DD      L040ej1
-       DD      L039ej2
-       DD      L038ej3
-       DD      L036ej4
-       DD      L035ej5
-       DD      L034ej6
-       DD      L033ej7
-L051cbc_dec_jmp_table:
-       DD      0
-       DD      L050dj1
-       DD      L049dj2
-       DD      L048dj3
-       DD      L046dj4
-       DD      L045dj5
-       DD      L044dj6
-       DD      L043dj7
-_des_ede3_cbc_encrypt ENDP
-_TEXT  ENDS
-END
index af5c102..e69de29 100644 (file)
@@ -1,929 +0,0 @@
-       ; Don't even think of reading this code
-       ; It was automatically generated by crypt586.pl
-       ; Which is a perl program used to generate the x86 assember for
-       ; any of elf, a.out, BSDI,Win32, or Solaris
-       ; eric <eay@cryptsoft.com>
-       ; 
-       TITLE   crypt586.asm
-        .386
-.model FLAT
-_TEXT  SEGMENT
-PUBLIC _fcrypt_body
-EXTRN   _des_SPtrans:DWORD
-_fcrypt_body PROC NEAR
-       push    ebp
-       push    ebx
-       push    esi
-       push    edi
-       ; 
-       ; Load the 2 words
-       xor     edi,            edi
-       xor     esi,            esi
-       mov     ebp,            DWORD PTR 24[esp]
-       push    25
-L000start:
-       ; 
-       ; Round 0
-       mov     eax,            DWORD PTR 32[esp]
-       mov     edx,            esi
-       shr     edx,            16
-       mov     ecx,            DWORD PTR 36[esp]
-       xor     edx,            esi
-       and     eax,            edx
-       and     edx,            ecx
-       mov     ebx,            eax
-       shl     ebx,            16
-       mov     ecx,            edx
-       shl     ecx,            16
-       xor     eax,            ebx
-       xor     edx,            ecx
-       mov     ebx,            DWORD PTR [ebp]
-       xor     eax,            ebx
-       mov     ecx,            DWORD PTR 4[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       xor     edx,            ecx
-       and     eax,            0fcfcfcfch
-       xor     ebx,            ebx
-       and     edx,            0cfcfcfcfh
-       xor     ecx,            ecx
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 1
-       mov     eax,            DWORD PTR 32[esp]
-       mov     edx,            edi
-       shr     edx,            16
-       mov     ecx,            DWORD PTR 36[esp]
-       xor     edx,            edi
-       and     eax,            edx
-       and     edx,            ecx
-       mov     ebx,            eax
-       shl     ebx,            16
-       mov     ecx,            edx
-       shl     ecx,            16
-       xor     eax,            ebx
-       xor     edx,            ecx
-       mov     ebx,            DWORD PTR 8[ebp]
-       xor     eax,            ebx
-       mov     ecx,            DWORD PTR 12[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       xor     edx,            ecx
-       and     eax,            0fcfcfcfch
-       xor     ebx,            ebx
-       and     edx,            0cfcfcfcfh
-       xor     ecx,            ecx
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 2
-       mov     eax,            DWORD PTR 32[esp]
-       mov     edx,            esi
-       shr     edx,            16
-       mov     ecx,            DWORD PTR 36[esp]
-       xor     edx,            esi
-       and     eax,            edx
-       and     edx,            ecx
-       mov     ebx,            eax
-       shl     ebx,            16
-       mov     ecx,            edx
-       shl     ecx,            16
-       xor     eax,            ebx
-       xor     edx,            ecx
-       mov     ebx,            DWORD PTR 16[ebp]
-       xor     eax,            ebx
-       mov     ecx,            DWORD PTR 20[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       xor     edx,            ecx
-       and     eax,            0fcfcfcfch
-       xor     ebx,            ebx
-       and     edx,            0cfcfcfcfh
-       xor     ecx,            ecx
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 3
-       mov     eax,            DWORD PTR 32[esp]
-       mov     edx,            edi
-       shr     edx,            16
-       mov     ecx,            DWORD PTR 36[esp]
-       xor     edx,            edi
-       and     eax,            edx
-       and     edx,            ecx
-       mov     ebx,            eax
-       shl     ebx,            16
-       mov     ecx,            edx
-       shl     ecx,            16
-       xor     eax,            ebx
-       xor     edx,            ecx
-       mov     ebx,            DWORD PTR 24[ebp]
-       xor     eax,            ebx
-       mov     ecx,            DWORD PTR 28[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       xor     edx,            ecx
-       and     eax,            0fcfcfcfch
-       xor     ebx,            ebx
-       and     edx,            0cfcfcfcfh
-       xor     ecx,            ecx
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 4
-       mov     eax,            DWORD PTR 32[esp]
-       mov     edx,            esi
-       shr     edx,            16
-       mov     ecx,            DWORD PTR 36[esp]
-       xor     edx,            esi
-       and     eax,            edx
-       and     edx,            ecx
-       mov     ebx,            eax
-       shl     ebx,            16
-       mov     ecx,            edx
-       shl     ecx,            16
-       xor     eax,            ebx
-       xor     edx,            ecx
-       mov     ebx,            DWORD PTR 32[ebp]
-       xor     eax,            ebx
-       mov     ecx,            DWORD PTR 36[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       xor     edx,            ecx
-       and     eax,            0fcfcfcfch
-       xor     ebx,            ebx
-       and     edx,            0cfcfcfcfh
-       xor     ecx,            ecx
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 5
-       mov     eax,            DWORD PTR 32[esp]
-       mov     edx,            edi
-       shr     edx,            16
-       mov     ecx,            DWORD PTR 36[esp]
-       xor     edx,            edi
-       and     eax,            edx
-       and     edx,            ecx
-       mov     ebx,            eax
-       shl     ebx,            16
-       mov     ecx,            edx
-       shl     ecx,            16
-       xor     eax,            ebx
-       xor     edx,            ecx
-       mov     ebx,            DWORD PTR 40[ebp]
-       xor     eax,            ebx
-       mov     ecx,            DWORD PTR 44[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       xor     edx,            ecx
-       and     eax,            0fcfcfcfch
-       xor     ebx,            ebx
-       and     edx,            0cfcfcfcfh
-       xor     ecx,            ecx
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 6
-       mov     eax,            DWORD PTR 32[esp]
-       mov     edx,            esi
-       shr     edx,            16
-       mov     ecx,            DWORD PTR 36[esp]
-       xor     edx,            esi
-       and     eax,            edx
-       and     edx,            ecx
-       mov     ebx,            eax
-       shl     ebx,            16
-       mov     ecx,            edx
-       shl     ecx,            16
-       xor     eax,            ebx
-       xor     edx,            ecx
-       mov     ebx,            DWORD PTR 48[ebp]
-       xor     eax,            ebx
-       mov     ecx,            DWORD PTR 52[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       xor     edx,            ecx
-       and     eax,            0fcfcfcfch
-       xor     ebx,            ebx
-       and     edx,            0cfcfcfcfh
-       xor     ecx,            ecx
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 7
-       mov     eax,            DWORD PTR 32[esp]
-       mov     edx,            edi
-       shr     edx,            16
-       mov     ecx,            DWORD PTR 36[esp]
-       xor     edx,            edi
-       and     eax,            edx
-       and     edx,            ecx
-       mov     ebx,            eax
-       shl     ebx,            16
-       mov     ecx,            edx
-       shl     ecx,            16
-       xor     eax,            ebx
-       xor     edx,            ecx
-       mov     ebx,            DWORD PTR 56[ebp]
-       xor     eax,            ebx
-       mov     ecx,            DWORD PTR 60[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       xor     edx,            ecx
-       and     eax,            0fcfcfcfch
-       xor     ebx,            ebx
-       and     edx,            0cfcfcfcfh
-       xor     ecx,            ecx
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 8
-       mov     eax,            DWORD PTR 32[esp]
-       mov     edx,            esi
-       shr     edx,            16
-       mov     ecx,            DWORD PTR 36[esp]
-       xor     edx,            esi
-       and     eax,            edx
-       and     edx,            ecx
-       mov     ebx,            eax
-       shl     ebx,            16
-       mov     ecx,            edx
-       shl     ecx,            16
-       xor     eax,            ebx
-       xor     edx,            ecx
-       mov     ebx,            DWORD PTR 64[ebp]
-       xor     eax,            ebx
-       mov     ecx,            DWORD PTR 68[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       xor     edx,            ecx
-       and     eax,            0fcfcfcfch
-       xor     ebx,            ebx
-       and     edx,            0cfcfcfcfh
-       xor     ecx,            ecx
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 9
-       mov     eax,            DWORD PTR 32[esp]
-       mov     edx,            edi
-       shr     edx,            16
-       mov     ecx,            DWORD PTR 36[esp]
-       xor     edx,            edi
-       and     eax,            edx
-       and     edx,            ecx
-       mov     ebx,            eax
-       shl     ebx,            16
-       mov     ecx,            edx
-       shl     ecx,            16
-       xor     eax,            ebx
-       xor     edx,            ecx
-       mov     ebx,            DWORD PTR 72[ebp]
-       xor     eax,            ebx
-       mov     ecx,            DWORD PTR 76[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       xor     edx,            ecx
-       and     eax,            0fcfcfcfch
-       xor     ebx,            ebx
-       and     edx,            0cfcfcfcfh
-       xor     ecx,            ecx
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 10
-       mov     eax,            DWORD PTR 32[esp]
-       mov     edx,            esi
-       shr     edx,            16
-       mov     ecx,            DWORD PTR 36[esp]
-       xor     edx,            esi
-       and     eax,            edx
-       and     edx,            ecx
-       mov     ebx,            eax
-       shl     ebx,            16
-       mov     ecx,            edx
-       shl     ecx,            16
-       xor     eax,            ebx
-       xor     edx,            ecx
-       mov     ebx,            DWORD PTR 80[ebp]
-       xor     eax,            ebx
-       mov     ecx,            DWORD PTR 84[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       xor     edx,            ecx
-       and     eax,            0fcfcfcfch
-       xor     ebx,            ebx
-       and     edx,            0cfcfcfcfh
-       xor     ecx,            ecx
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 11
-       mov     eax,            DWORD PTR 32[esp]
-       mov     edx,            edi
-       shr     edx,            16
-       mov     ecx,            DWORD PTR 36[esp]
-       xor     edx,            edi
-       and     eax,            edx
-       and     edx,            ecx
-       mov     ebx,            eax
-       shl     ebx,            16
-       mov     ecx,            edx
-       shl     ecx,            16
-       xor     eax,            ebx
-       xor     edx,            ecx
-       mov     ebx,            DWORD PTR 88[ebp]
-       xor     eax,            ebx
-       mov     ecx,            DWORD PTR 92[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       xor     edx,            ecx
-       and     eax,            0fcfcfcfch
-       xor     ebx,            ebx
-       and     edx,            0cfcfcfcfh
-       xor     ecx,            ecx
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 12
-       mov     eax,            DWORD PTR 32[esp]
-       mov     edx,            esi
-       shr     edx,            16
-       mov     ecx,            DWORD PTR 36[esp]
-       xor     edx,            esi
-       and     eax,            edx
-       and     edx,            ecx
-       mov     ebx,            eax
-       shl     ebx,            16
-       mov     ecx,            edx
-       shl     ecx,            16
-       xor     eax,            ebx
-       xor     edx,            ecx
-       mov     ebx,            DWORD PTR 96[ebp]
-       xor     eax,            ebx
-       mov     ecx,            DWORD PTR 100[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       xor     edx,            ecx
-       and     eax,            0fcfcfcfch
-       xor     ebx,            ebx
-       and     edx,            0cfcfcfcfh
-       xor     ecx,            ecx
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 13
-       mov     eax,            DWORD PTR 32[esp]
-       mov     edx,            edi
-       shr     edx,            16
-       mov     ecx,            DWORD PTR 36[esp]
-       xor     edx,            edi
-       and     eax,            edx
-       and     edx,            ecx
-       mov     ebx,            eax
-       shl     ebx,            16
-       mov     ecx,            edx
-       shl     ecx,            16
-       xor     eax,            ebx
-       xor     edx,            ecx
-       mov     ebx,            DWORD PTR 104[ebp]
-       xor     eax,            ebx
-       mov     ecx,            DWORD PTR 108[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       xor     edx,            ecx
-       and     eax,            0fcfcfcfch
-       xor     ebx,            ebx
-       and     edx,            0cfcfcfcfh
-       xor     ecx,            ecx
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 14
-       mov     eax,            DWORD PTR 32[esp]
-       mov     edx,            esi
-       shr     edx,            16
-       mov     ecx,            DWORD PTR 36[esp]
-       xor     edx,            esi
-       and     eax,            edx
-       and     edx,            ecx
-       mov     ebx,            eax
-       shl     ebx,            16
-       mov     ecx,            edx
-       shl     ecx,            16
-       xor     eax,            ebx
-       xor     edx,            ecx
-       mov     ebx,            DWORD PTR 112[ebp]
-       xor     eax,            ebx
-       mov     ecx,            DWORD PTR 116[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       xor     edx,            ecx
-       and     eax,            0fcfcfcfch
-       xor     ebx,            ebx
-       and     edx,            0cfcfcfcfh
-       xor     ecx,            ecx
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 15
-       mov     eax,            DWORD PTR 32[esp]
-       mov     edx,            edi
-       shr     edx,            16
-       mov     ecx,            DWORD PTR 36[esp]
-       xor     edx,            edi
-       and     eax,            edx
-       and     edx,            ecx
-       mov     ebx,            eax
-       shl     ebx,            16
-       mov     ecx,            edx
-       shl     ecx,            16
-       xor     eax,            ebx
-       xor     edx,            ecx
-       mov     ebx,            DWORD PTR 120[ebp]
-       xor     eax,            ebx
-       mov     ecx,            DWORD PTR 124[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       xor     edx,            ecx
-       and     eax,            0fcfcfcfch
-       xor     ebx,            ebx
-       and     edx,            0cfcfcfcfh
-       xor     ecx,            ecx
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR [esp]
-       mov     eax,            edi
-       dec     ebx
-       mov     edi,            esi
-       mov     esi,            eax
-       mov     DWORD PTR [esp],ebx
-       jnz     L000start
-       ; 
-       ; FP
-       mov     edx,            DWORD PTR 24[esp]
-       ror     edi,            1
-       mov     eax,            esi
-       xor     esi,            edi
-       and     esi,            0aaaaaaaah
-       xor     eax,            esi
-       xor     edi,            esi
-       ; 
-       rol     eax,            23
-       mov     esi,            eax
-       xor     eax,            edi
-       and     eax,            003fc03fch
-       xor     esi,            eax
-       xor     edi,            eax
-       ; 
-       rol     esi,            10
-       mov     eax,            esi
-       xor     esi,            edi
-       and     esi,            033333333h
-       xor     eax,            esi
-       xor     edi,            esi
-       ; 
-       rol     edi,            18
-       mov     esi,            edi
-       xor     edi,            eax
-       and     edi,            0fff0000fh
-       xor     esi,            edi
-       xor     eax,            edi
-       ; 
-       rol     esi,            12
-       mov     edi,            esi
-       xor     esi,            eax
-       and     esi,            0f0f0f0f0h
-       xor     edi,            esi
-       xor     eax,            esi
-       ; 
-       ror     eax,            4
-       mov     DWORD PTR [edx],eax
-       mov     DWORD PTR 4[edx],edi
-       pop     ecx
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-_fcrypt_body ENDP
-_TEXT  ENDS
-END
index 91d7153..0197489 100644 (file)
@@ -58,6 +58,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #ifndef MSDOS
 #ifndef VMS
 #include <openssl/opensslconf.h>
@@ -69,7 +70,7 @@
 #include <math.h>
 #endif /* __DECC */
 #endif /* VMS */
-#else
+#else /* MSDOS */
 #include <io.h>
 #endif
 
 #include <openssl/des.h>
 #include <openssl/rand.h>
 
-#if defined(__STDC__) || defined(VMS) || defined(M_XENIX) || defined(MSDOS)
-#include <string.h>
-#endif
-
 void usage(void);
 void doencryption(void);
 int uufwrite(unsigned char *data, int size, unsigned int num, FILE *fp);
index 98a9c41..ead6798 100644 (file)
@@ -78,10 +78,7 @@ extern "C" {
 typedef unsigned char des_cblock[8];
 typedef /* const */ unsigned char const_des_cblock[8];
 /* With "const", gcc 2.8.1 on Solaris thinks that des_cblock *
- * and const_des_cblock * are incompatible pointer types.
- * I haven't seen that warning on other systems ... I'll look
- * what the standard says. */
-
+ * and const_des_cblock * are incompatible pointer types. */
 
 typedef struct des_ks_struct
        {
@@ -141,8 +138,26 @@ void des_cfb_encrypt(const unsigned char *in,unsigned char *out,int numbits,
                     int enc);
 void des_ecb_encrypt(const_des_cblock *input,des_cblock *output,
                     des_key_schedule ks,int enc);
+
+/*     This is the DES encryption function that gets called by just about
+       every other DES routine in the library.  You should not use this
+       function except to implement 'modes' of DES.  I say this because the
+       functions that call this routine do the conversion from 'char *' to
+       long, and this needs to be done to make sure 'non-aligned' memory
+       access do not occur.  The characters are loaded 'little endian'.
+       Data is a pointer to 2 unsigned long's and ks is the
+       des_key_schedule to use.  enc, is non zero specifies encryption,
+       zero if decryption. */
 void des_encrypt(DES_LONG *data,des_key_schedule ks, int enc);
+
+/*     This functions is the same as des_encrypt() except that the DES
+       initial permutation (IP) and final permutation (FP) have been left
+       out.  As for des_encrypt(), you should not use this function.
+       It is used by the routines in the library that implement triple DES.
+       IP() des_encrypt2() des_encrypt2() des_encrypt2() FP() is the same
+       as des_encrypt() des_encrypt() des_encrypt() except faster :-). */
 void des_encrypt2(DES_LONG *data,des_key_schedule ks, int enc);
+
 void des_encrypt3(DES_LONG *data, des_key_schedule ks1,
        des_key_schedule ks2, des_key_schedule ks3);
 void des_decrypt3(DES_LONG *data, des_key_schedule ks1,
@@ -192,6 +207,7 @@ int des_read_2passwords(des_cblock *key1,des_cblock *key2,
                        const char *prompt,int verify);
 int des_read_pw_string(char *buf,int length,const char *prompt,int verify);
 void des_set_odd_parity(des_cblock *key);
+int des_check_key_parity(const_des_cblock *key);
 int des_is_weak_key(const_des_cblock *key);
 /* des_set_key (= set_key = des_key_sched = key_sched) calls
  * des_set_key_checked if global variable des_check_key is set,
@@ -209,9 +225,6 @@ void des_ofb64_encrypt(const unsigned char *in,unsigned char *out,long length,
                       des_key_schedule schedule,des_cblock *ivec,int *num);
 int des_read_pw(char *buf,char *buff,int size,const char *prompt,int verify);
 
-/* Extra functions from Mark Murray <mark@grondar.za> */
-void des_cblock_print_file(const_des_cblock *cb, FILE *fp);
-
 /* The following definitions provide compatibility with the MIT Kerberos
  * library. The des_key_schedule structure is not binary compatible. */
 
@@ -241,11 +254,11 @@ void des_cblock_print_file(const_des_cblock *cb, FILE *fp);
 #  define xcbc_encrypt des_xcbc_encrypt
 #  define cbc_cksum des_cbc_cksum
 #  define quad_cksum des_quad_cksum
+#  define check_parity des_check_key_parity
 #endif
 
 typedef des_key_schedule bit_64;
 #define des_fixup_key_parity des_set_odd_parity
-#define des_check_key_parity check_parity
 
 #ifdef  __cplusplus
 }
index 7e06a18..e69de29 100644 (file)
@@ -1,186 +0,0 @@
-.TH DES 1 
-.SH NAME
-des - encrypt or decrypt data using Data Encryption Standard
-.SH SYNOPSIS
-.B des
-(
-.B \-e
-|
-.B \-E
-) | (
-.B \-d
-|
-.B \-D
-) | (
-.B \-\fR[\fPcC\fR][\fPckname\fR]\fP
-) |
-[
-.B \-b3hfs
-] [
-.B \-k
-.I key
-]
-] [
-.B \-u\fR[\fIuuname\fR]
-[
-.I input-file
-[
-.I output-file
-] ]
-.SH DESCRIPTION
-.B des
-encrypts and decrypts data using the
-Data Encryption Standard algorithm.
-One of
-.B \-e, \-E
-(for encrypt) or
-.B \-d, \-D
-(for decrypt) must be specified.
-It is also possible to use
-.B \-c
-or
-.B \-C
-in conjunction or instead of the a encrypt/decrypt option to generate
-a 16 character hexadecimal checksum, generated via the
-.I des_cbc_cksum.
-.LP
-Two standard encryption modes are supported by the
-.B des
-program, Cipher Block Chaining (the default) and Electronic Code Book
-(specified with
-.B \-b
-).
-.LP
-The key used for the DES
-algorithm is obtained by prompting the user unless the
-.B `\-k
-.I key'
-option is given.
-If the key is an argument to the
-.B des
-command, it is potentially visible to users executing
-.BR ps (1)
-or a derivative.  To minimise this possibility,
-.B des
-takes care to destroy the key argument immediately upon entry.
-If your shell keeps a history file be careful to make sure it is not
-world readable.
-.LP
-Since this program attempts to maintain compatability with sunOS's
-des(1) command, there are 2 different methods used to convert the user
-supplied key to a des key.
-Whenever and one or more of
-.B \-E, \-D, \-C
-or
-.B \-3
-options are used, the key conversion procedure will not be compatible
-with the sunOS des(1) version but will use all the user supplied
-character to generate the des key.
-.B des
-command reads from standard input unless
-.I input-file
-is specified and writes to standard output unless
-.I output-file
-is given.
-.SH OPTIONS
-.TP
-.B \-b
-Select ECB
-(eight bytes at a time) encryption mode.
-.TP
-.B \-3
-Encrypt using triple encryption.
-By default triple cbc encryption is used but if the
-.B \-b
-option is used then triple ecb encryption is performed.
-If the key is less than 8 characters long, the flag has no effect.
-.TP
-.B \-e
-Encrypt data using an 8 byte key in a manner compatible with sunOS
-des(1).
-.TP
-.B \-E
-Encrypt data using a key of nearly unlimited length (1024 bytes).
-This will product a more secure encryption.
-.TP
-.B \-d
-Decrypt data that was encrypted with the \-e option.
-.TP
-.B \-D
-Decrypt data that was encrypted with the \-E option.
-.TP
-.B \-c
-Generate a 16 character hexadecimal cbc checksum and output this to
-stderr.
-If a filename was specified after the
-.B \-c
-option, the checksum is output to that file.
-The checksum is generated using a key generated in a sunOS compatible
-manner.
-.TP
-.B \-C
-A cbc checksum is generated in the same manner as described for the
-.B \-c
-option but the DES key is generated in the same manner as used for the
-.B \-E
-and
-.B \-D
-options
-.TP
-.B \-f
-Does nothing - allowed for compatibility with sunOS des(1) command.
-.TP
-.B \-s
-Does nothing - allowed for compatibility with sunOS des(1) command.
-.TP
-.B "\-k \fIkey\fP"
-Use the encryption 
-.I key
-specified.
-.TP
-.B "\-h"
-The
-.I key
-is assumed to be a 16 character hexadecimal number.
-If the
-.B "\-3"
-option is used the key is assumed to be a 32 character hexadecimal
-number.
-.TP
-.B \-u
-This flag is used to read and write uuencoded files.  If decrypting,
-the input file is assumed to contain uuencoded, DES encrypted data.
-If encrypting, the characters following the -u are used as the name of
-the uuencoded file to embed in the begin line of the uuencoded
-output.  If there is no name specified after the -u, the name text.des
-will be embedded in the header.
-.SH SEE ALSO
-.B ps (1)
-.B des_crypt(3)
-.SH BUGS
-.LP
-The problem with using the
-.B -e
-option is the short key length.
-It would be better to use a real 56-bit key rather than an
-ASCII-based 56-bit pattern.  Knowing that the key was derived from ASCII
-radically reduces the time necessary for a brute-force cryptographic attack.
-My attempt to remove this problem is to add an alternative text-key to
-DES-key function.  This alternative function (accessed via
-.B -E, -D, -S
-and
-.B -3
-)
-uses DES to help generate the key.
-.LP
-Be carefully when using the -u option.  Doing des -ud <filename> will
-not decrypt filename (the -u option will gobble the d option).
-.LP
-The VMS operating system operates in a world where files are always a
-multiple of 512 bytes.  This causes problems when encrypted data is
-send from unix to VMS since a 88 byte file will suddenly be padded
-with 424 null bytes.  To get around this problem, use the -u option
-to uuencode the data before it is send to the VMS system.
-.SH AUTHOR
-.LP
-Eric Young (eay@cryptsoft.com)
index 8a3f7e3..e69de29 100644 (file)
@@ -1,552 +0,0 @@
-#!/usr/local/bin/perl
-# des.pl - eric young 22/11/1991 eay@cryptsoft.com
-#
-# Copyright (C) 1993 Eric Young
-#
-# 11 April 1996 - patched to circumvent Perl 5 (through 5.002) problem
-#                 with sign-extension on right shift operations.
-#                 Ed Kubaitis - ejk@uiuc.edu
-#
-# eay - 92/08/31 - I think I have fixed all problems for 64bit
-# versions of perl but I could be wrong since I have not tested it yet :-).
-#
-# This is an implementation of DES in perl.
-# The two routines (des_set_key and des_ecb_encrypt)
-# take 8 byte objects as arguments.
-#
-# des_set_key takes an 8 byte string as a key and returns a key schedule
-# for use in calls to des_ecb_encrypt.
-# des_ecb_encrypt takes three arguments, the first is a key schedule
-# (make sure to pass it by reference with the *), the second is 1
-# to encrypt, 0 to decrypt.  The third argument is an 8 byte object
-# to encrypt.  The function returns an 8 byte object that has been
-# DES encrypted.
-#
-# example:
-# require 'des.pl'
-#
-# $key =pack("C8",0x12,0x23,0x45,0x67,0x89,0xab,0xcd,0xef);
-# @ks=  &des_set_key($key);
-#
-# $outbytes= &des_ecb_encrypt(*ks,1,$data);
-# @enc =unpack("C8",$outbytes);
-#
-                 
-package des;
-
-eval("use integer;") if (int($]) > 4);
-
-# The following 8 arrays are used in des_set_key
-@skb0=(
-# for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 
-0x00000000,0x00000010,0x20000000,0x20000010,
-0x00010000,0x00010010,0x20010000,0x20010010,
-0x00000800,0x00000810,0x20000800,0x20000810,
-0x00010800,0x00010810,0x20010800,0x20010810,
-0x00000020,0x00000030,0x20000020,0x20000030,
-0x00010020,0x00010030,0x20010020,0x20010030,
-0x00000820,0x00000830,0x20000820,0x20000830,
-0x00010820,0x00010830,0x20010820,0x20010830,
-0x00080000,0x00080010,0x20080000,0x20080010,
-0x00090000,0x00090010,0x20090000,0x20090010,
-0x00080800,0x00080810,0x20080800,0x20080810,
-0x00090800,0x00090810,0x20090800,0x20090810,
-0x00080020,0x00080030,0x20080020,0x20080030,
-0x00090020,0x00090030,0x20090020,0x20090030,
-0x00080820,0x00080830,0x20080820,0x20080830,
-0x00090820,0x00090830,0x20090820,0x20090830,
-);
-@skb1=(
-# for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 
-0x00000000,0x02000000,0x00002000,0x02002000,
-0x00200000,0x02200000,0x00202000,0x02202000,
-0x00000004,0x02000004,0x00002004,0x02002004,
-0x00200004,0x02200004,0x00202004,0x02202004,
-0x00000400,0x02000400,0x00002400,0x02002400,
-0x00200400,0x02200400,0x00202400,0x02202400,
-0x00000404,0x02000404,0x00002404,0x02002404,
-0x00200404,0x02200404,0x00202404,0x02202404,
-0x10000000,0x12000000,0x10002000,0x12002000,
-0x10200000,0x12200000,0x10202000,0x12202000,
-0x10000004,0x12000004,0x10002004,0x12002004,
-0x10200004,0x12200004,0x10202004,0x12202004,
-0x10000400,0x12000400,0x10002400,0x12002400,
-0x10200400,0x12200400,0x10202400,0x12202400,
-0x10000404,0x12000404,0x10002404,0x12002404,
-0x10200404,0x12200404,0x10202404,0x12202404,
-);
-@skb2=(
-# for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 
-0x00000000,0x00000001,0x00040000,0x00040001,
-0x01000000,0x01000001,0x01040000,0x01040001,
-0x00000002,0x00000003,0x00040002,0x00040003,
-0x01000002,0x01000003,0x01040002,0x01040003,
-0x00000200,0x00000201,0x00040200,0x00040201,
-0x01000200,0x01000201,0x01040200,0x01040201,
-0x00000202,0x00000203,0x00040202,0x00040203,
-0x01000202,0x01000203,0x01040202,0x01040203,
-0x08000000,0x08000001,0x08040000,0x08040001,
-0x09000000,0x09000001,0x09040000,0x09040001,
-0x08000002,0x08000003,0x08040002,0x08040003,
-0x09000002,0x09000003,0x09040002,0x09040003,
-0x08000200,0x08000201,0x08040200,0x08040201,
-0x09000200,0x09000201,0x09040200,0x09040201,
-0x08000202,0x08000203,0x08040202,0x08040203,
-0x09000202,0x09000203,0x09040202,0x09040203,
-);
-@skb3=(
-# for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 
-0x00000000,0x00100000,0x00000100,0x00100100,
-0x00000008,0x00100008,0x00000108,0x00100108,
-0x00001000,0x00101000,0x00001100,0x00101100,
-0x00001008,0x00101008,0x00001108,0x00101108,
-0x04000000,0x04100000,0x04000100,0x04100100,
-0x04000008,0x04100008,0x04000108,0x04100108,
-0x04001000,0x04101000,0x04001100,0x04101100,
-0x04001008,0x04101008,0x04001108,0x04101108,
-0x00020000,0x00120000,0x00020100,0x00120100,
-0x00020008,0x00120008,0x00020108,0x00120108,
-0x00021000,0x00121000,0x00021100,0x00121100,
-0x00021008,0x00121008,0x00021108,0x00121108,
-0x04020000,0x04120000,0x04020100,0x04120100,
-0x04020008,0x04120008,0x04020108,0x04120108,
-0x04021000,0x04121000,0x04021100,0x04121100,
-0x04021008,0x04121008,0x04021108,0x04121108,
-);
-@skb4=(
-# for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 
-0x00000000,0x10000000,0x00010000,0x10010000,
-0x00000004,0x10000004,0x00010004,0x10010004,
-0x20000000,0x30000000,0x20010000,0x30010000,
-0x20000004,0x30000004,0x20010004,0x30010004,
-0x00100000,0x10100000,0x00110000,0x10110000,
-0x00100004,0x10100004,0x00110004,0x10110004,
-0x20100000,0x30100000,0x20110000,0x30110000,
-0x20100004,0x30100004,0x20110004,0x30110004,
-0x00001000,0x10001000,0x00011000,0x10011000,
-0x00001004,0x10001004,0x00011004,0x10011004,
-0x20001000,0x30001000,0x20011000,0x30011000,
-0x20001004,0x30001004,0x20011004,0x30011004,
-0x00101000,0x10101000,0x00111000,0x10111000,
-0x00101004,0x10101004,0x00111004,0x10111004,
-0x20101000,0x30101000,0x20111000,0x30111000,
-0x20101004,0x30101004,0x20111004,0x30111004,
-);
-@skb5=(
-# for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 
-0x00000000,0x08000000,0x00000008,0x08000008,
-0x00000400,0x08000400,0x00000408,0x08000408,
-0x00020000,0x08020000,0x00020008,0x08020008,
-0x00020400,0x08020400,0x00020408,0x08020408,
-0x00000001,0x08000001,0x00000009,0x08000009,
-0x00000401,0x08000401,0x00000409,0x08000409,
-0x00020001,0x08020001,0x00020009,0x08020009,
-0x00020401,0x08020401,0x00020409,0x08020409,
-0x02000000,0x0A000000,0x02000008,0x0A000008,
-0x02000400,0x0A000400,0x02000408,0x0A000408,
-0x02020000,0x0A020000,0x02020008,0x0A020008,
-0x02020400,0x0A020400,0x02020408,0x0A020408,
-0x02000001,0x0A000001,0x02000009,0x0A000009,
-0x02000401,0x0A000401,0x02000409,0x0A000409,
-0x02020001,0x0A020001,0x02020009,0x0A020009,
-0x02020401,0x0A020401,0x02020409,0x0A020409,
-);
-@skb6=(
-# for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 
-0x00000000,0x00000100,0x00080000,0x00080100,
-0x01000000,0x01000100,0x01080000,0x01080100,
-0x00000010,0x00000110,0x00080010,0x00080110,
-0x01000010,0x01000110,0x01080010,0x01080110,
-0x00200000,0x00200100,0x00280000,0x00280100,
-0x01200000,0x01200100,0x01280000,0x01280100,
-0x00200010,0x00200110,0x00280010,0x00280110,
-0x01200010,0x01200110,0x01280010,0x01280110,
-0x00000200,0x00000300,0x00080200,0x00080300,
-0x01000200,0x01000300,0x01080200,0x01080300,
-0x00000210,0x00000310,0x00080210,0x00080310,
-0x01000210,0x01000310,0x01080210,0x01080310,
-0x00200200,0x00200300,0x00280200,0x00280300,
-0x01200200,0x01200300,0x01280200,0x01280300,
-0x00200210,0x00200310,0x00280210,0x00280310,
-0x01200210,0x01200310,0x01280210,0x01280310,
-);
-@skb7=(
-# for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 
-0x00000000,0x04000000,0x00040000,0x04040000,
-0x00000002,0x04000002,0x00040002,0x04040002,
-0x00002000,0x04002000,0x00042000,0x04042000,
-0x00002002,0x04002002,0x00042002,0x04042002,
-0x00000020,0x04000020,0x00040020,0x04040020,
-0x00000022,0x04000022,0x00040022,0x04040022,
-0x00002020,0x04002020,0x00042020,0x04042020,
-0x00002022,0x04002022,0x00042022,0x04042022,
-0x00000800,0x04000800,0x00040800,0x04040800,
-0x00000802,0x04000802,0x00040802,0x04040802,
-0x00002800,0x04002800,0x00042800,0x04042800,
-0x00002802,0x04002802,0x00042802,0x04042802,
-0x00000820,0x04000820,0x00040820,0x04040820,
-0x00000822,0x04000822,0x00040822,0x04040822,
-0x00002820,0x04002820,0x00042820,0x04042820,
-0x00002822,0x04002822,0x00042822,0x04042822,
-);
-
-@shifts2=(0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0);
-
-# used in ecb_encrypt
-@SP0=(
-0x00410100, 0x00010000, 0x40400000, 0x40410100,
-0x00400000, 0x40010100, 0x40010000, 0x40400000,
-0x40010100, 0x00410100, 0x00410000, 0x40000100,
-0x40400100, 0x00400000, 0x00000000, 0x40010000,
-0x00010000, 0x40000000, 0x00400100, 0x00010100,
-0x40410100, 0x00410000, 0x40000100, 0x00400100,
-0x40000000, 0x00000100, 0x00010100, 0x40410000,
-0x00000100, 0x40400100, 0x40410000, 0x00000000,
-0x00000000, 0x40410100, 0x00400100, 0x40010000,
-0x00410100, 0x00010000, 0x40000100, 0x00400100,
-0x40410000, 0x00000100, 0x00010100, 0x40400000,
-0x40010100, 0x40000000, 0x40400000, 0x00410000,
-0x40410100, 0x00010100, 0x00410000, 0x40400100,
-0x00400000, 0x40000100, 0x40010000, 0x00000000,
-0x00010000, 0x00400000, 0x40400100, 0x00410100,
-0x40000000, 0x40410000, 0x00000100, 0x40010100,
-);
-@SP1=(
-0x08021002, 0x00000000, 0x00021000, 0x08020000,
-0x08000002, 0x00001002, 0x08001000, 0x00021000,
-0x00001000, 0x08020002, 0x00000002, 0x08001000,
-0x00020002, 0x08021000, 0x08020000, 0x00000002,
-0x00020000, 0x08001002, 0x08020002, 0x00001000,
-0x00021002, 0x08000000, 0x00000000, 0x00020002,
-0x08001002, 0x00021002, 0x08021000, 0x08000002,
-0x08000000, 0x00020000, 0x00001002, 0x08021002,
-0x00020002, 0x08021000, 0x08001000, 0x00021002,
-0x08021002, 0x00020002, 0x08000002, 0x00000000,
-0x08000000, 0x00001002, 0x00020000, 0x08020002,
-0x00001000, 0x08000000, 0x00021002, 0x08001002,
-0x08021000, 0x00001000, 0x00000000, 0x08000002,
-0x00000002, 0x08021002, 0x00021000, 0x08020000,
-0x08020002, 0x00020000, 0x00001002, 0x08001000,
-0x08001002, 0x00000002, 0x08020000, 0x00021000,
-);
-@SP2=(
-0x20800000, 0x00808020, 0x00000020, 0x20800020,
-0x20008000, 0x00800000, 0x20800020, 0x00008020,
-0x00800020, 0x00008000, 0x00808000, 0x20000000,
-0x20808020, 0x20000020, 0x20000000, 0x20808000,
-0x00000000, 0x20008000, 0x00808020, 0x00000020,
-0x20000020, 0x20808020, 0x00008000, 0x20800000,
-0x20808000, 0x00800020, 0x20008020, 0x00808000,
-0x00008020, 0x00000000, 0x00800000, 0x20008020,
-0x00808020, 0x00000020, 0x20000000, 0x00008000,
-0x20000020, 0x20008000, 0x00808000, 0x20800020,
-0x00000000, 0x00808020, 0x00008020, 0x20808000,
-0x20008000, 0x00800000, 0x20808020, 0x20000000,
-0x20008020, 0x20800000, 0x00800000, 0x20808020,
-0x00008000, 0x00800020, 0x20800020, 0x00008020,
-0x00800020, 0x00000000, 0x20808000, 0x20000020,
-0x20800000, 0x20008020, 0x00000020, 0x00808000,
-);
-@SP3=(
-0x00080201, 0x02000200, 0x00000001, 0x02080201,
-0x00000000, 0x02080000, 0x02000201, 0x00080001,
-0x02080200, 0x02000001, 0x02000000, 0x00000201,
-0x02000001, 0x00080201, 0x00080000, 0x02000000,
-0x02080001, 0x00080200, 0x00000200, 0x00000001,
-0x00080200, 0x02000201, 0x02080000, 0x00000200,
-0x00000201, 0x00000000, 0x00080001, 0x02080200,
-0x02000200, 0x02080001, 0x02080201, 0x00080000,
-0x02080001, 0x00000201, 0x00080000, 0x02000001,
-0x00080200, 0x02000200, 0x00000001, 0x02080000,
-0x02000201, 0x00000000, 0x00000200, 0x00080001,
-0x00000000, 0x02080001, 0x02080200, 0x00000200,
-0x02000000, 0x02080201, 0x00080201, 0x00080000,
-0x02080201, 0x00000001, 0x02000200, 0x00080201,
-0x00080001, 0x00080200, 0x02080000, 0x02000201,
-0x00000201, 0x02000000, 0x02000001, 0x02080200,
-);
-@SP4=(
-0x01000000, 0x00002000, 0x00000080, 0x01002084,
-0x01002004, 0x01000080, 0x00002084, 0x01002000,
-0x00002000, 0x00000004, 0x01000004, 0x00002080,
-0x01000084, 0x01002004, 0x01002080, 0x00000000,
-0x00002080, 0x01000000, 0x00002004, 0x00000084,
-0x01000080, 0x00002084, 0x00000000, 0x01000004,
-0x00000004, 0x01000084, 0x01002084, 0x00002004,
-0x01002000, 0x00000080, 0x00000084, 0x01002080,
-0x01002080, 0x01000084, 0x00002004, 0x01002000,
-0x00002000, 0x00000004, 0x01000004, 0x01000080,
-0x01000000, 0x00002080, 0x01002084, 0x00000000,
-0x00002084, 0x01000000, 0x00000080, 0x00002004,
-0x01000084, 0x00000080, 0x00000000, 0x01002084,
-0x01002004, 0x01002080, 0x00000084, 0x00002000,
-0x00002080, 0x01002004, 0x01000080, 0x00000084,
-0x00000004, 0x00002084, 0x01002000, 0x01000004,
-);
-@SP5=(
-0x10000008, 0x00040008, 0x00000000, 0x10040400,
-0x00040008, 0x00000400, 0x10000408, 0x00040000,
-0x00000408, 0x10040408, 0x00040400, 0x10000000,
-0x10000400, 0x10000008, 0x10040000, 0x00040408,
-0x00040000, 0x10000408, 0x10040008, 0x00000000,
-0x00000400, 0x00000008, 0x10040400, 0x10040008,
-0x10040408, 0x10040000, 0x10000000, 0x00000408,
-0x00000008, 0x00040400, 0x00040408, 0x10000400,
-0x00000408, 0x10000000, 0x10000400, 0x00040408,
-0x10040400, 0x00040008, 0x00000000, 0x10000400,
-0x10000000, 0x00000400, 0x10040008, 0x00040000,
-0x00040008, 0x10040408, 0x00040400, 0x00000008,
-0x10040408, 0x00040400, 0x00040000, 0x10000408,
-0x10000008, 0x10040000, 0x00040408, 0x00000000,
-0x00000400, 0x10000008, 0x10000408, 0x10040400,
-0x10040000, 0x00000408, 0x00000008, 0x10040008,
-);
-@SP6=(
-0x00000800, 0x00000040, 0x00200040, 0x80200000,
-0x80200840, 0x80000800, 0x00000840, 0x00000000,
-0x00200000, 0x80200040, 0x80000040, 0x00200800,
-0x80000000, 0x00200840, 0x00200800, 0x80000040,
-0x80200040, 0x00000800, 0x80000800, 0x80200840,
-0x00000000, 0x00200040, 0x80200000, 0x00000840,
-0x80200800, 0x80000840, 0x00200840, 0x80000000,
-0x80000840, 0x80200800, 0x00000040, 0x00200000,
-0x80000840, 0x00200800, 0x80200800, 0x80000040,
-0x00000800, 0x00000040, 0x00200000, 0x80200800,
-0x80200040, 0x80000840, 0x00000840, 0x00000000,
-0x00000040, 0x80200000, 0x80000000, 0x00200040,
-0x00000000, 0x80200040, 0x00200040, 0x00000840,
-0x80000040, 0x00000800, 0x80200840, 0x00200000,
-0x00200840, 0x80000000, 0x80000800, 0x80200840,
-0x80200000, 0x00200840, 0x00200800, 0x80000800,
-);
-@SP7=(
-0x04100010, 0x04104000, 0x00004010, 0x00000000,
-0x04004000, 0x00100010, 0x04100000, 0x04104010,
-0x00000010, 0x04000000, 0x00104000, 0x00004010,
-0x00104010, 0x04004010, 0x04000010, 0x04100000,
-0x00004000, 0x00104010, 0x00100010, 0x04004000,
-0x04104010, 0x04000010, 0x00000000, 0x00104000,
-0x04000000, 0x00100000, 0x04004010, 0x04100010,
-0x00100000, 0x00004000, 0x04104000, 0x00000010,
-0x00100000, 0x00004000, 0x04000010, 0x04104010,
-0x00004010, 0x04000000, 0x00000000, 0x00104000,
-0x04100010, 0x04004010, 0x04004000, 0x00100010,
-0x04104000, 0x00000010, 0x00100010, 0x04004000,
-0x04104010, 0x00100000, 0x04100000, 0x04000010,
-0x00104000, 0x00004010, 0x04004010, 0x04100000,
-0x00000010, 0x04104000, 0x00104010, 0x00000000,
-0x04000000, 0x04100010, 0x00004000, 0x00104010,
-);
-
-sub main'des_set_key
-       {
-       local($param)=@_;
-       local(@key);
-       local($c,$d,$i,$s,$t);
-       local(@ks)=();
-
-       # Get the bytes in the order we want.
-       @key=unpack("C8",$param);
-
-       $c=     ($key[0]    )|
-               ($key[1]<< 8)|
-               ($key[2]<<16)|
-               ($key[3]<<24);
-       $d=     ($key[4]    )|
-               ($key[5]<< 8)|
-               ($key[6]<<16)|
-               ($key[7]<<24);
-
-       &doPC1(*c,*d);
-
-       for $i (@shifts2)
-               {
-               if ($i)
-                       {
-                       $c=($c>>2)|($c<<26);
-                       $d=($d>>2)|($d<<26);
-                       }
-               else
-                       {
-                       $c=($c>>1)|($c<<27);
-                       $d=($d>>1)|($d<<27);
-                       }
-               $c&=0x0fffffff;
-               $d&=0x0fffffff;
-               $s=     $skb0[ ($c    )&0x3f                 ]|
-                       $skb1[(($c>> 6)&0x03)|(($c>> 7)&0x3c)]|
-                       $skb2[(($c>>13)&0x0f)|(($c>>14)&0x30)]|
-                       $skb3[(($c>>20)&0x01)|(($c>>21)&0x06) |
-                                            (($c>>22)&0x38)];
-               $t=     $skb4[ ($d    )&0x3f                ]|
-                       $skb5[(($d>> 7)&0x03)|(($d>> 8)&0x3c)]|
-                       $skb6[ ($d>>15)&0x3f                 ]|
-                       $skb7[(($d>>21)&0x0f)|(($d>>22)&0x30)];
-               push(@ks,(($t<<16)|($s&0x0000ffff))&0xffffffff);
-               $s=      (($s>>16)&0x0000ffff)|($t&0xffff0000) ;
-               push(@ks,(($s<<4)|(($s>>28)&0xf))&0xffffffff);
-               }
-       @ks;
-       }
-
-sub doPC1
-       {
-       local(*a,*b)=@_;
-       local($t);
-
-       $t=(($b>>4)^$a)&0x0f0f0f0f;
-       $b^=($t<<4); $a^=$t;
-       # do $a first 
-       $t=(($a<<18)^$a)&0xcccc0000;
-       $a=$a^$t^(($t>>18)&0x00003fff);
-       $t=(($a<<17)^$a)&0xaaaa0000;
-       $a=$a^$t^(($t>>17)&0x00007fff);
-       $t=(($a<< 8)^$a)&0x00ff0000;
-       $a=$a^$t^(($t>> 8)&0x00ffffff);
-       $t=(($a<<17)^$a)&0xaaaa0000;
-       $a=$a^$t^(($t>>17)&0x00007fff);
-
-       # now do $b
-       $t=(($b<<24)^$b)&0xff000000;
-       $b=$b^$t^(($t>>24)&0x000000ff);
-       $t=(($b<< 8)^$b)&0x00ff0000;
-       $b=$b^$t^(($t>> 8)&0x00ffffff);
-       $t=(($b<<14)^$b)&0x33330000;
-       $b=$b^$t^(($t>>14)&0x0003ffff);
-       $b=(($b&0x00aa00aa)<<7)|(($b&0x55005500)>>7)|($b&0xaa55aa55);
-       $b=(($b>>8)&0x00ffffff)|((($a&0xf0000000)>>4)&0x0fffffff);
-       $a&=0x0fffffff;
-       }
-
-sub doIP
-       {
-       local(*a,*b)=@_;
-       local($t);
-
-       $t=(($b>> 4)^$a)&0x0f0f0f0f;
-       $b^=($t<< 4); $a^=$t;
-       $t=(($a>>16)^$b)&0x0000ffff;
-       $a^=($t<<16); $b^=$t;
-       $t=(($b>> 2)^$a)&0x33333333;
-       $b^=($t<< 2); $a^=$t;
-       $t=(($a>> 8)^$b)&0x00ff00ff;
-       $a^=($t<< 8); $b^=$t;
-       $t=(($b>> 1)^$a)&0x55555555;
-       $b^=($t<< 1); $a^=$t;
-       $t=$a;
-       $a=$b&0xffffffff;
-       $b=$t&0xffffffff;
-       }
-
-sub doFP
-       {
-       local(*a,*b)=@_;
-       local($t);
-
-       $t=(($b>> 1)^$a)&0x55555555;
-       $b^=($t<< 1); $a^=$t;
-       $t=(($a>> 8)^$b)&0x00ff00ff;
-       $a^=($t<< 8); $b^=$t;
-       $t=(($b>> 2)^$a)&0x33333333;
-       $b^=($t<< 2); $a^=$t;
-       $t=(($a>>16)^$b)&0x0000ffff;
-       $a^=($t<<16); $b^=$t;
-       $t=(($b>> 4)^$a)&0x0f0f0f0f;
-       $b^=($t<< 4); $a^=$t;
-       $a&=0xffffffff;
-       $b&=0xffffffff;
-       }
-
-sub main'des_ecb_encrypt
-       {
-       local(*ks,$encrypt,$in)=@_;
-       local($l,$r,$i,$t,$u,@input);
-       
-       @input=unpack("C8",$in);
-       # Get the bytes in the order we want.
-       $l=     ($input[0]    )|
-               ($input[1]<< 8)|
-               ($input[2]<<16)|
-               ($input[3]<<24);
-       $r=     ($input[4]    )|
-               ($input[5]<< 8)|
-               ($input[6]<<16)|
-               ($input[7]<<24);
-
-       $l&=0xffffffff;
-       $r&=0xffffffff;
-       &doIP(*l,*r);
-       if ($encrypt)
-               {
-               for ($i=0; $i<32; $i+=4)
-                       {
-                       $t=((($r&0x7fffffff)<<1)|(($r>>31)&0x00000001));
-                       $u=$t^$ks[$i  ];
-                       $t=$t^$ks[$i+1];
-                       $t2=(($t&0x0000000f)<<28);
-
-                       $t=((($t>>4)&0x0fffffff)|(($t&0x0000000f)<<28));
-                       $l^=    $SP1[ $t     &0x3f]|
-                               $SP3[($t>> 8)&0x3f]|
-                               $SP5[($t>>16)&0x3f]|
-                               $SP7[($t>>24)&0x3f]|
-                               $SP0[ $u     &0x3f]|
-                               $SP2[($u>> 8)&0x3f]|
-                               $SP4[($u>>16)&0x3f]|
-                               $SP6[($u>>24)&0x3f];
-
-                       $t=(($l<<1)|(($l>>31)&0x1))&0xffffffff;
-                       $u=$t^$ks[$i+2];
-                       $t=$t^$ks[$i+3];
-                       $t=((($t>>4)&0x0fffffff)|($t<<28))&0xffffffff;
-                       $r^=    $SP1[ $t     &0x3f]|
-                               $SP3[($t>> 8)&0x3f]|
-                               $SP5[($t>>16)&0x3f]|
-                               $SP7[($t>>24)&0x3f]|
-                               $SP0[ $u     &0x3f]|
-                               $SP2[($u>> 8)&0x3f]|
-                               $SP4[($u>>16)&0x3f]|
-                               $SP6[($u>>24)&0x3f];
-                       }
-               }
-       else    
-               {
-               for ($i=30; $i>0; $i-=4)
-                       {
-                       $t=(($r<<1)|(($r>>31)&0x1))&0xffffffff;
-                       $u=$t^$ks[$i  ];
-                       $t=$t^$ks[$i+1];
-                       $t=((($t>>4)&0x0fffffff)|($t<<28))&0xffffffff;
-                       $l^=    $SP1[ $t     &0x3f]|
-                               $SP3[($t>> 8)&0x3f]|
-                               $SP5[($t>>16)&0x3f]|
-                               $SP7[($t>>24)&0x3f]|
-                               $SP0[ $u     &0x3f]|
-                               $SP2[($u>> 8)&0x3f]|
-                               $SP4[($u>>16)&0x3f]|
-                               $SP6[($u>>24)&0x3f];
-
-                       $t=(($l<<1)|(($l>>31)&0x1))&0xffffffff;
-                       $u=$t^$ks[$i-2];
-                       $t=$t^$ks[$i-1];
-                       $t=((($t>>4)&0x0fffffff)|($t<<28))&0xffffffff;
-                       $r^=    $SP1[ $t     &0x3f]|
-                               $SP3[($t>> 8)&0x3f]|
-                               $SP5[($t>>16)&0x3f]|
-                               $SP7[($t>>24)&0x3f]|
-                               $SP0[ $u     &0x3f]|
-                               $SP2[($u>> 8)&0x3f]|
-                               $SP4[($u>>16)&0x3f]|
-                               $SP6[($u>>24)&0x3f];
-                       }
-               }
-       &doFP(*l,*r);
-       pack("C8",$l&0xff, 
-                 ($l>> 8)&0x00ffffff,
-                 ($l>>16)&0x0000ffff,
-                 ($l>>24)&0x000000ff,
-                 $r&0xff,
-                 ($r>> 8)&0x00ffffff,
-                 ($r>>16)&0x0000ffff,
-                 ($r>>24)&0x000000ff);
-       }
diff --git a/lib/libcrypto/des/des.pod b/lib/libcrypto/des/des.pod
new file mode 100644 (file)
index 0000000..bf479e8
--- /dev/null
@@ -0,0 +1,217 @@
+=pod
+
+=head1 NAME
+
+des - encrypt or decrypt data using Data Encryption Standard
+
+=head1 SYNOPSIS
+
+B<des>
+(
+B<-e>
+|
+B<-E>
+) | (
+B<-d>
+|
+B<-D>
+) | (
+B<->[B<cC>][B<ckname>]
+) |
+[
+B<-b3hfs>
+] [
+B<-k>
+I<key>
+]
+] [
+B<-u>[I<uuname>]
+[
+I<input-file>
+[
+I<output-file>
+] ]
+
+=head1 NOTE
+
+This page describes the B<des> stand-alone program, not the B<openssl des>
+command.
+
+=head1 DESCRIPTION
+
+B<des>
+encrypts and decrypts data using the
+Data Encryption Standard algorithm.
+One of
+B<-e>, B<-E>
+(for encrypt) or
+B<-d>, B<-D>
+(for decrypt) must be specified.
+It is also possible to use
+B<-c>
+or
+B<-C>
+in conjunction or instead of the a encrypt/decrypt option to generate
+a 16 character hexadecimal checksum, generated via the
+I<des_cbc_cksum>.
+
+Two standard encryption modes are supported by the
+B<des>
+program, Cipher Block Chaining (the default) and Electronic Code Book
+(specified with
+B<-b>).
+
+The key used for the DES
+algorithm is obtained by prompting the user unless the
+B<-k>
+I<key>
+option is given.
+If the key is an argument to the
+B<des>
+command, it is potentially visible to users executing
+ps(1)
+or a derivative.  To minimise this possibility,
+B<des>
+takes care to destroy the key argument immediately upon entry.
+If your shell keeps a history file be careful to make sure it is not
+world readable.
+
+Since this program attempts to maintain compatibility with sunOS's
+des(1) command, there are 2 different methods used to convert the user
+supplied key to a des key.
+Whenever and one or more of
+B<-E>, B<-D>, B<-C>
+or
+B<-3>
+options are used, the key conversion procedure will not be compatible
+with the sunOS des(1) version but will use all the user supplied
+character to generate the des key.
+B<des>
+command reads from standard input unless
+I<input-file>
+is specified and writes to standard output unless
+I<output-file>
+is given.
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<-b>
+
+Select ECB
+(eight bytes at a time) encryption mode.
+
+=item B<-3>
+
+Encrypt using triple encryption.
+By default triple cbc encryption is used but if the
+B<-b>
+option is used then triple ECB encryption is performed.
+If the key is less than 8 characters long, the flag has no effect.
+
+=item B<-e>
+
+Encrypt data using an 8 byte key in a manner compatible with sunOS
+des(1).
+
+=item B<-E>
+
+Encrypt data using a key of nearly unlimited length (1024 bytes).
+This will product a more secure encryption.
+
+=item B<-d>
+
+Decrypt data that was encrypted with the B<-e> option.
+
+=item B<-D>
+
+Decrypt data that was encrypted with the B<-E> option.
+
+=item B<-c>
+
+Generate a 16 character hexadecimal cbc checksum and output this to
+stderr.
+If a filename was specified after the
+B<-c>
+option, the checksum is output to that file.
+The checksum is generated using a key generated in a sunOS compatible
+manner.
+
+=item B<-C>
+
+A cbc checksum is generated in the same manner as described for the
+B<-c>
+option but the DES key is generated in the same manner as used for the
+B<-E>
+and
+B<-D>
+options
+
+=item B<-f>
+
+Does nothing - allowed for compatibility with sunOS des(1) command.
+
+=item B<-s>
+
+Does nothing - allowed for compatibility with sunOS des(1) command.
+
+=item B<-k> I<key>
+
+Use the encryption 
+I<key>
+specified.
+
+=item B<-h>
+
+The
+I<key>
+is assumed to be a 16 character hexadecimal number.
+If the
+B<-3>
+option is used the key is assumed to be a 32 character hexadecimal
+number.
+
+=item B<-u>
+
+This flag is used to read and write uuencoded files.  If decrypting,
+the input file is assumed to contain uuencoded, DES encrypted data.
+If encrypting, the characters following the B<-u> are used as the name of
+the uuencoded file to embed in the begin line of the uuencoded
+output.  If there is no name specified after the B<-u>, the name text.des
+will be embedded in the header.
+
+=head1 SEE ALSO
+
+ps(1),
+L<des_crypt(3)|des_crypt(3)>
+
+=head1 BUGS
+
+The problem with using the
+B<-e>
+option is the short key length.
+It would be better to use a real 56-bit key rather than an
+ASCII-based 56-bit pattern.  Knowing that the key was derived from ASCII
+radically reduces the time necessary for a brute-force cryptographic attack.
+My attempt to remove this problem is to add an alternative text-key to
+DES-key function.  This alternative function (accessed via
+B<-E>, B<-D>, B<-S>
+and
+B<-3>)
+uses DES to help generate the key.
+
+Be carefully when using the B<-u> option.  Doing B<des -ud> I<filename> will
+not decrypt filename (the B<-u> option will gobble the B<-d> option).
+
+The VMS operating system operates in a world where files are always a
+multiple of 512 bytes.  This causes problems when encrypted data is
+send from Unix to VMS since a 88 byte file will suddenly be padded
+with 424 null bytes.  To get around this problem, use the B<-u> option
+to uuencode the data before it is send to the VMS system.
+
+=head1 AUTHOR
+
+Eric Young (eay@cryptsoft.com)
+
+=cut
index 0ecc416..e69de29 100644 (file)
@@ -1,508 +0,0 @@
-.TH DES_CRYPT 3 
-.SH NAME
-des_read_password, des_read_2password,
-des_string_to_key, des_string_to_2key, des_read_pw_string,
-des_random_key, des_set_key,
-des_key_sched, des_ecb_encrypt, des_ecb3_encrypt, des_cbc_encrypt,
-des_3cbc_encrypt,
-des_pcbc_encrypt, des_cfb_encrypt, des_ofb_encrypt,
-des_cbc_cksum, des_quad_cksum,
-des_enc_read, des_enc_write, des_set_odd_parity,
-des_is_weak_key, crypt \- (non USA) DES encryption
-.SH SYNOPSIS
-.nf
-.nj
-.ft B
-#include <des.h>
-.PP
-.B int des_read_password(key,prompt,verify)
-des_cblock *key;
-char *prompt;
-int verify;
-.PP
-.B int des_read_2password(key1,key2,prompt,verify)
-des_cblock *key1,*key2;
-char *prompt;
-int verify;
-.PP
-.B int des_string_to_key(str,key)
-char *str;
-des_cblock *key;
-.PP
-.B int des_string_to_2keys(str,key1,key2)
-char *str;
-des_cblock *key1,*key2;
-.PP
-.B int des_read_pw_string(buf,length,prompt,verify)
-char *buf;
-int length;
-char *prompt;
-int verify;
-.PP
-.B int des_random_key(key)
-des_cblock *key;
-.PP
-.B int des_set_key(key,schedule)
-des_cblock *key;
-des_key_schedule schedule;
-.PP
-.B int des_key_sched(key,schedule)
-des_cblock *key;
-des_key_schedule schedule;
-.PP
-.B int des_ecb_encrypt(input,output,schedule,encrypt)
-des_cblock *input;
-des_cblock *output;
-des_key_schedule schedule;
-int encrypt;
-.PP
-.B int des_ecb3_encrypt(input,output,ks1,ks2,encrypt)
-des_cblock *input;
-des_cblock *output;
-des_key_schedule ks1,ks2;
-int encrypt;
-.PP
-.B int des_cbc_encrypt(input,output,length,schedule,ivec,encrypt)
-des_cblock *input;
-des_cblock *output;
-long length;
-des_key_schedule schedule;
-des_cblock *ivec;
-int encrypt;
-.PP
-.B int des_3cbc_encrypt(input,output,length,sk1,sk2,ivec1,ivec2,encrypt)
-des_cblock *input;
-des_cblock *output;
-long length;
-des_key_schedule sk1;
-des_key_schedule sk2;
-des_cblock *ivec1;
-des_cblock *ivec2;
-int encrypt;
-.PP
-.B int des_pcbc_encrypt(input,output,length,schedule,ivec,encrypt)
-des_cblock *input;
-des_cblock *output;
-long length;
-des_key_schedule schedule;
-des_cblock *ivec;
-int encrypt;
-.PP
-.B int des_cfb_encrypt(input,output,numbits,length,schedule,ivec,encrypt)
-unsigned char *input;
-unsigned char *output;
-int numbits;
-long length;
-des_key_schedule schedule;
-des_cblock *ivec;
-int encrypt;
-.PP
-.B int des_ofb_encrypt(input,output,numbits,length,schedule,ivec)
-unsigned char *input,*output;
-int numbits;
-long length;
-des_key_schedule schedule;
-des_cblock *ivec;
-.PP
-.B unsigned long des_cbc_cksum(input,output,length,schedule,ivec)
-des_cblock *input;
-des_cblock *output;
-long length;
-des_key_schedule schedule;
-des_cblock *ivec;
-.PP
-.B unsigned long des_quad_cksum(input,output,length,out_count,seed)
-des_cblock *input;
-des_cblock *output;
-long length;
-int out_count;
-des_cblock *seed;
-.PP
-.B int des_check_key;
-.PP
-.B int des_enc_read(fd,buf,len,sched,iv)
-int fd;
-char *buf;
-int len;
-des_key_schedule sched;
-des_cblock *iv;
-.PP
-.B int des_enc_write(fd,buf,len,sched,iv)
-int fd;
-char *buf;
-int len;
-des_key_schedule sched;
-des_cblock *iv;
-.PP
-.B extern int des_rw_mode;
-.PP
-.B void des_set_odd_parity(key)
-des_cblock *key;
-.PP
-.B int des_is_weak_key(key)
-des_cblock *key;
-.PP
-.B char *crypt(passwd,salt)
-char *passwd;
-char *salt;
-.PP
-.fi
-.SH DESCRIPTION
-This library contains a fast implementation of the DES encryption
-algorithm.
-.PP
-There are two phases to the use of DES encryption.
-The first is the generation of a
-.I des_key_schedule
-from a key,
-the second is the actual encryption.
-A des key is of type
-.I des_cblock.
-This type is made from 8 characters with odd parity.
-The least significant bit in the character is the parity bit.
-The key schedule is an expanded form of the key; it is used to speed the
-encryption process.
-.PP
-.I des_read_password
-writes the string specified by prompt to the standard output,
-turns off echo and reads an input string from standard input
-until terminated with a newline.
-If verify is non-zero, it prompts and reads the input again and verifies
-that both entered passwords are the same.
-The entered string is converted into a des key by using the
-.I des_string_to_key
-routine.
-The new key is placed in the
-.I des_cblock
-that was passed (by reference) to the routine.
-If there were no errors,
-.I des_read_password
-returns 0,
--1 is returned if there was a terminal error and 1 is returned for
-any other error.
-.PP
-.I des_read_2password
-operates in the same way as
-.I des_read_password
-except that it generates 2 keys by using the
-.I des_string_to_2key
-function.
-.PP
-.I des_read_pw_string
-is called by
-.I des_read_password
-to read and verify a string from a terminal device.
-The string is returned in
-.I buf.
-The size of
-.I buf
-is passed to the routine via the
-.I length
-parameter.
-.PP
-.I des_string_to_key
-converts a string into a valid des key.
-.PP
-.I des_string_to_2key
-converts a string into 2 valid des keys.
-This routine is best suited for used to generate keys for use with
-.I des_ecb3_encrypt.
-.PP
-.I des_random_key
-returns a random key that is made of a combination of process id,
-time and an increasing counter.
-.PP
-Before a des key can be used it is converted into a
-.I des_key_schedule
-via the
-.I des_set_key
-routine.
-If the
-.I des_check_key
-flag is non-zero,
-.I des_set_key
-will check that the key passed is of odd parity and is not a week or
-semi-weak key.
-If the parity is wrong,
-then -1 is returned.
-If the key is a weak key,
-then -2 is returned.
-If an error is returned,
-the key schedule is not generated.
-.PP
-.I des_key_sched
-is another name for the
-.I des_set_key
-function.
-.PP
-The following routines mostly operate on an input and output stream of
-.I des_cblock's.
-.PP
-.I des_ecb_encrypt
-is the basic DES encryption routine that encrypts or decrypts a single 8-byte
-.I des_cblock
-in
-.I electronic code book
-mode.
-It always transforms the input data, pointed to by
-.I input,
-into the output data,
-pointed to by the
-.I output
-argument.
-If the
-.I encrypt
-argument is non-zero (DES_ENCRYPT),
-the
-.I input
-(cleartext) is encrypted in to the
-.I output
-(ciphertext) using the key_schedule specified by the
-.I schedule
-argument,
-previously set via
-.I des_set_key.
-If
-.I encrypt
-is zero (DES_DECRYPT),
-the
-.I input
-(now ciphertext)
-is decrypted into the
-.I output
-(now cleartext).
-Input and output may overlap.
-No meaningful value is returned.
-.PP
-.I des_ecb3_encrypt
-encrypts/decrypts the
-.I input
-block by using triple ecb DES encryption.
-This involves encrypting the input with 
-.I ks1,
-decryption with the key schedule
-.I ks2,
-and then encryption with the first again.
-This routine greatly reduces the chances of brute force breaking of
-DES and has the advantage of if
-.I ks1
-and
-.I ks2
-are the same, it is equivalent to just encryption using ecb mode and
-.I ks1
-as the key.
-.PP
-.I des_cbc_encrypt
-encrypts/decrypts using the
-.I cipher-block-chaining
-mode of DES.
-If the
-.I encrypt
-argument is non-zero,
-the routine cipher-block-chain encrypts the cleartext data pointed to by the
-.I input
-argument into the ciphertext pointed to by the
-.I output
-argument,
-using the key schedule provided by the
-.I schedule
-argument,
-and initialisation vector provided by the
-.I ivec
-argument.
-If the
-.I length
-argument is not an integral multiple of eight bytes, 
-the last block is copied to a temporary area and zero filled.
-The output is always
-an integral multiple of eight bytes.
-To make multiple cbc encrypt calls on a large amount of data appear to
-be one 
-.I des_cbc_encrypt
-call, the
-.I ivec
-of subsequent calls should be the last 8 bytes of the output.
-.PP
-.I des_3cbc_encrypt
-encrypts/decrypts the
-.I input
-block by using triple cbc DES encryption.
-This involves encrypting the input with key schedule
-.I ks1,
-decryption with the key schedule
-.I ks2,
-and then encryption with the first again.
-2 initialisation vectors are required,
-.I ivec1
-and
-.I ivec2.
-Unlike
-.I des_cbc_encrypt,
-these initialisation vectors are modified by the subroutine.
-This routine greatly reduces the chances of brute force breaking of
-DES and has the advantage of if
-.I ks1
-and
-.I ks2
-are the same, it is equivalent to just encryption using cbc mode and
-.I ks1
-as the key.
-.PP
-.I des_pcbc_encrypt
-encrypt/decrypts using a modified block chaining mode.
-It provides better error propagation characteristics than cbc
-encryption.
-.PP
-.I des_cfb_encrypt
-encrypt/decrypts using cipher feedback mode.  This method takes an
-array of characters as input and outputs and array of characters.  It
-does not require any padding to 8 character groups.  Note: the ivec
-variable is changed and the new changed value needs to be passed to
-the next call to this function.  Since this function runs a complete
-DES ecb encryption per numbits, this function is only suggested for
-use when sending small numbers of characters.
-.PP
-.I des_ofb_encrypt
-encrypt using output feedback mode.  This method takes an
-array of characters as input and outputs and array of characters.  It
-does not require any padding to 8 character groups.  Note: the ivec
-variable is changed and the new changed value needs to be passed to
-the next call to this function.  Since this function runs a complete
-DES ecb encryption per numbits, this function is only suggested for
-use when sending small numbers of characters.
-.PP
-.I des_cbc_cksum
-produces an 8 byte checksum based on the input stream (via cbc encryption).
-The last 4 bytes of the checksum is returned and the complete 8 bytes is
-placed in
-.I output.
-.PP
-.I des_quad_cksum
-returns a 4 byte checksum from the input bytes.
-The algorithm can be iterated over the input,
-depending on
-.I out_count,
-1, 2, 3 or 4 times.
-If
-.I output
-is non-NULL,
-the 8 bytes generated by each pass are written into
-.I output.
-.PP
-.I des_enc_write
-is used to write
-.I len
-bytes
-to file descriptor
-.I fd
-from buffer
-.I buf.
-The data is encrypted via
-.I pcbc_encrypt
-(default) using
-.I sched
-for the key and
-.I iv
-as a starting vector.
-The actual data send down
-.I fd
-consists of 4 bytes (in network byte order) containing the length of the
-following encrypted data.  The encrypted data then follows, padded with random
-data out to a multiple of 8 bytes.
-.PP
-.I des_enc_read
-is used to read
-.I len
-bytes
-from file descriptor
-.I fd
-into buffer
-.I buf.
-The data being read from
-.I fd
-is assumed to have come from
-.I des_enc_write
-and is decrypted using
-.I sched
-for the key schedule and
-.I iv
-for the initial vector.
-The
-.I des_enc_read/des_enc_write
-pair can be used to read/write to files, pipes and sockets.
-I have used them in implementing a version of rlogin in which all
-data is encrypted.
-.PP
-.I des_rw_mode
-is used to specify the encryption mode to use with 
-.I des_enc_read
-and 
-.I des_end_write.
-If set to
-.I DES_PCBC_MODE
-(the default), des_pcbc_encrypt is used.
-If set to
-.I DES_CBC_MODE
-des_cbc_encrypt is used.
-These two routines and the variable are not part of the normal MIT library.
-.PP
-.I des_set_odd_parity
-sets the parity of the passed
-.I key
-to odd.  This routine is not part of the standard MIT library.
-.PP
-.I des_is_weak_key
-returns 1 is the passed key is a weak key (pick again :-),
-0 if it is ok.
-This routine is not part of the standard MIT library.
-.PP
-.I crypt
-is a replacement for the normal system crypt.
-It is much faster than the system crypt.
-.PP
-.SH FILES
-/usr/include/des.h
-.br
-/usr/lib/libdes.a
-.PP
-The encryption routines have been tested on 16bit, 32bit and 64bit
-machines of various endian and even works under VMS.
-.PP
-.SH BUGS
-.PP
-If you think this manual is sparse,
-read the des_crypt(3) manual from the MIT kerberos (or bones outside
-of the USA) distribution.
-.PP
-.I des_cfb_encrypt
-and
-.I des_ofb_encrypt
-operates on input of 8 bits.  What this means is that if you set
-numbits to 12, and length to 2, the first 12 bits will come from the 1st
-input byte and the low half of the second input byte.  The second 12
-bits will have the low 8 bits taken from the 3rd input byte and the
-top 4 bits taken from the 4th input byte.  The same holds for output.
-This function has been implemented this way because most people will
-be using a multiple of 8 and because once you get into pulling bytes input
-bytes apart things get ugly!
-.PP
-.I des_read_pw_string
-is the most machine/OS dependent function and normally generates the
-most problems when porting this code.
-.PP
-.I des_string_to_key
-is probably different from the MIT version since there are lots
-of fun ways to implement one-way encryption of a text string.
-.PP
-The routines are optimised for 32 bit machines and so are not efficient
-on IBM PCs.
-.PP
-NOTE: extensive work has been done on this library since this document
-was origionally written.  Please try to read des.doc from the libdes
-distribution since it is far more upto date and documents more of the
-functions.  Libdes is now also being shipped as part of SSLeay, a
-general cryptographic library that amonst other things implements
-netscapes SSL protocoll.  The most recent version can be found in
-SSLeay distributions.
-.SH AUTHOR
-Eric Young (eay@cryptsoft.com)
index 4dfed19..1ace8f5 100644 (file)
                                } \
                        }
 
-#if defined(WIN32)
+#if defined(WIN32) && defined(_MSC_VER)
 #define        ROTATE(a,n)     (_lrotr(a,n))
 #else
 #define        ROTATE(a,n)     (((a)>>(n))+((a)<<(32-(n))))
index 9ad4ecb..df0d615 100644 (file)
@@ -336,8 +336,15 @@ int main(int argc, char *argv[])
        unsigned char cbc_in[40];
        unsigned char cbc_out[40];
        DES_LONG cs;
-       unsigned char qret[4][4],cret[8];
-       DES_LONG lqret[4];
+       unsigned char cret[8];
+#ifdef _CRAY
+        struct {
+            int a:32;
+            int b:32;
+        } lqret[2];
+#else
+        DES_LONG lqret[4];
+#endif
        int num;
        char *str;
 
@@ -701,43 +708,40 @@ plain[8+4], plain[8+5], plain[8+6], plain[8+7]);
                }
 
        printf("Doing quad_cksum\n");
-       /* This is obviously done this way especially to puzzle me. Although
-          quad_cksum returns up to 4 groups of 8 bytes, this test gets it to
-          produce 2 groups then treats them as 4 groups of 4 bytes.
-          Ben 13 Feb 1999 */
-       cs=quad_cksum(cbc_data,(des_cblock *)qret,strlen((char *)cbc_data),2,
-                     &cbc_iv);
-
-       { /* Big-endian fix */
-       static DES_LONG l=1;
-       static unsigned char *c=(unsigned char *)&l;
-       DES_LONG ll;
-
-       j=sizeof(lqret[0])-4;
-       for (i=0; i<4; i++)
+       cs=quad_cksum(cbc_data,(des_cblock *)lqret,
+               (long)strlen((char *)cbc_data),2,(des_cblock *)cbc_iv);
+       if (cs != 0x70d7a63aL)
                {
-               lqret[i]=0;
-               memcpy(&(lqret[i]),&(qret[i][0]),4);
-               if (!c[0] && (j > 0))
-                       lqret[i]=lqret[i]>>(j*8); /* For Cray */
+               printf("quad_cksum error, ret %08lx should be 70d7a63a\n",
+                       (unsigned long)cs);
+               err=1;
                }
-
-       if (!c[0])
+#ifdef _CRAY
+       if (lqret[0].a != 0x327eba8dL)
                {
-               ll=lqret[0]^lqret[3];
-               lqret[0]^=ll;
-               lqret[3]^=ll;
-               ll=lqret[1]^lqret[2];
-               lqret[1]^=ll;
-               lqret[2]^=ll;
+               printf("quad_cksum error, out[0] %08lx is not %08lx\n",
+                       (unsigned long)lqret[0].a,0x327eba8dUL);
+               err=1;
                }
-       }
-       if (cs != 0x70d7a63aL)
+       if (lqret[0].b != 0x201a49ccL)
                {
-               printf("quad_cksum error, ret %08lx should be 70d7a63a\n",
-                       (unsigned long)cs);
+               printf("quad_cksum error, out[1] %08lx is not %08lx\n",
+                       (unsigned long)lqret[0].b,0x201a49ccUL);
+               err=1;
+               }
+       if (lqret[1].a != 0x70d7a63aL)
+               {
+               printf("quad_cksum error, out[2] %08lx is not %08lx\n",
+                       (unsigned long)lqret[1].a,0x70d7a63aUL);
                err=1;
                }
+       if (lqret[1].b != 0x501c2c26L)
+               {
+               printf("quad_cksum error, out[3] %08lx is not %08lx\n",
+                       (unsigned long)lqret[1].b,0x501c2c26UL);
+               err=1;
+               }
+#else
        if (lqret[0] != 0x327eba8dL)
                {
                printf("quad_cksum error, out[0] %08lx is not %08lx\n",
@@ -762,6 +766,7 @@ plain[8+4], plain[8+5], plain[8+6], plain[8+7]);
                        (unsigned long)lqret[3],0x501c2c26UL);
                err=1;
                }
+#endif
 #endif
 
        printf("input word alignment test");
index 18cf231..e69de29 100644 (file)
@@ -1,46 +0,0 @@
-#!/usr/local/bin/perl
-
-@l=(
-        0, 1, 2, 3, 4, 5, 6, 7,
-        8, 9,10,11,12,13,14,15,
-       16,17,18,19,20,21,22,23,
-       24,25,26,27,28,29,30,31
-       );
-@r=(
-       32,33,34,35,36,37,38,39,
-       40,41,42,43,44,45,46,47,
-       48,49,50,51,52,53,54,55,
-       56,57,58,59,60,61,62,63
-       );
-
-require 'shifts.pl';
-
-sub PERM_OP
-       {
-       local(*a,*b,*t,$n,$m)=@_;
-
-       @z=&shift(*a,-$n);
-       @z=&xor(*b,*z);
-       @z=&and(*z,$m);
-       @b=&xor(*b,*z);
-       @z=&shift(*z,$n);
-       @a=&xor(*a,*z);
-       }
-
-
-@L=@l;
-@R=@r;
-&PERM_OP(*R,*L,*T,4,0x0f0f0f0f);
-&PERM_OP(*L,*R,*T,16,0x0000ffff);
-&PERM_OP(*R,*L,*T,2,0x33333333);
-&PERM_OP(*L,*R,*T,8,0x00ff00ff);
-&PERM_OP(*R,*L,*T,1,0x55555555);
-       &printit(@L);
-       &printit(@R);
-&PERM_OP(*R,*L,*T,1,0x55555555);
-&PERM_OP(*L,*R,*T,8,0x00ff00ff);
-&PERM_OP(*R,*L,*T,2,0x33333333);
-&PERM_OP(*L,*R,*T,16,0x0000ffff);
-&PERM_OP(*R,*L,*T,4,0x0f0f0f0f);
-       &printit(@L);
-       &printit(@R);
index 096afd8..e69de29 100644 (file)
@@ -1,110 +0,0 @@
-#!/usr/local/bin/perl
-
-@l=(
-        0, 1, 2, 3, 4, 5, 6, 7,
-        8, 9,10,11,12,13,14,15,
-       16,17,18,19,20,21,22,23,
-       24,25,26,27,28,29,30,31
-       );
-@r=(
-       32,33,34,35,36,37,38,39,
-       40,41,42,43,44,45,46,47,
-       48,49,50,51,52,53,54,55,
-       56,57,58,59,60,61,62,63
-       );
-
-require 'shifts.pl';
-
-sub PERM_OP
-       {
-       local(*a,*b,*t,$n,$m)=@_;
-
-       @z=&shift(*a,-$n);
-       @z=&xor(*b,*z);
-       @z=&and(*z,$m);
-       @b=&xor(*b,*z);
-       @z=&shift(*z,$n);
-       @a=&xor(*a,*z);
-       }
-
-sub HPERM_OP2
-       {
-       local(*a,*t,$n,$m)=@_;
-       local(@x,@y,$i);
-
-       @z=&shift(*a,16-$n);
-       @z=&xor(*a,*z);
-       @z=&and(*z,$m);
-       @a=&xor(*a,*z);
-       @z=&shift(*z,$n-16);
-       @a=&xor(*a,*z);
-       }
-
-sub HPERM_OP
-        {
-        local(*a,*t,$n,$m)=@_;
-        local(@x,@y,$i);
-
-        for ($i=0; $i<16; $i++)
-                {
-                $x[$i]=$a[$i];
-                $y[$i]=$a[16+$i];
-                }
-        @z=&shift(*x,-$n);
-        @z=&xor(*y,*z);
-        @z=&and(*z,$m);
-        @y=&xor(*y,*z);
-        @z=&shift(*z,$n);
-        @x=&xor(*x,*z);
-        for ($i=0; $i<16; $i++)
-                {
-                $a[$i]=$x[$i];
-                $a[16+$i]=$y[$i];
-                }
-        }
-
-@L=@l;
-@R=@r;
-
-       print "---\n"; &printit(@R);
-&PERM_OP(*R,*L,*T,4,0x0f0f0f0f);
-       print "---\n"; &printit(@R);
-&HPERM_OP2(*L,*T,-2,0xcccc0000);
-&HPERM_OP2(*R,*T,-2,0xcccc0000);
-       print "---\n"; &printit(@R);
-&PERM_OP(*R,*L,*T,1,0x55555555);
-       print "---\n"; &printit(@R);
-&PERM_OP(*L,*R,*T,8,0x00ff00ff);
-       print "---\n"; &printit(@R);
-&PERM_OP(*R,*L,*T,1,0x55555555);
-       print "---\n"; &printit(@R);
-#      &printit(@L);
-       &printit(@R);
-print <<"EOF";
-==============================
-63  55  47  39  31  23  15   7  
-62  54  46  38  30  22  14   6  
-61  53  45  37  29  21  13   5  
-60  52  44  36  --  --  --  --  
-
-57  49  41  33  25  17   9   1  
-58  50  42  34  26  18  10   2  
-59  51  43  35  27  19  11   3  
-28  20  12   4  --  --  --  --  
-EOF
-exit(1);
-@A=&and(*R,0x000000ff);
-@A=&shift(*A,16);
-@B=&and(*R,0x0000ff00);
-@C=&and(*R,0x00ff0000);
-@C=&shift(*C,-16);
-@D=&and(*L,0xf0000000);
-@D=&shift(*D,-4);
-@A=&or(*A,*B);
-@B=&or(*D,*C);
-@R=&or(*A,*B);
-@L=&and(*L,0x0fffffff);
-
-       &printit(@L);
-       &printit(@R);
-
index fa5cf74..e69de29 100644 (file)
@@ -1,94 +0,0 @@
-#!/usr/local/bin/perl
-
-@PC2_C=(14,17,11,24, 1, 5,
-        3,28,15, 6,21,10,
-       23,19,12, 4,26, 8,
-       16, 7,27,20,13, 2,
-       );
-
-@PC2_D=(41,52,31,37,47,55,
-       30,40,51,45,33,48,
-       44,49,39,56,34,53,
-       46,42,50,36,29,32,
-       );
-
-$i=0;
-foreach (@PC2_C) {
-       $_--;
-#      printf "%2d,",$_;
-       $C{$_}=$i;
-       ++$i;
-#      print "\n" if ((($i) % 8) == 0);
-       }
-$i=0;
-#print "\n";
-foreach (@PC2_D) {
-       $_-=28;
-       $_--;
-#      printf "%2d,",$_;
-       $D{$_}=$i;
-       $i++;
-#      print "\n" if ((($i) % 8) == 0);
-       }
-
-#print "\n";
-foreach $i (0 .. 27)
-       {
-       $_=$C{$i};
-#      printf "%2d,",$_;
-       $i++;
-#      print "\n" if ((($i) % 8) == 0);
-       }
-#print "\n";
-
-#print "\n";
-foreach $i (0 .. 27)
-       {
-       $_=$D{$i};
-#      printf "%2d,",$_;
-       $i++;
-#      print "\n" if ((($i) % 8) == 0);
-       }
-#print "\n";
-
-print "static ulong skb[8][64]={\n";
-&doit("C",*C, 0, 1, 2, 3, 4, 5);
-&doit("C",*C, 6, 7, 9,10,11,12);
-&doit("C",*C,13,14,15,16,18,19);
-&doit("C",*C,20,22,23,25,26,27);
-
-&doit("D",*D, 0, 1, 2, 3, 4, 5);
-&doit("D",*D, 7, 8,10,11,12,13);
-&doit("D",*D,15,16,17,18,19,20);
-&doit("D",*D,21,22,23,24,26,27);
-print "};\n";
-
-sub doit
-       {
-       local($l,*A,@b)=@_;
-       local(@out);
-
-       printf("/* for $l bits (numbered as per FIPS 46) %d %d %d %d %d %d */\n",
-               $b[0]+1, $b[1]+1, $b[2]+1, $b[3]+1, $b[4]+1, $b[5]+1);
-       for ($i=0; $i<64; $i++)
-               {
-               $out[$i]=0;
-               $j=1;
-#print "\n";
-               for ($k=0; $k<6; $k++)
-                       {
-                       $l=$A{$b[$k]};
-#print"$l - ";
-                       if ((1<<$k) & $i)
-                               {
-                               $ll=int($l/6)*8+($l%6);
-                               $out[$i]|=1<<($ll);
-                               }
-                       }
-               $pp=$out[$i];
-               $pp=($pp&0xff0000ff)|   (($pp&0x00ff0000)>>8)|
-                                       (($pp&0x0000ff00)<<8);
-               printf("0x%08X,",$pp);
-               print "\n" if (($i+1) % 4 == 0);
-               }
-       }
index fa1b8aa..9b21f81 100644 (file)
@@ -3,7 +3,6 @@
 
 /* This version of crypt has been developed from my MIT compatible
  * DES library.
- * The library is available at pub/Crypto/DES at ftp.psy.uq.oz.au
  * Eric Young (eay@cryptsoft.com)
  */
 
index 83c9405..22c87f5 100644 (file)
@@ -97,7 +97,7 @@ void fcrypt_body(DES_LONG *out, des_key_schedule ks, DES_LONG Eswap0,
 
        for (j=0; j<25; j++)
                {
-#ifdef DES_UNROLL
+#ifndef DES_UNROLL
                register int i;
 
                for (i=0; i<32; i+=8)
index e0e67a4..3b68169 100644 (file)
@@ -1,4 +1,9 @@
 /* crypto/des/ncbc_enc.c */
+/*
+ * #included by:
+ *    cbc_enc.c  (des_cbc_encrypt)
+ *    des_enc.c  (des_ncbc_encrypt)
+ */
 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
index 1b2bfe0..e69de29 100644 (file)
@@ -1,75 +0,0 @@
-/* crypto/des/podd.h */
-/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
- * All rights reserved.
- *
- * This package is an SSL implementation written
- * by Eric Young (eay@cryptsoft.com).
- * The implementation was written so as to conform with Netscapes SSL.
- * 
- * This library is free for commercial and non-commercial use as long as
- * the following conditions are aheared to.  The following conditions
- * apply to all code found in this distribution, be it the RC4, RSA,
- * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
- * included with this distribution is covered by the same copyright terms
- * except that the holder is Tim Hudson (tjh@cryptsoft.com).
- * 
- * Copyright remains Eric Young's, and as such any Copyright notices in
- * the code are not to be removed.
- * If this package is used in a product, Eric Young should be given attribution
- * as the author of the parts of the library used.
- * This can be in the form of a textual message at program startup or
- * in documentation (online or textual) provided with the package.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *    "This product includes cryptographic software written by
- *     Eric Young (eay@cryptsoft.com)"
- *    The word 'cryptographic' can be left out if the rouines from the library
- *    being used are not cryptographic related :-).
- * 4. If you include any Windows specific code (or a derivative thereof) from 
- *    the apps directory (application code) you must include an acknowledgement:
- *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
- * 
- * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * 
- * The licence and distribution terms for any publically available version or
- * derivative of this code cannot be changed.  i.e. this code cannot simply be
- * copied and put under another distribution licence
- * [including the GNU Public Licence.]
- */
-
-static const unsigned char odd_parity[256]={
-  1,  1,  2,  2,  4,  4,  7,  7,  8,  8, 11, 11, 13, 13, 14, 14,
- 16, 16, 19, 19, 21, 21, 22, 22, 25, 25, 26, 26, 28, 28, 31, 31,
- 32, 32, 35, 35, 37, 37, 38, 38, 41, 41, 42, 42, 44, 44, 47, 47,
- 49, 49, 50, 50, 52, 52, 55, 55, 56, 56, 59, 59, 61, 61, 62, 62,
- 64, 64, 67, 67, 69, 69, 70, 70, 73, 73, 74, 74, 76, 76, 79, 79,
- 81, 81, 82, 82, 84, 84, 87, 87, 88, 88, 91, 91, 93, 93, 94, 94,
- 97, 97, 98, 98,100,100,103,103,104,104,107,107,109,109,110,110,
-112,112,115,115,117,117,118,118,121,121,122,122,124,124,127,127,
-128,128,131,131,133,133,134,134,137,137,138,138,140,140,143,143,
-145,145,146,146,148,148,151,151,152,152,155,155,157,157,158,158,
-161,161,162,162,164,164,167,167,168,168,171,171,173,173,174,174,
-176,176,179,179,181,181,182,182,185,185,186,186,188,188,191,191,
-193,193,194,194,196,196,199,199,200,200,203,203,205,205,206,206,
-208,208,211,211,213,213,214,214,217,217,218,218,220,220,223,223,
-224,224,227,227,229,229,230,230,233,233,234,234,236,236,239,239,
-241,241,242,242,244,244,247,247,248,248,251,251,253,253,254,254};
index 6ce8c61..5f0ec53 100644 (file)
@@ -80,10 +80,14 @@ DES_LONG des_quad_cksum(const unsigned char *input, des_cblock output[],
        int i;
        long l;
        const unsigned char *cp;
-       unsigned char *lp;
+#ifdef _CRAY
+       short *lp;
+#else
+       DES_LONG *lp;
+#endif
 
        if (out_count < 1) out_count=1;
-       lp = &(output[0])[0];
+       lp = (DES_LONG *) &(output[0])[0];
 
        z0=Q_B0((*seed)[0])|Q_B1((*seed)[1])|Q_B2((*seed)[2])|Q_B3((*seed)[3]);
        z1=Q_B0((*seed)[4])|Q_B1((*seed)[5])|Q_B2((*seed)[6])|Q_B3((*seed)[7]);
@@ -114,25 +118,10 @@ DES_LONG des_quad_cksum(const unsigned char *input, des_cblock output[],
                        }
                if (lp != NULL)
                        {
-                       /* I believe I finally have things worked out.
-                        * The MIT library assumes that the checksum
-                        * is one huge number and it is returned in a
-                        * host dependant byte order.
-                        */
-                       static DES_LONG ltmp=1;
-                       static unsigned char *c=(unsigned char *)&ltmp;
-
-                       if (c[0])
-                               {
-                               l2c(z0,lp);
-                               l2c(z1,lp);
-                               }
-                       else
-                               {
-                               lp = &(output[out_count-i-1])[0];
-                               l2n(z1,lp);
-                               l2n(z0,lp);
-                               }
+                       /* The MIT library assumes that the checksum is
+                        * composed of 2*out_count 32 bit ints */
+                       *lp++ = z0;
+                       *lp++ = z1;
                        }
                }
        return(z0);
index 7816a8f..ee1a6c2 100644 (file)
@@ -63,7 +63,11 @@ void des_random_seed(des_cblock *key)
 
 int des_random_key(des_cblock *ret)
        {
-       int r = RAND_bytes((unsigned char *)ret, sizeof(des_cblock));
+       do
+               {
+               if (RAND_bytes((unsigned char *)ret, sizeof(des_cblock)) != 1)
+                       return (0);
+               } while (des_is_weak_key(ret));
        des_set_odd_parity(ret);
-       return r;
+       return (1);
        }
index bbdc71b..09afd4f 100644 (file)
  * 1.0 First working version
  */
 #include "des_locl.h"
-#include "podd.h"
-#include "sk.h"
 
-static int check_parity(const_des_cblock *key);
 OPENSSL_GLOBAL int des_check_key=0;
 
+static const unsigned char odd_parity[256]={
+  1,  1,  2,  2,  4,  4,  7,  7,  8,  8, 11, 11, 13, 13, 14, 14,
+ 16, 16, 19, 19, 21, 21, 22, 22, 25, 25, 26, 26, 28, 28, 31, 31,
+ 32, 32, 35, 35, 37, 37, 38, 38, 41, 41, 42, 42, 44, 44, 47, 47,
+ 49, 49, 50, 50, 52, 52, 55, 55, 56, 56, 59, 59, 61, 61, 62, 62,
+ 64, 64, 67, 67, 69, 69, 70, 70, 73, 73, 74, 74, 76, 76, 79, 79,
+ 81, 81, 82, 82, 84, 84, 87, 87, 88, 88, 91, 91, 93, 93, 94, 94,
+ 97, 97, 98, 98,100,100,103,103,104,104,107,107,109,109,110,110,
+112,112,115,115,117,117,118,118,121,121,122,122,124,124,127,127,
+128,128,131,131,133,133,134,134,137,137,138,138,140,140,143,143,
+145,145,146,146,148,148,151,151,152,152,155,155,157,157,158,158,
+161,161,162,162,164,164,167,167,168,168,171,171,173,173,174,174,
+176,176,179,179,181,181,182,182,185,185,186,186,188,188,191,191,
+193,193,194,194,196,196,199,199,200,200,203,203,205,205,206,206,
+208,208,211,211,213,213,214,214,217,217,218,218,220,220,223,223,
+224,224,227,227,229,229,230,230,233,233,234,234,236,236,239,239,
+241,241,242,242,244,244,247,247,248,248,251,251,253,253,254,254};
+
 void des_set_odd_parity(des_cblock *key)
        {
        int i;
@@ -78,7 +93,7 @@ void des_set_odd_parity(des_cblock *key)
                (*key)[i]=odd_parity[(*key)[i]];
        }
 
-static int check_parity(const_des_cblock *key)
+int des_check_key_parity(const_des_cblock *key)
        {
        int i;
 
@@ -145,6 +160,153 @@ int des_is_weak_key(const_des_cblock *key)
 #define HPERM_OP(a,t,n,m) ((t)=((((a)<<(16-(n)))^(a))&(m)),\
        (a)=(a)^(t)^(t>>(16-(n))))
 
+static const DES_LONG des_skb[8][64]={
+       {
+       /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
+       0x00000000L,0x00000010L,0x20000000L,0x20000010L,
+       0x00010000L,0x00010010L,0x20010000L,0x20010010L,
+       0x00000800L,0x00000810L,0x20000800L,0x20000810L,
+       0x00010800L,0x00010810L,0x20010800L,0x20010810L,
+       0x00000020L,0x00000030L,0x20000020L,0x20000030L,
+       0x00010020L,0x00010030L,0x20010020L,0x20010030L,
+       0x00000820L,0x00000830L,0x20000820L,0x20000830L,
+       0x00010820L,0x00010830L,0x20010820L,0x20010830L,
+       0x00080000L,0x00080010L,0x20080000L,0x20080010L,
+       0x00090000L,0x00090010L,0x20090000L,0x20090010L,
+       0x00080800L,0x00080810L,0x20080800L,0x20080810L,
+       0x00090800L,0x00090810L,0x20090800L,0x20090810L,
+       0x00080020L,0x00080030L,0x20080020L,0x20080030L,
+       0x00090020L,0x00090030L,0x20090020L,0x20090030L,
+       0x00080820L,0x00080830L,0x20080820L,0x20080830L,
+       0x00090820L,0x00090830L,0x20090820L,0x20090830L,
+       },{
+       /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */
+       0x00000000L,0x02000000L,0x00002000L,0x02002000L,
+       0x00200000L,0x02200000L,0x00202000L,0x02202000L,
+       0x00000004L,0x02000004L,0x00002004L,0x02002004L,
+       0x00200004L,0x02200004L,0x00202004L,0x02202004L,
+       0x00000400L,0x02000400L,0x00002400L,0x02002400L,
+       0x00200400L,0x02200400L,0x00202400L,0x02202400L,
+       0x00000404L,0x02000404L,0x00002404L,0x02002404L,
+       0x00200404L,0x02200404L,0x00202404L,0x02202404L,
+       0x10000000L,0x12000000L,0x10002000L,0x12002000L,
+       0x10200000L,0x12200000L,0x10202000L,0x12202000L,
+       0x10000004L,0x12000004L,0x10002004L,0x12002004L,
+       0x10200004L,0x12200004L,0x10202004L,0x12202004L,
+       0x10000400L,0x12000400L,0x10002400L,0x12002400L,
+       0x10200400L,0x12200400L,0x10202400L,0x12202400L,
+       0x10000404L,0x12000404L,0x10002404L,0x12002404L,
+       0x10200404L,0x12200404L,0x10202404L,0x12202404L,
+       },{
+       /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */
+       0x00000000L,0x00000001L,0x00040000L,0x00040001L,
+       0x01000000L,0x01000001L,0x01040000L,0x01040001L,
+       0x00000002L,0x00000003L,0x00040002L,0x00040003L,
+       0x01000002L,0x01000003L,0x01040002L,0x01040003L,
+       0x00000200L,0x00000201L,0x00040200L,0x00040201L,
+       0x01000200L,0x01000201L,0x01040200L,0x01040201L,
+       0x00000202L,0x00000203L,0x00040202L,0x00040203L,
+       0x01000202L,0x01000203L,0x01040202L,0x01040203L,
+       0x08000000L,0x08000001L,0x08040000L,0x08040001L,
+       0x09000000L,0x09000001L,0x09040000L,0x09040001L,
+       0x08000002L,0x08000003L,0x08040002L,0x08040003L,
+       0x09000002L,0x09000003L,0x09040002L,0x09040003L,
+       0x08000200L,0x08000201L,0x08040200L,0x08040201L,
+       0x09000200L,0x09000201L,0x09040200L,0x09040201L,
+       0x08000202L,0x08000203L,0x08040202L,0x08040203L,
+       0x09000202L,0x09000203L,0x09040202L,0x09040203L,
+       },{
+       /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */
+       0x00000000L,0x00100000L,0x00000100L,0x00100100L,
+       0x00000008L,0x00100008L,0x00000108L,0x00100108L,
+       0x00001000L,0x00101000L,0x00001100L,0x00101100L,
+       0x00001008L,0x00101008L,0x00001108L,0x00101108L,
+       0x04000000L,0x04100000L,0x04000100L,0x04100100L,
+       0x04000008L,0x04100008L,0x04000108L,0x04100108L,
+       0x04001000L,0x04101000L,0x04001100L,0x04101100L,
+       0x04001008L,0x04101008L,0x04001108L,0x04101108L,
+       0x00020000L,0x00120000L,0x00020100L,0x00120100L,
+       0x00020008L,0x00120008L,0x00020108L,0x00120108L,
+       0x00021000L,0x00121000L,0x00021100L,0x00121100L,
+       0x00021008L,0x00121008L,0x00021108L,0x00121108L,
+       0x04020000L,0x04120000L,0x04020100L,0x04120100L,
+       0x04020008L,0x04120008L,0x04020108L,0x04120108L,
+       0x04021000L,0x04121000L,0x04021100L,0x04121100L,
+       0x04021008L,0x04121008L,0x04021108L,0x04121108L,
+       },{
+       /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
+       0x00000000L,0x10000000L,0x00010000L,0x10010000L,
+       0x00000004L,0x10000004L,0x00010004L,0x10010004L,
+       0x20000000L,0x30000000L,0x20010000L,0x30010000L,
+       0x20000004L,0x30000004L,0x20010004L,0x30010004L,
+       0x00100000L,0x10100000L,0x00110000L,0x10110000L,
+       0x00100004L,0x10100004L,0x00110004L,0x10110004L,
+       0x20100000L,0x30100000L,0x20110000L,0x30110000L,
+       0x20100004L,0x30100004L,0x20110004L,0x30110004L,
+       0x00001000L,0x10001000L,0x00011000L,0x10011000L,
+       0x00001004L,0x10001004L,0x00011004L,0x10011004L,
+       0x20001000L,0x30001000L,0x20011000L,0x30011000L,
+       0x20001004L,0x30001004L,0x20011004L,0x30011004L,
+       0x00101000L,0x10101000L,0x00111000L,0x10111000L,
+       0x00101004L,0x10101004L,0x00111004L,0x10111004L,
+       0x20101000L,0x30101000L,0x20111000L,0x30111000L,
+       0x20101004L,0x30101004L,0x20111004L,0x30111004L,
+       },{
+       /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
+       0x00000000L,0x08000000L,0x00000008L,0x08000008L,
+       0x00000400L,0x08000400L,0x00000408L,0x08000408L,
+       0x00020000L,0x08020000L,0x00020008L,0x08020008L,
+       0x00020400L,0x08020400L,0x00020408L,0x08020408L,
+       0x00000001L,0x08000001L,0x00000009L,0x08000009L,
+       0x00000401L,0x08000401L,0x00000409L,0x08000409L,
+       0x00020001L,0x08020001L,0x00020009L,0x08020009L,
+       0x00020401L,0x08020401L,0x00020409L,0x08020409L,
+       0x02000000L,0x0A000000L,0x02000008L,0x0A000008L,
+       0x02000400L,0x0A000400L,0x02000408L,0x0A000408L,
+       0x02020000L,0x0A020000L,0x02020008L,0x0A020008L,
+       0x02020400L,0x0A020400L,0x02020408L,0x0A020408L,
+       0x02000001L,0x0A000001L,0x02000009L,0x0A000009L,
+       0x02000401L,0x0A000401L,0x02000409L,0x0A000409L,
+       0x02020001L,0x0A020001L,0x02020009L,0x0A020009L,
+       0x02020401L,0x0A020401L,0x02020409L,0x0A020409L,
+       },{
+       /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
+       0x00000000L,0x00000100L,0x00080000L,0x00080100L,
+       0x01000000L,0x01000100L,0x01080000L,0x01080100L,
+       0x00000010L,0x00000110L,0x00080010L,0x00080110L,
+       0x01000010L,0x01000110L,0x01080010L,0x01080110L,
+       0x00200000L,0x00200100L,0x00280000L,0x00280100L,
+       0x01200000L,0x01200100L,0x01280000L,0x01280100L,
+       0x00200010L,0x00200110L,0x00280010L,0x00280110L,
+       0x01200010L,0x01200110L,0x01280010L,0x01280110L,
+       0x00000200L,0x00000300L,0x00080200L,0x00080300L,
+       0x01000200L,0x01000300L,0x01080200L,0x01080300L,
+       0x00000210L,0x00000310L,0x00080210L,0x00080310L,
+       0x01000210L,0x01000310L,0x01080210L,0x01080310L,
+       0x00200200L,0x00200300L,0x00280200L,0x00280300L,
+       0x01200200L,0x01200300L,0x01280200L,0x01280300L,
+       0x00200210L,0x00200310L,0x00280210L,0x00280310L,
+       0x01200210L,0x01200310L,0x01280210L,0x01280310L,
+       },{
+       /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
+       0x00000000L,0x04000000L,0x00040000L,0x04040000L,
+       0x00000002L,0x04000002L,0x00040002L,0x04040002L,
+       0x00002000L,0x04002000L,0x00042000L,0x04042000L,
+       0x00002002L,0x04002002L,0x00042002L,0x04042002L,
+       0x00000020L,0x04000020L,0x00040020L,0x04040020L,
+       0x00000022L,0x04000022L,0x00040022L,0x04040022L,
+       0x00002020L,0x04002020L,0x00042020L,0x04042020L,
+       0x00002022L,0x04002022L,0x00042022L,0x04042022L,
+       0x00000800L,0x04000800L,0x00040800L,0x04040800L,
+       0x00000802L,0x04000802L,0x00040802L,0x04040802L,
+       0x00002800L,0x04002800L,0x00042800L,0x04042800L,
+       0x00002802L,0x04002802L,0x00042802L,0x04042802L,
+       0x00000820L,0x04000820L,0x00040820L,0x04040820L,
+       0x00000822L,0x04000822L,0x00040822L,0x04040822L,
+       0x00002820L,0x04002820L,0x00042820L,0x04042820L,
+       0x00002822L,0x04002822L,0x00042822L,0x04042822L,
+       }};
+
 int des_set_key(const_des_cblock *key, des_key_schedule schedule)
        {
        if (des_check_key)
@@ -164,7 +326,7 @@ int des_set_key(const_des_cblock *key, des_key_schedule schedule)
  */
 int des_set_key_checked(const_des_cblock *key, des_key_schedule schedule)
        {
-       if (!check_parity(key))
+       if (!des_check_key_parity(key))
                return(-1);
        if (des_is_weak_key(key))
                return(-2);
@@ -186,20 +348,7 @@ void des_set_key_unchecked(const_des_cblock *key, des_key_schedule schedule)
        c2l(in,c);
        c2l(in,d);
 
-       /* do PC1 in 60 simple operations */ 
-/*     PERM_OP(d,c,t,4,0x0f0f0f0fL);
-       HPERM_OP(c,t,-2, 0xcccc0000L);
-       HPERM_OP(c,t,-1, 0xaaaa0000L);
-       HPERM_OP(c,t, 8, 0x00ff0000L);
-       HPERM_OP(c,t,-1, 0xaaaa0000L);
-       HPERM_OP(d,t,-8, 0xff000000L);
-       HPERM_OP(d,t, 8, 0x00ff0000L);
-       HPERM_OP(d,t, 2, 0x33330000L);
-       d=((d&0x00aa00aaL)<<7L)|((d&0x55005500L)>>7L)|(d&0xaa55aa55L);
-       d=(d>>8)|((c&0xf0000000L)>>4);
-       c&=0x0fffffffL; */
-
-       /* I now do it in 47 simple operations :-)
+       /* do PC1 in 47 simple operations :-)
         * Thanks to John Fletcher (john_fletcher@lccmail.ocf.llnl.gov)
         * for the inspiration. :-) */
        PERM_OP (d,c,t,4,0x0f0f0f0fL);
@@ -223,9 +372,9 @@ void des_set_key_unchecked(const_des_cblock *key, des_key_schedule schedule)
                /* could be a few less shifts but I am to lazy at this
                 * point in time to investigate */
                s=      des_skb[0][ (c    )&0x3f                ]|
-                       des_skb[1][((c>> 6)&0x03)|((c>> 7L)&0x3c)]|
-                       des_skb[2][((c>>13)&0x0f)|((c>>14L)&0x30)]|
-                       des_skb[3][((c>>20)&0x01)|((c>>21L)&0x06) |
+                       des_skb[1][((c>> 6L)&0x03)|((c>> 7L)&0x3c)]|
+                       des_skb[2][((c>>13L)&0x0f)|((c>>14L)&0x30)]|
+                       des_skb[3][((c>>20L)&0x01)|((c>>21L)&0x06) |
                                                  ((c>>22L)&0x38)];
                t=      des_skb[4][ (d    )&0x3f                ]|
                        des_skb[5][((d>> 7L)&0x03)|((d>> 8L)&0x3c)]|
@@ -245,3 +394,9 @@ int des_key_sched(const_des_cblock *key, des_key_schedule schedule)
        {
        return(des_set_key(key,schedule));
        }
+
+#undef des_fixup_key_parity
+void des_fixup_key_parity(des_cblock *key)
+       {
+       des_set_odd_parity(key);
+       }
index ba686d8..e69de29 100644 (file)
@@ -1,198 +0,0 @@
-#!/usr/local/bin/perl
-
-sub lab_shift
-       {
-       local(*a,$n)=@_;
-       local(@r,$i,$j,$k,$d,@z);
-
-       @r=&shift(*a,$n);
-       foreach $i (0 .. 31)
-               {
-               @z=split(/\^/,$r[$i]);
-               for ($j=0; $j <= $#z; $j++)
-                       {
-                       ($d)=($z[$j] =~ /^(..)/);
-                       ($k)=($z[$j] =~ /\[(.*)\]$/);
-                       $k.=",$n" if ($k ne "");
-                       $k="$n"   if ($k eq "");
-                       $d="$d[$k]";
-                       $z[$j]=$d;
-                       }
-               $r[$i]=join('^',@z);
-               }
-       return(@r);
-       }
-
-sub shift
-       {
-       local(*a,$n)=@_;
-       local(@f);
-
-       if ($n > 0)
-               {
-               @f=&shiftl(*a,$n);
-               }
-       else
-               {
-               @f=&shiftr(*a,-$n);
-               }
-       return(@f);
-       }
-
-sub rotate
-       {
-       local(*a,$n)=@_;
-       local(@f);
-
-       if ($n > 0)
-               { @f=&rotatel(*a,$n); }
-       else
-               { @f=&rotater(*a,-$n); }
-       return(@f);
-       }
-
-sub rotater
-       {
-       local(*a,$n)=@_;
-       local(@f,@g);
-
-       @f=&shiftr(*a,$n);
-       @g=&shiftl(*a,32-$n);
-       $#f=31;
-       $#g=31;
-       return(&or(*f,*g));
-       }
-
-sub rotatel
-       {
-       local(*a,$n)=@_;
-       local(@f,@g);
-
-       @f=&shiftl(*a,$n);
-       @g=&shiftr(*a,32-$n);
-       $#f=31;
-       $#g=31;
-       return(&or(*f,*g));
-       }
-
-sub shiftr
-       {
-       local(*a,$n)=@_;
-       local(@r,$i);
-
-       $#r=31;
-       foreach $i (0 .. 31)
-               {
-               if (($i+$n) > 31)
-                       {
-                       $r[$i]="--";
-                       }
-               else
-                       {
-                       $r[$i]=$a[$i+$n];
-                       }
-               }
-       return(@r);
-       }
-
-sub shiftl
-       {
-       local(*a,$n)=@_;
-       local(@r,$i);
-
-       $#r=31;
-       foreach $i (0 .. 31)
-               {
-               if ($i < $n)
-                       {
-                       $r[$i]="--";
-                       }
-               else
-                       {
-                       $r[$i]=$a[$i-$n];
-                       }
-               }
-       return(@r);
-       }
-
-sub printit
-       {
-       local(@a)=@_;
-       local($i);
-
-       foreach $i (0 .. 31)
-               {
-               printf "%2s  ",$a[$i];
-               print "\n" if (($i%8) == 7);
-               }
-       print "\n";
-       }
-
-sub xor
-       {
-       local(*a,*b)=@_;
-       local(@r,$i);
-
-       $#r=31;
-       foreach $i (0 .. 31)
-               {
-               $r[$i]=&compress($a[$i].'^'.$b[$i]);
-#              $r[$i]=$a[$i]."^".$b[$i];
-               }
-       return(@r);
-       }
-
-sub and
-       {
-       local(*a,$m)=@_;
-       local(@r,$i);
-
-       $#r=31;
-       foreach $i (0 .. 31)
-               {
-               $r[$i]=(($m & (1<<$i))?($a[$i]):('--'));
-               }
-       return(@r);
-       }
-
-sub or
-       {
-       local(*a,*b)=@_;
-       local(@r,$i);
-
-       $#r=31;
-       foreach $i (0 .. 31)
-               {
-               $r[$i]='--'   if (($a[$i] eq '--') && ($b[$i] eq '--'));
-               $r[$i]=$a[$i] if (($a[$i] ne '--') && ($b[$i] eq '--'));
-               $r[$i]=$b[$i] if (($a[$i] eq '--') && ($b[$i] ne '--'));
-               $r[$i]='++'   if (($a[$i] ne '--') && ($b[$i] ne '--'));
-               }
-       return(@r);
-       }
-
-sub compress
-       {
-       local($s)=@_;
-       local($_,$i,@a,%a,$r);
-
-       $s =~ s/\^\^/\^/g;
-       $s =~ s/^\^//;
-       $s =~ s/\^$//;
-       @a=split(/\^/,$s);
-
-       while ($#a >= 0)
-               {
-               $_=shift(@a);
-               next unless /\d/;
-               $a{$_}++;
-               }
-       foreach $i (sort keys %a)
-               {
-               next if ($a{$i}%2 == 0);
-               $r.="$i^";
-               }
-       chop($r);
-       return($r);
-       }
-1;
index f2ade88..e69de29 100644 (file)
@@ -1,204 +0,0 @@
-/* crypto/des/sk.h */
-/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
- * All rights reserved.
- *
- * This package is an SSL implementation written
- * by Eric Young (eay@cryptsoft.com).
- * The implementation was written so as to conform with Netscapes SSL.
- * 
- * This library is free for commercial and non-commercial use as long as
- * the following conditions are aheared to.  The following conditions
- * apply to all code found in this distribution, be it the RC4, RSA,
- * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
- * included with this distribution is covered by the same copyright terms
- * except that the holder is Tim Hudson (tjh@cryptsoft.com).
- * 
- * Copyright remains Eric Young's, and as such any Copyright notices in
- * the code are not to be removed.
- * If this package is used in a product, Eric Young should be given attribution
- * as the author of the parts of the library used.
- * This can be in the form of a textual message at program startup or
- * in documentation (online or textual) provided with the package.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *    "This product includes cryptographic software written by
- *     Eric Young (eay@cryptsoft.com)"
- *    The word 'cryptographic' can be left out if the rouines from the library
- *    being used are not cryptographic related :-).
- * 4. If you include any Windows specific code (or a derivative thereof) from 
- *    the apps directory (application code) you must include an acknowledgement:
- *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
- * 
- * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * 
- * The licence and distribution terms for any publically available version or
- * derivative of this code cannot be changed.  i.e. this code cannot simply be
- * copied and put under another distribution licence
- * [including the GNU Public Licence.]
- */
-
-static const DES_LONG des_skb[8][64]={
-{
-/* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
-0x00000000L,0x00000010L,0x20000000L,0x20000010L,
-0x00010000L,0x00010010L,0x20010000L,0x20010010L,
-0x00000800L,0x00000810L,0x20000800L,0x20000810L,
-0x00010800L,0x00010810L,0x20010800L,0x20010810L,
-0x00000020L,0x00000030L,0x20000020L,0x20000030L,
-0x00010020L,0x00010030L,0x20010020L,0x20010030L,
-0x00000820L,0x00000830L,0x20000820L,0x20000830L,
-0x00010820L,0x00010830L,0x20010820L,0x20010830L,
-0x00080000L,0x00080010L,0x20080000L,0x20080010L,
-0x00090000L,0x00090010L,0x20090000L,0x20090010L,
-0x00080800L,0x00080810L,0x20080800L,0x20080810L,
-0x00090800L,0x00090810L,0x20090800L,0x20090810L,
-0x00080020L,0x00080030L,0x20080020L,0x20080030L,
-0x00090020L,0x00090030L,0x20090020L,0x20090030L,
-0x00080820L,0x00080830L,0x20080820L,0x20080830L,
-0x00090820L,0x00090830L,0x20090820L,0x20090830L,
-},{
-/* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */
-0x00000000L,0x02000000L,0x00002000L,0x02002000L,
-0x00200000L,0x02200000L,0x00202000L,0x02202000L,
-0x00000004L,0x02000004L,0x00002004L,0x02002004L,
-0x00200004L,0x02200004L,0x00202004L,0x02202004L,
-0x00000400L,0x02000400L,0x00002400L,0x02002400L,
-0x00200400L,0x02200400L,0x00202400L,0x02202400L,
-0x00000404L,0x02000404L,0x00002404L,0x02002404L,
-0x00200404L,0x02200404L,0x00202404L,0x02202404L,
-0x10000000L,0x12000000L,0x10002000L,0x12002000L,
-0x10200000L,0x12200000L,0x10202000L,0x12202000L,
-0x10000004L,0x12000004L,0x10002004L,0x12002004L,
-0x10200004L,0x12200004L,0x10202004L,0x12202004L,
-0x10000400L,0x12000400L,0x10002400L,0x12002400L,
-0x10200400L,0x12200400L,0x10202400L,0x12202400L,
-0x10000404L,0x12000404L,0x10002404L,0x12002404L,
-0x10200404L,0x12200404L,0x10202404L,0x12202404L,
-},{
-/* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */
-0x00000000L,0x00000001L,0x00040000L,0x00040001L,
-0x01000000L,0x01000001L,0x01040000L,0x01040001L,
-0x00000002L,0x00000003L,0x00040002L,0x00040003L,
-0x01000002L,0x01000003L,0x01040002L,0x01040003L,
-0x00000200L,0x00000201L,0x00040200L,0x00040201L,
-0x01000200L,0x01000201L,0x01040200L,0x01040201L,
-0x00000202L,0x00000203L,0x00040202L,0x00040203L,
-0x01000202L,0x01000203L,0x01040202L,0x01040203L,
-0x08000000L,0x08000001L,0x08040000L,0x08040001L,
-0x09000000L,0x09000001L,0x09040000L,0x09040001L,
-0x08000002L,0x08000003L,0x08040002L,0x08040003L,
-0x09000002L,0x09000003L,0x09040002L,0x09040003L,
-0x08000200L,0x08000201L,0x08040200L,0x08040201L,
-0x09000200L,0x09000201L,0x09040200L,0x09040201L,
-0x08000202L,0x08000203L,0x08040202L,0x08040203L,
-0x09000202L,0x09000203L,0x09040202L,0x09040203L,
-},{
-/* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */
-0x00000000L,0x00100000L,0x00000100L,0x00100100L,
-0x00000008L,0x00100008L,0x00000108L,0x00100108L,
-0x00001000L,0x00101000L,0x00001100L,0x00101100L,
-0x00001008L,0x00101008L,0x00001108L,0x00101108L,
-0x04000000L,0x04100000L,0x04000100L,0x04100100L,
-0x04000008L,0x04100008L,0x04000108L,0x04100108L,
-0x04001000L,0x04101000L,0x04001100L,0x04101100L,
-0x04001008L,0x04101008L,0x04001108L,0x04101108L,
-0x00020000L,0x00120000L,0x00020100L,0x00120100L,
-0x00020008L,0x00120008L,0x00020108L,0x00120108L,
-0x00021000L,0x00121000L,0x00021100L,0x00121100L,
-0x00021008L,0x00121008L,0x00021108L,0x00121108L,
-0x04020000L,0x04120000L,0x04020100L,0x04120100L,
-0x04020008L,0x04120008L,0x04020108L,0x04120108L,
-0x04021000L,0x04121000L,0x04021100L,0x04121100L,
-0x04021008L,0x04121008L,0x04021108L,0x04121108L,
-},{
-/* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
-0x00000000L,0x10000000L,0x00010000L,0x10010000L,
-0x00000004L,0x10000004L,0x00010004L,0x10010004L,
-0x20000000L,0x30000000L,0x20010000L,0x30010000L,
-0x20000004L,0x30000004L,0x20010004L,0x30010004L,
-0x00100000L,0x10100000L,0x00110000L,0x10110000L,
-0x00100004L,0x10100004L,0x00110004L,0x10110004L,
-0x20100000L,0x30100000L,0x20110000L,0x30110000L,
-0x20100004L,0x30100004L,0x20110004L,0x30110004L,
-0x00001000L,0x10001000L,0x00011000L,0x10011000L,
-0x00001004L,0x10001004L,0x00011004L,0x10011004L,
-0x20001000L,0x30001000L,0x20011000L,0x30011000L,
-0x20001004L,0x30001004L,0x20011004L,0x30011004L,
-0x00101000L,0x10101000L,0x00111000L,0x10111000L,
-0x00101004L,0x10101004L,0x00111004L,0x10111004L,
-0x20101000L,0x30101000L,0x20111000L,0x30111000L,
-0x20101004L,0x30101004L,0x20111004L,0x30111004L,
-},{
-/* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
-0x00000000L,0x08000000L,0x00000008L,0x08000008L,
-0x00000400L,0x08000400L,0x00000408L,0x08000408L,
-0x00020000L,0x08020000L,0x00020008L,0x08020008L,
-0x00020400L,0x08020400L,0x00020408L,0x08020408L,
-0x00000001L,0x08000001L,0x00000009L,0x08000009L,
-0x00000401L,0x08000401L,0x00000409L,0x08000409L,
-0x00020001L,0x08020001L,0x00020009L,0x08020009L,
-0x00020401L,0x08020401L,0x00020409L,0x08020409L,
-0x02000000L,0x0A000000L,0x02000008L,0x0A000008L,
-0x02000400L,0x0A000400L,0x02000408L,0x0A000408L,
-0x02020000L,0x0A020000L,0x02020008L,0x0A020008L,
-0x02020400L,0x0A020400L,0x02020408L,0x0A020408L,
-0x02000001L,0x0A000001L,0x02000009L,0x0A000009L,
-0x02000401L,0x0A000401L,0x02000409L,0x0A000409L,
-0x02020001L,0x0A020001L,0x02020009L,0x0A020009L,
-0x02020401L,0x0A020401L,0x02020409L,0x0A020409L,
-},{
-/* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
-0x00000000L,0x00000100L,0x00080000L,0x00080100L,
-0x01000000L,0x01000100L,0x01080000L,0x01080100L,
-0x00000010L,0x00000110L,0x00080010L,0x00080110L,
-0x01000010L,0x01000110L,0x01080010L,0x01080110L,
-0x00200000L,0x00200100L,0x00280000L,0x00280100L,
-0x01200000L,0x01200100L,0x01280000L,0x01280100L,
-0x00200010L,0x00200110L,0x00280010L,0x00280110L,
-0x01200010L,0x01200110L,0x01280010L,0x01280110L,
-0x00000200L,0x00000300L,0x00080200L,0x00080300L,
-0x01000200L,0x01000300L,0x01080200L,0x01080300L,
-0x00000210L,0x00000310L,0x00080210L,0x00080310L,
-0x01000210L,0x01000310L,0x01080210L,0x01080310L,
-0x00200200L,0x00200300L,0x00280200L,0x00280300L,
-0x01200200L,0x01200300L,0x01280200L,0x01280300L,
-0x00200210L,0x00200310L,0x00280210L,0x00280310L,
-0x01200210L,0x01200310L,0x01280210L,0x01280310L,
-},{
-/* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
-0x00000000L,0x04000000L,0x00040000L,0x04040000L,
-0x00000002L,0x04000002L,0x00040002L,0x04040002L,
-0x00002000L,0x04002000L,0x00042000L,0x04042000L,
-0x00002002L,0x04002002L,0x00042002L,0x04042002L,
-0x00000020L,0x04000020L,0x00040020L,0x04040020L,
-0x00000022L,0x04000022L,0x00040022L,0x04040022L,
-0x00002020L,0x04002020L,0x00042020L,0x04042020L,
-0x00002022L,0x04002022L,0x00042022L,0x04042022L,
-0x00000800L,0x04000800L,0x00040800L,0x04040800L,
-0x00000802L,0x04000802L,0x00040802L,0x04040802L,
-0x00002800L,0x04002800L,0x00042800L,0x04042800L,
-0x00002802L,0x04002802L,0x00042802L,0x04042802L,
-0x00000820L,0x04000820L,0x00040820L,0x04040820L,
-0x00000822L,0x04000822L,0x00040822L,0x04040822L,
-0x00002820L,0x04002820L,0x00042820L,0x04042820L,
-0x00002822L,0x04002822L,0x00042822L,0x04042822L,
-}};
index 01a165a..e69de29 100644 (file)
@@ -1,167 +0,0 @@
-#!/usr/local/bin/perl
-
-# des.pl tesing code
-
-require 'des.pl';
-
-$num_tests=34;
-@key_data=(
-       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-       0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-       0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-       0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
-       0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,
-       0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
-       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-       0xFE,0xDC,0xBA,0x98,0x76,0x54,0x32,0x10,
-       0x7C,0xA1,0x10,0x45,0x4A,0x1A,0x6E,0x57,
-       0x01,0x31,0xD9,0x61,0x9D,0xC1,0x37,0x6E,
-       0x07,0xA1,0x13,0x3E,0x4A,0x0B,0x26,0x86,
-       0x38,0x49,0x67,0x4C,0x26,0x02,0x31,0x9E,
-       0x04,0xB9,0x15,0xBA,0x43,0xFE,0xB5,0xB6,
-       0x01,0x13,0xB9,0x70,0xFD,0x34,0xF2,0xCE,
-       0x01,0x70,0xF1,0x75,0x46,0x8F,0xB5,0xE6,
-       0x43,0x29,0x7F,0xAD,0x38,0xE3,0x73,0xFE,
-       0x07,0xA7,0x13,0x70,0x45,0xDA,0x2A,0x16,
-       0x04,0x68,0x91,0x04,0xC2,0xFD,0x3B,0x2F,
-       0x37,0xD0,0x6B,0xB5,0x16,0xCB,0x75,0x46,
-       0x1F,0x08,0x26,0x0D,0x1A,0xC2,0x46,0x5E,
-       0x58,0x40,0x23,0x64,0x1A,0xBA,0x61,0x76,
-       0x02,0x58,0x16,0x16,0x46,0x29,0xB0,0x07,
-       0x49,0x79,0x3E,0xBC,0x79,0xB3,0x25,0x8F,
-       0x4F,0xB0,0x5E,0x15,0x15,0xAB,0x73,0xA7,
-       0x49,0xE9,0x5D,0x6D,0x4C,0xA2,0x29,0xBF,
-       0x01,0x83,0x10,0xDC,0x40,0x9B,0x26,0xD6,
-       0x1C,0x58,0x7F,0x1C,0x13,0x92,0x4F,0xEF,
-       0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
-       0x1F,0x1F,0x1F,0x1F,0x0E,0x0E,0x0E,0x0E,
-       0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1,0xFE,
-       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-       0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-       0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,
-       0xFE,0xDC,0xBA,0x98,0x76,0x54,0x32,0x10,
-       );
-
-@plain_data=(
-       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-       0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-       0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
-       0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
-       0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
-       0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,
-       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-       0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,
-       0x01,0xA1,0xD6,0xD0,0x39,0x77,0x67,0x42,
-       0x5C,0xD5,0x4C,0xA8,0x3D,0xEF,0x57,0xDA,
-       0x02,0x48,0xD4,0x38,0x06,0xF6,0x71,0x72,
-       0x51,0x45,0x4B,0x58,0x2D,0xDF,0x44,0x0A,
-       0x42,0xFD,0x44,0x30,0x59,0x57,0x7F,0xA2,
-       0x05,0x9B,0x5E,0x08,0x51,0xCF,0x14,0x3A,
-       0x07,0x56,0xD8,0xE0,0x77,0x47,0x61,0xD2,
-       0x76,0x25,0x14,0xB8,0x29,0xBF,0x48,0x6A,
-       0x3B,0xDD,0x11,0x90,0x49,0x37,0x28,0x02,
-       0x26,0x95,0x5F,0x68,0x35,0xAF,0x60,0x9A,
-       0x16,0x4D,0x5E,0x40,0x4F,0x27,0x52,0x32,
-       0x6B,0x05,0x6E,0x18,0x75,0x9F,0x5C,0xCA,
-       0x00,0x4B,0xD6,0xEF,0x09,0x17,0x60,0x62,
-       0x48,0x0D,0x39,0x00,0x6E,0xE7,0x62,0xF2,
-       0x43,0x75,0x40,0xC8,0x69,0x8F,0x3C,0xFA,
-       0x07,0x2D,0x43,0xA0,0x77,0x07,0x52,0x92,
-       0x02,0xFE,0x55,0x77,0x81,0x17,0xF1,0x2A,
-       0x1D,0x9D,0x5C,0x50,0x18,0xF7,0x28,0xC2,
-       0x30,0x55,0x32,0x28,0x6D,0x6F,0x29,0x5A,
-       0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,
-       0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,
-       0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,
-       0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-       0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF);
-
-@cipher_data=(
-       0x8C,0xA6,0x4D,0xE9,0xC1,0xB1,0x23,0xA7,
-       0x73,0x59,0xB2,0x16,0x3E,0x4E,0xDC,0x58,
-       0x95,0x8E,0x6E,0x62,0x7A,0x05,0x55,0x7B,
-       0xF4,0x03,0x79,0xAB,0x9E,0x0E,0xC5,0x33,
-       0x17,0x66,0x8D,0xFC,0x72,0x92,0x53,0x2D,
-       0x8A,0x5A,0xE1,0xF8,0x1A,0xB8,0xF2,0xDD,
-       0x8C,0xA6,0x4D,0xE9,0xC1,0xB1,0x23,0xA7,
-       0xED,0x39,0xD9,0x50,0xFA,0x74,0xBC,0xC4,
-       0x69,0x0F,0x5B,0x0D,0x9A,0x26,0x93,0x9B,
-       0x7A,0x38,0x9D,0x10,0x35,0x4B,0xD2,0x71,
-       0x86,0x8E,0xBB,0x51,0xCA,0xB4,0x59,0x9A,
-       0x71,0x78,0x87,0x6E,0x01,0xF1,0x9B,0x2A,
-       0xAF,0x37,0xFB,0x42,0x1F,0x8C,0x40,0x95,
-       0x86,0xA5,0x60,0xF1,0x0E,0xC6,0xD8,0x5B,
-       0x0C,0xD3,0xDA,0x02,0x00,0x21,0xDC,0x09,
-       0xEA,0x67,0x6B,0x2C,0xB7,0xDB,0x2B,0x7A,
-       0xDF,0xD6,0x4A,0x81,0x5C,0xAF,0x1A,0x0F,
-       0x5C,0x51,0x3C,0x9C,0x48,0x86,0xC0,0x88,
-       0x0A,0x2A,0xEE,0xAE,0x3F,0xF4,0xAB,0x77,
-       0xEF,0x1B,0xF0,0x3E,0x5D,0xFA,0x57,0x5A,
-       0x88,0xBF,0x0D,0xB6,0xD7,0x0D,0xEE,0x56,
-       0xA1,0xF9,0x91,0x55,0x41,0x02,0x0B,0x56,
-       0x6F,0xBF,0x1C,0xAF,0xCF,0xFD,0x05,0x56,
-       0x2F,0x22,0xE4,0x9B,0xAB,0x7C,0xA1,0xAC,
-       0x5A,0x6B,0x61,0x2C,0xC2,0x6C,0xCE,0x4A,
-       0x5F,0x4C,0x03,0x8E,0xD1,0x2B,0x2E,0x41,
-       0x63,0xFA,0xC0,0xD0,0x34,0xD9,0xF7,0x93,
-       0x61,0x7B,0x3A,0x0C,0xE8,0xF0,0x71,0x00,
-       0xDB,0x95,0x86,0x05,0xF8,0xC8,0xC6,0x06,
-       0xED,0xBF,0xD1,0xC6,0x6C,0x29,0xCC,0xC7,
-       0x35,0x55,0x50,0xB2,0x15,0x0E,0x24,0x51,
-       0xCA,0xAA,0xAF,0x4D,0xEA,0xF1,0xDB,0xAE,
-       0xD5,0xD4,0x4F,0xF7,0x20,0x68,0x3D,0x0D,
-       0x2A,0x2B,0xB0,0x08,0xDF,0x97,0xC2,0xF2);
-
-print "Doing ecb tests\n";
-for ($i=0; $i<$num_tests; $i++)
-       {
-       printf "Doing test $i\n";
-       $key =pack("C8",splice(@key_data   ,0,8));
-       $data=pack("C8",splice(@plain_data ,0,8));
-       $res =pack("C8",splice(@cipher_data,0,8));
-
-       @ks=  &des_set_key($key);
-       $out1= &des_ecb_encrypt(*ks,1,$data);
-       $out2= &des_ecb_encrypt(*ks,0,$out1);
-       $out3= &des_ecb_encrypt(*ks,0,$res);
-       &eprint("encryption failure",$res,$out1)
-               if ($out1 ne $res);
-       &eprint("encryption/decryption failure",$data,$out2)
-               if ($out2 ne $data);
-       &eprint("decryption failure",$data,$out3)
-               if ($data ne $out3);
-       }
-print "Done\n";
-
-print "doing speed test over 30 seconds\n";
-$SIG{'ALRM'}='done';
-sub done {$done=1;}
-$done=0;
-
-$count=0;
-$d=pack("C8",0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef);
-@ks=  &des_set_key($d);
-alarm(30);
-$start=(times)[0];
-while (!$done)
-       {
-       $count++;
-       $d=&des_ecb_encrypt(*ks,1,$d);
-       }
-$end=(times)[0];
-$t=$end-$start;
-printf "$count DESs in %.2f seconds is %.2f DESs/sec or %.2f bytes/sec\n",
-       1.0*$t,1.0*$count/$t,$count*8.0/$t;
-
-sub eprint
-       {
-       local($s,$c,$e)=@_;
-       local(@k);
-
-       @k=unpack("C8",$c);
-       printf "%02x%02x%02x%02x %02x%02x%02x%02x - ",unpack("C8",$c);
-       printf "%02x%02x%02x%02x %02x%02x%02x%02x :",unpack("C8",$e);
-       print " $s\n";
-       }
index 0348bd2..ff2d168 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index dca41d8..a8f75bd 100644 (file)
@@ -56,7 +56,7 @@ the default method is used.
      /* compute shared secret */
         int (*compute_key)(unsigned char *key, BIGNUM *pub_key, DH *dh);
 
-     /* compute r = a ^ p mod m. May be NULL */
+     /* compute r = a ^ p mod m (May be NULL for some implementations) */
         int (*bn_mod_exp)(DH *dh, BIGNUM *r, BIGNUM *a, const BIGNUM *p,
                                 const BIGNUM *m, BN_CTX *ctx,
                                 BN_MONT_CTX *m_ctx);
index 0b13ec9..edec464 100644 (file)
@@ -62,12 +62,13 @@ struct
        int (*dsa_do_verify)(const unsigned char *dgst, int dgst_len,
                                  DSA_SIG *sig, DSA *dsa);
 
-     /* compute rr = a1^p1 * a2^p2 mod m. May be NULL */
+     /* compute rr = a1^p1 * a2^p2 mod m (May be NULL for some
+                                          implementations) */
        int (*dsa_mod_exp)(DSA *dsa, BIGNUM *rr, BIGNUM *a1, BIGNUM *p1,
                                  BIGNUM *a2, BIGNUM *p2, BIGNUM *m,
                                  BN_CTX *ctx, BN_MONT_CTX *in_mont);
 
-     /* compute r = a ^ p mod m. May be NULL */
+     /* compute r = a ^ p mod m (May be NULL for some implementations) */
         int (*bn_mod_exp)(DSA *dsa, BIGNUM *r, BIGNUM *a,
                                  const BIGNUM *p, const BIGNUM *m,
                                  BN_CTX *ctx, BN_MONT_CTX *m_ctx);
diff --git a/lib/libcrypto/doc/EVP_OpenInit.pod b/lib/libcrypto/doc/EVP_OpenInit.pod
new file mode 100644 (file)
index 0000000..9707a4b
--- /dev/null
@@ -0,0 +1,51 @@
+=pod
+
+=head1 NAME
+
+EVP_OpenInit, EVP_OpenUpdate, EVP_OpenFinal - EVP envelope decryption
+
+=head1 SYNOPSIS
+
+ #include <openssl/evp.h>
+
+ int EVP_OpenInit(EVP_CIPHER_CTX *ctx,EVP_CIPHER *type,unsigned char *ek,
+               int ekl,unsigned char *iv,EVP_PKEY *priv);
+ void EVP_OpenUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out,
+         int *outl, unsigned char *in, int inl);
+ void EVP_OpenFinal(EVP_CIPHER_CTX *ctx, unsigned char *out,
+         int *outl);
+
+=head1 DESCRIPTION
+
+The EVP envelope routines are a high level interface to envelope
+decryption. They decrypt a public key encrypted symmetric key and
+then decrypt data using it.
+
+EVP_OpenInit() initialises a cipher context B<ctx> for decryption
+with cipher B<type>. It decrypts the encrypted symmetric key of length
+B<ekl> bytes passed in the B<ek> parameter using the private key B<priv>.
+The IV is supplied in the B<iv> parameter.
+
+EVP_OpenUpdate() and EVP_OpenFinal() have exactly the same properties
+as the EVP_DecryptUpdate() and EVP_DecryptFinal() routines, as 
+documented on the L<EVP_EncryptInit(3)|EVP_EncryptInit(3)> manual
+page. 
+
+=head1 RETURN VALUES
+
+EVP_OpenInit() returns -1 on error or an non zero integer (actually the
+recovered secret key size) if successful.
+
+EVP_SealUpdate() does not return a value.
+
+EVP_SealFinal() returns 0 if the decrypt failed or 1 for success.
+
+=head1 SEE ALSO
+
+L<evp(3)|evp(3)>,L<rand(3)|rand(3)>
+L<EVP_EncryptInit(3)|EVP_EncryptInit(3)>,
+L<EVP_SealInit(3)|EVP_SealInit(3)>
+
+=head1 HISTORY
+
+=cut
diff --git a/lib/libcrypto/doc/EVP_SealInit.pod b/lib/libcrypto/doc/EVP_SealInit.pod
new file mode 100644 (file)
index 0000000..1579d11
--- /dev/null
@@ -0,0 +1,70 @@
+=pod
+
+=head1 NAME
+
+EVP_SealInit, EVP_SealUpdate, EVP_SealFinal - EVP envelope encryption
+
+=head1 SYNOPSIS
+
+ #include <openssl/evp.h>
+
+ int EVP_SealInit(EVP_CIPHER_CTX *ctx, EVP_CIPHER *type, unsigned char **ek,
+               int *ekl, unsigned char *iv,EVP_PKEY **pubk, int npubk);
+ void EVP_SealUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out,
+         int *outl, unsigned char *in, int inl);
+ void EVP_SealFinal(EVP_CIPHER_CTX *ctx, unsigned char *out,
+         int *outl);
+
+=head1 DESCRIPTION
+
+The EVP envelope routines are a high level interface to envelope
+encryption. They generate a random key and then "envelope" it by
+using public key encryption. Data can then be encrypted using this
+key.
+
+EVP_SealInit() initialises a cipher context B<ctx> for encryption
+with cipher B<type> using a random secret key and IV supplied in
+the B<iv> parameter. B<type> is normally supplied by a function such
+as EVP_des_cbc(). The secret key is encrypted using one or more public
+keys, this allows the same encrypted data to be decrypted using any
+of the corresponding private keys. B<ek> is an array of buffers where
+the public key encrypted secret key will be written, each buffer must
+contain enough room for the corresponding encrypted key: that is
+B<ek[i]> must have room for B<EVP_PKEY_size(pubk[i])> bytes. The actual
+size of each encrypted secret key is written to the array B<ekl>. B<pubk> is
+an array of B<npubk> public keys.
+
+EVP_SealUpdate() and EVP_SealFinal() have exactly the same properties
+as the EVP_EncryptUpdate() and EVP_EncryptFinal() routines, as 
+documented on the L<EVP_EncryptInit(3)|EVP_EncryptInit(3)> manual
+page. 
+
+=head1 RETURN VALUES
+
+EVP_SealInit() returns -1 on error or B<npubk> if successful.
+
+EVP_SealUpdate() and EVP_SealFinal() do not return values.
+
+=head1 NOTES
+
+Because a random secret key is generated the random number generator
+must be seeded before calling EVP_SealInit().
+
+The public key must be RSA because it is the only OpenSSL public key
+algorithm that supports key transport.
+
+Envelope encryption is the usual method of using public key encryption
+on large amounts of data, this is because public key encryption is slow
+but symmetric encryption is fast. So symmetric encryption is used for
+bulk encryption and the small random symmetric key used is transferred
+using public key encryption.
+
+=head1 SEE ALSO
+
+L<evp(3)|evp(3)>,L<rand(3)|rand(3)>
+L<EVP_EncryptInit(3)|EVP_EncryptInit(3)>,
+L<EVP_OpenInit(3)|EVP_OpenInit(3)>
+
+=head1 HISTORY
+
+=cut
diff --git a/lib/libcrypto/doc/EVP_SignInit.pod b/lib/libcrypto/doc/EVP_SignInit.pod
new file mode 100644 (file)
index 0000000..bbc9203
--- /dev/null
@@ -0,0 +1,85 @@
+=pod
+
+=head1 NAME
+
+EVP_SignInit, EVP_SignUpdate, EVP_SignFinal - EVP signing functions
+
+=head1 SYNOPSIS
+
+ #include <openssl/evp.h>
+
+ void EVP_SignInit(EVP_MD_CTX *ctx, const EVP_MD *type);
+ void EVP_SignUpdate(EVP_MD_CTX *ctx, const void *d, unsigned int cnt);
+ int EVP_SignFinal(EVP_MD_CTX *ctx,unsigned char *sig,unsigned int *s, EVP_PKEY *pkey);
+
+ int EVP_PKEY_size(EVP_PKEY *pkey);
+
+=head1 DESCRIPTION
+
+The EVP signature routines are a high level interface to digital
+signatures.
+
+EVP_SignInit() initialises a signing context B<ctx> to using digest
+B<type>: this will typically be supplied by a function such as
+EVP_sha1().
+
+EVP_SignUpdate() hashes B<cnt> bytes of data at B<d> into the
+signature context B<ctx>. This funtion can be called several times on the
+same B<ctx> to include additional data.
+
+EVP_SignFinal() signs the data in B<ctx> using the private key B<pkey>
+and places the signature in B<sig>. If the B<s> parameter is not NULL
+then the number of bytes of data written (i.e. the length of the signature)
+will be written to the integer at B<s>, at most EVP_PKEY_size(pkey) bytes
+will be written.  After calling EVP_SignFinal() no additional calls to
+EVP_SignUpdate() can be made, but EVP_SignInit() can be called to initialiase
+a new signature operation.
+
+EVP_PKEY_size() returns the maximum size of a signature in bytes. The actual
+signature returned by EVP_SignFinal() may be smaller.
+
+=head1 RETURN VALUES
+
+EVP_SignInit() and EVP_SignUpdate() do not return values.
+
+EVP_SignFinal() returns 1 for success and 0 for failure.
+
+EVP_PKEY_size() returns the maximum size of a signature in bytes.
+
+The error codes can be obtained by L<ERR_get_error(3)|ERR_get_error(3)>.
+
+=head1 NOTES
+
+The B<EVP> interface to digital signatures should almost always be used in
+preference to the low level interfaces. This is because the code then becomes
+transparent to the algorithm used and much more flexible.
+
+Due to the link between message digests and public key algorithms the correct
+digest algorithm must be used with the correct public key type. A list of
+algorithms and associated public key algorithms appears in 
+L<EVP_DigestInit(3)|EVP_DigestInit(3)>.
+
+When signing with DSA private keys the random number generator must be seeded
+or the operation will fail. The random number generator does not need to be
+seeded for RSA signatures.
+
+=head1 BUGS
+
+Several of the functions do not return values: maybe they should. Although the
+internal digest operations will never fail some future hardware based operations
+might.
+
+=head1 SEE ALSO
+
+L<EVP_VerifyInit(3)|EVP_VerifyInit(3)>,
+L<EVP_DigestInit(3)|EVP_DigestInit(3)>, L<err(3)|err(3)>,
+L<evp(3)|evp(3)>, L<hmac(3)|hmac(3)>, L<md2(3)|md2(3)>,
+L<md5(3)|md5(3)>, L<mdc2(3)|mdc2(3)>, L<ripemd(3)|ripemd(3)>,
+L<sha(3)|sha(3)>, L<digest(1)|digest(1)>
+
+=head1 HISTORY
+
+EVP_SignInit(), EVP_SignUpdate() and EVP_SignFinal() are
+available in all versions of SSLeay and OpenSSL.
+
+=cut
diff --git a/lib/libcrypto/doc/EVP_VerifyInit.pod b/lib/libcrypto/doc/EVP_VerifyInit.pod
new file mode 100644 (file)
index 0000000..3b5e07f
--- /dev/null
@@ -0,0 +1,71 @@
+=pod
+
+=head1 NAME
+
+EVP_VerifyInit, EVP_VerifyUpdate, EVP_VerifyFinal - EVP signature verification functions
+
+=head1 SYNOPSIS
+
+ #include <openssl/evp.h>
+
+ void EVP_VerifyInit(EVP_MD_CTX *ctx, const EVP_MD *type);
+ void EVP_VerifyUpdate(EVP_MD_CTX *ctx, const void *d, unsigned int cnt);
+ int EVP_VerifyFinal(EVP_MD_CTX *ctx,unsigned char *sigbuf, unsigned int siglen,EVP_PKEY *pkey);
+
+=head1 DESCRIPTION
+
+The EVP signature verification routines are a high level interface to digital
+signatures.
+
+EVP_VerifyInit() initialises a verification context B<ctx> to using digest
+B<type>: this will typically be supplied by a function such as EVP_sha1().
+
+EVP_VerifyUpdate() hashes B<cnt> bytes of data at B<d> into the
+verification context B<ctx>. This funtion can be called several times on the
+same B<ctx> to include additional data.
+
+EVP_VerifyFinal() verifies the data in B<ctx> using the public key B<pkey>
+and against the B<siglen> bytes at B<sigbuf>. After calling EVP_VerifyFinal()
+no additional calls to EVP_VerifyUpdate() can be made, but EVP_VerifyInit()
+can be called to initialiase a new verification operation.
+
+=head1 RETURN VALUES
+
+EVP_VerifyInit() and EVP_VerifyUpdate() do not return values.
+
+EVP_VerifyFinal() returns 1 for a correct signature, 0 for failure and -1 if some
+other error occurred.
+
+The error codes can be obtained by L<ERR_get_error(3)|ERR_get_error(3)>.
+
+=head1 NOTES
+
+The B<EVP> interface to digital signatures should almost always be used in
+preference to the low level interfaces. This is because the code then becomes
+transparent to the algorithm used and much more flexible.
+
+Due to the link between message digests and public key algorithms the correct
+digest algorithm must be used with the correct public key type. A list of
+algorithms and associated public key algorithms appears in 
+L<EVP_DigestInit(3)|EVP_DigestInit(3)>.
+
+=head1 BUGS
+
+Several of the functions do not return values: maybe they should. Although the
+internal digest operations will never fail some future hardware based operations
+might.
+
+=head1 SEE ALSO
+
+L<EVP_SignInit(3)|EVP_SignInit(3)>,
+L<EVP_DigestInit(3)|EVP_DigestInit(3)>, L<err(3)|err(3)>,
+L<evp(3)|evp(3)>, L<hmac(3)|hmac(3)>, L<md2(3)|md2(3)>,
+L<md5(3)|md5(3)>, L<mdc2(3)|mdc2(3)>, L<ripemd(3)|ripemd(3)>,
+L<sha(3)|sha(3)>, L<digest(1)|digest(1)>
+
+=head1 HISTORY
+
+EVP_VerifyInit(), EVP_VerifyUpdate() and EVP_VerifyFinal() are
+available in all versions of SSLeay and OpenSSL.
+
+=cut
index 0a13ec2..67c66f3 100644 (file)
@@ -2,7 +2,8 @@
 
 =head1 NAME
 
-RAND_add, RAND_seed, RAND_screen - add entropy to the PRNG
+RAND_add, RAND_seed, RAND_status, RAND_event, RAND_screen - add
+entropy to the PRNG
 
 =head1 SYNOPSIS
 
@@ -14,6 +15,7 @@ RAND_add, RAND_seed, RAND_screen - add entropy to the PRNG
 
  int  RAND_status(void);
 
+ int  RAND_event(UINT iMsg, WPARAM wParam, LPARAM lParam);
  void RAND_screen(void);
 
 =head1 DESCRIPTION
@@ -40,17 +42,24 @@ or L<RAND_load_file(3)|RAND_load_file(3)>.
 
 RAND_seed() is equivalent to RAND_add() when B<num == entropy>.
 
+RAND_event() collects the entropy from Windows events such as mouse
+movements and other user interaction. It should be called with the
+B<iMsg>, B<wParam> and B<lParam> arguments of I<all> messages sent to
+the window procedure. It will estimate the entropy contained in the
+event message (if any), and add it to the PRNG. The program can then
+process the messages as usual.
+
 The RAND_screen() function is available for the convenience of Windows
 programmers. It adds the current contents of the screen to the PRNG.
-For applications that can catch Windows events, seeding the PRNG with
-the parameters of B<WM_MOUSEMOVE> events is a significantly better
-source of randomness. It should be noted that both methods cannot be
-used on servers that run without user interaction.
+For applications that can catch Windows events, seeding the PRNG by
+calling RAND_event() is a significantly better source of
+randomness. It should be noted that both methods cannot be used on
+servers that run without user interaction.
 
 =head1 RETURN VALUES
 
-RAND_status() returns 1 if the PRNG has been seeded with enough data,
-0 otherwise.
+RAND_status() and RAND_event() return 1 if the PRNG has been seeded
+with enough data, 0 otherwise.
 
 The other functions do not return values.
 
@@ -63,6 +72,6 @@ L<RAND_load_file(3)|RAND_load_file(3)>, L<RAND_cleanup(3)|RAND_cleanup(3)>
 
 RAND_seed() and RAND_screen() are available in all versions of SSLeay
 and OpenSSL. RAND_add() and RAND_status() have been added in OpenSSL
-0.9.5.
+0.9.5, RAND_event() in OpenSSL 0.9.5a.
 
 =cut
index 466e9b8..464eba4 100644 (file)
@@ -34,10 +34,12 @@ RAND_get_rand_method() returns a pointer to the current method.
         void (*cleanup)(void);
         void (*add)(const void *buf, int num, int entropy);
         int (*pseudorand)(unsigned char *buf, int num);
+       int (*status)(void);
  } RAND_METHOD;
 
 The components point to the implementation of RAND_seed(),
-RAND_bytes(), RAND_cleanup(), RAND_add() and RAND_pseudo_rand().
+RAND_bytes(), RAND_cleanup(), RAND_add(), RAND_pseudo_rand()
+and RAND_status().
 Each component may be NULL if the function is not implemented.
 
 =head1 RETURN VALUES
index deb1183..14b0b4c 100644 (file)
@@ -87,10 +87,11 @@ the default method is used.
        int (*rsa_priv_dec)(int flen, unsigned char *from,
           unsigned char *to, RSA *rsa, int padding);
 
-     /* compute r0 = r0 ^ I mod rsa->n. May be NULL */
+     /* compute r0 = r0 ^ I mod rsa->n (May be NULL for some
+                                        implementations) */
        int (*rsa_mod_exp)(BIGNUM *r0, BIGNUM *I, RSA *rsa);
 
-     /* compute r = a ^ p mod m. May be NULL */
+     /* compute r = a ^ p mod m (May be NULL for some implementations) */
        int (*bn_mod_exp)(BIGNUM *r, BIGNUM *a, const BIGNUM *p,
           const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx);
 
index 0486c04..eb8ba61 100644 (file)
@@ -86,8 +86,9 @@ contain public as well as private RSA keys:
 In public keys, the private exponent and the related secret values are
 B<NULL>.
 
-B<dmp1>, B<dmq1> and B<iqmp> may be B<NULL> in private keys, but the
-RSA operations are much faster when these values are available.
+B<p>, B<q>, B<dmp1>, B<dmq1> and B<iqmp> may be B<NULL> in private
+keys, but the RSA operations are much faster when these values are
+available.
 
 =head1 CONFORMING TO
 
index 38e4af9..2b3ab3a 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index ab7f38f..5aef2d5 100644 (file)
@@ -84,7 +84,8 @@ int DSA_generate_key(DSA *dsa)
        i=BN_num_bits(dsa->q);
        for (;;)
                {
-               BN_rand(priv_key,i,1,0);
+               if (!BN_rand(priv_key,i,1,0))
+                       goto err;
                if (BN_cmp(priv_key,dsa->q) >= 0)
                        BN_sub(priv_key,priv_key,dsa->q);
                if (!BN_is_zero(priv_key)) break;
index 93c64cb..eb8c76a 100644 (file)
  * copied and put under another distribution licence
  * [including the GNU Public Licence.]
  */
+/* ====================================================================
+ * Copyright (c) 1998-2000 The OpenSSL Project.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer. 
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. All advertising materials mentioning features or use of this
+ *    software must display the following acknowledgment:
+ *    "This product includes software developed by the OpenSSL Project
+ *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
+ *
+ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
+ *    endorse or promote products derived from this software without
+ *    prior written permission. For written permission, please contact
+ *    openssl-core@openssl.org.
+ *
+ * 5. Products derived from this software may not be called "OpenSSL"
+ *    nor may "OpenSSL" appear in their names without prior written
+ *    permission of the OpenSSL Project.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ *    acknowledgment:
+ *    "This product includes software developed by the OpenSSL Project
+ *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This product includes cryptographic software written by Eric Young
+ * (eay@cryptsoft.com).  This product includes software written by Tim
+ * Hudson (tjh@cryptsoft.com).
+ *
+ */
 
 #include <stdio.h>
 #include <stdarg.h>
+#include <string.h>
 #include <openssl/lhash.h>
 #include <openssl/crypto.h>
 #include "cryptlib.h"
@@ -154,6 +208,54 @@ static ERR_STRING_DATA ERR_str_reasons[]=
 
 {0,NULL},
        };
+
+
+#define NUM_SYS_STR_REASONS 127
+#define LEN_SYS_STR_REASON 32
+
+static ERR_STRING_DATA SYS_str_reasons[NUM_SYS_STR_REASONS + 1];
+/* SYS_str_reasons is filled with copies of strerror() results at
+ * initialization.
+ * 'errno' values up to 127 should cover all usual errors,
+ * others will be displayed numerically by ERR_error_string.
+ * It is crucial that we have something for each reason code
+ * that occurs in ERR_str_reasons, or bogus reason strings
+ * will be returned for SYSerr(), which always gets an errno
+ * value and never one of those 'standard' reason codes. */
+
+static void build_SYS_str_reasons()
+       {
+       /* Malloc cannot be used here, use static storage instead */
+       static char strerror_tab[NUM_SYS_STR_REASONS][LEN_SYS_STR_REASON];
+       int i;
+
+       CRYPTO_w_lock(CRYPTO_LOCK_ERR_HASH);
+
+       for (i = 1; i <= NUM_SYS_STR_REASONS; i++)
+               {
+               ERR_STRING_DATA *str = &SYS_str_reasons[i - 1];
+
+               str->error = (unsigned long)i;
+               if (str->string == NULL)
+                       {
+                       char (*dest)[LEN_SYS_STR_REASON] = &(strerror_tab[i - 1]);
+                       char *src = strerror(i);
+                       if (src != NULL)
+                               {
+                               strncpy(*dest, src, sizeof *dest);
+                               (*dest)[sizeof *dest - 1] = '\0';
+                               str->string = *dest;
+                               }
+                       }
+               if (str->string == NULL)
+                       str->string = "unknown";
+               }
+
+       /* Now we still have SYS_str_reasons[NUM_SYS_STR_REASONS] = {0, NULL},
+        * as required by ERR_load_strings. */
+
+       CRYPTO_w_unlock(CRYPTO_LOCK_ERR_HASH);
+       }
 #endif
 
 #define err_clear_data(p,i) \
@@ -191,14 +293,16 @@ void ERR_load_ERR_strings(void)
                        CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
                        return;
                        }
-               init=0;
                CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
 
 #ifndef NO_ERR
                ERR_load_strings(0,ERR_str_libraries);
                ERR_load_strings(0,ERR_str_reasons);
                ERR_load_strings(ERR_LIB_SYS,ERR_str_functs);
+               build_SYS_str_reasons();
+               ERR_load_strings(ERR_LIB_SYS,SYS_str_reasons);
 #endif
+               init=0;
                }
        }
 
index 97953a0..fc149cb 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index d5e6f58..4ab091f 100644 (file)
@@ -133,7 +133,7 @@ EVP_PKEY *EVP_PKCS82PKEY (PKCS8_PRIV_KEY_INFO *p8)
                     * SEQUENCE {parameters, priv_key}
                     * SEQUENCE {pub_key, priv_key}
                     */
-                     
+
                    t1 = (ASN1_TYPE *)sk_value(ndsa, 0);
                    t2 = (ASN1_TYPE *)sk_value(ndsa, 1);
                    if(t1->type == V_ASN1_SEQUENCE) {
@@ -152,7 +152,14 @@ EVP_PKEY *EVP_PKCS82PKEY (PKCS8_PRIV_KEY_INFO *p8)
                        goto dsaerr;
                    }
                    privkey = t2->value.integer;
-               } else if (!(privkey=d2i_ASN1_INTEGER (NULL, &p, pkeylen))) {
+               } else {
+                       if (!(privkey=d2i_ASN1_INTEGER (NULL, &p, pkeylen))) {
+                               EVPerr(EVP_F_EVP_PKCS82PKEY, EVP_R_DECODE_ERROR);
+                               goto dsaerr;
+                       }
+                       param = p8->pkeyalg->parameter;
+               }
+               if (!param || (param->type != V_ASN1_SEQUENCE)) {
                        EVPerr(EVP_F_EVP_PKCS82PKEY, EVP_R_DECODE_ERROR);
                        goto dsaerr;
                }
@@ -186,7 +193,8 @@ EVP_PKEY *EVP_PKCS82PKEY (PKCS8_PRIV_KEY_INFO *p8)
 
                EVP_PKEY_assign_DSA(pkey, dsa);
                BN_CTX_free (ctx);
-               sk_pop_free(ndsa, ASN1_TYPE_free);
+               if(ndsa) sk_pop_free(ndsa, ASN1_TYPE_free);
+               else ASN1_INTEGER_free(privkey);
                break;
                dsaerr:
                BN_CTX_free (ctx);
index 3e8f460..620f43f 100644 (file)
@@ -114,5 +114,10 @@ void EVP_cleanup(void)
        {
        OBJ_NAME_cleanup(OBJ_NAME_TYPE_CIPHER_METH);
        OBJ_NAME_cleanup(OBJ_NAME_TYPE_MD_METH);
+       /* The above calls will only clean out the contents of the name
+          hash table, but not the hash table itself.  The following line
+          does that part.  -- Richard Levitte */
+       OBJ_NAME_cleanup(-1);
+
        EVP_PBE_cleanup();
        }
index 23b7c98..e1ec79e 100644 (file)
@@ -88,9 +88,11 @@ void HMAC_Init(HMAC_CTX *ctx, const void *key, int len,
                else
                        {
                        memcpy(ctx->key,key,len);
-                       memset(&(ctx->key[len]),0,sizeof(ctx->key)-len);
                        ctx->key_length=len;
                        }
+               if(ctx->key_length != HMAC_MAX_MD_CBLOCK)
+                       memset(&ctx->key[ctx->key_length], 0,
+                               HMAC_MAX_MD_CBLOCK - ctx->key_length);
                }
 
        if (reset)      
index 6a340a2..7eb92a1 100644 (file)
@@ -159,7 +159,7 @@ void lh_free(LHASH *lh)
        unsigned int i;
        LHASH_NODE *n,*nn;
 
-       if(lh == NULL)
+       if (lh == NULL)
            return;
 
        for (i=0; i<lh->num_nodes; i++)
@@ -422,21 +422,6 @@ static LHASH_NODE **getrn(LHASH *lh, void *data, unsigned long *rhash)
        return(ret);
        }
 
-/*
-unsigned long lh_strhash(char *str)
-       {
-       int i,l;
-       unsigned long ret=0;
-       unsigned short *s;
-
-       if (str == NULL) return(0);
-       l=(strlen(str)+1)/2;
-       s=(unsigned short *)str;
-       for (i=0; i<l; i++)
-               ret^=(s[i]<<(i&0x0f));
-       return(ret);
-       } */
-
 /* The following hash seems to work very well on normal text strings
  * no collisions on /usr/dict/words and it distributes on %2^n quite
  * well, not as good as MD5, but still good.
@@ -470,3 +455,7 @@ unsigned long lh_strhash(const char *c)
        return((ret>>16)^ret);
        }
 
+unsigned long lh_num_items(LHASH *lh)
+       {
+       return lh ? lh->num_items : 0;
+       }
index 6f6eeb2..d315fd9 100644 (file)
@@ -124,6 +124,7 @@ void *lh_retrieve(LHASH *lh, void *data);
     void lh_doall(LHASH *lh, void (*func)(/*void *b*/));
 void lh_doall_arg(LHASH *lh, void (*func)(/*void *a,void *b*/),void *arg);
 unsigned long lh_strhash(const char *c);
+unsigned long lh_num_items(LHASH *lh);
 
 #ifndef NO_FP_API
 void lh_stats(LHASH *lh, FILE *out);
index d50f967..45fbd04 100644 (file)
@@ -55,7 +55,7 @@ lib:    $(LIBOBJ)
 
 # elf
 asm/mx86-elf.o: asm/mx86unix.cpp
-       $(CPP) -DELF asm/mx86unix.cpp | as -o asm/mx86-elf.o
+       $(CPP) -DELF -x c asm/mx86unix.cpp | as -o asm/mx86-elf.o
 
 # solaris
 asm/mx86-sol.o: asm/mx86unix.cpp
@@ -71,7 +71,7 @@ asm/mx86-out.o: asm/mx86unix.cpp
 asm/mx86bsdi.o: asm/mx86unix.cpp
        $(CPP) -DBSDI asm/mx86unix.cpp | sed 's/ :/:/' | as -o asm/mx86bsdi.o
 
-asm/mx86unix.cpp: asm/md5-586.pl
+asm/mx86unix.cpp: asm/md5-586.pl ../perlasm/x86asm.pl
        (cd asm; $(PERL) md5-586.pl cpp >mx86unix.cpp)
 
 asm/md5-sparcv8plus.o: asm/md5-sparcv9.S
index d21c72f..e69de29 100644 (file)
@@ -1,110 +0,0 @@
-# Targets
-# make          - twidle the options yourself :-)
-# make cc       - standard cc options
-# make gcc      - standard gcc options
-# make x86-elf  - linux-elf etc
-# make x86-out  - linux-a.out, FreeBSD etc
-# make x86-solaris
-# make x86-bdsi
-
-DIR=    md5
-TOP=    .
-CC=     gcc
-CFLAG= -O3 -fomit-frame-pointer
-
-CPP=    $(CC) -E
-INCLUDES=
-INSTALLTOP=/usr/local/lib
-MAKE=           make
-MAKEDEPEND=     makedepend
-MAKEFILE=       Makefile.uni
-AR=             ar r
-RANLIB=         ranlib
-
-MD5_ASM_OBJ=
-
-CFLAGS= $(INCLUDES) $(CFLAG)
-
-GENERAL=Makefile
-TEST=md5test
-APPS=md5
-
-LIB=libmd5.a
-LIBSRC=md5_dgst.c md5_one.c
-LIBOBJ=md5_dgst.o md5_one.o $(MD5_ASM_OBJ)
-
-SRC= $(LIBSRC)
-
-EXHEADER= md5.h
-HEADER= md5_locl.h $(EXHEADER)
-
-ALL=    $(GENERAL) $(SRC) $(HEADER)
-
-all:    $(LIB) $(TEST) $(APPS)
-
-$(LIB):    $(LIBOBJ)
-       $(AR) $(LIB) $(LIBOBJ)
-       $(RANLIB) $(LIB)
-
-# elf
-asm/mx86-elf.o: asm/mx86unix.cpp
-       $(CPP) -DELF asm/mx86unix.cpp | as -o asm/mx86-elf.o
-
-# solaris
-asm/mx86-sol.o: asm/mx86unix.cpp
-       $(CC) -E -DSOL asm/mx86unix.cpp | sed 's/^#.*//' > asm/mx86-sol.s
-       as -o asm/mx86-sol.o asm/mx86-sol.s
-       rm -f asm/mx86-sol.s
-
-# a.out
-asm/mx86-out.o: asm/mx86unix.cpp
-       $(CPP) -DOUT asm/mx86unix.cpp | as -o asm/mx86-out.o
-
-# bsdi
-asm/mx86bsdi.o: asm/mx86unix.cpp
-       $(CPP) -DBSDI asm/mx86unix.cpp | as -o asm/mx86bsdi.o
-
-asm/mx86unix.cpp:
-       (cd asm; perl md5-586.pl cpp >mx86unix.cpp)
-
-test:  $(TEST)
-       ./$(TEST)
-
-$(TEST): $(TEST).c $(LIB)
-       $(CC) -o $(TEST) $(CFLAGS) $(TEST).c $(LIB)
-
-$(APPS): $(APPS).c $(LIB)
-       $(CC) -o $(APPS) $(CFLAGS) $(APPS).c $(LIB)
-
-lint:
-       lint -DLINT $(INCLUDES) $(SRC)>fluff
-
-depend:
-       $(MAKEDEPEND) $(INCLUDES) $(PROGS) $(LIBSRC)
-
-dclean:
-       perl -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) >Makefile.new
-       mv -f Makefile.new $(MAKEFILE)
-
-clean:
-       /bin/rm -f $(LIB) $(TEST) $(APPS) *.o asm/*.o *.obj lib tags core .pure .nfs* *.old *.bak fluff
-
-cc:
-       $(MAKE) MD5_ASM_OBJ="" CC="cc" CFLAG="-O" all
-
-gcc:
-       $(MAKE) MD5_ASM_OBJ="" CC="gcc" CFLAGS="-O3 -fomit-frame-pointer" all
-
-x86-elf:
-       $(MAKE) MD5_ASM_OBJ="asm/mx86-elf.o" CFLAG="-DELF -DMD5_ASM -DL_ENDIAN $(CFLAGS)" all
-
-x86-out:
-       $(MAKE) MD5_ASM_OBJ="asm/mx86-out.o" CFLAG="-DOUT -DMD5_ASM -DL_ENDIAN $(CFLAGS)" all
-
-x86-solaris:
-       $(MAKE) MD5_ASM_OBJ="asm/mx86-sol.o" CFLAG="-DSOL -DMD5_ASM -DL_ENDIAN $(CFLAGS)" all
-
-x86-bdsi:
-       $(MAKE) MD5_ASM_OBJ="asm/mx86-bdsi.o" CFLAG="-DBDSI -DMD5_ASM -DL_ENDIAN $(CFLAGS)" all
-
-# DO NOT DELETE THIS LINE -- make depend depends on it.
index 51f5f17..e69de29 100644 (file)
@@ -1,687 +0,0 @@
-       ; Don't even think of reading this code
-       ; It was automatically generated by md5-586.pl
-       ; Which is a perl program used to generate the x86 assember for
-       ; any of elf, a.out, BSDI,Win32, or Solaris
-       ; eric <eay@cryptsoft.com>
-       ; 
-       TITLE   md5-586.asm
-        .386
-.model FLAT
-_TEXT  SEGMENT
-PUBLIC _md5_block_asm_host_order
-
-_md5_block_asm_host_order PROC NEAR
-       push    esi
-       push    edi
-       mov     edi,            DWORD PTR 12[esp]
-       mov     esi,            DWORD PTR 16[esp]
-       mov     ecx,            DWORD PTR 20[esp]
-       push    ebp
-       shl     ecx,            6
-       push    ebx
-       add     ecx,            esi
-       sub     ecx,            64
-       mov     eax,            DWORD PTR [edi]
-       push    ecx
-       mov     ebx,            DWORD PTR 4[edi]
-       mov     ecx,            DWORD PTR 8[edi]
-       mov     edx,            DWORD PTR 12[edi]
-L000start:
-       ; 
-       ; R0 section
-       mov     edi,            ecx
-       mov     ebp,            DWORD PTR [esi]
-       ; R0 0
-       xor     edi,            edx
-       and     edi,            ebx
-       lea     eax,            DWORD PTR 3614090360[ebp*1+eax]
-       xor     edi,            edx
-       add     eax,            edi
-       mov     edi,            ebx
-       rol     eax,            7
-       mov     ebp,            DWORD PTR 4[esi]
-       add     eax,            ebx
-       ; R0 1
-       xor     edi,            ecx
-       and     edi,            eax
-       lea     edx,            DWORD PTR 3905402710[ebp*1+edx]
-       xor     edi,            ecx
-       add     edx,            edi
-       mov     edi,            eax
-       rol     edx,            12
-       mov     ebp,            DWORD PTR 8[esi]
-       add     edx,            eax
-       ; R0 2
-       xor     edi,            ebx
-       and     edi,            edx
-       lea     ecx,            DWORD PTR 606105819[ebp*1+ecx]
-       xor     edi,            ebx
-       add     ecx,            edi
-       mov     edi,            edx
-       rol     ecx,            17
-       mov     ebp,            DWORD PTR 12[esi]
-       add     ecx,            edx
-       ; R0 3
-       xor     edi,            eax
-       and     edi,            ecx
-       lea     ebx,            DWORD PTR 3250441966[ebp*1+ebx]
-       xor     edi,            eax
-       add     ebx,            edi
-       mov     edi,            ecx
-       rol     ebx,            22
-       mov     ebp,            DWORD PTR 16[esi]
-       add     ebx,            ecx
-       ; R0 4
-       xor     edi,            edx
-       and     edi,            ebx
-       lea     eax,            DWORD PTR 4118548399[ebp*1+eax]
-       xor     edi,            edx
-       add     eax,            edi
-       mov     edi,            ebx
-       rol     eax,            7
-       mov     ebp,            DWORD PTR 20[esi]
-       add     eax,            ebx
-       ; R0 5
-       xor     edi,            ecx
-       and     edi,            eax
-       lea     edx,            DWORD PTR 1200080426[ebp*1+edx]
-       xor     edi,            ecx
-       add     edx,            edi
-       mov     edi,            eax
-       rol     edx,            12
-       mov     ebp,            DWORD PTR 24[esi]
-       add     edx,            eax
-       ; R0 6
-       xor     edi,            ebx
-       and     edi,            edx
-       lea     ecx,            DWORD PTR 2821735955[ebp*1+ecx]
-       xor     edi,            ebx
-       add     ecx,            edi
-       mov     edi,            edx
-       rol     ecx,            17
-       mov     ebp,            DWORD PTR 28[esi]
-       add     ecx,            edx
-       ; R0 7
-       xor     edi,            eax
-       and     edi,            ecx
-       lea     ebx,            DWORD PTR 4249261313[ebp*1+ebx]
-       xor     edi,            eax
-       add     ebx,            edi
-       mov     edi,            ecx
-       rol     ebx,            22
-       mov     ebp,            DWORD PTR 32[esi]
-       add     ebx,            ecx
-       ; R0 8
-       xor     edi,            edx
-       and     edi,            ebx
-       lea     eax,            DWORD PTR 1770035416[ebp*1+eax]
-       xor     edi,            edx
-       add     eax,            edi
-       mov     edi,            ebx
-       rol     eax,            7
-       mov     ebp,            DWORD PTR 36[esi]
-       add     eax,            ebx
-       ; R0 9
-       xor     edi,            ecx
-       and     edi,            eax
-       lea     edx,            DWORD PTR 2336552879[ebp*1+edx]
-       xor     edi,            ecx
-       add     edx,            edi
-       mov     edi,            eax
-       rol     edx,            12
-       mov     ebp,            DWORD PTR 40[esi]
-       add     edx,            eax
-       ; R0 10
-       xor     edi,            ebx
-       and     edi,            edx
-       lea     ecx,            DWORD PTR 4294925233[ebp*1+ecx]
-       xor     edi,            ebx
-       add     ecx,            edi
-       mov     edi,            edx
-       rol     ecx,            17
-       mov     ebp,            DWORD PTR 44[esi]
-       add     ecx,            edx
-       ; R0 11
-       xor     edi,            eax
-       and     edi,            ecx
-       lea     ebx,            DWORD PTR 2304563134[ebp*1+ebx]
-       xor     edi,            eax
-       add     ebx,            edi
-       mov     edi,            ecx
-       rol     ebx,            22
-       mov     ebp,            DWORD PTR 48[esi]
-       add     ebx,            ecx
-       ; R0 12
-       xor     edi,            edx
-       and     edi,            ebx
-       lea     eax,            DWORD PTR 1804603682[ebp*1+eax]
-       xor     edi,            edx
-       add     eax,            edi
-       mov     edi,            ebx
-       rol     eax,            7
-       mov     ebp,            DWORD PTR 52[esi]
-       add     eax,            ebx
-       ; R0 13
-       xor     edi,            ecx
-       and     edi,            eax
-       lea     edx,            DWORD PTR 4254626195[ebp*1+edx]
-       xor     edi,            ecx
-       add     edx,            edi
-       mov     edi,            eax
-       rol     edx,            12
-       mov     ebp,            DWORD PTR 56[esi]
-       add     edx,            eax
-       ; R0 14
-       xor     edi,            ebx
-       and     edi,            edx
-       lea     ecx,            DWORD PTR 2792965006[ebp*1+ecx]
-       xor     edi,            ebx
-       add     ecx,            edi
-       mov     edi,            edx
-       rol     ecx,            17
-       mov     ebp,            DWORD PTR 60[esi]
-       add     ecx,            edx
-       ; R0 15
-       xor     edi,            eax
-       and     edi,            ecx
-       lea     ebx,            DWORD PTR 1236535329[ebp*1+ebx]
-       xor     edi,            eax
-       add     ebx,            edi
-       mov     edi,            ecx
-       rol     ebx,            22
-       mov     ebp,            DWORD PTR 4[esi]
-       add     ebx,            ecx
-       ; 
-       ; R1 section
-       ; R1 16
-       lea     eax,            DWORD PTR 4129170786[ebp*1+eax]
-       xor     edi,            ebx
-       and     edi,            edx
-       mov     ebp,            DWORD PTR 24[esi]
-       xor     edi,            ecx
-       add     eax,            edi
-       mov     edi,            ebx
-       rol     eax,            5
-       add     eax,            ebx
-       ; R1 17
-       lea     edx,            DWORD PTR 3225465664[ebp*1+edx]
-       xor     edi,            eax
-       and     edi,            ecx
-       mov     ebp,            DWORD PTR 44[esi]
-       xor     edi,            ebx
-       add     edx,            edi
-       mov     edi,            eax
-       rol     edx,            9
-       add     edx,            eax
-       ; R1 18
-       lea     ecx,            DWORD PTR 643717713[ebp*1+ecx]
-       xor     edi,            edx
-       and     edi,            ebx
-       mov     ebp,            DWORD PTR [esi]
-       xor     edi,            eax
-       add     ecx,            edi
-       mov     edi,            edx
-       rol     ecx,            14
-       add     ecx,            edx
-       ; R1 19
-       lea     ebx,            DWORD PTR 3921069994[ebp*1+ebx]
-       xor     edi,            ecx
-       and     edi,            eax
-       mov     ebp,            DWORD PTR 20[esi]
-       xor     edi,            edx
-       add     ebx,            edi
-       mov     edi,            ecx
-       rol     ebx,            20
-       add     ebx,            ecx
-       ; R1 20
-       lea     eax,            DWORD PTR 3593408605[ebp*1+eax]
-       xor     edi,            ebx
-       and     edi,            edx
-       mov     ebp,            DWORD PTR 40[esi]
-       xor     edi,            ecx
-       add     eax,            edi
-       mov     edi,            ebx
-       rol     eax,            5
-       add     eax,            ebx
-       ; R1 21
-       lea     edx,            DWORD PTR 38016083[ebp*1+edx]
-       xor     edi,            eax
-       and     edi,            ecx
-       mov     ebp,            DWORD PTR 60[esi]
-       xor     edi,            ebx
-       add     edx,            edi
-       mov     edi,            eax
-       rol     edx,            9
-       add     edx,            eax
-       ; R1 22
-       lea     ecx,            DWORD PTR 3634488961[ebp*1+ecx]
-       xor     edi,            edx
-       and     edi,            ebx
-       mov     ebp,            DWORD PTR 16[esi]
-       xor     edi,            eax
-       add     ecx,            edi
-       mov     edi,            edx
-       rol     ecx,            14
-       add     ecx,            edx
-       ; R1 23
-       lea     ebx,            DWORD PTR 3889429448[ebp*1+ebx]
-       xor     edi,            ecx
-       and     edi,            eax
-       mov     ebp,            DWORD PTR 36[esi]
-       xor     edi,            edx
-       add     ebx,            edi
-       mov     edi,            ecx
-       rol     ebx,            20
-       add     ebx,            ecx
-       ; R1 24
-       lea     eax,            DWORD PTR 568446438[ebp*1+eax]
-       xor     edi,            ebx
-       and     edi,            edx
-       mov     ebp,            DWORD PTR 56[esi]
-       xor     edi,            ecx
-       add     eax,            edi
-       mov     edi,            ebx
-       rol     eax,            5
-       add     eax,            ebx
-       ; R1 25
-       lea     edx,            DWORD PTR 3275163606[ebp*1+edx]
-       xor     edi,            eax
-       and     edi,            ecx
-       mov     ebp,            DWORD PTR 12[esi]
-       xor     edi,            ebx
-       add     edx,            edi
-       mov     edi,            eax
-       rol     edx,            9
-       add     edx,            eax
-       ; R1 26
-       lea     ecx,            DWORD PTR 4107603335[ebp*1+ecx]
-       xor     edi,            edx
-       and     edi,            ebx
-       mov     ebp,            DWORD PTR 32[esi]
-       xor     edi,            eax
-       add     ecx,            edi
-       mov     edi,            edx
-       rol     ecx,            14
-       add     ecx,            edx
-       ; R1 27
-       lea     ebx,            DWORD PTR 1163531501[ebp*1+ebx]
-       xor     edi,            ecx
-       and     edi,            eax
-       mov     ebp,            DWORD PTR 52[esi]
-       xor     edi,            edx
-       add     ebx,            edi
-       mov     edi,            ecx
-       rol     ebx,            20
-       add     ebx,            ecx
-       ; R1 28
-       lea     eax,            DWORD PTR 2850285829[ebp*1+eax]
-       xor     edi,            ebx
-       and     edi,            edx
-       mov     ebp,            DWORD PTR 8[esi]
-       xor     edi,            ecx
-       add     eax,            edi
-       mov     edi,            ebx
-       rol     eax,            5
-       add     eax,            ebx
-       ; R1 29
-       lea     edx,            DWORD PTR 4243563512[ebp*1+edx]
-       xor     edi,            eax
-       and     edi,            ecx
-       mov     ebp,            DWORD PTR 28[esi]
-       xor     edi,            ebx
-       add     edx,            edi
-       mov     edi,            eax
-       rol     edx,            9
-       add     edx,            eax
-       ; R1 30
-       lea     ecx,            DWORD PTR 1735328473[ebp*1+ecx]
-       xor     edi,            edx
-       and     edi,            ebx
-       mov     ebp,            DWORD PTR 48[esi]
-       xor     edi,            eax
-       add     ecx,            edi
-       mov     edi,            edx
-       rol     ecx,            14
-       add     ecx,            edx
-       ; R1 31
-       lea     ebx,            DWORD PTR 2368359562[ebp*1+ebx]
-       xor     edi,            ecx
-       and     edi,            eax
-       mov     ebp,            DWORD PTR 20[esi]
-       xor     edi,            edx
-       add     ebx,            edi
-       mov     edi,            ecx
-       rol     ebx,            20
-       add     ebx,            ecx
-       ; 
-       ; R2 section
-       ; R2 32
-       xor     edi,            edx
-       xor     edi,            ebx
-       lea     eax,            DWORD PTR 4294588738[ebp*1+eax]
-       add     eax,            edi
-       rol     eax,            4
-       mov     ebp,            DWORD PTR 32[esi]
-       mov     edi,            ebx
-       ; R2 33
-       lea     edx,            DWORD PTR 2272392833[ebp*1+edx]
-       add     eax,            ebx
-       xor     edi,            ecx
-       xor     edi,            eax
-       mov     ebp,            DWORD PTR 44[esi]
-       add     edx,            edi
-       mov     edi,            eax
-       rol     edx,            11
-       add     edx,            eax
-       ; R2 34
-       xor     edi,            ebx
-       xor     edi,            edx
-       lea     ecx,            DWORD PTR 1839030562[ebp*1+ecx]
-       add     ecx,            edi
-       rol     ecx,            16
-       mov     ebp,            DWORD PTR 56[esi]
-       mov     edi,            edx
-       ; R2 35
-       lea     ebx,            DWORD PTR 4259657740[ebp*1+ebx]
-       add     ecx,            edx
-       xor     edi,            eax
-       xor     edi,            ecx
-       mov     ebp,            DWORD PTR 4[esi]
-       add     ebx,            edi
-       mov     edi,            ecx
-       rol     ebx,            23
-       add     ebx,            ecx
-       ; R2 36
-       xor     edi,            edx
-       xor     edi,            ebx
-       lea     eax,            DWORD PTR 2763975236[ebp*1+eax]
-       add     eax,            edi
-       rol     eax,            4
-       mov     ebp,            DWORD PTR 16[esi]
-       mov     edi,            ebx
-       ; R2 37
-       lea     edx,            DWORD PTR 1272893353[ebp*1+edx]
-       add     eax,            ebx
-       xor     edi,            ecx
-       xor     edi,            eax
-       mov     ebp,            DWORD PTR 28[esi]
-       add     edx,            edi
-       mov     edi,            eax
-       rol     edx,            11
-       add     edx,            eax
-       ; R2 38
-       xor     edi,            ebx
-       xor     edi,            edx
-       lea     ecx,            DWORD PTR 4139469664[ebp*1+ecx]
-       add     ecx,            edi
-       rol     ecx,            16
-       mov     ebp,            DWORD PTR 40[esi]
-       mov     edi,            edx
-       ; R2 39
-       lea     ebx,            DWORD PTR 3200236656[ebp*1+ebx]
-       add     ecx,            edx
-       xor     edi,            eax
-       xor     edi,            ecx
-       mov     ebp,            DWORD PTR 52[esi]
-       add     ebx,            edi
-       mov     edi,            ecx
-       rol     ebx,            23
-       add     ebx,            ecx
-       ; R2 40
-       xor     edi,            edx
-       xor     edi,            ebx
-       lea     eax,            DWORD PTR 681279174[ebp*1+eax]
-       add     eax,            edi
-       rol     eax,            4
-       mov     ebp,            DWORD PTR [esi]
-       mov     edi,            ebx
-       ; R2 41
-       lea     edx,            DWORD PTR 3936430074[ebp*1+edx]
-       add     eax,            ebx
-       xor     edi,            ecx
-       xor     edi,            eax
-       mov     ebp,            DWORD PTR 12[esi]
-       add     edx,            edi
-       mov     edi,            eax
-       rol     edx,            11
-       add     edx,            eax
-       ; R2 42
-       xor     edi,            ebx
-       xor     edi,            edx
-       lea     ecx,            DWORD PTR 3572445317[ebp*1+ecx]
-       add     ecx,            edi
-       rol     ecx,            16
-       mov     ebp,            DWORD PTR 24[esi]
-       mov     edi,            edx
-       ; R2 43
-       lea     ebx,            DWORD PTR 76029189[ebp*1+ebx]
-       add     ecx,            edx
-       xor     edi,            eax
-       xor     edi,            ecx
-       mov     ebp,            DWORD PTR 36[esi]
-       add     ebx,            edi
-       mov     edi,            ecx
-       rol     ebx,            23
-       add     ebx,            ecx
-       ; R2 44
-       xor     edi,            edx
-       xor     edi,            ebx
-       lea     eax,            DWORD PTR 3654602809[ebp*1+eax]
-       add     eax,            edi
-       rol     eax,            4
-       mov     ebp,            DWORD PTR 48[esi]
-       mov     edi,            ebx
-       ; R2 45
-       lea     edx,            DWORD PTR 3873151461[ebp*1+edx]
-       add     eax,            ebx
-       xor     edi,            ecx
-       xor     edi,            eax
-       mov     ebp,            DWORD PTR 60[esi]
-       add     edx,            edi
-       mov     edi,            eax
-       rol     edx,            11
-       add     edx,            eax
-       ; R2 46
-       xor     edi,            ebx
-       xor     edi,            edx
-       lea     ecx,            DWORD PTR 530742520[ebp*1+ecx]
-       add     ecx,            edi
-       rol     ecx,            16
-       mov     ebp,            DWORD PTR 8[esi]
-       mov     edi,            edx
-       ; R2 47
-       lea     ebx,            DWORD PTR 3299628645[ebp*1+ebx]
-       add     ecx,            edx
-       xor     edi,            eax
-       xor     edi,            ecx
-       mov     ebp,            DWORD PTR [esi]
-       add     ebx,            edi
-       mov     edi,            -1
-       rol     ebx,            23
-       add     ebx,            ecx
-       ; 
-       ; R3 section
-       ; R3 48
-       xor     edi,            edx
-       or      edi,            ebx
-       lea     eax,            DWORD PTR 4096336452[ebp*1+eax]
-       xor     edi,            ecx
-       mov     ebp,            DWORD PTR 28[esi]
-       add     eax,            edi
-       mov     edi,            -1
-       rol     eax,            6
-       xor     edi,            ecx
-       add     eax,            ebx
-       ; R3 49
-       or      edi,            eax
-       lea     edx,            DWORD PTR 1126891415[ebp*1+edx]
-       xor     edi,            ebx
-       mov     ebp,            DWORD PTR 56[esi]
-       add     edx,            edi
-       mov     edi,            -1
-       rol     edx,            10
-       xor     edi,            ebx
-       add     edx,            eax
-       ; R3 50
-       or      edi,            edx
-       lea     ecx,            DWORD PTR 2878612391[ebp*1+ecx]
-       xor     edi,            eax
-       mov     ebp,            DWORD PTR 20[esi]
-       add     ecx,            edi
-       mov     edi,            -1
-       rol     ecx,            15
-       xor     edi,            eax
-       add     ecx,            edx
-       ; R3 51
-       or      edi,            ecx
-       lea     ebx,            DWORD PTR 4237533241[ebp*1+ebx]
-       xor     edi,            edx
-       mov     ebp,            DWORD PTR 48[esi]
-       add     ebx,            edi
-       mov     edi,            -1
-       rol     ebx,            21
-       xor     edi,            edx
-       add     ebx,            ecx
-       ; R3 52
-       or      edi,            ebx
-       lea     eax,            DWORD PTR 1700485571[ebp*1+eax]
-       xor     edi,            ecx
-       mov     ebp,            DWORD PTR 12[esi]
-       add     eax,            edi
-       mov     edi,            -1
-       rol     eax,            6
-       xor     edi,            ecx
-       add     eax,            ebx
-       ; R3 53
-       or      edi,            eax
-       lea     edx,            DWORD PTR 2399980690[ebp*1+edx]
-       xor     edi,            ebx
-       mov     ebp,            DWORD PTR 40[esi]
-       add     edx,            edi
-       mov     edi,            -1
-       rol     edx,            10
-       xor     edi,            ebx
-       add     edx,            eax
-       ; R3 54
-       or      edi,            edx
-       lea     ecx,            DWORD PTR 4293915773[ebp*1+ecx]
-       xor     edi,            eax
-       mov     ebp,            DWORD PTR 4[esi]
-       add     ecx,            edi
-       mov     edi,            -1
-       rol     ecx,            15
-       xor     edi,            eax
-       add     ecx,            edx
-       ; R3 55
-       or      edi,            ecx
-       lea     ebx,            DWORD PTR 2240044497[ebp*1+ebx]
-       xor     edi,            edx
-       mov     ebp,            DWORD PTR 32[esi]
-       add     ebx,            edi
-       mov     edi,            -1
-       rol     ebx,            21
-       xor     edi,            edx
-       add     ebx,            ecx
-       ; R3 56
-       or      edi,            ebx
-       lea     eax,            DWORD PTR 1873313359[ebp*1+eax]
-       xor     edi,            ecx
-       mov     ebp,            DWORD PTR 60[esi]
-       add     eax,            edi
-       mov     edi,            -1
-       rol     eax,            6
-       xor     edi,            ecx
-       add     eax,            ebx
-       ; R3 57
-       or      edi,            eax
-       lea     edx,            DWORD PTR 4264355552[ebp*1+edx]
-       xor     edi,            ebx
-       mov     ebp,            DWORD PTR 24[esi]
-       add     edx,            edi
-       mov     edi,            -1
-       rol     edx,            10
-       xor     edi,            ebx
-       add     edx,            eax
-       ; R3 58
-       or      edi,            edx
-       lea     ecx,            DWORD PTR 2734768916[ebp*1+ecx]
-       xor     edi,            eax
-       mov     ebp,            DWORD PTR 52[esi]
-       add     ecx,            edi
-       mov     edi,            -1
-       rol     ecx,            15
-       xor     edi,            eax
-       add     ecx,            edx
-       ; R3 59
-       or      edi,            ecx
-       lea     ebx,            DWORD PTR 1309151649[ebp*1+ebx]
-       xor     edi,            edx
-       mov     ebp,            DWORD PTR 16[esi]
-       add     ebx,            edi
-       mov     edi,            -1
-       rol     ebx,            21
-       xor     edi,            edx
-       add     ebx,            ecx
-       ; R3 60
-       or      edi,            ebx
-       lea     eax,            DWORD PTR 4149444226[ebp*1+eax]
-       xor     edi,            ecx
-       mov     ebp,            DWORD PTR 44[esi]
-       add     eax,            edi
-       mov     edi,            -1
-       rol     eax,            6
-       xor     edi,            ecx
-       add     eax,            ebx
-       ; R3 61
-       or      edi,            eax
-       lea     edx,            DWORD PTR 3174756917[ebp*1+edx]
-       xor     edi,            ebx
-       mov     ebp,            DWORD PTR 8[esi]
-       add     edx,            edi
-       mov     edi,            -1
-       rol     edx,            10
-       xor     edi,            ebx
-       add     edx,            eax
-       ; R3 62
-       or      edi,            edx
-       lea     ecx,            DWORD PTR 718787259[ebp*1+ecx]
-       xor     edi,            eax
-       mov     ebp,            DWORD PTR 36[esi]
-       add     ecx,            edi
-       mov     edi,            -1
-       rol     ecx,            15
-       xor     edi,            eax
-       add     ecx,            edx
-       ; R3 63
-       or      edi,            ecx
-       lea     ebx,            DWORD PTR 3951481745[ebp*1+ebx]
-       xor     edi,            edx
-       mov     ebp,            DWORD PTR 24[esp]
-       add     ebx,            edi
-       add     esi,            64
-       rol     ebx,            21
-       mov     edi,            DWORD PTR [ebp]
-       add     ebx,            ecx
-       add     eax,            edi
-       mov     edi,            DWORD PTR 4[ebp]
-       add     ebx,            edi
-       mov     edi,            DWORD PTR 8[ebp]
-       add     ecx,            edi
-       mov     edi,            DWORD PTR 12[ebp]
-       add     edx,            edi
-       mov     DWORD PTR [ebp],eax
-       mov     DWORD PTR 4[ebp],ebx
-       mov     edi,            DWORD PTR [esp]
-       mov     DWORD PTR 8[ebp],ecx
-       mov     DWORD PTR 12[ebp],edx
-       cmp     edi,            esi
-       jge     L000start
-       pop     eax
-       pop     ebx
-       pop     ebp
-       pop     edi
-       pop     esi
-       ret
-_md5_block_asm_host_order ENDP
-_TEXT  ENDS
-END
index 06af633..c912484 100644 (file)
@@ -135,11 +135,7 @@ void md5_block_data_order (MD5_CTX *c, const void *p,int num);
  */
 #endif
 
-#ifndef FLAT_INC
-#include "../md32_common.h"
-#else
 #include "md32_common.h"
-#endif
 
 /*
 #define        F(x,y,z)        (((x) & (y))  |  ((~(x)) & (z)))
index 14770c0..a399485 100644 (file)
@@ -640,19 +640,54 @@ void CRYPTO_mem_leaks(BIO *b)
        MEM_LEAK ml;
        char buf[80];
 
-       if (mh == NULL) return;
+       if (mh == NULL && amih == NULL)
+               return;
        ml.bio=b;
        ml.bytes=0;
        ml.chunks=0;
-       CRYPTO_w_lock(CRYPTO_LOCK_MALLOC2);
-       lh_doall_arg(mh,(void (*)())print_leak,(char *)&ml);
-       CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC2);
+       MemCheck_off(); /* obtains CRYPTO_LOCK_MALLOC2 */
+       if (mh != NULL)
+               lh_doall_arg(mh,(void (*)())print_leak,(char *)&ml);
        if (ml.chunks != 0)
                {
                sprintf(buf,"%ld bytes leaked in %d chunks\n",
                        ml.bytes,ml.chunks);
                BIO_puts(b,buf);
                }
+       else
+               {
+               /* Make sure that, if we found no leaks, memory-leak debugging itself
+                * does not introduce memory leaks (which might irritate
+                * external debugging tools).
+                * (When someone enables leak checking, but does not call
+                * this function, we declare it to be their fault.)
+                *
+                * XXX    This should be in CRYPTO_mem_leaks_cb,
+                * and CRYPTO_mem_leaks should be implemented by
+                * using CRYPTO_mem_leaks_cb.
+                * (Also their should be a variant of lh_doall_arg
+                * that takes a function pointer instead of a void *;
+                * this would obviate the ugly and illegal
+                * void_fn_to_char kludge in CRYPTO_mem_leaks_cb.
+                * Otherwise the code police will come and get us.)
+                */
+               CRYPTO_w_lock(CRYPTO_LOCK_MALLOC);
+               if (mh != NULL)
+                       {
+                       lh_free(mh);
+                       mh = NULL;
+                       }
+               if (amih != NULL)
+                       {
+                       if (lh_num_items(amih) == 0) 
+                               {
+                               lh_free(amih);
+                               amih = NULL;
+                               }
+                       }
+               CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC);
+               }
+       MemCheck_on(); /* releases CRYPTO_LOCK_MALLOC2 */
 
 #if 0
        lh_stats_bio(mh,b);
index d654eb2..d9389a5 100644 (file)
@@ -22,7 +22,7 @@ typedef struct name_funcs_st
 DECLARE_STACK_OF(NAME_FUNCS)
 IMPLEMENT_STACK_OF(NAME_FUNCS)
 
-STACK_OF(NAME_FUNCS) *name_funcs_stack;
+static STACK_OF(NAME_FUNCS) *name_funcs_stack;
 
 static unsigned long obj_name_hash(OBJ_NAME *a);
 static int obj_name_cmp(OBJ_NAME *a,OBJ_NAME *b);
index cef401d..7aec0ed 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index d1a5ad2..95c8a21 100644 (file)
@@ -949,7 +949,7 @@ extern "C" {
 #define NID_ad_ca_issuers              179
 #define OBJ_ad_ca_issuers              OBJ_id_ad,2L
 
-#define SN_OSCP_sign                   "OCSPSigning"
+#define SN_OCSP_sign                   "OCSPSigning"
 #define LN_OCSP_sign                   "OCSP Signing"
 #define NID_OCSP_sign                  180
 #define OBJ_OCSP_sign                  OBJ_id_kp,9L
index 55d5d06..55ec973 100644 (file)
@@ -2,20 +2,31 @@
 #define HEADER_OPENSSLV_H
 
 /* Numeric release version identifier:
- * MMNNFFRBB: major minor fix final beta/patch
+ * MMNNFFPPS: major minor fix patch status
+ * The status nibble has one of the values 0 for development, 1 to e for betas
+ * 1 to 14, and f for release.  The patch level is exactly that.
  * For example:
  * 0.9.3-dev     0x00903000
- * 0.9.3beta1    0x00903001
- * 0.9.3beta2-dev 0x00903002
- * 0.9.3beta2     0x00903002 (same as ...beta2-dev)
- * 0.9.3         0x00903100
- * 0.9.3a        0x00903101
- * 0.9.4         0x00904100
- * 1.2.3z        0x1020311a
+ * 0.9.3-beta1   0x00903001
+ * 0.9.3-beta2-dev 0x00903002
+ * 0.9.3-beta2    0x00903002 (same as ...beta2-dev)
+ * 0.9.3         0x0090300f
+ * 0.9.3a        0x0090301f
+ * 0.9.4         0x0090400f
+ * 1.2.3z        0x102031af
+ *
+ * For continuity reasons (because 0.9.5 is already out, and is coded
+ * 0x00905100), between 0.9.5 and 0.9.6 the coding of the patch level
+ * part is slightly different, by setting the highest bit.  This means
+ * that 0.9.5a looks like this: 0x0090581f.  At 0.9.6, we can start
+ * with 0x0090600S...
+ *
  * (Prior to 0.9.3-dev a different scheme was used: 0.9.2b is 0x0922.)
+ * (Prior to 0.9.5a beta1, a different scheme was used: MMNNFFRBB for
+ *  major minor fix final patch/beta)
  */
-#define OPENSSL_VERSION_NUMBER 0x00905100L
-#define OPENSSL_VERSION_TEXT   "OpenSSL 0.9.5 28 Feb 2000"
+#define OPENSSL_VERSION_NUMBER 0x0090581fL
+#define OPENSSL_VERSION_TEXT   "OpenSSL 0.9.5a 1 Apr 2000"
 #define OPENSSL_VERSION_PTEXT  " part of " OPENSSL_VERSION_TEXT
 
 #endif /* HEADER_OPENSSLV_H */
index 642129d..8b1789b 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index 072211b..b5e0a65 100644 (file)
@@ -373,7 +373,7 @@ int PEM_ASN1_write_bio(int (*i2d)(), const char *name, BIO *bp, char *x,
                        kstr=(unsigned char *)buf;
                        }
                RAND_add(data,i,0);/* put in the RSA key. */
-               if (RAND_bytes(iv,8) <= 0)      /* Generate a salt */
+               if (RAND_pseudo_bytes(iv,8) < 0)        /* Generate a salt */
                        goto err;
                /* The 'iv' is used as the iv and as a salt.  It is
                 * NOT taken from the BytesToKey function */
index 44e330e..81c6e64 100644 (file)
@@ -18,11 +18,13 @@ sub main'asm_init
        ($type,$fn,$i386)=@_;
        $filename=$fn;
 
-       $cpp=$sol=$aout=$win32=0;
+       $cpp=$sol=$aout=$win32=$gaswin=0;
        if (    ($type eq "elf"))
                { require "x86unix.pl"; }
        elsif ( ($type eq "a.out"))
                { $aout=1; require "x86unix.pl"; }
+       elsif ( ($type eq "gaswin"))
+               { $gaswin=1; $aout=1; require "x86unix.pl"; }
        elsif ( ($type eq "sol"))
                { $sol=1; require "x86unix.pl"; }
        elsif ( ($type eq "cpp"))
@@ -50,7 +52,7 @@ EOF
 &comment("Don't even think of reading this code");
 &comment("It was automatically generated by $filename");
 &comment("Which is a perl program used to generate the x86 assember for");
-&comment("any of elf, a.out, BSDI,Win32, or Solaris");
+&comment("any of elf, a.out, BSDI, Win32, gaswin (for GNU as on Win32) or Solaris");
 &comment("eric <eay\@cryptsoft.com>");
 &comment("");
 
index 252a57b..2064523 100644 (file)
@@ -341,7 +341,7 @@ sub main'set_label
                $label{$_[0]}="${label}${_[0]}";
                $label++;
                }
-       if((defined $_[1]) && ($_[1] == 1))
+       if((defined $_[2]) && ($_[2] == 1))
                {
                push(@out,"$label{$_[0]}::\n");
                }
index 60d75f5..309060e 100644 (file)
@@ -292,6 +292,8 @@ EOF
        push(@out,$tmp);
        if ($main'cpp)
                { $tmp=push(@out,"\tTYPE($func,\@function)\n"); }
+       elsif ($main'gaswin)
+               { $tmp=push(@out,"\t.def\t$func;\t.scl\t2;\t.type\t32;\t.endef\n"); }
        else    { $tmp=push(@out,"\t.type\t$func,\@function\n"); }
        push(@out,"$func:\n");
        $tmp=<<"EOF";
@@ -320,6 +322,8 @@ EOF
        push(@out,$tmp);
        if ($main'cpp)
                { push(@out,"\tTYPE($func,\@function)\n"); }
+       elsif ($main'gaswin)
+               { $tmp=push(@out,"\t.def\t$func;\t.scl\t2;\t.type\t32;\t.endef\n"); }
        else    { push(@out,"\t.type    $func,\@function\n"); }
        push(@out,"$func:\n");
        $stack=4;
@@ -342,6 +346,8 @@ EOF
        push(@out,$tmp);
        if ($main'cpp)
                { push(@out,"\tSIZE($func,.${func}_end-$func)\n"); }
+       elsif ($main'gaswin)
+                { $tmp=push(@out,"\t.align 4\n"); }
        else    { push(@out,"\t.size\t$func,.${func}_end-$func\n"); }
        push(@out,".ident       \"$func\"\n");
        $stack=0;
@@ -371,6 +377,8 @@ sub main'function_end_B
        push(@out,".L_${func}_end:\n");
        if ($main'cpp)
                { push(@out,"\tSIZE($func,.L_${func}_end-$func)\n"); }
+        elsif ($main'gaswin)
+                { push(@out,"\t.align 4\n"); }
        else    { push(@out,"\t.size\t$func,.L_${func}_end-$func\n"); }
        push(@out,".ident       \"desasm.pl\"\n");
        $stack=0;
index 56d88b0..ee8aed5 100644 (file)
@@ -61,7 +61,7 @@
 #include <openssl/pkcs12.h>
 
 PKCS12 *PKCS12_create(char *pass, char *name, EVP_PKEY *pkey, X509 *cert,
-            STACK *ca, int nid_key, int nid_cert, int iter, int mac_iter,
+            STACK_OF(X509) *ca, int nid_key, int nid_cert, int iter, int mac_iter,
             int keytype)
 {
        PKCS12 *p12;
@@ -103,8 +103,8 @@ PKCS12 *PKCS12_create(char *pass, char *name, EVP_PKEY *pkey, X509 *cert,
        
        /* Add all other certificates */
        if(ca) {
-               for(i = 0; i < sk_num(ca); i++) {
-                       tcert = (X509 *)sk_value(ca, i);
+               for(i = 0; i < sk_X509_num(ca); i++) {
+                       tcert = sk_X509_value(ca, i);
                        if(!(bag = M_PKCS12_x5092certbag(tcert))) return NULL;
                        if(!sk_push(bags, (char *)bag)) {
                                PKCS12err(PKCS12_F_PKCS12_CREATE,ERR_R_MALLOC_FAILURE);
index 02fdd20..b364671 100644 (file)
@@ -104,6 +104,14 @@ int PKCS12_key_gen_uni (unsigned char *pass, int passlen, unsigned char *salt,
 #ifdef  DEBUG_KEYGEN
        unsigned char *tmpout = out;
        int tmpn = n;
+#endif
+
+       if (!pass) {
+               PKCS12err(PKCS12_F_PKCS12_KEY_GEN_UNI,ERR_R_PASSED_NULL_PARAMETER);
+               return 0;
+       }
+
+#ifdef  DEBUG_KEYGEN
        fprintf(stderr, "KEYGEN DEBUG\n");
        fprintf(stderr, "ID %d, ITER %d\n", id, iter);
        fprintf(stderr, "Password (length %d):\n", passlen);
index 08a6055..ee257ff 100644 (file)
 
 /* Simplified PKCS#12 routines */
 
-static int parse_pk12( PKCS12 *p12, const char *pass, int passlen, EVP_PKEY **pkey, X509 **cert, STACK **ca);
-static int parse_bags( STACK *bags, const char *pass, int passlen, EVP_PKEY **pkey, X509 **cert, STACK **ca, ASN1_OCTET_STRING **keyid, char *keymatch);
-static int parse_bag( PKCS12_SAFEBAG *bag, const char *pass, int passlen, EVP_PKEY **pkey, X509 **cert, STACK **ca, ASN1_OCTET_STRING **keyid, char *keymatch);
+static int parse_pk12( PKCS12 *p12, const char *pass, int passlen,
+               EVP_PKEY **pkey, X509 **cert, STACK_OF(X509) **ca);
+
+static int parse_bags( STACK *bags, const char *pass, int passlen,
+               EVP_PKEY **pkey, X509 **cert, STACK_OF(X509) **ca,
+               ASN1_OCTET_STRING **keyid, char *keymatch);
+
+static int parse_bag( PKCS12_SAFEBAG *bag, const char *pass, int passlen,
+                       EVP_PKEY **pkey, X509 **cert, STACK_OF(X509) **ca,
+                       ASN1_OCTET_STRING **keyid, char *keymatch);
+
 /* Parse and decrypt a PKCS#12 structure returning user key, user cert
  * and other (CA) certs. Note either ca should be NULL, *ca should be NULL,
  * or it should point to a valid STACK structure. pkey and cert can be
@@ -72,54 +80,59 @@ static int parse_bag( PKCS12_SAFEBAG *bag, const char *pass, int passlen, EVP_PK
  */
 
 int PKCS12_parse (PKCS12 *p12, const char *pass, EVP_PKEY **pkey, X509 **cert,
-            STACK **ca)
+            STACK_OF(X509) **ca)
 {
 
-/* Check for NULL PKCS12 structure */
-
-if(!p12) {
-       PKCS12err(PKCS12_F_PKCS12_PARSE,PKCS12_R_INVALID_NULL_PKCS12_POINTER);
-       return 0;
-}
+       /* Check for NULL PKCS12 structure */
 
-/* Allocate stack for ca certificates if needed */
-if ((ca != NULL) && (*ca == NULL)) {
-       if (!(*ca = sk_new(NULL))) {
-               PKCS12err(PKCS12_F_PKCS12_PARSE,ERR_R_MALLOC_FAILURE);
+       if(!p12)
+               {
+               PKCS12err(PKCS12_F_PKCS12_PARSE,PKCS12_R_INVALID_NULL_PKCS12_POINTER);
                return 0;
-       }
-}
+               }
+
+       /* Allocate stack for ca certificates if needed */
+       if ((ca != NULL) && (*ca == NULL))
+               {
+               if (!(*ca = sk_X509_new(NULL)))
+                       {
+                       PKCS12err(PKCS12_F_PKCS12_PARSE,ERR_R_MALLOC_FAILURE);
+                       return 0;
+                       }
+               }
 
-if(pkey) *pkey = NULL;
-if(cert) *cert = NULL;
+       if(pkey) *pkey = NULL;
+       if(cert) *cert = NULL;
 
-/* Check the mac */
+       /* Check the mac */
 
-if (!PKCS12_verify_mac (p12, pass, -1)) {
-       PKCS12err(PKCS12_F_PKCS12_PARSE,PKCS12_R_MAC_VERIFY_FAILURE);
-       goto err;
-}
+       if (!PKCS12_verify_mac (p12, pass, -1))
+               {
+               PKCS12err(PKCS12_F_PKCS12_PARSE,PKCS12_R_MAC_VERIFY_FAILURE);
+               goto err;
+               }
 
-if (!parse_pk12 (p12, pass, -1, pkey, cert, ca)) {
-       PKCS12err(PKCS12_F_PKCS12_PARSE,PKCS12_R_PARSE_ERROR);
-       goto err;
-}
+       if (!parse_pk12 (p12, pass, -1, pkey, cert, ca))
+               {
+               PKCS12err(PKCS12_F_PKCS12_PARSE,PKCS12_R_PARSE_ERROR);
+               goto err;
+               }
 
-return 1;
+       return 1;
 
-err:
+ err:
 
-if (pkey && *pkey) EVP_PKEY_free (*pkey);
-if (cert && *cert) X509_free (*cert);
-if (ca) sk_pop_free (*ca, X509_free);
-return 0;
+       if (pkey && *pkey) EVP_PKEY_free (*pkey);
+       if (cert && *cert) X509_free (*cert);
+       if (ca) sk_X509_pop_free (*ca, X509_free);
+       return 0;
 
 }
 
 /* Parse the outer PKCS#12 structure */
 
 static int parse_pk12 (PKCS12 *p12, const char *pass, int passlen,
-            EVP_PKEY **pkey, X509 **cert, STACK **ca)
+            EVP_PKEY **pkey, X509 **cert, STACK_OF(X509) **ca)
 {
        STACK *asafes, *bags;
        int i, bagnid;
@@ -154,7 +167,7 @@ static int parse_pk12 (PKCS12 *p12, const char *pass, int passlen,
 
 
 static int parse_bags (STACK *bags, const char *pass, int passlen,
-                      EVP_PKEY **pkey, X509 **cert, STACK **ca,
+                      EVP_PKEY **pkey, X509 **cert, STACK_OF(X509) **ca,
                       ASN1_OCTET_STRING **keyid, char *keymatch)
 {
        int i;
@@ -171,7 +184,7 @@ static int parse_bags (STACK *bags, const char *pass, int passlen,
 #define MATCH_ALL  0x3
 
 static int parse_bag(PKCS12_SAFEBAG *bag, const char *pass, int passlen,
-                     EVP_PKEY **pkey, X509 **cert, STACK **ca,
+                     EVP_PKEY **pkey, X509 **cert, STACK_OF(X509) **ca,
                      ASN1_OCTET_STRING **keyid,
             char *keymatch)
 {
@@ -221,7 +234,10 @@ static int parse_bag(PKCS12_SAFEBAG *bag, const char *pass, int passlen,
                if (lkey) {
                        *keymatch |= MATCH_CERT;
                        if (cert) *cert = x509;
-               } else if (ca) sk_push (*ca, (char *)x509);
+               } else {
+                       if(ca) sk_X509_push (*ca, x509);
+                       else X509_free(x509);
+               }
        break;
 
        case NID_safeContentsBag:
index f1094b3..369257e 100644 (file)
@@ -157,7 +157,7 @@ int PKCS12_setup_mac (PKCS12 *p12, int iter, unsigned char *salt, int saltlen,
                return 0;
        }
        if (!salt) {
-               if (RAND_bytes (p12->mac->salt->data, saltlen) <= 0)
+               if (RAND_pseudo_bytes (p12->mac->salt->data, saltlen) < 0)
                        return 0;
        }
        else memcpy (p12->mac->salt->data, salt, saltlen);
index 9d8de10..12db54f 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index 254000f..dad356c 100644 (file)
@@ -265,9 +265,9 @@ void PKCS12_SAFEBAG_free(PKCS12_SAFEBAG *a);
 void ERR_load_PKCS12_strings(void);
 void PKCS12_PBE_add(void);
 int PKCS12_parse(PKCS12 *p12, const char *pass, EVP_PKEY **pkey, X509 **cert,
-                STACK **ca);
+                STACK_OF(X509) **ca);
 PKCS12 *PKCS12_create(char *pass, char *name, EVP_PKEY *pkey, X509 *cert,
-                        STACK *ca, int nid_key, int nid_cert, int iter,
+                        STACK_OF(X509) *ca, int nid_key, int nid_cert, int iter,
                                                 int mac_iter, int keytype);
 int i2d_PKCS12_bio(BIO *bp, PKCS12 *p12);
 int i2d_PKCS12_fp(FILE *fp, PKCS12 *p12);
index 27001c6..e69de29 100644 (file)
@@ -1,5 +0,0 @@
-WARNING
-
-Everything in this directory is experimental and is subject to change.
-
-Do not rely on the stuff in here not changing in the next release
index 80ac5e3..4ab24a8 100644 (file)
@@ -699,6 +699,7 @@ int PKCS7_dataVerify(X509_STORE *cert_store, X509_STORE_CTX *ctx, BIO *bio,
        if (i <= 0) 
                {
                PKCS7err(PKCS7_F_PKCS7_DATAVERIFY,ERR_R_X509_LIB);
+               X509_STORE_CTX_cleanup(ctx);
                goto err;
                }
        X509_STORE_CTX_cleanup(ctx);
index 813a8af..8ded891 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index 6b158f0..da4258c 100644 (file)
  * copied and put under another distribution licence
  * [including the GNU Public Licence.]
  */
+/* ====================================================================
+ * Copyright (c) 1998-2000 The OpenSSL Project.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer. 
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. All advertising materials mentioning features or use of this
+ *    software must display the following acknowledgment:
+ *    "This product includes software developed by the OpenSSL Project
+ *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
+ *
+ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
+ *    endorse or promote products derived from this software without
+ *    prior written permission. For written permission, please contact
+ *    openssl-core@openssl.org.
+ *
+ * 5. Products derived from this software may not be called "OpenSSL"
+ *    nor may "OpenSSL" appear in their names without prior written
+ *    permission of the OpenSSL Project.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ *    acknowledgment:
+ *    "This product includes software developed by the OpenSSL Project
+ *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This product includes cryptographic software written by Eric Young
+ * (eay@cryptsoft.com).  This product includes software written by Tim
+ * Hudson (tjh@cryptsoft.com).
+ *
+ */
 
 #define ENTROPY_NEEDED 16  /* require 128 bits = 16 bytes of randomness */
 
 
 #include <openssl/rand.h>
 
+#ifdef BN_DEBUG
+# define PREDICT
+#endif
+
 /* #define NORAND      1 */
 /* #define PREDICT     1 */
 
@@ -141,6 +198,10 @@ static long md_count[2]={0,0};
 static double entropy=0;
 static int initialized=0;
 
+#ifdef PREDICT
+int rand_predictable=0;
+#endif
+
 const char *RAND_version="RAND" OPENSSL_VERSION_PTEXT;
 
 static void ssleay_rand_cleanup(void);
@@ -148,6 +209,7 @@ static void ssleay_rand_seed(const void *buf, int num);
 static void ssleay_rand_add(const void *buf, int num, double add_entropy);
 static int ssleay_rand_bytes(unsigned char *buf, int num);
 static int ssleay_rand_pseudo_bytes(unsigned char *buf, int num);
+static int ssleay_rand_status(void);
 
 RAND_METHOD rand_ssleay_meth={
        ssleay_rand_seed,
@@ -155,6 +217,7 @@ RAND_METHOD rand_ssleay_meth={
        ssleay_rand_cleanup,
        ssleay_rand_add,
        ssleay_rand_pseudo_bytes,
+       ssleay_rand_status
        }; 
 
 RAND_METHOD *RAND_SSLeay(void)
@@ -306,6 +369,10 @@ static void ssleay_rand_initialize(void)
        FILE *fh;
 #endif
 
+#ifdef NORAND
+       return;
+#endif
+
        CRYPTO_w_unlock(CRYPTO_LOCK_RAND);
        /* put in some default random data, we need more than just this */
 #ifndef GETPID_IS_MEANINGLESS
@@ -354,13 +421,14 @@ static int ssleay_rand_bytes(unsigned char *buf, int num)
 #endif
 
 #ifdef PREDICT
-       {
-       static unsigned char val=0;
+       if (rand_predictable)
+               {
+               static unsigned char val=0;
 
-       for (i=0; i<num; i++)
-               buf[i]=val++;
-       return(1);
-       }
+               for (i=0; i<num; i++)
+                       buf[i]=val++;
+               return(1);
+               }
 #endif
 
        /*
@@ -489,17 +557,66 @@ static int ssleay_rand_pseudo_bytes(unsigned char *buf, int num)
        return (ret);
        }
 
-int RAND_status(void)
+static int ssleay_rand_status(void)
        {
+       int ret;
+
+       CRYPTO_w_lock(CRYPTO_LOCK_RAND);
+
        if (!initialized)
                ssleay_rand_initialize();
-       return (entropy >= ENTROPY_NEEDED);
+       ret = entropy >= ENTROPY_NEEDED;
+
+       CRYPTO_w_unlock(CRYPTO_LOCK_RAND);
+
+       return ret;
        }
 
 #ifdef WINDOWS
 #include <windows.h>
 #include <openssl/rand.h>
 
+int RAND_event(UINT iMsg, WPARAM wParam, LPARAM lParam)
+        {
+        double add_entropy=0;
+        SYSTEMTIME t;
+
+        switch (iMsg)
+                {
+        case WM_KEYDOWN:
+                        {
+                        static WPARAM key;
+                        if (key != wParam)
+                                add_entropy = 0.05;
+                        key = wParam;
+                        }
+                        break;
+       case WM_MOUSEMOVE:
+                        {
+                        static int lastx,lasty,lastdx,lastdy;
+                        int x,y,dx,dy;
+
+                        x=LOWORD(lParam);
+                        y=HIWORD(lParam);
+                        dx=lastx-x;
+                        dy=lasty-y;
+                        if (dx != 0 && dy != 0 && dx-lastdx != 0 && dy-lastdy != 0)
+                                add_entropy=.2;
+                        lastx=x, lasty=y;
+                        lastdx=dx, lastdy=dy;
+                        }
+               break;
+               }
+
+        GetSystemTime(&t);
+        RAND_add(&iMsg, sizeof(iMsg), add_entropy);
+       RAND_add(&wParam, sizeof(wParam), 0);
+       RAND_add(&lParam, sizeof(lParam), 0);
+        RAND_add(&t, sizeof(t), 0);
+
+       return (RAND_status());
+       }
+
 /*****************************************************************************
  * Initialisation function for the SSL random generator.  Takes the contents
  * of the screen as random seed.
index 28f45ec..2973ee9 100644 (file)
@@ -70,8 +70,13 @@ typedef struct rand_meth_st
        void (*cleanup)(void);
        void (*add)(const void *buf, int num, double entropy);
        int (*pseudorand)(unsigned char *buf, int num);
+       int (*status)(void);
        } RAND_METHOD;
 
+#ifdef BN_DEBUG
+extern int rand_predictable;
+#endif
+
 void RAND_set_rand_method(RAND_METHOD *meth);
 RAND_METHOD *RAND_get_rand_method(void );
 RAND_METHOD *RAND_SSLeay(void);
@@ -85,8 +90,10 @@ int  RAND_write_file(const char *file);
 const char *RAND_file_name(char *file,int num);
 int RAND_status(void);
 int RAND_egd(const char *path);
-#ifdef WINDOWS
+#if defined(WINDOWS) || defined(WIN32)
+#include <windows.h>
 void RAND_screen(void);
+int RAND_event(UINT, WPARAM, LPARAM);
 #endif
 void   ERR_load_RAND_strings(void);
 
index d834408..380c782 100644 (file)
@@ -97,7 +97,7 @@ int RAND_egd(const char *path)
        buf[1] = 255;
        write(fd, buf, 2);
        if (read(fd, buf, 1) != 1) goto err;
-    if (buf[0] == 0) goto err;
+       if (buf[0] == 0) goto err;
        num = read(fd, buf, 255);
        if (num < 1) goto err;
        RAND_seed(buf, num);
index d1263ed..1af0aa0 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
@@ -71,7 +72,7 @@ static ERR_STRING_DATA RAND_str_functs[]=
 
 static ERR_STRING_DATA RAND_str_reasons[]=
        {
-{RAND_R_PRNG_NOT_SEEDED                  ,"prng not seeded"},
+{RAND_R_PRNG_NOT_SEEDED                  ,"PRNG not seeded"},
 {0,NULL}
        };
 
index b09a300..7da74aa 100644 (file)
@@ -108,3 +108,10 @@ int RAND_pseudo_bytes(unsigned char *buf, int num)
                return rand_meth->pseudorand(buf,num);
        return(-1);
        }
+
+int RAND_status(void)
+       {
+       if (rand_meth != NULL)
+               return rand_meth->status();
+       return 0;
+       }
index 658a8d6..9ff3974 100644 (file)
@@ -133,35 +133,20 @@ int RAND_write_file(const char *file)
        int i,ret=0,err=0;
        FILE *out = NULL;
        int n;
-
-#ifdef VMS
-       /* Under VMS, fopen(file, "wb") will create a new version of the
-          same file.  This is not good, so let's try updating an existing
-          one, and create file only if it doesn't already exist. */
-       /* At the same time, if we just update a file, we also need to
-          truncate it, and unfortunately, ftruncate() and truncate() do
-          not exist everywhere.  All that remains is to delete old versions
-          of the random data file (done at the end). */
-#if 0
-       out=fopen(file,"rb+");
-       if (out == NULL && errno != ENOENT)
-               goto err;
-#endif
+       
+#if defined(O_CREAT) && defined(O_EXCL) && !defined(WIN32)
+       /* For some reason Win32 can't write to files created this way */
+
+        /* chmod(..., 0600) is too late to protect the file,
+         * permissions should be restrictive from the start */
+        int fd = open(file, O_CREAT | O_EXCL, 0600);
+        if (fd != -1)
+                out = fdopen(fd, "wb");
 #endif
+        if (out == NULL)
+                out = fopen(file,"wb");
+        if (out == NULL) goto err;
 
-       if (out == NULL)
-               {
-#if defined O_CREAT && defined O_EXCL
-               /* chmod(..., 0600) is too late to protect the file,
-                * permissions should be restrictive from the start */
-               int fd = open(file, O_CREAT | O_EXCL, 0600);
-               if (fd != -1)
-                       out = fdopen(fd, "wb");
-#else          
-               out=fopen(file,"wb");
-#endif
-               }
-       if (out == NULL) goto err;
 #ifndef NO_CHMOD
        chmod(file,0600);
 #endif
@@ -180,14 +165,8 @@ int RAND_write_file(const char *file)
                        }
                ret+=i;
                if (n <= 0) break;
-               }
+                }
 #ifdef VMS
-       /* We may have updated an existing file using mode "rb+",
-        * now remove any old extra bytes */
-#if 0
-       if (ret > 0)
-               ftruncate(fileno(out), ret);
-#else
        /* Try to delete older versions of the file, until there aren't
           any */
        {
@@ -205,8 +184,7 @@ int RAND_write_file(const char *file)
                                      some point... */
                }
        }
-#endif
-#endif
+#endif /* VMS */
 
        fclose(out);
        memset(buf,0,BUFSIZE);
index 4dc20c6..e69de29 100644 (file)
@@ -1,73 +0,0 @@
-# Targets
-# make          - twidle the options yourself :-)
-# make cc       - standard cc options
-# make gcc      - standard gcc options
-
-DIR=    rc2
-TOP=    .
-CC=     gcc
-CFLAG= -O3 -fomit-frame-pointer
-
-CPP=    $(CC) -E
-INCLUDES=
-INSTALLTOP=/usr/local/lib
-MAKE=           make
-MAKEDEPEND=     makedepend
-MAKEFILE=       Makefile.uni
-AR=             ar r
-RANLIB=         ranlib
-
-IDEA_ENC=rc2_cbc.o
-
-CFLAGS= $(INCLUDES) $(CFLAG)
-
-GENERAL=Makefile
-TEST=rc2test
-APPS=rc2speed
-
-LIB=librc2.a
-LIBSRC=rc2_skey.c rc2_ecb.c rc2_cbc.c rc2cfb64.c rc2ofb64.c
-LIBOBJ=rc2_skey.o rc2_ecb.o $(IDEA_ENC) rc2cfb64.o rc2ofb64.o
-
-SRC= $(LIBSRC)
-
-EXHEADER= rc2.h
-HEADER= rc2_locl.h $(EXHEADER)
-
-ALL=    $(GENERAL) $(SRC) $(HEADER)
-
-all:    $(LIB) $(TEST) $(APPS)
-
-$(LIB):    $(LIBOBJ)
-       $(AR) $(LIB) $(LIBOBJ)
-       $(RANLIB) $(LIB)
-
-test:  $(TEST)
-       ./$(TEST)
-
-$(TEST): $(TEST).c $(LIB)
-       $(CC) -o $(TEST) $(CFLAGS) $(TEST).c $(LIB)
-
-$(APPS): $(APPS).c $(LIB)
-       $(CC) -o $(APPS) $(CFLAGS) $(APPS).c $(LIB)
-
-lint:
-       lint -DLINT $(INCLUDES) $(SRC)>fluff
-
-depend:
-       $(MAKEDEPEND) $(INCLUDES) $(PROGS) $(LIBSRC)
-
-dclean:
-       perl -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) >Makefile.new
-       mv -f Makefile.new $(MAKEFILE)
-
-clean:
-       /bin/rm -f $(LIB) $(TEST) $(APPS) *.o asm/*.o *.obj lib tags core .pure .nfs* *.old *.bak fluff
-
-cc:
-       $(MAKE) CC="cc" CFLAG="-O" all
-
-gcc:
-       $(MAKE) CC="gcc" CFLAGS="-O3 -fomit-frame-pointer" all
-
-# DO NOT DELETE THIS LINE -- make depend depends on it.
index 2ea95f0..8d2a795 100644 (file)
@@ -5,6 +5,7 @@
 DIR=   rc4
 TOP=   ../..
 CC=    cc
+CPP=    $(CC) -E
 INCLUDES=
 CFLAG=-g
 INSTALL_PREFIX=
@@ -51,7 +52,7 @@ lib:  $(LIBOBJ)
 
 # elf
 asm/rx86-elf.o: asm/rx86unix.cpp
-       $(CPP) -DELF asm/rx86unix.cpp | as -o asm/rx86-elf.o
+       $(CPP) -DELF -x c asm/rx86unix.cpp | as -o asm/rx86-elf.o
 
 # solaris
 asm/rx86-sol.o: asm/rx86unix.cpp
@@ -67,7 +68,7 @@ asm/rx86-out.o: asm/rx86unix.cpp
 asm/rx86bsdi.o: asm/rx86unix.cpp
        $(CPP) -DBSDI asm/rx86unix.cpp | sed 's/ :/:/' | as -o asm/rx86bsdi.o
 
-asm/rx86unix.cpp: asm/rc4-586.pl
+asm/rx86unix.cpp: asm/rc4-586.pl ../perlasm/x86asm.pl
        (cd asm; $(PERL) rc4-586.pl cpp >rx86unix.cpp)
 
 files:
index 855d9e5..e69de29 100644 (file)
@@ -1,103 +0,0 @@
-# Targets
-# make          - twidle the options yourself :-)
-# make cc       - standard cc options
-# make gcc      - standard gcc options
-# make x86-elf  - linux-elf etc
-# make x86-out  - linux-a.out, FreeBSD etc
-# make x86-solaris
-# make x86-bdsi
-
-DIR=    rc4
-TOP=    .
-CC=     gcc
-CFLAG= -O3 -fomit-frame-pointer
-
-CPP=    $(CC) -E
-INCLUDES=
-INSTALLTOP=/usr/local/lib
-MAKE=           make
-MAKEDEPEND=     makedepend
-MAKEFILE=       Makefile.uni
-AR=             ar r
-RANLIB=         ranlib
-
-RC4_ENC=rc4_enc.o
-# or use
-#RC4_ENC=asm/rx86-elf.o
-#RC4_ENC=asm/rx86-out.o
-#RC4_ENC=asm/rx86-sol.o
-#RC4_ENC=asm/rx86bdsi.o
-
-CFLAGS= $(INCLUDES) $(CFLAG)
-
-GENERAL=Makefile
-TEST=rc4test
-APPS=rc4speed
-
-LIB=librc4.a
-LIBSRC=rc4_skey.c rc4_enc.c
-LIBOBJ=rc4_skey.o $(RC4_ENC)
-
-SRC= $(LIBSRC)
-
-EXHEADER= rc4.h
-HEADER= $(EXHEADER) rc4_locl.h
-
-ALL=    $(GENERAL) $(SRC) $(HEADER)
-
-all:    $(LIB) $(TEST) $(APPS)
-
-$(LIB):    $(LIBOBJ)
-       $(AR) $(LIB) $(LIBOBJ)
-       $(RANLIB) $(LIB)
-
-# elf
-asm/rx86-elf.o: asm/rx86unix.cpp
-       $(CPP) -DELF asm/rx86unix.cpp | as -o asm/rx86-elf.o
-
-# solaris
-asm/rx86-sol.o: asm/rx86unix.cpp
-       $(CC) -E -DSOL asm/rx86unix.cpp | sed 's/^#.*//' > asm/rx86-sol.s
-       as -o asm/rx86-sol.o asm/rx86-sol.s
-       rm -f asm/rx86-sol.s
-
-# a.out
-asm/rx86-out.o: asm/rx86unix.cpp
-       $(CPP) -DOUT asm/rx86unix.cpp | as -o asm/rx86-out.o
-
-# bsdi
-asm/rx86bsdi.o: asm/rx86unix.cpp
-       $(CPP) -DBSDI asm/rx86unix.cpp | as -o asm/rx86bsdi.o
-
-asm/rx86unix.cpp:
-       (cd asm; perl rc4-586.pl cpp >rx86unix.cpp)
-
-test:  $(TEST)
-       ./$(TEST)
-
-$(TEST): $(TEST).c $(LIB)
-       $(CC) -o $(TEST) $(CFLAGS) $(TEST).c $(LIB)
-
-$(APPS): $(APPS).c $(LIB)
-       $(CC) -o $(APPS) $(CFLAGS) $(APPS).c $(LIB)
-
-lint:
-       lint -DLINT $(INCLUDES) $(SRC)>fluff
-
-depend:
-       $(MAKEDEPEND) $(INCLUDES) $(PROGS) $(LIBSRC)
-
-dclean:
-       perl -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) >Makefile.new
-       mv -f Makefile.new $(MAKEFILE)
-
-clean:
-       /bin/rm -f $(LIB) $(TEST) $(APPS) *.o asm/*.o *.obj lib tags core .pure .nfs* *.old *.bak fluff
-
-cc:
-       $(MAKE) CC="cc" CFLAG="-O" all
-
-gcc:
-       $(MAKE) CC="gcc" CFLAGS="-O3 -fomit-frame-pointer" all
-
-# DO NOT DELETE THIS LINE -- make depend depends on it.
index 70b0f74..e69de29 100644 (file)
@@ -1,314 +0,0 @@
-       ; Don't even think of reading this code
-       ; It was automatically generated by rc4-586.pl
-       ; Which is a perl program used to generate the x86 assember for
-       ; any of elf, a.out, BSDI,Win32, or Solaris
-       ; eric <eay@cryptsoft.com>
-       ; 
-       TITLE   rc4-586.asm
-        .386
-.model FLAT
-_TEXT  SEGMENT
-PUBLIC _RC4
-
-_RC4 PROC NEAR
-       ; 
-       push    ebp
-       push    ebx
-       mov     ebp,            DWORD PTR 12[esp]
-       mov     ebx,            DWORD PTR 16[esp]
-       push    esi
-       push    edi
-       mov     ecx,            DWORD PTR [ebp]
-       mov     edx,            DWORD PTR 4[ebp]
-       mov     esi,            DWORD PTR 28[esp]
-       inc     ecx
-       sub     esp,            12
-       add     ebp,            8
-       and     ecx,            255
-       lea     ebx,            DWORD PTR [esi+ebx-8]
-       mov     edi,            DWORD PTR 44[esp]
-       mov     DWORD PTR 8[esp],ebx
-       mov     eax,            DWORD PTR [ecx*4+ebp]
-       cmp     ebx,            esi
-       jl      $L000end
-L001start:
-       add     esi,            8
-       ; Round 0
-       add     edx,            eax
-       and     edx,            255
-       inc     ecx
-       mov     ebx,            DWORD PTR [edx*4+ebp]
-       mov     DWORD PTR [ecx*4+ebp-4],ebx
-       add     ebx,            eax
-       and     ecx,            255
-       and     ebx,            255
-       mov     DWORD PTR [edx*4+ebp],eax
-       nop
-       mov     ebx,            DWORD PTR [ebx*4+ebp]
-       mov     eax,            DWORD PTR [ecx*4+ebp]
-       mov     BYTE PTR [esp], bl
-       ; Round 1
-       add     edx,            eax
-       and     edx,            255
-       inc     ecx
-       mov     ebx,            DWORD PTR [edx*4+ebp]
-       mov     DWORD PTR [ecx*4+ebp-4],ebx
-       add     ebx,            eax
-       and     ecx,            255
-       and     ebx,            255
-       mov     DWORD PTR [edx*4+ebp],eax
-       nop
-       mov     ebx,            DWORD PTR [ebx*4+ebp]
-       mov     eax,            DWORD PTR [ecx*4+ebp]
-       mov     BYTE PTR 1[esp],bl
-       ; Round 2
-       add     edx,            eax
-       and     edx,            255
-       inc     ecx
-       mov     ebx,            DWORD PTR [edx*4+ebp]
-       mov     DWORD PTR [ecx*4+ebp-4],ebx
-       add     ebx,            eax
-       and     ecx,            255
-       and     ebx,            255
-       mov     DWORD PTR [edx*4+ebp],eax
-       nop
-       mov     ebx,            DWORD PTR [ebx*4+ebp]
-       mov     eax,            DWORD PTR [ecx*4+ebp]
-       mov     BYTE PTR 2[esp],bl
-       ; Round 3
-       add     edx,            eax
-       and     edx,            255
-       inc     ecx
-       mov     ebx,            DWORD PTR [edx*4+ebp]
-       mov     DWORD PTR [ecx*4+ebp-4],ebx
-       add     ebx,            eax
-       and     ecx,            255
-       and     ebx,            255
-       mov     DWORD PTR [edx*4+ebp],eax
-       nop
-       mov     ebx,            DWORD PTR [ebx*4+ebp]
-       mov     eax,            DWORD PTR [ecx*4+ebp]
-       mov     BYTE PTR 3[esp],bl
-       ; Round 4
-       add     edx,            eax
-       and     edx,            255
-       inc     ecx
-       mov     ebx,            DWORD PTR [edx*4+ebp]
-       mov     DWORD PTR [ecx*4+ebp-4],ebx
-       add     ebx,            eax
-       and     ecx,            255
-       and     ebx,            255
-       mov     DWORD PTR [edx*4+ebp],eax
-       nop
-       mov     ebx,            DWORD PTR [ebx*4+ebp]
-       mov     eax,            DWORD PTR [ecx*4+ebp]
-       mov     BYTE PTR 4[esp],bl
-       ; Round 5
-       add     edx,            eax
-       and     edx,            255
-       inc     ecx
-       mov     ebx,            DWORD PTR [edx*4+ebp]
-       mov     DWORD PTR [ecx*4+ebp-4],ebx
-       add     ebx,            eax
-       and     ecx,            255
-       and     ebx,            255
-       mov     DWORD PTR [edx*4+ebp],eax
-       nop
-       mov     ebx,            DWORD PTR [ebx*4+ebp]
-       mov     eax,            DWORD PTR [ecx*4+ebp]
-       mov     BYTE PTR 5[esp],bl
-       ; Round 6
-       add     edx,            eax
-       and     edx,            255
-       inc     ecx
-       mov     ebx,            DWORD PTR [edx*4+ebp]
-       mov     DWORD PTR [ecx*4+ebp-4],ebx
-       add     ebx,            eax
-       and     ecx,            255
-       and     ebx,            255
-       mov     DWORD PTR [edx*4+ebp],eax
-       nop
-       mov     ebx,            DWORD PTR [ebx*4+ebp]
-       mov     eax,            DWORD PTR [ecx*4+ebp]
-       mov     BYTE PTR 6[esp],bl
-       ; Round 7
-       add     edx,            eax
-       and     edx,            255
-       inc     ecx
-       mov     ebx,            DWORD PTR [edx*4+ebp]
-       mov     DWORD PTR [ecx*4+ebp-4],ebx
-       add     ebx,            eax
-       and     ecx,            255
-       and     ebx,            255
-       mov     DWORD PTR [edx*4+ebp],eax
-       nop
-       mov     ebx,            DWORD PTR [ebx*4+ebp]
-       add     edi,            8
-       mov     BYTE PTR 7[esp],bl
-       ; apply the cipher text
-       mov     eax,            DWORD PTR [esp]
-       mov     ebx,            DWORD PTR [esi-8]
-       xor     eax,            ebx
-       mov     ebx,            DWORD PTR [esi-4]
-       mov     DWORD PTR [edi-8],eax
-       mov     eax,            DWORD PTR 4[esp]
-       xor     eax,            ebx
-       mov     ebx,            DWORD PTR 8[esp]
-       mov     DWORD PTR [edi-4],eax
-       mov     eax,            DWORD PTR [ecx*4+ebp]
-       cmp     esi,            ebx
-       jle     L001start
-$L000end:
-       ; Round 0
-       add     ebx,            8
-       inc     esi
-       cmp     ebx,            esi
-       jl      $L002finished
-       mov     DWORD PTR 8[esp],ebx
-       add     edx,            eax
-       and     edx,            255
-       inc     ecx
-       mov     ebx,            DWORD PTR [edx*4+ebp]
-       mov     DWORD PTR [ecx*4+ebp-4],ebx
-       add     ebx,            eax
-       and     ecx,            255
-       and     ebx,            255
-       mov     DWORD PTR [edx*4+ebp],eax
-       nop
-       mov     ebx,            DWORD PTR [ebx*4+ebp]
-       mov     eax,            DWORD PTR [ecx*4+ebp]
-       mov     bh,             BYTE PTR [esi-1]
-       xor     bl,             bh
-       mov     BYTE PTR [edi], bl
-       ; Round 1
-       mov     ebx,            DWORD PTR 8[esp]
-       cmp     ebx,            esi
-       jle     $L002finished
-       inc     esi
-       add     edx,            eax
-       and     edx,            255
-       inc     ecx
-       mov     ebx,            DWORD PTR [edx*4+ebp]
-       mov     DWORD PTR [ecx*4+ebp-4],ebx
-       add     ebx,            eax
-       and     ecx,            255
-       and     ebx,            255
-       mov     DWORD PTR [edx*4+ebp],eax
-       nop
-       mov     ebx,            DWORD PTR [ebx*4+ebp]
-       mov     eax,            DWORD PTR [ecx*4+ebp]
-       mov     bh,             BYTE PTR [esi-1]
-       xor     bl,             bh
-       mov     BYTE PTR 1[edi],bl
-       ; Round 2
-       mov     ebx,            DWORD PTR 8[esp]
-       cmp     ebx,            esi
-       jle     $L002finished
-       inc     esi
-       add     edx,            eax
-       and     edx,            255
-       inc     ecx
-       mov     ebx,            DWORD PTR [edx*4+ebp]
-       mov     DWORD PTR [ecx*4+ebp-4],ebx
-       add     ebx,            eax
-       and     ecx,            255
-       and     ebx,            255
-       mov     DWORD PTR [edx*4+ebp],eax
-       nop
-       mov     ebx,            DWORD PTR [ebx*4+ebp]
-       mov     eax,            DWORD PTR [ecx*4+ebp]
-       mov     bh,             BYTE PTR [esi-1]
-       xor     bl,             bh
-       mov     BYTE PTR 2[edi],bl
-       ; Round 3
-       mov     ebx,            DWORD PTR 8[esp]
-       cmp     ebx,            esi
-       jle     $L002finished
-       inc     esi
-       add     edx,            eax
-       and     edx,            255
-       inc     ecx
-       mov     ebx,            DWORD PTR [edx*4+ebp]
-       mov     DWORD PTR [ecx*4+ebp-4],ebx
-       add     ebx,            eax
-       and     ecx,            255
-       and     ebx,            255
-       mov     DWORD PTR [edx*4+ebp],eax
-       nop
-       mov     ebx,            DWORD PTR [ebx*4+ebp]
-       mov     eax,            DWORD PTR [ecx*4+ebp]
-       mov     bh,             BYTE PTR [esi-1]
-       xor     bl,             bh
-       mov     BYTE PTR 3[edi],bl
-       ; Round 4
-       mov     ebx,            DWORD PTR 8[esp]
-       cmp     ebx,            esi
-       jle     $L002finished
-       inc     esi
-       add     edx,            eax
-       and     edx,            255
-       inc     ecx
-       mov     ebx,            DWORD PTR [edx*4+ebp]
-       mov     DWORD PTR [ecx*4+ebp-4],ebx
-       add     ebx,            eax
-       and     ecx,            255
-       and     ebx,            255
-       mov     DWORD PTR [edx*4+ebp],eax
-       nop
-       mov     ebx,            DWORD PTR [ebx*4+ebp]
-       mov     eax,            DWORD PTR [ecx*4+ebp]
-       mov     bh,             BYTE PTR [esi-1]
-       xor     bl,             bh
-       mov     BYTE PTR 4[edi],bl
-       ; Round 5
-       mov     ebx,            DWORD PTR 8[esp]
-       cmp     ebx,            esi
-       jle     $L002finished
-       inc     esi
-       add     edx,            eax
-       and     edx,            255
-       inc     ecx
-       mov     ebx,            DWORD PTR [edx*4+ebp]
-       mov     DWORD PTR [ecx*4+ebp-4],ebx
-       add     ebx,            eax
-       and     ecx,            255
-       and     ebx,            255
-       mov     DWORD PTR [edx*4+ebp],eax
-       nop
-       mov     ebx,            DWORD PTR [ebx*4+ebp]
-       mov     eax,            DWORD PTR [ecx*4+ebp]
-       mov     bh,             BYTE PTR [esi-1]
-       xor     bl,             bh
-       mov     BYTE PTR 5[edi],bl
-       ; Round 6
-       mov     ebx,            DWORD PTR 8[esp]
-       cmp     ebx,            esi
-       jle     $L002finished
-       inc     esi
-       add     edx,            eax
-       and     edx,            255
-       inc     ecx
-       mov     ebx,            DWORD PTR [edx*4+ebp]
-       mov     DWORD PTR [ecx*4+ebp-4],ebx
-       add     ebx,            eax
-       and     ecx,            255
-       and     ebx,            255
-       mov     DWORD PTR [edx*4+ebp],eax
-       nop
-       mov     ebx,            DWORD PTR [ebx*4+ebp]
-       mov     bh,             BYTE PTR [esi-1]
-       xor     bl,             bh
-       mov     BYTE PTR 6[edi],bl
-$L002finished:
-       dec     ecx
-       add     esp,            12
-       mov     DWORD PTR [ebp-4],edx
-       mov     BYTE PTR [ebp-8],cl
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-_RC4 ENDP
-_TEXT  ENDS
-END
index 35abb9d..5a54a16 100644 (file)
@@ -49,7 +49,7 @@ lib:  $(LIBOBJ)
 
 # elf
 asm/r586-elf.o: asm/r586unix.cpp
-       $(CPP) -DELF asm/r586unix.cpp | as -o asm/r586-elf.o
+       $(CPP) -DELF -x c asm/r586unix.cpp | as -o asm/r586-elf.o
 
 # solaris
 asm/r586-sol.o: asm/r586unix.cpp
@@ -65,7 +65,7 @@ asm/r586-out.o: asm/r586unix.cpp
 asm/r586bsdi.o: asm/r586unix.cpp
        $(CPP) -DBSDI asm/r586unix.cpp | sed 's/ :/:/' | as -o asm/r586bsdi.o
 
-asm/r586unix.cpp:
+asm/r586unix.cpp: asm/rc5-586.pl ../perlasm/x86asm.pl ../perlasm/cbc.pl
        (cd asm; $(PERL) rc5-586.pl cpp >r586unix.cpp)
 
 files:
index 4dc20c6..e69de29 100644 (file)
@@ -1,73 +0,0 @@
-# Targets
-# make          - twidle the options yourself :-)
-# make cc       - standard cc options
-# make gcc      - standard gcc options
-
-DIR=    rc2
-TOP=    .
-CC=     gcc
-CFLAG= -O3 -fomit-frame-pointer
-
-CPP=    $(CC) -E
-INCLUDES=
-INSTALLTOP=/usr/local/lib
-MAKE=           make
-MAKEDEPEND=     makedepend
-MAKEFILE=       Makefile.uni
-AR=             ar r
-RANLIB=         ranlib
-
-IDEA_ENC=rc2_cbc.o
-
-CFLAGS= $(INCLUDES) $(CFLAG)
-
-GENERAL=Makefile
-TEST=rc2test
-APPS=rc2speed
-
-LIB=librc2.a
-LIBSRC=rc2_skey.c rc2_ecb.c rc2_cbc.c rc2cfb64.c rc2ofb64.c
-LIBOBJ=rc2_skey.o rc2_ecb.o $(IDEA_ENC) rc2cfb64.o rc2ofb64.o
-
-SRC= $(LIBSRC)
-
-EXHEADER= rc2.h
-HEADER= rc2_locl.h $(EXHEADER)
-
-ALL=    $(GENERAL) $(SRC) $(HEADER)
-
-all:    $(LIB) $(TEST) $(APPS)
-
-$(LIB):    $(LIBOBJ)
-       $(AR) $(LIB) $(LIBOBJ)
-       $(RANLIB) $(LIB)
-
-test:  $(TEST)
-       ./$(TEST)
-
-$(TEST): $(TEST).c $(LIB)
-       $(CC) -o $(TEST) $(CFLAGS) $(TEST).c $(LIB)
-
-$(APPS): $(APPS).c $(LIB)
-       $(CC) -o $(APPS) $(CFLAGS) $(APPS).c $(LIB)
-
-lint:
-       lint -DLINT $(INCLUDES) $(SRC)>fluff
-
-depend:
-       $(MAKEDEPEND) $(INCLUDES) $(PROGS) $(LIBSRC)
-
-dclean:
-       perl -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) >Makefile.new
-       mv -f Makefile.new $(MAKEFILE)
-
-clean:
-       /bin/rm -f $(LIB) $(TEST) $(APPS) *.o asm/*.o *.obj lib tags core .pure .nfs* *.old *.bak fluff
-
-cc:
-       $(MAKE) CC="cc" CFLAG="-O" all
-
-gcc:
-       $(MAKE) CC="gcc" CFLAGS="-O3 -fomit-frame-pointer" all
-
-# DO NOT DELETE THIS LINE -- make depend depends on it.
index f43d371..e69de29 100644 (file)
@@ -1,574 +0,0 @@
-       ; Don't even think of reading this code
-       ; It was automatically generated by rc5-586.pl
-       ; Which is a perl program used to generate the x86 assember for
-       ; any of elf, a.out, BSDI,Win32, or Solaris
-       ; eric <eay@cryptsoft.com>
-       ; 
-       TITLE   rc5-586.asm
-        .386
-.model FLAT
-_TEXT  SEGMENT
-PUBLIC _RC5_32_encrypt
-
-_RC5_32_encrypt PROC NEAR
-       ; 
-       push    ebp
-       push    esi
-       push    edi
-       mov     edx,            DWORD PTR 16[esp]
-       mov     ebp,            DWORD PTR 20[esp]
-       ; Load the 2 words
-       mov     edi,            DWORD PTR [edx]
-       mov     esi,            DWORD PTR 4[edx]
-       push    ebx
-       mov     ebx,            DWORD PTR [ebp]
-       add     edi,            DWORD PTR 4[ebp]
-       add     esi,            DWORD PTR 8[ebp]
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 12[ebp]
-       mov     ecx,            esi
-       rol     edi,            cl
-       add     edi,            eax
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 16[ebp]
-       mov     ecx,            edi
-       rol     esi,            cl
-       add     esi,            eax
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 20[ebp]
-       mov     ecx,            esi
-       rol     edi,            cl
-       add     edi,            eax
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 24[ebp]
-       mov     ecx,            edi
-       rol     esi,            cl
-       add     esi,            eax
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 28[ebp]
-       mov     ecx,            esi
-       rol     edi,            cl
-       add     edi,            eax
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 32[ebp]
-       mov     ecx,            edi
-       rol     esi,            cl
-       add     esi,            eax
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 36[ebp]
-       mov     ecx,            esi
-       rol     edi,            cl
-       add     edi,            eax
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 40[ebp]
-       mov     ecx,            edi
-       rol     esi,            cl
-       add     esi,            eax
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 44[ebp]
-       mov     ecx,            esi
-       rol     edi,            cl
-       add     edi,            eax
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 48[ebp]
-       mov     ecx,            edi
-       rol     esi,            cl
-       add     esi,            eax
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 52[ebp]
-       mov     ecx,            esi
-       rol     edi,            cl
-       add     edi,            eax
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 56[ebp]
-       mov     ecx,            edi
-       rol     esi,            cl
-       add     esi,            eax
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 60[ebp]
-       mov     ecx,            esi
-       rol     edi,            cl
-       add     edi,            eax
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 64[ebp]
-       mov     ecx,            edi
-       rol     esi,            cl
-       add     esi,            eax
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 68[ebp]
-       mov     ecx,            esi
-       rol     edi,            cl
-       add     edi,            eax
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 72[ebp]
-       mov     ecx,            edi
-       rol     esi,            cl
-       add     esi,            eax
-       cmp     ebx,            8
-       je      $L000rc5_exit
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 76[ebp]
-       mov     ecx,            esi
-       rol     edi,            cl
-       add     edi,            eax
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 80[ebp]
-       mov     ecx,            edi
-       rol     esi,            cl
-       add     esi,            eax
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 84[ebp]
-       mov     ecx,            esi
-       rol     edi,            cl
-       add     edi,            eax
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 88[ebp]
-       mov     ecx,            edi
-       rol     esi,            cl
-       add     esi,            eax
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 92[ebp]
-       mov     ecx,            esi
-       rol     edi,            cl
-       add     edi,            eax
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 96[ebp]
-       mov     ecx,            edi
-       rol     esi,            cl
-       add     esi,            eax
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 100[ebp]
-       mov     ecx,            esi
-       rol     edi,            cl
-       add     edi,            eax
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 104[ebp]
-       mov     ecx,            edi
-       rol     esi,            cl
-       add     esi,            eax
-       cmp     ebx,            12
-       je      $L000rc5_exit
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 108[ebp]
-       mov     ecx,            esi
-       rol     edi,            cl
-       add     edi,            eax
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 112[ebp]
-       mov     ecx,            edi
-       rol     esi,            cl
-       add     esi,            eax
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 116[ebp]
-       mov     ecx,            esi
-       rol     edi,            cl
-       add     edi,            eax
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 120[ebp]
-       mov     ecx,            edi
-       rol     esi,            cl
-       add     esi,            eax
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 124[ebp]
-       mov     ecx,            esi
-       rol     edi,            cl
-       add     edi,            eax
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 128[ebp]
-       mov     ecx,            edi
-       rol     esi,            cl
-       add     esi,            eax
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 132[ebp]
-       mov     ecx,            esi
-       rol     edi,            cl
-       add     edi,            eax
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 136[ebp]
-       mov     ecx,            edi
-       rol     esi,            cl
-       add     esi,            eax
-$L000rc5_exit:
-       mov     DWORD PTR [edx],edi
-       mov     DWORD PTR 4[edx],esi
-       pop     ebx
-       pop     edi
-       pop     esi
-       pop     ebp
-       ret
-_RC5_32_encrypt ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _RC5_32_decrypt
-
-_RC5_32_decrypt PROC NEAR
-       ; 
-       push    ebp
-       push    esi
-       push    edi
-       mov     edx,            DWORD PTR 16[esp]
-       mov     ebp,            DWORD PTR 20[esp]
-       ; Load the 2 words
-       mov     edi,            DWORD PTR [edx]
-       mov     esi,            DWORD PTR 4[edx]
-       push    ebx
-       mov     ebx,            DWORD PTR [ebp]
-       cmp     ebx,            12
-       je      $L001rc5_dec_12
-       cmp     ebx,            8
-       je      $L002rc5_dec_8
-       mov     eax,            DWORD PTR 136[ebp]
-       sub     esi,            eax
-       mov     ecx,            edi
-       ror     esi,            cl
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 132[ebp]
-       sub     edi,            eax
-       mov     ecx,            esi
-       ror     edi,            cl
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 128[ebp]
-       sub     esi,            eax
-       mov     ecx,            edi
-       ror     esi,            cl
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 124[ebp]
-       sub     edi,            eax
-       mov     ecx,            esi
-       ror     edi,            cl
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 120[ebp]
-       sub     esi,            eax
-       mov     ecx,            edi
-       ror     esi,            cl
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 116[ebp]
-       sub     edi,            eax
-       mov     ecx,            esi
-       ror     edi,            cl
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 112[ebp]
-       sub     esi,            eax
-       mov     ecx,            edi
-       ror     esi,            cl
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 108[ebp]
-       sub     edi,            eax
-       mov     ecx,            esi
-       ror     edi,            cl
-       xor     edi,            esi
-$L001rc5_dec_12:
-       mov     eax,            DWORD PTR 104[ebp]
-       sub     esi,            eax
-       mov     ecx,            edi
-       ror     esi,            cl
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 100[ebp]
-       sub     edi,            eax
-       mov     ecx,            esi
-       ror     edi,            cl
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 96[ebp]
-       sub     esi,            eax
-       mov     ecx,            edi
-       ror     esi,            cl
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 92[ebp]
-       sub     edi,            eax
-       mov     ecx,            esi
-       ror     edi,            cl
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 88[ebp]
-       sub     esi,            eax
-       mov     ecx,            edi
-       ror     esi,            cl
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 84[ebp]
-       sub     edi,            eax
-       mov     ecx,            esi
-       ror     edi,            cl
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 80[ebp]
-       sub     esi,            eax
-       mov     ecx,            edi
-       ror     esi,            cl
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 76[ebp]
-       sub     edi,            eax
-       mov     ecx,            esi
-       ror     edi,            cl
-       xor     edi,            esi
-$L002rc5_dec_8:
-       mov     eax,            DWORD PTR 72[ebp]
-       sub     esi,            eax
-       mov     ecx,            edi
-       ror     esi,            cl
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 68[ebp]
-       sub     edi,            eax
-       mov     ecx,            esi
-       ror     edi,            cl
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 64[ebp]
-       sub     esi,            eax
-       mov     ecx,            edi
-       ror     esi,            cl
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 60[ebp]
-       sub     edi,            eax
-       mov     ecx,            esi
-       ror     edi,            cl
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 56[ebp]
-       sub     esi,            eax
-       mov     ecx,            edi
-       ror     esi,            cl
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 52[ebp]
-       sub     edi,            eax
-       mov     ecx,            esi
-       ror     edi,            cl
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 48[ebp]
-       sub     esi,            eax
-       mov     ecx,            edi
-       ror     esi,            cl
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 44[ebp]
-       sub     edi,            eax
-       mov     ecx,            esi
-       ror     edi,            cl
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 40[ebp]
-       sub     esi,            eax
-       mov     ecx,            edi
-       ror     esi,            cl
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 36[ebp]
-       sub     edi,            eax
-       mov     ecx,            esi
-       ror     edi,            cl
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 32[ebp]
-       sub     esi,            eax
-       mov     ecx,            edi
-       ror     esi,            cl
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 28[ebp]
-       sub     edi,            eax
-       mov     ecx,            esi
-       ror     edi,            cl
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 24[ebp]
-       sub     esi,            eax
-       mov     ecx,            edi
-       ror     esi,            cl
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 20[ebp]
-       sub     edi,            eax
-       mov     ecx,            esi
-       ror     edi,            cl
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 16[ebp]
-       sub     esi,            eax
-       mov     ecx,            edi
-       ror     esi,            cl
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 12[ebp]
-       sub     edi,            eax
-       mov     ecx,            esi
-       ror     edi,            cl
-       xor     edi,            esi
-       sub     esi,            DWORD PTR 8[ebp]
-       sub     edi,            DWORD PTR 4[ebp]
-L003rc5_exit:
-       mov     DWORD PTR [edx],edi
-       mov     DWORD PTR 4[edx],esi
-       pop     ebx
-       pop     edi
-       pop     esi
-       pop     ebp
-       ret
-_RC5_32_decrypt ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _RC5_32_cbc_encrypt
-
-_RC5_32_cbc_encrypt PROC NEAR
-       ; 
-       push    ebp
-       push    ebx
-       push    esi
-       push    edi
-       mov     ebp,            DWORD PTR 28[esp]
-       ; getting iv ptr from parameter 4
-       mov     ebx,            DWORD PTR 36[esp]
-       mov     esi,            DWORD PTR [ebx]
-       mov     edi,            DWORD PTR 4[ebx]
-       push    edi
-       push    esi
-       push    edi
-       push    esi
-       mov     ebx,            esp
-       mov     esi,            DWORD PTR 36[esp]
-       mov     edi,            DWORD PTR 40[esp]
-       ; getting encrypt flag from parameter 5
-       mov     ecx,            DWORD PTR 56[esp]
-       ; get and push parameter 3
-       mov     eax,            DWORD PTR 48[esp]
-       push    eax
-       push    ebx
-       cmp     ecx,            0
-       jz      $L004decrypt
-       and     ebp,            4294967288
-       mov     eax,            DWORD PTR 8[esp]
-       mov     ebx,            DWORD PTR 12[esp]
-       jz      $L005encrypt_finish
-L006encrypt_loop:
-       mov     ecx,            DWORD PTR [esi]
-       mov     edx,            DWORD PTR 4[esi]
-       xor     eax,            ecx
-       xor     ebx,            edx
-       mov     DWORD PTR 8[esp],eax
-       mov     DWORD PTR 12[esp],ebx
-       call    _RC5_32_encrypt
-       mov     eax,            DWORD PTR 8[esp]
-       mov     ebx,            DWORD PTR 12[esp]
-       mov     DWORD PTR [edi],eax
-       mov     DWORD PTR 4[edi],ebx
-       add     esi,            8
-       add     edi,            8
-       sub     ebp,            8
-       jnz     L006encrypt_loop
-$L005encrypt_finish:
-       mov     ebp,            DWORD PTR 52[esp]
-       and     ebp,            7
-       jz      $L007finish
-       xor     ecx,            ecx
-       xor     edx,            edx
-       mov     ebp,            DWORD PTR $L008cbc_enc_jmp_table[ebp*4]
-       jmp      ebp
-L009ej7:
-       mov     dh,             BYTE PTR 6[esi]
-       shl     edx,            8
-L010ej6:
-       mov     dh,             BYTE PTR 5[esi]
-L011ej5:
-       mov     dl,             BYTE PTR 4[esi]
-L012ej4:
-       mov     ecx,            DWORD PTR [esi]
-       jmp     $L013ejend
-L014ej3:
-       mov     ch,             BYTE PTR 2[esi]
-       shl     ecx,            8
-L015ej2:
-       mov     ch,             BYTE PTR 1[esi]
-L016ej1:
-       mov     cl,             BYTE PTR [esi]
-$L013ejend:
-       xor     eax,            ecx
-       xor     ebx,            edx
-       mov     DWORD PTR 8[esp],eax
-       mov     DWORD PTR 12[esp],ebx
-       call    _RC5_32_encrypt
-       mov     eax,            DWORD PTR 8[esp]
-       mov     ebx,            DWORD PTR 12[esp]
-       mov     DWORD PTR [edi],eax
-       mov     DWORD PTR 4[edi],ebx
-       jmp     $L007finish
-$L004decrypt:
-       and     ebp,            4294967288
-       mov     eax,            DWORD PTR 16[esp]
-       mov     ebx,            DWORD PTR 20[esp]
-       jz      $L017decrypt_finish
-L018decrypt_loop:
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-       mov     DWORD PTR 8[esp],eax
-       mov     DWORD PTR 12[esp],ebx
-       call    _RC5_32_decrypt
-       mov     eax,            DWORD PTR 8[esp]
-       mov     ebx,            DWORD PTR 12[esp]
-       mov     ecx,            DWORD PTR 16[esp]
-       mov     edx,            DWORD PTR 20[esp]
-       xor     ecx,            eax
-       xor     edx,            ebx
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-       mov     DWORD PTR [edi],ecx
-       mov     DWORD PTR 4[edi],edx
-       mov     DWORD PTR 16[esp],eax
-       mov     DWORD PTR 20[esp],ebx
-       add     esi,            8
-       add     edi,            8
-       sub     ebp,            8
-       jnz     L018decrypt_loop
-$L017decrypt_finish:
-       mov     ebp,            DWORD PTR 52[esp]
-       and     ebp,            7
-       jz      $L007finish
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-       mov     DWORD PTR 8[esp],eax
-       mov     DWORD PTR 12[esp],ebx
-       call    _RC5_32_decrypt
-       mov     eax,            DWORD PTR 8[esp]
-       mov     ebx,            DWORD PTR 12[esp]
-       mov     ecx,            DWORD PTR 16[esp]
-       mov     edx,            DWORD PTR 20[esp]
-       xor     ecx,            eax
-       xor     edx,            ebx
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-L019dj7:
-       ror     edx,            16
-       mov     BYTE PTR 6[edi],dl
-       shr     edx,            16
-L020dj6:
-       mov     BYTE PTR 5[edi],dh
-L021dj5:
-       mov     BYTE PTR 4[edi],dl
-L022dj4:
-       mov     DWORD PTR [edi],ecx
-       jmp     $L023djend
-L024dj3:
-       ror     ecx,            16
-       mov     BYTE PTR 2[edi],cl
-       shl     ecx,            16
-L025dj2:
-       mov     BYTE PTR 1[esi],ch
-L026dj1:
-       mov     BYTE PTR [esi], cl
-$L023djend:
-       jmp     $L007finish
-$L007finish:
-       mov     ecx,            DWORD PTR 60[esp]
-       add     esp,            24
-       mov     DWORD PTR [ecx],eax
-       mov     DWORD PTR 4[ecx],ebx
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-$L008cbc_enc_jmp_table:
-       DD      0
-       DD      L016ej1
-       DD      L015ej2
-       DD      L014ej3
-       DD      L012ej4
-       DD      L011ej5
-       DD      L010ej6
-       DD      L009ej7
-L027cbc_dec_jmp_table:
-       DD      0
-       DD      L026dj1
-       DD      L025dj2
-       DD      L024dj3
-       DD      L022dj4
-       DD      L021dj5
-       DD      L020dj6
-       DD      L019dj7
-_RC5_32_cbc_encrypt ENDP
-_TEXT  ENDS
-END
index c6153d4..6ada9f0 100644 (file)
@@ -47,7 +47,7 @@ lib:    $(LIBOBJ)
 
 # elf
 asm/rm86-elf.o: asm/rm86unix.cpp
-       $(CPP) -DELF asm/rm86unix.cpp | as -o asm/rm86-elf.o
+       $(CPP) -DELF -x c asm/rm86unix.cpp | as -o asm/rm86-elf.o
 
 # solaris
 asm/rm86-sol.o: asm/rm86unix.cpp
@@ -63,7 +63,7 @@ asm/rm86-out.o: asm/rm86unix.cpp
 asm/rm86bsdi.o: asm/rm86unix.cpp
        $(CPP) -DBSDI asm/rm86unix.cpp | sed 's/ :/:/' | as -o asm/rm86bsdi.o
 
-asm/rm86unix.cpp: asm/rmd-586.pl
+asm/rm86unix.cpp: asm/rmd-586.pl ../perlasm/x86asm.pl
        (cd asm; $(PERL) rmd-586.pl cpp >rm86unix.cpp)
 
 files:
index 5310020..e69de29 100644 (file)
@@ -1,109 +0,0 @@
-# Targets
-# make          - twidle the options yourself :-)
-# make cc       - standard cc options
-# make gcc      - standard gcc options
-# make x86-elf  - linux-elf etc
-# make x86-out  - linux-a.out, FreeBSD etc
-# make x86-solaris
-# make x86-bdsi
-
-DIR=    md5
-TOP=    .
-CC=     gcc
-CFLAG= -O3 -fomit-frame-pointer
-
-CPP=    $(CC) -E
-INCLUDES=
-INSTALLTOP=/usr/local/lib
-MAKE=           make
-MAKEDEPEND=     makedepend
-MAKEFILE=       Makefile.uni
-AR=             ar r
-
-MD5_ASM_OBJ=
-
-CFLAGS= $(INCLUDES) $(CFLAG)
-
-GENERAL=Makefile
-TEST=md5test
-APPS=md5
-
-LIB=libmd5.a
-LIBSRC=md5_dgst.c md5_one.c
-LIBOBJ=md5_dgst.o md5_one.o $(MD5_ASM_OBJ)
-
-SRC= $(LIBSRC)
-
-EXHEADER= md5.h
-HEADER= md5_locl.h $(EXHEADER)
-
-ALL=    $(GENERAL) $(SRC) $(HEADER)
-
-all:    $(LIB) $(TEST) $(APPS)
-
-$(LIB):    $(LIBOBJ)
-       $(AR) $(LIB) $(LIBOBJ)
-       $(RANLIB) $(LIB)
-
-# elf
-asm/mx86-elf.o: asm/mx86unix.cpp
-       $(CPP) -DELF asm/mx86unix.cpp | as -o asm/mx86-elf.o
-
-# solaris
-asm/mx86-sol.o: asm/mx86unix.cpp
-       $(CC) -E -DSOL asm/mx86unix.cpp | sed 's/^#.*//' > asm/mx86-sol.s
-       as -o asm/mx86-sol.o asm/mx86-sol.s
-       rm -f asm/mx86-sol.s
-
-# a.out
-asm/mx86-out.o: asm/mx86unix.cpp
-       $(CPP) -DOUT asm/mx86unix.cpp | as -o asm/mx86-out.o
-
-# bsdi
-asm/mx86bsdi.o: asm/mx86unix.cpp
-       $(CPP) -DBSDI asm/mx86unix.cpp | as -o asm/mx86bsdi.o
-
-asm/mx86unix.cpp:
-       (cd asm; perl md5-586.pl cpp >mx86unix.cpp)
-
-test:  $(TEST)
-       ./$(TEST)
-
-$(TEST): $(TEST).c $(LIB)
-       $(CC) -o $(TEST) $(CFLAGS) $(TEST).c $(LIB)
-
-$(APPS): $(APPS).c $(LIB)
-       $(CC) -o $(APPS) $(CFLAGS) $(APPS).c $(LIB)
-
-lint:
-       lint -DLINT $(INCLUDES) $(SRC)>fluff
-
-depend:
-       $(MAKEDEPEND) $(INCLUDES) $(PROGS) $(LIBSRC)
-
-dclean:
-       perl -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) >Makefile.new
-       mv -f Makefile.new $(MAKEFILE)
-
-clean:
-       /bin/rm -f $(LIB) $(TEST) $(APPS) *.o asm/*.o *.obj lib tags core .pure .nfs* *.old *.bak fluff
-
-cc:
-       $(MAKE) MD5_ASM_OBJ="" CC="cc" CFLAG="-O" all
-
-gcc:
-       $(MAKE) MD5_ASM_OBJ="" CC="gcc" CFLAGS="-O3 -fomit-frame-pointer" all
-
-x86-elf:
-       $(MAKE) MD5_ASM_OBJ="asm/mx86-elf.o" CFLAG="-DELF -DMD5_ASM -DL_ENDIAN $(CFLAGS)" all
-
-x86-out:
-       $(MAKE) MD5_ASM_OBJ="asm/mx86-out.o" CFLAG="-DOUT -DMD5_ASM -DL_ENDIAN $(CFLAGS)" all
-
-x86-solaris:
-       $(MAKE) MD5_ASM_OBJ="asm/mx86-sol.o" CFLAG="-DSOL -DMD5_ASM -DL_ENDIAN $(CFLAGS)" all
-
-x86-bdsi:
-       $(MAKE) MD5_ASM_OBJ="asm/mx86-bdsi.o" CFLAG="-DBDSI -DMD5_ASM -DL_ENDIAN $(CFLAGS)" all
-
-# DO NOT DELETE THIS LINE -- make depend depends on it.
index f07d517..e69de29 100644 (file)
-       ; Don't even think of reading this code
-       ; It was automatically generated by rmd-586.pl
-       ; Which is a perl program used to generate the x86 assember for
-       ; any of elf, a.out, BSDI,Win32, or Solaris
-       ; eric <eay@cryptsoft.com>
-       ; 
-       TITLE   rmd-586.asm
-        .386
-.model FLAT
-_TEXT  SEGMENT
-PUBLIC _ripemd160_block_asm_host_order
-
-_ripemd160_block_asm_host_order PROC NEAR
-       mov     edx,            DWORD PTR 4[esp]
-       mov     eax,            DWORD PTR 8[esp]
-       push    esi
-       mov     ecx,            DWORD PTR [edx]
-       push    edi
-       mov     esi,            DWORD PTR 4[edx]
-       push    ebp
-       mov     edi,            DWORD PTR 8[edx]
-       push    ebx
-       sub     esp,            108
-L000start:
-       ; 
-       mov     ebx,            DWORD PTR [eax]
-       mov     ebp,            DWORD PTR 4[eax]
-       mov     DWORD PTR [esp],ebx
-       mov     DWORD PTR 4[esp],ebp
-       mov     ebx,            DWORD PTR 8[eax]
-       mov     ebp,            DWORD PTR 12[eax]
-       mov     DWORD PTR 8[esp],ebx
-       mov     DWORD PTR 12[esp],ebp
-       mov     ebx,            DWORD PTR 16[eax]
-       mov     ebp,            DWORD PTR 20[eax]
-       mov     DWORD PTR 16[esp],ebx
-       mov     DWORD PTR 20[esp],ebp
-       mov     ebx,            DWORD PTR 24[eax]
-       mov     ebp,            DWORD PTR 28[eax]
-       mov     DWORD PTR 24[esp],ebx
-       mov     DWORD PTR 28[esp],ebp
-       mov     ebx,            DWORD PTR 32[eax]
-       mov     ebp,            DWORD PTR 36[eax]
-       mov     DWORD PTR 32[esp],ebx
-       mov     DWORD PTR 36[esp],ebp
-       mov     ebx,            DWORD PTR 40[eax]
-       mov     ebp,            DWORD PTR 44[eax]
-       mov     DWORD PTR 40[esp],ebx
-       mov     DWORD PTR 44[esp],ebp
-       mov     ebx,            DWORD PTR 48[eax]
-       mov     ebp,            DWORD PTR 52[eax]
-       mov     DWORD PTR 48[esp],ebx
-       mov     DWORD PTR 52[esp],ebp
-       mov     ebx,            DWORD PTR 56[eax]
-       mov     ebp,            DWORD PTR 60[eax]
-       mov     DWORD PTR 56[esp],ebx
-       mov     DWORD PTR 60[esp],ebp
-       mov     eax,            edi
-       mov     ebx,            DWORD PTR 12[edx]
-       mov     ebp,            DWORD PTR 16[edx]
-       ; 0
-       xor     eax,            ebx
-       mov     edx,            DWORD PTR [esp]
-       xor     eax,            esi
-       add     ecx,            edx
-       rol     edi,            10
-       add     ecx,            eax
-       mov     eax,            esi
-       rol     ecx,            11
-       add     ecx,            ebp
-       ; 1
-       xor     eax,            edi
-       mov     edx,            DWORD PTR 4[esp]
-       xor     eax,            ecx
-       add     ebp,            eax
-       mov     eax,            ecx
-       rol     esi,            10
-       add     ebp,            edx
-       xor     eax,            esi
-       rol     ebp,            14
-       add     ebp,            ebx
-       ; 2
-       mov     edx,            DWORD PTR 8[esp]
-       xor     eax,            ebp
-       add     ebx,            edx
-       rol     ecx,            10
-       add     ebx,            eax
-       mov     eax,            ebp
-       rol     ebx,            15
-       add     ebx,            edi
-       ; 3
-       xor     eax,            ecx
-       mov     edx,            DWORD PTR 12[esp]
-       xor     eax,            ebx
-       add     edi,            eax
-       mov     eax,            ebx
-       rol     ebp,            10
-       add     edi,            edx
-       xor     eax,            ebp
-       rol     edi,            12
-       add     edi,            esi
-       ; 4
-       mov     edx,            DWORD PTR 16[esp]
-       xor     eax,            edi
-       add     esi,            edx
-       rol     ebx,            10
-       add     esi,            eax
-       mov     eax,            edi
-       rol     esi,            5
-       add     esi,            ecx
-       ; 5
-       xor     eax,            ebx
-       mov     edx,            DWORD PTR 20[esp]
-       xor     eax,            esi
-       add     ecx,            eax
-       mov     eax,            esi
-       rol     edi,            10
-       add     ecx,            edx
-       xor     eax,            edi
-       rol     ecx,            8
-       add     ecx,            ebp
-       ; 6
-       mov     edx,            DWORD PTR 24[esp]
-       xor     eax,            ecx
-       add     ebp,            edx
-       rol     esi,            10
-       add     ebp,            eax
-       mov     eax,            ecx
-       rol     ebp,            7
-       add     ebp,            ebx
-       ; 7
-       xor     eax,            esi
-       mov     edx,            DWORD PTR 28[esp]
-       xor     eax,            ebp
-       add     ebx,            eax
-       mov     eax,            ebp
-       rol     ecx,            10
-       add     ebx,            edx
-       xor     eax,            ecx
-       rol     ebx,            9
-       add     ebx,            edi
-       ; 8
-       mov     edx,            DWORD PTR 32[esp]
-       xor     eax,            ebx
-       add     edi,            edx
-       rol     ebp,            10
-       add     edi,            eax
-       mov     eax,            ebx
-       rol     edi,            11
-       add     edi,            esi
-       ; 9
-       xor     eax,            ebp
-       mov     edx,            DWORD PTR 36[esp]
-       xor     eax,            edi
-       add     esi,            eax
-       mov     eax,            edi
-       rol     ebx,            10
-       add     esi,            edx
-       xor     eax,            ebx
-       rol     esi,            13
-       add     esi,            ecx
-       ; 10
-       mov     edx,            DWORD PTR 40[esp]
-       xor     eax,            esi
-       add     ecx,            edx
-       rol     edi,            10
-       add     ecx,            eax
-       mov     eax,            esi
-       rol     ecx,            14
-       add     ecx,            ebp
-       ; 11
-       xor     eax,            edi
-       mov     edx,            DWORD PTR 44[esp]
-       xor     eax,            ecx
-       add     ebp,            eax
-       mov     eax,            ecx
-       rol     esi,            10
-       add     ebp,            edx
-       xor     eax,            esi
-       rol     ebp,            15
-       add     ebp,            ebx
-       ; 12
-       mov     edx,            DWORD PTR 48[esp]
-       xor     eax,            ebp
-       add     ebx,            edx
-       rol     ecx,            10
-       add     ebx,            eax
-       mov     eax,            ebp
-       rol     ebx,            6
-       add     ebx,            edi
-       ; 13
-       xor     eax,            ecx
-       mov     edx,            DWORD PTR 52[esp]
-       xor     eax,            ebx
-       add     edi,            eax
-       mov     eax,            ebx
-       rol     ebp,            10
-       add     edi,            edx
-       xor     eax,            ebp
-       rol     edi,            7
-       add     edi,            esi
-       ; 14
-       mov     edx,            DWORD PTR 56[esp]
-       xor     eax,            edi
-       add     esi,            edx
-       rol     ebx,            10
-       add     esi,            eax
-       mov     eax,            edi
-       rol     esi,            9
-       add     esi,            ecx
-       ; 15
-       xor     eax,            ebx
-       mov     edx,            DWORD PTR 60[esp]
-       xor     eax,            esi
-       add     ecx,            eax
-       mov     eax,            -1
-       rol     edi,            10
-       add     ecx,            edx
-       mov     edx,            DWORD PTR 28[esp]
-       rol     ecx,            8
-       add     ecx,            ebp
-       ; 16
-       add     ebp,            edx
-       mov     edx,            esi
-       sub     eax,            ecx
-       and     edx,            ecx
-       and     eax,            edi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 16[esp]
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1518500249[edx*1+ebp]
-       mov     edx,            -1
-       rol     ebp,            7
-       add     ebp,            ebx
-       ; 17
-       add     ebx,            eax
-       mov     eax,            ecx
-       sub     edx,            ebp
-       and     eax,            ebp
-       and     edx,            esi
-       or      eax,            edx
-       mov     edx,            DWORD PTR 52[esp]
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1518500249[eax*1+ebx]
-       mov     eax,            -1
-       rol     ebx,            6
-       add     ebx,            edi
-       ; 18
-       add     edi,            edx
-       mov     edx,            ebp
-       sub     eax,            ebx
-       and     edx,            ebx
-       and     eax,            ecx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 4[esp]
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 1518500249[edx*1+edi]
-       mov     edx,            -1
-       rol     edi,            8
-       add     edi,            esi
-       ; 19
-       add     esi,            eax
-       mov     eax,            ebx
-       sub     edx,            edi
-       and     eax,            edi
-       and     edx,            ebp
-       or      eax,            edx
-       mov     edx,            DWORD PTR 40[esp]
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 1518500249[eax*1+esi]
-       mov     eax,            -1
-       rol     esi,            13
-       add     esi,            ecx
-       ; 20
-       add     ecx,            edx
-       mov     edx,            edi
-       sub     eax,            esi
-       and     edx,            esi
-       and     eax,            ebx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 24[esp]
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 1518500249[edx*1+ecx]
-       mov     edx,            -1
-       rol     ecx,            11
-       add     ecx,            ebp
-       ; 21
-       add     ebp,            eax
-       mov     eax,            esi
-       sub     edx,            ecx
-       and     eax,            ecx
-       and     edx,            edi
-       or      eax,            edx
-       mov     edx,            DWORD PTR 60[esp]
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1518500249[eax*1+ebp]
-       mov     eax,            -1
-       rol     ebp,            9
-       add     ebp,            ebx
-       ; 22
-       add     ebx,            edx
-       mov     edx,            ecx
-       sub     eax,            ebp
-       and     edx,            ebp
-       and     eax,            esi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 12[esp]
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1518500249[edx*1+ebx]
-       mov     edx,            -1
-       rol     ebx,            7
-       add     ebx,            edi
-       ; 23
-       add     edi,            eax
-       mov     eax,            ebp
-       sub     edx,            ebx
-       and     eax,            ebx
-       and     edx,            ecx
-       or      eax,            edx
-       mov     edx,            DWORD PTR 48[esp]
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 1518500249[eax*1+edi]
-       mov     eax,            -1
-       rol     edi,            15
-       add     edi,            esi
-       ; 24
-       add     esi,            edx
-       mov     edx,            ebx
-       sub     eax,            edi
-       and     edx,            edi
-       and     eax,            ebp
-       or      edx,            eax
-       mov     eax,            DWORD PTR [esp]
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 1518500249[edx*1+esi]
-       mov     edx,            -1
-       rol     esi,            7
-       add     esi,            ecx
-       ; 25
-       add     ecx,            eax
-       mov     eax,            edi
-       sub     edx,            esi
-       and     eax,            esi
-       and     edx,            ebx
-       or      eax,            edx
-       mov     edx,            DWORD PTR 36[esp]
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 1518500249[eax*1+ecx]
-       mov     eax,            -1
-       rol     ecx,            12
-       add     ecx,            ebp
-       ; 26
-       add     ebp,            edx
-       mov     edx,            esi
-       sub     eax,            ecx
-       and     edx,            ecx
-       and     eax,            edi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1518500249[edx*1+ebp]
-       mov     edx,            -1
-       rol     ebp,            15
-       add     ebp,            ebx
-       ; 27
-       add     ebx,            eax
-       mov     eax,            ecx
-       sub     edx,            ebp
-       and     eax,            ebp
-       and     edx,            esi
-       or      eax,            edx
-       mov     edx,            DWORD PTR 8[esp]
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1518500249[eax*1+ebx]
-       mov     eax,            -1
-       rol     ebx,            9
-       add     ebx,            edi
-       ; 28
-       add     edi,            edx
-       mov     edx,            ebp
-       sub     eax,            ebx
-       and     edx,            ebx
-       and     eax,            ecx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 56[esp]
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 1518500249[edx*1+edi]
-       mov     edx,            -1
-       rol     edi,            11
-       add     edi,            esi
-       ; 29
-       add     esi,            eax
-       mov     eax,            ebx
-       sub     edx,            edi
-       and     eax,            edi
-       and     edx,            ebp
-       or      eax,            edx
-       mov     edx,            DWORD PTR 44[esp]
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 1518500249[eax*1+esi]
-       mov     eax,            -1
-       rol     esi,            7
-       add     esi,            ecx
-       ; 30
-       add     ecx,            edx
-       mov     edx,            edi
-       sub     eax,            esi
-       and     edx,            esi
-       and     eax,            ebx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 32[esp]
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 1518500249[edx*1+ecx]
-       mov     edx,            -1
-       rol     ecx,            13
-       add     ecx,            ebp
-       ; 31
-       add     ebp,            eax
-       mov     eax,            esi
-       sub     edx,            ecx
-       and     eax,            ecx
-       and     edx,            edi
-       or      eax,            edx
-       mov     edx,            -1
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1518500249[eax*1+ebp]
-       sub     edx,            ecx
-       rol     ebp,            12
-       add     ebp,            ebx
-       ; 32
-       mov     eax,            DWORD PTR 12[esp]
-       or      edx,            ebp
-       add     ebx,            eax
-       xor     edx,            esi
-       mov     eax,            -1
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1859775393[edx*1+ebx]
-       sub     eax,            ebp
-       rol     ebx,            11
-       add     ebx,            edi
-       ; 33
-       mov     edx,            DWORD PTR 40[esp]
-       or      eax,            ebx
-       add     edi,            edx
-       xor     eax,            ecx
-       mov     edx,            -1
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 1859775393[eax*1+edi]
-       sub     edx,            ebx
-       rol     edi,            13
-       add     edi,            esi
-       ; 34
-       mov     eax,            DWORD PTR 56[esp]
-       or      edx,            edi
-       add     esi,            eax
-       xor     edx,            ebp
-       mov     eax,            -1
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 1859775393[edx*1+esi]
-       sub     eax,            edi
-       rol     esi,            6
-       add     esi,            ecx
-       ; 35
-       mov     edx,            DWORD PTR 16[esp]
-       or      eax,            esi
-       add     ecx,            edx
-       xor     eax,            ebx
-       mov     edx,            -1
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 1859775393[eax*1+ecx]
-       sub     edx,            esi
-       rol     ecx,            7
-       add     ecx,            ebp
-       ; 36
-       mov     eax,            DWORD PTR 36[esp]
-       or      edx,            ecx
-       add     ebp,            eax
-       xor     edx,            edi
-       mov     eax,            -1
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1859775393[edx*1+ebp]
-       sub     eax,            ecx
-       rol     ebp,            14
-       add     ebp,            ebx
-       ; 37
-       mov     edx,            DWORD PTR 60[esp]
-       or      eax,            ebp
-       add     ebx,            edx
-       xor     eax,            esi
-       mov     edx,            -1
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1859775393[eax*1+ebx]
-       sub     edx,            ebp
-       rol     ebx,            9
-       add     ebx,            edi
-       ; 38
-       mov     eax,            DWORD PTR 32[esp]
-       or      edx,            ebx
-       add     edi,            eax
-       xor     edx,            ecx
-       mov     eax,            -1
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 1859775393[edx*1+edi]
-       sub     eax,            ebx
-       rol     edi,            13
-       add     edi,            esi
-       ; 39
-       mov     edx,            DWORD PTR 4[esp]
-       or      eax,            edi
-       add     esi,            edx
-       xor     eax,            ebp
-       mov     edx,            -1
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 1859775393[eax*1+esi]
-       sub     edx,            edi
-       rol     esi,            15
-       add     esi,            ecx
-       ; 40
-       mov     eax,            DWORD PTR 8[esp]
-       or      edx,            esi
-       add     ecx,            eax
-       xor     edx,            ebx
-       mov     eax,            -1
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 1859775393[edx*1+ecx]
-       sub     eax,            esi
-       rol     ecx,            14
-       add     ecx,            ebp
-       ; 41
-       mov     edx,            DWORD PTR 28[esp]
-       or      eax,            ecx
-       add     ebp,            edx
-       xor     eax,            edi
-       mov     edx,            -1
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1859775393[eax*1+ebp]
-       sub     edx,            ecx
-       rol     ebp,            8
-       add     ebp,            ebx
-       ; 42
-       mov     eax,            DWORD PTR [esp]
-       or      edx,            ebp
-       add     ebx,            eax
-       xor     edx,            esi
-       mov     eax,            -1
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1859775393[edx*1+ebx]
-       sub     eax,            ebp
-       rol     ebx,            13
-       add     ebx,            edi
-       ; 43
-       mov     edx,            DWORD PTR 24[esp]
-       or      eax,            ebx
-       add     edi,            edx
-       xor     eax,            ecx
-       mov     edx,            -1
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 1859775393[eax*1+edi]
-       sub     edx,            ebx
-       rol     edi,            6
-       add     edi,            esi
-       ; 44
-       mov     eax,            DWORD PTR 52[esp]
-       or      edx,            edi
-       add     esi,            eax
-       xor     edx,            ebp
-       mov     eax,            -1
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 1859775393[edx*1+esi]
-       sub     eax,            edi
-       rol     esi,            5
-       add     esi,            ecx
-       ; 45
-       mov     edx,            DWORD PTR 44[esp]
-       or      eax,            esi
-       add     ecx,            edx
-       xor     eax,            ebx
-       mov     edx,            -1
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 1859775393[eax*1+ecx]
-       sub     edx,            esi
-       rol     ecx,            12
-       add     ecx,            ebp
-       ; 46
-       mov     eax,            DWORD PTR 20[esp]
-       or      edx,            ecx
-       add     ebp,            eax
-       xor     edx,            edi
-       mov     eax,            -1
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1859775393[edx*1+ebp]
-       sub     eax,            ecx
-       rol     ebp,            7
-       add     ebp,            ebx
-       ; 47
-       mov     edx,            DWORD PTR 48[esp]
-       or      eax,            ebp
-       add     ebx,            edx
-       xor     eax,            esi
-       mov     edx,            -1
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1859775393[eax*1+ebx]
-       mov     eax,            ecx
-       rol     ebx,            5
-       add     ebx,            edi
-       ; 48
-       sub     edx,            ecx
-       and     eax,            ebx
-       and     edx,            ebp
-       or      edx,            eax
-       mov     eax,            DWORD PTR 4[esp]
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 2400959708[edx+edi]
-       mov     edx,            -1
-       add     edi,            eax
-       mov     eax,            ebp
-       rol     edi,            11
-       add     edi,            esi
-       ; 49
-       sub     edx,            ebp
-       and     eax,            edi
-       and     edx,            ebx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 36[esp]
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 2400959708[edx+esi]
-       mov     edx,            -1
-       add     esi,            eax
-       mov     eax,            ebx
-       rol     esi,            12
-       add     esi,            ecx
-       ; 50
-       sub     edx,            ebx
-       and     eax,            esi
-       and     edx,            edi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 44[esp]
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 2400959708[edx+ecx]
-       mov     edx,            -1
-       add     ecx,            eax
-       mov     eax,            edi
-       rol     ecx,            14
-       add     ecx,            ebp
-       ; 51
-       sub     edx,            edi
-       and     eax,            ecx
-       and     edx,            esi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 40[esp]
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 2400959708[edx+ebp]
-       mov     edx,            -1
-       add     ebp,            eax
-       mov     eax,            esi
-       rol     ebp,            15
-       add     ebp,            ebx
-       ; 52
-       sub     edx,            esi
-       and     eax,            ebp
-       and     edx,            ecx
-       or      edx,            eax
-       mov     eax,            DWORD PTR [esp]
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 2400959708[edx+ebx]
-       mov     edx,            -1
-       add     ebx,            eax
-       mov     eax,            ecx
-       rol     ebx,            14
-       add     ebx,            edi
-       ; 53
-       sub     edx,            ecx
-       and     eax,            ebx
-       and     edx,            ebp
-       or      edx,            eax
-       mov     eax,            DWORD PTR 32[esp]
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 2400959708[edx+edi]
-       mov     edx,            -1
-       add     edi,            eax
-       mov     eax,            ebp
-       rol     edi,            15
-       add     edi,            esi
-       ; 54
-       sub     edx,            ebp
-       and     eax,            edi
-       and     edx,            ebx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 48[esp]
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 2400959708[edx+esi]
-       mov     edx,            -1
-       add     esi,            eax
-       mov     eax,            ebx
-       rol     esi,            9
-       add     esi,            ecx
-       ; 55
-       sub     edx,            ebx
-       and     eax,            esi
-       and     edx,            edi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 16[esp]
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 2400959708[edx+ecx]
-       mov     edx,            -1
-       add     ecx,            eax
-       mov     eax,            edi
-       rol     ecx,            8
-       add     ecx,            ebp
-       ; 56
-       sub     edx,            edi
-       and     eax,            ecx
-       and     edx,            esi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 52[esp]
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 2400959708[edx+ebp]
-       mov     edx,            -1
-       add     ebp,            eax
-       mov     eax,            esi
-       rol     ebp,            9
-       add     ebp,            ebx
-       ; 57
-       sub     edx,            esi
-       and     eax,            ebp
-       and     edx,            ecx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 12[esp]
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 2400959708[edx+ebx]
-       mov     edx,            -1
-       add     ebx,            eax
-       mov     eax,            ecx
-       rol     ebx,            14
-       add     ebx,            edi
-       ; 58
-       sub     edx,            ecx
-       and     eax,            ebx
-       and     edx,            ebp
-       or      edx,            eax
-       mov     eax,            DWORD PTR 28[esp]
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 2400959708[edx+edi]
-       mov     edx,            -1
-       add     edi,            eax
-       mov     eax,            ebp
-       rol     edi,            5
-       add     edi,            esi
-       ; 59
-       sub     edx,            ebp
-       and     eax,            edi
-       and     edx,            ebx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 60[esp]
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 2400959708[edx+esi]
-       mov     edx,            -1
-       add     esi,            eax
-       mov     eax,            ebx
-       rol     esi,            6
-       add     esi,            ecx
-       ; 60
-       sub     edx,            ebx
-       and     eax,            esi
-       and     edx,            edi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 56[esp]
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 2400959708[edx+ecx]
-       mov     edx,            -1
-       add     ecx,            eax
-       mov     eax,            edi
-       rol     ecx,            8
-       add     ecx,            ebp
-       ; 61
-       sub     edx,            edi
-       and     eax,            ecx
-       and     edx,            esi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 2400959708[edx+ebp]
-       mov     edx,            -1
-       add     ebp,            eax
-       mov     eax,            esi
-       rol     ebp,            6
-       add     ebp,            ebx
-       ; 62
-       sub     edx,            esi
-       and     eax,            ebp
-       and     edx,            ecx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 24[esp]
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 2400959708[edx+ebx]
-       mov     edx,            -1
-       add     ebx,            eax
-       mov     eax,            ecx
-       rol     ebx,            5
-       add     ebx,            edi
-       ; 63
-       sub     edx,            ecx
-       and     eax,            ebx
-       and     edx,            ebp
-       or      edx,            eax
-       mov     eax,            DWORD PTR 8[esp]
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 2400959708[edx+edi]
-       mov     edx,            -1
-       add     edi,            eax
-       sub     edx,            ebp
-       rol     edi,            12
-       add     edi,            esi
-       ; 64
-       mov     eax,            DWORD PTR 16[esp]
-       or      edx,            ebx
-       add     esi,            eax
-       xor     edx,            edi
-       mov     eax,            -1
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 2840853838[edx*1+esi]
-       sub     eax,            ebx
-       rol     esi,            9
-       add     esi,            ecx
-       ; 65
-       mov     edx,            DWORD PTR [esp]
-       or      eax,            edi
-       add     ecx,            edx
-       xor     eax,            esi
-       mov     edx,            -1
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 2840853838[eax*1+ecx]
-       sub     edx,            edi
-       rol     ecx,            15
-       add     ecx,            ebp
-       ; 66
-       mov     eax,            DWORD PTR 20[esp]
-       or      edx,            esi
-       add     ebp,            eax
-       xor     edx,            ecx
-       mov     eax,            -1
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 2840853838[edx*1+ebp]
-       sub     eax,            esi
-       rol     ebp,            5
-       add     ebp,            ebx
-       ; 67
-       mov     edx,            DWORD PTR 36[esp]
-       or      eax,            ecx
-       add     ebx,            edx
-       xor     eax,            ebp
-       mov     edx,            -1
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 2840853838[eax*1+ebx]
-       sub     edx,            ecx
-       rol     ebx,            11
-       add     ebx,            edi
-       ; 68
-       mov     eax,            DWORD PTR 28[esp]
-       or      edx,            ebp
-       add     edi,            eax
-       xor     edx,            ebx
-       mov     eax,            -1
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 2840853838[edx*1+edi]
-       sub     eax,            ebp
-       rol     edi,            6
-       add     edi,            esi
-       ; 69
-       mov     edx,            DWORD PTR 48[esp]
-       or      eax,            ebx
-       add     esi,            edx
-       xor     eax,            edi
-       mov     edx,            -1
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 2840853838[eax*1+esi]
-       sub     edx,            ebx
-       rol     esi,            8
-       add     esi,            ecx
-       ; 70
-       mov     eax,            DWORD PTR 8[esp]
-       or      edx,            edi
-       add     ecx,            eax
-       xor     edx,            esi
-       mov     eax,            -1
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 2840853838[edx*1+ecx]
-       sub     eax,            edi
-       rol     ecx,            13
-       add     ecx,            ebp
-       ; 71
-       mov     edx,            DWORD PTR 40[esp]
-       or      eax,            esi
-       add     ebp,            edx
-       xor     eax,            ecx
-       mov     edx,            -1
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 2840853838[eax*1+ebp]
-       sub     edx,            esi
-       rol     ebp,            12
-       add     ebp,            ebx
-       ; 72
-       mov     eax,            DWORD PTR 56[esp]
-       or      edx,            ecx
-       add     ebx,            eax
-       xor     edx,            ebp
-       mov     eax,            -1
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 2840853838[edx*1+ebx]
-       sub     eax,            ecx
-       rol     ebx,            5
-       add     ebx,            edi
-       ; 73
-       mov     edx,            DWORD PTR 4[esp]
-       or      eax,            ebp
-       add     edi,            edx
-       xor     eax,            ebx
-       mov     edx,            -1
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 2840853838[eax*1+edi]
-       sub     edx,            ebp
-       rol     edi,            12
-       add     edi,            esi
-       ; 74
-       mov     eax,            DWORD PTR 12[esp]
-       or      edx,            ebx
-       add     esi,            eax
-       xor     edx,            edi
-       mov     eax,            -1
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 2840853838[edx*1+esi]
-       sub     eax,            ebx
-       rol     esi,            13
-       add     esi,            ecx
-       ; 75
-       mov     edx,            DWORD PTR 32[esp]
-       or      eax,            edi
-       add     ecx,            edx
-       xor     eax,            esi
-       mov     edx,            -1
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 2840853838[eax*1+ecx]
-       sub     edx,            edi
-       rol     ecx,            14
-       add     ecx,            ebp
-       ; 76
-       mov     eax,            DWORD PTR 44[esp]
-       or      edx,            esi
-       add     ebp,            eax
-       xor     edx,            ecx
-       mov     eax,            -1
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 2840853838[edx*1+ebp]
-       sub     eax,            esi
-       rol     ebp,            11
-       add     ebp,            ebx
-       ; 77
-       mov     edx,            DWORD PTR 24[esp]
-       or      eax,            ecx
-       add     ebx,            edx
-       xor     eax,            ebp
-       mov     edx,            -1
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 2840853838[eax*1+ebx]
-       sub     edx,            ecx
-       rol     ebx,            8
-       add     ebx,            edi
-       ; 78
-       mov     eax,            DWORD PTR 60[esp]
-       or      edx,            ebp
-       add     edi,            eax
-       xor     edx,            ebx
-       mov     eax,            -1
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 2840853838[edx*1+edi]
-       sub     eax,            ebp
-       rol     edi,            5
-       add     edi,            esi
-       ; 79
-       mov     edx,            DWORD PTR 52[esp]
-       or      eax,            ebx
-       add     esi,            edx
-       xor     eax,            edi
-       mov     edx,            DWORD PTR 128[esp]
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 2840853838[eax*1+esi]
-       mov     DWORD PTR 64[esp],ecx
-       rol     esi,            6
-       add     esi,            ecx
-       mov     ecx,            DWORD PTR [edx]
-       mov     DWORD PTR 68[esp],esi
-       mov     DWORD PTR 72[esp],edi
-       mov     esi,            DWORD PTR 4[edx]
-       mov     DWORD PTR 76[esp],ebx
-       mov     edi,            DWORD PTR 8[edx]
-       mov     DWORD PTR 80[esp],ebp
-       mov     ebx,            DWORD PTR 12[edx]
-       mov     ebp,            DWORD PTR 16[edx]
-       ; 80
-       mov     edx,            -1
-       sub     edx,            ebx
-       mov     eax,            DWORD PTR 20[esp]
-       or      edx,            edi
-       add     ecx,            eax
-       xor     edx,            esi
-       mov     eax,            -1
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 1352829926[edx*1+ecx]
-       sub     eax,            edi
-       rol     ecx,            8
-       add     ecx,            ebp
-       ; 81
-       mov     edx,            DWORD PTR 56[esp]
-       or      eax,            esi
-       add     ebp,            edx
-       xor     eax,            ecx
-       mov     edx,            -1
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1352829926[eax*1+ebp]
-       sub     edx,            esi
-       rol     ebp,            9
-       add     ebp,            ebx
-       ; 82
-       mov     eax,            DWORD PTR 28[esp]
-       or      edx,            ecx
-       add     ebx,            eax
-       xor     edx,            ebp
-       mov     eax,            -1
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1352829926[edx*1+ebx]
-       sub     eax,            ecx
-       rol     ebx,            9
-       add     ebx,            edi
-       ; 83
-       mov     edx,            DWORD PTR [esp]
-       or      eax,            ebp
-       add     edi,            edx
-       xor     eax,            ebx
-       mov     edx,            -1
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 1352829926[eax*1+edi]
-       sub     edx,            ebp
-       rol     edi,            11
-       add     edi,            esi
-       ; 84
-       mov     eax,            DWORD PTR 36[esp]
-       or      edx,            ebx
-       add     esi,            eax
-       xor     edx,            edi
-       mov     eax,            -1
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 1352829926[edx*1+esi]
-       sub     eax,            ebx
-       rol     esi,            13
-       add     esi,            ecx
-       ; 85
-       mov     edx,            DWORD PTR 8[esp]
-       or      eax,            edi
-       add     ecx,            edx
-       xor     eax,            esi
-       mov     edx,            -1
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 1352829926[eax*1+ecx]
-       sub     edx,            edi
-       rol     ecx,            15
-       add     ecx,            ebp
-       ; 86
-       mov     eax,            DWORD PTR 44[esp]
-       or      edx,            esi
-       add     ebp,            eax
-       xor     edx,            ecx
-       mov     eax,            -1
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1352829926[edx*1+ebp]
-       sub     eax,            esi
-       rol     ebp,            15
-       add     ebp,            ebx
-       ; 87
-       mov     edx,            DWORD PTR 16[esp]
-       or      eax,            ecx
-       add     ebx,            edx
-       xor     eax,            ebp
-       mov     edx,            -1
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1352829926[eax*1+ebx]
-       sub     edx,            ecx
-       rol     ebx,            5
-       add     ebx,            edi
-       ; 88
-       mov     eax,            DWORD PTR 52[esp]
-       or      edx,            ebp
-       add     edi,            eax
-       xor     edx,            ebx
-       mov     eax,            -1
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 1352829926[edx*1+edi]
-       sub     eax,            ebp
-       rol     edi,            7
-       add     edi,            esi
-       ; 89
-       mov     edx,            DWORD PTR 24[esp]
-       or      eax,            ebx
-       add     esi,            edx
-       xor     eax,            edi
-       mov     edx,            -1
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 1352829926[eax*1+esi]
-       sub     edx,            ebx
-       rol     esi,            7
-       add     esi,            ecx
-       ; 90
-       mov     eax,            DWORD PTR 60[esp]
-       or      edx,            edi
-       add     ecx,            eax
-       xor     edx,            esi
-       mov     eax,            -1
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 1352829926[edx*1+ecx]
-       sub     eax,            edi
-       rol     ecx,            8
-       add     ecx,            ebp
-       ; 91
-       mov     edx,            DWORD PTR 32[esp]
-       or      eax,            esi
-       add     ebp,            edx
-       xor     eax,            ecx
-       mov     edx,            -1
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1352829926[eax*1+ebp]
-       sub     edx,            esi
-       rol     ebp,            11
-       add     ebp,            ebx
-       ; 92
-       mov     eax,            DWORD PTR 4[esp]
-       or      edx,            ecx
-       add     ebx,            eax
-       xor     edx,            ebp
-       mov     eax,            -1
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1352829926[edx*1+ebx]
-       sub     eax,            ecx
-       rol     ebx,            14
-       add     ebx,            edi
-       ; 93
-       mov     edx,            DWORD PTR 40[esp]
-       or      eax,            ebp
-       add     edi,            edx
-       xor     eax,            ebx
-       mov     edx,            -1
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 1352829926[eax*1+edi]
-       sub     edx,            ebp
-       rol     edi,            14
-       add     edi,            esi
-       ; 94
-       mov     eax,            DWORD PTR 12[esp]
-       or      edx,            ebx
-       add     esi,            eax
-       xor     edx,            edi
-       mov     eax,            -1
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 1352829926[edx*1+esi]
-       sub     eax,            ebx
-       rol     esi,            12
-       add     esi,            ecx
-       ; 95
-       mov     edx,            DWORD PTR 48[esp]
-       or      eax,            edi
-       add     ecx,            edx
-       xor     eax,            esi
-       mov     edx,            -1
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 1352829926[eax*1+ecx]
-       mov     eax,            edi
-       rol     ecx,            6
-       add     ecx,            ebp
-       ; 96
-       sub     edx,            edi
-       and     eax,            ecx
-       and     edx,            esi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 24[esp]
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1548603684[edx+ebp]
-       mov     edx,            -1
-       add     ebp,            eax
-       mov     eax,            esi
-       rol     ebp,            9
-       add     ebp,            ebx
-       ; 97
-       sub     edx,            esi
-       and     eax,            ebp
-       and     edx,            ecx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 44[esp]
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1548603684[edx+ebx]
-       mov     edx,            -1
-       add     ebx,            eax
-       mov     eax,            ecx
-       rol     ebx,            13
-       add     ebx,            edi
-       ; 98
-       sub     edx,            ecx
-       and     eax,            ebx
-       and     edx,            ebp
-       or      edx,            eax
-       mov     eax,            DWORD PTR 12[esp]
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 1548603684[edx+edi]
-       mov     edx,            -1
-       add     edi,            eax
-       mov     eax,            ebp
-       rol     edi,            15
-       add     edi,            esi
-       ; 99
-       sub     edx,            ebp
-       and     eax,            edi
-       and     edx,            ebx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 28[esp]
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 1548603684[edx+esi]
-       mov     edx,            -1
-       add     esi,            eax
-       mov     eax,            ebx
-       rol     esi,            7
-       add     esi,            ecx
-       ; 100
-       sub     edx,            ebx
-       and     eax,            esi
-       and     edx,            edi
-       or      edx,            eax
-       mov     eax,            DWORD PTR [esp]
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 1548603684[edx+ecx]
-       mov     edx,            -1
-       add     ecx,            eax
-       mov     eax,            edi
-       rol     ecx,            12
-       add     ecx,            ebp
-       ; 101
-       sub     edx,            edi
-       and     eax,            ecx
-       and     edx,            esi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 52[esp]
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1548603684[edx+ebp]
-       mov     edx,            -1
-       add     ebp,            eax
-       mov     eax,            esi
-       rol     ebp,            8
-       add     ebp,            ebx
-       ; 102
-       sub     edx,            esi
-       and     eax,            ebp
-       and     edx,            ecx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1548603684[edx+ebx]
-       mov     edx,            -1
-       add     ebx,            eax
-       mov     eax,            ecx
-       rol     ebx,            9
-       add     ebx,            edi
-       ; 103
-       sub     edx,            ecx
-       and     eax,            ebx
-       and     edx,            ebp
-       or      edx,            eax
-       mov     eax,            DWORD PTR 40[esp]
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 1548603684[edx+edi]
-       mov     edx,            -1
-       add     edi,            eax
-       mov     eax,            ebp
-       rol     edi,            11
-       add     edi,            esi
-       ; 104
-       sub     edx,            ebp
-       and     eax,            edi
-       and     edx,            ebx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 56[esp]
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 1548603684[edx+esi]
-       mov     edx,            -1
-       add     esi,            eax
-       mov     eax,            ebx
-       rol     esi,            7
-       add     esi,            ecx
-       ; 105
-       sub     edx,            ebx
-       and     eax,            esi
-       and     edx,            edi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 60[esp]
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 1548603684[edx+ecx]
-       mov     edx,            -1
-       add     ecx,            eax
-       mov     eax,            edi
-       rol     ecx,            7
-       add     ecx,            ebp
-       ; 106
-       sub     edx,            edi
-       and     eax,            ecx
-       and     edx,            esi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 32[esp]
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1548603684[edx+ebp]
-       mov     edx,            -1
-       add     ebp,            eax
-       mov     eax,            esi
-       rol     ebp,            12
-       add     ebp,            ebx
-       ; 107
-       sub     edx,            esi
-       and     eax,            ebp
-       and     edx,            ecx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 48[esp]
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1548603684[edx+ebx]
-       mov     edx,            -1
-       add     ebx,            eax
-       mov     eax,            ecx
-       rol     ebx,            7
-       add     ebx,            edi
-       ; 108
-       sub     edx,            ecx
-       and     eax,            ebx
-       and     edx,            ebp
-       or      edx,            eax
-       mov     eax,            DWORD PTR 16[esp]
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 1548603684[edx+edi]
-       mov     edx,            -1
-       add     edi,            eax
-       mov     eax,            ebp
-       rol     edi,            6
-       add     edi,            esi
-       ; 109
-       sub     edx,            ebp
-       and     eax,            edi
-       and     edx,            ebx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 36[esp]
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 1548603684[edx+esi]
-       mov     edx,            -1
-       add     esi,            eax
-       mov     eax,            ebx
-       rol     esi,            15
-       add     esi,            ecx
-       ; 110
-       sub     edx,            ebx
-       and     eax,            esi
-       and     edx,            edi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 4[esp]
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 1548603684[edx+ecx]
-       mov     edx,            -1
-       add     ecx,            eax
-       mov     eax,            edi
-       rol     ecx,            13
-       add     ecx,            ebp
-       ; 111
-       sub     edx,            edi
-       and     eax,            ecx
-       and     edx,            esi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 8[esp]
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1548603684[edx+ebp]
-       mov     edx,            -1
-       add     ebp,            eax
-       sub     edx,            ecx
-       rol     ebp,            11
-       add     ebp,            ebx
-       ; 112
-       mov     eax,            DWORD PTR 60[esp]
-       or      edx,            ebp
-       add     ebx,            eax
-       xor     edx,            esi
-       mov     eax,            -1
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1836072691[edx*1+ebx]
-       sub     eax,            ebp
-       rol     ebx,            9
-       add     ebx,            edi
-       ; 113
-       mov     edx,            DWORD PTR 20[esp]
-       or      eax,            ebx
-       add     edi,            edx
-       xor     eax,            ecx
-       mov     edx,            -1
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 1836072691[eax*1+edi]
-       sub     edx,            ebx
-       rol     edi,            7
-       add     edi,            esi
-       ; 114
-       mov     eax,            DWORD PTR 4[esp]
-       or      edx,            edi
-       add     esi,            eax
-       xor     edx,            ebp
-       mov     eax,            -1
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 1836072691[edx*1+esi]
-       sub     eax,            edi
-       rol     esi,            15
-       add     esi,            ecx
-       ; 115
-       mov     edx,            DWORD PTR 12[esp]
-       or      eax,            esi
-       add     ecx,            edx
-       xor     eax,            ebx
-       mov     edx,            -1
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 1836072691[eax*1+ecx]
-       sub     edx,            esi
-       rol     ecx,            11
-       add     ecx,            ebp
-       ; 116
-       mov     eax,            DWORD PTR 28[esp]
-       or      edx,            ecx
-       add     ebp,            eax
-       xor     edx,            edi
-       mov     eax,            -1
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1836072691[edx*1+ebp]
-       sub     eax,            ecx
-       rol     ebp,            8
-       add     ebp,            ebx
-       ; 117
-       mov     edx,            DWORD PTR 56[esp]
-       or      eax,            ebp
-       add     ebx,            edx
-       xor     eax,            esi
-       mov     edx,            -1
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1836072691[eax*1+ebx]
-       sub     edx,            ebp
-       rol     ebx,            6
-       add     ebx,            edi
-       ; 118
-       mov     eax,            DWORD PTR 24[esp]
-       or      edx,            ebx
-       add     edi,            eax
-       xor     edx,            ecx
-       mov     eax,            -1
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 1836072691[edx*1+edi]
-       sub     eax,            ebx
-       rol     edi,            6
-       add     edi,            esi
-       ; 119
-       mov     edx,            DWORD PTR 36[esp]
-       or      eax,            edi
-       add     esi,            edx
-       xor     eax,            ebp
-       mov     edx,            -1
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 1836072691[eax*1+esi]
-       sub     edx,            edi
-       rol     esi,            14
-       add     esi,            ecx
-       ; 120
-       mov     eax,            DWORD PTR 44[esp]
-       or      edx,            esi
-       add     ecx,            eax
-       xor     edx,            ebx
-       mov     eax,            -1
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 1836072691[edx*1+ecx]
-       sub     eax,            esi
-       rol     ecx,            12
-       add     ecx,            ebp
-       ; 121
-       mov     edx,            DWORD PTR 32[esp]
-       or      eax,            ecx
-       add     ebp,            edx
-       xor     eax,            edi
-       mov     edx,            -1
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1836072691[eax*1+ebp]
-       sub     edx,            ecx
-       rol     ebp,            13
-       add     ebp,            ebx
-       ; 122
-       mov     eax,            DWORD PTR 48[esp]
-       or      edx,            ebp
-       add     ebx,            eax
-       xor     edx,            esi
-       mov     eax,            -1
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1836072691[edx*1+ebx]
-       sub     eax,            ebp
-       rol     ebx,            5
-       add     ebx,            edi
-       ; 123
-       mov     edx,            DWORD PTR 8[esp]
-       or      eax,            ebx
-       add     edi,            edx
-       xor     eax,            ecx
-       mov     edx,            -1
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 1836072691[eax*1+edi]
-       sub     edx,            ebx
-       rol     edi,            14
-       add     edi,            esi
-       ; 124
-       mov     eax,            DWORD PTR 40[esp]
-       or      edx,            edi
-       add     esi,            eax
-       xor     edx,            ebp
-       mov     eax,            -1
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 1836072691[edx*1+esi]
-       sub     eax,            edi
-       rol     esi,            13
-       add     esi,            ecx
-       ; 125
-       mov     edx,            DWORD PTR [esp]
-       or      eax,            esi
-       add     ecx,            edx
-       xor     eax,            ebx
-       mov     edx,            -1
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 1836072691[eax*1+ecx]
-       sub     edx,            esi
-       rol     ecx,            13
-       add     ecx,            ebp
-       ; 126
-       mov     eax,            DWORD PTR 16[esp]
-       or      edx,            ecx
-       add     ebp,            eax
-       xor     edx,            edi
-       mov     eax,            -1
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1836072691[edx*1+ebp]
-       sub     eax,            ecx
-       rol     ebp,            7
-       add     ebp,            ebx
-       ; 127
-       mov     edx,            DWORD PTR 52[esp]
-       or      eax,            ebp
-       add     ebx,            edx
-       xor     eax,            esi
-       mov     edx,            DWORD PTR 32[esp]
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1836072691[eax*1+ebx]
-       mov     eax,            -1
-       rol     ebx,            5
-       add     ebx,            edi
-       ; 128
-       add     edi,            edx
-       mov     edx,            ebp
-       sub     eax,            ebx
-       and     edx,            ebx
-       and     eax,            ecx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 24[esp]
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 2053994217[edx*1+edi]
-       mov     edx,            -1
-       rol     edi,            15
-       add     edi,            esi
-       ; 129
-       add     esi,            eax
-       mov     eax,            ebx
-       sub     edx,            edi
-       and     eax,            edi
-       and     edx,            ebp
-       or      eax,            edx
-       mov     edx,            DWORD PTR 16[esp]
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 2053994217[eax*1+esi]
-       mov     eax,            -1
-       rol     esi,            5
-       add     esi,            ecx
-       ; 130
-       add     ecx,            edx
-       mov     edx,            edi
-       sub     eax,            esi
-       and     edx,            esi
-       and     eax,            ebx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 4[esp]
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 2053994217[edx*1+ecx]
-       mov     edx,            -1
-       rol     ecx,            8
-       add     ecx,            ebp
-       ; 131
-       add     ebp,            eax
-       mov     eax,            esi
-       sub     edx,            ecx
-       and     eax,            ecx
-       and     edx,            edi
-       or      eax,            edx
-       mov     edx,            DWORD PTR 12[esp]
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 2053994217[eax*1+ebp]
-       mov     eax,            -1
-       rol     ebp,            11
-       add     ebp,            ebx
-       ; 132
-       add     ebx,            edx
-       mov     edx,            ecx
-       sub     eax,            ebp
-       and     edx,            ebp
-       and     eax,            esi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 44[esp]
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 2053994217[edx*1+ebx]
-       mov     edx,            -1
-       rol     ebx,            14
-       add     ebx,            edi
-       ; 133
-       add     edi,            eax
-       mov     eax,            ebp
-       sub     edx,            ebx
-       and     eax,            ebx
-       and     edx,            ecx
-       or      eax,            edx
-       mov     edx,            DWORD PTR 60[esp]
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 2053994217[eax*1+edi]
-       mov     eax,            -1
-       rol     edi,            14
-       add     edi,            esi
-       ; 134
-       add     esi,            edx
-       mov     edx,            ebx
-       sub     eax,            edi
-       and     edx,            edi
-       and     eax,            ebp
-       or      edx,            eax
-       mov     eax,            DWORD PTR [esp]
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 2053994217[edx*1+esi]
-       mov     edx,            -1
-       rol     esi,            6
-       add     esi,            ecx
-       ; 135
-       add     ecx,            eax
-       mov     eax,            edi
-       sub     edx,            esi
-       and     eax,            esi
-       and     edx,            ebx
-       or      eax,            edx
-       mov     edx,            DWORD PTR 20[esp]
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 2053994217[eax*1+ecx]
-       mov     eax,            -1
-       rol     ecx,            14
-       add     ecx,            ebp
-       ; 136
-       add     ebp,            edx
-       mov     edx,            esi
-       sub     eax,            ecx
-       and     edx,            ecx
-       and     eax,            edi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 48[esp]
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 2053994217[edx*1+ebp]
-       mov     edx,            -1
-       rol     ebp,            6
-       add     ebp,            ebx
-       ; 137
-       add     ebx,            eax
-       mov     eax,            ecx
-       sub     edx,            ebp
-       and     eax,            ebp
-       and     edx,            esi
-       or      eax,            edx
-       mov     edx,            DWORD PTR 8[esp]
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 2053994217[eax*1+ebx]
-       mov     eax,            -1
-       rol     ebx,            9
-       add     ebx,            edi
-       ; 138
-       add     edi,            edx
-       mov     edx,            ebp
-       sub     eax,            ebx
-       and     edx,            ebx
-       and     eax,            ecx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 52[esp]
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 2053994217[edx*1+edi]
-       mov     edx,            -1
-       rol     edi,            12
-       add     edi,            esi
-       ; 139
-       add     esi,            eax
-       mov     eax,            ebx
-       sub     edx,            edi
-       and     eax,            edi
-       and     edx,            ebp
-       or      eax,            edx
-       mov     edx,            DWORD PTR 36[esp]
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 2053994217[eax*1+esi]
-       mov     eax,            -1
-       rol     esi,            9
-       add     esi,            ecx
-       ; 140
-       add     ecx,            edx
-       mov     edx,            edi
-       sub     eax,            esi
-       and     edx,            esi
-       and     eax,            ebx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 28[esp]
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 2053994217[edx*1+ecx]
-       mov     edx,            -1
-       rol     ecx,            12
-       add     ecx,            ebp
-       ; 141
-       add     ebp,            eax
-       mov     eax,            esi
-       sub     edx,            ecx
-       and     eax,            ecx
-       and     edx,            edi
-       or      eax,            edx
-       mov     edx,            DWORD PTR 40[esp]
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 2053994217[eax*1+ebp]
-       mov     eax,            -1
-       rol     ebp,            5
-       add     ebp,            ebx
-       ; 142
-       add     ebx,            edx
-       mov     edx,            ecx
-       sub     eax,            ebp
-       and     edx,            ebp
-       and     eax,            esi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 56[esp]
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 2053994217[edx*1+ebx]
-       mov     edx,            -1
-       rol     ebx,            15
-       add     ebx,            edi
-       ; 143
-       add     edi,            eax
-       mov     eax,            ebp
-       sub     edx,            ebx
-       and     eax,            ebx
-       and     edx,            ecx
-       or      edx,            eax
-       mov     eax,            ebx
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 2053994217[edx*1+edi]
-       xor     eax,            ebp
-       rol     edi,            8
-       add     edi,            esi
-       ; 144
-       mov     edx,            DWORD PTR 48[esp]
-       xor     eax,            edi
-       add     esi,            edx
-       rol     ebx,            10
-       add     esi,            eax
-       mov     eax,            edi
-       rol     esi,            8
-       add     esi,            ecx
-       ; 145
-       xor     eax,            ebx
-       mov     edx,            DWORD PTR 60[esp]
-       xor     eax,            esi
-       add     ecx,            eax
-       mov     eax,            esi
-       rol     edi,            10
-       add     ecx,            edx
-       xor     eax,            edi
-       rol     ecx,            5
-       add     ecx,            ebp
-       ; 146
-       mov     edx,            DWORD PTR 40[esp]
-       xor     eax,            ecx
-       add     ebp,            edx
-       rol     esi,            10
-       add     ebp,            eax
-       mov     eax,            ecx
-       rol     ebp,            12
-       add     ebp,            ebx
-       ; 147
-       xor     eax,            esi
-       mov     edx,            DWORD PTR 16[esp]
-       xor     eax,            ebp
-       add     ebx,            eax
-       mov     eax,            ebp
-       rol     ecx,            10
-       add     ebx,            edx
-       xor     eax,            ecx
-       rol     ebx,            9
-       add     ebx,            edi
-       ; 148
-       mov     edx,            DWORD PTR 4[esp]
-       xor     eax,            ebx
-       add     edi,            edx
-       rol     ebp,            10
-       add     edi,            eax
-       mov     eax,            ebx
-       rol     edi,            12
-       add     edi,            esi
-       ; 149
-       xor     eax,            ebp
-       mov     edx,            DWORD PTR 20[esp]
-       xor     eax,            edi
-       add     esi,            eax
-       mov     eax,            edi
-       rol     ebx,            10
-       add     esi,            edx
-       xor     eax,            ebx
-       rol     esi,            5
-       add     esi,            ecx
-       ; 150
-       mov     edx,            DWORD PTR 32[esp]
-       xor     eax,            esi
-       add     ecx,            edx
-       rol     edi,            10
-       add     ecx,            eax
-       mov     eax,            esi
-       rol     ecx,            14
-       add     ecx,            ebp
-       ; 151
-       xor     eax,            edi
-       mov     edx,            DWORD PTR 28[esp]
-       xor     eax,            ecx
-       add     ebp,            eax
-       mov     eax,            ecx
-       rol     esi,            10
-       add     ebp,            edx
-       xor     eax,            esi
-       rol     ebp,            6
-       add     ebp,            ebx
-       ; 152
-       mov     edx,            DWORD PTR 24[esp]
-       xor     eax,            ebp
-       add     ebx,            edx
-       rol     ecx,            10
-       add     ebx,            eax
-       mov     eax,            ebp
-       rol     ebx,            8
-       add     ebx,            edi
-       ; 153
-       xor     eax,            ecx
-       mov     edx,            DWORD PTR 8[esp]
-       xor     eax,            ebx
-       add     edi,            eax
-       mov     eax,            ebx
-       rol     ebp,            10
-       add     edi,            edx
-       xor     eax,            ebp
-       rol     edi,            13
-       add     edi,            esi
-       ; 154
-       mov     edx,            DWORD PTR 52[esp]
-       xor     eax,            edi
-       add     esi,            edx
-       rol     ebx,            10
-       add     esi,            eax
-       mov     eax,            edi
-       rol     esi,            6
-       add     esi,            ecx
-       ; 155
-       xor     eax,            ebx
-       mov     edx,            DWORD PTR 56[esp]
-       xor     eax,            esi
-       add     ecx,            eax
-       mov     eax,            esi
-       rol     edi,            10
-       add     ecx,            edx
-       xor     eax,            edi
-       rol     ecx,            5
-       add     ecx,            ebp
-       ; 156
-       mov     edx,            DWORD PTR [esp]
-       xor     eax,            ecx
-       add     ebp,            edx
-       rol     esi,            10
-       add     ebp,            eax
-       mov     eax,            ecx
-       rol     ebp,            15
-       add     ebp,            ebx
-       ; 157
-       xor     eax,            esi
-       mov     edx,            DWORD PTR 12[esp]
-       xor     eax,            ebp
-       add     ebx,            eax
-       mov     eax,            ebp
-       rol     ecx,            10
-       add     ebx,            edx
-       xor     eax,            ecx
-       rol     ebx,            13
-       add     ebx,            edi
-       ; 158
-       mov     edx,            DWORD PTR 36[esp]
-       xor     eax,            ebx
-       add     edi,            edx
-       rol     ebp,            10
-       add     edi,            eax
-       mov     eax,            ebx
-       rol     edi,            11
-       add     edi,            esi
-       ; 159
-       xor     eax,            ebp
-       mov     edx,            DWORD PTR 44[esp]
-       xor     eax,            edi
-       add     esi,            eax
-       rol     ebx,            10
-       add     esi,            edx
-       mov     edx,            DWORD PTR 128[esp]
-       rol     esi,            11
-       add     esi,            ecx
-       mov     eax,            DWORD PTR 4[edx]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 72[esp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 8[edx]
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 76[esp]
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 12[edx]
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 80[esp]
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 16[edx]
-       add     esi,            eax
-       mov     eax,            DWORD PTR 64[esp]
-       add     esi,            eax
-       mov     eax,            DWORD PTR [edx]
-       add     edi,            eax
-       mov     eax,            DWORD PTR 68[esp]
-       add     edi,            eax
-       mov     eax,            DWORD PTR 136[esp]
-       mov     DWORD PTR [edx],ebx
-       mov     DWORD PTR 4[edx],ebp
-       mov     DWORD PTR 8[edx],ecx
-       sub     eax,            1
-       mov     DWORD PTR 12[edx],esi
-       mov     DWORD PTR 16[edx],edi
-       jle     $L001get_out
-       mov     DWORD PTR 136[esp],eax
-       mov     edi,            ecx
-       mov     eax,            DWORD PTR 132[esp]
-       mov     ecx,            ebx
-       add     eax,            64
-       mov     esi,            ebp
-       mov     DWORD PTR 132[esp],eax
-       jmp     L000start
-$L001get_out:
-       add     esp,            108
-       pop     ebx
-       pop     ebp
-       pop     edi
-       pop     esi
-       ret
-_ripemd160_block_asm_host_order ENDP
-_TEXT  ENDS
-END
index 145cf31..f537b88 100644 (file)
@@ -106,11 +106,7 @@ void ripemd160_block_data_order (RIPEMD160_CTX *c, const void *p,int num);
 #define HASH_BLOCK_DATA_ORDER   ripemd160_block_data_order
 #endif
 
-#ifndef FLAT_INC
-#include "../md32_common.h"
-#else
 #include "md32_common.h"
-#endif
 
 #if 0
 #define F1(x,y,z)       ((x)^(y)^(z))
index 5cfbea2..1cde7c0 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index 79ef43a..72acd8f 100644 (file)
@@ -5,6 +5,7 @@
 DIR=    sha
 TOP=    ../..
 CC=     cc
+CPP=    $(CC) -E
 INCLUDES=
 CFLAG=-g
 INSTALL_PREFIX=
@@ -46,7 +47,7 @@ lib:    $(LIBOBJ)
 
 # elf
 asm/sx86-elf.o: asm/sx86unix.cpp
-       $(CPP) -DELF asm/sx86unix.cpp | as -o asm/sx86-elf.o
+       $(CPP) -DELF -x c asm/sx86unix.cpp | as -o asm/sx86-elf.o
 
 # solaris
 asm/sx86-sol.o: asm/sx86unix.cpp
@@ -62,7 +63,7 @@ asm/sx86-out.o: asm/sx86unix.cpp
 asm/sx86bsdi.o: asm/sx86unix.cpp
        $(CPP) -DBSDI asm/sx86unix.cpp | sed 's/ :/:/' | as -o asm/sx86bsdi.o
 
-asm/sx86unix.cpp:
+asm/sx86unix.cpp: asm/sha1-586.pl ../perlasm/x86asm.pl
        (cd asm; $(PERL) sha1-586.pl cpp $(PROCESSOR) >sx86unix.cpp)
 
 files:
index b7ec5ca..e69de29 100644 (file)
@@ -1,122 +0,0 @@
-# Targets
-# make          - twidle the options yourself :-)
-# make cc       - standard cc options
-# make gcc      - standard gcc options
-# make x86-elf  - linux-elf etc
-# make x86-out  - linux-a.out, FreeBSD etc
-# make x86-solaris
-# make x86-bdsi
-
-DIR=    sha
-TOP=    .
-CC=     gcc
-CFLAG= -O3 -fomit-frame-pointer
-
-CPP=    $(CC) -E
-INCLUDES=
-INSTALLTOP=/usr/local/lib
-MAKE=           make
-MAKEDEPEND=     makedepend
-MAKEFILE=       Makefile.uni
-AR=             ar r
-
-SHA_ASM_OBJ=
-
-CFLAGS= $(INCLUDES) $(CFLAG)
-
-GENERAL=Makefile
-
-TEST1=shatest
-TEST2=sha1test
-APP1=sha
-APP2=sha1
-
-TEST=$(TEST1) $(TEST2)
-APPS=$(APP1) $(APP2)
-
-LIB=libsha.a
-LIBSRC=sha_dgst.c sha1dgst.c sha_one.c sha1_one.c
-LIBOBJ=sha_dgst.o sha1dgst.o sha_one.o sha1_one.o $(SHA_ASM_OBJ)
-
-SRC= $(LIBSRC)
-
-EXHEADER= sha.h
-HEADER= sha_locl.h $(EXHEADER)
-
-ALL=    $(GENERAL) $(SRC) $(HEADER)
-
-all:    $(LIB) $(TEST) $(APPS)
-
-$(LIB): $(LIBOBJ)
-       $(AR) $(LIB) $(LIBOBJ)
-       $(RANLIB) $(LIB)
-
-# elf
-asm/sx86-elf.o: asm/sx86unix.cpp
-       $(CPP) -DELF asm/sx86unix.cpp | as -o asm/sx86-elf.o
-
-# solaris
-asm/sx86-sol.o: asm/sx86unix.cpp
-       $(CC) -E -DSOL asm/sx86unix.cpp | sed 's/^#.*//' > asm/sx86-sol.s
-       as -o asm/sx86-sol.o asm/sx86-sol.s
-       rm -f asm/sx86-sol.s
-
-# a.out
-asm/sx86-out.o: asm/sx86unix.cpp
-       $(CPP) -DOUT asm/sx86unix.cpp | as -o asm/sx86-out.o
-
-# bsdi
-asm/sx86bsdi.o: asm/sx86unix.cpp
-       $(CPP) -DBSDI asm/sx86unix.cpp | as -o asm/sx86bsdi.o
-
-asm/sx86unix.cpp:
-       (cd asm; perl sha1-586.pl cpp >sx86unix.cpp)
-
-test:  $(TEST)
-       ./$(TEST1)
-       ./$(TEST2)
-
-$(TEST1): $(TEST1).c $(LIB)
-       $(CC) -o $(TEST1) $(CFLAGS) $(TEST1).c $(LIB)
-
-$(TEST2): $(TEST2).c $(LIB)
-       $(CC) -o $(TEST2) $(CFLAGS) $(TEST2).c $(LIB)
-
-$(APP1): $(APP1).c $(LIB)
-       $(CC) -o $(APP1) $(CFLAGS) $(APP1).c $(LIB)
-
-$(APP2): $(APP2).c $(LIB)
-       $(CC) -o $(APP2) $(CFLAGS) $(APP2).c $(LIB)
-
-lint:
-       lint -DLINT $(INCLUDES) $(SRC)>fluff
-
-depend:
-       $(MAKEDEPEND) $(INCLUDES) $(PROGS) $(LIBSRC)
-
-dclean:
-       perl -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) >Makefile.new
-       mv -f Makefile.new $(MAKEFILE)
-
-clean:
-       /bin/rm -f $(LIB) $(TEST) $(APPS) *.o asm/*.o *.obj lib tags core .pure .nfs* *.old *.bak fluff
-
-cc:
-       $(MAKE) SHA_ASM_OBJ="" CC="cc" CFLAG="-O" all
-
-gcc:
-       $(MAKE) SHA_ASM_OBJ="" CC="gcc" CFLAGS="-O3 -fomit-frame-pointer" all
-
-x86-elf:
-       $(MAKE) SHA_ASM_OBJ="asm/sx86-elf.o" CFLAG="-DELF -DSHA1_ASM -DL_ENDIAN $(CFLAGS)" all
-
-x86-out:
-       $(MAKE) SHA_ASM_OBJ="asm/sx86-out.o" CFLAG="-DOUT -DSHA1_ASM -DL_ENDIAN $(CFLAGS)" all
-
-x86-solaris:
-       $(MAKE) SHA_ASM_OBJ="asm/sx86-sol.o" CFLAG="-DSOL -DSHA1_ASM -DL_ENDIAN $(CFLAGS)" all
-
-x86-bdsi:
-       $(MAKE) SHA_ASM_OBJ="asm/sx86-bdsi.o" CFLAG="-DBDSI -DSHA1_ASM -DL_ENDIAN $(CFLAGS)" all
-
-# DO NOT DELETE THIS LINE -- make depend depends on it.
index 699afdb..e69de29 100644 (file)
-       ; Don't even think of reading this code
-       ; It was automatically generated by sha1-586.pl
-       ; Which is a perl program used to generate the x86 assember for
-       ; any of elf, a.out, BSDI,Win32, or Solaris
-       ; eric <eay@cryptsoft.com>
-       ; 
-       TITLE   sha1-586.asm
-        .486
-.model FLAT
-_TEXT  SEGMENT
-PUBLIC _sha1_block_asm_data_order
-
-_sha1_block_asm_data_order PROC NEAR
-       mov     ecx,            DWORD PTR 12[esp]
-       push    esi
-       shl     ecx,            6
-       mov     esi,            DWORD PTR 12[esp]
-       push    ebp
-       add     ecx,            esi
-       push    ebx
-       mov     ebp,            DWORD PTR 16[esp]
-       push    edi
-       mov     edx,            DWORD PTR 12[ebp]
-       sub     esp,            108
-       mov     edi,            DWORD PTR 16[ebp]
-       mov     ebx,            DWORD PTR 8[ebp]
-       mov     DWORD PTR 68[esp],ecx
-       ; First we need to setup the X array
-L000start:
-       ; First, load the words onto the stack in network byte order
-       mov     eax,            DWORD PTR [esi]
-       mov     ecx,            DWORD PTR 4[esi]
-       bswap   eax
-       bswap   ecx
-       mov     DWORD PTR [esp],eax
-       mov     DWORD PTR 4[esp],ecx
-       mov     eax,            DWORD PTR 8[esi]
-       mov     ecx,            DWORD PTR 12[esi]
-       bswap   eax
-       bswap   ecx
-       mov     DWORD PTR 8[esp],eax
-       mov     DWORD PTR 12[esp],ecx
-       mov     eax,            DWORD PTR 16[esi]
-       mov     ecx,            DWORD PTR 20[esi]
-       bswap   eax
-       bswap   ecx
-       mov     DWORD PTR 16[esp],eax
-       mov     DWORD PTR 20[esp],ecx
-       mov     eax,            DWORD PTR 24[esi]
-       mov     ecx,            DWORD PTR 28[esi]
-       bswap   eax
-       bswap   ecx
-       mov     DWORD PTR 24[esp],eax
-       mov     DWORD PTR 28[esp],ecx
-       mov     eax,            DWORD PTR 32[esi]
-       mov     ecx,            DWORD PTR 36[esi]
-       bswap   eax
-       bswap   ecx
-       mov     DWORD PTR 32[esp],eax
-       mov     DWORD PTR 36[esp],ecx
-       mov     eax,            DWORD PTR 40[esi]
-       mov     ecx,            DWORD PTR 44[esi]
-       bswap   eax
-       bswap   ecx
-       mov     DWORD PTR 40[esp],eax
-       mov     DWORD PTR 44[esp],ecx
-       mov     eax,            DWORD PTR 48[esi]
-       mov     ecx,            DWORD PTR 52[esi]
-       bswap   eax
-       bswap   ecx
-       mov     DWORD PTR 48[esp],eax
-       mov     DWORD PTR 52[esp],ecx
-       mov     eax,            DWORD PTR 56[esi]
-       mov     ecx,            DWORD PTR 60[esi]
-       bswap   eax
-       bswap   ecx
-       mov     DWORD PTR 56[esp],eax
-       mov     DWORD PTR 60[esp],ecx
-       ; We now have the X array on the stack
-       ; starting at sp-4
-       mov     DWORD PTR 132[esp],esi
-L001shortcut:
-       ; 
-       ; Start processing
-       mov     eax,            DWORD PTR [ebp]
-       mov     ecx,            DWORD PTR 4[ebp]
-       ; 00_15 0
-       mov     esi,            ebx
-       mov     ebp,            eax
-       xor     esi,            edx
-       rol     ebp,            5
-       and     esi,            ecx
-       add     ebp,            edi
-       ror     ecx,            1
-       mov     edi,            DWORD PTR [esp]
-       ror     ecx,            1
-       xor     esi,            edx
-       lea     ebp,            DWORD PTR 1518500249[edi*1+ebp]
-       mov     edi,            ecx
-       add     esi,            ebp
-       xor     edi,            ebx
-       mov     ebp,            esi
-       and     edi,            eax
-       rol     ebp,            5
-       add     ebp,            edx
-       mov     edx,            DWORD PTR 4[esp]
-       ror     eax,            1
-       xor     edi,            ebx
-       ror     eax,            1
-       lea     ebp,            DWORD PTR 1518500249[edx*1+ebp]
-       add     edi,            ebp
-       ; 00_15 2
-       mov     edx,            eax
-       mov     ebp,            edi
-       xor     edx,            ecx
-       rol     ebp,            5
-       and     edx,            esi
-       add     ebp,            ebx
-       ror     esi,            1
-       mov     ebx,            DWORD PTR 8[esp]
-       ror     esi,            1
-       xor     edx,            ecx
-       lea     ebp,            DWORD PTR 1518500249[ebx*1+ebp]
-       mov     ebx,            esi
-       add     edx,            ebp
-       xor     ebx,            eax
-       mov     ebp,            edx
-       and     ebx,            edi
-       rol     ebp,            5
-       add     ebp,            ecx
-       mov     ecx,            DWORD PTR 12[esp]
-       ror     edi,            1
-       xor     ebx,            eax
-       ror     edi,            1
-       lea     ebp,            DWORD PTR 1518500249[ecx*1+ebp]
-       add     ebx,            ebp
-       ; 00_15 4
-       mov     ecx,            edi
-       mov     ebp,            ebx
-       xor     ecx,            esi
-       rol     ebp,            5
-       and     ecx,            edx
-       add     ebp,            eax
-       ror     edx,            1
-       mov     eax,            DWORD PTR 16[esp]
-       ror     edx,            1
-       xor     ecx,            esi
-       lea     ebp,            DWORD PTR 1518500249[eax*1+ebp]
-       mov     eax,            edx
-       add     ecx,            ebp
-       xor     eax,            edi
-       mov     ebp,            ecx
-       and     eax,            ebx
-       rol     ebp,            5
-       add     ebp,            esi
-       mov     esi,            DWORD PTR 20[esp]
-       ror     ebx,            1
-       xor     eax,            edi
-       ror     ebx,            1
-       lea     ebp,            DWORD PTR 1518500249[esi*1+ebp]
-       add     eax,            ebp
-       ; 00_15 6
-       mov     esi,            ebx
-       mov     ebp,            eax
-       xor     esi,            edx
-       rol     ebp,            5
-       and     esi,            ecx
-       add     ebp,            edi
-       ror     ecx,            1
-       mov     edi,            DWORD PTR 24[esp]
-       ror     ecx,            1
-       xor     esi,            edx
-       lea     ebp,            DWORD PTR 1518500249[edi*1+ebp]
-       mov     edi,            ecx
-       add     esi,            ebp
-       xor     edi,            ebx
-       mov     ebp,            esi
-       and     edi,            eax
-       rol     ebp,            5
-       add     ebp,            edx
-       mov     edx,            DWORD PTR 28[esp]
-       ror     eax,            1
-       xor     edi,            ebx
-       ror     eax,            1
-       lea     ebp,            DWORD PTR 1518500249[edx*1+ebp]
-       add     edi,            ebp
-       ; 00_15 8
-       mov     edx,            eax
-       mov     ebp,            edi
-       xor     edx,            ecx
-       rol     ebp,            5
-       and     edx,            esi
-       add     ebp,            ebx
-       ror     esi,            1
-       mov     ebx,            DWORD PTR 32[esp]
-       ror     esi,            1
-       xor     edx,            ecx
-       lea     ebp,            DWORD PTR 1518500249[ebx*1+ebp]
-       mov     ebx,            esi
-       add     edx,            ebp
-       xor     ebx,            eax
-       mov     ebp,            edx
-       and     ebx,            edi
-       rol     ebp,            5
-       add     ebp,            ecx
-       mov     ecx,            DWORD PTR 36[esp]
-       ror     edi,            1
-       xor     ebx,            eax
-       ror     edi,            1
-       lea     ebp,            DWORD PTR 1518500249[ecx*1+ebp]
-       add     ebx,            ebp
-       ; 00_15 10
-       mov     ecx,            edi
-       mov     ebp,            ebx
-       xor     ecx,            esi
-       rol     ebp,            5
-       and     ecx,            edx
-       add     ebp,            eax
-       ror     edx,            1
-       mov     eax,            DWORD PTR 40[esp]
-       ror     edx,            1
-       xor     ecx,            esi
-       lea     ebp,            DWORD PTR 1518500249[eax*1+ebp]
-       mov     eax,            edx
-       add     ecx,            ebp
-       xor     eax,            edi
-       mov     ebp,            ecx
-       and     eax,            ebx
-       rol     ebp,            5
-       add     ebp,            esi
-       mov     esi,            DWORD PTR 44[esp]
-       ror     ebx,            1
-       xor     eax,            edi
-       ror     ebx,            1
-       lea     ebp,            DWORD PTR 1518500249[esi*1+ebp]
-       add     eax,            ebp
-       ; 00_15 12
-       mov     esi,            ebx
-       mov     ebp,            eax
-       xor     esi,            edx
-       rol     ebp,            5
-       and     esi,            ecx
-       add     ebp,            edi
-       ror     ecx,            1
-       mov     edi,            DWORD PTR 48[esp]
-       ror     ecx,            1
-       xor     esi,            edx
-       lea     ebp,            DWORD PTR 1518500249[edi*1+ebp]
-       mov     edi,            ecx
-       add     esi,            ebp
-       xor     edi,            ebx
-       mov     ebp,            esi
-       and     edi,            eax
-       rol     ebp,            5
-       add     ebp,            edx
-       mov     edx,            DWORD PTR 52[esp]
-       ror     eax,            1
-       xor     edi,            ebx
-       ror     eax,            1
-       lea     ebp,            DWORD PTR 1518500249[edx*1+ebp]
-       add     edi,            ebp
-       ; 00_15 14
-       mov     edx,            eax
-       mov     ebp,            edi
-       xor     edx,            ecx
-       rol     ebp,            5
-       and     edx,            esi
-       add     ebp,            ebx
-       ror     esi,            1
-       mov     ebx,            DWORD PTR 56[esp]
-       ror     esi,            1
-       xor     edx,            ecx
-       lea     ebp,            DWORD PTR 1518500249[ebx*1+ebp]
-       mov     ebx,            esi
-       add     edx,            ebp
-       xor     ebx,            eax
-       mov     ebp,            edx
-       and     ebx,            edi
-       rol     ebp,            5
-       add     ebp,            ecx
-       mov     ecx,            DWORD PTR 60[esp]
-       ror     edi,            1
-       xor     ebx,            eax
-       ror     edi,            1
-       lea     ebp,            DWORD PTR 1518500249[ecx*1+ebp]
-       add     ebx,            ebp
-       ; 16_19 16
-       nop
-       mov     ebp,            DWORD PTR [esp]
-       mov     ecx,            DWORD PTR 8[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 32[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 52[esp]
-       xor     ecx,            ebp
-       mov     ebp,            edi
-       rol     ecx,            1
-       xor     ebp,            esi
-       mov     DWORD PTR [esp],ecx
-       and     ebp,            edx
-       lea     ecx,            DWORD PTR 1518500249[eax*1+ecx]
-       xor     ebp,            esi
-       mov     eax,            ebx
-       add     ecx,            ebp
-       rol     eax,            5
-       ror     edx,            1
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 4[esp]
-       mov     ebp,            DWORD PTR 12[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 36[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 56[esp]
-       ror     edx,            1
-       xor     eax,            ebp
-       rol     eax,            1
-       mov     ebp,            edx
-       xor     ebp,            edi
-       mov     DWORD PTR 4[esp],eax
-       and     ebp,            ebx
-       lea     eax,            DWORD PTR 1518500249[esi*1+eax]
-       xor     ebp,            edi
-       mov     esi,            ecx
-       rol     esi,            5
-       ror     ebx,            1
-       add     eax,            esi
-       ror     ebx,            1
-       add     eax,            ebp
-       ; 16_19 18
-       mov     ebp,            DWORD PTR 8[esp]
-       mov     esi,            DWORD PTR 16[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 40[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 60[esp]
-       xor     esi,            ebp
-       mov     ebp,            ebx
-       rol     esi,            1
-       xor     ebp,            edx
-       mov     DWORD PTR 8[esp],esi
-       and     ebp,            ecx
-       lea     esi,            DWORD PTR 1518500249[edi*1+esi]
-       xor     ebp,            edx
-       mov     edi,            eax
-       add     esi,            ebp
-       rol     edi,            5
-       ror     ecx,            1
-       add     esi,            edi
-       mov     edi,            DWORD PTR 12[esp]
-       mov     ebp,            DWORD PTR 20[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 44[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR [esp]
-       ror     ecx,            1
-       xor     edi,            ebp
-       rol     edi,            1
-       mov     ebp,            ecx
-       xor     ebp,            ebx
-       mov     DWORD PTR 12[esp],edi
-       and     ebp,            eax
-       lea     edi,            DWORD PTR 1518500249[edx*1+edi]
-       xor     ebp,            ebx
-       mov     edx,            esi
-       rol     edx,            5
-       ror     eax,            1
-       add     edi,            edx
-       ror     eax,            1
-       add     edi,            ebp
-       ; 20_39 20
-       mov     edx,            DWORD PTR 16[esp]
-       mov     ebp,            DWORD PTR 24[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 48[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 4[esp]
-       xor     edx,            ebp
-       mov     ebp,            esi
-       rol     edx,            1
-       xor     ebp,            eax
-       mov     DWORD PTR 16[esp],edx
-       xor     ebp,            ecx
-       lea     edx,            DWORD PTR 1859775393[ebx*1+edx]
-       mov     ebx,            edi
-       rol     ebx,            5
-       ror     esi,            1
-       add     ebx,            ebp
-       ror     esi,            1
-       add     edx,            ebx
-       ; 20_39 21
-       mov     ebx,            DWORD PTR 20[esp]
-       mov     ebp,            DWORD PTR 28[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 52[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 8[esp]
-       xor     ebx,            ebp
-       mov     ebp,            edi
-       rol     ebx,            1
-       xor     ebp,            esi
-       mov     DWORD PTR 20[esp],ebx
-       xor     ebp,            eax
-       lea     ebx,            DWORD PTR 1859775393[ecx*1+ebx]
-       mov     ecx,            edx
-       rol     ecx,            5
-       ror     edi,            1
-       add     ecx,            ebp
-       ror     edi,            1
-       add     ebx,            ecx
-       ; 20_39 22
-       mov     ecx,            DWORD PTR 24[esp]
-       mov     ebp,            DWORD PTR 32[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 56[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 12[esp]
-       xor     ecx,            ebp
-       mov     ebp,            edx
-       rol     ecx,            1
-       xor     ebp,            edi
-       mov     DWORD PTR 24[esp],ecx
-       xor     ebp,            esi
-       lea     ecx,            DWORD PTR 1859775393[eax*1+ecx]
-       mov     eax,            ebx
-       rol     eax,            5
-       ror     edx,            1
-       add     eax,            ebp
-       ror     edx,            1
-       add     ecx,            eax
-       ; 20_39 23
-       mov     eax,            DWORD PTR 28[esp]
-       mov     ebp,            DWORD PTR 36[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 60[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 16[esp]
-       xor     eax,            ebp
-       mov     ebp,            ebx
-       rol     eax,            1
-       xor     ebp,            edx
-       mov     DWORD PTR 28[esp],eax
-       xor     ebp,            edi
-       lea     eax,            DWORD PTR 1859775393[esi*1+eax]
-       mov     esi,            ecx
-       rol     esi,            5
-       ror     ebx,            1
-       add     esi,            ebp
-       ror     ebx,            1
-       add     eax,            esi
-       ; 20_39 24
-       mov     esi,            DWORD PTR 32[esp]
-       mov     ebp,            DWORD PTR 40[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR [esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 20[esp]
-       xor     esi,            ebp
-       mov     ebp,            ecx
-       rol     esi,            1
-       xor     ebp,            ebx
-       mov     DWORD PTR 32[esp],esi
-       xor     ebp,            edx
-       lea     esi,            DWORD PTR 1859775393[edi*1+esi]
-       mov     edi,            eax
-       rol     edi,            5
-       ror     ecx,            1
-       add     edi,            ebp
-       ror     ecx,            1
-       add     esi,            edi
-       ; 20_39 25
-       mov     edi,            DWORD PTR 36[esp]
-       mov     ebp,            DWORD PTR 44[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 4[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       xor     edi,            ebp
-       mov     ebp,            eax
-       rol     edi,            1
-       xor     ebp,            ecx
-       mov     DWORD PTR 36[esp],edi
-       xor     ebp,            ebx
-       lea     edi,            DWORD PTR 1859775393[edx*1+edi]
-       mov     edx,            esi
-       rol     edx,            5
-       ror     eax,            1
-       add     edx,            ebp
-       ror     eax,            1
-       add     edi,            edx
-       ; 20_39 26
-       mov     edx,            DWORD PTR 40[esp]
-       mov     ebp,            DWORD PTR 48[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 8[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       xor     edx,            ebp
-       mov     ebp,            esi
-       rol     edx,            1
-       xor     ebp,            eax
-       mov     DWORD PTR 40[esp],edx
-       xor     ebp,            ecx
-       lea     edx,            DWORD PTR 1859775393[ebx*1+edx]
-       mov     ebx,            edi
-       rol     ebx,            5
-       ror     esi,            1
-       add     ebx,            ebp
-       ror     esi,            1
-       add     edx,            ebx
-       ; 20_39 27
-       mov     ebx,            DWORD PTR 44[esp]
-       mov     ebp,            DWORD PTR 52[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 12[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 32[esp]
-       xor     ebx,            ebp
-       mov     ebp,            edi
-       rol     ebx,            1
-       xor     ebp,            esi
-       mov     DWORD PTR 44[esp],ebx
-       xor     ebp,            eax
-       lea     ebx,            DWORD PTR 1859775393[ecx*1+ebx]
-       mov     ecx,            edx
-       rol     ecx,            5
-       ror     edi,            1
-       add     ecx,            ebp
-       ror     edi,            1
-       add     ebx,            ecx
-       ; 20_39 28
-       mov     ecx,            DWORD PTR 48[esp]
-       mov     ebp,            DWORD PTR 56[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 16[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 36[esp]
-       xor     ecx,            ebp
-       mov     ebp,            edx
-       rol     ecx,            1
-       xor     ebp,            edi
-       mov     DWORD PTR 48[esp],ecx
-       xor     ebp,            esi
-       lea     ecx,            DWORD PTR 1859775393[eax*1+ecx]
-       mov     eax,            ebx
-       rol     eax,            5
-       ror     edx,            1
-       add     eax,            ebp
-       ror     edx,            1
-       add     ecx,            eax
-       ; 20_39 29
-       mov     eax,            DWORD PTR 52[esp]
-       mov     ebp,            DWORD PTR 60[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 20[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 40[esp]
-       xor     eax,            ebp
-       mov     ebp,            ebx
-       rol     eax,            1
-       xor     ebp,            edx
-       mov     DWORD PTR 52[esp],eax
-       xor     ebp,            edi
-       lea     eax,            DWORD PTR 1859775393[esi*1+eax]
-       mov     esi,            ecx
-       rol     esi,            5
-       ror     ebx,            1
-       add     esi,            ebp
-       ror     ebx,            1
-       add     eax,            esi
-       ; 20_39 30
-       mov     esi,            DWORD PTR 56[esp]
-       mov     ebp,            DWORD PTR [esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 44[esp]
-       xor     esi,            ebp
-       mov     ebp,            ecx
-       rol     esi,            1
-       xor     ebp,            ebx
-       mov     DWORD PTR 56[esp],esi
-       xor     ebp,            edx
-       lea     esi,            DWORD PTR 1859775393[edi*1+esi]
-       mov     edi,            eax
-       rol     edi,            5
-       ror     ecx,            1
-       add     edi,            ebp
-       ror     ecx,            1
-       add     esi,            edi
-       ; 20_39 31
-       mov     edi,            DWORD PTR 60[esp]
-       mov     ebp,            DWORD PTR 4[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 48[esp]
-       xor     edi,            ebp
-       mov     ebp,            eax
-       rol     edi,            1
-       xor     ebp,            ecx
-       mov     DWORD PTR 60[esp],edi
-       xor     ebp,            ebx
-       lea     edi,            DWORD PTR 1859775393[edx*1+edi]
-       mov     edx,            esi
-       rol     edx,            5
-       ror     eax,            1
-       add     edx,            ebp
-       ror     eax,            1
-       add     edi,            edx
-       ; 20_39 32
-       mov     edx,            DWORD PTR [esp]
-       mov     ebp,            DWORD PTR 8[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 32[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 52[esp]
-       xor     edx,            ebp
-       mov     ebp,            esi
-       rol     edx,            1
-       xor     ebp,            eax
-       mov     DWORD PTR [esp],edx
-       xor     ebp,            ecx
-       lea     edx,            DWORD PTR 1859775393[ebx*1+edx]
-       mov     ebx,            edi
-       rol     ebx,            5
-       ror     esi,            1
-       add     ebx,            ebp
-       ror     esi,            1
-       add     edx,            ebx
-       ; 20_39 33
-       mov     ebx,            DWORD PTR 4[esp]
-       mov     ebp,            DWORD PTR 12[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 36[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 56[esp]
-       xor     ebx,            ebp
-       mov     ebp,            edi
-       rol     ebx,            1
-       xor     ebp,            esi
-       mov     DWORD PTR 4[esp],ebx
-       xor     ebp,            eax
-       lea     ebx,            DWORD PTR 1859775393[ecx*1+ebx]
-       mov     ecx,            edx
-       rol     ecx,            5
-       ror     edi,            1
-       add     ecx,            ebp
-       ror     edi,            1
-       add     ebx,            ecx
-       ; 20_39 34
-       mov     ecx,            DWORD PTR 8[esp]
-       mov     ebp,            DWORD PTR 16[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 40[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 60[esp]
-       xor     ecx,            ebp
-       mov     ebp,            edx
-       rol     ecx,            1
-       xor     ebp,            edi
-       mov     DWORD PTR 8[esp],ecx
-       xor     ebp,            esi
-       lea     ecx,            DWORD PTR 1859775393[eax*1+ecx]
-       mov     eax,            ebx
-       rol     eax,            5
-       ror     edx,            1
-       add     eax,            ebp
-       ror     edx,            1
-       add     ecx,            eax
-       ; 20_39 35
-       mov     eax,            DWORD PTR 12[esp]
-       mov     ebp,            DWORD PTR 20[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 44[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR [esp]
-       xor     eax,            ebp
-       mov     ebp,            ebx
-       rol     eax,            1
-       xor     ebp,            edx
-       mov     DWORD PTR 12[esp],eax
-       xor     ebp,            edi
-       lea     eax,            DWORD PTR 1859775393[esi*1+eax]
-       mov     esi,            ecx
-       rol     esi,            5
-       ror     ebx,            1
-       add     esi,            ebp
-       ror     ebx,            1
-       add     eax,            esi
-       ; 20_39 36
-       mov     esi,            DWORD PTR 16[esp]
-       mov     ebp,            DWORD PTR 24[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 48[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 4[esp]
-       xor     esi,            ebp
-       mov     ebp,            ecx
-       rol     esi,            1
-       xor     ebp,            ebx
-       mov     DWORD PTR 16[esp],esi
-       xor     ebp,            edx
-       lea     esi,            DWORD PTR 1859775393[edi*1+esi]
-       mov     edi,            eax
-       rol     edi,            5
-       ror     ecx,            1
-       add     edi,            ebp
-       ror     ecx,            1
-       add     esi,            edi
-       ; 20_39 37
-       mov     edi,            DWORD PTR 20[esp]
-       mov     ebp,            DWORD PTR 28[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 52[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 8[esp]
-       xor     edi,            ebp
-       mov     ebp,            eax
-       rol     edi,            1
-       xor     ebp,            ecx
-       mov     DWORD PTR 20[esp],edi
-       xor     ebp,            ebx
-       lea     edi,            DWORD PTR 1859775393[edx*1+edi]
-       mov     edx,            esi
-       rol     edx,            5
-       ror     eax,            1
-       add     edx,            ebp
-       ror     eax,            1
-       add     edi,            edx
-       ; 20_39 38
-       mov     edx,            DWORD PTR 24[esp]
-       mov     ebp,            DWORD PTR 32[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 56[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 12[esp]
-       xor     edx,            ebp
-       mov     ebp,            esi
-       rol     edx,            1
-       xor     ebp,            eax
-       mov     DWORD PTR 24[esp],edx
-       xor     ebp,            ecx
-       lea     edx,            DWORD PTR 1859775393[ebx*1+edx]
-       mov     ebx,            edi
-       rol     ebx,            5
-       ror     esi,            1
-       add     ebx,            ebp
-       ror     esi,            1
-       add     edx,            ebx
-       ; 20_39 39
-       mov     ebx,            DWORD PTR 28[esp]
-       mov     ebp,            DWORD PTR 36[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 60[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 16[esp]
-       xor     ebx,            ebp
-       mov     ebp,            edi
-       rol     ebx,            1
-       xor     ebp,            esi
-       mov     DWORD PTR 28[esp],ebx
-       xor     ebp,            eax
-       lea     ebx,            DWORD PTR 1859775393[ecx*1+ebx]
-       mov     ecx,            edx
-       rol     ecx,            5
-       ror     edi,            1
-       add     ecx,            ebp
-       ror     edi,            1
-       add     ebx,            ecx
-       ; 40_59 40
-       mov     ecx,            DWORD PTR 32[esp]
-       mov     ebp,            DWORD PTR 40[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR [esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 20[esp]
-       xor     ecx,            ebp
-       mov     ebp,            edx
-       rol     ecx,            1
-       or      ebp,            edi
-       mov     DWORD PTR 32[esp],ecx
-       and     ebp,            esi
-       lea     ecx,            DWORD PTR 2400959708[eax*1+ecx]
-       mov     eax,            edx
-       ror     edx,            1
-       and     eax,            edi
-       or      ebp,            eax
-       mov     eax,            ebx
-       rol     eax,            5
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 36[esp]
-       add     ecx,            ebp
-       mov     ebp,            DWORD PTR 44[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 4[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       ror     edx,            1
-       xor     eax,            ebp
-       rol     eax,            1
-       mov     ebp,            ebx
-       mov     DWORD PTR 36[esp],eax
-       or      ebp,            edx
-       lea     eax,            DWORD PTR 2400959708[esi*1+eax]
-       mov     esi,            ebx
-       and     ebp,            edi
-       and     esi,            edx
-       or      ebp,            esi
-       mov     esi,            ecx
-       rol     esi,            5
-       ror     ebx,            1
-       add     ebp,            esi
-       ror     ebx,            1
-       add     eax,            ebp
-       ; 40_59 41
-       ; 40_59 42
-       mov     esi,            DWORD PTR 40[esp]
-       mov     ebp,            DWORD PTR 48[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 8[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       xor     esi,            ebp
-       mov     ebp,            ecx
-       rol     esi,            1
-       or      ebp,            ebx
-       mov     DWORD PTR 40[esp],esi
-       and     ebp,            edx
-       lea     esi,            DWORD PTR 2400959708[edi*1+esi]
-       mov     edi,            ecx
-       ror     ecx,            1
-       and     edi,            ebx
-       or      ebp,            edi
-       mov     edi,            eax
-       rol     edi,            5
-       add     ebp,            edi
-       mov     edi,            DWORD PTR 44[esp]
-       add     esi,            ebp
-       mov     ebp,            DWORD PTR 52[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 12[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 32[esp]
-       ror     ecx,            1
-       xor     edi,            ebp
-       rol     edi,            1
-       mov     ebp,            eax
-       mov     DWORD PTR 44[esp],edi
-       or      ebp,            ecx
-       lea     edi,            DWORD PTR 2400959708[edx*1+edi]
-       mov     edx,            eax
-       and     ebp,            ebx
-       and     edx,            ecx
-       or      ebp,            edx
-       mov     edx,            esi
-       rol     edx,            5
-       ror     eax,            1
-       add     ebp,            edx
-       ror     eax,            1
-       add     edi,            ebp
-       ; 40_59 43
-       ; 40_59 44
-       mov     edx,            DWORD PTR 48[esp]
-       mov     ebp,            DWORD PTR 56[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 16[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 36[esp]
-       xor     edx,            ebp
-       mov     ebp,            esi
-       rol     edx,            1
-       or      ebp,            eax
-       mov     DWORD PTR 48[esp],edx
-       and     ebp,            ecx
-       lea     edx,            DWORD PTR 2400959708[ebx*1+edx]
-       mov     ebx,            esi
-       ror     esi,            1
-       and     ebx,            eax
-       or      ebp,            ebx
-       mov     ebx,            edi
-       rol     ebx,            5
-       add     ebp,            ebx
-       mov     ebx,            DWORD PTR 52[esp]
-       add     edx,            ebp
-       mov     ebp,            DWORD PTR 60[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 20[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 40[esp]
-       ror     esi,            1
-       xor     ebx,            ebp
-       rol     ebx,            1
-       mov     ebp,            edi
-       mov     DWORD PTR 52[esp],ebx
-       or      ebp,            esi
-       lea     ebx,            DWORD PTR 2400959708[ecx*1+ebx]
-       mov     ecx,            edi
-       and     ebp,            eax
-       and     ecx,            esi
-       or      ebp,            ecx
-       mov     ecx,            edx
-       rol     ecx,            5
-       ror     edi,            1
-       add     ebp,            ecx
-       ror     edi,            1
-       add     ebx,            ebp
-       ; 40_59 45
-       ; 40_59 46
-       mov     ecx,            DWORD PTR 56[esp]
-       mov     ebp,            DWORD PTR [esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 44[esp]
-       xor     ecx,            ebp
-       mov     ebp,            edx
-       rol     ecx,            1
-       or      ebp,            edi
-       mov     DWORD PTR 56[esp],ecx
-       and     ebp,            esi
-       lea     ecx,            DWORD PTR 2400959708[eax*1+ecx]
-       mov     eax,            edx
-       ror     edx,            1
-       and     eax,            edi
-       or      ebp,            eax
-       mov     eax,            ebx
-       rol     eax,            5
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 60[esp]
-       add     ecx,            ebp
-       mov     ebp,            DWORD PTR 4[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 48[esp]
-       ror     edx,            1
-       xor     eax,            ebp
-       rol     eax,            1
-       mov     ebp,            ebx
-       mov     DWORD PTR 60[esp],eax
-       or      ebp,            edx
-       lea     eax,            DWORD PTR 2400959708[esi*1+eax]
-       mov     esi,            ebx
-       and     ebp,            edi
-       and     esi,            edx
-       or      ebp,            esi
-       mov     esi,            ecx
-       rol     esi,            5
-       ror     ebx,            1
-       add     ebp,            esi
-       ror     ebx,            1
-       add     eax,            ebp
-       ; 40_59 47
-       ; 40_59 48
-       mov     esi,            DWORD PTR [esp]
-       mov     ebp,            DWORD PTR 8[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 32[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 52[esp]
-       xor     esi,            ebp
-       mov     ebp,            ecx
-       rol     esi,            1
-       or      ebp,            ebx
-       mov     DWORD PTR [esp],esi
-       and     ebp,            edx
-       lea     esi,            DWORD PTR 2400959708[edi*1+esi]
-       mov     edi,            ecx
-       ror     ecx,            1
-       and     edi,            ebx
-       or      ebp,            edi
-       mov     edi,            eax
-       rol     edi,            5
-       add     ebp,            edi
-       mov     edi,            DWORD PTR 4[esp]
-       add     esi,            ebp
-       mov     ebp,            DWORD PTR 12[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 36[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 56[esp]
-       ror     ecx,            1
-       xor     edi,            ebp
-       rol     edi,            1
-       mov     ebp,            eax
-       mov     DWORD PTR 4[esp],edi
-       or      ebp,            ecx
-       lea     edi,            DWORD PTR 2400959708[edx*1+edi]
-       mov     edx,            eax
-       and     ebp,            ebx
-       and     edx,            ecx
-       or      ebp,            edx
-       mov     edx,            esi
-       rol     edx,            5
-       ror     eax,            1
-       add     ebp,            edx
-       ror     eax,            1
-       add     edi,            ebp
-       ; 40_59 49
-       ; 40_59 50
-       mov     edx,            DWORD PTR 8[esp]
-       mov     ebp,            DWORD PTR 16[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 40[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 60[esp]
-       xor     edx,            ebp
-       mov     ebp,            esi
-       rol     edx,            1
-       or      ebp,            eax
-       mov     DWORD PTR 8[esp],edx
-       and     ebp,            ecx
-       lea     edx,            DWORD PTR 2400959708[ebx*1+edx]
-       mov     ebx,            esi
-       ror     esi,            1
-       and     ebx,            eax
-       or      ebp,            ebx
-       mov     ebx,            edi
-       rol     ebx,            5
-       add     ebp,            ebx
-       mov     ebx,            DWORD PTR 12[esp]
-       add     edx,            ebp
-       mov     ebp,            DWORD PTR 20[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 44[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR [esp]
-       ror     esi,            1
-       xor     ebx,            ebp
-       rol     ebx,            1
-       mov     ebp,            edi
-       mov     DWORD PTR 12[esp],ebx
-       or      ebp,            esi
-       lea     ebx,            DWORD PTR 2400959708[ecx*1+ebx]
-       mov     ecx,            edi
-       and     ebp,            eax
-       and     ecx,            esi
-       or      ebp,            ecx
-       mov     ecx,            edx
-       rol     ecx,            5
-       ror     edi,            1
-       add     ebp,            ecx
-       ror     edi,            1
-       add     ebx,            ebp
-       ; 40_59 51
-       ; 40_59 52
-       mov     ecx,            DWORD PTR 16[esp]
-       mov     ebp,            DWORD PTR 24[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 48[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 4[esp]
-       xor     ecx,            ebp
-       mov     ebp,            edx
-       rol     ecx,            1
-       or      ebp,            edi
-       mov     DWORD PTR 16[esp],ecx
-       and     ebp,            esi
-       lea     ecx,            DWORD PTR 2400959708[eax*1+ecx]
-       mov     eax,            edx
-       ror     edx,            1
-       and     eax,            edi
-       or      ebp,            eax
-       mov     eax,            ebx
-       rol     eax,            5
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       add     ecx,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 52[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 8[esp]
-       ror     edx,            1
-       xor     eax,            ebp
-       rol     eax,            1
-       mov     ebp,            ebx
-       mov     DWORD PTR 20[esp],eax
-       or      ebp,            edx
-       lea     eax,            DWORD PTR 2400959708[esi*1+eax]
-       mov     esi,            ebx
-       and     ebp,            edi
-       and     esi,            edx
-       or      ebp,            esi
-       mov     esi,            ecx
-       rol     esi,            5
-       ror     ebx,            1
-       add     ebp,            esi
-       ror     ebx,            1
-       add     eax,            ebp
-       ; 40_59 53
-       ; 40_59 54
-       mov     esi,            DWORD PTR 24[esp]
-       mov     ebp,            DWORD PTR 32[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 56[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 12[esp]
-       xor     esi,            ebp
-       mov     ebp,            ecx
-       rol     esi,            1
-       or      ebp,            ebx
-       mov     DWORD PTR 24[esp],esi
-       and     ebp,            edx
-       lea     esi,            DWORD PTR 2400959708[edi*1+esi]
-       mov     edi,            ecx
-       ror     ecx,            1
-       and     edi,            ebx
-       or      ebp,            edi
-       mov     edi,            eax
-       rol     edi,            5
-       add     ebp,            edi
-       mov     edi,            DWORD PTR 28[esp]
-       add     esi,            ebp
-       mov     ebp,            DWORD PTR 36[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 60[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 16[esp]
-       ror     ecx,            1
-       xor     edi,            ebp
-       rol     edi,            1
-       mov     ebp,            eax
-       mov     DWORD PTR 28[esp],edi
-       or      ebp,            ecx
-       lea     edi,            DWORD PTR 2400959708[edx*1+edi]
-       mov     edx,            eax
-       and     ebp,            ebx
-       and     edx,            ecx
-       or      ebp,            edx
-       mov     edx,            esi
-       rol     edx,            5
-       ror     eax,            1
-       add     ebp,            edx
-       ror     eax,            1
-       add     edi,            ebp
-       ; 40_59 55
-       ; 40_59 56
-       mov     edx,            DWORD PTR 32[esp]
-       mov     ebp,            DWORD PTR 40[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR [esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 20[esp]
-       xor     edx,            ebp
-       mov     ebp,            esi
-       rol     edx,            1
-       or      ebp,            eax
-       mov     DWORD PTR 32[esp],edx
-       and     ebp,            ecx
-       lea     edx,            DWORD PTR 2400959708[ebx*1+edx]
-       mov     ebx,            esi
-       ror     esi,            1
-       and     ebx,            eax
-       or      ebp,            ebx
-       mov     ebx,            edi
-       rol     ebx,            5
-       add     ebp,            ebx
-       mov     ebx,            DWORD PTR 36[esp]
-       add     edx,            ebp
-       mov     ebp,            DWORD PTR 44[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 4[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       ror     esi,            1
-       xor     ebx,            ebp
-       rol     ebx,            1
-       mov     ebp,            edi
-       mov     DWORD PTR 36[esp],ebx
-       or      ebp,            esi
-       lea     ebx,            DWORD PTR 2400959708[ecx*1+ebx]
-       mov     ecx,            edi
-       and     ebp,            eax
-       and     ecx,            esi
-       or      ebp,            ecx
-       mov     ecx,            edx
-       rol     ecx,            5
-       ror     edi,            1
-       add     ebp,            ecx
-       ror     edi,            1
-       add     ebx,            ebp
-       ; 40_59 57
-       ; 40_59 58
-       mov     ecx,            DWORD PTR 40[esp]
-       mov     ebp,            DWORD PTR 48[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 8[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       xor     ecx,            ebp
-       mov     ebp,            edx
-       rol     ecx,            1
-       or      ebp,            edi
-       mov     DWORD PTR 40[esp],ecx
-       and     ebp,            esi
-       lea     ecx,            DWORD PTR 2400959708[eax*1+ecx]
-       mov     eax,            edx
-       ror     edx,            1
-       and     eax,            edi
-       or      ebp,            eax
-       mov     eax,            ebx
-       rol     eax,            5
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 44[esp]
-       add     ecx,            ebp
-       mov     ebp,            DWORD PTR 52[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 12[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 32[esp]
-       ror     edx,            1
-       xor     eax,            ebp
-       rol     eax,            1
-       mov     ebp,            ebx
-       mov     DWORD PTR 44[esp],eax
-       or      ebp,            edx
-       lea     eax,            DWORD PTR 2400959708[esi*1+eax]
-       mov     esi,            ebx
-       and     ebp,            edi
-       and     esi,            edx
-       or      ebp,            esi
-       mov     esi,            ecx
-       rol     esi,            5
-       ror     ebx,            1
-       add     ebp,            esi
-       ror     ebx,            1
-       add     eax,            ebp
-       ; 40_59 59
-       ; 20_39 60
-       mov     esi,            DWORD PTR 48[esp]
-       mov     ebp,            DWORD PTR 56[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 16[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 36[esp]
-       xor     esi,            ebp
-       mov     ebp,            ecx
-       rol     esi,            1
-       xor     ebp,            ebx
-       mov     DWORD PTR 48[esp],esi
-       xor     ebp,            edx
-       lea     esi,            DWORD PTR 3395469782[edi*1+esi]
-       mov     edi,            eax
-       rol     edi,            5
-       ror     ecx,            1
-       add     edi,            ebp
-       ror     ecx,            1
-       add     esi,            edi
-       ; 20_39 61
-       mov     edi,            DWORD PTR 52[esp]
-       mov     ebp,            DWORD PTR 60[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 20[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 40[esp]
-       xor     edi,            ebp
-       mov     ebp,            eax
-       rol     edi,            1
-       xor     ebp,            ecx
-       mov     DWORD PTR 52[esp],edi
-       xor     ebp,            ebx
-       lea     edi,            DWORD PTR 3395469782[edx*1+edi]
-       mov     edx,            esi
-       rol     edx,            5
-       ror     eax,            1
-       add     edx,            ebp
-       ror     eax,            1
-       add     edi,            edx
-       ; 20_39 62
-       mov     edx,            DWORD PTR 56[esp]
-       mov     ebp,            DWORD PTR [esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 44[esp]
-       xor     edx,            ebp
-       mov     ebp,            esi
-       rol     edx,            1
-       xor     ebp,            eax
-       mov     DWORD PTR 56[esp],edx
-       xor     ebp,            ecx
-       lea     edx,            DWORD PTR 3395469782[ebx*1+edx]
-       mov     ebx,            edi
-       rol     ebx,            5
-       ror     esi,            1
-       add     ebx,            ebp
-       ror     esi,            1
-       add     edx,            ebx
-       ; 20_39 63
-       mov     ebx,            DWORD PTR 60[esp]
-       mov     ebp,            DWORD PTR 4[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 48[esp]
-       xor     ebx,            ebp
-       mov     ebp,            edi
-       rol     ebx,            1
-       xor     ebp,            esi
-       mov     DWORD PTR 60[esp],ebx
-       xor     ebp,            eax
-       lea     ebx,            DWORD PTR 3395469782[ecx*1+ebx]
-       mov     ecx,            edx
-       rol     ecx,            5
-       ror     edi,            1
-       add     ecx,            ebp
-       ror     edi,            1
-       add     ebx,            ecx
-       ; 20_39 64
-       mov     ecx,            DWORD PTR [esp]
-       mov     ebp,            DWORD PTR 8[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 32[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 52[esp]
-       xor     ecx,            ebp
-       mov     ebp,            edx
-       rol     ecx,            1
-       xor     ebp,            edi
-       mov     DWORD PTR [esp],ecx
-       xor     ebp,            esi
-       lea     ecx,            DWORD PTR 3395469782[eax*1+ecx]
-       mov     eax,            ebx
-       rol     eax,            5
-       ror     edx,            1
-       add     eax,            ebp
-       ror     edx,            1
-       add     ecx,            eax
-       ; 20_39 65
-       mov     eax,            DWORD PTR 4[esp]
-       mov     ebp,            DWORD PTR 12[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 36[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 56[esp]
-       xor     eax,            ebp
-       mov     ebp,            ebx
-       rol     eax,            1
-       xor     ebp,            edx
-       mov     DWORD PTR 4[esp],eax
-       xor     ebp,            edi
-       lea     eax,            DWORD PTR 3395469782[esi*1+eax]
-       mov     esi,            ecx
-       rol     esi,            5
-       ror     ebx,            1
-       add     esi,            ebp
-       ror     ebx,            1
-       add     eax,            esi
-       ; 20_39 66
-       mov     esi,            DWORD PTR 8[esp]
-       mov     ebp,            DWORD PTR 16[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 40[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 60[esp]
-       xor     esi,            ebp
-       mov     ebp,            ecx
-       rol     esi,            1
-       xor     ebp,            ebx
-       mov     DWORD PTR 8[esp],esi
-       xor     ebp,            edx
-       lea     esi,            DWORD PTR 3395469782[edi*1+esi]
-       mov     edi,            eax
-       rol     edi,            5
-       ror     ecx,            1
-       add     edi,            ebp
-       ror     ecx,            1
-       add     esi,            edi
-       ; 20_39 67
-       mov     edi,            DWORD PTR 12[esp]
-       mov     ebp,            DWORD PTR 20[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 44[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR [esp]
-       xor     edi,            ebp
-       mov     ebp,            eax
-       rol     edi,            1
-       xor     ebp,            ecx
-       mov     DWORD PTR 12[esp],edi
-       xor     ebp,            ebx
-       lea     edi,            DWORD PTR 3395469782[edx*1+edi]
-       mov     edx,            esi
-       rol     edx,            5
-       ror     eax,            1
-       add     edx,            ebp
-       ror     eax,            1
-       add     edi,            edx
-       ; 20_39 68
-       mov     edx,            DWORD PTR 16[esp]
-       mov     ebp,            DWORD PTR 24[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 48[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 4[esp]
-       xor     edx,            ebp
-       mov     ebp,            esi
-       rol     edx,            1
-       xor     ebp,            eax
-       mov     DWORD PTR 16[esp],edx
-       xor     ebp,            ecx
-       lea     edx,            DWORD PTR 3395469782[ebx*1+edx]
-       mov     ebx,            edi
-       rol     ebx,            5
-       ror     esi,            1
-       add     ebx,            ebp
-       ror     esi,            1
-       add     edx,            ebx
-       ; 20_39 69
-       mov     ebx,            DWORD PTR 20[esp]
-       mov     ebp,            DWORD PTR 28[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 52[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 8[esp]
-       xor     ebx,            ebp
-       mov     ebp,            edi
-       rol     ebx,            1
-       xor     ebp,            esi
-       mov     DWORD PTR 20[esp],ebx
-       xor     ebp,            eax
-       lea     ebx,            DWORD PTR 3395469782[ecx*1+ebx]
-       mov     ecx,            edx
-       rol     ecx,            5
-       ror     edi,            1
-       add     ecx,            ebp
-       ror     edi,            1
-       add     ebx,            ecx
-       ; 20_39 70
-       mov     ecx,            DWORD PTR 24[esp]
-       mov     ebp,            DWORD PTR 32[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 56[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 12[esp]
-       xor     ecx,            ebp
-       mov     ebp,            edx
-       rol     ecx,            1
-       xor     ebp,            edi
-       mov     DWORD PTR 24[esp],ecx
-       xor     ebp,            esi
-       lea     ecx,            DWORD PTR 3395469782[eax*1+ecx]
-       mov     eax,            ebx
-       rol     eax,            5
-       ror     edx,            1
-       add     eax,            ebp
-       ror     edx,            1
-       add     ecx,            eax
-       ; 20_39 71
-       mov     eax,            DWORD PTR 28[esp]
-       mov     ebp,            DWORD PTR 36[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 60[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 16[esp]
-       xor     eax,            ebp
-       mov     ebp,            ebx
-       rol     eax,            1
-       xor     ebp,            edx
-       mov     DWORD PTR 28[esp],eax
-       xor     ebp,            edi
-       lea     eax,            DWORD PTR 3395469782[esi*1+eax]
-       mov     esi,            ecx
-       rol     esi,            5
-       ror     ebx,            1
-       add     esi,            ebp
-       ror     ebx,            1
-       add     eax,            esi
-       ; 20_39 72
-       mov     esi,            DWORD PTR 32[esp]
-       mov     ebp,            DWORD PTR 40[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR [esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 20[esp]
-       xor     esi,            ebp
-       mov     ebp,            ecx
-       rol     esi,            1
-       xor     ebp,            ebx
-       mov     DWORD PTR 32[esp],esi
-       xor     ebp,            edx
-       lea     esi,            DWORD PTR 3395469782[edi*1+esi]
-       mov     edi,            eax
-       rol     edi,            5
-       ror     ecx,            1
-       add     edi,            ebp
-       ror     ecx,            1
-       add     esi,            edi
-       ; 20_39 73
-       mov     edi,            DWORD PTR 36[esp]
-       mov     ebp,            DWORD PTR 44[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 4[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       xor     edi,            ebp
-       mov     ebp,            eax
-       rol     edi,            1
-       xor     ebp,            ecx
-       mov     DWORD PTR 36[esp],edi
-       xor     ebp,            ebx
-       lea     edi,            DWORD PTR 3395469782[edx*1+edi]
-       mov     edx,            esi
-       rol     edx,            5
-       ror     eax,            1
-       add     edx,            ebp
-       ror     eax,            1
-       add     edi,            edx
-       ; 20_39 74
-       mov     edx,            DWORD PTR 40[esp]
-       mov     ebp,            DWORD PTR 48[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 8[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       xor     edx,            ebp
-       mov     ebp,            esi
-       rol     edx,            1
-       xor     ebp,            eax
-       mov     DWORD PTR 40[esp],edx
-       xor     ebp,            ecx
-       lea     edx,            DWORD PTR 3395469782[ebx*1+edx]
-       mov     ebx,            edi
-       rol     ebx,            5
-       ror     esi,            1
-       add     ebx,            ebp
-       ror     esi,            1
-       add     edx,            ebx
-       ; 20_39 75
-       mov     ebx,            DWORD PTR 44[esp]
-       mov     ebp,            DWORD PTR 52[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 12[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 32[esp]
-       xor     ebx,            ebp
-       mov     ebp,            edi
-       rol     ebx,            1
-       xor     ebp,            esi
-       mov     DWORD PTR 44[esp],ebx
-       xor     ebp,            eax
-       lea     ebx,            DWORD PTR 3395469782[ecx*1+ebx]
-       mov     ecx,            edx
-       rol     ecx,            5
-       ror     edi,            1
-       add     ecx,            ebp
-       ror     edi,            1
-       add     ebx,            ecx
-       ; 20_39 76
-       mov     ecx,            DWORD PTR 48[esp]
-       mov     ebp,            DWORD PTR 56[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 16[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 36[esp]
-       xor     ecx,            ebp
-       mov     ebp,            edx
-       rol     ecx,            1
-       xor     ebp,            edi
-       mov     DWORD PTR 48[esp],ecx
-       xor     ebp,            esi
-       lea     ecx,            DWORD PTR 3395469782[eax*1+ecx]
-       mov     eax,            ebx
-       rol     eax,            5
-       ror     edx,            1
-       add     eax,            ebp
-       ror     edx,            1
-       add     ecx,            eax
-       ; 20_39 77
-       mov     eax,            DWORD PTR 52[esp]
-       mov     ebp,            DWORD PTR 60[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 20[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 40[esp]
-       xor     eax,            ebp
-       mov     ebp,            ebx
-       rol     eax,            1
-       xor     ebp,            edx
-       mov     DWORD PTR 52[esp],eax
-       xor     ebp,            edi
-       lea     eax,            DWORD PTR 3395469782[esi*1+eax]
-       mov     esi,            ecx
-       rol     esi,            5
-       ror     ebx,            1
-       add     esi,            ebp
-       ror     ebx,            1
-       add     eax,            esi
-       ; 20_39 78
-       mov     esi,            DWORD PTR 56[esp]
-       mov     ebp,            DWORD PTR [esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 44[esp]
-       xor     esi,            ebp
-       mov     ebp,            ecx
-       rol     esi,            1
-       xor     ebp,            ebx
-       mov     DWORD PTR 56[esp],esi
-       xor     ebp,            edx
-       lea     esi,            DWORD PTR 3395469782[edi*1+esi]
-       mov     edi,            eax
-       rol     edi,            5
-       ror     ecx,            1
-       add     edi,            ebp
-       ror     ecx,            1
-       add     esi,            edi
-       ; 20_39 79
-       mov     edi,            DWORD PTR 60[esp]
-       mov     ebp,            DWORD PTR 4[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 48[esp]
-       xor     edi,            ebp
-       mov     ebp,            eax
-       rol     edi,            1
-       xor     ebp,            ecx
-       mov     DWORD PTR 60[esp],edi
-       xor     ebp,            ebx
-       lea     edi,            DWORD PTR 3395469782[edx*1+edi]
-       mov     edx,            esi
-       rol     edx,            5
-       add     edx,            ebp
-       mov     ebp,            DWORD PTR 128[esp]
-       ror     eax,            1
-       add     edi,            edx
-       ror     eax,            1
-       ; End processing
-       ; 
-       mov     edx,            DWORD PTR 12[ebp]
-       add     edx,            ecx
-       mov     ecx,            DWORD PTR 4[ebp]
-       add     ecx,            esi
-       mov     esi,            eax
-       mov     eax,            DWORD PTR [ebp]
-       mov     DWORD PTR 12[ebp],edx
-       add     eax,            edi
-       mov     edi,            DWORD PTR 16[ebp]
-       add     edi,            ebx
-       mov     ebx,            DWORD PTR 8[ebp]
-       add     ebx,            esi
-       mov     DWORD PTR [ebp],eax
-       mov     esi,            DWORD PTR 132[esp]
-       mov     DWORD PTR 8[ebp],ebx
-       add     esi,            64
-       mov     eax,            DWORD PTR 68[esp]
-       mov     DWORD PTR 16[ebp],edi
-       cmp     esi,            eax
-       mov     DWORD PTR 4[ebp],ecx
-       jl      L000start
-       add     esp,            108
-       pop     edi
-       pop     ebx
-       pop     ebp
-       pop     esi
-       ret
-_TEXT  SEGMENT
-PUBLIC _sha1_block_asm_host_order
-
-_sha1_block_asm_host_order PROC NEAR
-       mov     ecx,            DWORD PTR 12[esp]
-       push    esi
-       shl     ecx,            6
-       mov     esi,            DWORD PTR 12[esp]
-       push    ebp
-       add     ecx,            esi
-       push    ebx
-       mov     ebp,            DWORD PTR 16[esp]
-       push    edi
-       mov     edx,            DWORD PTR 12[ebp]
-       sub     esp,            108
-       mov     edi,            DWORD PTR 16[ebp]
-       mov     ebx,            DWORD PTR 8[ebp]
-       mov     DWORD PTR 68[esp],ecx
-       ; First we need to setup the X array
-       mov     eax,            DWORD PTR [esi]
-       mov     ecx,            DWORD PTR 4[esi]
-       mov     DWORD PTR [esp],eax
-       mov     DWORD PTR 4[esp],ecx
-       mov     eax,            DWORD PTR 8[esi]
-       mov     ecx,            DWORD PTR 12[esi]
-       mov     DWORD PTR 8[esp],eax
-       mov     DWORD PTR 12[esp],ecx
-       mov     eax,            DWORD PTR 16[esi]
-       mov     ecx,            DWORD PTR 20[esi]
-       mov     DWORD PTR 16[esp],eax
-       mov     DWORD PTR 20[esp],ecx
-       mov     eax,            DWORD PTR 24[esi]
-       mov     ecx,            DWORD PTR 28[esi]
-       mov     DWORD PTR 24[esp],eax
-       mov     DWORD PTR 28[esp],ecx
-       mov     eax,            DWORD PTR 32[esi]
-       mov     ecx,            DWORD PTR 36[esi]
-       mov     DWORD PTR 32[esp],eax
-       mov     DWORD PTR 36[esp],ecx
-       mov     eax,            DWORD PTR 40[esi]
-       mov     ecx,            DWORD PTR 44[esi]
-       mov     DWORD PTR 40[esp],eax
-       mov     DWORD PTR 44[esp],ecx
-       mov     eax,            DWORD PTR 48[esi]
-       mov     ecx,            DWORD PTR 52[esi]
-       mov     DWORD PTR 48[esp],eax
-       mov     DWORD PTR 52[esp],ecx
-       mov     eax,            DWORD PTR 56[esi]
-       mov     ecx,            DWORD PTR 60[esi]
-       mov     DWORD PTR 56[esp],eax
-       mov     DWORD PTR 60[esp],ecx
-       jmp     L001shortcut
-_sha1_block_asm_host_order ENDP
-_TEXT  ENDS
-_sha1_block_asm_data_order ENDP
-_TEXT  ENDS
-END
index 48d9192..09df993 100644 (file)
@@ -392,7 +392,7 @@ sub sha1_block_data
        &X_expand("esi");
         &mov(&wparam(1),"esi");
 
-       &set_label("shortcut", 1);
+       &set_label("shortcut", 0, 1);
        &comment("");
        &comment("Start processing");
 
index 3e6f489..2f8aef8 100644 (file)
 # error "Either SHA_0 or SHA_1 must be defined."
 #endif
 
-#ifndef FLAT_INC
-#include "../md32_common.h"
-#else
 #include "md32_common.h"
-#endif
 
 #define INIT_DATA_h0 0x67452301UL
 #define INIT_DATA_h1 0xefcdab89UL
index e3818ef..f611d6b 100644 (file)
@@ -2227,3 +2227,6 @@ BIO_callback_ctrl                       2252
 RAND_egd                                2253
 RAND_status                             2254
 bn_dump1                                2255
+des_check_key_parity                    2256
+lh_num_items                            2257
+RAND_event                              2258
index 6fbf3ce..100d76f 100644 (file)
@@ -8,6 +8,7 @@
 $INSTALLTOP="/usr/local/ssl";
 $OPTIONS="";
 $ssl_version="";
+$banner="\t\@echo Building OpenSSL";
 
 open(IN,"<Makefile.ssl") || die "unable to open Makefile.ssl!\n";
 while(<IN>) {
@@ -59,6 +60,7 @@ and [options] can be one of
        just-ssl                                - remove all non-ssl keys/digest
        no-asm                                  - No x86 asm
        nasm                                    - Use NASM for x86 asm
+       gaswin                                  - Use GNU as with Mingw32
        no-socks                                - No socket code
        no-err                                  - No error strings
        dll/shlib                               - Build shared libraries (MS)
@@ -850,6 +852,7 @@ sub read_options
        elsif (/^no-hmac$/)     { $no_hmac=1; }
        elsif (/^no-asm$/)      { $no_asm=1; }
        elsif (/^nasm$/)        { $nasm=1; }
+       elsif (/^gaswin$/)      { $gaswin=1; }
        elsif (/^no-ssl2$/)     { $no_ssl2=1; }
        elsif (/^no-ssl3$/)     { $no_ssl3=1; }
        elsif (/^no-err$/)      { $no_err=1; }
index ebc059e..8e18f3c 100644 (file)
@@ -284,6 +284,17 @@ EOF
 
        # Rewrite the C source file containing the error details.
 
+       # First, read any existing reason string definitions:
+       my %err_reason_strings;
+       if (open(IN,"<$cfile")) {
+               while (<IN>) {
+                       if (/\b(${lib}_R_\w*)\b.*\"(.*)\"/) {
+                               $err_reason_strings{$1} = $2;
+                       }
+               }
+               close(IN);
+       }
+
        my $hincf;
        if($static) {
                $hfile =~ /([^\/]+)$/;
@@ -352,7 +363,8 @@ EOF
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
@@ -385,9 +397,13 @@ EOF
        foreach $i (@reasons) {
                my $rn;
                my $nspc = 0;
-               $i =~ /^${lib}_R_(\S+)$/;
-               $rn = $1;
-               $rn =~ tr/_[A-Z]/ [a-z]/;
+               if (exists $err_reason_strings{$i}) {
+                       $rn = $err_reason_strings{$i};
+               } else {
+                       $i =~ /^${lib}_R_(\S+)$/;
+                       $rn = $1;
+                       $rn =~ tr/_[A-Z]/ [a-z]/;
+               }
                $nspc = 40 - length($i) unless length($i) > 40;
                $nspc = " " x $nspc;
                print OUT "{${i}${nspc},\"$rn\"},\n";
@@ -465,7 +481,7 @@ EOF
 }
 
        close OUT;
-
+       undef %err_reason_strings;
 }
 
 if($debug && defined(%notrans)) {
index df6e2c7..7f57809 100644 (file)
@@ -109,7 +109,7 @@ sub do_lib_rule
                {
                #               $ret.="\t\$(RM) \$(O_$Name)\n";
                $ret.="\techo LIB $<\n";    
-               $ret.="\t\$(MKLIB) $lfile$target  \$(addprefix +, $objs)\n";
+                $ret.="\t&\$(MKLIB) $lfile$target -+\$**\n";
                }
        else
                {
index 585cacd..c687d9b 100644 (file)
@@ -21,6 +21,30 @@ if ($debug)
 else
        { $cflags="-DL_ENDIAN -fomit-frame-pointer -O3 -m486 -Wall"; }
 
+if ($gaswin and !$no_asm)
+       {
+        $bn_asm_obj='$(OBJ_D)/bn-win32.o';
+        $bn_asm_src='crypto/bn/asm/bn-win32.s';
+        $des_enc_obj='$(OBJ_D)/d-win32.o $(OBJ_D)/y-win32.o';
+        $des_enc_src='crypto/des/asm/d-win32.s crypto/des/asm/y-win32.s';
+        $bf_enc_obj='$(OBJ_D)/b-win32.o';
+        $bf_enc_src='crypto/bf/asm/b-win32.s';
+#       $cast_enc_obj='$(OBJ_D)/c-win32.o';
+#       $cast_enc_src='crypto/cast/asm/c-win32.s';
+        $rc4_enc_obj='$(OBJ_D)/r4-win32.o';
+        $rc4_enc_src='crypto/rc4/asm/r4-win32.s';
+        $rc5_enc_obj='$(OBJ_D)/r5-win32.o';
+        $rc5_enc_src='crypto/rc5/asm/r5-win32.s';
+        $md5_asm_obj='$(OBJ_D)/m5-win32.o';
+        $md5_asm_src='crypto/md5/asm/m5-win32.s';
+        $rmd160_asm_obj='$(OBJ_D)/rm-win32.o';
+        $rmd160_asm_src='crypto/ripemd/asm/rm-win32.s';
+        $sha1_asm_obj='$(OBJ_D)/s1-win32.o';
+        $sha1_asm_src='crypto/sha/asm/s1-win32.s';
+       $cflags.=" -DBN_ASM -DMD5_ASM -DSHA1_ASM";
+       }
+
+
 $obj='.o';
 $ofile='-o ';
 
@@ -76,4 +100,3 @@ sub do_link_rule
        return($ret);
        }
 1;
-
index 91e962a..04b4425 100644 (file)
@@ -25,7 +25,7 @@ open(OUT,">$report") or die;
 print OUT "OpenSSL self-test report:\n\n";
 
 $uname=`uname -a`;
-$uname="??" if $uname eq "";
+$uname="??\n" if $uname eq "";
 
 $c=`sh config -t`;
 foreach $_ (split("\n",$c)) {
@@ -83,6 +83,11 @@ if (open(TEST,">cctest.c")) {
        print OUT "Compiler doesn't work.\n";
        goto err;
     }
+    system("ar r cctest.a /dev/null");
+    if (not -f "cctest.a") {
+       print OUT "Check your archive tool (ar).\n";
+       goto err;
+    }
 } else {
     print OUT "Can't create cctest.c\n";
 }
@@ -129,14 +134,14 @@ if (/no-/)
 }
 
 print "Running make test...\n";
-if (system("make test 2>&1 | tee make.log") > 255)
+if (system("make test 2>&1 | tee maketest.log") > 255)
  {
     print OUT "make test failed!\n";
 } else {
     $ok=1;
 }
 
-if ($ok and open(IN,"<make.log")) {
+if ($ok and open(IN,"<maketest.log")) {
     while (<IN>) {
        $ok=2 if /^platform: $platform/;
     }
@@ -155,6 +160,15 @@ if ($ok != 2) {
     } else {
        print OUT "make.log not found!\n";
     }
+    if (open(IN,"<maketest.log")) {
+       while (<IN>) {
+           print OUT;
+       }
+       close(IN);
+       print OUT $sep;
+    } else {
+       print OUT "maketest.log not found!\n";
+    }
 } else {
     print OUT "Test passed.\n";
 }
index 34c2c9f..e69de29 100644 (file)
@@ -1,34 +0,0 @@
-#!/bin/sh
-
-cwd=`pwd`
-/bin/rm -fr tmp/*
-
-cd crypto/des
-make -f Makefile.uni tar
-make -f Makefile.uni tar_lit
-/bin/mv libdes.tgz $cwd/tmp
-/bin/mv libdes-l.tgz $cwd/tmp
-cd $cwd
-
-for name in md5 sha cast bf idea rc4 rc2
-do
-       echo doing $name
-       (cd crypto; tar cfh - $name)|(cd tmp; tar xf -)
-       cd tmp/$name
-       /bin/rm -f Makefile
-       /bin/rm -f Makefile.ssl
-       /bin/rm -f Makefile.ssl.orig
-       /bin/rm -f *.old
-       /bin/mv Makefile.uni Makefile
-
-       if [ -d asm ]; then
-               mkdir asm/perlasm
-               cp $cwd/crypto/perlasm/*.pl asm/perlasm
-       fi
-       cd ..
-       tar cf - $name|gzip >$name.tgz
-#      /bin/rm -fr $name
-       cd $cwd
-done
-
-
index d3336d9..0192272 100644 (file)
@@ -284,7 +284,9 @@ DECLARE_STACK_OF(X509_TRUST)
 
 /* standard trust ids */
 
-#define X509_TRUST_ANY         1
+#define X509_TRUST_DEFAULT     -1      /* Only valid in purpose settings */
+
+#define X509_TRUST_COMPAT      1
 #define X509_TRUST_SSL_CLIENT  2
 #define X509_TRUST_SSL_SERVER  3
 #define X509_TRUST_EMAIL       4
index fdedbda..848add5 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index 9f7d679..c779aaf 100644 (file)
@@ -65,7 +65,7 @@ static int tr_cmp(X509_TRUST **a, X509_TRUST **b);
 static void trtable_free(X509_TRUST *p);
 
 static int trust_1oidany(X509_TRUST *trust, X509 *x, int flags);
-static int trust_any(X509_TRUST *trust, X509 *x, int flags);
+static int trust_compat(X509_TRUST *trust, X509 *x, int flags);
 
 static int obj_trust(int id, X509 *x, int flags);
 static int (*default_trust)(int id, X509 *x, int flags) = obj_trust;
@@ -76,7 +76,7 @@ static int (*default_trust)(int id, X509 *x, int flags) = obj_trust;
  */
 
 static X509_TRUST trstandard[] = {
-{X509_TRUST_ANY, 0, trust_any, "Any", 0, NULL},
+{X509_TRUST_COMPAT, 0, trust_compat, "compatible", 0, NULL},
 {X509_TRUST_SSL_CLIENT, 0, trust_1oidany, "SSL Client", NID_client_auth, NULL},
 {X509_TRUST_SSL_SERVER, 0, trust_1oidany, "SSL Client", NID_server_auth, NULL},
 {X509_TRUST_EMAIL, 0, trust_1oidany, "S/MIME email", NID_email_protect, NULL},
@@ -107,8 +107,8 @@ int X509_check_trust(X509 *x, int id, int flags)
        X509_TRUST *pt;
        int idx;
        if(id == -1) return 1;
-       if(!(idx = X509_TRUST_get_by_id(id)))
-                       return default_trust(id, x, flags);
+       idx = X509_TRUST_get_by_id(id);
+       if(idx == -1) return default_trust(id, x, flags);
        pt = X509_TRUST_get0(idx);
        return pt->check_trust(pt, x, flags);
 }
@@ -230,6 +230,11 @@ static int trust_1oidany(X509_TRUST *trust, X509 *x, int flags)
        /* we don't have any trust settings: for compatibility
         * we return trusted if it is self signed
         */
+       return trust_compat(trust, x, flags);
+}
+
+static int trust_compat(X509_TRUST *trust, X509 *x, int flags)
+{
        X509_check_purpose(x, -1, 0);
        if(x->ex_flags & EXFLAG_SS) return X509_TRUST_TRUSTED;
        else return X509_TRUST_UNTRUSTED;
@@ -257,7 +262,3 @@ static int obj_trust(int id, X509 *x, int flags)
        return X509_TRUST_UNTRUSTED;
 }
 
-static int trust_any(X509_TRUST *trust, X509 *x, int flags)
-{
-       return X509_TRUST_TRUSTED;
-}
index 4fdff54..3ddb230 100644 (file)
@@ -436,11 +436,14 @@ static int internal_verify(X509_STORE_CTX *ctx)
                                }
                        if (X509_verify(xs,pkey) <= 0)
                                {
-                               EVP_PKEY_free(pkey);
                                ctx->error=X509_V_ERR_CERT_SIGNATURE_FAILURE;
                                ctx->current_cert=xs;
                                ok=(*cb)(0,ctx);
-                               if (!ok) goto end;
+                               if (!ok)
+                                       {
+                                       EVP_PKEY_free(pkey);
+                                       goto end;
+                                       }
                                }
                        EVP_PKEY_free(pkey);
                        pkey=NULL;
@@ -768,18 +771,25 @@ int X509_STORE_CTX_purpose_inherit(X509_STORE_CTX *ctx, int def_purpose,
        if(!purpose) purpose = def_purpose;
        /* If we have a purpose then check it is valid */
        if(purpose) {
+               X509_PURPOSE *ptmp;
                idx = X509_PURPOSE_get_by_id(purpose);
                if(idx == -1) {
                        X509err(X509_F_X509_STORE_CTX_PURPOSE_INHERIT,
                                                X509_R_UNKNOWN_PURPOSE_ID);
                        return 0;
                }
-               /* If trust not set then get from purpose default */
-               if(!trust) {
-                       X509_PURPOSE *ptmp;
+               ptmp = X509_PURPOSE_get0(idx);
+               if(ptmp->trust == X509_TRUST_DEFAULT) {
+                       idx = X509_PURPOSE_get_by_id(def_purpose);
+                       if(idx == -1) {
+                               X509err(X509_F_X509_STORE_CTX_PURPOSE_INHERIT,
+                                               X509_R_UNKNOWN_PURPOSE_ID);
+                               return 0;
+                       }
                        ptmp = X509_PURPOSE_get0(idx);
-                       trust = ptmp->trust;
                }
+               /* If trust not set then get from purpose default */
+               if(!trust) trust = ptmp->trust;
        }
        if(trust) {
                idx = X509_TRUST_get_by_id(trust);
index cf2382d..4c20e03 100644 (file)
@@ -352,7 +352,7 @@ int X509_NAME_ENTRY_set_data(X509_NAME_ENTRY *ne, int type,
        int i;
 
        if ((ne == NULL) || ((bytes == NULL) && (len != 0))) return(0);
-       if(type & MBSTRING_FLAG
+       if((type > 0) && (type & MBSTRING_FLAG)
                return ASN1_STRING_set_by_NID(&ne->value, bytes,
                                                len, type,
                                        OBJ_obj2nid(ne->object)) ? 1 : 0;
index b7494eb..5594a1d 100644 (file)
@@ -71,6 +71,7 @@ static int purpose_smime(X509 *x, int ca);
 static int check_purpose_smime_sign(X509_PURPOSE *xp, X509 *x, int ca);
 static int check_purpose_smime_encrypt(X509_PURPOSE *xp, X509 *x, int ca);
 static int check_purpose_crl_sign(X509_PURPOSE *xp, X509 *x, int ca);
+static int no_check(X509_PURPOSE *xp, X509 *x, int ca);
 
 static int xp_cmp(X509_PURPOSE **a, X509_PURPOSE **b);
 static void xptable_free(X509_PURPOSE *p);
@@ -81,7 +82,8 @@ static X509_PURPOSE xstandard[] = {
        {X509_PURPOSE_NS_SSL_SERVER, X509_TRUST_SSL_SERVER, 0, check_purpose_ns_ssl_server, "Netscape SSL server", "nssslserver", NULL},
        {X509_PURPOSE_SMIME_SIGN, X509_TRUST_EMAIL, 0, check_purpose_smime_sign, "S/MIME signing", "smimesign", NULL},
        {X509_PURPOSE_SMIME_ENCRYPT, X509_TRUST_EMAIL, 0, check_purpose_smime_encrypt, "S/MIME encryption", "smimeencrypt", NULL},
-       {X509_PURPOSE_CRL_SIGN, X509_TRUST_ANY, 0, check_purpose_crl_sign, "CRL signing", "crlsign", NULL},
+       {X509_PURPOSE_CRL_SIGN, X509_TRUST_COMPAT, 0, check_purpose_crl_sign, "CRL signing", "crlsign", NULL},
+       {X509_PURPOSE_ANY, X509_TRUST_DEFAULT, 0, no_check, "Any Purpose", "any", NULL},
 };
 
 #define X509_PURPOSE_COUNT (sizeof(xstandard)/sizeof(X509_PURPOSE))
@@ -454,3 +456,8 @@ static int check_purpose_crl_sign(X509_PURPOSE *xp, X509 *x, int ca)
        if(ku_reject(x, KU_CRL_SIGN)) return 0;
        return 1;
 }
+
+static int no_check(X509_PURPOSE *xp, X509 *x, int ca)
+{
+       return 1;
+}
index b7d4e35..aa4a605 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index fe01755..96ceb7c 100644 (file)
@@ -179,8 +179,8 @@ union {
 } GENERAL_NAME;
 
 typedef struct ACCESS_DESCRIPTION_st {
-ASN1_OBJECT *method;
-GENERAL_NAME *location;
+       ASN1_OBJECT *method;
+       GENERAL_NAME *location;
 } ACCESS_DESCRIPTION;
 
 DECLARE_STACK_OF(GENERAL_NAME)
@@ -344,9 +344,10 @@ typedef struct x509_purpose_st {
 #define X509_PURPOSE_SMIME_SIGN                4
 #define X509_PURPOSE_SMIME_ENCRYPT     5
 #define X509_PURPOSE_CRL_SIGN          6
+#define X509_PURPOSE_ANY               7
 
 #define X509_PURPOSE_MIN               1
-#define X509_PURPOSE_MAX               6
+#define X509_PURPOSE_MAX               7
 
 DECLARE_STACK_OF(X509_PURPOSE)
 
index 279d2c0..0c8f551 100644 (file)
@@ -772,6 +772,8 @@ static int ssl3_get_server_certificate(SSL *s)
        s->session->sess_cert=sc;
 
        sc->cert_chain=sk;
+       /* Inconsistency alert: cert_chain does include the peer's
+        * certificate, which we don't include in s3_srvr.c */
        x=sk_X509_value(sk,0);
        sk=NULL;
 
index c4b49aa..7ada26c 100644 (file)
@@ -771,14 +771,16 @@ long ssl3_ctrl(SSL *s, int cmd, long larg, char *parg)
        case SSL_CTRL_SET_TMP_RSA:
                {
                        RSA *rsa = (RSA *)parg;
-                       if (rsa == NULL) {
+                       if (rsa == NULL)
+                               {
                                SSLerr(SSL_F_SSL3_CTRL, ERR_R_PASSED_NULL_PARAMETER);
                                return(ret);
-                       }
-                       if ((rsa = RSAPrivateKey_dup(rsa)) == NULL) {
+                               }
+                       if ((rsa = RSAPrivateKey_dup(rsa)) == NULL)
+                               {
                                SSLerr(SSL_F_SSL3_CTRL, ERR_R_RSA_LIB);
                                return(ret);
-                       }
+                               }
                        if (s->cert->rsa_tmp != NULL)
                                RSA_free(s->cert->rsa_tmp);
                        s->cert->rsa_tmp = rsa;
@@ -796,19 +798,25 @@ long ssl3_ctrl(SSL *s, int cmd, long larg, char *parg)
        case SSL_CTRL_SET_TMP_DH:
                {
                        DH *dh = (DH *)parg;
-                       if (dh == NULL) {
+                       if (dh == NULL)
+                               {
                                SSLerr(SSL_F_SSL3_CTRL, ERR_R_PASSED_NULL_PARAMETER);
                                return(ret);
-                       }
-                       if ((dh = DHparams_dup(dh)) == NULL) {
-                               SSLerr(SSL_F_SSL3_CTRL, ERR_R_DH_LIB);
-                               return(ret);
-                       }
-                       if (!DH_generate_key(dh)) {
-                               DH_free(dh);
+                               }
+                       if ((dh = DHparams_dup(dh)) == NULL)
+                               {
                                SSLerr(SSL_F_SSL3_CTRL, ERR_R_DH_LIB);
                                return(ret);
-                       }
+                               }
+                       if (!(s->options & SSL_OP_SINGLE_DH_USE))
+                               {
+                               if (!DH_generate_key(dh))
+                                       {
+                                       DH_free(dh);
+                                       SSLerr(SSL_F_SSL3_CTRL, ERR_R_DH_LIB);
+                                       return(ret);
+                                       }
+                               }
                        if (s->cert->dh_tmp != NULL)
                                DH_free(s->cert->dh_tmp);
                        s->cert->dh_tmp = dh;
@@ -843,8 +851,8 @@ long ssl3_callback_ctrl(SSL *s, int cmd, void (*fp)())
                0)
                {
                if (!ssl_cert_inst(&s->cert))
-                       {
-                       SSLerr(SSL_F_SSL3_CTRL, ERR_R_MALLOC_FAILURE);
+                       {
+                       SSLerr(SSL_F_SSL3_CALLBACK_CTRL, ERR_R_MALLOC_FAILURE);
                        return(0);
                        }
                }
@@ -929,23 +937,26 @@ long ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, char *parg)
        case SSL_CTRL_SET_TMP_DH:
                {
                DH *new=NULL,*dh;
-               int rret=0;
 
                dh=(DH *)parg;
-               if (    ((new=DHparams_dup(dh)) == NULL) ||
-                       (!DH_generate_key(new)))
+               if ((new=DHparams_dup(dh)) == NULL)
                        {
                        SSLerr(SSL_F_SSL3_CTX_CTRL,ERR_R_DH_LIB);
-                       if (new != NULL) DH_free(new);
+                       return 0;
                        }
-               else
+               if (!(ctx->options & SSL_OP_SINGLE_DH_USE))
                        {
-                       if (cert->dh_tmp != NULL)
-                               DH_free(cert->dh_tmp);
-                       cert->dh_tmp=new;
-                       rret=1;
+                       if (!DH_generate_key(new))
+                               {
+                               SSLerr(SSL_F_SSL3_CTX_CTRL,ERR_R_DH_LIB);
+                               DH_free(new);
+                               return 0;
+                               }
                        }
-               return(rret);
+               if (cert->dh_tmp != NULL)
+                       DH_free(cert->dh_tmp);
+               cert->dh_tmp=new;
+               return 1;
                }
                /*break; */
        case SSL_CTRL_SET_TMP_DH_CB:
index 90806e2..e23ca20 100644 (file)
@@ -1698,6 +1698,8 @@ static int ssl3_get_client_certificate(SSL *s)
        if (s->session->sess_cert->cert_chain != NULL)
                sk_X509_pop_free(s->session->sess_cert->cert_chain, X509_free);
        s->session->sess_cert->cert_chain=sk;
+       /* Inconsistency alert: cert_chain does *not* include the
+        * peer's own certificate, while we do include it in s3_clnt.c */
 
        sk=NULL;
 
index ed8e1cc..d62dc50 100644 (file)
@@ -19,6 +19,7 @@
  *                             are installed!  Use the AppleScript applet in the "openssl-0.9.4" folder to do this!
  */
 /* modified to seed the PRNG */
+/* modified to use CRandomizer for seeding */
 
 
 //     Include some funky libs I've developed over time
 #include "CPStringUtils.hpp"
 #include "ErrorHandling.hpp"
 #include "MacSocket.h"
-
+#include "Randomizer.h"
 
 //     We use the OpenSSL implementation of SSL....
 //     This was a lot of work to finally get going, though you wouldn't know it by the results!
 
 #include <openssl/ssl.h>
 #include <openssl/err.h>
-#include <openssl/rand.h>
 
 #include <timer.h>
 
 
 OSErr MyMacSocket_IdleWaitCallback(void *inUserRefPtr);
 
-
-
-
-
 //     My idle-wait callback.  Doesn't do much, does it?  Silly cooperative multitasking.
 
 OSErr MyMacSocket_IdleWaitCallback(void *inUserRefPtr)
@@ -59,31 +55,33 @@ OSErr MyMacSocket_IdleWaitCallback(void *inUserRefPtr)
 #pragma unused(inUserRefPtr)
 
 EventRecord            theEvent;
-
        ::EventAvail(everyEvent,&theEvent);
+       
+       CRandomizer *randomizer = (CRandomizer*)inUserRefPtr;
+       if (randomizer)
+               randomizer->PeriodicAction();
 
        return(noErr);
 }
 
 
-
 //     Finally!
 
 void main(void)
 {
-OSErr                          errCode;
-int                                    theSocket = -1;
-int                                    theTimeout = 30;
+       OSErr                           errCode;
+       int                                     theSocket = -1;
+       int                                     theTimeout = 30;
 
-SSL_CTX                                *ssl_ctx = nil;
-SSL                                    *ssl = nil;
+       SSL_CTX                         *ssl_ctx = nil;
+       SSL                                     *ssl = nil;
 
-char                           tempString[256];
-UnsignedWide           microTickCount;
-       
-#warning   -- USE A TRUE RANDOM SEED, AND ADD ENTROPY WHENEVER POSSIBLE. --
-const char seed[] = "uyq9,7-b(VHGT^%$&^F/,876;,;./lkJHGFUY{PO*";       // Just gobbledygook
+       char                            tempString[256];
+       UnsignedWide            microTickCount;
 
+
+       CRandomizer randomizer;
+       
        printf("OpenSSL Demo by Roy Wood, roy@centricsystems.ca\n\n");
        
        BailIfError(errCode = MacSocket_Startup());
@@ -92,7 +90,7 @@ const char seed[] = "uyq9,7-b(VHGT^%$&^F/,876;,;./lkJHGFUY{PO*";      // Just gobbled
 
        //      Create a socket-like object
        
-       BailIfError(errCode = MacSocket_socket(&theSocket,false,theTimeout * 60,MyMacSocket_IdleWaitCallback,nil));
+       BailIfError(errCode = MacSocket_socket(&theSocket,false,theTimeout * 60,MyMacSocket_IdleWaitCallback,&randomizer));
 
        
        //      Set up the connect string and try to connect
@@ -118,10 +116,6 @@ const char seed[] = "uyq9,7-b(VHGT^%$&^F/,876;,;./lkJHGFUY{PO*";   // Just gobbled
 //     ssl_ctx = SSL_CTX_new(SSLv3_client_method());
                        
 
-       RAND_seed (seed, sizeof (seed));
-       Microseconds (&microTickCount);
-       RAND_add (&microTickCount, sizeof (microTickCount), 0);         // Entropy is actually > 0, needs an estimate
-
        //      Create an SSL thingey and try to negotiate the connection
        
        ssl = SSL_new(ssl_ctx);
index 2efa49a..c357ea5 100644 (file)
@@ -1,7 +1,7 @@
 (This file must be converted with BinHex 4.0)
 
-:#dp`C@j68d`ZE@0`!%e08(*$9dP&!!!!!j)H!!!!!)X-Bfp[E!!!!!-!!!%S!!0
-ipJ!$HKi!!"J!!!!"!!%#!3!!!!!!!!!!!%0[C'9ABA*bD@pb)&"bEfTPBh3!!!!
+:#dp`C@j68d`ZE@0`!%e08(*$9dP&!!!!!jeU!!!!!0U2Bfp[E!!!!!-!!!%S!!1
+%3J!$K@S!!"J!!!!"!!%#!3!!!!!!!!!!!%0[C'9ABA*bD@pb)&"bEfTPBh3!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -299,38 +299,38 @@ MAhGbDA3ZB`"`09pMFR"d,Q-!F$9IBh*`G$)ZB`"`-6*IER"KFbjM!("V0epKG(4
 b,Q-!F'XhAfeTE@8ZB`"`DcGIFfeTE@8ZB`"bFf&IBfKV,Q-!FR0KAfjeE'`ZB`"
 MGQ9bFfP[ELjM!%038h4bD@jR9A4TE(-ZBh"`!%9bFQpb5'&ZC'aTEQFZBh"`!%G
 PG%K89&"6,Q0`F!"0B@06Ef0VCA3ZBh"`!'ePE9pNBQFZB`"36&0dFQPZCdCeEQ0
-c8&"$,QaTBJ"LEPpMG(JZB`"bB@jNAf9bFLjM!(J!BA"`FbjM!'&`F&pbB@jN,Q-
-!BA0Z-A"KFR-ZB`"MB5jM!'0TF'KPFR-ZB`"MFQ`ZB`"MFQ`bF$FZB`"NCh0d,Q-
-!C'JZB`"NFf%ZB`"NFf&`BA*KE5jM!'9ZBbjM!'9bFR0dFLjM!'GPEQ4S,Q-!Cf9
-ZC(0K,Q-!Cf9ZFR0K,Q-!ER0PF5jM!'p`C@jcFf`ZB`"`Df0c-6)ZB`"`Df0c0bj
-M!("VBh-i,Q-!FQ9a,Q-!FR0K,Q-!Ff9cFepTC#jM!(0YD@eP,Q-!Fh"PC@3ZB`"
-cF'YKBbjM!(0IBf)ZB`"cAf0XD@9ZG#jM!(0IFf9bGQ9b,Q-!FepcEf0VCA3ZB`"
-fCA*TCRNZB`"fCA*cD@pZ,Q-!H$8`15jM!(0IG'PYC5jM!%G98dPI5@jTG#jMF(!
-!4e9659p$Eh*P,P"33bj-D@)!4e9659p08d`Z8&"$,NaTBJ"(990*Ae0*6e9B,P"
-33bj-D@)!6'PL8e0-,P"33bj-D@)!6'PL3h*jF(4[,P"33bj-D@)!6@&M6e-ZE'P
-L!%e66#"5G@jdD@eP0MK,,NaTBJ"2F'9Z9("d5@jPG#j[!%p`C@j8FQ&ZFh"[FR3
-ZE`"2F'9Z9(*KER0`Eh*d3A"`,Qm!690-)&0*6e9B,MBi5bj-D@)!690-)%-Z0MK
-,)%CK+$4TAcKN+5j-D@)!6@&dD%aTBMBi5b"'B5JdD9miC#NZ6'PL!%CTFR0d)&0
-PCfePER3!4e9659p$Eh*P,MBi5bj-D@)!4e9659p08d`Z0MK,,NaTBJ"(990*Ae0
-*6e9B,MBi5bj-D@)!6'PL3h*jF(4[,MBiDb"'B5JdD9miC#NZ6'PL!%aTBP066#i
-f1%XJ4Q%S0'PI1'3T,NaTBJ"(CA4)9&438b"38%-!6h"PEP066#"38%-!4f9d5&4
-88&-J0MK,!%aTBP066#!f1%X!6h"PEP066#!f1'X!6'PL8e0-)&"33`"-D@*$FRP
-`G'mJ8&"$!%aTBN0bHA"dEb!f1%X!1NGPG%K89&"6+&"33bN!6'PL)%PYF'pbG#"
-38%-!3Q&XE'p[EL")C@a`!%eA)%-[3bXV)&"33`"(B@eP3fpNC5"$EfjfCA*dCA)
-!4QaPH#"3FQ9`FQpMCA0cEh)!69FJ8'&cBf&X)&"33`"5CAS!8&"$3A0Y!%*TFfp
-Z)&"bCA"bEf0PFh0[FJ"B3dp'4L"*EA"[FR3J8&"$!&"&4L"*EA"[FR3J8&"$!$T
-2F'9Z8e0-!$T(CA4)9&438bJf1%XT!%aTBL"*EA"[FR3J0MK,!%e39b"*EA"[FR3
-J0MK,!%eA)%-[3bXV)$Bi5`"09b"3BA0MB@`J0MK,!&"&4L"*EA"[FR3J0MK,!$T
--D@*68d`Z0MK,)%CK+$4TAcKN+5j-D@)!1Np`C@j68d`S0MKV+3!k6'PL8e0-,P"
-33bj-D@)!1NaTBN0bHA"dEbj38%-Z6'PL!$T-D@*$FRP`G'mZ0MKV)%CK+$4TAcK
-N+5j-D@)!6@&M6e-J8&"$)%aTEQYPFJ"0B@028b!f1%XJ6'PZDf9b!&0[GA*MC5"
-8FQ9PF`"$GA0dEfdJ5f9jGfpbC(-!3@0MCA0c)&"KG'Kc!&4KFQGPG#"6CA4dD@j
-RF`"'D@aP)%eKF("TEQGc!%*eD@aN)%9iG(*KF`"%C@*eCfGPFL"5G@jdD@eP!%4
-PBR9RCf9b)&4KFQGPG!"$,d-V+b"$Efe`D@aPFJ"$,d-V+b"ABA*ZD@jRF`"38%-
-J3fpNC8GPEJ"38%-J4'PcBA0cC@eLE'9b!&"33b"(E'pLB@`J6h"dD@eTHQ9b!&"
-33b"-D@jVCA)!8&"$)&"&4J"38%-J8(*[DQ9MG!"38%0"FfdJ8'&ZC@`!8Q9k)%0
-[EA"TE'9b!$Bi5b"$Ef4P4f9Z!$Bi5b"%DA0KFh0PE@*XCA)!0MK,)%GXEf*KE#"
-2F(4TE@PkCA)!0MK,)%aTEQYPFJ!f1%XJ8(*[DQ9MG!"$4Ndf1%X!!!!!!!!!!!!
+c8&"$,QaTBJ"LEPpMG(JZB`"bB@jNAf9bFLjM!&*KEQ4[E@PkCA)ZBh"`!(J!BA"
+`FbjM!'&`F&pbB@jN,Q-!BA0Z-A"KFR-ZB`"MB5jM!'0TF'KPFR-ZB`"MFQ`ZB`"
+MFQ`bF$FZB`"NCh0d,Q-!C'JZB`"NFf%ZB`"NFf&`BA*KE5jM!'9ZBbjM!'9bFR0
+dFLjM!'GPEQ4S,Q-!Cf9ZC(0K,Q-!Cf9ZFR0K,Q-!ER0PF5jM!'p`C@jcFf`ZB`"
+`Df0c-6)ZB`"`Df0c0bjM!("VBh-i,Q-!FQ9a,Q-!FR0K,Q-!Ff9cFepTC#jM!(0
+YD@eP,Q-!Fh"PC@3ZB`"cF'YKBbjM!(0IBf)ZB`"cAf0XD@9ZG#jM!(0IFf9bGQ9
+b,Q-!FepcEf0VCA3ZB`"fCA*TCRNZB`"fCA*cD@pZ,Q-!H$8`15jM!(0IG'PYC5j
+M!%G98dPI5@jTG#jMF(!!4e9659p$Eh*P,P"33bj-D@)!4e9659p08d`Z8&"$,Na
+TBJ"(990*Ae0*6e9B,P"33bj-D@)!1NaTBP066#j38%-Z6'PL!$T-D@*$FRP`G'm
+Z8&"$,NaTBJ"0B@028bjXD@)!690-)&*eER4TE@8f1%XZ6'PL!%p`C@j8F(4*EQ9
+d,Qm!6h"PEP4bB@jcF'pbG#j[!%p`C@j8FQ&ZFh"[FR4"F(!ZE`"08d`J8dP299J
+Z0MK,,NaTBJ"08d`J3bif1%XJ4Q%S0'PI1'3T,NaTBJ"0BA4S6'PL0MK,)%CK+$4
+TAcKN+5j-D@)!4QPbFh3J8f9RE@9ZG!"(990*Ad0[FQ8Z0MK,,NaTBJ"(990*Ade
+66#if1%XZ6'PL!%G98dPI8dP299JZ0MK,,NaTBJ!k6'PL3h*jF(4[,MBiDb"'B5J
+dD9miC#NZ6'PL!%aTBP066#if1%XJ4Q%S0'PI1'3T,NaTBJ"(CA4)9&438b"38%-
+!6h"PEP066#"38%-!4f9d5&488&-J0MK,!%aTBP066#!f1%X!6h"PEP066#!f1'X
+!6'PL8e0-)&"33`"-D@*$FRP`G'mJ8&"$!%aTBN0bHA"dEb!f1%X!1NGPG%K89&"
+6+&"33bN!6'PL)%PYF'pbG#"38%-!3Q&XE'p[EL")C@a`!%eA)%-[3bXV)&"33`"
+(B@eP3fpNC5"$EfjfCA*dCA)!4QaPH#"3FQ9`FQpMCA0cEh)!69FJ8'&cBf&X)&"
+33`"5CAS!8&"$3A0Y!%*TFfpZ)&"bCA"bEf0PFh0[FJ"B3dp'4L"*EA"[FR3J8&"
+$!&"&4L"*EA"[FR3J8&"$!$T2F'9Z8e0-!$T(CA4)9&438bJf1%XT!%aTBL"*EA"
+[FR3J0MK,!%e39b"*EA"[FR3J0MK,!%eA)%-[3bXV)$Bi5`"09b"3BA0MB@`J0MK
+,!&"&4L"*EA"[FR3J0MK,!$T-D@*68d`Z0MK,)%CK+$4TAcKN+5j-D@)!1Np`C@j
+68d`S0MKV+3"0B@028b"38%-J6'PZDf9b!%eKBdp6)$Bi5b"-D@jVCA)!8fpeFQ0
+P)&4bC@9c!%0eFh4[E5",CAPhEh*NF`""Bf0PFh-J8'&dD(-!9'&bCf9d)&0PG(4
+TEQGc!%CTE'8J6@&`F'PZCh-!3R9TE'3J4AKdFQ&c!%4PBR9RCf9b)&*eER4TE@8
+!4'9LG@GRCA)J9'&bCf9d!%-[3bXV)%0[EA"TE'9b!%-[3bXV)&GKFQjTEQGc!&"
+33b"$Ef4P4f9Z!&"33b"%DA0KFh0PE@*XCA)!8&"$)%GXEf*KE#"2F(4TE@PkCA)
+!8&"$)%aTEQYPFJ"38%-J8%9'!&"33b"3FQpUC@0d!&"33d&cE5"3B@jPE!"5CAS
+J3fpYF'PXCA)!0MK,)%0[C'9(C@i!0MK,)%4TFf&cFf9YBQaPFJ!f1%XJ4fa[BQ&
+X)%p`G'PYDATPFJ!f1%XJ6'PZDf9b!$Bi5b"3FQpUC@0d!%0'66Bi5`!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -443,50 +443,50 @@ k!!!"2J!!!!!!!!b&!!!"2`!!!!!!!!b3!!!!!8!!!!!!!!!-QJ!!!8%!!!!!!!!
 !%#S!!!'D!!!!!!!!%$8!!!'E!!!!!!!!%%!!!!'F!!!!!!!!%%`!!!'G!!!!!!!
 !%&B!!!'H!!!!!!!!%'%!!!'I!!!!!!!!%'`!!!'J!!!!!!!!%(i!!!'K!!!!!!!
 !%*!!!!!"SJ!!!!!!!"#G!!!"S`!!!!!!!"#V!!!"T!!!!!!!!"#e!!!"T3!!!!!
-!!"$+!!!"TJ!!!!!!!"$6!!!"T`!!!!!!!"$H!!!"U!!!!!!!!"$J!!!"U3!!!!!
-!!"$R!!!"UJ!!!!!!!"$b!!!"U`!!!!!!!"$p!!!"V!!!!!!!!"%#!!!"V3!!!!!
-!!"%-!!!"VJ!!!!!!!"%5!!!"V`!!!!!!!"%E!!!"X!!!!!!!!"%L!!!"X3!!!!!
-!!"%R!!!"XJ!!!!!!!"%Y!!!"X`!!!!!!!"%i!!!"Y!!!!!!!!"%q!!!"Y3!!!!!
-!!"&(!!!"YJ!!!!!!!"&2!!!"Y`!!!!!!!"&B!!!"Z!!!!!!!!"&K!!!"Z3!!!!!
-!!"&S!!!"ZJ!!!!!!!"&b!!!"Z`!!!!!!!"&l!!!"[!!!!!!!!"'$!!!"[3!!!!!
-!!"',!!!"[J!!!!!!!"'4!!!"[`!!!!!!!"'A!!!"`!!!!!!!!"'K!!!"`3!!!!!
-!!"'T!!!"`J!!!!!!!"'a!!!"``!!!!!!!"'j!!!"a!!!!!!!!"(!!!!"a3!!!!!
-!!"(,!!!"aJ!!!!!!!"(@!!!"a`!!!!!!!"(K!!!"b!!!!!!!!"(U!!!"b3!!!!!
-!!"(d!!!"bJ!!!!!!!"(l!!!"b`!!!!!!!")%!!!"c!!!!!!!!")5!!!"c3!!!!!
-!!")N!!!"cJ!!!!!!!")e!!!"c`!!!!!!!"*)!!!"d!!!!!!!!"*A!!!"d3!!!!!
-!!"*T!!!"dJ!!!!!!!"*c!!!"d`!!!!!!!"+'!!!"e!!!!!!!!"+8!!!"e3!!!!!
-!!"+N!!!"eJ!!!!!!!"+h!!!"e`!!!!!!!",*!!!"f!!!!!!!!",K!!!"f3!!!!!
-!!",k!!!"fJ!!!!!!!"-)!!!"f`!!!!!!!"-D!!!"h!!!!!!!!"-V!!!"h3!!!!!
-!!"-q!!!"hJ!!!!!!!"0D!!!"h`!!!!!!!"0c!!!"i!!!!!!!!"1!!!!"i3!!!!!
-!!"1-!!!"iJ!!!!!!!"1C!!!"i`!!!!!!!"1N!!!"j!!!!!!!!"1`!!!"j3!!!!!
-!!"1l!!!"jJ!!!!!!!"2*!!!"j`!!!!!!!"2A!!!"k!!!!!!!!"2Q!!!"k3!!!!!
-!!"2e!!!"kJ!!!!!!!"3#!!!"k`!!!!!!!"32!!!"l!!!!!!!!"3L!!!"l3!!!!!
-!!"3d!!!"lJ!!!!!!!"4#!!!"l`!!!!!!!"4'!!!"m!!!!!!!!"40!!!"m3!!!!!
-!!"4J!!!"mJ!!!!!!!"4a!!!"m`!!!!!!!"5!!!!"p!!!!!!!!"5*!!!"p3!!!!!
-!!"5B!!!"pJ!!!!!!!"5R!!!"p`!!!!!!!"5f!!!"q!!!!!!!!"6$!!!"q3!!!!!
-!!"64!!!"qJ!!!!!!!"6J!!!"q`!!!!!!!"6k!!!"r!!!!!!!!"8)!!!"r3!!!!!
-!!"8B!!!"rJ!!!!!!!"8V!!!"r`!!!!!!!"9)!!!#!!!!!!!!!"9C!!!#!3!!!!!
-!!"9U!!!#!J!!!!!!!"9h!!!#!`!!!!!!!"@(!!!#"!!!!!!!!"@8!!!#"3!!!!!
-!!"@N!!!#"J!!!!!!!"@b!!!#"`!!!!!!!"@r!!!##!!!!!!!!"A3!!!##3!!!!!
-!!"AJ!!!##J!!!!!!!"A[!!!##`!!!!!!!"Aq!!!#$!!!!!!!!"B+!!!#$3!!!!!
-!!"BE!!!#$J!!!!!!!"B`!!!#$`!!!!!!!"Bl!!!#%!!!!!!!!"C$!!!#%3!!!!!
-!!"C2!!!#%J!!!!!!!"CF!!!#%`!!!!!!!"CT!!!#&!!!!!!!!"Ce!!!#&3!!!!!
-!!"D'!!!#&J!!!!!!!"DE!!!#&`!!!!!!!"DQ!!!#'!!!!!!!!"Db!!!#'3!!!!!
+!!"$+!!!"TJ!!!!!!!"$6!!!"T`!!!!!!!"$H!!!"U!!!!!!!!"$Y!!!"U3!!!!!
+!!"$[!!!"UJ!!!!!!!"$f!!!"U`!!!!!!!"%"!!!"V!!!!!!!!"%-!!!"V3!!!!!
+!!"%4!!!"VJ!!!!!!!"%E!!!"V`!!!!!!!"%K!!!"X!!!!!!!!"%U!!!"X3!!!!!
+!!"%a!!!"XJ!!!!!!!"%f!!!"X`!!!!!!!"%m!!!"Y!!!!!!!!"&(!!!"Y3!!!!!
+!!"&0!!!"YJ!!!!!!!"&@!!!"Y`!!!!!!!"&H!!!"Z!!!!!!!!"&R!!!"Z3!!!!!
+!!"&`!!!"ZJ!!!!!!!"&h!!!"Z`!!!!!!!"'"!!!"[!!!!!!!!"'+!!!"[3!!!!!
+!!"'5!!!"[J!!!!!!!"'D!!!"[`!!!!!!!"'J!!!"`!!!!!!!!"'Q!!!"`3!!!!!
+!!"'`!!!"`J!!!!!!!"'i!!!"``!!!!!!!"(!!!!"a!!!!!!!!"()!!!"a3!!!!!
+!!"(2!!!"aJ!!!!!!!"(D!!!"a`!!!!!!!"(P!!!"b!!!!!!!!"(`!!!"b3!!!!!
+!!"(j!!!"bJ!!!!!!!")$!!!"b`!!!!!!!")+!!!"c!!!!!!!!")6!!!"c3!!!!!
+!!")K!!!"cJ!!!!!!!")c!!!"c`!!!!!!!"*%!!!"d!!!!!!!!"*A!!!"d3!!!!!
+!!"*R!!!"dJ!!!!!!!"*k!!!"d`!!!!!!!"+%!!!"e!!!!!!!!"+A!!!"e3!!!!!
+!!"+P!!!"eJ!!!!!!!"+e!!!"e`!!!!!!!",)!!!"f!!!!!!!!",D!!!"f3!!!!!
+!!",b!!!"fJ!!!!!!!"-,!!!"f`!!!!!!!"-C!!!"h!!!!!!!!"-V!!!"h3!!!!!
+!!"-m!!!"hJ!!!!!!!"02!!!"h`!!!!!!!"0X!!!"i!!!!!!!!"1&!!!"i3!!!!!
+!!"15!!!"iJ!!!!!!!"1H!!!"i`!!!!!!!"1V!!!"j!!!!!!!!"1f!!!"j3!!!!!
+!!"2#!!!"jJ!!!!!!!"20!!!"j`!!!!!!!"2E!!!"k!!!!!!!!"2T!!!"k3!!!!!
+!!"2i!!!"kJ!!!!!!!"3(!!!"k`!!!!!!!"38!!!"l!!!!!!!!"3K!!!"l3!!!!!
+!!"3d!!!"lJ!!!!!!!"4'!!!"l`!!!!!!!"48!!!"m!!!!!!!!"4B!!!"m3!!!!!
+!!"4I!!!"mJ!!!!!!!"4b!!!"m`!!!!!!!"5$!!!"p!!!!!!!!"55!!!"p3!!!!!
+!!"5E!!!"pJ!!!!!!!"5U!!!"p`!!!!!!!"5j!!!"q!!!!!!!!"6)!!!"q3!!!!!
+!!"69!!!"qJ!!!!!!!"6M!!!"q`!!!!!!!"6b!!!"r!!!!!!!!"8-!!!"r3!!!!!
+!!"8D!!!"rJ!!!!!!!"8V!!!"r`!!!!!!!"8m!!!#!!!!!!!!!"9*!!!#!3!!!!!
+!!"9C!!!#!J!!!!!!!"9Q!!!#!`!!!!!!!"9f!!!#"!!!!!!!!"@%!!!#"3!!!!!
+!!"@4!!!#"J!!!!!!!"@L!!!#"`!!!!!!!"@b!!!##!!!!!!!!"A"!!!##3!!!!!
+!!"A3!!!##J!!!!!!!"AF!!!##`!!!!!!!"AY!!!#$!!!!!!!!"B#!!!#$3!!!!!
+!!"B0!!!#$J!!!!!!!"B9!!!#$`!!!!!!!"BK!!!#%!!!!!!!!"BZ!!!#%3!!!!!
+!!"Bl!!!#%J!!!!!!!"C(!!!#%`!!!!!!!"CB!!!#&!!!!!!!!"CY!!!#&3!!!!!
+!!"Ci!!!#&J!!!!!!!"D%!!!#&`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!$!!!!!-
+!!!!-Y0ifDrrrqUS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!!!!)
-!!!!$!!!!"!!!!!8!!!!'!!!!"`!!!!J!!!!*!!!!,3!!!!S!!!!,!!!!$!!!!!d
-!!!!1!!!!$`!!!"!!!!!4!!!!%J!!!"-!!!!8!!!!&3!!!"B!!!!A!!!!'!!!!"N
-!!!!D!!!!'`!!!"`!!!!G!!!!(J!!!"m!!!!J!!!!)3!!!#)!!!!M!!!!*!!!!#8
-!!!!Q!!!!*`!!!#J!!!!T!!!!+J!!!#X!!!!X!!!!,J!!!#m!!!!`!!!!-3!!!$)
-!!!!c!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!0!!!!%!#!!!!!J!!0!!!!!!!!!!"!!!!!J!!!!-!!!!%!!!!"3!!!!B
-!!!!(!!!!#!!!!!N!!!!+!!!!#`!!!!`!!!!0!!!!$J!!!!m!!!!3!!!!%3!!!")
-!!!!@!!!!'`!!!"J!!!!C!!!!'J!!!"`!!!!G!!!!&`!!!"-!!!!8!!!!&3!!!"m
-!!!!H!!!!)!!!!#!&!!!!"3!!)!!!!KN!!!)J!!!@Z3!!'!!!!!)C!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!#!!!#!!!!!J%!!!&P!!!![!!!!'m!!!&Q!!!!F!!!!(%
-!!!"b!!!!F`!!!(3!!!"e!!!!GJ!!!(F!!!"i!!!!H3!!!(S!!!"l!!!!I!!!!B!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!#&`!!!L!!!"D,!!!B!!!!!KF!!!!!!!!!!!!!!!!
+!!!!!9%9B9!!!!!)!!!(q!!!"r`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -702,7 +702,7 @@ i)%4&3P9()$Bi5`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!!3!!#8ePFQGP)%peG!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$m
-r2cp"8&"-!!%"!!!%)#!J)!15Jf!$G0pi!`1Yi!!&!J%!!3%!!3%"!!!"!!!!!!!
+r2cp"8&"-!!%"!!!%)#!J)!1ARe!$GYpi!`@Z%!!&!J%!!3%!!3%"!!!"!!!!!!!
 !!!%"!3%!!3%!!3!""!!!!!!!!!!!!!!(!3%!!3!!!3!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
 IAh0dBA*d!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -1081,8 +1081,8 @@ l!!!"H`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!3!"I!!!!A`#!3!
 !!!!!!!!!!3!"T!!!!D3#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!%
 !!D8!!!'P!J%!!!!!!!%!!3-!!!!!!!!!!!!!!!!"!!!!!!!!!!!"!!'Q!!!"TJ)
 "!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!3!"T`!!!DF#!3!!!!!!!3!
-"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!%!!DJ!!!'S!J%!!!!!!!%!!3%!!!!!!!!
+!!!!!!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -1137,46 +1137,46 @@ l!!!"H`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!3!"I!!!!A`#!3!
 !!!&m!!!"I3!!!Ai!!!&r!!!"J!!!!B%!!!'#!!!"J`!!!B3!!!'&!!!"KJ!!!BF
 !!!')!!!"L3!!!BS!!!',!!!"M!!!!Bd!!!'1!!!"M`!!!C!!!!!"N3!!!C)!!!'
 6!!!"P!!!!C8!!!'@!!!"P`!!!CJ!!!'C!!!"QJ!!!CX!!!'F!!!"R3!!!Ci!!!'
-I!!!"S!!!!D%!!!'L!!!"S`!!!D3!!!'P!!!"TJ!!!!!!!!!!!!!!!!!!!!!!!!!
+I!!!"S!!!!D%!!!'L!!!"S`!!!D3!!!'P!!!"TJ!!!DF!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'R!!!"`!%!!!!"!!'
-R!3!"SJ%!!D-"!!'K!3!"S!%!!!X"!!!-!3!!#J%!!!d"!!!1!3!!$`%!!"!"!!!
-4!3!!%J%!!"-"!!!8!3!!&3%!!"B"!!!A!3!!'!%!!"N"!!!D!3!!'`%!!"`"!!!
-G!3!!(J%!!"m"!!!J!3!!)3%!!#)"!!!M!3!!*!%!!#8"!!!Q!3!!*`%!!#J"!!!
-T!3!!+J%!!#X"!!!X!3!!,3%!!#i"!!![!3!!-!%!!$%"!!!b!3!!-`%!!$3"!!!
-e!3!!0J%!!$F"!!!i!3!!13%!!$S"!!!l!3!!2!%!!$d"!!!q!3!!2`%!!%!"!!"
-"!3!!3J%!!%-"!!"%!3!!43%!!%B"!!"(!3!!5!%!!%N"!!"+!3!!5`%!!%`"!!"
-0!3!!6J%!!%m"!!"3!3!!83%!!&)"!!"6!3!!9!%!!&8"!!"@!3!!9`%!!&J"!!"
-C!3!!@J%!!&X"!!"F!3!!A3%!!&i"!!"I!3!!B!%!!'%"!!"L!3!!B`%!!'3"!!"
-P!3!!CJ%!!'F"!!"S!3!!D3%!!'S"!!"V!3!!E!%!!'d"!!"Z!3!!E`%!!(!"!!"
-a!3!!FJ%!!(-"!!"d!3!!G3%!!(B"!!"h!3!!H!%!!(N"!!"k!3!!H`%!!(`"!!"
-p!3!!IJ%!!(m"!!#!!3!!J3%!!))"!!#$!3!!K!%!!)8"!!#'!3!!K`%!!)J"!!'
-Q!3!!L3%!!)S"!!#,!3!!M!%!!)d"!!#1!3!!M`%!!*!!!3!!N3%!!*)"!!#6!3!
-!P!%!!*8"!!#@!3!!P`%!!*J"!!#C!3!!QJ%!!*X"!!#F!3!!R3%!!*i"!!#I!3!
-!S!%!!+%"!!#L!3!!S`%!!+3"!!#P!3!!TJ%!!+F"!!#S!3!!U3%!!+S"!!#V!3!
-!V!%!!+d"!!#Z!3!!V`%!!,!"!!#a!3!!XJ%!!,-"!!#d!3!!Y3%!!,B"!!#h!3!
-!Z!%!!,N"!!#k!3!!Z`%!!,`"!!#p!3!![J%!!,m"!!$!!3!!`3%!!-)"!!$$!3!
-!a!%!!-8"!!$'!3!!a`%!!-J"!!$*!3!!bJ%!!-X"!!$-!3!!c3%!!-i"!!$2!3!
-!d!%!!0%"!!$5!3!!d`%!!03"!!$9!3!!eJ%!!0F"!!$B!3!!f3%!!0S"!!$E!3!
-!h!%!!0d"!!$H!3!!h`%!!1!"!!$K!3!!iJ%!!1-"!!$N!3!!j3%!!1B"!!$R!3!
-!k!%!!1N"!!$U!3!!k`%!!1`"!!$Y!3!!lJ%!!1m"!!$`!3!!m3%!!2)"!!$c!3!
-!p!%!!28"!!$f!3!!p`%!!2J"!!$j!3!!qJ%!!2X"!!$m!3!!r3%!!2i"!!$r!3!
-"!!%!!3%"!!%#!3!"!`%!!33"!!%&!3!""J%!!3F"!!%)!3!"#3%!!3S"!!%,!3!
-"$!%!!3d"!!%1!3!"$`%!!4!"!!%4!3!"%J%!!4-"!!%8!3!"&3%!!4B"!!%A!3!
-"'!%!!4N"!!%D!3!"'`%!!4`"!!%G!3!"(J%!!4m"!!%J!3!")3%!!5)"!!%M!3!
-"*!%!!58"!!%Q!3!"*`%!!5J"!!%T!3!"+J%!!5X"!!%X!3!",3%!!5i"!!%[!3!
-"-!%!!6%"!!%b!3!"-`%!!63"!!%e!3!"T`%!!6B"!!%h!3!"1!%!!6N"!!%k!3!
-"1`%!!6`"!!%p!3!"2J%!!6m"!!&!!3!"33%!!8)"!!&$!3!"4!%!!88"!!&'!3!
-"4`%!!8J"!!&*!3!"5J%!!8X"!!&-!3!"63%!!8i"!!&2!3!"8!%!!9%"!!&5!3!
-"8`%!!93"!!&9!3!"9J%!!9F"!!&B!3!"@3%!!9S"!!&E!3!"A!%!!9d"!!&H!3!
-"A`%!!@!"!!&K!3!"BJ%!!@-"!!&N!3!"C3%!!@B"!!&R!3!"D!%!!@N"!!&U!3!
-"D`%!!@`"!!&Y!3!"EJ%!!@m"!!&`!3!"F3%!!A)"!!&c!3!"G!%!!A8"!!&f!3!
-"G`%!!AJ"!!&j!3!"HJ%!!AX"!!&m!3!"I3%!!Ai"!!'!!3!"J3%!!B)"!!'$!3!
-"K!%!!B8"!!''!3!"K`%!!BJ"!!'*!3!"LJ%!!BX"!!'-!3!"M3%!!Bi"!!'2!3!
-"N!!"!!'4!3!"NJ%!!C-"!!'8!3!"P3%!!CB"!!'A!3!"Q!%!!CN"!!'D!3!"Q`%
-!!C`"!!'G!3!"RJ%!!Cm"!!'N!3!"I`%!!!%"!!!%!3!!!`%!!!)"!!!*!3!!"3%
-!!!B"!!!(!3!!#!%!!D8!!!'S!!%!+!!!!#!$NFQ3!$mr!!!!!!!!!!!!!!14bC!
-!!!)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'S!!!"`!%!!!!"!!'
+S!3!"SJ%!!D-"!!'S!3!"S3%!!D!"!!!,!3!!$!%!!!S"!!!0!3!!$J%!!!m"!!!
+3!3!!%3%!!")"!!!6!3!!&!%!!"8"!!!@!3!!&`%!!"J"!!!C!3!!'J%!!"X"!!!
+F!3!!(3%!!"i"!!!I!3!!)!%!!#%"!!!L!3!!)`%!!#3"!!!P!3!!*J%!!#F"!!!
+S!3!!+3%!!#S"!!!V!3!!,!%!!#d"!!!Z!3!!,`%!!$!"!!!a!3!!-J%!!$-"!!!
+d!3!!03%!!$B"!!!h!3!!1!%!!$N"!!!k!3!!1`%!!$`"!!!p!3!!2J%!!$m"!!"
+!!3!!33%!!%)"!!"$!3!!4!%!!%8"!!"'!3!!4`%!!%J"!!"*!3!!5J%!!%X"!!"
+-!3!!63%!!%i"!!"2!3!!8!%!!&%"!!"5!3!!8`%!!&3"!!"9!3!!9J%!!&F"!!"
+B!3!!@3%!!&S"!!"E!3!!A!%!!&d"!!"H!3!!A`%!!'!"!!"K!3!!BJ%!!'-"!!"
+N!3!!C3%!!'B"!!"R!3!!D!%!!'N"!!"U!3!!D`%!!'`"!!"Y!3!!EJ%!!'m"!!"
+`!3!!F3%!!()"!!"c!3!!G!%!!(8"!!"f!3!!G`%!!(J"!!"j!3!!HJ%!!(X"!!"
+m!3!!I3%!!(i"!!"r!3!!J!%!!)%"!!##!3!!J`%!!)3"!!#&!3!!KJ%!!)F"!!#
+)!3!!L3%!!)S"!!#,!3!!M!%!!)d"!!#1!3!!M`%!!*!!!3!"TJ%!!*%"!!#5!3!
+!N`%!!*3"!!#9!3!!PJ%!!*F"!!#B!3!!Q3%!!*S"!!#E!3!!R!%!!*d"!!#H!3!
+!R`%!!+!"!!#K!3!!SJ%!!+-"!!#N!3!!T3%!!+B"!!#R!3!!U!%!!+N"!!#U!3!
+!U`%!!+`"!!#Y!3!!VJ%!!+m"!!#`!3!!X3%!!,)"!!#c!3!!Y!%!!,8"!!#f!3!
+!Y`%!!,J"!!#j!3!!ZJ%!!,X"!!#m!3!![3%!!,i"!!#r!3!!`!%!!-%"!!$#!3!
+!``%!!-3"!!$&!3!!aJ%!!-F"!!$)!3!!b3%!!-S"!!$,!3!!c!%!!-d"!!$1!3!
+!c`%!!0!"!!$4!3!!dJ%!!0-"!!$8!3!!e3%!!0B"!!$A!3!!f!%!!0N"!!$D!3!
+!f`%!!0`"!!$G!3!!hJ%!!0m"!!$J!3!!i3%!!1)"!!$M!3!!j!%!!18"!!$Q!3!
+!j`%!!1J"!!$T!3!!kJ%!!1X"!!$X!3!!l3%!!1i"!!$[!3!!m!%!!2%"!!$b!3!
+!m`%!!23"!!$e!3!!pJ%!!2F"!!$i!3!!q3%!!2S"!!$l!3!!r!%!!2d"!!$q!3!
+!r`%!!3!"!!%"!3!"!J%!!3-"!!%%!3!""3%!!3B"!!%(!3!"#!%!!3N"!!%+!3!
+"#`%!!3`"!!%0!3!"$J%!!3m"!!%3!3!"%3%!!4)"!!%6!3!"&!%!!48"!!%@!3!
+"&`%!!4J"!!%C!3!"'J%!!4X"!!%F!3!"(3%!!4i"!!%I!3!")!%!!5%"!!%L!3!
+")`%!!53"!!%P!3!"*J%!!5F"!!%S!3!"+3%!!5S"!!%V!3!",!%!!5d"!!%Z!3!
+",`%!!6!"!!%a!3!"-J%!!6-"!!%d!3!"03%!!6B"!!'R!3!"0`%!!6J"!!%j!3!
+"1J%!!6X"!!%m!3!"23%!!6i"!!%r!3!"3!%!!8%"!!&#!3!"3`%!!83"!!&&!3!
+"4J%!!8F"!!&)!3!"53%!!8S"!!&,!3!"6!%!!8d"!!&1!3!"6`%!!9!"!!&4!3!
+"8J%!!9-"!!&8!3!"93%!!9B"!!&A!3!"@!%!!9N"!!&D!3!"@`%!!9`"!!&G!3!
+"AJ%!!9m"!!&J!3!"B3%!!@)"!!&M!3!"C!%!!@8"!!&Q!3!"C`%!!@J"!!&T!3!
+"DJ%!!@X"!!&X!3!"E3%!!@i"!!&[!3!"F!%!!A%"!!&b!3!"F`%!!A3"!!&e!3!
+"GJ%!!AF"!!&i!3!"H3%!!AS"!!&l!3!"I!%!!Ad"!!&q!3!"J!%!!B%"!!'#!3!
+"J`%!!B3"!!'&!3!"KJ%!!BF"!!')!3!"L3%!!BS"!!',!3!"M!%!!Bd"!!'1!3!
+"M`%!!C!!!3!"N3%!!C)"!!'6!3!"P!%!!C8"!!'@!3!"P`%!!CJ"!!'C!3!"QJ%
+!!CX"!!'F!3!"R3%!!Ci"!!'I!3!"T!%!!Am"!!!"!3!!"!%!!!-"!!!#!3!!#3%
+!!!8"!!!'!3!!"`%!!!J"!!'P!!!"U3!"!#J!!!!JrrrjT!!""!!!!!!!!!!!!!!
+!!!!!!J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -1186,8 +1186,8 @@ Q!3!!L3%!!)S"!!#,!3!!M!%!!)d"!!#1!3!!M`%!!*!!!3!!N3%!!*)"!!#6!3!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!!6T)HA"PFN0
-KFQ3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!"1NKjF'9
+b3f&bC!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -1197,14 +1197,14 @@ KFQ3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#`MlJ!!!!!!!!!3!#`NI
-`!!)!!!!!!!!!!!!!!X)fJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!,#2Z!!!!!!!!!"!!,
+#4r!!!J!!!!!!!!!!!!!#`MD!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!)!!!%!!!!!"3!!Irm!!!!!Irm!!!!!Irm!!!!!Irm!!!!-!!%!!J!'!!!!"8!
-!!!J!!3!"1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!J!!!3!!!!!&!!"rr`!!!!"rr`!!!!"rr`!!!!"rr`!!!!`!!3!#!!B!!!!
+&3!!!#!!"!!%k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -1214,9 +1214,8 @@ KFQ3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%
-!!!$rrrrr!!!!!`!"!!%k1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!3!!!2rrrrm!!!!$!!%!!6Sk!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -1226,8 +1225,8 @@ KFQ3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!3!!!2rrrrm!!!!%!!%!!6SkD@jME(9NC6S!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!"!!!!rrrrr`!!!!3!!3!"1MTTEQ0XG@4P1J!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -1237,8 +1236,8 @@ KFQ3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!rrrrrd!!!!)!!3!"1J!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!$rrrrr3!!!!J!"!!%k!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -1248,9 +1247,9 @@ KFQ3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$rrrrr3!!!!`!"!!%k1MT(990*1QP
-ZBfaeC'8k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2rrrrp!!!!$!!%!!6Sk1NG98dN
+kD@jME(9NC6S!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -1259,9 +1258,9 @@ ZBfaeC'8k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2rrrrp!!!!%!!%!!6S
-k1NG98dNkE'PL1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!rrrrrd!!!!3!!3!
+"1MSk4e9656TXD@)k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -1270,9 +1269,9 @@ k1NG98dNkE'PL1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!rrrrrd!
-!!!8!!J!"1NeKBdp6)&0eF("[FR3k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$rrrr
+r3!!!"3!#!!%k6@&M6e-J8h9`F'pbG$S!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -1281,10 +1280,9 @@ k1NG98dNkE'PL1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%
-!!!$rrrrr3!!!"J!#!!%k690-1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!3!!!2rrrrp!!!!'!!)!!6T08d`k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -1293,9 +1291,9 @@ k1NG98dNkE'PL1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!3!!!2rrrrp!!!!(!!S!!%eKBdp6)&"33b"-D@jVCA)!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!"!!!!rrrrrd!!!!F!#J!!6@&M6e-J8&"$)%aTEQYPFJ!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -1309,14 +1307,14 @@ k1NG98dNkE'PL1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%p`C@j68d`J8&"$!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!6h"PEP066#"38%-!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!"1J!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!%k!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -1325,61 +1323,61 @@ k1NG98dNkE'PL1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!J!"6@&M6e-
-J8&"$)%aTEQYPFJ!!!!!!!!!!!!!!!!!!!!!!(N&38%`!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!B!!!!%&`F'`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!B!!!!%e06%)!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!%aTBL"*EA"[FR3J8&"$!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!%e36%B!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%aTBL"*EA"
-[FR3J8&"$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%eA3d3!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!B!!!!&*68N-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!B!!!!&4&@&3ZBQJ!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!%*KE'a[EfiJ5'9XF!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!&4&@&3ZB`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%eA)%-[3bX
-V)&"33`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&4&@&3ZBbXV!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!%eA)%-[3bXV)&"33`!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!&4&@&3ZBf-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%eA)%-[3bX
-V)&"33`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&4&@&3ZBh!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!%eA)%-[3bXV)&"33`!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!&4&@&3ZBh"`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%eA)%-[3bX
-V)&"33`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&4&@&3ZCAK`!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!!&0B@0
+28b"38%-J6'PZDf9b!!!!!!!!!!!!!!!!!!!!!!!H39"36!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!&4&@&3ZCf-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%GKE@9$Ef4
-P)%0[ERCPFR4PFJ!!!!!!!!!!!!!!!!!!3!!!!&4&@&3ZD!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!%eA)%-[3bXV)&"33`!!!!!!!!!!!!!!!!!!!!!!!!!
-!%!!!!&4&@&3ZE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%CXCAJJ8(*
-PF(*[Bf9cFfpb!!!!!!!!!!!!!!!!!!!!J!!!!&4&@&3ZF!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!%eA)&"KFf0KE#"38%-!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!&4&@&3ZF'&c!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%eA)&"KFf0
-KE#"38%-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&4&@&3ZF'0S!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!%eA)%-[3bXV)&"33`!!!!!!!!!!!!!!!!!!!!!!!!!
-!J!!!!&4&@&3ZF'0S+bX!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%eA)%-[3bX
-V)&"33`!!!!!!!!!!!!!!!!!!!!!!!!!!J!!!!&4&@&3ZF("e!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!%eA)&"KFf0KE#"38%-!!!!!!!!!!!!!!!!!!!!!!!!
-!J!!!!&4&@&3ZFJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&*PHJ!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&4&@&3ZF`!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!&"33d&cE3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!&4&@&3ZH3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%*TFfpZ)&"
-bCA"bEf0PFh0[FJ!!!!!!!!!!!!!!!!!!J!!!!&K$6dB!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!&K$6dC')%PYF'pbG#"38%-!!!!!!!!!!!!!!!!!!!!
-!!!!!!'4[Bh8!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!B!!!!(*cFQ-!!!!!!!!!!!!!!!!!!!!
+!!!"J!!!!3A"`E!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!!68e-3J!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!6'PL)%PYF'pbG#"38%-!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!69"-4J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!6'PL)%P
+YF'pbG#"38%-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69G$4!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!B!!!!(0SE')!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&"&4L"*EA"
-[FR3J8&"$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(0dG@)!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!&"&4L"*EA"[FR3J8&"$!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!ZC'pM!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!8!!!!!!&!3%!!3!!!!!!!!!!!!!!!!!
+!!!"J!!!!8P053`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!!9%9B9#jLD!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!3Q&XE'p[EL")C@a`!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!9%9B9#jM!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ3bp
+$+bXJ8&"$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#jM+bX!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!69FJ3bp$+bXJ8&"$!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!9%9B9#jMB`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ3bp
+$+bXJ8&"$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#jMF!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!69FJ3bp$+bXJ8&"$!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!9%9B9#jMF(!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ3bp
+$+bXJ8&"$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#jPH(!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!9%9B9#jRB`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!4f&YC80
+[C'8J3fpZGQ9bG'9b!!!!!!!!!!!!!!!!!!"!!!!!9%9B9#jS!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!69FJ3bp$+bXJ8&"$!!!!!!!!!!!!!!!!!!!!!!!
+!!!!3!!!!9%9B9#jX!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!4QaPH#"
+3FQ9`FQpMCA0cEh)!!!!!!!!!!!!!!!!!!!#!!!!!9%9B9#j`!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!69FJ8'&cBf&X)&"33`!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!9%9B9#j`BA-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ8'&
+cBf&X)&"33`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#j`BfJ!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!69FJ3bp$+bXJ8&"$!!!!!!!!!!!!!!!!!!!!!!!
+!!!#!!!!!9%9B9#j`BfJV+`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ3bp
+$+bXJ8&"$!!!!!!!!!!!!!!!!!!!!!!!!!!#!!!!!9%9B9#j`F(8!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!69FJ8'&cBf&X)&"33`!!!!!!!!!!!!!!!!!!!!!
+!!!#!!!!!9%9B9#jb!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!8Q9k!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#jc!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!8&"$3A0Y!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!9%9B9#jj!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3QPcEfi
+J8(*PF(*[Bf9cFfpb!!!!!!!!!!!!!!!!!!#!!!!!@%024J!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!@%024NBJ5@e`Eh*d)&"33`!!!!!!!!!!!!!!!!!
+!!!!!!!!!C'pMG3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!!FR0bB`!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!"J!!!!FfKXBJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!8%9')%P
+YF'pbG#"38%-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Fh4eBJ!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!8%9')%PYF'pbG#"38%-!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!#jNEf-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"3!!!!!!8"!3!"!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!B!!!!!!3!!!!!&!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!"J!!!!!"!!!!!!8!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -1388,107 +1386,104 @@ bCA"bEf0PFh0[FJ!!!!!!!!!!!!!!!!!!J!!!!&K$6dB!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!3%!!'eKD@i!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!"!3!!E@&TEJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!%!!3!!!!%"!3%
-"!!%"!!!!!!!"!3!!!3%!!3!!!3!"!!!!!!!!!!!!#!%!!3%!!3%!!!!"!!!*!!!
-A6@&M6e-J9'p[E'*[H#"%48*94b!f1%X!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!2cmr2d&38%`!!!'!@-!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-r2cmr!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!B!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!$3!"!!!!!!!9AdeA49*,8ep(990*Ah"bC@CTH#j
-S!!!!!!!!!!!!!!!!!3!!!3!!!!!!!3!!!!!!!!!!!!!&!3%"!!!"!3!"!!!!!!3
-!!!!!!!!!!!!!!!!!!!!!!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)!3!"!!!!!3%
+"!3%!!3%!!!!!!!%"!!!"!3!"!!!"!!%!!!!!!!!!!!!)!3!"!3!"!3!!!!%!!!N
+!!"G0B@028b"8EfpXBQpi)%4&3P9()$Bi5`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!r2cmr39"36!!!!B"B`!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!$mr2cm!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!0!!%!!!!!!"9I69G&8NY6AdG98dPIF(*PCQP
+i,QJ!!!!!!!!!!!!!!!!"!!!"!!!!!!!"!!!!!!!!!!!!!!8"!3%!!!%"!!%!!!!
+!"!!!!!!!!!!!!!!!!!!!!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!AepcG'&bG!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!%!!!P0CA*
-RC5"2GA3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!r2cmr39"36!!"!3!!"#!J)#!$NS0J!h6IH!-$VH!!"3)"!!%
-"!!%"!3!!!3!!!!!!!!!"!3%"!!%"!!%!!33!!!!!!!!!!!!!"`%"!!%!!!%!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!AepcG'&bG!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!"IAh0dBA*d!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!J
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!!3!!#8e
+PFQGP)%peG!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!$mr2cp"8&"-!!%"!!!%)#!J)!1ARe!$GYpi!`@Z%!!&!J%
+!!3%!!3%"!!!"!!!!!!!!!!%"!3%!!3%!!3!""!!!!!!!!!!!!!!(!3%!!3!!!3!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!"IAh0dBA*d!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&!!!(6h"PEP0
-66!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$mr2cp"8&"-!!!%!!!!"!!!!!"!!!"
-B`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!"2cmr2`!!!!!!!!!#!!!!!J!#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!J"3!!%!!3!"!!%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!8!!!G2F'9
+Z8e0-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2cmr2d&38%`!!!3!!!!%!!!!!%!
+!!&M!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!%r2cmr!!!!!!!!!!)!!!!#!!)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!#!&!!!3!"!!%!!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&#G$6d4&*b!
-R4%&835FJ*e"*3e3R!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!8*d024%8
+R)#G%394"*b!R8%P$9#F!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!K-!!!)8!!!#&3!!!KB!!!)A!!!"p!!!!HF!!!(q!!!"r3!!!IS
-!!!(m!!!"m`!!!IX!!!)$!!!"U!!!!DN!!!'U!!!!,!!!!#d!!!!Z!!!!,`!!!$!
-!!!!a!!!!-J!!!$-!!!!d!!!!03!!!$B!!!!h!!!!1!!!!$N!!!!k!!!!1`!!!BF
-!!!!m!!!!23!!!$i!!!!r!!!!3!!!!%%!!!',!!!!3J!!!%-!!!"%!!!!43!!!%B
-!!!"(!!!"k3!!!Am!!!"p!!!!IJ!!!(m!!!'5!!!"N3!!!)!!!!#"!!!!c!!!!B`
-!!!$0!!!!JJ!!!)-!!!$1!!!!c`!!!!N!!!(`!!!!K3!!!)B!!!#(!!!"T3!!!)J
-!!!#*!!!!LJ!!!)X!!!#-!!!!M3!!!)i!!!#2!!!!N!!!!!#4!!!!NJ!!!*-!!!#
-8!!!!P3!!!*B!!!#A!!!"N`!!!Bi!!!'2!!!"M3!!!C!!!!!!K!!!!*J!!!#C!!!
-#"J!!!93!!!&9!!!"P!!!!BB!!!)*!!!##J!!!DX!!!#N!!!!T3!!!+B!!!#R!!!
-!U!!!!KJ!!!'X!!!!R`!!!+)!!!#M!!!"R`!!!AS!!!'Y!!!"VJ!!!AX!!!)#!!!
-"RJ!!!0!!!!#D!!!!Q`!!!*`!!!#G!!!!S!!!!*i!!!#K!!!!5!!!!%N!!!"+!!!
-!5`!!!%`!!!"0!!!!6J!!!%m!!!)(!!!##!!!!+N!!!'[!!!"X!!!!,d!!!#q!!!
-![`!!!-!!!!$"!!!!d3!!!E%!!!'b!!!!`J!!!--!!!$%!!!!a3!!!-B!!!'"!!!
-!a`!!!-J!!!#U!!!!U`!!!+`!!!'c!!!!dJ!!!+d!!!'9!!!!b3!!!D!!!!'d!!!
-!bJ!!!-X!!!"3!!!!d`!!!03!!!$9!!!!eJ!!!0F!!!$B!!!"I!!!!0N!!!$D!!!
-!f`!!!0`!!!$G!!!!hJ!!!0m!!!$J!!!!i3!!!1)!!!$M!!!!j!!!!18!!!$Q!!!
-!j`!!!1J!!!$T!!!!kJ!!!1X!!!$X!!!!l3!!!1i!!!$[!!!!m!!!!2%!!!$b!!!
-!m`!!!23!!!$e!!!!pJ!!!2F!!!#Z!!!!V`!!!J8!!!(C!!!"l!!!!&%!!!"5!!!
-!8`!!!HX!!!'e!!!"YJ!!!EF!!!(K!!!"h`!!!D%!!!(D!!!"c!!!!FX!!!(E!!!
-"c3!!!G`!!!(1!!!"#3!!!&3!!!"9!!!!9J!!!&F!!!"B!!!!@3!!!&S!!!"E!!!
-!!3!!!3S!!!%,!!!"$!!!!3d!!!%1!!!"$`!!!4!!!!(e!!!"k!!!!HB!!!(P!!!
-"h3!!!G!!!!(L!!!"j!!!!Gi!!!(2!!!#!!!!!Im!!!(4!!!"SJ!!!!)!!!(B!!!
-"%3!!!4)!!!%6!!!"&!!!!48!!!%@!!!"-`!!!Ad!!!'M!!!"pJ!!!GF!!!!!!!!
-"dJ!!!!-!!!(@!!!"IJ!!!IF!!!(U!!!"q!!!!Hd!!!$i!!!!q3!!!2S!!!$l!!!
-!r!!!!2d!!!$q!!!!r`!!!3!!!!%"!!!"Z!!!!&`!!!"G!!!"&`!!!4J!!!%C!!!
-!X!!!!,%!!!#b!!!"i`!!!H!!!!'j!!!"d`!!!!3!!!!&!!!"e!!!!G8!!!!'!!!
-!"`!!!4S!!!%K!!!")J!!!5-!!!%N!!!"*3!!!5B!!!%R!!!"+!!!!5N!!!%U!!!
-"+`!!!5`!!!'B!!!",3!!!5i!!!'@!!!"P`!!!&i!!!"I!!!!B!!!!'%!!!"L!!!
-!B`!!!'3!!!"P!!!!CJ!!!'F!!!"S!!!!D3!!!'S!!!#c!!!"q3!!!I)!!!%E!!!
-"(!!!!4d!!!%H!!!"(`!!!5!!!!%[!!!"Q3!!!6!!!!%a!!!"QJ!!!CX!!!'k!!!
-"Z`!!!6)!!!'m!!!"T!!!!JX!!!)-!!!#$3!!!Ji!!!)2!!!#%!!!!Hm!!!)4!!!
-"!J!!!3-!!!%%!!!""3!!!3B!!!%(!!!"#!!!!,3!!!%d!!!"TJ!!!,8!!!%e!!!
-"0J!!!6F!!!%i!!!"13!!!6S!!!%l!!!"2!!!!6d!!!%q!!!"2`!!!8!!!!&"!!!
-!YJ!!!,F!!!'p!!!"lJ!!!K)!!!&#!!!"3`!!!,J!!!'q!!!"R!!!!83!!!&&!!!
-"4J!!!8F!!!&)!!!"R3!!!8N!!!&+!!!"5`!!!8`!!!&0!!!!#J!!!!X!!!!-!!!
-!$3!!!!i!!!!2!!!!%!!!!"%!!!!5!!!!%`!!!"3!!!!9!!!!&J!!!"F!!!!B!!!
-!'3!!!"S!!!!E!!!"[`!!!,N!!!&1!!!"6`!!!9!!!!&4!!!"`!!!!J%!!!("!!!
-"`J!!!"`!!!!G!!!!(J!!!"m!!!!J!!!!)3!!!#)!!!!M!!!!*!!!!#8!!!!Q!!!
-"8J!!!,S!!!#l!!!"``!!!F3!!!(&!!!"aJ!!!FS!!!!R!!!!+!!!!#N!!!!U!!!
-!+`!!!J3!!!!)!!!"8`!!!BS!!!"V!!!!E!!!!'d!!!')!!!!EJ!!!BN!!!&R!!!
-"D!!!!@N!!!&U!!!"D`!!!@`!!!&Y!!!"EJ!!!@m!!!&`!!!"F3!!!A)!!!'&!!!
-"F`!!!A3!!!&e!!!"GJ!!!B3!!!&h!!!"H!!!!AN!!!((!!!"b!!!!DF!!!(*!!!
-"9J!!!9F!!!'#!!!"@!!!!9N!!!&D!!!"@`!!!9`!!!&G!!!"AJ!!!9m!!!&J!!!
-"B3!!!@)!!!'$!!!"B`!!!@3!!!&P!!!![!!!!I%!!!"[!!!"CJ!!!(!!!!"a!!!
-!FJ!!!(-!!!"d!!!!G3!!!(B!!!"h!!!!H!!!!(N!!!"k!!!!H`!!!(`!!!'!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-!!!!-!!!!!`!!!!bdhb6,!!!
-qh3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!J!!!3!!!!%#!3!!!!!!!3!"!`!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!)!!!)!!!!#!J%!!!!!!!%!!3-!!!!!!!!!!!!!!!!%!!!!!!!!!!!#!!!$!!!
+!!`)"!!!!!!!"!!%$!!!!!!!!!!!!!!!!"!!!!!!!!!!!!J!!"!!!!!3#!3!!!!!
+!!3!"!`!!!!!!!!!!!!!!!!!!!!!!!!!!!!)!!!8!!!!&!J%!!!!!!!%!!3-!!!!
+!!!!!!!!!!!!"!!!!!!!!!!!#!!!'!!!!"J)"!!!!!!!"!!%$!!!!!!!!!!!!!!!
+!"3!!!!!!!!!!!J!!"`!!!!F#!3!!!!!!!3!"!`!!!!!!!!!!!!!!!!%!!!!!!!!
+!!!)!!!J!!!!)!J%!!!!!!!%!!3-!!!!!!!!!!!!!!!!&!!!!!!!!!!!#!!!*!!!
+!#3)"!!!!!!!"!!%$!!!!!!!!!!!!!!!!"3!!!!!!!!!!!J!!#J!!!Am#!3!!!!!
+!!3!"!`!!!!!!!!!!!!!!!!%!!!!!!!!!!!)!!!X!!!'U!J%!!!!!!!%!!3%!!!!
+!!!!!!!!!!!!"!!!!!!!!!!!#!!!-!!!"U`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!
+!!3!!!!!!!!!!!J!!$3!!!D`#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!
+!!!)!!!i!!!'Y!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!#!!!2!!!
+"VJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!J!!%!!!!Dm#!3!!!!!
+!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!)!!"%!!!'`!J%!!!!!!!%!!3%!!!!
+!!!!!!!!!!!!"!!!!!!!!!!!#!!!5!!!"X3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!
+!!3!!!!!!!!!!!J!!%`!!!E)#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!
+!!!)!!"3!!!'c!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!#!!!9!!!
+"Y!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!J!!&J!!!E8#!3!!!!!
+!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!)!!"F!!!'f!J%!!!!!!!%!!3%!!!!
+!!!!!!!!!!!!"!!!!!!!!!!!#!!!B!!!"Y`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!
+!!3!!!!!!!!!!!J!!'3!!!EJ#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!
+!!!)!!"S!!!'j!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!#!!!E!!!
+"ZJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!J!!(!!!!EX#!3!!!!!
+!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!)!!"d!!!'m!J%!!!!!!!%!!3%!!!!
+!!!!!!!!!!!!"!!!!!!!!!!!#!!!H!!!"[3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!
+!!3!!!!!!!!!!!J!!(`!!!Ei#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!
+!!!)!!#!!!!'r!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!#!!!K!!!
+"`!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!J!!)J!!!F%#!3!!!!!
+!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!)!!#-!!!(#!J%!!!!!!!%!!3%!!!!
+!!!!!!!!!!!!"!!!!!!!!!!!#!!!N!!!"``)"!!!!!!!"!!%"!!!!!!!!!!!!!!!
+!!3!!!!!!!!!!!J!!*3!!!F3#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!
+!!!)!!#B!!!(&!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!#!!!R!!!
+"aJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!J!!+!!!!FF#!3!!!!!
+!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!)!!#N!!!()!J%!!!!!!!%!!3%!!!!
+!!!!!!!!!!!!"!!!!!!!!!!!#!!!U!!!"b3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!
+!!3!!!!!!!!!!!J!!+`!!!FS#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!
+!!!)!!#`!!!(,!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!#!!!Y!!!
+"c!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!J!!,J!!!D8#!3!!!!!
+!!3!"!`!!!!!!!!!!!!!!!!%!!!!!!!!!!!)!!#m!!!(0!J%!!!!!!!%!!3%!!!!
+!!!!!!!!!!!!"!!!!!!!!!!!#!!!`!!!"cJ)"!!!!!!!"!!%$!!!!!!!!!!!!!!!
+!!3!!!!!!!!!!!J!!-3!!!Fm#!3!!!!!!!3!"!`!!!!!!!!!!!!!!!!%!!!!!!!!
+!!!)!!$)!!!(3!J%!!!!!!!%!!3-!!!!!!!!!!!!!!!!"!!!!!!!!!!!#!!!c!!!
+"d33"!!!!!!!!!!%$!!!!!!!!!!!!!!!!J3!!!!!!!!!!!J!!0!!!!G)%!3!!!!!
+!!!!"!`!!!!!!!!!!!!!!!)%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -1497,15 +1492,19 @@ qh3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!U!!!!+`!!!#`!!!!Z!!!!,`!!!$!!!!!a!!!!-J!!!$-!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!!J!!!!-!!!!%!!!
+!"3!!!!B!!!!(!!!!#!!!!!N!!!!Y!!!!#J!!!!X!!!!-!!!!$3!!!!i!!!!2!!!
+!%!!!!"%!!!!5!!!!%`!!!"3!!!!9!!!!&J!!!"F!!!!B!!!!'3!!!"S!!!!E!!!
+!(!!!!"d!!!!H!!!!(`!!!#!!!!!K!!!!)J!!!#-!!!!N!!!!*3!!!#B!!!!R!!!
+!+!!!!#N!!!!U!!!!+`!!!#`!!!!Z!!!!,`!!!$!!!!!a!!!!-J!!!$-!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!d!!!
 !3!)!!!!#!!!d!J!!(!)!!"d#!!!H!J!!(`)!!#!#!!!K!J!!)J)!!#-#!!!N!J!
 !*3)!!#B#!!!R!J!!+!)!!#N#!!!U!J!!+`)!!#`#!!!Y!J!!#`)!!!`#!!!0!J!
 !$J)!!!m#!!!3!J!!%3)!!")#!!!6!J!!&!)!!"8#!!!@!J!!&`)!!"J#!!!C!J!
 !'J)!!"X#!!!c!J!!0!)!!#m#!!!`!J!!-J)!!$%#!!!+!J!!!3)!!!3#!!!$!J!
-!!J)!!!N#!!!&!J!!"J)!!!F#!!!)!J!!,J!!!DJ!!3!S!!!!)!14bC!!2cm!!!!
-!!!!!!!!!!j(*N!!!!J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!J)!!!N#!!!&!J!!"J)!!!F#!!!)!J!!,J!!!DN!!3!S!J!!%`)!!"3#!!!9!J!
+!&J)!!"F#!!!B!!)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -1525,15 +1524,15 @@ qh3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!,#2Z!
-!!!!!!!!"!!,#4r!!!J!!!!!!!!!!!!!#`MD!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#`MlJ!!!
+!!!!!!3!#`NI`!!)!!!!!!!!!!!!!!X)fJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!J!!!3!!!!!&!!"rr`!!!!"rr`!!!!"rr`!!!!"rr`!!!!`
-!!3!#!!3!!!!&3!!!"J!"!!%k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!)!!!%!!!!!"3!!Irm!!!!!Irm!!!!!Irm!!!!!Irm!!!!-!!%
+!!J!%!!!!"8!!!!B!!3!"1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -1543,8 +1542,8 @@ qh3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!3!!!2rrrrm!!!!$!!%!!6Sk!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!%!!!$rrrrr!!!!!`!"!!%k1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -1554,8 +1553,8 @@ qh3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!"!!!!rrrrr`!!!!3!!3!"1MTTEQ0XG@4P1J!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!3!!!2rrrrm!!!!%!!%!!6SkD@jME(9NC6S!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -1565,8 +1564,8 @@ qh3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$rrrrr3!!!!J!"!!%k!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!rrrrrd!!!!)!!3!"1J!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -1576,9 +1575,9 @@ qh3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2rrrrp!!!!$!!)
-!!6T0B@028b"6GA"`Eh*d1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$rrrrr3!!!!`!#!!%
+k6@&M6e-J8h9`F'pbG$S!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -1587,23 +1586,20 @@ qh3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!rrr
-rrd!!!!3!!J!"1Ne66$S!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!!!2rrrrp
+!!!!%!!)!!6T08d`k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!%!!!$rrrrr3!!!"3!+!!"0B@028b!f1%XJ6'PZDf9b!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+"!!!!rrrrrd!!!!8!#J!!6@&M6e-J0MK,)%aTEQYPFJ!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -1615,594 +1611,591 @@ rrd!!!!3!!J!"1Ne66$S!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!"(CA4)9&438b!f1%X!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!!6S!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!4f9d5&488&-J0MK,!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!%k!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)!!8eKBdp6)$Bi5b"
--D@jVCA)!!!!!!!!!!!!!!!!!!!!!!#""8&"-!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'!!!!"
-"F("X!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!'!!!!"068a#!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!"-D@)J5@e`Eh*d)$Bi5`!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
-08%a'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"-D@)J5@e`Eh*d)$B
-i5`!!!!!!!!!!!!!!!!!!!!!!!!!!!!"09d0%!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'!!!!"
-23NSJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"08&FJ5@e`Eh*d)$B
-i5`!!!!!!!!!!!!!!!!!!!!!!!!!!!!"36'pL!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'!!!!"
-58e*$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!'!!!!"849K8,Q*S!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!"#B@aXEfpZ)%KPE(!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
-849K8,Q-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"09b"$,d-V+b!f1%X
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"849K8,Q-V+`!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!"09b"$,d-V+b!f1%X!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
-849K8,Q0M!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"09b"$,d-V+b!f1%X
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"849K8,Q0`!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!"09b"$,d-V+b!f1%X!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
-849K8,Q0`F!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"09b"$,d-V+b!f1%X
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"849K8,Q9iF!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
-849K8,QGM!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"(B@eP3fpNC5"$Efj
-fCA*dCA)!!!!!!!!!!!!!!!!!!%!!!!"849K8,QJ!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!"09b"$,d-V+b!f1%X!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!"
-849K8,Q`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"'E'9i)&"bCA"bEf0
-PFh0[FJ!!!!!!!!!!!!!!!!!!!)!!!!"849K8,R!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!"09b"3BA0MB@`J0MK,!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
-849K8,R"KF`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"09b"3BA0MB@`J0MK
-,!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"849K8,R"MD!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!"09b"$,d-V+b!f1%X!!!!!!!!!!!!!!!!!!!!!!!!!!)!!!!"
-849K8,R"MD#XV!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"09b"$,d-V+b!f1%X
-!!!!!!!!!!!!!!!!!!!!!!!!!!)!!!!"849K8,R"`G3!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!"09b"3BA0MB@`J0MK,!!!!!!!!!!!!!!!!!!!!!!!!!)!!!!"
-849K8,R)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"5CAS!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"849K8,R0PC`!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
-849K8,RN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"#DA0[EL"3FQ9`FQp
-MCA0cEh)!!!!!!!!!!!!!!!!!!)!!!!"NEf0e!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'!!!!"
-bFh*M!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!'!!!!"cD'aL!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!"348BJ5@e`Eh*d)$Bi5`!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
-cG(9L!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"348BJ5@e`Eh*d)$B
-i5`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!,Q4[B`!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&!!!!!
-!!!!!,R*cFQ-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!'!!!!!!"3%"!!%!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-'!!!!!!%!!!!!"3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!!&0B@028b!f1%XJ6'P
+ZDf9b!!!!!!!!!!!!!!!!!!!!!!!J39"36!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!!3A"
+`E!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!"J!!!!68e-3J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!6'PL)%PYF'pbG#!f1%X!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69"
+-4J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!6'PL)%PYF'pbG#!f1%X
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69G$4!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!!6d*
++)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69"A)%PYF'pbG#!f1%X
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!8%a[BJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!!8P0
+53`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!"J!!!!9%9B9#jLD!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!3Q&XE'p[EL")C@a`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9
+B9#jM!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ3bp$+bXJ0MK,!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#jM+bX!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!69FJ3bp$+bXJ0MK,!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9
+B9#jMB`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ3bp$+bXJ0MK,!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#jMF!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!69FJ3bp$+bXJ0MK,!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9
+B9#jMF(!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ3bp$+bXJ0MK,!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#jPH(!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9
+B9#jRB`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!4f&YC80[C'8J3fpZGQ9
+bG'9b!!!!!!!!!!!!!!!!!!"!!!!!9%9B9#jS!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!69FJ3bp$+bXJ0MK,!!!!!!!!!!!!!!!!!!!!!!!!!!!3!!!!9%9
+B9#jX!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!4QaPH#"3FQ9`FQpMCA0
+cEh)!!!!!!!!!!!!!!!!!!!#!!!!!9%9B9#j`!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!69FJ8'&cBf&X)$Bi5`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9
+B9#j`BA-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ8'&cBf&X)$Bi5`!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#j`BfJ!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!69FJ3bp$+bXJ0MK,!!!!!!!!!!!!!!!!!!!!!!!!!!#!!!!!9%9
+B9#j`BfJV+`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ3bp$+bXJ0MK,!!!
+!!!!!!!!!!!!!!!!!!!!!!!#!!!!!9%9B9#j`F(8!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!69FJ8'&cBf&X)$Bi5`!!!!!!!!!!!!!!!!!!!!!!!!#!!!!!9%9
+B9#jb!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!8Q9k!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#jcC@F!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9
+B9#jj!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3QPcEfiJ8(*PF(*[Bf9
+cFfpb!!!!!!!!!!!!!!!!!!#!!!!!C'pMG3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!!FR0
+bB`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!"J!!!!FfKXBJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!8%9')%PYF'pbG#!f1%X!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Fh4
+eBJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!8%9')%PYF'pbG#!f1%X
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#jNEf-!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"3!!!!!!!
+!!#jbFh*M!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!"J!!!!!!8"!3!"!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!
+!!!!"!!!!!!8!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!%"!!"YB@PZ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!J"!3%!!!!"!3%!!!%"!3!
-!!!!!!3%!!!%"!!%!!!%%!!!!!!!!!!!!!!J"!!%"!!%"!!!!!3!!#3!!$8GPG%K
-89&"6+$Bi5bN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!$mr2cp"8&"-!!!#!&M!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2cmr2`!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!d!!3!!!!!!%&p09d955e0IF(*PCQPi,QJ!!!!!!!!!!!!
-!!!!!!!!!!!%!!!!!!!!!!!%!!!!!!!!!!!!!"3%"!3!!!3%!!3!!!!!%!!!!!!!
-!!!!!!!!!!!!!!!%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!"!3!!E@&TEJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&p
-IFh4KFR3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)!3%"!!!!!3%"!!!"!3%!!!!
+!!!%"!!!"!3!"!!!""!!!!!!!!!!!!!!)!3!"!3!"!3!!!!%!!!N!!!e(CA4)9&4
+38bJf1%XT!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!r2cmr39"36!!!!J"B`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$mr2cm!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!"!!!*6@9bCf8J6h9
-d!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!2cmr2d&38%`!!3%!!!3J)#!J!j+$B!0dhhJ$!khJ!!8#!3!"!3!"!3%
-!!!%!!!!!!!!!!3%"!3!"!3!"!!%%!!!!!!!!!!!!!!F"!3!"!!!"!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!&pIFh4KFR3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"3!!#%GPG%K89&"6!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!r2cmr39"36!!!"!!!!!3!!!!!3!!!@-!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!6m
-r2cm!!!!!!!!!!J!!!!)!!J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!)!8!!"!!%!!3!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"3R3dp%45FJ*d4"9%%
-R)#G35808*`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!$!!!"!!!!#J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!!J!
-!!!X#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!!-!!!!-!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!!%!!!!$3)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!!`!!"3!!!!i#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!-!!!B!!!!2!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!$!!!(!!!!%!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!#!!
-!!"%#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!!N!!!!5!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!!+!!!!%`)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!!`!!#`!!!"3#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!-!!!`!!!!9!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!$!!!0!!!!&J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!$J!
-!!"F#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!!m!!!!B!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!!3!!!!'3)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!!`!!%3!!!"S#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!-!!")!!!!E!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!$!!!6!!!!(!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!&!!
-!!"d#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!"8!!!!H!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!!@!!!!(`)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!!`!!&`!!!#!#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!-!!"J!!!!K!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!$!!!C!!!!)J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!'J!
-!!#-#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!"X!!!!N!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!!F!!!!*3)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!!`!!(3!!!#B#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!-!!"i!!!!R!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!$!!!I!!!!+!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!)!!
-!!#N#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!#%!!!!U!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!!L!!!!+`)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!!`!!)`!!!#`#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!-!!#3!!!!Y!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!$!!!P!!!!,J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!*J!
-!!#m#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!#F!!!!`!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!!S!!!!-3)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!!`!!+3!!!$)#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!-!!#S!!!!c!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!$!!!V!!!!0!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!,!!
-!!$8#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!#d!!!!f!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!!Z!!!!0`)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!!`!!,`!!!$J#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!-!!$!!!!!j!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!$!!!a!!!!1J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!-J!
-!!$X#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!$-!!!!m!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!!d!!!!23)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!!`!!03!!!$i#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!-!!$B!!!!r!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!$!!!h!!!!3!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!1!!
-!!%%#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!$N!!!"#!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!!k!!!!3`)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!!`!!1`!!!%3#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!-!!$`!!!"&!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!$!!!p!!!!4J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!2J!
-!!%F#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!$m!!!")!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!"!!!!!53)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!!`!!33!!!%S#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!-!!%)!!!",!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!$!!"$!!!!6!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!4!!
-!!%d#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!%8!!!"1!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!"'!!!!6`)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!!`!!4`!!!&!#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!-!!%J!!!"4!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!$!!"*!!!!8J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!5J!
-!!&-#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!%X!!!"8!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!"-!!!!93)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!!`!!63!!!&B#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!-!!%i!!!"A!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!$!!"2!!!!@!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!8!!
-!!&N#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!&%!!!"D!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!"5!!!!@`)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!!`!!8`!!!&`#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!-!!&3!!!"G!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!$!!"9!!!!AJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!9J!
-!!&m#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!&F!!!"J!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!"B!!!!B3)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!!`!!@3!!!')#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!-!!&S!!!"M!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!$!!"E!!!!C!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!A!!
-!!'8#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!&d!!!"Q!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!"H!!!!C`)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!!`!!A`!!!'J#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!-!!'!!!!"T!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!$!!"K!!!!DJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!BJ!
-!!'X#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!'-!!!"X!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!"N!!!!E3)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!!`!!C3!!!'i#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!-!!'B!!!"[!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!$!!"R!!!!F!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!D!!
-!!(%#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!'N!!!"b!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!"U!!!!F`)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!!`!!D`!!!(3#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!-!!'`!!!"e!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!$!!"Y!!!!GJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!EJ!
-!!(F#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!'m!!!"i!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!"`!!!!H3)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!!`!!F3!!!(S#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!-!!()!!!"l!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!$!!"c!!!!I!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!G!!
-!!(d#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!(8!!!"q!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!"f!!!!I`)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!!`!!G`!!!)!#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!-!!(J!!!#"!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!$!!"j!!!!JJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!HJ!
-!!)-#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!(X!!!#%!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!"m!!!!K3)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!!`!!I3!!!)B#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!-!!(i!!!#(!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!$!!"r!!!!L!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!J!!
-!!)N#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!)%!!!#+!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!##!!!!L`)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!!`!!J`!!!)`#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!-!!)3!!!#0!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!$!!#&!!!!MJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!KJ!
-!!)m#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!)F!!!#3!!)"!!!
-!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!L!!!!*%#!3!!!!!!!3!"!3!
-!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!)N!!!#5!J%!!!!!!!%!!3%!!!!!!!!!!!!
-!!!!"!!!!!!!!!!!$!!#+!!!!N`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!
-!!!!!!`!!L`!!!*3#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!)`
-!!!#9!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!#0!!!!PJ)"!!!
-!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!MJ!!!*F#!3!!!!!!!3!"!3!
-!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!)m!!!#B!J%!!!!!!!%!!3%!!!!!!!!!!!!
-!!!!"!!!!!!!!!!!$!!#3!!!!!*N#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!*%!!!#D!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!#
-5!!!!Q`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!N`!!!*`#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!*3!!!#G!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!#9!!!!RJ)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!!PJ!!!*m#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!*F!!!#J!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!#
-B!!!!S3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!Q3!!!+)#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!*S!!!#M!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!#E!!!!T!)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!!R!!!!+8#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!*d!!!#Q!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!#
-H!!!!T`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!R`!!!+J#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!+!!!!#T!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!#K!!!!UJ)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!!SJ!!!+X#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!+-!!!#X!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!#
-N!!!!V3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!T3!!!+i#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!+B!!!#[!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!#R!!!!X!)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!!U!!!!,%#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!+N!!!#b!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!#
-U!!!!X`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!U`!!!,3#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!+`!!!#e!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!#Y!!!!YJ)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!!VJ!!!,F#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!+m!!!#i!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!#
-`!!!!Z3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!X3!!!,S#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!,)!!!#l!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!#c!!!![!)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!!Y!!!!,d#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!,8!!!#q!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!#
-f!!!![`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!Y`!!!-!#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!,J!!!$"!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!#j!!!!`J)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!!ZJ!!!--#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!,X!!!$%!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!#
-m!!!!a3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!![3!!!-B#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!,i!!!$(!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!#r!!!!b!)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!!`!!!!-N#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!-%!!!$+!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!$
-#!!!!b`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!``!!!-`#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!-3!!!$0!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!$&!!!!cJ)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!!aJ!!!-m#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!-F!!!$3!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!$
-)!!!!d3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!b3!!!0)#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!-S!!!$6!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!$,!!!!e!)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!!c!!!!08#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!-d!!!$@!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!$
-1!!!!e`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!c`!!!0J#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!0!!!!$C!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!$4!!!!fJ)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!!dJ!!!0X#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!0-!!!$F!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!$
-8!!!!h3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!e3!!!0i#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!0B!!!$I!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!$A!!!!i!)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!!f!!!!1%#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!0N!!!$L!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!$
-D!!!!i`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!f`!!!13#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!0`!!!$P!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!$G!!!!jJ)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!!hJ!!!1F#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!0m!!!$S!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!$
-J!!!!k3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!i3!!!1S#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!1)!!!$V!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!$M!!!!l!)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!!j!!!!1d#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!18!!!$Z!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!$
-Q!!!!l`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!j`!!!2!#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!1J!!!$a!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!$T!!!!mJ)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!!kJ!!!2-#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!1X!!!$d!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!$
-X!!!!p3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!l3!!!2B#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!1i!!!$h!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!$[!!!!q!)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!!m!!!!2N#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!2%!!!$k!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!$
-b!!!!q`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!m`!!!2`#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!23!!!$p!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!$e!!!!rJ)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!!pJ!!!2m#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!2F!!!%!!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!$
-i!!!"!3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!q3!!!3)#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!2S!!!%$!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!$l!!!""!)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!!r!!!!38#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!2d!!!%'!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!$
-q!!!""`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!r`!!!3J#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!3!!!!%*!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!%"!!!"#J)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!"!J!!!3X#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!3-!!!%-!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!%
-%!!!"$3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!""3!!!3i#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!3B!!!%2!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!%(!!!"%!)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!"#!!!!4%#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!3N!!!%5!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!%
-+!!!"%`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"#`!!!43#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!3`!!!%9!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!%0!!!"&J)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!"$J!!!4F#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!3m!!!%B!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!%
-3!!!"'3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"%3!!!4S#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!4)!!!%E!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!%6!!!"(!)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!"&!!!!4d#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!48!!!%H!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!%
-@!!!"(`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"&`!!!5!#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!4J!!!%K!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!%C!!!")J)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!"'J!!!5-#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!4X!!!%N!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!%
-F!!!"*3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"(3!!!5B#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!4i!!!%R!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!%I!!!"+!)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!")!!!!5N#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!5%!!!%U!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!%
-L!!!"+`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!")`!!!5`#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!53!!!%Y!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!%P!!!",J)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!"*J!!!5m#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!5F!!!%`!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!%
-S!!!"-3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"+3!!!6)#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!5S!!!%c!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!%V!!!"0!)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!",!!!!68#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!5d!!!%f!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!%
-Z!!!"0`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!",`!!!6J#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!6!!!!%j!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!%a!!!"1J)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!"-J!!!6X#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!6-!!!%m!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!%
-d!!!"23)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"03!!!6i#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!6B!!!%r!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!%h!!!"3!)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!"1!!!!8%#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!6N!!!&#!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!%
-k!!!"3`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"1`!!!83#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!6`!!!&&!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!%p!!!"4J)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!"2J!!!8F#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!6m!!!&)!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!&
-!!!!"53)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"33!!!8S#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!8)!!!&,!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!&$!!!"6!)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!"4!!!!8d#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!88!!!&1!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!&
-'!!!"6`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"4`!!!9!#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!8J!!!&4!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!&*!!!"8J)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!"5J!!!9-#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!8X!!!&8!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!&
--!!!"93)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"63!!!9B#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!8i!!!&A!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!&2!!!"@!)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!"8!!!!9N#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!9%!!!&D!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!&
-5!!!"@`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"8`!!!9`#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!93!!!&G!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!&9!!!"AJ)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!"9J!!!9m#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!9F!!!&J!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!&
-B!!!"B3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"@3!!!@)#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!9S!!!&M!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!&E!!!"C!)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!"A!!!!@8#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!9d!!!&Q!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!&
-H!!!"C`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"A`!!!@J#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!@!!!!&T!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!&K!!!"DJ)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!"BJ!!!@X#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!@-!!!&X!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!&
-N!!!"E3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"C3!!!@i#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!@B!!!&[!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!&R!!!"F!)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!"D!!!!A%#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!@N!!!&b!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!&
-U!!!"F`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"D`!!!A3#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!@`!!!&e!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!&Y!!!"GJ)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!"EJ!!!AF#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!@m!!!&i!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!&
-`!!!"H3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"F3!!!AS#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!A)!!!&l!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!&c!!!"I!)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!"G!!!!Ad#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!A8!!!&q!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!&
-f!!!"J!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"G`!!!B%#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!AJ!!!'#!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!&j!!!"J`)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!"HJ!!!B3#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!AX!!!'&!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!&
-m!!!"KJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"I3!!!BF#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!Ai!!!')!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!&r!!!"L3)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!"J!!!!BS#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!-!!B%!!!',!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!'
-#!!!"M!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"J`!!!Bd#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!B3!!!'1!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!'&!!!"M`)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!`!"KJ!!!C!!!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!
-!!!!!!!!$!!'(!!!"N3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!
-"L!!!!C)#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!BN!!!'6!J%
-!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!'+!!!"P!)"!!!!!!!"!!%
-"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"L`!!!C8#!3!!!!!!!3!"!3!!!!!!!!!
-!!!!!!!%!!!!!!!!!!!-!!B`!!!'@!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!
-!!!!!!!!$!!'0!!!"P`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!
-"MJ!!!CJ#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!Bm!!!'C!J%
-!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!'3!!!!!CS#!3!!!!!!!3!
-"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!C%!!!'E!J%!!!!!!!%!!3%!!!!!!!!
-!!!!!!!!"!!!!!!!!!!!$!!'5!!!"R!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!
-!!!!!!!!!!`!"N`!!!Cd#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-
-!!C3!!!'H!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!'9!!!"R`)
-"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"PJ!!!D!#!3!!!!!!!3!
-"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!CF!!!'K!J%!!!!!!!%!!3%!!!!!!!!
-!!!!!!!!"!!!!!!!!!!!$!!'B!!!"SJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!
-!!!!!!!!!!`!"Q3!!!D-#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-
-!!CS!!!(5!J%!!!!!!!%!!3-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!'E!!!"d`)
-"!!!!!!!"!!%$!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"R!!!!G3#!3!!!!!!!3!
-"!`!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!Cd!!!(9!J%!!!!!!!%!!3-!!!!!!!!
-!!!!!!!!"!!!!!!!!!!!$!!'H!!!"T!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!
-!!!!!!!!!!`!"R`!!!GB#!3!!!!!!!3!"!`!!!!!!!!!!!!!!!!%!!!!!!!!!!!-
-!!D!!!!(A!J%!!!!!!!%!!3-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!'K!!!"f!)
-"!!!!!!!"!!%$!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"SJ!!!GN#!3!!!!!!!3!
-"!`!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!D-!!!'Q!J%!!!!!!!%!!3%!!!!!!!!
-!!!!!!!!"!!!!!!!!!!!$!!'N!!!"T`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!!J!!!!-!!!!%!!!!"3!
-!!!B!!!!(!!!!#!!!!!N!!!!+!!!!#`!!!!`!!!!0!!!!$J!!!!m!!!!3!!!!%3!
-!!")!!!!6!!!!&!!!!"8!!!!@!!!!&`!!!"J!!!!C!!!!'J!!!"X!!!!F!!!!(3!
-!!"i!!!!I!!!!)!!!!#%!!!!L!!!!)`!!!#3!!!!P!!!!*J!!!#F!!!!S!!!!+3!
-!!#S!!!!V!!!!,!!!!#d!!!!Z!!!!,`!!!$!!!!!a!!!!-J!!!$-!!!!d!!!!03!
-!!$B!!!!h!!!!1!!!!$N!!!!k!!!!1`!!!$`!!!!p!!!!2J!!!$m!!!"!!!!!33!
-!!%)!!!"$!!!!4!!!!%8!!!"'!!!!4`!!!%J!!!"*!!!!5J!!!%X!!!"-!!!!63!
-!!%i!!!"2!!!!8!!!!&%!!!"5!!!!8`!!!&3!!!"9!!!!9J!!!&F!!!"B!!!!@3!
-!!&S!!!"E!!!!A!!!!&d!!!"H!!!!A`!!!'!!!!"K!!!!BJ!!!'-!!!"N!!!!C3!
-!!'B!!!"R!!!!D!!!!'N!!!"U!!!!D`!!!'`!!!"Y!!!!EJ!!!'m!!!"`!!!!F3!
-!!()!!!"c!!!!G!!!!(8!!!"f!!!!G`!!!(J!!!"j!!!!HJ!!!(X!!!"m!!!!I3!
-!!(i!!!"r!!!!J!!!!)%!!!##!!!!J`!!!)3!!!#&!!!!KJ!!!)F!!!#)!!!!L3!
-!!)S!!!#,!!!!M!!!!)d!!!#1!!!!M`!!!*!!!!!!N3!!!*)!!!#6!!!!P!!!!*8
-!!!#@!!!!P`!!!*J!!!#C!!!!QJ!!!*X!!!#F!!!!R3!!!*i!!!#I!!!!S!!!!+%
-!!!#L!!!!S`!!!+3!!!#P!!!!TJ!!!+F!!!#S!!!!U3!!!+S!!!#V!!!!V!!!!+d
-!!!#Z!!!!V`!!!,!!!!#a!!!!XJ!!!,-!!!#d!!!!Y3!!!,B!!!#h!!!!Z!!!!,N
-!!!#k!!!!Z`!!!,`!!!#p!!!![J!!!,m!!!$!!!!!`3!!!-)!!!$$!!!!a!!!!-8
-!!!$'!!!!a`!!!-J!!!$*!!!!bJ!!!-X!!!$-!!!!c3!!!-i!!!$2!!!!d!!!!0%
-!!!$5!!!!d`!!!03!!!$9!!!!eJ!!!0F!!!$B!!!!f3!!!0S!!!$E!!!!h!!!!0d
-!!!$H!!!!h`!!!1!!!!$K!!!!iJ!!!1-!!!$N!!!!j3!!!1B!!!$R!!!!k!!!!1N
-!!!$U!!!!k`!!!1`!!!$Y!!!!lJ!!!1m!!!$`!!!!m3!!!2)!!!$c!!!!p!!!!28
-!!!$f!!!!p`!!!2J!!!$j!!!!qJ!!!2X!!!$m!!!!r3!!!2i!!!$r!!!"!!!!!3%
-!!!%#!!!"!`!!!33!!!%&!!!""J!!!3F!!!%)!!!"#3!!!3S!!!%,!!!"$!!!!3d
-!!!%1!!!"$`!!!4!!!!%4!!!"%J!!!4-!!!%8!!!"&3!!!4B!!!%A!!!"'!!!!4N
-!!!%D!!!"'`!!!4`!!!%G!!!"(J!!!4m!!!%J!!!")3!!!5)!!!%M!!!"*!!!!58
-!!!%Q!!!"*`!!!5J!!!%T!!!"+J!!!5X!!!%X!!!",3!!!5i!!!%[!!!"-!!!!6%
-!!!%b!!!"-`!!!63!!!%e!!!"0J!!!6F!!!%i!!!"13!!!6S!!!%l!!!"2!!!!6d
-!!!%q!!!"2`!!!8!!!!&"!!!"3J!!!8-!!!&%!!!"43!!!8B!!!&(!!!"5!!!!8N
-!!!&+!!!"5`!!!8`!!!&0!!!"6J!!!8m!!!&3!!!"83!!!9)!!!&6!!!"9!!!!98
-!!!&@!!!"9`!!!9J!!!&C!!!"@J!!!9X!!!&F!!!"A3!!!9i!!!&I!!!"B!!!!@%
-!!!&L!!!"B`!!!@3!!!&P!!!"CJ!!!@F!!!&S!!!"D3!!!@S!!!&V!!!"E!!!!@d
-!!!&Z!!!"E`!!!A!!!!&a!!!"FJ!!!A-!!!&d!!!"G3!!!AB!!!&h!!!"H!!!!AN
-!!!&k!!!"H`!!!A`!!!&p!!!"IJ!!!Am!!!'!!!!"J3!!!B)!!!'$!!!"K!!!!B8
-!!!''!!!"K`!!!BJ!!!'*!!!"LJ!!!BX!!!'-!!!"M3!!!Bi!!!'2!!!"N!!!!!'
-4!!!"NJ!!!C-!!!'8!!!"P3!!!CB!!!'A!!!"Q!!!!Cd!!!'L!!!"S`!!!CN!!!'
-D!!!"Q`!!!C`!!!'H!!!"R`!!!D!!!!'K!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!0!!%!!!!!!""I69G&8NY6Ah"bC@CTH#jS!!!!!!!!!!!!!!!
+!!!!!!!!"!!!!!!!!!!!"!!!!!!!!!!!!!!8"!3%!!!%"!!%!!!!!"!!!!!!!!!!
+!!!!!!!!!!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!D3!!!(
-!!`!!!!-!!D3!!!(D!!%!(!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-!!CJ$!!'
-C!`!"P`-!!CB$!!!#!`!!!`-!!!%$!!!%!`!!"3-!!!B$!!!(!`!!#!-!!!N$!!!
-+!`!!#`-!!!`$!!!0!`!!$J-!!!m$!!!3!`!!%3-!!")$!!!6!`!!&!-!!"8$!!!
-@!`!!&`-!!"J$!!!C!`!!'J-!!"X$!!!F!`!!(3-!!"i$!!!I!`!!)!-!!#%$!!!
-L!`!!)`-!!#3$!!!P!`!!*J-!!#F$!!!S!`!!+3-!!#S$!!!V!`!!,!-!!#d$!!!
-Z!`!!,`-!!$!$!!!a!`!!-J-!!$-$!!!d!`!!03-!!$B$!!!h!`!!1!-!!$N$!!!
-k!`!!1`-!!$`$!!!p!`!!2J-!!$m$!!"!!`!!33-!!%)$!!"$!`!!4!-!!%8$!!"
-'!`!!4`-!!%J$!!"*!`!!5J-!!%X$!!"-!`!!63-!!%i$!!"2!`!!8!-!!&%$!!"
-5!`!!8`-!!&3$!!"9!`!!9J-!!&F$!!"B!`!!@3-!!&S$!!"E!`!!A!-!!&d$!!"
-H!`!!A`-!!'!$!!"K!`!!BJ-!!'-$!!"N!`!!C3-!!'B$!!"R!`!!D!-!!'N$!!"
-U!`!!D`-!!'`$!!"Y!`!!EJ-!!'m$!!"`!`!!F3-!!()$!!"c!`!!G!-!!(8$!!"
-f!`!!G`-!!(J$!!"j!`!!HJ-!!(X$!!"m!`!!I3-!!(i$!!"r!`!"S`-!!)!$!!#
-"!`!!JJ-!!)-$!!#%!`!!K3-!!)B$!!#(!`!!L!-!!)N$!!#+!`!!L`-!!)`$!!#
-0!`!!MJ-!!)m$!!#3!!-!!*%$!!#5!`!!N`-!!*3$!!#9!`!!PJ-!!*F$!!#B!`!
-!Q3-!!*S$!!#E!`!!R!-!!*d$!!#H!`!!R`-!!+!$!!#K!`!!SJ-!!+-$!!#N!`!
-!T3-!!+B$!!#R!`!!U!-!!+N$!!#U!`!!U`-!!+`$!!#Y!`!!VJ-!!+m$!!#`!`!
-!X3-!!,)$!!#c!`!!Y!-!!,8$!!#f!`!!Y`-!!,J$!!#j!`!!ZJ-!!,X$!!#m!`!
-![3-!!,i$!!#r!`!!`!-!!-%$!!$#!`!!``-!!-3$!!$&!`!!aJ-!!-F$!!$)!`!
-!b3-!!-S$!!$,!`!!c!-!!-d$!!$1!`!!c`-!!0!$!!$4!`!!dJ-!!0-$!!$8!`!
-!e3-!!0B$!!$A!`!!f!-!!0N$!!$D!`!!f`-!!0`$!!$G!`!!hJ-!!0m$!!$J!`!
-!i3-!!1)$!!$M!`!!j!-!!18$!!$Q!`!!j`-!!1J$!!$T!`!!kJ-!!1X$!!$X!`!
-!l3-!!1i$!!$[!`!!m!-!!2%$!!$b!`!!m`-!!23$!!$e!`!!pJ-!!2F$!!$i!`!
-!q3-!!2S$!!$l!`!!r!-!!2d$!!$q!`!!r`-!!3!$!!%"!`!"!J-!!3-$!!%%!`!
-""3-!!3B$!!%(!`!"#!-!!3N$!!%+!`!"#`-!!3`$!!%0!`!"$J-!!3m$!!%3!`!
-"%3-!!4)$!!%6!`!"&!-!!48$!!%@!`!"&`-!!4J$!!%C!`!"'J-!!4X$!!%F!`!
-"(3-!!4i$!!%I!`!")!-!!5%$!!%L!`!")`-!!53$!!%P!`!"*J-!!5F$!!%S!`!
-"+3-!!5S$!!%V!`!",!-!!D3$!!%Y!`!",J-!!5m$!!%`!`!"-3-!!6)$!!%c!`!
-"0!-!!68$!!%f!`!"0`-!!6J$!!%j!`!"1J-!!6X$!!%m!`!"23-!!6i$!!%r!`!
-"3!-!!8%$!!&#!`!"3`-!!83$!!&&!`!"4J-!!8F$!!&)!`!"53-!!8S$!!&,!`!
-"6!-!!8d$!!&1!`!"6`-!!9!$!!&4!`!"8J-!!9-$!!&8!`!"93-!!9B$!!&A!`!
-"@!-!!9N$!!&D!`!"@`-!!9`$!!&G!`!"AJ-!!9m$!!&J!`!"B3-!!@)$!!&M!`!
-"C!-!!@8$!!&Q!`!"C`-!!@J$!!&T!`!"DJ-!!@X$!!&X!`!"E3-!!@i$!!&[!`!
-"F!-!!A%$!!&b!`!"F`-!!A3$!!&e!`!"GJ-!!AF$!!&i!`!"H3-!!AS$!!&l!`!
-"I!-!!Ad$!!&q!`!"I`-!!B!$!!'"!`!"JJ-!!B-$!!'%!`!"K3-!!BB$!!'(!`!
-"L!-!!BN$!!'+!`!"L`-!!B`$!!'0!`!"MJ-!!Bm$!!'3!!-!!C%$!!'5!`!"N`-
-!!C3$!!'9!`!"RJ-!!D!$!!'K!`!"Q`-!!D)$!!'D!`!"R!-!!Cd$!!'I!!)!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"IAh0
+dBA*d!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!!3!!#8ePFQGP)%peG!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!$mr2cp"8&"-!!%"!!!%)#!J)!1ARe!$GYpi!`@Z%!!&!J%!!3%!!3%"!!!
+"!!!!!!!!!!%"!3%!!3%!!3!""!!!!!!!!!!!!!!(!3%!!3!!!3!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!"IAh0dBA*d!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!8!!!K(CA4)9&438`!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!2cmr2d&38%`!!!3!!!!%!!!!!%!!!&M!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%r2cm
+r!!!!!!!!!!)!!!!#!!)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!#!&!!!3!"!!%!!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!8*d024%8R)#G%394"*b!
+R8%P$9#F!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!`!!!3!!!!S#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!!)!!!!
+,!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!!$!!!!$!)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!"!!!!!d#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!-!!!8!!!!1!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!$!!!'!!!!$`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!!`!!"`!!!"!#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!!J!!!!
+4!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!!*!!!!%J)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!#J!!!"-#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!-!!!X!!!!8!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!$!!!-!!!!&3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!!`!!$3!!!"B#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!!i!!!!
+A!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!!2!!!!'!)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!%!!!!"N#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!-!!"%!!!!D!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!$!!!5!!!!'`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!!`!!%`!!!"`#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!"3!!!!
+G!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!!9!!!!(J)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!&J!!!"m#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!-!!"F!!!!J!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!$!!!B!!!!)3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!!`!!'3!!!#)#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!"S!!!!
+M!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!!E!!!!*!)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!(!!!!#8#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!-!!"d!!!!Q!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!$!!!H!!!!*`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!!`!!(`!!!#J#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!#!!!!!
+T!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!!K!!!!+J)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!)J!!!#X#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!-!!#-!!!!X!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!$!!!N!!!!,3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!!`!!*3!!!#i#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!#B!!!!
+[!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!!R!!!!-!)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!+!!!!$%#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!-!!#N!!!!b!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!$!!!U!!!!-`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!!`!!+`!!!$3#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!#`!!!!
+e!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!!Y!!!!0J)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!,J!!!$F#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!-!!#m!!!!i!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!$!!!`!!!!13)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!!`!!-3!!!$S#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!$)!!!!
+l!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!!c!!!!2!)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!0!!!!$d#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!-!!$8!!!!q!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!$!!!f!!!!2`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!!`!!0`!!!%!#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!$J!!!"
+"!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!!j!!!!3J)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!1J!!!%-#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!-!!$X!!!"%!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!$!!!m!!!!43)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!!`!!23!!!%B#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!$i!!!"
+(!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!!r!!!!5!)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!3!!!!%N#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!-!!%%!!!"+!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!$!!"#!!!!5`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!!`!!3`!!!%`#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!%3!!!"
+0!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!"&!!!!6J)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!4J!!!%m#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!-!!%F!!!"3!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!$!!")!!!!83)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!!`!!53!!!&)#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!%S!!!"
+6!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!",!!!!9!)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!6!!!!&8#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!-!!%d!!!"@!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!$!!"1!!!!9`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!!`!!6`!!!&J#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!&!!!!"
+C!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!"4!!!!@J)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!8J!!!&X#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!-!!&-!!!"F!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!$!!"8!!!!A3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!!`!!93!!!&i#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!&B!!!"
+I!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!"A!!!!B!)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!@!!!!'%#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!-!!&N!!!"L!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!$!!"D!!!!B`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!!`!!@`!!!'3#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!&`!!!"
+P!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!"G!!!!CJ)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!AJ!!!'F#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!-!!&m!!!"S!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!$!!"J!!!!D3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!!`!!B3!!!'S#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!')!!!"
+V!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!"M!!!!E!)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!C!!!!'d#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!-!!'8!!!"Z!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!$!!"Q!!!!E`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!!`!!C`!!!(!#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!'J!!!"
+a!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!"T!!!!FJ)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!DJ!!!(-#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!-!!'X!!!"d!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!$!!"X!!!!G3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!!`!!E3!!!(B#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!'i!!!"
+h!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!"[!!!!H!)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!F!!!!(N#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!-!!(%!!!"k!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!$!!"b!!!!H`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!!`!!F`!!!(`#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!(3!!!"
+p!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!"e!!!!IJ)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!GJ!!!(m#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!-!!(F!!!#!!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!$!!"i!!!!J3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!!`!!H3!!!))#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!(S!!!#
+$!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!"l!!!!K!)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!I!!!!)8#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!-!!(d!!!#'!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!$!!"q!!!!K`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!!`!!I`!!!)J#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!)!!!!#
+*!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!#"!!!!LJ)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!JJ!!!)X#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!-!!)-!!!#-!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!$!!#%!!!!M3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!!`!!K3!!!)i#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!)B!!!#
+2!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!#(!!!!N!!#!3!!!!!
+!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!)J!!!#4!J%!!!!!!!%!!3%!!!!
+!!!!!!!!!!!!"!!!!!!!!!!!$!!#*!!!!NJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!
+!!3!!!!!!!!!!!`!!LJ!!!*-#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!
+!!!-!!)X!!!#8!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!#-!!!
+!P3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!M3!!!*B#!3!!!!!
+!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!)i!!!#A!J%!!!!!!!%!!3%!!!!
+!!!!!!!!!!!!"!!!!!!!!!!!$!!#2!!!!Q!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!
+!!3!!!!!!!!!!!`!!N!!!!!#C!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!#4!!!!QJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!NJ!
+!!*X#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!*-!!!#F!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!#8!!!!R3)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!!P3!!!*i#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!*B!!!#I!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!#A!!!!S!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!Q!!
+!!+%#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!*N!!!#L!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!#D!!!!S`)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!!Q`!!!+3#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!*`!!!#P!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!#G!!!!TJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!RJ!
+!!+F#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!*m!!!#S!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!#J!!!!U3)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!!S3!!!+S#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!+)!!!#V!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!#M!!!!V!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!T!!
+!!+d#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!+8!!!#Z!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!#Q!!!!V`)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!!T`!!!,!#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!+J!!!#a!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!#T!!!!XJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!UJ!
+!!,-#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!+X!!!#d!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!#X!!!!Y3)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!!V3!!!,B#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!+i!!!#h!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!#[!!!!Z!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!X!!
+!!,N#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!,%!!!#k!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!#b!!!!Z`)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!!X`!!!,`#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!,3!!!#p!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!#e!!!![J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!YJ!
+!!,m#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!,F!!!$!!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!#i!!!!`3)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!!Z3!!!-)#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!,S!!!$$!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!#l!!!!a!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!![!!
+!!-8#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!,d!!!$'!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!#q!!!!a`)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!![`!!!-J#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!-!!!!$*!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!$"!!!!bJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!`J!
+!!-X#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!--!!!$-!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!$%!!!!c3)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!!a3!!!-i#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!-B!!!$2!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!$(!!!!d!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!b!!
+!!0%#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!-N!!!$5!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!$+!!!!d`)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!!b`!!!03#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!-`!!!$9!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!$0!!!!eJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!cJ!
+!!0F#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!-m!!!$B!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!$3!!!!f3)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!!d3!!!0S#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!0)!!!$E!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!$6!!!!h!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!e!!
+!!0d#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!08!!!$H!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!$@!!!!h`)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!!e`!!!1!#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!0J!!!$K!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!$C!!!!iJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!fJ!
+!!1-#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!0X!!!$N!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!$F!!!!j3)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!!h3!!!1B#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!0i!!!$R!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!$I!!!!k!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!i!!
+!!1N#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!1%!!!$U!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!$L!!!!k`)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!!i`!!!1`#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!13!!!$Y!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!$P!!!!lJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!jJ!
+!!1m#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!1F!!!$`!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!$S!!!!m3)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!!k3!!!2)#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!1S!!!$c!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!$V!!!!p!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!l!!
+!!28#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!1d!!!$f!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!$Z!!!!p`)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!!l`!!!2J#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!2!!!!$j!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!$a!!!!qJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!mJ!
+!!2X#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!2-!!!$m!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!$d!!!!r3)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!!p3!!!2i#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!2B!!!$r!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!$h!!!"!!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!q!!
+!!3%#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!2N!!!%#!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!$k!!!"!`)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!!q`!!!33#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!2`!!!%&!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!$p!!!""J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!!rJ!
+!!3F#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!2m!!!%)!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!%!!!!"#3)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!"!3!!!3S#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!3)!!!%,!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!%$!!!"$!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!""!!
+!!3d#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!38!!!%1!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!%'!!!"$`)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!""`!!!4!#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!3J!!!%4!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!%*!!!"%J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"#J!
+!!4-#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!3X!!!%8!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!%-!!!"&3)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!"$3!!!4B#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!3i!!!%A!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!%2!!!"'!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"%!!
+!!4N#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!4%!!!%D!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!%5!!!"'`)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!"%`!!!4`#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!43!!!%G!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!%9!!!"(J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"&J!
+!!4m#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!4F!!!%J!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!%B!!!")3)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!"'3!!!5)#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!4S!!!%M!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!%E!!!"*!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"(!!
+!!58#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!4d!!!%Q!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!%H!!!"*`)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!"(`!!!5J#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!5!!!!%T!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!%K!!!"+J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!")J!
+!!5X#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!5-!!!%X!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!%N!!!",3)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!"*3!!!5i#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!5B!!!%[!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!%R!!!"-!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"+!!
+!!6%#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!5N!!!%b!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!%U!!!"-`)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!"+`!!!63#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!5`!!!%e!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!%Y!!!"0J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!",J!
+!!6F#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!5m!!!%i!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!%`!!!"13)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!"-3!!!6S#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!6)!!!%l!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!%c!!!"2!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"0!!
+!!6d#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!68!!!%q!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!%f!!!"2`)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!"0`!!!8!#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!6J!!!&"!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!%j!!!"3J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"1J!
+!!8-#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!6X!!!&%!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!%m!!!"43)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!"23!!!8B#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!6i!!!&(!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!%r!!!"5!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"3!!
+!!8N#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!8%!!!&+!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!&#!!!"5`)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!"3`!!!8`#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!83!!!&0!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!&&!!!"6J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"4J!
+!!8m#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!8F!!!&3!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!&)!!!"83)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!"53!!!9)#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!8S!!!&6!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!&,!!!"9!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"6!!
+!!98#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!8d!!!&@!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!&1!!!"9`)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!"6`!!!9J#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!9!!!!&C!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!&4!!!"@J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"8J!
+!!9X#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!9-!!!&F!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!&8!!!"A3)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!"93!!!9i#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!9B!!!&I!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!&A!!!"B!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"@!!
+!!@%#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!9N!!!&L!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!&D!!!"B`)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!"@`!!!@3#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!9`!!!&P!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!&G!!!"CJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"AJ!
+!!@F#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!9m!!!&S!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!&J!!!"D3)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!"B3!!!@S#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!@)!!!&V!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!&M!!!"E!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"C!!
+!!@d#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!@8!!!&Z!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!&Q!!!"E`)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!"C`!!!A!#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!@J!!!&a!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!&T!!!"FJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"DJ!
+!!A-#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!@X!!!&d!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!&X!!!"G3)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!"E3!!!AB#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!@i!!!&h!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!&[!!!"H!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"F!!
+!!AN#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!A%!!!&k!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!&b!!!"H`)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!"F`!!!A`#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!A3!!!&p!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!&e!!!"IJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"GJ!
+!!B!#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!AF!!!'"!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!&i!!!"JJ)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!"H3!!!B-#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!AS!!!'%!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!&l!!!"K3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"I!!
+!!BB#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!Ad!!!'(!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!&q!!!"L!)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!"I`!!!BN#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!B!!!!'+!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!$!!'"!!!"L`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"JJ!
+!!B`#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!B-!!!'0!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!'%!!!"MJ)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!!`!"K3!!!Bm#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!-!!BB!!!'3!!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!
+!!!!!!`!"K`!!!C%#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!BJ
+!!!'5!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!'*!!!"N`)"!!!
+!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"LJ!!!C3#!3!!!!!!!3!"!3!
+!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!BX!!!'9!J%!!!!!!!%!!3%!!!!!!!!!!!!
+!!!!"!!!!!!!!!!!$!!'-!!!"PJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!
+!!!!!!`!"M3!!!CF#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!Bi
+!!!'B!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!'2!!!"Q3)"!!!
+!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"N!!!!!'D!J%!!!!!!!%!!3%
+!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!'4!!!"Q`)"!!!!!!!"!!%"!!!!!!!!!!!
+!!!!!!3!!!!!!!!!!!`!"NJ!!!C`#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
+!!!!!!!-!!C-!!!'G!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!'
+8!!!"RJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"P3!!!Cm#!3!
+!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!CB!!!'J!J%!!!!!!!%!!3%
+!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!'A!!!"S3)"!!!!!!!"!!%"!!!!!!!!!!!
+!!!!!!3!!!!!!!!!!!`!"Q!!!!D)#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
+!!!!!!!-!!CN!!!'M!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!'
+D!!!"d`)"!!!!!!!"!!%$!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"Q`!!!G3#!3!
+!!!!!!3!"!`!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!C`!!!(9!J%!!!!!!!%!!3-
+!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!'G!!!"eJ)"!!!!!!!"!!%$!!!!!!!!!!!
+!!!!!!3!!!!!!!!!!!`!"RJ!!!D3#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
+!!!!!!!-!!Cm!!!(A!J%!!!!!!!%!!3-!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!'
+J!!!"f!)"!!!!!!!"!!%$!!!!!!!!!!!!!!!!!3!!!!!!!!!!!`!"S3!!!GN#!3!
+!!!!!!3!"!`!!!!!!!!!!!!!!!!%!!!!!!!!!!!-!!D)!!!(D!J%!!!!!!!%!!3-
+!!!!!!!!!!!!!!!!"!!!!!!!!!!!$!!'M!!!"TJ)"!!!!!!!"!!%"!!!!!!!!!!!
+!!!!!!3!!!!!!!!!!!`!"T!!!!DF#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
+!!!!!!!-!!D8!!!'S!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!!!!)!!!!$!!!!"!!!!!8!!!!
+'!!!!"`!!!!J!!!!*!!!!#J!!!!X!!!!-!!!!$3!!!!i!!!!2!!!!%!!!!"%!!!!
+5!!!!%`!!!"3!!!!9!!!!&J!!!"F!!!!B!!!!'3!!!"S!!!!E!!!!(!!!!"d!!!!
+H!!!!(`!!!#!!!!!K!!!!)J!!!#-!!!!N!!!!*3!!!#B!!!!R!!!!+!!!!#N!!!!
+U!!!!+`!!!#`!!!!Y!!!!,J!!!#m!!!!`!!!!-3!!!$)!!!!c!!!!0!!!!$8!!!!
+f!!!!0`!!!$J!!!!j!!!!1J!!!$X!!!!m!!!!23!!!$i!!!!r!!!!3!!!!%%!!!"
+#!!!!3`!!!%3!!!"&!!!!4J!!!%F!!!")!!!!53!!!%S!!!",!!!!6!!!!%d!!!"
+1!!!!6`!!!&!!!!"4!!!!8J!!!&-!!!"8!!!!93!!!&B!!!"A!!!!@!!!!&N!!!"
+D!!!!@`!!!&`!!!"G!!!!AJ!!!&m!!!"J!!!!B3!!!')!!!"M!!!!C!!!!'8!!!"
+Q!!!!C`!!!'J!!!"T!!!!DJ!!!'X!!!"X!!!!E3!!!'i!!!"[!!!!F!!!!(%!!!"
+b!!!!F`!!!(3!!!"e!!!!GJ!!!(F!!!"i!!!!H3!!!(S!!!"l!!!!I!!!!(d!!!"
+q!!!!I`!!!)!!!!#"!!!!JJ!!!)-!!!#%!!!!K3!!!)B!!!#(!!!!L!!!!)N!!!#
++!!!!L`!!!)`!!!#0!!!!MJ!!!)m!!!#3!!!!!*%!!!#5!!!!N`!!!*3!!!#9!!!
+!PJ!!!*F!!!#B!!!!Q3!!!*S!!!#E!!!!R!!!!*d!!!#H!!!!R`!!!+!!!!#K!!!
+!SJ!!!+-!!!#N!!!!T3!!!+B!!!#R!!!!U!!!!+N!!!#U!!!!U`!!!+`!!!#Y!!!
+!VJ!!!+m!!!#`!!!!X3!!!,)!!!#c!!!!Y!!!!,8!!!#f!!!!Y`!!!,J!!!#j!!!
+!ZJ!!!,X!!!#m!!!![3!!!,i!!!#r!!!!`!!!!-%!!!$#!!!!``!!!-3!!!$&!!!
+!aJ!!!-F!!!$)!!!!b3!!!-S!!!$,!!!!c!!!!-d!!!$1!!!!c`!!!0!!!!$4!!!
+!dJ!!!0-!!!$8!!!!e3!!!0B!!!$A!!!!f!!!!0N!!!$D!!!!f`!!!0`!!!$G!!!
+!hJ!!!0m!!!$J!!!!i3!!!1)!!!$M!!!!j!!!!18!!!$Q!!!!j`!!!1J!!!$T!!!
+!kJ!!!1X!!!$X!!!!l3!!!1i!!!$[!!!!m!!!!2%!!!$b!!!!m`!!!23!!!$e!!!
+!pJ!!!2F!!!$i!!!!q3!!!2S!!!$l!!!!r!!!!2d!!!$q!!!!r`!!!3!!!!%"!!!
+"!J!!!3-!!!%%!!!""3!!!3B!!!%(!!!"#!!!!3N!!!%+!!!"#`!!!3`!!!%0!!!
+"$J!!!3m!!!%3!!!"%3!!!4)!!!%6!!!"&!!!!48!!!%@!!!"&`!!!4J!!!%C!!!
+"'J!!!4X!!!%F!!!"(3!!!4i!!!%I!!!")!!!!5%!!!%L!!!")`!!!53!!!%P!!!
+"*J!!!5F!!!%S!!!"+3!!!5S!!!%V!!!",!!!!5d!!!%Z!!!",`!!!6!!!!%a!!!
+"-J!!!6-!!!%d!!!"03!!!6B!!!%h!!!"1!!!!6N!!!%k!!!"1`!!!6`!!!%p!!!
+"2J!!!6m!!!&!!!!"33!!!8)!!!&$!!!"4!!!!88!!!&'!!!"4`!!!8J!!!&*!!!
+"5J!!!8X!!!&-!!!"63!!!8i!!!&2!!!"8!!!!9%!!!&5!!!"8`!!!93!!!&9!!!
+"9J!!!9F!!!&B!!!"@3!!!9S!!!&E!!!"A!!!!9d!!!&H!!!"A`!!!@!!!!&K!!!
+"BJ!!!@-!!!&N!!!"C3!!!@B!!!&R!!!"D!!!!@N!!!&U!!!"D`!!!@`!!!&Y!!!
+"EJ!!!@m!!!&`!!!"F3!!!A)!!!&c!!!"G!!!!A8!!!&f!!!"G`!!!AJ!!!&j!!!
+"HJ!!!AX!!!&m!!!"I3!!!Ai!!!&r!!!"J!!!!B%!!!'#!!!"J`!!!B3!!!'&!!!
+"KJ!!!BF!!!')!!!"L3!!!BS!!!',!!!"M!!!!Bd!!!'1!!!"M`!!!C!!!!!"N3!
+!!C)!!!'6!!!"P!!!!C8!!!'@!!!"P`!!!CJ!!!'G!!!"SJ!!!D-!!!'N!!!"Q3!
+!!CS!!!'E!!!"R!!!!Ci!!!'I!!!"S!!!!D%!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'P!!!"`!-
+!!!!$!!'P!!!"f`!"!"`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!'B!`!"Q3-
+!!D8$!!'A!`!"PJ-!!!)$!!!$!`!!!3-!!!3$!!!&!`!!"J-!!!F$!!!)!`!!#3-
+!!!S$!!!,!`!!$!-!!!d$!!!1!`!!$`-!!"!$!!!4!`!!%J-!!"-$!!!8!`!!&3-
+!!"B$!!!A!`!!'!-!!"N$!!!D!`!!'`-!!"`$!!!G!`!!(J-!!"m$!!!J!`!!)3-
+!!#)$!!!M!`!!*!-!!#8$!!!Q!`!!*`-!!#J$!!!T!`!!+J-!!#X$!!!X!`!!,3-
+!!#i$!!![!`!!-!-!!$%$!!!b!`!!-`-!!$3$!!!e!`!!0J-!!$F$!!!i!`!!13-
+!!$S$!!!l!`!!2!-!!$d$!!!q!`!!2`-!!%!$!!""!`!!3J-!!%-$!!"%!`!!43-
+!!%B$!!"(!`!!5!-!!%N$!!"+!`!!5`-!!%`$!!"0!`!!6J-!!%m$!!"3!`!!83-
+!!&)$!!"6!`!!9!-!!&8$!!"@!`!!9`-!!&J$!!"C!`!!@J-!!&X$!!"F!`!!A3-
+!!&i$!!"I!`!!B!-!!'%$!!"L!`!!B`-!!'3$!!"P!`!!CJ-!!'F$!!"S!`!!D3-
+!!'S$!!"V!`!!E!-!!'d$!!"Z!`!!E`-!!(!$!!"a!`!!FJ-!!(-$!!"d!`!!G3-
+!!(B$!!"h!`!!H!-!!(N$!!"k!`!!H`-!!(`$!!"p!`!!IJ-!!(m$!!#!!`!!J3-
+!!))$!!#$!`!!K!-!!)8$!!'M!`!!KJ-!!)F$!!#)!`!!L3-!!)S$!!#,!`!!M!-
+!!)d$!!#1!`!!M`-!!*!!!`!!N3-!!*)$!!#6!`!!P!-!!*8$!!#@!`!!P`-!!*J
+$!!#C!`!!QJ-!!*X$!!#F!`!!R3-!!*i$!!#I!`!!S!-!!+%$!!#L!`!!S`-!!+3
+$!!#P!`!!TJ-!!+F$!!#S!`!!U3-!!+S$!!#V!`!!V!-!!+d$!!#Z!`!!V`-!!,!
+$!!#a!`!!XJ-!!,-$!!#d!`!!Y3-!!,B$!!#h!`!!Z!-!!,N$!!#k!`!!Z`-!!,`
+$!!#p!`!![J-!!,m$!!$!!`!!`3-!!-)$!!$$!`!!a!-!!-8$!!$'!`!!a`-!!-J
+$!!$*!`!!bJ-!!-X$!!$-!`!!c3-!!-i$!!$2!`!!d!-!!0%$!!$5!`!!d`-!!03
+$!!$9!`!!eJ-!!0F$!!$B!`!!f3-!!0S$!!$E!`!!h!-!!0d$!!$H!`!!h`-!!1!
+$!!$K!`!!iJ-!!1-$!!$N!`!!j3-!!1B$!!$R!`!!k!-!!1N$!!$U!`!!k`-!!1`
+$!!$Y!`!!lJ-!!1m$!!$`!`!!m3-!!2)$!!$c!`!!p!-!!28$!!$f!`!!p`-!!2J
+$!!$j!`!!qJ-!!2X$!!$m!`!!r3-!!2i$!!$r!`!"!!-!!3%$!!%#!`!"!`-!!33
+$!!%&!`!""J-!!3F$!!%)!`!"#3-!!3S$!!%,!`!"$!-!!3d$!!%1!`!"$`-!!4!
+$!!%4!`!"%J-!!4-$!!%8!`!"&3-!!4B$!!%A!`!"'!-!!4N$!!%D!`!"'`-!!4`
+$!!%G!`!"(J-!!4m$!!%J!`!")3-!!5)$!!%M!`!"*!-!!58$!!%Q!`!"*`-!!5J
+$!!%T!`!"+J-!!5X$!!%X!`!",3-!!D3$!!%Z!`!",`-!!6!$!!%a!`!"-J-!!6-
+$!!%d!`!"03-!!6B$!!%h!`!"1!-!!6N$!!%k!`!"1`-!!6`$!!%p!`!"2J-!!6m
+$!!&!!`!"33-!!8)$!!&$!`!"4!-!!88$!!&'!`!"4`-!!8J$!!&*!`!"5J-!!8X
+$!!&-!`!"63-!!8i$!!&2!`!"8!-!!9%$!!&5!`!"8`-!!93$!!&9!`!"9J-!!9F
+$!!&B!`!"@3-!!9S$!!&E!`!"A!-!!9d$!!&H!`!"A`-!!@!$!!&K!`!"BJ-!!@-
+$!!&N!`!"C3-!!@B$!!&R!`!"D!-!!@N$!!&U!`!"D`-!!@`$!!&Y!`!"EJ-!!@m
+$!!&`!`!"F3-!!A)$!!&c!`!"G!-!!A8$!!&f!`!"G`-!!AJ$!!&j!`!"HJ-!!AX
+$!!&m!`!"I3-!!Ai$!!&r!`!"J!-!!B%$!!'#!`!"J`-!!B3$!!'&!`!"KJ-!!BF
+$!!')!`!"L3-!!BS$!!',!`!"M!-!!Bd$!!'1!`!"M`-!!C!!!`!"N3-!!C)$!!'
+6!`!"P!-!!C8$!!'H!`!"S!-!!D%$!!'E!`!"SJ-!!CS$!!'F!`!"R3-!!Cm!!J!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2217,25 +2210,23 @@ f!`!!G`-!!(J$!!"j!`!!HJ-!!(X$!!"m!`!!I3-!!(i$!!"r!`!"S`-!!)!$!!#
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#`MlJ!!!!!!!!!3!#`NI`!!)!!!!
-!!!!!!!!!!X)fJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)!!!%
-!!!!!"3!!Irm!!!!!Irm!!!!!Irm!!!!!Irm!!!!-!!%!!J!'!!!!"8!!!!J!!3!
-"1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!,#2Z!!!!!!!!!"!!,#4r!!!J!
+!!!!!!!!!!!!#`MD!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!J!
+!!3!!!!!&!!"rr`!!!!"rr`!!!!"rr`!!!!"rr`!!!!`!!3!#!!B!!!!&3!!!#!!
+"!!%k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!!!$rrrr
-r!!!!!`!"!!%k1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2243,10 +2234,11 @@ r!!!!!`!"!!%k1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!!!2r
+rrrm!!!!$!!%!!6Sk!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!3!!!2rrrrm!!!!%!!%!!6SkD@jME(9NC6S!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2254,10 +2246,10 @@ r!!!!!`!"!!%k1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!"!!!!rrrrr`!!!!3!!3!"1MTTEQ0XG@4P1J!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!rrrrrd!!!!)!!3!"1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2265,11 +2257,10 @@ r!!!!!`!"!!%k1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!$rrrrr3!!!!J!"!!%k!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!$rrrrr3!!!!`!"!!%k1MT(990*1QPZBfaeC'8
-k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2277,10 +2268,10 @@ k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2rrrrp!!!!$!!%!!6Sk1NG98dNkD@jME(9
+NC6S!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2rrrrp!!!!%!!%!!6Sk1NG98dN
-kE'PL1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2288,10 +2279,10 @@ kE'PL1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!rrrrrd!!!!3!!3!"1MSk4e9
+656TXD@)k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!rrrrrd!!!!8!!J!
-"1NeKBdp6)&0eF("[FR3k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2299,10 +2290,10 @@ kE'PL1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$rrrrr3!!!"3!
+#!!%k6@&M6e-J8h9`F'pbG$S!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!!!$rrrr
-r3!!!"J!#!!%k690-1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2310,10 +2301,11 @@ r3!!!"J!#!!%k690-1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!!!2r
+rrrp!!!!'!!)!!6T08d`k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!3!!!2rrrrp!!!!(!!S!!%eKBdp6)$Bi5b"-D@jVCA)!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2321,6 +2313,7 @@ r3!!!"J!#!!%k690-1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!"!!!!rrrrrd!!!!F!#J!!6@&M6e-J0MK,)%aTEQYPFJ!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2329,171 +2322,177 @@ r3!!!"J!#!!%k690-1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!%aTBP066#!f1%X!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!"1J!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!6'PL8e0-)$Bi5`!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!%k!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!J!"6@&M6e-J0MK,)%a
-TEQYPFJ!!!!!!!!!!!!!!!!!!!!!!)%&38%`!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!B!!!!%&
-`F'`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!B!!!!%e06%)!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!%aTBL"*EA"[FR3J0MK,!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%e
-36%B!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%aTBL"*EA"[FR3J0MK
-,!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%eA3d3!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!B!!!!%p
-#5L!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%e39b"*EA"[FR3J0MK
-,!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&"-Ef)!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!B!!!!&*
-68N-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!B!!!!&4&@&3ZBQJ!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!%*KE'a[EfiJ5'9XF!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&4
-&@&3ZB`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%eA)%-[3bXV)$Bi5`!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&4&@&3ZBbXV!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!%eA)%-[3bXV)$Bi5`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&4
-&@&3ZBf-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%eA)%-[3bXV)$Bi5`!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&4&@&3ZBh!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!%eA)%-[3bXV)$Bi5`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&4
-&@&3ZBh"`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%eA)%-[3bXV)$Bi5`!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&4&@&3ZCAK`!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&4
-&@&3ZCf-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%GKE@9$Ef4P)%0[ERC
-PFR4PFJ!!!!!!!!!!!!!!!!!!3!!!!&4&@&3ZD!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!%eA)%-[3bXV)$Bi5`!!!!!!!!!!!!!!!!!!!!!!!!!!%!!!!&4
-&@&3ZE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%CXCAJJ8(*PF(*[Bf9
-cFfpb!!!!!!!!!!!!!!!!!!!!J!!!!&4&@&3ZF!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!%eA)&"KFf0KE#!f1%X!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&4
-&@&3ZF'&c!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%eA)&"KFf0KE#!f1%X
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&4&@&3ZF'0S!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!%eA)%-[3bXV)$Bi5`!!!!!!!!!!!!!!!!!!!!!!!!!!J!!!!&4
-&@&3ZF'0S+bX!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%eA)%-[3bXV)$Bi5`!
-!!!!!!!!!!!!!!!!!!!!!!!!!J!!!!&4&@&3ZF("e!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!%eA)&"KFf0KE#!f1%X!!!!!!!!!!!!!!!!!!!!!!!!!J!!!!&4
-&@&3ZFJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&*PHJ!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&4&@&3ZFf9R!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&4
-&@&3ZH3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%*TFfpZ)&"bCA"bEf0
-PFh0[FJ!!!!!!!!!!!!!!!!!!J!!!!'4[Bh8!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!B!!!!(*
-cFQ-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!B!!!!(0SE')!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!&"&4L"*EA"[FR3J0MK,!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(0
-dG@)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&"&4L"*EA"[FR3J0MK
-,!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!ZC'pM!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!8!!!!!!
-!!!!ZFR0bB`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!B!!!!!!&!3%!!3!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!B
-!!!!!!3!!!!!&!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!!&0B@028b!f1%X
+J6'PZDf9b!!!!!!!!!!!!!!!!!!!!!!!J39"36!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!
+!3A"`E!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!!68e-3J!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!6'PL)%PYF'pbG#!f1%X!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!69"-4J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!6'PL)%PYF'pbG#!
+f1%X!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69G$4!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!
+!6d*+)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69"A)%PYF'pbG#!
+f1%X!!!!!!!!!!!!!!!!!!!!!!!!!!!!!8%a[BJ!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!
+!8P053`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!!9%9B9#jLD!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!3Q&XE'p[EL")C@a`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!9%9B9#jM!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ3bp$+bXJ0MK
+,!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#jM+bX!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!69FJ3bp$+bXJ0MK,!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!9%9B9#jMB`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ3bp$+bXJ0MK
+,!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#jMF!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!69FJ3bp$+bXJ0MK,!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!9%9B9#jMF(!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ3bp$+bXJ0MK
+,!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#jPH(!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!9%9B9#jRB`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!4f&YC80[C'8J3fp
+ZGQ9bG'9b!!!!!!!!!!!!!!!!!!"!!!!!9%9B9#jS!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!69FJ3bp$+bXJ0MK,!!!!!!!!!!!!!!!!!!!!!!!!!!!3!!!
+!9%9B9#jX!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!4QaPH#"3FQ9`FQp
+MCA0cEh)!!!!!!!!!!!!!!!!!!!#!!!!!9%9B9#j`!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!69FJ8'&cBf&X)$Bi5`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!9%9B9#j`BA-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ8'&cBf&X)$B
+i5`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#j`BfJ!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!69FJ3bp$+bXJ0MK,!!!!!!!!!!!!!!!!!!!!!!!!!!#!!!!
+!9%9B9#j`BfJV+`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ3bp$+bXJ0MK
+,!!!!!!!!!!!!!!!!!!!!!!!!!!#!!!!!9%9B9#j`F(8!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!69FJ8'&cBf&X)$Bi5`!!!!!!!!!!!!!!!!!!!!!!!!#!!!!
+!9%9B9#jb!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!8Q9k!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#jcC@F!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!9%9B9#jj!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3QPcEfiJ8(*PF(*
+[Bf9cFfpb!!!!!!!!!!!!!!!!!!#!!!!!C'pMG3!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!
+!FR0bB`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!!FfKXBJ!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!8%9')%PYF'pbG#!f1%X!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!Fh4eBJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!8%9')%PYF'pbG#!
+f1%X!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#jNEf-!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"3!!!
+!!!!!!#jbFh*M!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!!!!8"!3!"!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!3%!!'eKD@i!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!"J!!!!!"!!!!!!8!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!%"!3!!!!%"!3!!!3%"!!!
-!!!!"!3!!!3%!!3!!!33!!!!!!!!!!!!!#!%!!3%!!3%!!!!"!!!*!!-B6'PL8e0
--,MBi5b"'B5JdD9miC#NZ6'PL!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!2cmr2cmr2cm!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!r2cmr!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!$3!"!!!!!!!9AdeA49*,8ep(990*Ah"bC@CTH#jS!!!!!!!
-!!!!!!!!!!3!!!!!!!!!!!3!!!!!!!!!!!!!&!3%"!!!"!3!"!!!!!!3!!!!!!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!"!3!!E@&TEJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Aep
-cG'&bG!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!%!!!P0CA*RC5"2GA3
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!r2cmr39"36!!"!3!!"#!J)#!$NS0J!h6IH!-$VH!!"3)"!!%"!!%"!3!
-!!3!!!!!!!!!"!3%"!!%"!!%!!33!!!!!!!!!!!!!"`%"!!%!!!%!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!AepcG'&bG!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)!3%"!!!!!3%"!!!"!3%
+!!!!!!!%"!!!"!3!"!!!""!!!!!!!!!!!!!!)!3!"!3!"!3!!!!%!!!N!!aK-D@*
+68d`Z0MK,)%CK+$4TAcKN+5j-D@)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!r2cmr2cmr2`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$mr2cm
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!J!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!0!!%!!!!!!"9I69G&8NY6AdG98dPIF(*PCQPi,QJ!!!!
+!!!!!!!!!!!!"!!!!!!!!!!!"!!!!!!!!!!!!!!8"!3%!!!%"!!%!!!!!"!!!!!!
+!!!!!!!!!!!!!!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&!!!)4f9d5&488&-!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!$mr2cp"8&"-!!!%!!!!"!!!!!"!!!"B`!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"2cm
-r2`!!!!!!!!!#!!!!!J!#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!J"3!!%!!3!"!!%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
+IAh0dBA*d!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!!3!!#8ePFQGP)%p
+eG!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!$mr2cp"8&"-!!%"!!!%)#!J)!1ARe!$GYpi!`@Z%!!&!J%!!3%!!3%
+"!!!"!!!!!!!!!!%"!3%!!3%!!3!""!!!!!!!!!!!!!!(!3%!!3!!!3!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!"IAh0dBA*d!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&#G$6d4&*b!R4%&835F
-J*e"*3e3R!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!3!!!%!!!!+!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!%!!!#!!!
-!#`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"!!!!`!!!!`#!3!!!!!
-!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!3!!!3!!!!0!J%!!!!!!!%!!3%!!!!
-!!!!!!!!!!!!"!!!!!!!!!!!%!!!&!!!!$J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!
-!!3!!!!!!!!!!"!!!"J!!!!m#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!
-!!!3!!!F!!!!3!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!%!!!)!!!
-!%3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"!!!#3!!!")#!3!!!!!
-!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!3!!!S!!!!6!J%!!!!!!!%!!3%!!!!
-!!!!!!!!!!!!"!!!!!!!!!!!%!!!,!!!!&!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!
-!!3!!!!!!!!!!"!!!$!!!!"8#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!
-!!!3!!!d!!!!@!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!%!!!1!!!
-!&`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"!!!$`!!!"J#!3!!!!!
-!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!3!!"!!!!!C!J%!!!!!!!%!!3%!!!!
-!!!!!!!!!!!!"!!!!!!!!!!!%!!!4!!!!'J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!
-!!3!!!!!!!!!!"!!!%J!!!"X#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!
-!!!3!!"-!!!!F!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!%!!!8!!!
-!(3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"!!!&3!!!"i#!3!!!!!
-!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!3!!"B!!!!I!J%!!!!!!!%!!3%!!!!
-!!!!!!!!!!!!"!!!!!!!!!!!%!!!A!!!!)!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!
-!!3!!!!!!!!!!"!!!'!!!!#%#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!
-!!!3!!"N!!!!L!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!%!!!D!!!
-!)`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"!!!'`!!!#3#!3!!!!!
-!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!3!!"`!!!!P!J%!!!!!!!%!!3%!!!!
-!!!!!!!!!!!!"!!!!!!!!!!!%!!!G!!!!*J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!
-!!3!!!!!!!!!!"!!!(J!!!#F#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!
-!!!3!!"m!!!!S!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!%!!!J!!!
-!+3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"!!!)3!!!#S#!3!!!!!
-!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!3!!#)!!!!V!J%!!!!!!!%!!3%!!!!
-!!!!!!!!!!!!"!!!!!!!!!!!%!!!M!!!!,!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!
-!!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!8!!!K(CA4)9&438`!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2cmr2d&38%`!!!3!!!!%!!!!!%!!!&M!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%
+r2cmr!!!!!!!!!!)!!!!#!!)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!#!&!!!3!"!!%!!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!8*d024%8R)#G%394
+"*b!R8%P$9#F!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!"!!!!3!!!!S#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!3!!!)
+!!!!,!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!%!!!$!!!!$!)"!!!
+!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"!!!"!!!!!d#!3!!!!!!!3!"!3!
+!!!!!!!!!!!!!!!%!!!!!!!!!!!3!!!8!!!!1!J%!!!!!!!%!!3%!!!!!!!!!!!!
+!!!!"!!!!!!!!!!!%!!!'!!!!$`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!
+!!!!!"!!!"`!!!"!#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!3!!!J
+!!!!4!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!%!!!*!!!!%J)"!!!
+!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"!!!#J!!!"-#!3!!!!!!!3!"!3!
+!!!!!!!!!!!!!!!%!!!!!!!!!!!3!!!X!!!!8!J%!!!!!!!%!!3%!!!!!!!!!!!!
+!!!!"!!!!!!!!!!!%!!!-!!!!&3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!
+!!!!!"!!!$3!!!"B#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!3!!!i
+!!!!A!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!%!!!2!!!!'!)"!!!
+!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"!!!%!!!!"N#!3!!!!!!!3!"!3!
+!!!!!!!!!!!!!!!%!!!!!!!!!!!3!!"%!!!!D!J%!!!!!!!%!!3%!!!!!!!!!!!!
+!!!!"!!!!!!!!!!!%!!!5!!!!'`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!
+!!!!!"!!!%`!!!"`#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!3!!"3
+!!!!G!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!%!!!9!!!!(J)"!!!
+!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"!!!&J!!!"m#!3!!!!!!!3!"!3!
+!!!!!!!!!!!!!!!%!!!!!!!!!!!3!!"F!!!!J!J%!!!!!!!%!!3%!!!!!!!!!!!!
+!!!!"!!!!!!!!!!!%!!!B!!!!)3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!
+!!!!!"!!!'3!!!#)#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!3!!"S
+!!!!M!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!%!!!E!!!!*!)"!!!
+!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"!!!(!!!!#8#!3!!!!!!!3!"!3!
+!!!!!!!!!!!!!!!%!!!!!!!!!!!3!!"d!!!!Q!J%!!!!!!!%!!3%!!!!!!!!!!!!
+!!!!"!!!!!!!!!!!%!!!H!!!!*`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!
+!!!!!"!!!(`!!!#J#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!3!!#!
+!!!!T!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!%!!!K!!!!+J)"!!!
+!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"!!!)J!!!#X#!3!!!!!!!3!"!3!
+!!!!!!!!!!!!!!!%!!!!!!!!!!!3!!#-!!!!X!J%!!!!!!!%!!3%!!!!!!!!!!!!
+!!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2516,17 +2515,17 @@ J*e"*3e3R!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!!!!)!!!!$!!!!"!!!!!8!!!!'!!!
-!"`!!!!J!!!!*!!!!#J!!!!X!!!!-!!!!$3!!!!i!!!!2!!!!%!!!!"%!!!!5!!!
-!%`!!!"3!!!!9!!!!&J!!!"F!!!!B!!!!'3!!!"S!!!!E!!!!(!!!!"d!!!!H!!!
-!(`!!!#!!!!!K!!!!)J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)`!!!%!%!!!!"!!
-!)`!!!GS!!3!F!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!"33!!!3%!!!$"!!
-!!J3!!!B%!!!,"!!!#J3!!!N%!!!)"!!!"`3!!!`%!!!5"!!!%33!!"!%!!!2"!!
-!$33!!!i%!!!6"!!!)J3!!#%%!!!J"!!!(`3!!#-%!!!""!!!&!3!!"8%!!!@"!!
-!&`3!!"J%!!!C"!!!'J3!!"X%!!!F"!!!(33!!"i!!J!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!!J!!!!-!!!!%!!!!"3!!!!B
+!!!!(!!!!#!!!!!N!!!!+!!!!#`!!!!`!!!!0!!!!$J!!!!m!!!!3!!!!%3!!!")
+!!!!6!!!!&!!!!"8!!!!@!!!!&`!!!"J!!!!C!!!!'J!!!"X!!!!F!!!!(3!!!"i
+!!!!I!!!!)!!!!#%!!!!L!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!M!!!!3!3!!!!
+%!!!M!!!"f`!"!"`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!!!&"!!!"!3!!!-
+%!!!#"!!!"J3!!!X%!!!+"!!!#33!!!J%!!!("!!!$!3!!")%!!!4"!!!%!3!!!m
+%!!!0"!!!$J3!!"-%!!!L"!!!)33!!#!%!!!I"!!!)`3!!!%%!!!8"!!!&33!!"B
+%!!!A"!!!'!3!!"N%!!!D"!!!'`3!!"`%!!!G"!!!(J!#!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2547,14 +2546,14 @@ J*e"*3e3R!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!,#2Z!!!!!!!!!"!!,#4r!!!J!!!!!!!!!!!!!#`MD!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!X)qi!!!!!!!!!%!!X*(m!!#!!!!!!!!!!!!!!,#0S!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!J!!!3!!!!!&!!"rr`!!!!"
-rr`!!!!"rr`!!!!"rr`!!!!`!!3!#!!B!!!!&3!!!#!!"!!%k!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!!!"!!!!!!8!!(rr!!!
+!!(rr!!!!!(rr!!!!!(rr!!!!$!!"!!)!"J!!!!9!!!!)!!%!!6S!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2564,8 +2563,8 @@ rr`!!!!"rr`!!!!"rr`!!!!`!!3!#!!B!!!!&3!!!#!!"!!%k!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!!!2rrrrm!!!!$!!%!!6Sk!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!rrrrr`!!!!-!!3!"1MS
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2575,9 +2574,9 @@ rr`!!!!"rr`!!!!"rr`!!!!`!!3!#!!B!!!!&3!!!#!!"!!%k!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!rrrrr`!!!!3
-!!3!"1MTTEQ0XG@4P1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!!!$rrrrr!!!
+!"!!"!!%k1QPZBfaeC'8k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2586,10 +2585,9 @@ rr`!!!!"rr`!!!!"rr`!!!!`!!3!#!!B!!!!&3!!!#!!"!!%k!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$
-rrrrr3!!!!J!"!!%k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!2rrrrp!!!!#!!%!!6S!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2598,9 +2596,9 @@ rrrrr3!!!!J!"!!%k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!2rrrrp!!!!$!!%!!6Sk1NG98dNkD@jME(9NC6S!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!rrrrrd!!!!-!!3!"1MSk4e9656TTEQ0XG@4P1J!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2609,9 +2607,9 @@ rrrrr3!!!!J!"!!%k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!rrrrrd!!!!3!!3!"1MSk4e9656TXD@)k!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!$rrrrr3!!!"!!"!!%k1MT(990*1QaTBMS!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2620,10 +2618,10 @@ rrrrr3!!!!J!"!!%k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$rrrrr3!!!"3!#!!%k6@&M6e-J8h9`F'p
-bG$S!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2rrrrp!!!!&!!)!!6T0B@028b"6GA"
+`Eh*d1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2631,10 +2629,10 @@ bG$S!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!!!2rrrrp!!!!'!!)!!6T08d`
-k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!rrrrrd!!!!B!!J!"1Ne
+66$S!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2642,10 +2640,10 @@ k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!rrrrrd!!!!F
-!#J!!6@&M6e-J0MK,)%aTEQYPFJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!!!$rrrrr3!!
+!"`!+!!"0B@028b!f1%XJ6'PZDf9b!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2659,14 +2657,14 @@ k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!6h"PEP066#!f1'X!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!"2F'9Z8e0-)$BiD`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!%k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!!6S!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2675,63 +2673,63 @@ k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!!&0B@028b!f1%XJ6'PZDf9b!!!!!!!!!!!
-!!!!!!!!!!!!J39"36!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!!3A"`E!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!"J!!!!68e-3J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!6'P
-L)%PYF'pbG#!f1%X!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69"-4J!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!6'PL)%PYF'pbG#!f1%X!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!69G$4!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!!6d*+)!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69"A)%PYF'pbG#!f1%X!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!8%a[BJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!!8P053`!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!"J!!!!9%9B9#jLD!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3Q&
-XE'p[EL")C@a`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#jM!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ3bp$+bXJ0MK,!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!9%9B9#jM+bX!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69F
-J3bp$+bXJ0MK,!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#jMB`!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ3bp$+bXJ0MK,!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!9%9B9#jMF!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69F
-J3bp$+bXJ0MK,!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#jMF(!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ3bp$+bXJ0MK,!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!9%9B9#jPH(!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#jRB`!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!4f&YC80[C'8J3fpZGQ9bG'9b!!!!!!!!!!!
-!!!!!!!"!!!!!9%9B9#jS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69F
-J3bp$+bXJ0MK,!!!!!!!!!!!!!!!!!!!!!!!!!!!3!!!!9%9B9#jX!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!4QaPH#"3FQ9`FQpMCA0cEh)!!!!!!!!!!!!
-!!!!!!!#!!!!!9%9B9#j`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69F
-J8'&cBf&X)$Bi5`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#j`BA-!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ8'&cBf&X)$Bi5`!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!9%9B9#j`BfJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69F
-J3bp$+bXJ0MK,!!!!!!!!!!!!!!!!!!!!!!!!!!#!!!!!9%9B9#j`BfJV+`!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ3bp$+bXJ0MK,!!!!!!!!!!!!!!!!!!!
-!!!!!!!#!!!!!9%9B9#j`F(8!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69F
-J8'&cBf&X)$Bi5`!!!!!!!!!!!!!!!!!!!!!!!!#!!!!!9%9B9#jb!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!8Q9k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!9%9B9#jcC@F!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#jj!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3QPcEfiJ8(*PF(*[Bf9cFfpb!!!!!!!!!!!
-!!!!!!!#!!!!!C'pMG3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!!FR0bB`!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)!!8eKBdp6)$Bi5b"-D@jVCA)!!!!!!!!
+!!!!!!!!!!!!!!#""8&"-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'!!!!""F("X!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!"J!!!!FfKXBJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!8%9
-')%PYF'pbG#!f1%X!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Fh4eBJ!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!8%9')%PYF'pbG#!f1%X!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!#jNEf-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"3!!!!!!!!!#jbFh*M!!!!!!!
+!!!!!!!!!!'!!!!"068a#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
+-D@)J5@e`Eh*d)$Bi5`!!!!!!!!!!!!!!!!!!!!!!!!!!!!"08%a'!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"-D@)J5@e`Eh*d)$Bi5`!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!"09d0%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'!!!!"23NSJ!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"08&FJ5@e`Eh*d)$Bi5`!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!"36'pL!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'!!!!"58e*$!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!"J!!!!!!8"!3!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!'!!!!"849K8,Q*S!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
+#B@aXEfpZ)%KPE(!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"849K8,Q-!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"09b"$,d-V+b!f1%X!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!"849K8,Q-V+`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
+09b"$,d-V+b!f1%X!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"849K8,Q0M!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"09b"$,d-V+b!f1%X!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!"849K8,Q0`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
+09b"$,d-V+b!f1%X!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"849K8,Q0`F!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"09b"$,d-V+b!f1%X!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!"849K8,Q9iF!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"849K8,QGM!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"(B@eP3fpNC5"$EfjfCA*dCA)!!!!!!!!
+!!!!!!!!!!%!!!!"849K8,QJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
+09b"$,d-V+b!f1%X!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!"849K8,Q`!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"'E'9i)&"bCA"bEf0PFh0[FJ!!!!!!!!!
+!!!!!!!!!!)!!!!"849K8,R!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
+09b"3BA0MB@`J0MK,!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"849K8,R"KF`!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"09b"3BA0MB@`J0MK,!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!"849K8,R"MD!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
+09b"$,d-V+b!f1%X!!!!!!!!!!!!!!!!!!!!!!!!!!)!!!!"849K8,R"MD#XV!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"09b"$,d-V+b!f1%X!!!!!!!!!!!!!!!!
+!!!!!!!!!!)!!!!"849K8,R"`G3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
+09b"3BA0MB@`J0MK,!!!!!!!!!!!!!!!!!!!!!!!!!)!!!!"849K8,R)!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"5CAS!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!"849K8,R0PC`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"849K8,RN!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"#DA0[EL"3FQ9`FQpMCA0cEh)!!!!!!!!
+!!!!!!!!!!)!!!!"NEf0e!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'!!!!"bFh*M!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!'!!!!"cD'aL!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
+348BJ5@e`Eh*d)$Bi5`!!!!!!!!!!!!!!!!!!!!!!!!!!!!"cG(9L!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"348BJ5@e`Eh*d)$Bi5`!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!,Q4[B`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&!!!!!!!!!!,R*cFQ-!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!'!!!!!!"3%"!!%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!!!"!!!!!!8!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'!!!!!!%!!!!!"3!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2740,94 +2738,94 @@ J8'&cBf&X)$Bi5`!!!!!!!!!!!!!!!!!!!!!!!!#!!!!!9%9B9#jb!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!3!
-!E@&TEJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%
+"!!"YB@PZ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!)!3!"!!!!!3%"!!!"!3%!!!!!!!%"!!!"!3!"!!!
-""!!!!!!!!!!!!!!)!3!"!3!"!3!!!!%!!!N!!!a2F'9Z8e0-+$BiDbN!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!r2cm
-r39"36!!!!J"B`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$mr2cm!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-0!!%!!!!!!"9I69G&8NY6AdG98dPIF(*PCQPi,QJ!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!"!!!!!!!!!!!!!!8"!3%!!!%"!!%!!!!!"!!!!!!!!!!!!!!!!!!!!!!"!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!J"!!%!!!!"!3%!!!%"!3!!!!!!!3%!!!%"!!%
+!!!%%!!!!!!!!!!!!!!J"!!%"!!%"!!!!!3!!#3!!$%p`C@j68d`S0MKV+3!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$m
+r2cp"8&"-!!!#!&M!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2cmr2`!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!d!!3!!!!!!&9p09d955e0I4e9659p`FQ9QDAJZD!!!!!!!!!!!!!!!!!%!!!!
+!!!!!!!%!!!!!!!!!!!!!"3%"!3!!!3%!!3!!!!!%!!!!!!!!!!!!!!!!!!!!!!%
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"IAh0dBA*d!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!%!!3!!#8ePFQGP)%peG!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$mr2cp"8&"
--!!%"!!!%)#!J)!15Jf!$G0pi!`1Yi!!&!J%!!3%!!3%"!!!"!!!!!!!!!!%"!3%
-!!3%!!3!""!!!!!!!!!!!!!!(!3%!!3!!!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"IAh0dBA*
-d!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&pIFh4KFR3!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!"!!!*6@9bCf8J6h9d!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2cmr2d&
+38%`!!3%!!!3J)#!J!jHI8!0fhhJ$"Di3!!8#!3!"!3!"!3%!!!%!!!!!!!!!!3%
+"!3!"!3!"!!%%!!!!!!!!!!!!!!F"!3!"!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&pIFh4
+KFR3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!8!!!G2F'9Z8e0-!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!2cmr2d&38%`!!!3!!!!%!!!!!%!!!&M!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%r2cmr!!!!!!!!!!)!!!!
-#!!)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!&!!!3!
-"!!%!!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"3!!"dp`C@j68d`!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!r2cmr39"36!!!"!!!!!3!!!!!3!!!@-!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!6mr2cm!!!!!!!!!!J!
+!!!)!!J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)!8!!
+"!!%!!3!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!8*d024%8R)#G%394"*b!R8%P$9#F!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"3R3dp%45FJ*d4"9%%R)#G35808*`!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"3!!!3!!!ES#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!8!!!)!!!'l!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!&!!!$!!!"[!)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!"3!!"!!!!Ed#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!8!!!8!!!'q!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!&!!!
-'!!!"[`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"3!!"`!!!F!#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!8!!!J!!!("!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!&!!!*!!!"`J)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!"3!!#J!!!F-#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!8!!!X!!!(%!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!&!!!
--!!!"a3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"3!!$3!!!FB#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!8!!!i!!!((!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!&!!!2!!!"b!)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!"3!!%!!!!FN#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!8!!"%!!!(+!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!&!!!
-5!!!"b`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"3!!%`!!!F`#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!8!!"3!!!(E!J%!!!!!!!%!!3-
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!&!!!9!!!"h!)"!!!!!!!"!!%$!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!"3!!&J!!!Gd#!3!!!!!!!3!"!`!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!8!!"F!!!(5!J%!!!!!!!%!!3-!!!!!!!!!!!!!!!!"!!!!!!!!!!!&!!!
-B!!!"f3)"!!!!!!!"!!%$!!!!!!!!!!!!!!!!!3!!!!!!!!!!"3!!'3!!!G3#!3!
-!!!!!!3!"!`!!!!!!!!!!!!!!!!%!!!!!!!!!!!8!!"S!!!(9!J%!!!!!!!%!!3-
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!&!!!E!!!"eJ)"!!!!!!!"!!%$!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!"3!!(!!!!G-#!3!!!!!!!3!"!`!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!8!!"d!!!(A!J%!!!!!!!%!!3-!!!!!!!!!!!!!!!!"!!!!!!!!!!!&!!!
-H!!!"f!)"!!!!!!!"!!%$!!!!!!!!!!!!!!!!!3!!!!!!!!!!"3!!(`!!!Im%!3!
-!!!!!!!!"!`!!!!!!!!!!!!!!!)%!!!!!!!!!!!8!!#!!!!(I!J%!!!!!!!%!!3-
-!!!!!!!!!!!!!!!#"!!!!!!!!!!!!!!!!!!!!!3!!!!)!!!!$!!!!"!!!!!8!!!!
-'!!!!"`!!!!J!!!!*!!!!#J!!!!X!!!!-!!!!$3!!!!i!!!!2!!!!%!!!!"%!!!!
-5!!!!&J!!!"X!!!!B!!!!'3!!!"S!!!!F!!!!(3!!!"F!!!!6!!!!&!!!!"8!!!!
-H!!!!(`!!!#!!!!!J"3!!!!8!!#!!!!(D!!%!(!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!8!!!%&!!!#"3!!!`8!!!3&!!!&"3!!"J8!!!F&!!!)"3!!#38!!!S&!!!
-,"3!!$!8!!!d&!!!1"3!!$`8!!"!&!!!4"3!!%J8!!#!&!!!I"3!!%`8!!"3&!!!
-9"3!!&J8!!"d&!!!H"3!!(!8!!"J&!!!A"3!!'38!!"S&!!!E!!)!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&!!!"!!!"Z`)
+"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"3!!!J!!!E`#!3!!!!!!!3!
+"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!8!!!-!!!'p!J%!!!!!!!%!!3%!!!!!!!!
+!!!!!!!!"!!!!!!!!!!!&!!!%!!!"[J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!
+!!!!!!!!!"3!!"3!!!Em#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!8
+!!!B!!!(!!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!&!!!(!!!"`3)
+"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"3!!#!!!!F)#!3!!!!!!!3!
+"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!8!!!N!!!($!J%!!!!!!!%!!3%!!!!!!!!
+!!!!!!!!"!!!!!!!!!!!&!!!+!!!"a!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!
+!!!!!!!!!"3!!#`!!!F8#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!8
+!!!`!!!('!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!&!!!0!!!"a`)
+"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"3!!$J!!!FJ#!3!!!!!!!3!
+"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!8!!!m!!!(*!J%!!!!!!!%!!3%!!!!!!!!
+!!!!!!!!"!!!!!!!!!!!&!!!3!!!"bJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!
+!!!!!!!!!"3!!%3!!!FX#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!8
+!!")!!!(-!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!&!!!6!!!"c3)
+"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"3!!&!!!!G`#!3!!!!!!!3!
+"!`!!!!!!!!!!!!!!!!%!!!!!!!!!!!8!!"8!!!(G!J%!!!!!!!%!!3-!!!!!!!!
+!!!!!!!!"!!!!!!!!!!!&!!!@!!!"hJ)"!!!!!!!"!!%$!!!!!!!!!!!!!!!!!3!
+!!!!!!!!!"3!!&`!!!G-#!3!!!!!!!3!"!`!!!!!!!!!!!!!!!!%!!!!!!!!!!!8
+!!"J!!!(D!J%!!!!!!!%!!3-!!!!!!!!!!!!!!!!"!!!!!!!!!!!&!!!C!!!"e3)
+"!!!!!!!"!!%$!!!!!!!!!!!!!!!!!3!!!!!!!!!!"3!!'J!!!GB#!3!!!!!!!3!
+"!`!!!!!!!!!!!!!!!!%!!!!!!!!!!!8!!"X!!!(A!J%!!!!!!!%!!3-!!!!!!!!
+!!!!!!!!"!!!!!!!!!!!&!!!F!!!"e!)"!!!!!!!"!!%$!!!!!!!!!!!!!!!!!3!
+!!!!!!!!!"3!!(3!!!GJ#!3!!!!!!!3!"!`!!!!!!!!!!!!!!!!%!!!!!!!!!!!8
+!!"i!!!(C!J%!!!!!!!%!!3-!!!!!!!!!!!!!!!!"!!!!!!!!!!!&!!!I!!!"h`3
+"!!!!!!!!!!%$!!!!!!!!!!!!!!!!J3!!!!!!!!!!"3!!)!!!!H!#!3!!!!!!!3!
+"!`!!!!!!!!!!!!!!!)%!!!!!!!!!!!!!!!!!!!!"!!!!!J!!!!-!!!!%!!!!"3!
+!!!B!!!!(!!!!#!!!!!N!!!!+!!!!#`!!!!`!!!!0!!!!$J!!!!m!!!!3!!!!%3!
+!!")!!!!@!!!!'`!!!"J!!!!C!!!!'J!!!"`!!!!G!!!!&`!!!"-!!!!8!!!!&3!
+!!"i!!!!I!!!!)!!!!#!&!!!!"3!!)!!!!GX!!3!F!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!"3!!!38!!!)&!!!$"3!!"!8!!!8&!!!'"3!!"`8!!!J&!!!*"3!!#J8
+!!!X&!!!-"3!!$38!!!i&!!!2"3!!%!8!!"%&!!!5"3!!)!8!!"m&!!!6"3!!&!8
+!!"8&!!!@"3!!(38!!"i&!!!F"3!!'!8!!"F&!!!C"3!!'J8!!"X!!J!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2847,15 +2845,15 @@ H!!!!(`!!!#!!!!!J"3!!!!8!!#!!!!(D!!%!(!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!#`MlJ!!!!!!!!!3!#`NI`!!)!!!!!!!!!!!!
-!!X)fJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!,#2Z!!!!!!!!!"!!,#4r!!!J!!!!!!!!!
+!!!!#`MD!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)!!!%!!!!!"3!
-!Irm!!!!!Irm!!!!!Irm!!!!!Irm!!!!-!!%!!J!'!!!!"8!!!!J!!3!"1J!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!J!!!3!!!!!
+&!!"rr`!!!!"rr`!!!!"rr`!!!!"rr`!!!!`!!3!#!!B!!!!&3!!!#!!"!!%k!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2864,10 +2862,10 @@ H!!!!(`!!!#!!!!!J"3!!!!8!!#!!!!(D!!%!(!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!!!$rrrrr!!!!!`!
-"!!%k1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!!!2rrrrm!!!!
+$!!%!!6Sk!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2875,10 +2873,10 @@ H!!!!(`!!!#!!!!!J"3!!!!8!!#!!!!(D!!%!(!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!!!2r
-rrrm!!!!%!!%!!6SkD@jME(9NC6S!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!
+!rrrrr`!!!!3!!3!"1MTTEQ0XG@4P1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2887,9 +2885,9 @@ rrrm!!!!%!!%!!6SkD@jME(9NC6S!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!rrrrrd!!!!)!!3!"1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!$rrrrr3!!!!J!"!!%k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2898,9 +2896,9 @@ rrrm!!!!%!!%!!6SkD@jME(9NC6S!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!$rrrrr3!!!!`!"!!%k1MT(990*1QPZBfaeC'8k!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!2rrrrp!!!!$!!%!!6Sk1NG98dNkD@jME(9NC6S!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2909,9 +2907,10 @@ rrrm!!!!%!!%!!6SkD@jME(9NC6S!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2rrrrp!!!!%!!%!!6Sk1NG98dNkE'PL1J!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!rrrrrd!!!!3!!3!"1MSk4e9656TXD@)
+k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2920,9 +2919,9 @@ rrrm!!!!%!!%!!6SkD@jME(9NC6S!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!rrrrrd!!!!8!!J!"1NeKBdp
-6)&0eF("[FR3k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$rrrrr3!!!"3!#!!%k6@&
+M6e-J8h9`F'pbG$S!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2931,9 +2930,9 @@ rrrm!!!!%!!%!!6SkD@jME(9NC6S!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!!!$rrrrr3!!!"J!
-#!!%k690-1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!!!2rrrrp!!!!
+'!!)!!6T08d`k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2942,9 +2941,9 @@ rrrm!!!!%!!%!!6SkD@jME(9NC6S!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!!!2r
-rrrp!!!!(!!S!!%eKBdp6)&"33b"-D@jVCA)!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!
+!rrrrrd!!!!F!#J!!6@&M6e-J8&"$)%aTEQYPFJ!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2959,13 +2958,13 @@ rrrp!!!!(!!S!!%eKBdp6)&"33b"-D@jVCA)!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!%aTBP066#"38%-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!6'PL8e0-)&"33`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!"1J!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!%k!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2975,60 +2974,60 @@ rrrp!!!!(!!S!!%eKBdp6)&"33b"-D@jVCA)!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!J!"6@&M6e-J8&"$)%aTEQYPFJ!
-!!!!!!!!!!!!!!!!!!!!!(N&38%`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!B!!!!%&`F'`!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!B!!!!%e06%)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!%aTBL"*EA"[FR3J8&"$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%e36%B!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%aTBL"*EA"[FR3J8&"$!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!%eA3d3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!B!!!!&*68N-!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!!&0B@028b"38%-J6'PZDf9
+b!!!!!!!!!!!!!!!!!!!!!!!H39"36!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!!3A"`E!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!B!!!!&4&@&3ZBQJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!%*KE'a[EfiJ5'9XF!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&4&@&3ZB`!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%eA)%-[3bXV)&"33`!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!&4&@&3ZBbXV!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!%eA)%-[3bXV)&"33`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&4&@&3ZBf-
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%eA)%-[3bXV)&"33`!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!&4&@&3ZBh!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!%eA)%-[3bXV)&"33`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&4&@&3ZBh"
-`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%eA)%-[3bXV)&"33`!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!&4&@&3ZCAK`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&4&@&3ZCf-
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%GKE@9$Ef4P)%0[ERCPFR4PFJ!
-!!!!!!!!!!!!!!!!!3!!!!&4&@&3ZD!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!%eA)%-[3bXV)&"33`!!!!!!!!!!!!!!!!!!!!!!!!!!%!!!!&4&@&3ZE!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%CXCAJJ8(*PF(*[Bf9cFfpb!!!
-!!!!!!!!!!!!!!!!!J!!!!&4&@&3ZF!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!%eA)&"KFf0KE#"38%-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&4&@&3ZF'&
-c!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%eA)&"KFf0KE#"38%-!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!&4&@&3ZF'0S!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!%eA)%-[3bXV)&"33`!!!!!!!!!!!!!!!!!!!!!!!!!!J!!!!&4&@&3ZF'0
-S+bX!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%eA)%-[3bXV)&"33`!!!!!!!!!
-!!!!!!!!!!!!!!!!!J!!!!&4&@&3ZF("e!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!%eA)&"KFf0KE#"38%-!!!!!!!!!!!!!!!!!!!!!!!!!J!!!!&4&@&3ZFJ!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&*PHJ!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!&4&@&3ZF`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!&"33d&cE3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&4&@&3ZH3!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%*TFfpZ)&"bCA"bEf0PFh0[FJ!
-!!!!!!!!!!!!!!!!!J!!!!&K$6dB!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!&K$6dC')%PYF'pbG#"38%-!!!!!!!!!!!!!!!!!!!!!!!!!!'4[Bh8!!!!
+!!!!!!!!!!!!!!!!!!!"J!!!!68e-3J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!6'PL)%PYF'pbG#"38%-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69"-4J!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!6'PL)%PYF'pbG#"38%-!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!69G$4!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!!8P053`!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!B!!!!(*cFQ-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!B!!!!(0SE')!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&"&4L"*EA"[FR3J8&"$!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!(0dG@)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!&"&4L"*EA"[FR3J8&"$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!ZC'p
-M!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!8!!!!!!&!3%!!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!"J!!!!9%9B9#jLD!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!3Q&XE'p[EL")C@a`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#j
+M!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ3bp$+bXJ8&"$!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#jM+bX!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!69FJ3bp$+bXJ8&"$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#j
+MB`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ3bp$+bXJ8&"$!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#jMF!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!69FJ3bp$+bXJ8&"$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#j
+MF(!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ3bp$+bXJ8&"$!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#jPH(!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#j
+RB`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!4f&YC80[C'8J3fpZGQ9bG'9
+b!!!!!!!!!!!!!!!!!!"!!!!!9%9B9#jS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!69FJ3bp$+bXJ8&"$!!!!!!!!!!!!!!!!!!!!!!!!!!!3!!!!9%9B9#j
+X!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!4QaPH#"3FQ9`FQpMCA0cEh)
+!!!!!!!!!!!!!!!!!!!#!!!!!9%9B9#j`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!69FJ8'&cBf&X)&"33`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#j
+`BA-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ8'&cBf&X)&"33`!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#j`BfJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!69FJ3bp$+bXJ8&"$!!!!!!!!!!!!!!!!!!!!!!!!!!#!!!!!9%9B9#j
+`BfJV+`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ3bp$+bXJ8&"$!!!!!!!
+!!!!!!!!!!!!!!!!!!!#!!!!!9%9B9#j`F(8!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!69FJ8'&cBf&X)&"33`!!!!!!!!!!!!!!!!!!!!!!!!#!!!!!9%9B9#j
+b!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!8Q9k!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#jc!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!8&"$3A0Y!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#j
+j!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3QPcEfiJ8(*PF(*[Bf9cFfp
+b!!!!!!!!!!!!!!!!!!#!!!!!@%024J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!@%024NBJ5@e`Eh*d)&"33`!!!!!!!!!!!!!!!!!!!!!!!!!!C'pMG3!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!"J!!!!FR0bB`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!!FfKXBJ!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!8%9')%PYF'pbG#"38%-!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!Fh4eBJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!8%9')%PYF'pbG#"38%-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#j
+NEf-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!"3!!!!!!8"!3!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!B!!!!!!3!
-!!!!&!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!!!
+"!!!!!!8!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -3038,87 +3037,88 @@ M!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!3%!!'eKD@i!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!"!3!!E@&TEJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!%"!3!!!!%"!3!!!3%"!!!!!!!"!3!
-!!3%!!3!!!33!!!!!!!!!!!!!#!%!!3%!!3%!!!!"!!!*!!-B6'PL8e0-,MBi5b"
-'B5JiD9mdC#NZ6'PL!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!2cmr2cmr2cm!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!r2cmr!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)!3%"!!!!!3%"!!!"!3%!!!!!!!%
+"!!!"!3!"!!!""!!!!!!!!!!!!!!)!3!"!3!"!3!!!!%!!!N!!aK-D@*68d`Z0MK
+,)%CK+$KTAc4N+5j-D@)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!r2cmr2cmr2`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$mr2cm!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!$3!"!!!!!!!9AdeA49*,8ep(990*Ah"bC@CTH#jS!!!!!!!!!!!!!!!
-!!3!!!3!!!!!!!3!!!!!!!!!!!!!&!3%"!!!"!3!"!!!!!!3!!!!!!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!0!!%!!!!!!"9I69G&8NY6AdG98dPIF(*PCQPi,QJ!!!!!!!!!!!!
+!!!!"!!!"!!!!!!!"!!!!!!!!!!!!!!8"!3%!!!%"!!%!!!!!"!!!!!!!!!!!!!!
+!!!!!!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!AepcG'&bG!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"IAh0dBA*
+d!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!%!!!P0CA*RC5"2GA3!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!!3!!#8ePFQGP)%peG!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-r2cmr39"36!!"!3!!"#!J)#!$NS0J!h6IH!-$VH!!"3)"!!%"!!%"!3!!!3!!!!!
-!!!!"!3%"!!%"!!%!!33!!!!!!!!!!!!!"`%"!!%!!!%!!!!!!!!!!!!!!!!!!!!
+!!$mr2cp"8&"-!!%"!!!%)#!J)!1ARe!$GYpi!`@Z%!!&!J%!!3%!!3%"!!!"!!!
+!!!!!!!%"!3%!!3%!!3!""!!!!!!!!!!!!!!(!3%!!3!!!3!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!AepcG'&bG!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!"IAh0dBA*d!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!J!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&!!-16'PL8e0-,P"33bj-D@)!!!!
-!!!!!!!!!!!!!!!!!!$mr2cmr2cmr!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!8!!`j-D@*68d`Z8&"$,NaTBJ!
+!!!!!!!!!!!!!!!!!!!!!2cmr2cmr2cm!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"2cmr2`!!!!!
-!!!!#!!!!!J!#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!J"3!!%!!3!"!!%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%r2cmr!!!
+!!!!!!!)!!!!#!!)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!#!&!!!3!"!!%!!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&#G$6d4&*b!R4%&835FJ*e"*3e3
-R!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!8*d024%8R)#G%394"*b!R8%P
+$9#F!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!B!!!%
-!!!!+!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!'!!!#!!!!#`)"!!!
-!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"J!!!`!!!!`#!3!!!!!!!3!"!3!
-!!!!!!!!!!!!!!!%!!!!!!!!!!!B!!!3!!!!0!J%!!!!!!!%!!3%!!!!!!!!!!!!
-!!!!"!!!!!!!!!!!'!!!&!!!!$J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!
-!!!!!"J!!"J!!!!m#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!B!!!F
-!!!!3!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!'!!!)!!!!%3)"!!!
-!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"J!!#3!!!")#!3!!!!!!!3!"!3!
-!!!!!!!!!!!!!!!%!!!!!!!!!!!B!!!S!!!!6!J%!!!!!!!%!!3%!!!!!!!!!!!!
-!!!!"!!!!!!!!!!!'!!!,!!!!&!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!
-!!!!!"J!!$!!!!"8#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!B!!!d
-!!!!@!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!'!!!1!!!!&`)"!!!
-!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"J!!$`!!!"J#!3!!!!!!!3!"!3!
-!!!!!!!!!!!!!!!%!!!!!!!!!!!B!!"!!!!!C!J%!!!!!!!%!!3%!!!!!!!!!!!!
-!!!!"!!!!!!!!!!!'!!!4!!!!'J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!
-!!!!!"J!!%J!!!"X#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!B!!"-
-!!!!F!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!'!!!8!!!!(3)"!!!
-!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"J!!&3!!!"i#!3!!!!!!!3!"!3!
-!!!!!!!!!!!!!!!%!!!!!!!!!!!B!!"B!!!!I!J%!!!!!!!%!!3%!!!!!!!!!!!!
-!!!!"!!!!!!!!!!!'!!!A!!!!)!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!
-!!!!!"J!!'!!!!#%#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!B!!"N
-!!!!L!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!'!!!D!!!!)`)"!!!
-!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"J!!'`!!!#3#!3!!!!!!!3!"!3!
-!!!!!!!!!!!!!!!%!!!!!!!!!!!B!!"`!!!!P!J%!!!!!!!%!!3%!!!!!!!!!!!!
-!!!!"!!!!!!!!!!!'!!!G!!!!*J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!
-!!!!!"J!!(J!!!#F#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!B!!"m
-!!!!S!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!'!!!J!!!!+3)"!!!
-!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"J!!)3!!!#S#!3!!!!!!!3!"!3!
-!!!!!!!!!!!!!!!%!!!!!!!!!!!B!!#)!!!!V!J%!!!!!!!%!!3%!!!!!!!!!!!!
-!!!!"!!!!!!!!!!!'!!!M!!!!,!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!
+!!3!!!!S#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!B!!!)!!!!,!J%
+!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!'!!!$!!!!$!)"!!!!!!!"!!%
+"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"J!!"!!!!!d#!3!!!!!!!3!"!3!!!!!!!!!
+!!!!!!!%!!!!!!!!!!!B!!!8!!!!1!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!
+!!!!!!!!'!!!'!!!!$`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"J!
+!"`!!!"!#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!B!!!J!!!!4!J%
+!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!'!!!*!!!!%J)"!!!!!!!"!!%
+"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"J!!#J!!!"-#!3!!!!!!!3!"!3!!!!!!!!!
+!!!!!!!%!!!!!!!!!!!B!!!X!!!!8!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!
+!!!!!!!!'!!!-!!!!&3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"J!
+!$3!!!"B#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!B!!!i!!!!A!J%
+!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!'!!!2!!!!'!)"!!!!!!!"!!%
+"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"J!!%!!!!"N#!3!!!!!!!3!"!3!!!!!!!!!
+!!!!!!!%!!!!!!!!!!!B!!"%!!!!D!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!
+!!!!!!!!'!!!5!!!!'`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"J!
+!%`!!!"`#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!B!!"3!!!!G!J%
+!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!'!!!9!!!!(J)"!!!!!!!"!!%
+"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"J!!&J!!!"m#!3!!!!!!!3!"!3!!!!!!!!!
+!!!!!!!%!!!!!!!!!!!B!!"F!!!!J!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!
+!!!!!!!!'!!!B!!!!)3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"J!
+!'3!!!#)#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!B!!"S!!!!M!J%
+!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!'!!!E!!!!*!)"!!!!!!!"!!%
+"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"J!!(!!!!#8#!3!!!!!!!3!"!3!!!!!!!!!
+!!!!!!!%!!!!!!!!!!!B!!"d!!!!Q!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!
+!!!!!!!!'!!!H!!!!*`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"J!
+!(`!!!#J#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!B!!#!!!!!T!J%
+!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!'!!!K!!!!+J)"!!!!!!!"!!%
+"!!!!!!!!!!!!!!!!!3!!!!!!!!!!"J!!)J!!!#X#!3!!!!!!!3!"!3!!!!!!!!!
+!!!!!!!%!!!!!!!!!!!B!!#-!!!!X!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -3143,16 +3143,16 @@ R!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!3!!!!)!!!!$!!!!"!!!!!8!!!!'!!!!"`!!!!J
-!!!!*!!!!#J!!!!X!!!!-!!!!$3!!!!i!!!!2!!!!%!!!!"%!!!!5!!!!%`!!!"3
-!!!!9!!!!&J!!!"F!!!!B!!!!'3!!!"S!!!!E!!!!(!!!!"d!!!!H!!!!(`!!!#!
-!!!!K!!!!)J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!!J!!!!-!!!!%!!!!"3!!!!B!!!!(!!!
+!#!!!!!N!!!!+!!!!#`!!!!`!!!!0!!!!$J!!!!m!!!!3!!!!%3!!!")!!!!6!!!
+!&!!!!"8!!!!@!!!!&`!!!"J!!!!C!!!!'J!!!"X!!!!F!!!!(3!!!"i!!!!I!!!
+!)!!!!#%!!!!L!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)`!!!%!'!!!!"J!!)`B!!!8
-'!!!%"J!!!`B!!!)'!!!'"J!!#`B!!!S'!!!*"J!!#!B!!!F'!!!-"J!!%JB!!"%
-'!!!3"J!!$`B!!!d'!!!1"J!!%`B!!#)'!!!K"J!!)!B!!"m'!!!M"J!!!3B!!"3
-'!!!9"J!!&JB!!"F'!!!B"J!!'3B!!"S'!!!E"J!!(!B!!"d'!!!H!!!"U!!"!#J
-!!!!J!j(*N!!r2`!!!!!!!!!!!!!$NFQ3!!!#!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!M!!!!3!B!!!!'!!!M"J!
+!"3B!!!3'!!!$"J!!!JB!!!B'!!!,"J!!#JB!!!N'!!!)"J!!"`B!!!`'!!!5"J!
+!%3B!!"!'!!!2"J!!$3B!!!i'!!!6"J!!)JB!!#%'!!!J"J!!(`B!!#-'!!!""J!
+!&!B!!"8'!!!@"J!!&`B!!"J'!!!C"J!!'JB!!"X'!!!F"J!!(3B!!"i!!!'T!!%
+!+!!!!!!$Pj@!!!!!!!!!Irm!!!%!!!"j`!!#!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -3390,7 +3390,7 @@ Z!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!3!"!!!*6@9bCf8J6h9d!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2cmr2d&38%`!!3%
-!!!3J)#!J!j+$B!0dhhJ$!khJ!!8#!3!"!3!"!3%!!!%!!!!!!!!!!3%"!3!"!3!
+!!!3J)#!J!jHI8!0fhhJ$"Di3!!8#!3!"!3!"!3%!!!%!!!!!!!!!!3%"!3!"!3!
 "!!%%!!!!!!!!!!!!!!F"!3!"!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&pIFh4KFR3!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -3776,8 +3776,8 @@ M"`!!*!F!!#8(!!!Q"`!!*`F!!#J(!!!T"`!!+JF!!#X(!!!X"`!!,3F!!#i(!!!
 ["`!!-!F!!$%(!!!b"`!!-`F!!$3(!!!e"`!!0JF!!$F(!!!i"`!!13F!!$S(!!!
 l"`!!2!F!!$d(!!!q"`!!2`F!!%!(!!"""`!!3JF!!%-(!!"%"`!!43F!!%B(!!"
 ("`!!5!F!!%N(!!"+"`!!5`F!!%`(!!"0"`!!6JF!!%m(!!"3"`!!83F!!&)(!!"
-6"`!!9!F!!&8(!!"@"`!!9`F!!&J(!!"C"`!!@JF!!&X(!!"F"`!"G!F!!&d(!!"
-H"`!!A`F!!'!(!!"K"`!!BJF!!'-(!!"N"`!!C3F!!'B(!!"R"`!!D!F!!'N(!!"
+6"`!!9!F!!&8(!!"@"`!!9`F!!&J(!!"C"`!!@JF!!&X(!!"F"`!!A3F!!&i(!!"
+I"`!!B!F!!'%(!!"L"`!"G!F!!'-(!!"N"`!!C3F!!'B(!!"R"`!!D!F!!'N(!!"
 U"`!!D`F!!'`(!!"Y"`!!EJF!!'m(!!"`"`!!F3F!!()(!!"c"`!!G!F!!(8(!!"
 f"`!!G`F!!(J(!!"j"`!!HJF!!(X(!!"m"`!!I3F!!(i(!!"r"`!!J!F!!)%(!!#
 #"`!!J`F!!)3(!!#&"`!!KJF!!)F(!!#)"`!!L3F!!)S(!!#,"`!!M!F!!)d(!!#
@@ -3791,7 +3791,7 @@ f"`!!G`F!!(J(!!"j"`!!HJF!!(X(!!"m"`!!I3F!!(i(!!"r"`!!J!F!!)%(!!#
 !iJF!!1-(!!$N"`!!j3F!!1B(!!$R"`!!k!F!!1N(!!$U"`!!k`F!!1`(!!$Y"`!
 !lJF!!1m(!!$`"`!!m3F!!2)(!!$c"`!!p!F!!28(!!$f"`!!p`F!!2J(!!$j"`!
 !qJF!!2X(!!$m"`!!r3F!!2i(!!$r"`!"!!F!!3%(!!%#"`!"!`F!!33(!!%&"`!
-""JF!!3F(!!%)"`!"#3F!!A8(!!%+"`!"#`F!!3`(!!%0"`!"$JF!!3m(!!%3"`!
+""JF!!3F(!!%)"`!"#3F!!3S(!!&e"`!"#`F!!3`(!!%0"`!"$JF!!3m(!!%3"`!
 "%3F!!4)(!!%6"`!"&!F!!48(!!%@"`!"&`F!!4J(!!%C"`!"'JF!!4X(!!%F"`!
 "(3F!!4i(!!%I"`!")!F!!5%(!!%L"`!")`F!!53(!!%P"`!"*JF!!5F(!!%S"`!
 "+3F!!5S(!!%V"`!",!F!!5d(!!%Z"`!",`F!!6!(!!%a"`!"-JF!!6-(!!%d"`!
@@ -3800,7 +3800,7 @@ f"`!!G`F!!(J(!!"j"`!!HJF!!(X(!!"m"`!!I3F!!(i(!!"r"`!!J!F!!)%(!!#
 "63F!!8i(!!&2"`!"8!F!!9%(!!&5"`!"8`F!!93(!!&9"`!"9JF!!9F(!!&B"`!
 "@3F!!9S(!!&E"`!"A!F!!9d(!!&H"`!"A`F!!@!(!!&K"`!"BJF!!@-(!!&N"`!
 "C3F!!@B(!!&R"`!"D!F!!@N(!!&U"`!"D`F!!@`(!!&Y"`!"EJF!!@m(!!&`"`!
-"F3F!!A)(!!&c!!!"U!!"!#J!!!!J!j(*N!!r2`!!!!!!!!!!!!!$NFQ3!!!#!!!
+"F3F!!A)(!!&c!!!"U3!"!#J!!!!!!jH9J!!!!!!!!(rr!!!"!!!!HF!!!J!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -3822,25 +3822,15 @@ f"`!!G`F!!(J(!!"j"`!!HJF!!(X(!!"m"`!!I3F!!(i(!!"r"`!!J!F!!)%(!!#
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!X)qi!!!!!!!!!%!!X*(m!!#!!!
-!!!!!!!!!!!,#0S!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!!!
-"!!!!!!8!!(rr!!!!!(rr!!!!!(rr!!!!!(rr!!!!$!!"!!)!"J!!!!9!!!!)!!%
-!!6S!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!,#2Z!!!!!!!!!"!!,#4r!!!J!!!!!
+!!!!!!!!#`MD!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!J!!!3!
+!!!!&!!"rr`!!!!"rr`!!!!"rr`!!!!"rr`!!!!`!!3!#!!B!!!!&3!!!#!!"!!%
+k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!rrr
-rr`!!!!-!!3!"1MS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -3849,9 +3839,10 @@ rr`!!!!-!!3!"1MS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!!!2rrrrm
+!!!!$!!%!!6Sk!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!%!!!$rrrrr!!!!"!!"!!%k1QPZBfaeC'8k!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -3860,9 +3851,9 @@ rr`!!!!-!!3!"1MS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+"!!!!rrrrr`!!!!3!!3!"1MTTEQ0XG@4P1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!2rrrrp!!!!#!!%!!6S!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -3871,10 +3862,9 @@ rr`!!!!-!!3!"1MS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!$rrrrr3!!!!J!"!!%k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!rrrrrd!!!!-!!3!"1MSk4e9656TTEQ0XG@4
-P1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -3883,9 +3873,8 @@ P1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!2rrrrp!!!!$!!%!!6Sk1NG98dNkD@jME(9NC6S
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$rrrrr3!!!"!!"!!%k1MT(990
-*1QaTBMS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -3895,8 +3884,8 @@ P1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2rrrrp!!!!&!!)
-!!6T0B@028b"6GA"`Eh*d1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!rrrrrd!!!!3!!3!"1MSk4e9656T
+XD@)k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -3906,8 +3895,8 @@ P1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!rrr
-rrd!!!!B!!J!"1Ne66$S!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$rrrrr3!!!"3!#!!%
+k6@&M6e-J8h9`F'pbG$S!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -3917,8 +3906,9 @@ rrd!!!!B!!J!"1Ne66$S!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!!!2rrrrp
+!!!!'!!)!!6T08d`k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!%!!!$rrrrr3!!!"`!+!!"0B@028b!f1%XJ6'PZDf9b!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -3928,739 +3918,541 @@ rrd!!!!B!!J!"1Ne66$S!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+"!!!!rrrrrd!!!!F!#J!!6@&M6e-J0MK,)%aTEQYPFJ!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!"-D@*$FRP`G'mJ0MK,!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!!6S!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!6'PL3h*jF(4[)$Bi5`!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)!!8eKBdp6)$Bi5b"
--D@jVCA)!!!!!!!!!!!!!!!!!!!!!!#""8&"-!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'!!!!"
-"F("X!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!'!!!!"068a#!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!"-D@)J5@e`Eh*d)$Bi5`!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
-08%a'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"-D@)J5@e`Eh*d)$B
-i5`!!!!!!!!!!!!!!!!!!!!!!!!!!!!"09d0%!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'!!!!"
-23NSJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"08&FJ5@e`Eh*d)$B
-i5`!!!!!!!!!!!!!!!!!!!!!!!!!!!!"36'pL!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'!!!!"
-58e*$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!'!!!!"849K8,Q*S!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!"#B@aXEfpZ)%KPE(!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
-849K8,Q-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"09b"$,d-V+b!f1%X
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"849K8,Q-V+`!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!"09b"$,d-V+b!f1%X!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
-849K8,Q0M!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"09b"$,d-V+b!f1%X
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"849K8,Q0`!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!"09b"$,d-V+b!f1%X!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
-849K8,Q0`F!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"09b"$,d-V+b!f1%X
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"849K8,Q9iF!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
-849K8,QGM!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"(B@eP3fpNC5"$Efj
-fCA*dCA)!!!!!!!!!!!!!!!!!!%!!!!"849K8,QJ!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!"09b"$,d-V+b!f1%X!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!"
-849K8,Q`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"'E'9i)&"bCA"bEf0
-PFh0[FJ!!!!!!!!!!!!!!!!!!!)!!!!"849K8,R!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!"09b"3BA0MB@`J0MK,!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
-849K8,R"KF`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"09b"3BA0MB@`J0MK
-,!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"849K8,R"MD!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!"09b"$,d-V+b!f1%X!!!!!!!!!!!!!!!!!!!!!!!!!!)!!!!"
-849K8,R"MD#XV!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"09b"$,d-V+b!f1%X
-!!!!!!!!!!!!!!!!!!!!!!!!!!)!!!!"849K8,R"`G3!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!"09b"3BA0MB@`J0MK,!!!!!!!!!!!!!!!!!!!!!!!!!)!!!!"
-849K8,R)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"5CAS!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"849K8,R0PC`!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
-849K8,RN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"#DA0[EL"3FQ9`FQp
-MCA0cEh)!!!!!!!!!!!!!!!!!!)!!!!"NEf0e!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'!!!!"
-bFh*M!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!'!!!!"cD'aL!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!"348BJ5@e`Eh*d)$Bi5`!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
-cG(9L!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"348BJ5@e`Eh*d)$B
-i5`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!,Q4[B`!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&!!!!!
-!!!!!,R*cFQ-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!'!!!!!!"3%"!!%!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!%k!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-'!!!!!!%!!!!!"3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!!&0B@028b!f1%XJ6'P
+ZDf9b!!!!!!!!!!!!!!!!!!!!!!!J39"36!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!!3A"
+`E!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!"J!!!!68e-3J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!6'PL)%PYF'pbG#!f1%X!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69"
+-4J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!6'PL)%PYF'pbG#!f1%X
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69G$4!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!!6d*
++)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69"A)%PYF'pbG#!f1%X
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!8%a[BJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!!8P0
+53`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!"J!!!!9%9B9#jLD!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!3Q&XE'p[EL")C@a`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9
+B9#jM!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ3bp$+bXJ0MK,!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#jM+bX!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!69FJ3bp$+bXJ0MK,!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9
+B9#jMB`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ3bp$+bXJ0MK,!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#jMF!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!69FJ3bp$+bXJ0MK,!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9
+B9#jMF(!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ3bp$+bXJ0MK,!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#jPH(!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9
+B9#jRB`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!4f&YC80[C'8J3fpZGQ9
+bG'9b!!!!!!!!!!!!!!!!!!"!!!!!9%9B9#jS!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!69FJ3bp$+bXJ0MK,!!!!!!!!!!!!!!!!!!!!!!!!!!!3!!!!9%9
+B9#jX!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!4QaPH#"3FQ9`FQpMCA0
+cEh)!!!!!!!!!!!!!!!!!!!#!!!!!9%9B9#j`!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!69FJ8'&cBf&X)$Bi5`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9
+B9#j`BA-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ8'&cBf&X)$Bi5`!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#j`BfJ!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!69FJ3bp$+bXJ0MK,!!!!!!!!!!!!!!!!!!!!!!!!!!#!!!!!9%9
+B9#j`BfJV+`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ3bp$+bXJ0MK,!!!
+!!!!!!!!!!!!!!!!!!!!!!!#!!!!!9%9B9#j`F(8!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!69FJ8'&cBf&X)$Bi5`!!!!!!!!!!!!!!!!!!!!!!!!#!!!!!9%9
+B9#jb!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!8Q9k!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#jcC@F!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9
+B9#jj!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3QPcEfiJ8(*PF(*[Bf9
+cFfpb!!!!!!!!!!!!!!!!!!#!!!!!C'pMG3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!!FR0
+bB`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!"J!!!!FfKXBJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!8%9')%PYF'pbG#!f1%X!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Fh4
+eBJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!8%9')%PYF'pbG#!f1%X
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#jNEf-!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"3!!!!!!!
+!!#jbFh*M!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!"J!!!!!!8"!3!"!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!
+!!!!"!!!!!!8!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!%"!!"YB@PZ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!J"!!%!!!!"!3%!!!%"!3!
-!!!!!!3%!!!%"!!%!!!%%!!!!!!!!!!!!!!J"!!%"!!%"!!!!!3!!#3!$'daTBN0
-bHA"dEbif1'XJ4Q%S0'PI1'3T,NaTBJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!$mr2cmr2cmr!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2cmr2`!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!d!!3!!!!!!&9p09d955e0I4e9659p`FQ9QDAJZD!!!!!!
-!!!!!!!!!!!%!!!!!!!!!!!%!!!!!!!!!!!!!"3%"!3!!!3%!!3!!!!!%!!!!!!!
-!!!!!!!!!!!!!!!%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!"!3!!E@&TEJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&p
-IFh4KFR3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!"!!!*6@9bCf8J6h9
-d!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!2cmr2d&38%`!!3%!!!3J)#!J!j+$B!0dhhJ$!khJ!!8#!3!"!3!"!3%
-!!!%!!!!!!!!!!3%"!3!"!3!"!!%%!!!!!!!!!!!!!!F"!3!"!!!"!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!&pIFh4KFR3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"3!!"dp`C@j68d`!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!r2cmr39"36!!!"!!!!!3!!!!!3!!!@-!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!6m
-r2cm!!!!!!!!!!J!!!!)!!J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!)!8!!"!!%!!3!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"3R3dp%45FJ*d4"9%%
-R)#G35808*`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!)!!!"!!!!,3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!!J!
-!!#i#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!!-!!!![!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!!%!!!!-!)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!#!!!"3!!!$%#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!J!!!B!!!!b!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!)!!!(!!!!-`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!#!!
-!!$3#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!!N!!!!e!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!!+!!!!0J)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!#!!!#`!!!$F#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!J!!!`!!!!i!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!)!!!0!!!!13)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!$J!
-!!$S#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!!m!!!!l!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!!3!!!!2!)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!#!!!%3!!!$d#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!J!!")!!!!q!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!)!!!6!!!!2`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!&!!
-!!%!#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!"8!!!""!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!!@!!!!3J)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!#!!!&`!!!%-#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!J!!"J!!!"%!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!)!!!C!!!!43)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!'J!
-!!%B#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!"X!!!"(!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!!F!!!!5!)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!#!!!(3!!!%N#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!J!!"i!!!"+!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!)!!!I!!!!5`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!)!!
-!!%`#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!#%!!!"0!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!!L!!!!6J)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!#!!!)`!!!%m#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!J!!#3!!!"3!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!)!!!P!!!!83)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!*J!
-!!&)#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!#F!!!"6!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!!S!!!!9!)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!#!!!+3!!!&8#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!J!!#S!!!"@!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!)!!!V!!!!9`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!,!!
-!!&J#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!#d!!!"C!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!!Z!!!!@J)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!#!!!,`!!!&X#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!J!!$!!!!"F!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!)!!!a!!!!A3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!-J!
-!!&i#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!$-!!!"I!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!!d!!!!B!)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!#!!!03!!!'%#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!J!!$B!!!"L!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!)!!!h!!!!B`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!1!!
-!!'3#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!$N!!!"P!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!!k!!!!CJ)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!#!!!1`!!!'F#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!J!!$`!!!"S!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!)!!!p!!!!D3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!2J!
-!!'S#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!$m!!!"V!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!"!!!!!E!)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!#!!!33!!!'d#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!J!!%)!!!"Z!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!)!!"$!!!!E`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!4!!
-!!(!#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!%8!!!"a!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!"'!!!!FJ)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!#!!!4`!!!(-#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!J!!%J!!!"d!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!)!!"*!!!!G3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!5J!
-!!(B#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!%X!!!"h!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!"-!!!!H!)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!#!!!63!!!(N#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!J!!%i!!!"k!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!)!!"2!!!!H`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!8!!
-!!(`#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!&%!!!"p!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!"5!!!!IJ)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!#!!!8`!!!(m#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!J!!&3!!!#!!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!)!!"9!!!!J3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!9J!
-!!))#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!&F!!!#$!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!"B!!!!K!)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!#!!!@3!!!)8#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!J!!&S!!!#'!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!)!!"E!!!!K`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!A!!
-!!)J#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!&d!!!#*!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!"H!!!!LJ)"!!!!!!!"!!%"!!!
-!!!!!!!!!!!!!!3!!!!!!!!!!#!!!A`!!!)X#!3!!!!!!!3!"!3!!!!!!!!!!!!!
-!!!%!!!!!!!!!!!J!!'!!!!#-!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
-!!!!)!!"K!!!!M3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!BJ!
-!!)i#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!'-!!!#2!J%!!!!
-!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!"N!!!!N!!#!3!!!!!!!3!"!3!
-!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!'8!!!#4!J%!!!!!!!%!!3%!!!!!!!!!!!!
-!!!!"!!!!!!!!!!!)!!"Q!!!!NJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!
-!!!!!#!!!C`!!!*-#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!'J
-!!!#8!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!"T!!!!P3)"!!!
-!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!DJ!!!*B#!3!!!!!!!3!"!3!
-!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!'X!!!#A!J%!!!!!!!%!!3%!!!!!!!!!!!!
-!!!!"!!!!!!!!!!!)!!"X!!!!Q!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!
-!!!!!#!!!E3!!!*N#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!'i
-!!!#D!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!"[!!!!Q`)"!!!
-!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!F!!!!*`#!3!!!!!!!3!"!3!
-!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!(%!!!#G!J%!!!!!!!%!!3%!!!!!!!!!!!!
-!!!!"!!!!!!!!!!!)!!"b!!!!RJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!
-!!!!!#!!!F`!!!*m#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!(3
-!!!#J!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!"e!!!!S3)"!!!
-!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!GJ!!!+)#!3!!!!!!!3!"!3!
-!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!(F!!!#M!J%!!!!!!!%!!3%!!!!!!!!!!!!
-!!!!"!!!!!!!!!!!)!!"i!!!!T!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!
-!!!!!#!!!H3!!!+8#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!(S
-!!!#Q!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!"l!!!!T`)"!!!
-!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!I!!!!+J#!3!!!!!!!3!"!3!
-!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!(d!!!#T!J%!!!!!!!%!!3%!!!!!!!!!!!!
-!!!!"!!!!!!!!!!!)!!"q!!!!UJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!
-!!!!!#!!!I`!!!+X#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!)!
-!!!#X!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!#"!!!!V3)"!!!
-!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!JJ!!!+i#!3!!!!!!!3!"!3!
-!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!)-!!!#[!J%!!!!!!!%!!3%!!!!!!!!!!!!
-!!!!"!!!!!!!!!!!)!!#%!!!!X!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!
-!!!!!#!!!K3!!!,%#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!)B
-!!!#b!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!#(!!!!X`)"!!!
-!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!L!!!!,3#!3!!!!!!!3!"!3!
-!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!)N!!!#e!J%!!!!!!!%!!3%!!!!!!!!!!!!
-!!!!"!!!!!!!!!!!)!!#+!!!!YJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!
-!!!!!#!!!L`!!!,F#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!)`
-!!!#i!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!#0!!!!Z3)"!!!
-!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!MJ!!!,S#!3!!!!!!!3!"!3!
-!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!)m!!!#l!J%!!!!!!!%!!3%!!!!!!!!!!!!
-!!!!"!!!!!!!!!!!)!!#3!!!!!,`#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!*%!!!#p!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!#
-5!!!![J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!N`!!!,m#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!*3!!!$!!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!#9!!!!`3)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!!PJ!!!-)#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!*F!!!$$!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!#
-B!!!!a!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!Q3!!!-8#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!*S!!!$'!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!#E!!!!a`)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!!R!!!!-J#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!*d!!!$*!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!#
-H!!!!bJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!R`!!!-X#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!+!!!!$-!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!#K!!!!c3)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!!SJ!!!-i#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!+-!!!$2!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!#
-N!!!!d!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!T3!!!0%#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!+B!!!$5!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!#R!!!!d`)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!!U!!!!03#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!+N!!!$9!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!#
-U!!!!eJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!U`!!!0F#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!+`!!!$B!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!#Y!!!!f3)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!!VJ!!!0S#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!+m!!!$E!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!#
-`!!!!h!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!X3!!!0d#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!,)!!!$H!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!#c!!!!h`)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!!Y!!!!1!#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!,8!!!$K!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!#
-f!!!!iJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!Y`!!!1-#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!,J!!!$N!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!#j!!!!j3)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!!ZJ!!!1B#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!,X!!!$R!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!#
-m!!!!k!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!![3!!!1N#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!,i!!!$U!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!#r!!!!k`)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!!`!!!!1`#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!-%!!!$Y!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!$
-#!!!!lJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!``!!!1m#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!-3!!!$`!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!$&!!!!m3)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!!aJ!!!2)#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!-F!!!$c!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!$
-)!!!!p!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!b3!!!28#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!-S!!!$f!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!$,!!!!p`)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!!c!!!!2J#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!-d!!!$j!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!$
-1!!!!qJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!c`!!!2X#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!0!!!!$m!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!$4!!!!r3)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!!dJ!!!2i#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!0-!!!$r!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!$
-8!!!"!!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!e3!!!3%#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!0B!!!%#!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!$A!!!"!`)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!!f!!!!33#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!0N!!!%&!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!$
-D!!!""J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!f`!!!3F#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!0`!!!%)!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!$G!!!"#3)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!!hJ!!!3S#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!0m!!!%,!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!$
-J!!!"$!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!i3!!!3d#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!1)!!!%1!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!$M!!!"$`)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!!j!!!!4!#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!18!!!%4!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!$
-Q!!!"%J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!j`!!!4-#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!1J!!!%8!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!$T!!!"&3)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!!kJ!!!4B#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!1X!!!%A!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!$
-X!!!"'!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!l3!!!4N#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!1i!!!%D!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!$[!!!"'`)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!!m!!!!4`#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!2%!!!%G!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!$
-b!!!"(J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!m`!!!4m#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!23!!!%J!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!$e!!!")3)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!!pJ!!!5)#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!2F!!!%M!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!$
-i!!!"*!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!q3!!!58#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!2S!!!%Q!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!$l!!!"*`)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!!r!!!!5J#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!2d!!!%T!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!$
-q!!!"+J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!r`!!!5X#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!3!!!!%X!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!%"!!!",3)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!"!J!!!5i#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!3-!!!%[!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!%
-%!!!"-!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!""3!!!6%#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!3B!!!%b!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!%(!!!"-`)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!"#!!!!63#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!3N!!!%e!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!%
-+!!!"0J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!"#`!!!6F#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!3`!!!%i!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!%0!!!"13)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!"$J!!!6S#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!3m!!!%l!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!%
-3!!!"2!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!"%3!!!6d#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!4)!!!%q!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!%6!!!"2`)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!"&!!!!8!#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!48!!!&"!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!%
-@!!!"3J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!"&`!!!8-#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!4J!!!&%!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!%C!!!"43)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!"'J!!!8B#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!4X!!!&(!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!%
-F!!!"5!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!"(3!!!8N#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!4i!!!&+!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!%I!!!"5`)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!")!!!!8`#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!5%!!!&0!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!%
-L!!!"6J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!")`!!!8m#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!53!!!&3!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!%P!!!"83)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!"*J!!!9)#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!5F!!!&6!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!%
-S!!!"9!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!"+3!!!98#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!5S!!!&@!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!%V!!!"9`)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!",!!!!9J#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!5d!!!&C!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!%
-Z!!!"@J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!",`!!!9X#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!6!!!!&F!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!%a!!!"A3)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!"-J!!!9i#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!6-!!!&I!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!%
-d!!!"B!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!"03!!!@%#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!6B!!!&L!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!%h!!!"B`)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!"1!!!!@3#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!6N!!!&P!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!%
-k!!!"CJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!"1`!!!@F#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!6`!!!&S!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!%p!!!"D3)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!"2J!!!@S#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!6m!!!&V!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!&
-!!!!"E!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!"33!!!@d#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!8)!!!&Z!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!&$!!!"E`)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!"4!!!!A!#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!88!!!&a!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!&
-'!!!"FJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!"4`!!!A-#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!8J!!!&d!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!&*!!!"G3)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!"5J!!!AB#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!8X!!!&h!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!&
--!!!"H!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!"63!!!AN#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!8i!!!&k!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!&2!!!"H`)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!"8!!!!A`#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!9%!!!&p!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!&
-5!!!"IJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!"8`!!!B!#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!93!!!'"!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!&9!!!"JJ)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!"9J!!!B-#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!9F!!!'%!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!&
-B!!!"K3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!"@3!!!BB#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!9S!!!'(!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!&E!!!"L!)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!"A!!!!BN#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!9d!!!'+!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!&
-H!!!"L`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!"A`!!!B`#!3!
-!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!@!!!!'0!J%!!!!!!!%!!3%
-!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!&K!!!"MJ)"!!!!!!!"!!%"!!!!!!!!!!!
-!!!!!!3!!!!!!!!!!#!!"BJ!!!Bm#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!
-!!!!!!!J!!@-!!!'3!!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!
-"C!!!!C%#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!@8!!!'5!J%
-!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!&Q!!!"N`)"!!!!!!!"!!%
-"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!"C`!!!C3#!3!!!!!!!3!"!3!!!!!!!!!
-!!!!!!!%!!!!!!!!!!!J!!@J!!!'9!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!
-!!!!!!!!)!!&T!!!"PJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!
-"DJ!!!CF#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!@X!!!'B!J%
-!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!&X!!!"Q3)"!!!!!!!"!!%
-"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!"E3!!!CS#!3!!!!!!!3!"!3!!!!!!!!!
-!!!!!!!%!!!!!!!!!!!J!!@i!!!'E!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!
-!!!!!!!!)!!&[!!!"R!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!
-"F!!!!Cd#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!A%!!!'H!J%
-!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!&b!!!"R`)"!!!!!!!"!!%
-"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!"F`!!!D3#!3!!!!!!!3!"!3!!!!!!!!!
-!!!!!!!%!!!!!!!!!!!J!!A3!!!'Q!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!
-!!!!!!!!)!!&e!!!"T`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!3!!!!)!!!!$!!!!"!!!!!8!!!!'!!!!"`!!!!J!!!!*!!!
-!#J!!!!X!!!!-!!!!$3!!!!i!!!!2!!!!%!!!!"%!!!!5!!!!%`!!!"3!!!!9!!!
-!&J!!!"F!!!!B!!!!'3!!!"S!!!!E!!!!(!!!!"d!!!!H!!!!(`!!!#!!!!!K!!!
-!)J!!!#-!!!!N!!!!*3!!!#B!!!!R!!!!+!!!!#N!!!!U!!!!+`!!!#`!!!!Y!!!
-!,J!!!#m!!!!`!!!!-3!!!$)!!!!c!!!!0!!!!$8!!!!f!!!!0`!!!$J!!!!j!!!
-!1J!!!$X!!!!m!!!!23!!!$i!!!!r!!!!3!!!!%%!!!"#!!!!3`!!!%3!!!"&!!!
-!4J!!!%F!!!")!!!!53!!!%S!!!",!!!!6!!!!%d!!!"1!!!!6`!!!&!!!!"4!!!
-!8J!!!&-!!!"8!!!!93!!!&B!!!"A!!!!@!!!!&N!!!"D!!!!@`!!!&`!!!"G!!!
-!AJ!!!&m!!!"J!!!!B3!!!')!!!"M!!!!C!!!!'8!!!"Q!!!!C`!!!'J!!!"T!!!
-!DJ!!!'X!!!"X!!!!E3!!!'i!!!"[!!!!F!!!!(%!!!"b!!!!F`!!!(3!!!"e!!!
-!GJ!!!(F!!!"i!!!!H3!!!(S!!!"l!!!!I!!!!(d!!!"q!!!!I`!!!)!!!!#"!!!
-!JJ!!!)-!!!#%!!!!K3!!!)B!!!#(!!!!L!!!!)N!!!#+!!!!L`!!!)`!!!#0!!!
-!MJ!!!)m!!!#3!!!!!*%!!!#5!!!!N`!!!*3!!!#9!!!!PJ!!!*F!!!#B!!!!Q3!
-!!*S!!!#E!!!!R!!!!*d!!!#H!!!!R`!!!+!!!!#K!!!!SJ!!!+-!!!#N!!!!T3!
-!!+B!!!#R!!!!U!!!!+N!!!#U!!!!U`!!!+`!!!#Y!!!!VJ!!!+m!!!#`!!!!X3!
-!!,)!!!#c!!!!Y!!!!,8!!!#f!!!!Y`!!!,J!!!#j!!!!ZJ!!!,X!!!#m!!!![3!
-!!,i!!!#r!!!!`!!!!-%!!!$#!!!!``!!!-3!!!$&!!!!aJ!!!-F!!!$)!!!!b3!
-!!-S!!!$,!!!!c!!!!-d!!!$1!!!!c`!!!0!!!!$4!!!!dJ!!!0-!!!$8!!!!e3!
-!!0B!!!$A!!!!f!!!!0N!!!$D!!!!f`!!!0`!!!$G!!!!hJ!!!0m!!!$J!!!!i3!
-!!1)!!!$M!!!!j!!!!18!!!$Q!!!!j`!!!1J!!!$T!!!!kJ!!!1X!!!$X!!!!l3!
-!!1i!!!$[!!!!m!!!!2%!!!$b!!!!m`!!!23!!!$e!!!!pJ!!!2F!!!$i!!!!q3!
-!!2S!!!$l!!!!r!!!!2d!!!$q!!!!r`!!!3!!!!%"!!!"!J!!!3-!!!%%!!!""3!
-!!3B!!!%(!!!"#!!!!3N!!!%+!!!"#`!!!3`!!!%0!!!"$J!!!3m!!!%3!!!"%3!
-!!4)!!!%6!!!"&!!!!48!!!%@!!!"&`!!!4J!!!%C!!!"'J!!!4X!!!%F!!!"(3!
-!!4i!!!%I!!!")!!!!5%!!!%L!!!")`!!!53!!!%P!!!"*J!!!5F!!!%S!!!"+3!
-!!5S!!!%V!!!",!!!!5d!!!%Z!!!",`!!!6!!!!%a!!!"-J!!!6-!!!%d!!!"03!
-!!6B!!!%h!!!"1!!!!6N!!!%k!!!"1`!!!6`!!!%p!!!"2J!!!6m!!!&!!!!"33!
-!!8)!!!&$!!!"4!!!!88!!!&'!!!"4`!!!8J!!!&*!!!"5J!!!8X!!!&-!!!"63!
-!!8i!!!&2!!!"8!!!!9%!!!&5!!!"8`!!!93!!!&9!!!"9J!!!9F!!!&B!!!"@3!
-!!9S!!!&E!!!"A!!!!9d!!!&H!!!"A`!!!@!!!!&K!!!"BJ!!!@-!!!&N!!!"C3!
-!!@B!!!&R!!!"D!!!!@N!!!&U!!!"D`!!!@`!!!&Y!!!"EJ!!!@m!!!&`!!!"F3!
-!!A)!!!&c!!!"G!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!"G3!!!B!)!!!!#!!"G3!!!GS!!3!F!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!#!!!!3J!!!))!!!$#!!!"!J!!!8)!!!'#!!!"`J!!!J)!!!*#!!!#JJ
-!!!X)!!!-#!!!$3J!!!i)!!!2#!!!%!J!!"%)!!!5#!!!%`J!!"3)!!!9#!!!&JJ
-!!"F)!!!B#!!!'3J!!"S)!!!E#!!!(!J!!"d)!!!H#!!!(`J!!#!)!!!K#!!!)JJ
-!!#-)!!!N#!!!*3J!!#B)!!!R#!!!+!J!!#N)!!!U#!!!+`J!!#`)!!!Y#!!!,JJ
-!!#m)!!!`#!!!-3J!!$))!!!c#!!!0!J!!$8)!!!f#!!!0`J!!$J)!!!j#!!!1JJ
-!!$X)!!!m#!!!23J!!$i)!!!r#!!!3!J!!%%)!!"##!!!3`J!!%3)!!"&#!!!4JJ
-!!%F)!!")#!!!53J!!%S)!!",#!!!6!J!!%d)!!"1#!!!6`J!!&!)!!"4#!!!8JJ
-!!&-)!!"8#!!!93J!!&B)!!"A#!!!@!J!!&N)!!"D#!!!@`J!!&`)!!&d#!!!A3J
-!!&i)!!"I#!!!B!J!!'%)!!"L#!!!B`J!!'3)!!"P#!!!CJJ!!'F)!!"S#!!!D3J
-!!'S)!!"V#!!!E!J!!'d)!!"Z#!!!E`J!!(!)!!"a#!!!FJJ!!(-)!!"d#!!!G3J
-!!(B)!!"h#!!!H!J!!(N)!!"k#!!!H`J!!(`)!!"p#!!!IJJ!!(m)!!#!#!!!J3J
-!!)))!!#$#!!!K!J!!)8)!!#'#!!!K`J!!)J)!!#*#!!!LJJ!!)X)!!#-#!!!M3J
-!!)i)!!#2#!!!N!!)!!#4#!!!NJJ!!*-)!!#8#!!!P3J!!*B)!!#A#!!!Q!J!!*N
-)!!#D#!!!Q`J!!*`)!!#G#!!!RJJ!!*m)!!#J#!!!S3J!!+))!!#M#!!!T!J!!+8
-)!!#Q#!!!T`J!!+J)!!#T#!!!UJJ!!+X)!!#X#!!!V3J!!+i)!!#[#!!!X!J!!,%
-)!!#b#!!!X`J!!,3)!!#e#!!!YJJ!!,F)!!#i#!!!Z3J!!,S)!!#l#!!![!J!!,d
-)!!#q#!!![`J!!-!)!!$"#!!!`JJ!!--)!!$%#!!!a3J!!-B)!!$(#!!!b!J!!-N
-)!!$+#!!!b`J!!-`)!!$0#!!!cJJ!!-m)!!$3#!!!d3J!!0))!!$6#!!!e!J!!08
-)!!$@#!!!e`J!!0J)!!$C#!!!fJJ!!0X)!!$F#!!!h3J!!0i)!!$I#!!!i!J!!1%
-)!!$L#!!!i`J!!13)!!$P#!!!jJJ!!1F)!!$S#!!!k3J!!1S)!!$V#!!!l!J!!1d
-)!!$Z#!!!l`J!!2!)!!$a#!!!mJJ!!2-)!!$d#!!!p3J!!2B)!!$h#!!!q!J!!2N
-)!!$k#!!!q`J!!2`)!!$p#!!!rJJ!!2m)!!%!#!!"!3J!!3))!!%$#!!""!J!!38
-)!!%'#!!""`J!!3J)!!%*#!!"G3J!!3S)!!%,#!!"$!J!!3d)!!%1#!!"$`J!!4!
-)!!%4#!!"%JJ!!4-)!!%8#!!"&3J!!4B)!!%A#!!"'!J!!4N)!!%D#!!"'`J!!4`
-)!!%G#!!"(JJ!!4m)!!%J#!!")3J!!5))!!%M#!!"*!J!!58)!!%Q#!!"*`J!!5J
-)!!%T#!!"+JJ!!5X)!!%X#!!",3J!!5i)!!%[#!!"-!J!!6%)!!%b#!!"-`J!!63
-)!!%e#!!"0JJ!!6F)!!%i#!!"13J!!6S)!!%l#!!"2!J!!6d)!!%q#!!"2`J!!8!
-)!!&"#!!"3JJ!!8-)!!&%#!!"43J!!8B)!!&(#!!"5!J!!8N)!!&+#!!"5`J!!8`
-)!!&0#!!"6JJ!!8m)!!&3#!!"83J!!9))!!&6#!!"9!J!!98)!!&@#!!"9`J!!9J
-)!!&C#!!"@JJ!!9X)!!&F#!!"A3J!!9i)!!&I#!!"B!J!!@%)!!&L#!!"B`J!!@3
-)!!&P#!!"CJJ!!@F)!!&S#!!"D3J!!@S)!!&V#!!"E!J!!@d)!!&Z#!!"E`J!!A!
-)!!&a#!!"FJJ!!A-#!!!"!!!!!3)"!!!!!!!"!!%$!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!J!!!J!!!!)#!3!!!!!!!3!"!`!!!!!!!!!!!!!!!!3!!!!!!!!!!!)!!!-
-!!!!$!J%!!!!!!!%!!3-!!!!!!!!!!!!!!!!%!!!!!!!!!!!#!!!%!!!!"!)"!!!
-!!!!"!!%$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!J!!"3!!!!8#!3!!!!!!!3!"!`!
-!!!!!!!!!!!!!!!%!!!!!!!!!!!)!!!B!!!!'!J%!!!!!!!%!!3-!!!!!!!!!!!!
-!!!!&!!!!!!!!!!!#!!!(!!!!"`)"!!!!!!!"!!%$!!!!!!!!!!!!!!!!!3!!!!!
-!!!!!!J!!#!!!!!J#!3!!!!!!!3!"!`!!!!!!!!!!!!!!!!8!!!!!!!!!!!)!!!N
-!!!!*!J%!!!!!!!%!!3-!!!!!!!!!!!!!!!!&!!!!!!!!!!!#!!!+!!!"I`)"!!!
-!!!!"!!%$!!!!!!!!!!!!!!!!!3!!!!!!!!!!!J!!#`!!!DN#!3!!!!!!!3!"!3!
-!!!!!!!!!!!!!!!%!!!!!!!!!!!)!!!`!!!'U!J%!!!!!!!%!!3%!!!!!!!!!!!!
-!!!!"!!!!!!!!!!!#!!!0!!!"U`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!
-!!!!!!J!!$J!!!D`#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!)!!!m
-!!!'Y!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!#!!!3!!!"VJ)"!!!
-!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!J!!%3!!!Dm#!3!!!!!!!3!"!3!
-!!!!!!!!!!!!!!!%!!!!!!!!!!!)!!")!!!'`!J%!!!!!!!%!!3%!!!!!!!!!!!!
-!!!!"!!!!!!!!!!!#!!!6!!!"X3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!
-!!!!!!J!!&!!!!E)#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!)!!"8
-!!!'c!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!#!!!@!!!"Y!)"!!!
-!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!J!!&`!!!E8#!3!!!!!!!3!"!3!
-!!!!!!!!!!!!!!!%!!!!!!!!!!!)!!"J!!!'f!J%!!!!!!!%!!3%!!!!!!!!!!!!
-!!!!"!!!!!!!!!!!#!!!C!!!"Y`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!
-!!!!!!J!!'J!!!EJ#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!)!!"X
-!!!'j!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!#!!!F!!!"ZJ)"!!!
-!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!J!!(3!!!EX#!3!!!!!!!3!"!3!
-!!!!!!!!!!!!!!!%!!!!!!!!!!!)!!"i!!!'m!J%!!!!!!!%!!3%!!!!!!!!!!!!
-!!!!"!!!!!!!!!!!#!!!I!!!"[3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!
-!!!!!!J!!)!!!!Ei#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!)!!#%
-!!!'r!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!#!!!L!!!"`!)"!!!
-!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!J!!)`!!!F%#!3!!!!!!!3!"!3!
-!!!!!!!!!!!!!!!%!!!!!!!!!!!)!!#3!!!(#!J%!!!!!!!%!!3%!!!!!!!!!!!!
-!!!!"!!!!!!!!!!!#!!!P!!!"``)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!
-!!!!!!J!!*J!!!F3#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!)!!#F
-!!!(&!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!#!!!S!!!"aJ)"!!!
-!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!J!!+3!!!FF#!3!!!!!!!3!"!3!
-!!!!!!!!!!!!!!!%!!!!!!!!!!!)!!#S!!!()!J%!!!!!!!%!!3%!!!!!!!!!!!!
-!!!!"!!!!!!!!!!!#!!!V!!!"b3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!
-!!!!!!J!!,!!!!FS#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!)!!#d
-!!!(,!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!#!!!Z!!!"T3)"!!!
-!!!!"!!%$!!!!!!!!!!!!!!!!!3!!!!!!!!!!!J!!,`!!!F`#!3!!!!!!!3!"!3!
-!!!!!!!!!!!!!!!%!!!!!!!!!!!)!!$!!!!(0!J%!!!!!!!%!!3-!!!!!!!!!!!!
-!!!!"!!!!!!!!!!!#!!!a!!!"cJ)"!!!!!!!"!!%$!!!!!!!!!!!!!!!!!3!!!!!
-!!!!!!J!!-J!!!Fm#!3!!!!!!!3!"!`!!!!!!!!!!!!!!!!%!!!!!!!!!!!)!!$-
-!!!(p"!%!!!!!!!!!!3-!!!!!!!!!!!!!!!#"!!!!!!!!!!!#!!!d!!!"rJ3"!!!
-!!!!!!!%$!!!!!!!!!!!!!!!!J3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'!!!!J)!!J!!!!!#!`!&!!!
-!!!)%!!`!!!!!!J8!#J!!!!!#"J!#!!!!!!)(!!8!!!!!!JJ!!J!!!!!##3!'!!!
-!!!)+!!d!!!!!!JX!"3!!!!!#$!!&!!!!!!)0!!%!!!!!!Ji!!3!!!!!#$`!(!!!
-!!!)3!!J!!!!!!K%!"3!!!!!#%J!#!!!!!!)6!!)!!!!!!K3!#!!!!!!#&3!"!!!
-!!!)@!!%!!!!!!KF!#!!!!!!#'!!*!!!!!!)C!!3!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!"jJF!!!%!!!!!!!!!!!!!!!!!!!!!Y0m2&2rrr[B
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(R#!!!!3!!!!!!!!!!!!!!!!!!!!#
-dh`m8rrr13J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!J!!!!"i!!!!!(L!!!
-!!H%!!!!"j!!!!!(P!!!!!H-!!!!"jJ!!!!(R!!%!!!!b8Np29!!!!!!!!!!!!!!
-!!!C(8P93!!!!!!!!!!%18Qpj*h-J4f9d5&488&-!!!!%4NP-43%!!D*'58a&!3!
-"SdC*6%8"!!'K4NP-43%!!D"(8P93!!!!!!!!!!)66h"PEP066#""F("XD@0KG'P
-[EJ!!!#0'58a&!J!!(%C*6%8#!!!U4NP-43)!!!e'58a&!J!!)%C*6%8#!!!54NP
--43)!!"0'58a&!J!!&NC*6%8#!!!B4NP-43)!!"G'58a&!J!!$NC*6%8#!!!H4NP
--43)!!"&'58a&!J!!%%C*6%8#!!!K4NP-43)!!"4'58a&!J!!&8C*6%8#!!!X4NP
--43)!!"T'58a&!J!!'8C*6%8#!!!S4NP-43)!!#G'58a&!J!!*%C*6%8#!!!Y4NP
--43)!!!Y'58a&!J!!*NC*6%8#!!!T4NP-43)!!!a'58a&!J!!+dC*6%8#!!!L4NP
--43)!!!p'58a&!J!!'dC*6%8#!!!G4NP-43)!!"p'58a&!J!!*8C*6%8#!!!M4e*
-98!!!!!!!!!!$%8p`C@j68d`J6'PLFQ&bD@9c!!!!"%G599!!!!!!!!!!"!038%-
-!!!!#4NP-43)!!$0'58a&!J!!0%G599!!!!!!!!!!"3-f1'X!!!!#4NP-438!!#"
-'58a&"3!!(dG599!!!!!!!!!!"JCMFRP`G'm!!!!S4NP-43%!!Aa'58a&!3!"INC
-*6%8"!!'N4NP-43%!!Cp'58a&!3!"I8C*6%8"!!&l4e*98!!!!!!!!!!("'&cEM%
-!!!"A4NP-43%!!$j'58a&!3!!-8C*6%8"!!"&4NP-43%!!$P'58a&!3!!3dC*6%8
-"!!!m4NP-43%!!$p'58a&!3!!3%C*6%8"!!"%4NP-43%!!%&'58a&!3!!0dC*6%8
-"!!!e4NP-43%!!$Y'58a&!3!!-NC*6%8"!!!i4NP-43%!!%K'58a&!3!!4NC*6%8
-"!!"#4NP-43%!!$C'58a&!3!!4dC*6%8"!!')4NP-43%!!("'58a&!3!!I%C*6%8
-"!!"i4NP-43%!!(T'58a&!3!!H8C*6%8"!!"a4NP-43%!!(C'58a&!3!!FNC*6%8
-"!!"p4NP-43%!!B&'58a&!3!!FdC*6%8"!!"e4NP-43%!!(Y'58a&!3!!A8C*6%8
-"!!"04NP-43%!!&P'58a&!3!!6NC*6%8"!!"D4NP-43%!!%p'58a&!3!!@dC*6%8
-"!!"34NP-43%!!&a'58a&!3!!5dC*6%8"!!"A4NP-43%!!%a'58a&!3!!@%C*6%8
-"!!"Z4NP-43%!!'p'58a&!3!"LNC*6%8"!!"X4NP-43%!!'e'58a&!3!"L8C*6%8
-"!!',4NP-43%!!'9'58a&!3!!D8C*6%8"!!"S4NP-43%!!'G'58a&!3!!BdC*6%8
-"!!"N4NP-43%!!'&'58a&!3!!DNC*6%8"!!"L4NP-43%!!'C'58a&!3!!8dC*6%8
-"!!"84NP-43%!!&9'58a&!3!!9NC*6%8"!!"*4NP-43%!!%T'58a&!3!!ANC*6%8
-"!!"54NP-43%!!$T'58a&!3!!GdC*6%8"!!!c4NP-43%!!(4'58a&!3!!,dC*6%8
-"!!!Z4NP-43%!!#e'58a&!3!!28C*6%8"!!!d4NP-43%!!Ba'58a&!3!!88C*6%8
-"!!!`4NP-43%!!&p'58a&!3!!B%C*6%8"!!"V4e*98!!!!!!!!!!)!Q*Q!!!!"8C
-*6%8"!!##4NP-43%!!(p'58a&!3!!J%C*6%8"!!"q4NP-43%!!)&(8P93!!!!!!!
-!!!N$BQP[!!!!$NC*6%8"!!#%4NP-43%!!Be'58a&!3!!JdC*6%8"!!'14NP-43%
-!!C&'58a&!3!"MdC*6%8"!!'3!%C*6%8"!!#&4NP-43%!!C*'58a&!3!"J%C*6%8
-"!!'(4NP-43%!!C9'58a&!3!"NdC*6%8"!!'84e*98!!!!!!!!!!+!Q*Z!!!!&%C
-*6%8"!!#'4NP-43%!!)P'58a&!3!!LdC*6%8"!!#14NP-43%!!DC'58a&!3!!N8C
-*6%8"!!#64NP-43%!!*4'58a&!3!!PNC*6%8"!!#B4NP-43%!!)K'58a&!3!!M8C
-*6%8"!!#54NP-43%!!)T'58a&!3!!PdC*6%8"!!#(4NP-43%!!*9'58a&!3!!MdC
-*6%8"!!#3!%C*6%8"!!#-4e*98!!!!!!!!!!,"Q*eCQCPFJ!!!!*'58a&!3!!Q8C
-*6%8"!!#D4e*98!!!!!!!!!!-"'0KFh3!!!!&4NP-43%!!*p'58a&!3!!R%C*6%8
-"!!#G4NP-43%!!*Y'58a&!3!!RNG599!!!!!!!!!!$34MEfe`!!!!!dC*6%8"!!#
-J4NP-43%!!+&'58a&!3!!SNG599!!!!!!!!!!$J4MEfjQ!!!!!NC*6%8"!!#M4NP
--43%!!+4(8P93!!!!!!!!!!m$C'9c!!!!'NC*6%8"!!#P4NP-43%!!+C'58a&!3!
-!U%C*6%8"!!#T4NP-43%!!+Y'58a&!3!!V%C*6%8"!!#Z4NP-43%!!CC'58a&!3!
-!VdC*6%8"!!#b4NP-43%!!,0'58a&!3!!Y%C*6%8"!!#e4NP-43%!!,C'58a&!3!
-!Z%C*6%8"!!#j4NP-43%!!,T'58a&!3!!UNC*6%8"!!#`4NP-43%!!,G'58a&!3!
-![8C*6%8"!!#l4NP-43%!!+G'58a&!3!!X8C*6%8"!!#m4NP-43%!!+e(8P93!!!
-!!!!!!"!#C'J!!!!&4NP-43%!!-"'58a&!3!!`8C*6%8"!!$#4NP-43%!!,j'58a
-&!3!![dG599!!!!!!!!!!%30NFf%!!!!)4NP-43%!!-9'58a&!3!!aNC*6%8"!!$
-(4NP-43%!!-0'58a&!3!!b8C*6%8"!!$)4NP-43%!!-4'58a&!3!"JNG599!!!!!
-!!!!!%J0PFR)!!!!$4NP-43%!!-T'58a&!3!!bdC*6%8"!!$-4e*98!!!!!!!!!!
-6!f9fF!!!!$p'58a&!3!!ddC*6%8"!!$54NP-43%!!04'58a&!3!!eNC*6%8"!!$
-V4NP-43%!!0e'58a&!3!!j%C*6%8"!!$c4NP-43%!!1a'58a&!3!!hNC*6%8"!!$
-P4NP-43%!!24'58a&!3!!k%C*6%8"!!$D4NP-43%!!2G'58a&!3!"!NC*6%8"!!$
-K4NP-43%!!2"'58a&!3!!q%C*6%8"!!$Y4NP-43%!!0p'58a&!3!!jNC*6%8"!!$
-e4NP-43%!!1P'58a&!3!!fdC*6%8"!!$L4NP-43%!!2&'58a&!3!!kNC*6%8"!!$
-F4NP-43%!!10'58a&!3!!mNC*6%8"!!$Z4NP-43%!!1"'58a&!3!!jdC*6%8"!!$
-f4NP-43%!!2j'58a&!3!!qdC*6%8"!!$m4NP-43%!!3"'58a&!3!"!8C*6%8"!!$
-j4NP-43%!!2T'58a&!3!!r8C*6%8"!!$r4NP-43%!!3C'58a&!3!""dC*6%8"!!%
-)4NP-43%!!3P'58a&!3!""8C*6%8"!!%%4NP-43%!!30'58a&!3!!cdC*6%8"!!$
-04NP-43%!!-j'58a&!3!!e8C*6%8"!!$[4NP-43%!!0&'58a&!3!!edC*6%8"!!$
-34NP-43%!!0P'58a&!3!!f%C*6%8"!!'A4NP-43%!!CK(8P93!!!!!!!!!"3%D'e
-KB`!!!!&'58a&!3!"#NG599!!!!!!!!!!&34TC'9K!!!!"8C*6%8"!!%,4NP-43%
-!!3a'58a&!3!"$NC*6%8"!!%04NP-43%!!3p(8P93!!!!!!!!!"B&E'KKFfJ!!!!
-#4NP-43%!!4"'58a&!3!"%8G599!!!!!!!!!!&`0YC$)!!!!#4NP-43%!!4*'58a
-&!3!"%dG599!!!!!!!!!!'!0YC$8!!!!#4NP-43%!!44'58a&!3!"&8G599!!!!!
-!!!!!'34YC'-b!!!!!NC*6%8"!!%@4NP-43%!!4G(8P93!!!!!!!!!"S(Ef*UC@0
-dF`!!!!4'58a&!3!"'dC*6%8"!!%B4NP-43%!!4T'58a&!3!"'8G599!!!!!!!!!
-!'`0`C@d!!!!'4NP-43%!!5&'58a&!3!")%C*6%8"!!%H4NP-43%!!4p'58a&!3!
-"(%C*6%8"!!%G4e*98!!!!!!!!!!F"R"VBh-a-J!!!""'58a&!3!")NC*6%8"!!%
-M4NP-43%!!54'58a&!3!"*8C*6%8"!!%Q4NP-43%!!5G'58a&!3!"+%C*6%8"!!%
-T4NP-43%!!5T'58a&!3!"+dC*6%8"!!%X4NP-43%!!5e'58a&!3!",NC*6%8"!!%
-[4NP-43%!!CP'58a&!3!"-%G599!!!!!!!!!!(39`Df0c0`!!!!C'58a&!3!"-NC
-*6%8"!!%c4NP-43%!!6&'58a&!3!"R%C*6%8"!!'D4NP-43%!!CY(8P93!!!!!!!
-!!"i%FQ&ZC!!!!!4'58a&!3!"0%C*6%8"!!%e4NP-43%!!6C'58a&!3!"TdG599!
-!!!!!!!!!(`0bBc)!!!!&4NP-43%!!6T'58a&!3!"1dC*6%8"!!%j4NP-43%!!6G
-'58a&!3!"1%G599!!!!!!!!!!)!0bBc3!!!!#4NP-43%!!6e'58a&!3!"2%G599!
-!!!!!!!!!)30bBc8!!!!&4NP-43%!!8*'58a&!3!"3%C*6%8"!!&"4NP-43%!!6j
-'58a&!3!"2dG599!!!!!!!!!!)JCbDA"PE@3!!!!#4NP-43%!!80'58a&!3!"4%G
-599!!!!!!!!!!)`0bFf%!!!!-4NP-43%!!89'58a&!3!"4dC*6%8"!!&)4NP-43%
-!!8e'58a&!3!"6%C*6%8"!!&'4NP-43%!!8Y'58a&!3!"6NC*6%8"!!&*4NP-43%
-!!8T'58a&!3!"R8C*6%8"!!'H4e*98!!!!!!!!!!N!h0SB3!!!!4'58a&!3!"88C
-*6%8"!!&24NP-43%!!9*'58a&!3!"8%G599!!!!!!!!!!*39cG'&MD`!!!!&'58a
-&!3!"8dG599!!!!!!!!!!*JCdH(4IC')!!!!"4NP-43%!!94(8P93!!!!!!!!!#F
-%H$8`13!!!"9'58a&!3!"A%C*6%8"!!&E4NP-43%!!@&'58a&!3!"@NC*6%8"!!&
-J4NP-43%!!@*'58a&!3!"JdC*6%8"!!&Q4NP-43%!!@0'58a&!3!"@%C*6%8"!!&
-G4NP-43%!!9G'58a&!3!"C8C*6%8"!!&H4NP-43%!!9P'58a&!3!"AdC*6%8"!!&
-R4NP-43%!!@4'58a&!3!"K%C*6%8"!!&94NP-43%!!9C(8P93!!!!!!!!!#J'H$8
-`1ABc!!!!&8C*6%8"!!&V4NP-43%!!@a'58a&!3!"E8C*6%8"!!&a4NP-43%!!A0
-'58a&!3!"G8C*6%8"!!&h4NP-43%!!AT'58a&!3!"D%C*6%8"!!&b4NP-43%!!@T
-'58a&!3!"H%C*6%8"!!&T4NP-43%!!AC'58a&!3!"G%C*6%8"!!&`4NP-43%!!AP
-'58a&!3!"ENC*6%8"!!&[4NP-43%!!B9'58a&!3!"KNG599!!!!!!!!!!+30cFf`
-!!!!M4NP-43%!!"0'58a&!3!!&8C*6%8"!!!34NP-43%!!"*'58a&!3!!%8C*6%8
-"!!!84NP-43%!!"T'58a&!3!!(%C*6%8"!!!A4NP-43%!!"P'58a&!3!!'%C*6%8
-"!!!E4NP-43%!!"C'58a&!3!!$8C*6%8"!!!24NP-43%!!!Y'58a&!3!!$%C*6%8
-"!!!14NP-43%!!#Y'58a&!3!!,%C*6%8"!!!S4NP-43%!!#T'58a&!3!!+8C*6%8
-"!!!M4NP-43%!!#*'58a&!3!!(dC*6%8"!!!P4NP-43%!!#"'58a&!3!!*NC*6%8
-"!!!N4NP-43%!!"j'58a&!3!!*dC*6%8"!!!G4NP-43%!!!T'58a&!3!!)8G599!
-!!!!!!!!!+Jj(990*)%aTBR*KFQPPF`!!!!0'58a&!J!!,dG599!!!!!!!!!!+`0
-38%-!!!!$4NP-43)!!$"'58a&!J!!-8C*6%8#!!!b4e*98!!!!!!!!!!X!cBiD`!
-!!!0'58a&"3!!&%C*6%8&!!!94NP-438!!"C(8P93!!!!!!!!!#d138j655"-D@*
-bBA*TCA-!!!!#4e*98!!!!!!!!!!Z!e"33`!!!!*'58a&!3!!!8C*6%8"!!&r4e*
-98!!!!!!!!!![!cBiD`!!!!*'58a&!`!"S%C*6%8$!!'K4e*98!!!!!!!!!!`$8e
-KBb"-D@*bBA*TCA-!!!!#4e*98!!!!!!!!!!a!e"33`!!!!P'58a&!3!!"%C*6%8
-"!!!#4NP-43%!!!0'58a&!3!!#8C*6%8"!!!)4NP-43%!!!G'58a&!3!!"NC*6%8
-"!!!&4NP-43%!!D9(8P93!!!!!!!!!$)$0MKV!!!!"NC*6%8$!!'D4NP-43-!!D*
-'58a&!`!"R%C*6%8$!!'G4NP-43-!!Cp'58a&!`!"Q`!!!!!!!!!!!!!!Y,T3!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)!3!"!!!!!3%"!!!"!3%!!!!
+!!!%"!!!"!3!"!!!""!!!!!!!!!!!!!!)!3!"!3!"!3!!!!%!!!N!!aY-D@*$FRP
+`G'mZ0MKV)%CK+$4TAcKN+5j-D@)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!r2cmr2cmr2`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$mr2cm!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!0!!%!!!!!!"9I69G&8NY6AdG98dPIF(*PCQPi,QJ!!!!!!!!
+!!!!!!!!"!!!!!!!!!!!"!!!!!!!!!!!!!!8"!3%!!!%"!!%!!!!!"!!!!!!!!!!
+!!!!!!!!!!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"IAh0
+dBA*d!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!!3!!#8ePFQGP)%peG!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!$mr2cp"8&"-!!%"!!!%)#!J)!1ARe!$GYpi!`@Z%!!&!J%!!3%!!3%"!!!
+"!!!!!!!!!!%"!3%!!3%!!3!""!!!!!!!!!!!!!!(!3%!!3!!!3!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!#"J%#!!!c"`%#!!!d!!!!!J3""3!!)!J""3!!(`!!!HF
-!!!)!!!!6e`!!&!!!!!(R!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$*!!!!i!!!&0i
-!!"J!!!!!b3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!!!!H!"!!!"!!!!!!!!!!!
-!"!!"!!!"k,6I$a6rrqXL!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!"IAh0dBA*d!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!8!!!G2F'9Z8e0-!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!2cmr2d&38%`!!!3!!!!%!!!!!%!!!&M!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%r2cm
+r!!!!!!!!!!)!!!!#!!)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!#!&!!!3!"!!%!!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!8*d024%8R)#G%394"*b!
+R8%P$9#F!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!#!!!!3!!!#d#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!!)!!!!
+Z!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!!$!!!!,`)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!"!!!!$!#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!J!!!8!!!!a!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!)!!!'!!!!-J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!#!!!"`!!!$-#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!!J!!!!
+d!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!!*!!!!03)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!#J!!!$B#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!J!!!X!!!!h!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!)!!!-!!!!1!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!#!!!$3!!!$N#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!!i!!!!
+k!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!!2!!!!1`)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!%!!!!$`#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!J!!"%!!!!p!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!)!!!5!!!!2J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!#!!!%`!!!$m#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!"3!!!"
+!!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!!9!!!!33)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!&J!!!%)#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!J!!"F!!!"$!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!)!!!B!!!!4!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!#!!!'3!!!%8#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!"S!!!"
+'!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!!E!!!!4`)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!(!!!!%J#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!J!!"d!!!"*!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!)!!!H!!!!5J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!#!!!(`!!!%X#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!#!!!!"
+-!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!!K!!!!63)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!)J!!!%i#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!J!!#-!!!"2!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!)!!!N!!!!8!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!#!!!*3!!!&%#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!#B!!!"
+5!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!!R!!!!8`)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!+!!!!&3#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!J!!#N!!!"9!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!)!!!U!!!!9J)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!#!!!+`!!!&F#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!#`!!!"
+B!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!!Y!!!!@3)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!,J!!!&S#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!J!!#m!!!"E!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!)!!!`!!!!A!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!#!!!-3!!!&d#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!$)!!!"
+H!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!!c!!!!A`)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!0!!!!'!#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!J!!$8!!!"K!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!)!!!f!!!!BJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!#!!!0`!!!'-#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!$J!!!"
+N!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!!j!!!!C3)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!1J!!!'B#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!J!!$X!!!"R!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!)!!!m!!!!D!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!#!!!23!!!'N#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!$i!!!"
+U!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!!r!!!!D`)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!3!!!!'`#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!J!!%%!!!"Y!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!)!!"#!!!!EJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!#!!!3`!!!'m#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!%3!!!"
+`!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!"&!!!!F3)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!4J!!!()#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!J!!%F!!!"c!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!)!!")!!!!G!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!#!!!53!!!(8#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!%S!!!"
+f!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!",!!!!G`)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!6!!!!(J#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!J!!%d!!!"j!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!)!!"1!!!!HJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!#!!!6`!!!(X#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!&!!!!"
+m!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!"4!!!!I3)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!8J!!!(i#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!J!!&-!!!"r!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!)!!"8!!!!J!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!#!!!93!!!)%#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!&B!!!#
+#!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!"A!!!!J`)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!@!!!!)3#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!J!!&N!!!#&!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!)!!"D!!!!KJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!#!!!@`!!!)F#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!&`!!!#
+)!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!"G!!!!L3)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!AJ!!!)S#!3!!!!!!!3!"!3!!!!!
+!!!!!!!!!!!%!!!!!!!!!!!J!!&m!!!#,!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
+"!!!!!!!!!!!)!!"J!!!!M!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
+!#!!!B3!!!)d#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!')!!!#
+1!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!"M!!!!M`)"!!!!!!!
+"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!C!!!!*!!!J%!!!!!!!%!!3%!!!!
+!!!!!!!!!!!!"!!!!!!!!!!!)!!"P!!!!N3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!
+!!3!!!!!!!!!!#!!!CJ!!!*)#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!
+!!!J!!'F!!!#6!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!"S!!!
+!P!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!D3!!!*8#!3!!!!!
+!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!'S!!!#@!J%!!!!!!!%!!3%!!!!
+!!!!!!!!!!!!"!!!!!!!!!!!)!!"V!!!!P`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!
+!!3!!!!!!!!!!#!!!E!!!!*J#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!
+!!!J!!'d!!!#C!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!"Z!!!
+!QJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!E`!!!*X#!3!!!!!
+!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!(!!!!#F!J%!!!!!!!%!!3%!!!!
+!!!!!!!!!!!!"!!!!!!!!!!!)!!"a!!!!R3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!
+!!3!!!!!!!!!!#!!!FJ!!!*i#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!
+!!!J!!(-!!!#I!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!"d!!!
+!S!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!G3!!!+%#!3!!!!!
+!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!(B!!!#L!J%!!!!!!!%!!3%!!!!
+!!!!!!!!!!!!"!!!!!!!!!!!)!!"h!!!!S`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!
+!!3!!!!!!!!!!#!!!H!!!!+3#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!
+!!!J!!(N!!!#P!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!"k!!!
+!TJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!H`!!!+F#!3!!!!!
+!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!(`!!!#S!J%!!!!!!!%!!3%!!!!
+!!!!!!!!!!!!"!!!!!!!!!!!)!!"p!!!!U3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!
+!!3!!!!!!!!!!#!!!IJ!!!+S#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!
+!!!J!!(m!!!#V!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!#!!!!
+!V!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!J3!!!+d#!3!!!!!
+!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!))!!!#Z!J%!!!!!!!%!!3%!!!!
+!!!!!!!!!!!!"!!!!!!!!!!!)!!#$!!!!V`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!
+!!3!!!!!!!!!!#!!!K!!!!,!#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!
+!!!J!!)8!!!#a!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!#'!!!
+!XJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!K`!!!,-#!3!!!!!
+!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!)J!!!#d!J%!!!!!!!%!!3%!!!!
+!!!!!!!!!!!!"!!!!!!!!!!!)!!#*!!!!Y3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!
+!!3!!!!!!!!!!#!!!LJ!!!,B#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!
+!!!J!!)X!!!#h!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!#-!!!
+!Z!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!M3!!!,N#!3!!!!!
+!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!)i!!!#k!J%!!!!!!!%!!3%!!!!
+!!!!!!!!!!!!"!!!!!!!!!!!)!!#2!!!!Z`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!
+!!3!!!!!!!!!!#!!!N!!!!!#m!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!#4!!!![3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!NJ!
+!!,i#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!*-!!!#r!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!#8!!!!`!)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!!P3!!!-%#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!*B!!!$#!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!#A!!!!``)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!Q!!
+!!-3#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!*N!!!$&!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!#D!!!!aJ)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!!Q`!!!-F#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!*`!!!$)!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!#G!!!!b3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!RJ!
+!!-S#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!*m!!!$,!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!#J!!!!c!)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!!S3!!!-d#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!+)!!!$1!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!#M!!!!c`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!T!!
+!!0!#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!+8!!!$4!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!#Q!!!!dJ)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!!T`!!!0-#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!+J!!!$8!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!#T!!!!e3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!UJ!
+!!0B#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!+X!!!$A!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!#X!!!!f!)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!!V3!!!0N#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!+i!!!$D!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!#[!!!!f`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!X!!
+!!0`#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!,%!!!$G!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!#b!!!!hJ)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!!X`!!!0m#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!,3!!!$J!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!#e!!!!i3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!YJ!
+!!1)#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!,F!!!$M!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!#i!!!!j!)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!!Z3!!!18#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!,S!!!$Q!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!#l!!!!j`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!![!!
+!!1J#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!,d!!!$T!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!#q!!!!kJ)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!![`!!!1X#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!-!!!!$X!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!$"!!!!l3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!`J!
+!!1i#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!--!!!$[!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!$%!!!!m!)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!!a3!!!2%#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!-B!!!$b!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!$(!!!!m`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!b!!
+!!23#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!-N!!!$e!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!$+!!!!pJ)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!!b`!!!2F#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!-`!!!$i!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!$0!!!!q3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!cJ!
+!!2S#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!-m!!!$l!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!$3!!!!r!)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!!d3!!!2d#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!0)!!!$q!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!$6!!!!r`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!e!!
+!!3!#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!08!!!%"!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!$@!!!"!J)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!!e`!!!3-#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!0J!!!%%!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!$C!!!""3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!fJ!
+!!3B#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!0X!!!%(!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!$F!!!"#!)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!!h3!!!3N#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!0i!!!%+!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!$I!!!"#`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!i!!
+!!3`#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!1%!!!%0!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!$L!!!"$J)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!!i`!!!3m#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!13!!!%3!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!$P!!!"%3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!jJ!
+!!4)#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!1F!!!%6!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!$S!!!"&!)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!!k3!!!48#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!1S!!!%@!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!$V!!!"&`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!l!!
+!!4J#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!1d!!!%C!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!$Z!!!"'J)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!!l`!!!4X#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!2!!!!%F!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!$a!!!"(3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!mJ!
+!!4i#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!2-!!!%I!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!$d!!!")!)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!!p3!!!5%#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!2B!!!%L!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!$h!!!")`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!q!!
+!!53#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!2N!!!%P!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!$k!!!"*J)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!!q`!!!5F#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!2`!!!%S!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!$p!!!"+3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!!rJ!
+!!5S#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!2m!!!%V!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!%!!!!",!)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!"!3!!!5d#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!3)!!!%Z!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!%$!!!",`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!""!!
+!!6!#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!38!!!%a!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!%'!!!"-J)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!""`!!!6-#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!3J!!!%d!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!%*!!!"03)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!"#J!
+!!6B#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!3X!!!%h!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!%-!!!"1!)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!"$3!!!6N#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!3i!!!%k!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!%2!!!"1`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!"%!!
+!!6`#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!4%!!!%p!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!%5!!!"2J)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!"%`!!!6m#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!43!!!&!!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!%9!!!"33)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!"&J!
+!!8)#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!4F!!!&$!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!%B!!!"4!)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!"'3!!!88#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!4S!!!&'!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!%E!!!"4`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!"(!!
+!!8J#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!4d!!!&*!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!%H!!!"5J)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!"(`!!!8X#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!5!!!!&-!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!%K!!!"63)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!")J!
+!!8i#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!5-!!!&2!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!%N!!!"8!)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!"*3!!!9%#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!5B!!!&5!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!%R!!!"8`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!"+!!
+!!93#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!5N!!!&9!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!%U!!!"9J)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!"+`!!!9F#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!5`!!!&B!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!%Y!!!"@3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!",J!
+!!9S#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!5m!!!&E!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!%`!!!"A!)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!"-3!!!9d#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!6)!!!&H!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!%c!!!"A`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!"0!!
+!!@!#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!68!!!&K!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!%f!!!"BJ)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!"0`!!!@-#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!6J!!!&N!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!%j!!!"C3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!"1J!
+!!@B#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!6X!!!&R!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!%m!!!"D!)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!"23!!!@N#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!6i!!!&U!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!%r!!!"D`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!"3!!
+!!@`#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!8%!!!&Y!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!&#!!!"EJ)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!"3`!!!@m#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!83!!!&`!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!&&!!!"F3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!"4J!
+!!A)#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!8F!!!&c!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!&)!!!"G!)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!"53!!!A8#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!8S!!!&f!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!&,!!!"G`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!"6!!
+!!AJ#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!8d!!!&j!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!&1!!!"HJ)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!"6`!!!AX#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!9!!!!&m!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!&4!!!"I3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!"8J!
+!!Ai#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!9-!!!'!!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!&8!!!"J3)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!"93!!!B)#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!9B!!!'$!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!&A!!!"K!)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!"@!!
+!!B8#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!9N!!!''!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!&D!!!"K`)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!"@`!!!BJ#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!9`!!!'*!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!&G!!!"LJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!"AJ!
+!!BX#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!9m!!!'-!J%!!!!
+!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!&J!!!"M3)"!!!!!!!"!!%"!!!
+!!!!!!!!!!!!!!3!!!!!!!!!!#!!"B3!!!Bi#!3!!!!!!!3!"!3!!!!!!!!!!!!!
+!!!%!!!!!!!!!!!J!!@)!!!'2!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!
+!!!!)!!&M!!!"N!!#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!@3
+!!!'4!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!&P!!!"NJ)"!!!
+!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!"CJ!!!C-#!3!!!!!!!3!"!3!
+!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!@F!!!'8!J%!!!!!!!%!!3%!!!!!!!!!!!!
+!!!!"!!!!!!!!!!!)!!&S!!!"P3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!
+!!!!!#!!"D3!!!CB#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!@S
+!!!'A!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!&V!!!"Q!)"!!!
+!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!"E!!!!CN#!3!!!!!!!3!"!3!
+!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!@d!!!'D!J%!!!!!!!%!!3%!!!!!!!!!!!!
+!!!!"!!!!!!!!!!!)!!&Z!!!"Q`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!
+!!!!!#!!"E`!!!C`#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!A!
+!!!'G!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!)!!&a!!!"RJ)"!!!
+!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!#!!"FJ!!!Cm#!3!!!!!!!3!"!3!
+!!!!!!!!!!!!!!!%!!!!!!!!!!!J!!A-!!!'N!J%!!!!!!!%!!3%!!!!!!!!!!!!
+!!!!"!!!!!!!!!!!)!!&d!!!"TJ)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!
+!!!!!#!!"G3!!!DF#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!%!!!!#!!!!!`!!!!3!!!!&!!!!"J!!!!F!!!!)!!!!#3!!!!S
+!!!!,!!!!$!!!!!d!!!!1!!!!$`!!!"!!!!!4!!!!%J!!!"-!!!!8!!!!&3!!!"B
+!!!!A!!!!'!!!!"N!!!!D!!!!'`!!!"`!!!!G!!!!(J!!!"m!!!!J!!!!)3!!!#)
+!!!!M!!!!*!!!!#8!!!!Q!!!!*`!!!#J!!!!T!!!!+J!!!#X!!!!X!!!!,3!!!#i
+!!!![!!!!-!!!!$%!!!!b!!!!-`!!!$3!!!!e!!!!0J!!!$F!!!!i!!!!13!!!$S
+!!!!l!!!!2!!!!$d!!!!q!!!!2`!!!%!!!!""!!!!3J!!!%-!!!"%!!!!43!!!%B
+!!!"(!!!!5!!!!%N!!!"+!!!!5`!!!%`!!!"0!!!!6J!!!%m!!!"3!!!!83!!!&)
+!!!"6!!!!9!!!!&8!!!"@!!!!9`!!!&J!!!"C!!!!@J!!!&X!!!"F!!!!A3!!!&i
+!!!"I!!!!B!!!!'%!!!"L!!!!B`!!!'3!!!"P!!!!CJ!!!'F!!!"S!!!!D3!!!'S
+!!!"V!!!!E!!!!'d!!!"Z!!!!E`!!!(!!!!"a!!!!FJ!!!(-!!!"d!!!!G3!!!(B
+!!!"h!!!!H!!!!(N!!!"k!!!!H`!!!(`!!!"p!!!!IJ!!!(m!!!#!!!!!J3!!!))
+!!!#$!!!!K!!!!)8!!!#'!!!!K`!!!)J!!!#*!!!!LJ!!!)X!!!#-!!!!M3!!!)i
+!!!#2!!!!N!!!!!#4!!!!NJ!!!*-!!!#8!!!!P3!!!*B!!!#A!!!!Q!!!!*N!!!#
+D!!!!Q`!!!*`!!!#G!!!!RJ!!!*m!!!#J!!!!S3!!!+)!!!#M!!!!T!!!!+8!!!#
+Q!!!!T`!!!+J!!!#T!!!!UJ!!!+X!!!#X!!!!V3!!!+i!!!#[!!!!X!!!!,%!!!#
+b!!!!X`!!!,3!!!#e!!!!YJ!!!,F!!!#i!!!!Z3!!!,S!!!#l!!!![!!!!,d!!!#
+q!!!![`!!!-!!!!$"!!!!`J!!!--!!!$%!!!!a3!!!-B!!!$(!!!!b!!!!-N!!!$
++!!!!b`!!!-`!!!$0!!!!cJ!!!-m!!!$3!!!!d3!!!0)!!!$6!!!!e!!!!08!!!$
+@!!!!e`!!!0J!!!$C!!!!fJ!!!0X!!!$F!!!!h3!!!0i!!!$I!!!!i!!!!1%!!!$
+L!!!!i`!!!13!!!$P!!!!jJ!!!1F!!!$S!!!!k3!!!1S!!!$V!!!!l!!!!1d!!!$
+Z!!!!l`!!!2!!!!$a!!!!mJ!!!2-!!!$d!!!!p3!!!2B!!!$h!!!!q!!!!2N!!!$
+k!!!!q`!!!2`!!!$p!!!!rJ!!!2m!!!%!!!!"!3!!!3)!!!%$!!!""!!!!38!!!%
+'!!!""`!!!3J!!!%*!!!"#J!!!3X!!!%-!!!"$3!!!3i!!!%2!!!"%!!!!4%!!!%
+5!!!"%`!!!43!!!%9!!!"&J!!!4F!!!%B!!!"'3!!!4S!!!%E!!!"(!!!!4d!!!%
+H!!!"(`!!!5!!!!%K!!!")J!!!5-!!!%N!!!"*3!!!5B!!!%R!!!"+!!!!5N!!!%
+U!!!"+`!!!5`!!!%Y!!!",J!!!5m!!!%`!!!"-3!!!6)!!!%c!!!"0!!!!68!!!%
+f!!!"0`!!!6J!!!%j!!!"1J!!!6X!!!%m!!!"23!!!6i!!!%r!!!"3!!!!8%!!!&
+#!!!"3`!!!83!!!&&!!!"4J!!!8F!!!&)!!!"53!!!8S!!!&,!!!"6!!!!8d!!!&
+1!!!"6`!!!9!!!!&4!!!"8J!!!9-!!!&8!!!"93!!!9B!!!&A!!!"@!!!!9N!!!&
+D!!!"@`!!!9`!!!&G!!!"AJ!!!9m!!!&J!!!"B3!!!@)!!!&M!!!"C!!!!@8!!!&
+Q!!!"C`!!!@J!!!&T!!!"DJ!!!@X!!!&X!!!"E3!!!@i!!!&[!!!"F!!!!A%!!!&
+b!!!"F`!!!A3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!A8!!!'!#!!!!!J!!A8!!!(E!!%!(!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!J!!!%)!!!##!!!!`J!!!3)!!!&#!!!"JJ!!!F)!!!)#!!!#3J!!!S)!!!
+,#!!!$!J!!!d)!!!1#!!!$`J!!"!)!!!4#!!!%JJ!!"-)!!!8#!!!&3J!!"B)!!!
+A#!!!'!J!!"N)!!!D#!!!'`J!!"`)!!!G#!!!(JJ!!"m)!!!J#!!!)3J!!#))!!!
+M#!!!*!J!!#8)!!!Q#!!!*`J!!#J)!!!T#!!!+JJ!!#X)!!!X#!!!,3J!!#i)!!!
+[#!!!-!J!!$%)!!!b#!!!-`J!!$3)!!!e#!!!0JJ!!$F)!!!i#!!!13J!!$S)!!!
+l#!!!2!J!!$d)!!!q#!!!2`J!!%!)!!""#!!!3JJ!!%-)!!"%#!!!43J!!%B)!!"
+(#!!!5!J!!%N)!!"+#!!!5`J!!%`)!!"0#!!!6JJ!!%m)!!"3#!!!83J!!&))!!"
+6#!!!9!J!!&8)!!"@#!!!9`J!!&J)!!"C#!!!@JJ!!&X)!!"F#!!!A3J!!&i)!!"
+I#!!!B!J!!'%)!!"L#!!"G!J!!'-)!!"N#!!!C3J!!'B)!!"R#!!!D!J!!'N)!!"
+U#!!!D`J!!'`)!!"Y#!!!EJJ!!'m)!!"`#!!!F3J!!())!!"c#!!!G!J!!(8)!!"
+f#!!!G`J!!(J)!!"j#!!!HJJ!!(X)!!"m#!!!I3J!!(i)!!"r#!!!J!J!!)%)!!#
+##!!!J`J!!)3)!!#&#!!!KJJ!!)F)!!#)#!!!L3J!!)S)!!#,#!!!M!J!!)d)!!#
+1#!!!M`J!!*!!#!!!N3J!!*))!!#6#!!!P!J!!*8)!!#@#!!!P`J!!*J)!!#C#!!
+!QJJ!!*X)!!#F#!!!R3J!!*i)!!#I#!!!S!J!!+%)!!#L#!!!S`J!!+3)!!#P#!!
+!TJJ!!+F)!!#S#!!!U3J!!+S)!!#V#!!!V!J!!+d)!!#Z#!!!V`J!!,!)!!#a#!!
+!XJJ!!,-)!!#d#!!!Y3J!!,B)!!#h#!!!Z!J!!,N)!!#k#!!!Z`J!!,`)!!#p#!!
+![JJ!!,m)!!$!#!!!`3J!!-))!!$$#!!!a!J!!-8)!!$'#!!!a`J!!-J)!!$*#!!
+!bJJ!!-X)!!$-#!!!c3J!!-i)!!$2#!!!d!J!!0%)!!$5#!!!d`J!!03)!!$9#!!
+!eJJ!!0F)!!$B#!!!f3J!!0S)!!$E#!!!h!J!!0d)!!$H#!!!h`J!!1!)!!$K#!!
+!iJJ!!1-)!!$N#!!!j3J!!1B)!!$R#!!!k!J!!1N)!!$U#!!!k`J!!1`)!!$Y#!!
+!lJJ!!1m)!!$`#!!!m3J!!2))!!$c#!!!p!J!!28)!!$f#!!!p`J!!2J)!!$j#!!
+!qJJ!!2X)!!$m#!!!r3J!!2i)!!$r#!!"!!J!!3%)!!%##!!"!`J!!33)!!%&#!!
+""JJ!!3F)!!%)#!!"#3J!!3S)!!&e#!!"#`J!!3`)!!%0#!!"$JJ!!3m)!!%3#!!
+"%3J!!4))!!%6#!!"&!J!!48)!!%@#!!"&`J!!4J)!!%C#!!"'JJ!!4X)!!%F#!!
+"(3J!!4i)!!%I#!!")!J!!5%)!!%L#!!")`J!!53)!!%P#!!"*JJ!!5F)!!%S#!!
+"+3J!!5S)!!%V#!!",!J!!5d)!!%Z#!!",`J!!6!)!!%a#!!"-JJ!!6-)!!%d#!!
+"03J!!6B)!!%h#!!"1!J!!6N)!!%k#!!"1`J!!6`)!!%p#!!"2JJ!!6m)!!&!#!!
+"33J!!8))!!&$#!!"4!J!!88)!!&'#!!"4`J!!8J)!!&*#!!"5JJ!!8X)!!&-#!!
+"63J!!8i)!!&2#!!"8!J!!9%)!!&5#!!"8`J!!93)!!&9#!!"9JJ!!9F)!!&B#!!
+"@3J!!9S)!!&E#!!"A!J!!9d)!!&H#!!"A`J!!@!)!!&K#!!"BJJ!!@-)!!&N#!!
+"C3J!!@B)!!&R#!!"D!J!!@N)!!&U#!!"D`J!!@`)!!&Y#!!"EJJ!!@m)!!&`#!!
+"F3J!!A))!!&c!!!!#!!!!H%"!!!"!!!!!!!!!!!!"!!"!!!"kE6H0L[rrmA@!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -4670,9 +4462,9 @@ KBb"-D@*bBA*TCA-!!!!#4e*98!!!!!!!!!!a!e"33`!!!!P'58a&!3!!"%C*6%8
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"i3)!!!%
-!!!!!!!!!!!!%!!%!!!(dY0m2*3!!DlF!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"iJ)!!!%!!!!!!!!!!!!%!!%!!!(eY0i
+f,!!!IZ)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -4682,7 +4474,8 @@ KBb"-D@*bBA*TCA-!!!!#4e*98!!!!!!!!!!a!e"33`!!!!P'58a&!3!!"%C*6%8
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!(L!`!!!3!!!!!!!!!!!!3!!3!!!I@dh`m8!!!`R3!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(M!`!!!3!!!!!!!!!!!!3
+!!3!!!IDdhMBX!!!f%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -4692,8 +4485,9 @@ KBb"-D@*bBA*TCA-!!!!#4e*98!!!!!!!!!!a!e"33`!!!!P'58a&!3!!"%C*6%8
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!H3%!!!"!!!
+!!!!!!!!!"!!"!!!"r,6H0L`!!&C*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!H-%!!!"!!!!!!!!!!!!"!!"!!!"ql6I$a6rrjeI!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -4703,8 +4497,8 @@ KBb"-D@*bBA*TCA-!!!!#4e*98!!!!!!!!!!a!e"33`!!!!P'58a&!3!!"%C*6%8
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+"j38!!!%!!!!!!!!!!!!%!!%!!!(pY0if,2rrp2N!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!"j!8!!!%!!!!!!!!!!!!%!!%!!!(mY0m2*IrrcT!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -4714,9 +4508,8 @@ KBb"-D@*bBA*TCA-!!!!#4e*98!!!!!!!!!!a!e"33`!!!!P'58a&!3!!"%C*6%8
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!(Q"J!!!3!!!!!!!!!!!!3!!3!!!G'dhMBX!!!Si3!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"j3B!!!%!!!!!!!!!!!!%!!%!!!(
-pY0m2&2rrVV8!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -4726,8 +4519,7 @@ pY0m2&2rrVV8!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(Q"`!!!3!!!!!!!!!
-!!!3!!3!!!Ikdh`m8rrrqpJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!HF(!!!"!!!!!!!!!!!!"!!"!!!"dV6H0L`!!!ca!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -4737,9 +4529,9 @@ pY0m2&2rrVV8!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!HF)!!!
-"!!!!!!!!!!!!"!!"!!!"rl6I$a6rrmj#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"k!J!!!%!!!!!!!!!!!!%!!%!!!(IY0i
+f,2rr[fi!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -4749,132 +4541,400 @@ pY0m2&2rrVV8!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!"+!!!'!"YFh4b!!!!!!!!!!!!!!!!!!!C+!!!#S"YFh4X!!!!!!!!!!!!!!!
-!!!!MU!!!!i"YFh4Z!!!!!!!!!!!!!!!!!!!R+!!!'!"YFh4b!!!$k!!!!!!!!!!
-!!!!r+!!!'B"YFh4X!!!$k!!!!!!!!!!!!!%0dJ!!#)"YFh4Z!!!$k!!!!!!!!!!
-!!!"E+!!!"4"`FQ9Q!!jqcJ!!!!%!!!!!!!"J1!!!!!K`FQ9Q!!i,hJ!!!!)!!!!
-!!!"J3!!!!"T`FQ9Q!!i*C!!!!!-!!!!!!!"J@J!!$+"`FQ9Q!!j"B3!!!!3!!!!
-!!!"XqJ!!"K4`FQ9Q!!kHI3!!!!8!!!!!!!"c$J!!#*C`FQ9Q!!j,f`!!!!B!!!!
-!!!"lT!!!!3G`FQ9Q!!ihQJ!!!!F!!!!!!!"mU`!!!b"`FQ9Q!!iT1`!!!!J!!!!
-!!!"rb`!!!"4`FQ9Q!!jZi!!!!!N!!!!!!!"rh`!!!!T`FQ9Q!!jf-!!!!!S!!!!
-!!!"rk3!!!!a`FQ9Q!!k$&3!!!!X!!!!!!!"rp3!!!!j`FQ9Q!!l6V!!!!!`!!!!
-!!!#!!`!!!3C`FQ9Q!!l9e3!!!!d!!!!!!!#"#3!!!$j`FQ9Q!!k(*3!!!!i!!!!
-!!!#"4`!!!!j`FQ9Q!!j"33!!!!m!!!!!!!#"93!!!GT`FQ9Q!!jMQ`!!!"!!!!!
-!!!#$,`!!!'*`FQ9Q!!iIT3!!!"%!!!!!!!#$N3!!!"4`FQ9Q!!i)0`!!!")!!!!
-!!!#$T3!!!!T`FQ9Q!!k[Z3!!!"-!!!!!!!#$V`!!!!a`FQ9Q!!kCE!!!!"3!!!!
-!!!#$Z`!!!-T`FQ9Q!!jHY`!!!"8!!!!!!!#%K3!!!4K`FQ9Q!!kSh!!!!"B!!!!
-!!!#&R3!!!+K`FQ9Q!!j(T3!!!"F!!!!!!!#'43!!!#j`FQ9Q!!i#aJ!!!"J!!!!
-!!!#'F`!!!Ja`FQ9Q!!lpS`!!!"N!!!!!!!#)I`!!4J"YG("X!!!!!3!!!!!!!!!
-!!!$1I`!!"`"YG("c!!!!!3!!!!!!!!!!!!$9I`!!!""YG("T!!!!!3!!!!!!!!!
-!!!$9M`!!"TaYG'a[!!!!!3!!!!!!!!!!!!$F+`!!!#"YG(0X!!!!!3!!!!!!!!!
-!!!$F5`!!"4"`FQ9Q!!klZ`!!!"S!!!!!!!$K@`!!!!K`FQ9Q!!lq$`!!!"X!!!!
-!!!$KB`!!!"T`FQ9Q!!lTR!!!!"`!!!!!!!$KI3!!%0"`FQ9Q!!jkK!!!!"d!!!!
-!!!$b63!!"K4`FQ9Q!!lQ%3!!!"i!!!!!!!$iB3!!#*C`FQ9Q!!l4QJ!!!"m!!!!
-!!!%!p`!!!3G`FQ9Q!!l9lJ!!!#!!!!!!!!%"rJ!!!b"`FQ9Q!!i2K!!!!#%!!!!
-!!!%&(J!!!"4`FQ9Q!!kki3!!!#)!!!!!!!%&-J!!!!T`FQ9Q!!lUEJ!!!#-!!!!
-!!!%&2!!!!!a`FQ9Q!!l+`J!!!#3!!!!!!!%&5!!!!!j`FQ9Q!!j@3J!!!#8!!!!
-!!!%&9J!!!3C`FQ9Q!!kR#`!!!#B!!!!!!!%'A!!!!$j`FQ9Q!!i993!!!#F!!!!
-!!!%'QJ!!!!j`FQ9Q!!km6J!!!#J!!!!!!!%'U!!!!GT`FQ9Q!!kq6J!!!#N!!!!
-!!!%)JJ!!!'*`FQ9Q!!lXDJ!!!#S!!!!!!!%)j!!!!"4`FQ9Q!!lEH!!!!#X!!!!
-!!!%)q!!!!!T`FQ9Q!!i6c`!!!#`!!!!!!!%*!J!!!!a`FQ9Q!!iSA!!!!#d!!!!
-!!!%*$J!!!-T`FQ9Q!!i15!!!!#i!!!!!!!%*f!!!!4K`FQ9Q!!i#2!!!!#m!!!!
-!!!%+m!!!!+K`FQ9Q!!l,'3!!!$!!!!!!!!%,Q!!!!#j`FQ9Q!!l[K3!!!$%!!!!
-!!!%,aJ!!!Ja`FQ9Q!!kqX!!!!$)!!!!!!!0#I!!!#J"YG("X!!!!!J!!!!!!!!!
-!!!"BU!!!!3"YG("c!!!!!J!!!!!!!!!!!!"CU!!!!""YG("T!!!!!J!!!!!!!!!
-!!!%BiJ!!!0"YG'a[!!!!!J!!!!!!!!!!!!%CXJ!!!#"YG(0X!!!!!J!!!!!!!!!
-!!!%CdJ!!"4"`FQ9Q!!lk53!!!$-!!!!!!!%HiJ!!!!K`FQ9Q!!ibfJ!!!$3!!!!
-!!!%HkJ!!!"T`FQ9Q!!j($3!!!$8!!!!!!!%I"!!!$+"`FQ9Q!!ipM3!!!$B!!!!
-!!!%VT!!!"K4`FQ9Q!!kR*3!!!$F!!!!!!!%aZ!!!#5C`FQ9Q!!lqqJ!!!$J!!!!
-!!!%khJ!!!3G`FQ9Q!!j"k!!!!$N!!!!!!!%lj3!!!b"`FQ9Q!!jU8`!!!$S!!!!
-!!!%r"3!!!"4`FQ9Q!!m!0!!!!$X!!!!!!!%r'3!!!!T`FQ9Q!!kBq3!!!$`!!!!
-!!!%r)`!!!!a`FQ9Q!!ia@3!!!$d!!!!!!!%r,`!!!!j`FQ9Q!!kDRJ!!!$i!!!!
-!!!%r23!!!3C`FQ9Q!!i"i`!!!$m!!!!!!!&!3`!!!$j`FQ9Q!!ja`3!!!%!!!!!
-!!!&!J3!!!!j`FQ9Q!!lI4!!!!%%!!!!!!!&!M`!!!GT`FQ9Q!!j[I`!!!%)!!!!
-!!!&#D3!!!'*`FQ9Q!!iXV!!!!%-!!!!!!!&#b`!!!"4`FQ9Q!!i&T`!!!%3!!!!
-!!!&#h`!!!!T`FQ9Q!!lfMJ!!!%8!!!!!!!&#k3!!!!a`FQ9Q!!km-!!!!%B!!!!
-!!!&#p3!!!-T`FQ9Q!!k+c3!!!%F!!!!!!!&$[`!!!4K`FQ9Q!!jBk`!!!%J!!!!
-!!!&%e`!!!+K`FQ9Q!!i30J!!!%N!!!!!!!&&I`!!!#j`FQ9Q!!kMJ3!!!%S!!!!
-!!!&&V3!!!Ja`FQ9Q!!jc,3!!!%X!!!!!!!&(Z3!!4J"YG("X!!!!!`!!!!!!!!!
-!!!'0Z3!!"`"YG("c!!!!!`!!!!!!!!!!!!'8Z3!!!""YG("T!!!!!`!!!!!!!!!
-!!!'8b3!!!#"YG(0X!!!!!`!!!!!!!!!!!!'8k3!!"T!!EA4XE`!!!!-!!!!!!!!
-!!!!"QhN!!!83F(*PCJ!1L,S!!!"-!!!!!!!"S)N!!!!)F(*PCJ!1iN8!!!"0!!!
-!!!!"S*%!!!!DF(*PCJ!1d&S!!!"1!!!!!!!"S+X!!"$3F(*PCJ!1Rh-!!!"2!!!
-!!!!"XAX!!!B8F(*PCJ!1P(-!!!"3!!!!!!!"Yim!!!NQF(*PCJ!1LkB!!!"4!!!
-!!!!"`,8!!!%(F(*PCJ!1VAF!!!"5!!!!!!!"`E`!!!-JF(*PCJ!1ejm!!!"6!!!
-!!!!"a0`!!!!8F(*PCJ!1FbF!!!"8!!!!!!!"a2!!!!!+F(*PCJ!1@,m!!!"9!!!
-!!!!"a2S!!!!-F(*PCJ!1VG`!!!"@!!!!!!!"a3B!!!!1F(*PCJ!1@GJ!!!"A!!!
-!!!!"a43!!!%'F(*PCJ!1G1)!!!"B!!!!!!!"aKS!!!!qF(*PCJ!1CB`!!!"C!!!
-!!!!"aPJ!!!!1F(*PCJ!1*2X!!!"D!!!!!!!"aQB!!!(DF(*PCJ!19#X!!!"E!!!
-!!!!"b%!!!!"LF(*PCJ!1mb!!!!"F!!!!!!!"b+)!!!!8F(*PCJ!1m`8!!!"G!!!
-!!!!"b,B!!!!+F(*PCJ!1fHN!!!"H!!!!!!!"b-!!!!!-F(*PCJ!1$)-!!!"I!!!
-!!!!"b-`!!!$+F(*PCJ!1%CN!!!"J!!!!!!!"bCB!!!%BF(*PCJ!1Y5%!!!"K!!!
-!!!!"bUi!!!#SF(*PCJ!1$e8!!!"L!!!!!!!"beB!!!!ZF(*PCJ!1VXF!!!"M!!!
-!!!!"bi3!!!)-F(*PCJ!1YBi!!!"N!!!!!!!"cC!!!!!+!'edF'`!!!!%!!!!!!!
-!!!!!!GH3!!!!!3"YG("c!!!!"!!!!!!!!!!!!!(BN!!!!!!3EA4`D3!!!!3!!!!
-!!!!!!!!"f+!!!!!JEA4cE!!!!!3!!!!!!!!!!!!"f-!!!!#-EA4XE`!!!!3!!!!
-!!!!!!!!"f8`!!!83F(*PCJ!1C"3!!!"P!!!!!!!"hP`!!!!)F(*PCJ!1MEF!!!"
-Q!!!!!!!"hQ3!!!!DF(*PCJ!1SV`!!!"R!!!!!!!"hRi!!"$3F(*PCJ!1NlJ!!!"
-S!!!!!!!"ldi!!!B8F(*PCJ!1G1B!!!"T!!!!!!!"p@)!!!NQF(*PCJ!1lFS!!!"
-U!!!!!!!"rSJ!!!%(F(*PCJ!1ff%!!!"V!!!!!!!"rim!!!-JF(*PCJ!1r-N!!!"
-X!!!!!!!#!Um!!!!8F(*PCJ!1r(F!!!"Y!!!!!!!#!X-!!!!+F(*PCJ!1%0B!!!"
-Z!!!!!!!#!Xd!!!!-F(*PCJ!11!J!!!"[!!!!!!!#!YN!!!!1F(*PCJ!1Lh%!!!"
-`!!!!!!!#!ZF!!!%'F(*PCJ!1,BX!!!"a!!!!!!!#!qd!!!!qF(*PCJ!1KTd!!!"
-b!!!!!!!#"#X!!!!1F(*PCJ!1%am!!!"c!!!!!!!#"$N!!!(DF(*PCJ!1HE-!!!"
-d!!!!!!!#"K-!!!"LF(*PCJ!1idJ!!!"e!!!!!!!#"R8!!!!8F(*PCJ!1AA!!!!"
-f!!!!!!!#"SN!!!!+F(*PCJ!1j"8!!!"h!!!!!!!#"T-!!!!-F(*PCJ!1Qr-!!!"
-i!!!!!!!#"Tm!!!$+F(*PCJ!1a+%!!!"j!!!!!!!#"fN!!!%BF(*PCJ!1CMm!!!"
-k!!!!!!!##)%!!!#SF(*PCJ!1XB!!!!"l!!!!!!!##5N!!!!ZF(*PCJ!1mR8!!!"
-m!!!!!!!##9F!!!)-F(*PCJ!1Z,`!!!"p!!!!!!!##f-!!!8!EA4`E!!!!!8!!!!
-!!!!!!!!!@EJ!!!#!EA4`F`!!!!8!!!!!!!!!!!!!@MJ!!!!3EA4`D3!!!!8!!!!
-!!!!!!!!#%2-!!!!JEA4cE!!!!!8!!!!!!!!!!!!#%4-!!!#!EA4XE`!!!!8!!!!
-!!!!!!!!#%C-!!!83F(*PCJ!1a$B!!!"q!!!!!!!#&U-!!!!)F(*PCJ!1ppX!!!"
-r!!!!!!!#&UX!!!!DF(*PCJ!1YK%!!!#!!!!!!!!#&X8!!"$3F(*PCJ!1UKi!!!#
-"!!!!!!!#*j8!!!B8F(*PCJ!1!fJ!!!##!!!!!!!#,DN!!!L@F(*PCJ!1bY3!!!#
-$!!!!!!!#0Mm!!!%(F(*PCJ!1D*S!!!#%!!!!!!!#0dB!!!-JF(*PCJ!1Q1)!!!#
-&!!!!!!!#1QB!!!!8F(*PCJ!1DmN!!!#'!!!!!!!#1RS!!!!+F(*PCJ!1B[N!!!#
-(!!!!!!!#1S3!!!!-F(*PCJ!1Y%%!!!#)!!!!!!!#1T!!!!!!$R"bC@B!$Z2!!!!
-!L3!!!!!!!MUH!!!""R"bC@B!$K+Q!!!!LJ!!!!!!!MZN!!!!2R"bC@B!$Y45!!!
-!L`!!!!!!!M[L!!!!$R"bC@B!$ThJ!!!!M!!!!!!!!M[`!!!"fR"bC@B!$L2p!!!
-!M3!!!!!!!Mh+!!!!BR"bC@B!$UH%!!!!MJ!!!!!!!MiX!!!!&("bC@B!$U1Q!!!
-!M`!!!!!!!Mj!!!!!#R"bC@B!$Rrm!!!!N!!!!!!!!!)q5J!!!!a`FQ9Q!!iEh`!
-!!*%!!!!!!!)q9J!!!-T`FQ9Q!!j-XJ!!!*)!!!!!!!)r)!!!!4K`FQ9Q!!jGN3!
-!!*-!!!!!!!*!1!!!!+K`FQ9Q!!i5!3!!!*3!!!!!!!*!i!!!!#j`FQ9Q!!lG5`!
-!!*8!!!!!!!*"$J!!!Ja`FQ9Q!!jL+`!!!*B!!!!!!!*$'J!!#J"YG("X!!!!"J!
-!!!!!!!!!!!*0'J!!!3"YG("c!!!!"J!!!!!!!!!!!!*1'J!!!""YG("T!!!!"J!
-!!!!!!!!!!!*1+J!!!)aYG'a[!!!!"J!!!!!!!!!!!!*1YJ!!!#"YG(0X!!!!"J!
-!!!!!!!!!!!*1eJ!!"4"`FQ9Q!!ke'`!!!*F!!!!!!!*6jJ!!!!K`FQ9Q!!iPYJ!
-!!*J!!!!!!!*6lJ!!!"T`FQ9Q!!k$'`!!!*N!!!!!!!*8#!!!%0"`FQ9Q!!iDS3!
-!!*S!!!!!!!*Nf!!!"K4`FQ9Q!!k8"3!!!*X!!!!!!!*Ul!!!#*C`FQ9Q!!iKFJ!
-!!*`!!!!!!!*cJJ!!!3G`FQ9Q!!iTD3!!!*d!!!!!!!*dL3!!!b"`FQ9Q!!i1j`!
-!!*i!!!!!!!*hU3!!!"4`FQ9Q!!jL[3!!!*m!!!!!!!*h[3!!!!T`FQ9Q!!jXAJ!
-!!+!!!!!!!!*ha`!!!!a`FQ9Q!!jr'`!!!+%!!!!!!!*hd`!!!!j`FQ9Q!!k0TJ!
-!!+)!!!!!!!*hi3!!!3C`FQ9Q!!i0!3!!!+-!!!!!!!*ij`!!!$j`FQ9Q!!j!f3!
-!!+3!!!!!!!*j*3!!!!j`FQ9Q!!k[33!!!+8!!!!!!!*j-`!!!GT`FQ9Q!!iY93!
-!!+B!!!!!!!*l$3!!!'*`FQ9Q!!i`KJ!!!+F!!!!!!!*lE`!!!"4`FQ9Q!!jK6!!
-!!+J!!!!!!!*lJ`!!!!T`FQ9Q!!kKkJ!!!+N!!!!!!!*lM3!!!!a`FQ9Q!!k[X3!
-!!+S!!!!!!!*lQ3!!!-T`FQ9Q!!iUj!!!!+X!!!!!!!*mB`!!!4K`FQ9Q!!iAM3!
-!!+`!!!!!!!*pH`!!!+K`FQ9Q!!jMNJ!!!+d!!!!!!!*q)`!!!#j`FQ9Q!!lid!!
-!!+i!!!!!!!*q83!!!Ja`FQ9Q!!iiI!!!!+m!!!!!!!+!A3!!2!"YG("X!!!!"`!
-!!!!!!!!!!!+mA3!!"J"YG("c!!!!"`!!!!!!!!!!!!,#A3!!!""YG("T!!!!"`!
-!!!!!!!!!!!,#E3!!"G4YG'a[!!!!"`!!!!!!!!!!!!,)33!!!#"YG(0X!!!!"`!
-!!!!!!!!!!!,)B3!!"4"`FQ9Q!!i1N!!!!!#`!!!!!!!#cA%!!!!)F(*PCJ!1PMd
-!!!#a!!!!!!!#cAN!!!!DF(*PCJ!1G*S!!!#b!!!!!!!#cC-!!"$3F(*PCJ!1m28
-!!!#c!!!!!!!#hQ-!!!B8F(*PCJ!18k%!!!#d!!!!!!!#j(F!!!NQF(*PCJ!1&dF
-!!!#e!!!!!!!#lCd!!!%(F(*PCJ!1a"8!!!#f!!!!!!!#lU3!!!-JF(*PCJ!1h-`
-!!!#h!!!!!!!#mF3!!!!8F(*PCJ!1Gj-!!!#i!!!!!!!#mGJ!!!!+F(*PCJ!1c58
-!!!#j!!!!!!!#mH)!!!!-F(*PCJ!1Nd!!!!#k!!!!!!!#mHi!!!!1F(*PCJ!1Kq%
-!!!#l!!!!!!!#mI`!!!%'F(*PCJ!1ebJ!!!#m!!!!!!!#m`)!!!!qF(*PCJ!1C`N
-!!!#p!!!!!!!#md!!!!!1F(*PCJ!1qpm!!!#q!!!!!!!#mdi!!!(DF(*PCJ!1EaJ
-!!!#r!!!!!!!#p5J!!!"LF(*PCJ!1m4i!!!$!!!!!!!!#pBS!!!!8F(*PCJ!1#Td
-!!!$"!!!!!!!#pCi!!!!+F(*PCJ!1d"!!!!$#!!!!!!!#pDJ!!!!-F(*PCJ!1Mb-
-!!!$$!!!!!!!#pE3!!!$+F(*PCJ!1+43!!!$%!!!!!!!#pRi!!!%BF(*PCJ!1BQB
-!!!$&!!!!!!!#pjB!!!#SF(*PCJ!1JbF!!!$'!!!!!!!#q$i!!!!ZF(*PCJ!1jBJ
-!!!$(!!!!!!!#q'`!!!)-F(*PCJ!1EJ)!!!$)!!!!!!!#qRJ!!$`!EA4`E!!!!!J
-!!!!!!!!!!!!$0RJ!!!B!EA4`F`!!!!J!!!!!!!!!!!!$2(J!!!!3EA4`D3!!!!J
-!!!!!!!!!!!!$2)J!!!!JEA4cE!!!!!J!!!!!!!!!!!!$2+J!!!A8EA4XE`!!!!J
-!!!!!!!!!!!!$D9S!!"$%EA4RE!!!!qJ!!!!!!!!!!!!$8d!!!!!XE@pdD3!!!!!
-!!!!!!!!!!!!$8f`!!"1!8%acG!!19TJ!!!$*!!!!!!!"&P)!!!)XEA"cD3!!!qJ
-!!!!!!!!!!!!$D1S!!!!3EA0dF!!!!!)!!!!!!!!!!!!$D2S!!!!3EA0dF!!!!!8
-!!!!!!!!!!!!!@NJ!!!!SEA0dD3!!!qJ!!!!!!!!!!!!$D6)!!!!SEA0dD3!!!!!
-!!!!!!!!!!!!!@R!!!!!-E@&XE!!!!!!!!!!!!!!!!!!$6(`!!!$%E@&`E!!!!!!
-!!!!!!!!!!-eY!!!:
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)!!!!!H%!!!!"i`!!!!(
+L!!!!!H8!!!!"jJ!!!!(N!!!!!HF!!!!"k!!"!!!!!&*26e3!!!!!!!!!!!!!!!!
+'4e*98!!!!!!!!!!!$P*[H5Gc)%GPG%K89&"6!!!!"8C*6%8"!!'L4NP-43%!!D0
+'58a&!3!"U%C*6%8"!!'K4NP-43%!!D"(8P93!!!!!!!!!!!66h"PEP066#""F("
+XD@0KG'P[EJ!!!#0'58a&!J!!(%C*6%8#!!!U4NP-43)!!!e'58a&!J!!)%C*6%8
+#!!!54NP-43)!!"0'58a&!J!!&NC*6%8#!!!B4NP-43)!!"G'58a&!J!!$NC*6%8
+#!!!H4NP-43)!!"&'58a&!J!!%%C*6%8#!!!K4NP-43)!!"4'58a&!J!!&8C*6%8
+#!!!X4NP-43)!!"T'58a&!J!!'8C*6%8#!!!S4NP-43)!!#G'58a&!J!!*%C*6%8
+#!!!Y4NP-43)!!!Y'58a&!J!!*NC*6%8#!!!T4NP-43)!!!a'58a&!J!!+dC*6%8
+#!!!L4NP-43)!!!p'58a&!J!!'dC*6%8#!!!G4NP-43)!!"p'58a&!J!!*8C*6%8
+#!!!M4e*98!!!!!!!!!!!%8p`C@j68d`J6'PLFQ&bD@9c!!!!"%G599!!!!!!!!!
+!!!038%-!!!!#4NP-43)!!$0'58a&!J!!0%G599!!!!!!!!!!!!-f1'X!!!!#4NP
+-438!!#"'58a&"3!!(dG599!!!!!!!!!!!!CMFRP`G'm!!!!S4NP-43%!!Aa'58a
+&!3!"INC*6%8"!!'N4NP-43%!!Cp'58a&!3!"I8C*6%8"!!&l4e*98!!!!!!!!!!
+!"'&cEM%!!!"A4NP-43%!!$j'58a&!3!!-8C*6%8"!!"&4NP-43%!!$P'58a&!3!
+!3dC*6%8"!!!m4NP-43%!!$p'58a&!3!!3%C*6%8"!!"%4NP-43%!!%&'58a&!3!
+!0dC*6%8"!!!e4NP-43%!!$Y'58a&!3!!-NC*6%8"!!!i4NP-43%!!%K'58a&!3!
+!4NC*6%8"!!"#4NP-43%!!$C'58a&!3!!4dC*6%8"!!')4NP-43%!!("'58a&!3!
+!I%C*6%8"!!"i4NP-43%!!(T'58a&!3!!H8C*6%8"!!"a4NP-43%!!(C'58a&!3!
+!FNC*6%8"!!"p4NP-43%!!B&'58a&!3!!FdC*6%8"!!"e4NP-43%!!(Y'58a&!3!
+!A8C*6%8"!!"04NP-43%!!&P'58a&!3!!6NC*6%8"!!"D4NP-43%!!%p'58a&!3!
+!@dC*6%8"!!"34NP-43%!!&a'58a&!3!!5dC*6%8"!!"A4NP-43%!!%a'58a&!3!
+!@%C*6%8"!!"Z4NP-43%!!'p'58a&!3!"LNC*6%8"!!"X4NP-43%!!'e'58a&!3!
+"L8C*6%8"!!',4NP-43%!!'9'58a&!3!!D8C*6%8"!!"S4NP-43%!!'G'58a&!3!
+!BdC*6%8"!!"N4NP-43%!!'&'58a&!3!!DNC*6%8"!!"L4NP-43%!!'C'58a&!3!
+!8dC*6%8"!!"84NP-43%!!&9'58a&!3!!9NC*6%8"!!"*4NP-43%!!%T'58a&!3!
+!ANC*6%8"!!"54NP-43%!!$T'58a&!3!!GdC*6%8"!!!c4NP-43%!!(4'58a&!3!
+!,dC*6%8"!!!Z4NP-43%!!#e'58a&!3!!28C*6%8"!!!d4NP-43%!!Ba'58a&!3!
+!88C*6%8"!!!`4NP-43%!!&p'58a&!3!!B%C*6%8"!!"V4e*98!!!!!!!!!!!!Q*
+Q!!!!"8C*6%8"!!##4NP-43%!!(p'58a&!3!!J%C*6%8"!!"q4NP-43%!!)&(8P9
+3!!!!!!!!!!!$BQP[!!!!$NC*6%8"!!#%4NP-43%!!Be'58a&!3!!JdC*6%8"!!'
+14NP-43%!!C&'58a&!3!"MdC*6%8"!!'3!%C*6%8"!!#&4NP-43%!!C*'58a&!3!
+"J%C*6%8"!!'(4NP-43%!!C9'58a&!3!"NdC*6%8"!!'84e*98!!!!!!!!!!!!Q*
+Z!!!!&%C*6%8"!!#'4NP-43%!!)P'58a&!3!!LdC*6%8"!!#14NP-43%!!DC'58a
+&!3!!N8C*6%8"!!#64NP-43%!!*4'58a&!3!!PNC*6%8"!!#B4NP-43%!!)K'58a
+&!3!!M8C*6%8"!!#54NP-43%!!)T'58a&!3!!PdC*6%8"!!#(4NP-43%!!*9'58a
+&!3!!MdC*6%8"!!#3!%C*6%8"!!#-4e*98!!!!!!!!!!!"Q*eCQCPFJ!!!!*'58a
+&!3!!Q8C*6%8"!!#D4e*98!!!!!!!!!!!"'0KFh3!!!!&4NP-43%!!*p'58a&!3!
+!R%C*6%8"!!#G4NP-43%!!*Y'58a&!3!!RNG599!!!!!!!!!!!!4MEfe`!!!!!dC
+*6%8"!!#J4NP-43%!!+&'58a&!3!!SNG599!!!!!!!!!!!!4MEfjQ!!!!!NC*6%8
+"!!#M4NP-43%!!+4(8P93!!!!!!!!!!!$C'9c!!!!'NC*6%8"!!#P4NP-43%!!+C
+'58a&!3!!U%C*6%8"!!#T4NP-43%!!+Y'58a&!3!!V%C*6%8"!!#Z4NP-43%!!CC
+'58a&!3!!VdC*6%8"!!#b4NP-43%!!,0'58a&!3!!Y%C*6%8"!!#e4NP-43%!!,C
+'58a&!3!!Z%C*6%8"!!#j4NP-43%!!,T'58a&!3!!UNC*6%8"!!#`4NP-43%!!,G
+'58a&!3!![8C*6%8"!!#l4NP-43%!!+G'58a&!3!!X8C*6%8"!!#m4NP-43%!!+e
+(8P93!!!!!!!!!!!#C'J!!!!&4NP-43%!!-"'58a&!3!!`8C*6%8"!!$#4NP-43%
+!!,j'58a&!3!![dG599!!!!!!!!!!!!0NFf%!!!!)4NP-43%!!-9'58a&!3!!aNC
+*6%8"!!$(4NP-43%!!-0'58a&!3!!b8C*6%8"!!$)4NP-43%!!-4'58a&!3!"JNG
+599!!!!!!!!!!!!0PFR)!!!!$4NP-43%!!-T'58a&!3!!bdC*6%8"!!$-4e*98!!
+!!!!!!!!!!f9fF!!!!$p'58a&!3!!ddC*6%8"!!$54NP-43%!!04'58a&!3!!eNC
+*6%8"!!$V4NP-43%!!0e'58a&!3!!j%C*6%8"!!$c4NP-43%!!1a'58a&!3!!hNC
+*6%8"!!$P4NP-43%!!24'58a&!3!!k%C*6%8"!!$D4NP-43%!!2G'58a&!3!"!NC
+*6%8"!!$K4NP-43%!!2"'58a&!3!!q%C*6%8"!!$Y4NP-43%!!0p'58a&!3!!jNC
+*6%8"!!$e4NP-43%!!1P'58a&!3!!fdC*6%8"!!$L4NP-43%!!2&'58a&!3!!kNC
+*6%8"!!$F4NP-43%!!10'58a&!3!!mNC*6%8"!!$Z4NP-43%!!1"'58a&!3!!jdC
+*6%8"!!$f4NP-43%!!2j'58a&!3!!qdC*6%8"!!$m4NP-43%!!3"'58a&!3!"!8C
+*6%8"!!$j4NP-43%!!2T'58a&!3!!r8C*6%8"!!$r4NP-43%!!3C'58a&!3!""dC
+*6%8"!!%)4NP-43%!!3P'58a&!3!""8C*6%8"!!%%4NP-43%!!30'58a&!3!!cdC
+*6%8"!!$04NP-43%!!-j'58a&!3!!e8C*6%8"!!$[4NP-43%!!0&'58a&!3!!edC
+*6%8"!!$34NP-43%!!0P'58a&!3!!f%C*6%8"!!'A4NP-43%!!CK(8P93!!!!!!!
+!!!!%D'eKB`!!!!&'58a&!3!"#NG599!!!!!!!!!!!!4TC'9K!!!!"8C*6%8"!!%
+,4NP-43%!!3a'58a&!3!"$NC*6%8"!!%04NP-43%!!3p(8P93!!!!!!!!!!!&E'K
+KFfJ!!!!#4NP-43%!!4"'58a&!3!"%8G599!!!!!!!!!!!!0YC$)!!!!#4NP-43%
+!!4*'58a&!3!"%dG599!!!!!!!!!!!!0YC$8!!!!#4NP-43%!!44'58a&!3!"&8G
+599!!!!!!!!!!!!4YC'-b!!!!!NC*6%8"!!%@4NP-43%!!4G(8P93!!!!!!!!!!!
+(Ef*UC@0dF`!!!!4'58a&!3!"'dC*6%8"!!%B4NP-43%!!4T'58a&!3!"'8G599!
+!!!!!!!!!!!0`C@d!!!!'4NP-43%!!5&'58a&!3!")%C*6%8"!!%H4NP-43%!!4p
+'58a&!3!"(%C*6%8"!!%G4e*98!!!!!!!!!!!"R"VBh-a-J!!!""'58a&!3!")NC
+*6%8"!!%M4NP-43%!!54'58a&!3!"*8C*6%8"!!%Q4NP-43%!!5G'58a&!3!"+%C
+*6%8"!!%T4NP-43%!!5T'58a&!3!"+dC*6%8"!!%X4NP-43%!!5e'58a&!3!",NC
+*6%8"!!%[4NP-43%!!CP'58a&!3!"-%G599!!!!!!!!!!!!9`Df0c0`!!!!C'58a
+&!3!"-NC*6%8"!!%c4NP-43%!!6&'58a&!3!"R%C*6%8"!!'D4NP-43%!!CY(8P9
+3!!!!!!!!!!!%FQ&ZC!!!!!4'58a&!3!"0%C*6%8"!!%e4NP-43%!!6C'58a&!3!
+"TdG599!!!!!!!!!!!!0bBc)!!!!&4NP-43%!!6T'58a&!3!"1dC*6%8"!!%j4NP
+-43%!!6G'58a&!3!"1%G599!!!!!!!!!!!!0bBc3!!!!#4NP-43%!!6e'58a&!3!
+"2%G599!!!!!!!!!!!!0bBc8!!!!&4NP-43%!!8*'58a&!3!"3%C*6%8"!!&"4NP
+-43%!!6j'58a&!3!"2dG599!!!!!!!!!!!!CbDA"PE@3!!!!#4NP-43%!!80'58a
+&!3!"4%G599!!!!!!!!!!!!0bFf%!!!!-4NP-43%!!89'58a&!3!"4dC*6%8"!!&
+)4NP-43%!!8e'58a&!3!"6%C*6%8"!!&'4NP-43%!!8Y'58a&!3!"6NC*6%8"!!&
+*4NP-43%!!8T'58a&!3!"R8C*6%8"!!'H4e*98!!!!!!!!!!!!h0SB3!!!!4'58a
+&!3!"88C*6%8"!!&24NP-43%!!9*'58a&!3!"8%G599!!!!!!!!!!!!9cG'&MD`!
+!!!&'58a&!3!"8dG599!!!!!!!!!!!!CdH(4IC')!!!!"4NP-43%!!94(8P93!!!
+!!!!!!!!%H$8`13!!!"9'58a&!3!"A%C*6%8"!!&E4NP-43%!!@&'58a&!3!"@NC
+*6%8"!!&J4NP-43%!!@*'58a&!3!"JdC*6%8"!!&Q4NP-43%!!@0'58a&!3!"@%C
+*6%8"!!&G4NP-43%!!9G'58a&!3!"C8C*6%8"!!&H4NP-43%!!9P'58a&!3!"AdC
+*6%8"!!&R4NP-43%!!@4'58a&!3!"K%C*6%8"!!&94NP-43%!!9C(8P93!!!!!!!
+!!!!'H$8`1ABc!!!!&8C*6%8"!!&V4NP-43%!!@a'58a&!3!"E8C*6%8"!!&a4NP
+-43%!!A0'58a&!3!"G8C*6%8"!!&h4NP-43%!!AT'58a&!3!"D%C*6%8"!!&b4NP
+-43%!!@T'58a&!3!"H%C*6%8"!!&T4NP-43%!!AC'58a&!3!"G%C*6%8"!!&`4NP
+-43%!!AP'58a&!3!"ENC*6%8"!!&[4NP-43%!!B9'58a&!3!"KNG599!!!!!!!!!
+!!!0cFf`!!!!M4NP-43%!!"0'58a&!3!!&8C*6%8"!!!34NP-43%!!"*'58a&!3!
+!%8C*6%8"!!!84NP-43%!!"T'58a&!3!!(%C*6%8"!!!A4NP-43%!!"P'58a&!3!
+!'%C*6%8"!!!E4NP-43%!!"C'58a&!3!!$8C*6%8"!!!24NP-43%!!!Y'58a&!3!
+!$%C*6%8"!!!14NP-43%!!#Y'58a&!3!!,%C*6%8"!!!S4NP-43%!!#T'58a&!3!
+!+8C*6%8"!!!M4NP-43%!!#*'58a&!3!!(dC*6%8"!!!P4NP-43%!!#"'58a&!3!
+!*NC*6%8"!!!N4NP-43%!!"j'58a&!3!!*dC*6%8"!!!G4NP-43%!!!T'58a&!3!
+!)8G599!!!!!!!!!!!!j(990*)%aTBR*KFQPPF`!!!!0'58a&!J!!,dG599!!!!!
+!!!!!!!038%-!!!!$4NP-43)!!$"'58a&!J!!-8C*6%8#!!!b4e*98!!!!!!!!!!
+!!cBiD`!!!!0'58a&"3!!&%C*6%8&!!!94NP-438!!"C(8P93!!!!!!!!!!!138j
+655"-D@*bBA*TCA-!!!!#4e*98!!!!!!!!!!!!e"33`!!!!*'58a&!3!!!8C*6%8
+"!!&r4e*98!!!!!!!!!!!!cBiD`!!!!*'58a&!`!"S%C*6%8$!!'K4e*98!!!!!!
+!!!!!$8eKBb"-D@*bBA*TCA-!!!!#4e*98!!!!!!!!!!!!e"33`!!!!P'58a&!3!
+!"%C*6%8"!!!#4NP-43%!!!0'58a&!3!!#8C*6%8"!!!)4NP-43%!!!G'58a&!3!
+!"NC*6%8"!!!&4NP-43%!!D9(8P93!!!!!!!!!!!$0MKV!!!!"NC*6%8$!!'D4NP
+-43-!!D*'58a&!`!"R%C*6%8$!!'G4NP-43-!!Cp'58a&!`!"Q`!!!"J!!!)!!!)
+!!!!!!J%!"3!!!!!#!J!-!!!!!!)$!!S!!!!!!J3!!J!!!!!#"3!&!!!!!!)'!!)
+!!!!!!JF!"J!!!!!##!!0!!!!!!)*!!8!!!!!!JS!"3!!!!!##`!"!!!!!!)-!!%
+!!!!!!Jd!"`!!!!!#$J!)!!!!!!)2!!8!!!!!!K!!!J!!!!!#%3!#!!!!!!)5!!J
+!!!!!!K-!!3!!!!!#&!!"!!!!!!)9!!J!!!!!!KB!#3!!!!!#&`!%!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!#"J%#!!!c"`%#!!!d!!!!!J3""3!!)!J""3!
+!(`!!!HJ!!!)!!!!6k3!!&!!!!!(S!&j1G!!-6PB!!#m+,`-NEJ!35Ui!!!$*!!!
+!i!!!&0i!!"J!!!!!b3!-,bi!##"U!-JJD!"i6T!!-"mf!!!!!K%!!!)5!!!#%`!
+!!K3!!!)9!!!"p3!!!HJ!!!(H!!!"d3!!!IX!!!(3!!!"p!!!!I`!!!)"!!!"U3!
+!!DS!!!'V!!!!,!!!!#d!!!!Z!!!!,`!!!$!!!!!a!!!!-J!!!$-!!!!d!!!!03!
+!!$B!!!!h!!!!1!!!!$N!!!!k!!!!1`!!!BF!!!!m!!!!23!!!$i!!!!r!!!!3!!
+!!%%!!!',!!!!3J!!!%-!!!"%!!!!43!!!%B!!!"(!!!"kJ!!!Am!!!"p!!!!IJ!
+!!(m!!!'5!!!"N3!!!)!!!!#"!!!!c!!!!B`!!!$0!!!!JJ!!!)-!!!$1!!!!c`!
+!!!N!!!(a!!!!K3!!!)B!!!#(!!!"T3!!!)J!!!#*!!!!LJ!!!)X!!!#-!!!!M3!
+!!)i!!!#2!!!!N!!!!!#4!!!!NJ!!!*-!!!#8!!!!P3!!!*B!!!#A!!!"N`!!!Bi
+!!!'2!!!"M3!!!C!!!!!!K!!!!*J!!!#C!!!#"!!!!93!!!&9!!!"P!!!!BB!!!)
+(!!!##!!!!D`!!!#N!!!!T3!!!+B!!!#R!!!!U!!!!KB!!!'Y!!!!R`!!!+)!!!#
+M!!!"R`!!!AS!!!'Z!!!"V`!!!AX!!!)!!!!"RJ!!!0!!!!#D!!!!Q`!!!*`!!!#
+G!!!!S!!!!*i!!!#K!!!!5!!!!%N!!!"+!!!!5`!!!%`!!!"0!!!!6J!!!%m!!!)
+&!!!#"J!!!+N!!!'`!!!"X3!!!,d!!!#q!!!![`!!!-!!!!$"!!!!d3!!!E)!!!'
+c!!!!`J!!!--!!!$%!!!!a3!!!-B!!!'"!!!!a`!!!-J!!!#U!!!!U`!!!+`!!!'
+d!!!!dJ!!!+d!!!'9!!!!b3!!!D!!!!'e!!!!bJ!!!-X!!!"3!!!!d`!!!03!!!$
+9!!!!eJ!!!0F!!!$B!!!"I!!!!0N!!!$D!!!!f`!!!0`!!!$G!!!!hJ!!!0m!!!$
+J!!!!i3!!!1)!!!$M!!!!j!!!!18!!!$Q!!!!j`!!!1J!!!$T!!!!kJ!!!1X!!!$
+X!!!!l3!!!1i!!!$[!!!!m!!!!2%!!!$b!!!!m`!!!23!!!$e!!!!pJ!!!2F!!!#
+Z!!!!V`!!!J-!!!(D!!!"l3!!!&%!!!"5!!!!8`!!!H`!!!'f!!!"Y`!!!EJ!!!(
+L!!!"i!!!!D%!!!(E!!!"c3!!!F`!!!(F!!!"cJ!!!Gd!!!(2!!!"#3!!!&3!!!"
+9!!!!9J!!!&F!!!"B!!!!@3!!!&S!!!"E!!!!!3!!!3S!!!%,!!!"$!!!!3d!!!%
+1!!!"$`!!!4!!!!(f!!!"k3!!!HF!!!(Q!!!"i`!!!H8!!!(I!!!"rJ!!!Id!!!(
+5!!!"SJ!!!!)!!!(C!!!"%3!!!4)!!!%6!!!"&!!!!48!!!%@!!!"-`!!!Ad!!!'
+M!!!"p`!!!GJ!!!!!!!!"d`!!!!-!!!(A!!!"IJ!!!IJ!!!(V!!!"q3!!!Hi!!!$
+i!!!!q3!!!2S!!!$l!!!!r!!!!2d!!!$q!!!!r`!!!3!!!!%"!!!"Z3!!!&`!!!"
+G!!!"&`!!!4J!!!%C!!!!X!!!!,%!!!#b!!!"j!!!!H%!!!'k!!!"e!!!!!3!!!!
+&!!!"e3!!!GB!!!!'!!!!"`!!!4S!!!%K!!!")J!!!5-!!!%N!!!"*3!!!5B!!!%
+R!!!"+!!!!5N!!!%U!!!"+`!!!5`!!!'B!!!",3!!!5i!!!'@!!!"P`!!!&i!!!"
+I!!!!B!!!!'%!!!"L!!!!B`!!!'3!!!"P!!!!CJ!!!'F!!!"S!!!!D3!!!'S!!!#
+c!!!"qJ!!!I-!!!%E!!!"(!!!!4d!!!%H!!!"(`!!!5!!!!%[!!!"Q3!!!6!!!!%
+a!!!"QJ!!!CX!!!'l!!!"[!!!!6)!!!'p!!!"T!!!!JN!!!)+!!!##`!!!J`!!!)
+0!!!#$J!!!I!!!!)2!!!"!J!!!3-!!!%%!!!""3!!!3B!!!%(!!!"#!!!!,3!!!%
+d!!!"T`!!!DB!!!#e!!!"03!!!6B!!!%h!!!"1!!!!6N!!!%k!!!"1`!!!6`!!!%
+p!!!"2J!!!6m!!!&!!!!"33!!!,B!!!#h!!!"[J!!!Hm!!!)3!!!"3J!!!8-!!!#
+i!!!"[`!!!C`!!!&%!!!"43!!!8B!!!&(!!!"5!!!!Cd!!!&*!!!"5J!!!8X!!!&
+-!!!"63!!!!S!!!!,!!!!$!!!!!d!!!!1!!!!$`!!!"!!!!!4!!!!%J!!!"-!!!!
+8!!!!&3!!!"B!!!!A!!!!'!!!!"N!!!!D!!!!'`!!!F!!!!#j!!!"6J!!!8m!!!&
+3!!!"83!!!F%!!!(r!!!"`J!!!F-!!!!F!!!!(3!!!"i!!!!I!!!!)!!!!#%!!!!
+L!!!!)`!!!#3!!!!P!!!!*J!!!9)!!!#k!!!!Z`!!!F3!!!(&!!!"aJ!!!FF!!!(
+,!!!!*`!!!#J!!!!T!!!!+J!!!#X!!!)#!!!!#!!!!9-!!!'+!!!!D`!!!'`!!!"
+Y!!!"L!!!!'i!!!'*!!!"C`!!!@J!!!&T!!!"DJ!!!@X!!!&X!!!"E3!!!@i!!!&
+[!!!"F!!!!A%!!!&b!!!"K3!!!A-!!!&d!!!"G3!!!AB!!!'%!!!"G`!!!AJ!!!&
+j!!!"b!!!!FN!!!'S!!!"bJ!!!9B!!!&A!!!"JJ!!!9J!!!&C!!!"@J!!!9X!!!&
+F!!!"A3!!!9i!!!&I!!!"B!!!!@%!!!&L!!!"J`!!!@-!!!&N!!!"C3!!!,`!!!(
+b!!!!E`!!!@B!!!"`!!!!F3!!!()!!!"c!!!!G!!!!(8!!!"f!!!!G`!!!(J!!!"
+j!!!!HJ!!!(X!!!"m!!!"J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!"!!!!-P*26e3!!!!!!!!!!!!!!!!'4e*98!!!!!!!!!!"$P*[H5Gc)%G
+PG%K89&"6!!!!"8C*6%8"!!'L4NP-43%!!D0'58a&!3!"U%C*6%8"!!'K4NP-43%
+!!D"(8P93!!!!!!!!!!)66h"PEP066#""F("XD@0KG'P[EJ!!!#0'58a&!J!!(%C
+*6%8#!!!U4NP-43)!!!e'58a&!J!!)%C*6%8#!!!54NP-43)!!"0'58a&!J!!&NC
+*6%8#!!!B4NP-43)!!"G'58a&!J!!$NC*6%8#!!!H4NP-43)!!"&'58a&!J!!%%C
+*6%8#!!!K4NP-43)!!"4'58a&!J!!&8C*6%8#!!!X4NP-43)!!"T'58a&!J!!'8C
+*6%8#!!!S4NP-43)!!#G'58a&!J!!*%C*6%8#!!!Y4NP-43)!!!Y'58a&!J!!*NC
+*6%8#!!!T4NP-43)!!!a'58a&!J!!+dC*6%8#!!!L4NP-43)!!!p'58a&!J!!'dC
+*6%8#!!!G4NP-43)!!"p'58a&!J!!*8C*6%8#!!!M4e*98!!!!!!!!!!$%8p`C@j
+68d`J6'PLFQ&bD@9c!!!!"%G599!!!!!!!!!!"!038%-!!!!#4NP-43)!!$0'58a
+&!J!!0%G599!!!!!!!!!!"3-f1'X!!!!#4NP-438!!#"'58a&"3!!(dG599!!!!!
+!!!!!"JCMFRP`G'm!!!!S4NP-43%!!Aa'58a&!3!"INC*6%8"!!'N4NP-43%!!Cp
+'58a&!3!"I8C*6%8"!!&l4e*98!!!!!!!!!!("'&cEM%!!!"A4NP-43%!!$j'58a
+&!3!!-8C*6%8"!!"&4NP-43%!!$P'58a&!3!!3dC*6%8"!!!m4NP-43%!!$p'58a
+&!3!!3%C*6%8"!!"%4NP-43%!!%&'58a&!3!!0dC*6%8"!!!e4NP-43%!!$Y'58a
+&!3!!-NC*6%8"!!!i4NP-43%!!%K'58a&!3!!4NC*6%8"!!"#4NP-43%!!$C'58a
+&!3!!4dC*6%8"!!')4NP-43%!!("'58a&!3!!I%C*6%8"!!"i4NP-43%!!(T'58a
+&!3!!H8C*6%8"!!"a4NP-43%!!(C'58a&!3!!FNC*6%8"!!"p4NP-43%!!B&'58a
+&!3!!FdC*6%8"!!"e4NP-43%!!(Y'58a&!3!!A8C*6%8"!!"04NP-43%!!&P'58a
+&!3!!6NC*6%8"!!"D4NP-43%!!%p'58a&!3!!@dC*6%8"!!"34NP-43%!!&a'58a
+&!3!!5dC*6%8"!!"A4NP-43%!!%a'58a&!3!!@%C*6%8"!!"Z4NP-43%!!'p'58a
+&!3!"LNC*6%8"!!"X4NP-43%!!'e'58a&!3!"L8C*6%8"!!',4NP-43%!!'9'58a
+&!3!!D8C*6%8"!!"S4NP-43%!!'G'58a&!3!!BdC*6%8"!!"N4NP-43%!!'&'58a
+&!3!!DNC*6%8"!!"L4NP-43%!!'C'58a&!3!!8dC*6%8"!!"84NP-43%!!&9'58a
+&!3!!9NC*6%8"!!"*4NP-43%!!%T'58a&!3!!ANC*6%8"!!"54NP-43%!!$T'58a
+&!3!!GdC*6%8"!!!c4NP-43%!!(4'58a&!3!!,dC*6%8"!!!Z4NP-43%!!#e'58a
+&!3!!28C*6%8"!!!d4NP-43%!!Ba'58a&!3!!88C*6%8"!!!`4NP-43%!!&p'58a
+&!3!!B%C*6%8"!!"V4e*98!!!!!!!!!!)!Q*Q!!!!"8C*6%8"!!##4NP-43%!!(p
+'58a&!3!!J%C*6%8"!!"q4NP-43%!!)&(8P93!!!!!!!!!!N$BQP[!!!!$NC*6%8
+"!!#%4NP-43%!!Be'58a&!3!!JdC*6%8"!!'14NP-43%!!C&'58a&!3!"MdC*6%8
+"!!'3!%C*6%8"!!#&4NP-43%!!C*'58a&!3!"J%C*6%8"!!'(4NP-43%!!C9'58a
+&!3!"NdC*6%8"!!'84e*98!!!!!!!!!!+!Q*Z!!!!&%C*6%8"!!#'4NP-43%!!)P
+'58a&!3!!LdC*6%8"!!#14NP-43%!!DC'58a&!3!!N8C*6%8"!!#64NP-43%!!*4
+'58a&!3!!PNC*6%8"!!#B4NP-43%!!)K'58a&!3!!M8C*6%8"!!#54NP-43%!!)T
+'58a&!3!!PdC*6%8"!!#(4NP-43%!!*9'58a&!3!!MdC*6%8"!!#3!%C*6%8"!!#
+-4e*98!!!!!!!!!!,"Q*eCQCPFJ!!!!*'58a&!3!!Q8C*6%8"!!#D4e*98!!!!!!
+!!!!-"'0KFh3!!!!&4NP-43%!!*p'58a&!3!!R%C*6%8"!!#G4NP-43%!!*Y'58a
+&!3!!RNG599!!!!!!!!!!$34MEfe`!!!!!dC*6%8"!!#J4NP-43%!!+&'58a&!3!
+!SNG599!!!!!!!!!!$J4MEfjQ!!!!!NC*6%8"!!#M4NP-43%!!+4(8P93!!!!!!!
+!!!m$C'9c!!!!'NC*6%8"!!#P4NP-43%!!+C'58a&!3!!U%C*6%8"!!#T4NP-43%
+!!+Y'58a&!3!!V%C*6%8"!!#Z4NP-43%!!CC'58a&!3!!VdC*6%8"!!#b4NP-43%
+!!,0'58a&!3!!Y%C*6%8"!!#e4NP-43%!!,C'58a&!3!!Z%C*6%8"!!#j4NP-43%
+!!,T'58a&!3!!UNC*6%8"!!#`4NP-43%!!,G'58a&!3!![8C*6%8"!!#l4NP-43%
+!!+G'58a&!3!!X8C*6%8"!!#m4NP-43%!!+e(8P93!!!!!!!!!"!#C'J!!!!&4NP
+-43%!!-"'58a&!3!!`8C*6%8"!!$#4NP-43%!!,j'58a&!3!![dG599!!!!!!!!!
+!%30NFf%!!!!)4NP-43%!!-9'58a&!3!!aNC*6%8"!!$(4NP-43%!!-0'58a&!3!
+!b8C*6%8"!!$)4NP-43%!!-4'58a&!3!"JNG599!!!!!!!!!!%J0PFR)!!!!$4NP
+-43%!!-T'58a&!3!!bdC*6%8"!!$-4e*98!!!!!!!!!!6!f9fF!!!!$p'58a&!3!
+!ddC*6%8"!!$54NP-43%!!04'58a&!3!!eNC*6%8"!!$V4NP-43%!!0e'58a&!3!
+!j%C*6%8"!!$c4NP-43%!!1a'58a&!3!!hNC*6%8"!!$P4NP-43%!!24'58a&!3!
+!k%C*6%8"!!$D4NP-43%!!2G'58a&!3!"!NC*6%8"!!$K4NP-43%!!2"'58a&!3!
+!q%C*6%8"!!$Y4NP-43%!!0p'58a&!3!!jNC*6%8"!!$e4NP-43%!!1P'58a&!3!
+!fdC*6%8"!!$L4NP-43%!!2&'58a&!3!!kNC*6%8"!!$F4NP-43%!!10'58a&!3!
+!mNC*6%8"!!$Z4NP-43%!!1"'58a&!3!!jdC*6%8"!!$f4NP-43%!!2j'58a&!3!
+!qdC*6%8"!!$m4NP-43%!!3"'58a&!3!"!8C*6%8"!!$j4NP-43%!!2T'58a&!3!
+!r8C*6%8"!!$r4NP-43%!!3C'58a&!3!""dC*6%8"!!%)4NP-43%!!3P'58a&!3!
+""8C*6%8"!!%%4NP-43%!!30'58a&!3!!cdC*6%8"!!$04NP-43%!!-j'58a&!3!
+!e8C*6%8"!!$[4NP-43%!!0&'58a&!3!!edC*6%8"!!$34NP-43%!!0P'58a&!3!
+!f%C*6%8"!!'A4NP-43%!!CK(8P93!!!!!!!!!"3%D'eKB`!!!!&'58a&!3!"#NG
+599!!!!!!!!!!&34TC'9K!!!!"8C*6%8"!!%,4NP-43%!!3a'58a&!3!"$NC*6%8
+"!!%04NP-43%!!3p(8P93!!!!!!!!!"B&E'KKFfJ!!!!#4NP-43%!!4"'58a&!3!
+"%8G599!!!!!!!!!!&`0YC$)!!!!#4NP-43%!!4*'58a&!3!"%dG599!!!!!!!!!
+!'!0YC$8!!!!#4NP-43%!!44'58a&!3!"&8G599!!!!!!!!!!'34YC'-b!!!!!NC
+*6%8"!!%@4NP-43%!!4G(8P93!!!!!!!!!"S(Ef*UC@0dF`!!!!4'58a&!3!"'dC
+*6%8"!!%B4NP-43%!!4T'58a&!3!"'8G599!!!!!!!!!!'`0`C@d!!!!'4NP-43%
+!!5&'58a&!3!")%C*6%8"!!%H4NP-43%!!4p'58a&!3!"(%C*6%8"!!%G4e*98!!
+!!!!!!!!F"R"VBh-a-J!!!""'58a&!3!")NC*6%8"!!%M4NP-43%!!54'58a&!3!
+"*8C*6%8"!!%Q4NP-43%!!5G'58a&!3!"+%C*6%8"!!%T4NP-43%!!5T'58a&!3!
+"+dC*6%8"!!%X4NP-43%!!5e'58a&!3!",NC*6%8"!!%[4NP-43%!!CP'58a&!3!
+"-%G599!!!!!!!!!!(39`Df0c0`!!!!C'58a&!3!"-NC*6%8"!!%c4NP-43%!!6&
+'58a&!3!"R%C*6%8"!!'D4NP-43%!!CY(8P93!!!!!!!!!"i%FQ&ZC!!!!!4'58a
+&!3!"0%C*6%8"!!%e4NP-43%!!6C'58a&!3!"TdG599!!!!!!!!!!(`0bBc)!!!!
+&4NP-43%!!6T'58a&!3!"1dC*6%8"!!%j4NP-43%!!6G'58a&!3!"1%G599!!!!!
+!!!!!)!0bBc3!!!!#4NP-43%!!6e'58a&!3!"2%G599!!!!!!!!!!)30bBc8!!!!
+&4NP-43%!!8*'58a&!3!"3%C*6%8"!!&"4NP-43%!!6j'58a&!3!"2dG599!!!!!
+!!!!!)JCbDA"PE@3!!!!#4NP-43%!!80'58a&!3!"4%G599!!!!!!!!!!)`0bFf%
+!!!!-4NP-43%!!89'58a&!3!"4dC*6%8"!!&)4NP-43%!!8e'58a&!3!"6%C*6%8
+"!!&'4NP-43%!!8Y'58a&!3!"6NC*6%8"!!&*4NP-43%!!8T'58a&!3!"R8C*6%8
+"!!'H4e*98!!!!!!!!!!N!h0SB3!!!!4'58a&!3!"88C*6%8"!!&24NP-43%!!9*
+'58a&!3!"8%G599!!!!!!!!!!*39cG'&MD`!!!!&'58a&!3!"8dG599!!!!!!!!!
+!*JCdH(4IC')!!!!"4NP-43%!!94(8P93!!!!!!!!!#F%H$8`13!!!"9'58a&!3!
+"A%C*6%8"!!&E4NP-43%!!@&'58a&!3!"@NC*6%8"!!&J4NP-43%!!@*'58a&!3!
+"JdC*6%8"!!&Q4NP-43%!!@0'58a&!3!"@%C*6%8"!!&G4NP-43%!!9G'58a&!3!
+"C8C*6%8"!!&H4NP-43%!!9P'58a&!3!"AdC*6%8"!!&R4NP-43%!!@4'58a&!3!
+"K%C*6%8"!!&94NP-43%!!9C(8P93!!!!!!!!!#J'H$8`1ABc!!!!&8C*6%8"!!&
+V4NP-43%!!@a'58a&!3!"E8C*6%8"!!&a4NP-43%!!A0'58a&!3!"G8C*6%8"!!&
+h4NP-43%!!AT'58a&!3!"D%C*6%8"!!&b4NP-43%!!@T'58a&!3!"H%C*6%8"!!&
+T4NP-43%!!AC'58a&!3!"G%C*6%8"!!&`4NP-43%!!AP'58a&!3!"ENC*6%8"!!&
+[4NP-43%!!B9'58a&!3!"KNG599!!!!!!!!!!+30cFf`!!!!M4NP-43%!!"0'58a
+&!3!!&8C*6%8"!!!34NP-43%!!"*'58a&!3!!%8C*6%8"!!!84NP-43%!!"T'58a
+&!3!!(%C*6%8"!!!A4NP-43%!!"P'58a&!3!!'%C*6%8"!!!E4NP-43%!!"C'58a
+&!3!!$8C*6%8"!!!24NP-43%!!!Y'58a&!3!!$%C*6%8"!!!14NP-43%!!#Y'58a
+&!3!!,%C*6%8"!!!S4NP-43%!!#T'58a&!3!!+8C*6%8"!!!M4NP-43%!!#*'58a
+&!3!!(dC*6%8"!!!P4NP-43%!!#"'58a&!3!!*NC*6%8"!!!N4NP-43%!!"j'58a
+&!3!!*dC*6%8"!!!G4NP-43%!!!T'58a&!3!!)8G599!!!!!!!!!!+Jj(990*)%a
+TBR*KFQPPF`!!!!0'58a&!J!!,dG599!!!!!!!!!!+`038%-!!!!$4NP-43)!!$"
+'58a&!J!!-8C*6%8#!!!b4e*98!!!!!!!!!!X!cBiD`!!!!0'58a&"3!!&%C*6%8
+&!!!94NP-438!!"C(8P93!!!!!!!!!#d138j655"-D@*bBA*TCA-!!!!#4e*98!!
+!!!!!!!!Z!e"33`!!!!*'58a&!3!!!8C*6%8"!!&r4e*98!!!!!!!!!![!cBiD`!
+!!!*'58a&!`!"S%C*6%8$!!'K4e*98!!!!!!!!!!`$8eKBb"-D@*bBA*TCA-!!!!
+#4e*98!!!!!!!!!!a!e"33`!!!!P'58a&!3!!"%C*6%8"!!!#4NP-43%!!!0'58a
+&!3!!#8C*6%8"!!!)4NP-43%!!!G'58a&!3!!"NC*6%8"!!!&4NP-43%!!D9(8P9
+3!!!!!!!!!$)$0MKV!!!!"NC*6%8$!!'D4NP-43-!!D*'58a&!`!"R%C*6%8$!!'
+G4NP-43-!!Cp'58a&!`!"Q`!!!4#V3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!"+!!!'!"YFh4b!!!!!!!!!!!!!!!!!!!C+!!!#S"YFh4X!!!!!!!
+!!!!!!!!!!!!MU!!!!i"YFh4Z!!!!!!!!!!!!!!!!!!!R+!!!'!"YFh4b!!!$k!!
+!!!!!!!!!!!!r+!!!'B"YFh4X!!!$k!!!!!!!!!!!!!0TDJ!!#)"YFh4Z!!!$k!!
+!!!!!!!!!!!"E+!!!"4"`FQ9Q!!P'eJ!!!!%!!!!!!!"J1!!!!!K`FQ9Q!!L`,3!
+!!!)!!!!!!!"J3!!!!"T`FQ9Q!!PX2!!!!!-!!!!!!!"J@J!!$+"`FQ9Q!!MrS3!
+!!!3!!!!!!!"XqJ!!"K4`FQ9Q!!L+i3!!!!8!!!!!!!"c$J!!#*C`FQ9Q!!P5m!!
+!!!B!!!!!!!"lT!!!!3G`FQ9Q!!Le63!!!!F!!!!!!!"mU`!!!b"`FQ9Q!!N!,`!
+!!!J!!!!!!!"rb`!!!"4`FQ9Q!!NR4!!!!!N!!!!!!!"rh`!!!!T`FQ9Q!!M`UJ!
+!!!S!!!!!!!"rk3!!!!a`FQ9Q!!L"hJ!!!!X!!!!!!!"rp3!!!!j`FQ9Q!!M0!!!
+!!!`!!!!!!!#!!`!!!3C`FQ9Q!!Kpf3!!!!d!!!!!!!#"#3!!!$j`FQ9Q!!N#K!!
+!!!i!!!!!!!#"4`!!!!j`FQ9Q!!PRC3!!!!m!!!!!!!#"93!!!GT`FQ9Q!!MG@`!
+!!"!!!!!!!!#$,`!!!'*`FQ9Q!!M*!3!!!"%!!!!!!!#$N3!!!"4`FQ9Q!!MP"`!
+!!")!!!!!!!#$T3!!!!T`FQ9Q!!LpV!!!!"-!!!!!!!#$V`!!!!a`FQ9Q!!PJK`!
+!!"3!!!!!!!#$Z`!!!-T`FQ9Q!!L(e!!!!"8!!!!!!!#%K3!!!4K`FQ9Q!!LAh3!
+!!"B!!!!!!!#&R3!!!+K`FQ9Q!!LpP!!!!"F!!!!!!!#'43!!!#j`FQ9Q!!PBJJ!
+!!"J!!!!!!!#'F`!!!Ja`FQ9Q!!N()3!!!"N!!!!!!!#)I`!!4J"YG("X!!!!!3!
+!!!!!!!!!!!$1I`!!"`"YG("c!!!!!3!!!!!!!!!!!!$9I`!!!""YG("T!!!!!3!
+!!!!!!!!!!!$9M`!!"U"YG'a[!!!!!3!!!!!!!!!!!!$F,`!!!#"YG(0X!!!!!3!
+!!!!!!!!!!!$F6`!!"4"`FQ9Q!!NN23!!!"S!!!!!!!$KA`!!!!K`FQ9Q!!M6`J!
+!!"X!!!!!!!$KC`!!!"T`FQ9Q!!KkI3!!!"`!!!!!!!$KJ3!!%0"`FQ9Q!!LKD`!
+!!"d!!!!!!!$b83!!"K4`FQ9Q!!PS2J!!!"i!!!!!!!$iC3!!#*C`FQ9Q!!M14`!
+!!"m!!!!!!!%!q`!!!3G`FQ9Q!!P,IJ!!!#!!!!!!!!%#!J!!!b"`FQ9Q!!Mle3!
+!!#%!!!!!!!%&)J!!!"4`FQ9Q!!NP93!!!#)!!!!!!!%&0J!!!!T`FQ9Q!!LIJJ!
+!!#-!!!!!!!%&3!!!!!a`FQ9Q!!L8Z!!!!#3!!!!!!!%&6!!!!!j`FQ9Q!!P54!!
+!!#8!!!!!!!%&@J!!!3C`FQ9Q!!P'2`!!!#B!!!!!!!%'B!!!!$j`FQ9Q!!N63!!
+!!#F!!!!!!!%'RJ!!!!j`FQ9Q!!MZ(3!!!#J!!!!!!!%'V!!!!GT`FQ9Q!!Lmf!!
+!!#N!!!!!!!%)KJ!!!'*`FQ9Q!!LrK!!!!#S!!!!!!!%)k!!!!"4`FQ9Q!!NchJ!
+!!#X!!!!!!!%)r!!!!!T`FQ9Q!!M,S!!!!#`!!!!!!!%*"J!!!!a`FQ9Q!!N%'3!
+!!#d!!!!!!!%*%J!!!-T`FQ9Q!!NJ2!!!!#i!!!!!!!%*h!!!!4K`FQ9Q!!PIl3!
+!!#m!!!!!!!%+p!!!!+K`FQ9Q!!Lq%J!!!$!!!!!!!!%,R!!!!#j`FQ9Q!!LM0`!
+!!$%!!!!!!!%,bJ!!!Ja`FQ9Q!!NG#`!!!$)!!!!!!!%0eJ!!#J"YG("X!!!!!J!
+!!!!!!!!!!!%AeJ!!!3"YG("c!!!!!J!!!!!!!!!!!!%BeJ!!!""YG("T!!!!!J!
+!!!!!!!!!!!%BjJ!!!0"YG'a[!!!!!J!!!!!!!!!!!!%CYJ!!!#"YG(0X!!!!!J!
+!!!!!!!!!!!%CeJ!!"4"`FQ9Q!!PDj!!!!$-!!!!!!!%HjJ!!!!K`FQ9Q!!NN$!!
+!!$3!!!!!!!%HlJ!!!"T`FQ9Q!!MT*`!!!$8!!!!!!!%I#!!!$+"`FQ9Q!!P`ZJ!
+!!$B!!!!!!!%VU!!!"K4`FQ9Q!!N$-3!!!$F!!!!!!!%a[!!!#5C`FQ9Q!!L9f`!
+!!$J!!!!!!!%kiJ!!!3G`FQ9Q!!LI%`!!!$N!!!!!!!%lk3!!!b"`FQ9Q!!Lj$!!
+!!$S!!!!!!!%r#3!!!"4`FQ9Q!!MhR`!!!$X!!!!!!!%r(3!!!!T`FQ9Q!!M-hJ!
+!!$`!!!!!!!%r*`!!!!a`FQ9Q!!N&m!!!!$d!!!!!!!%r-`!!!!j`FQ9Q!!P[``!
+!!$i!!!!!!!%r33!!!3C`FQ9Q!!MmQ!!!!$m!!!!!!!&!4`!!!$j`FQ9Q!!MK!J!
+!!%!!!!!!!!&!K3!!!!j`FQ9Q!!LfY`!!!%%!!!!!!!&!N`!!!GT`FQ9Q!!MPM!!
+!!%)!!!!!!!&#E3!!!'*`FQ9Q!!PS+!!!!%-!!!!!!!&#c`!!!"4`FQ9Q!!MH03!
+!!%3!!!!!!!&#i`!!!!T`FQ9Q!!PH+3!!!%8!!!!!!!&#l3!!!!a`FQ9Q!!L*a3!
+!!%B!!!!!!!&#q3!!!-T`FQ9Q!!L*,!!!!%F!!!!!!!&$``!!!4K`FQ9Q!!MZ"!!
+!!%J!!!!!!!&%f`!!!+K`FQ9Q!!L@Q`!!!%N!!!!!!!&&J`!!!#j`FQ9Q!!M8&3!
+!!%S!!!!!!!&&X3!!!Ja`FQ9Q!!Lj"J!!!%X!!!!!!!&([3!!4J"YG("X!!!!!`!
+!!!!!!!!!!!'0[3!!"`"YG("c!!!!!`!!!!!!!!!!!!'8[3!!!""YG("T!!!!!`!
+!!!!!!!!!!!'8c3!!!#"YG(0X!!!!!`!!!!!!!!!!!!'8l3!!"T4YG'a[!!!!!`!
+!!!!!!!!!!!'EJ3!!"4"`FQ9Q!!N*[!!!!%`!!!!!!!'JN3!!!!K`FQ9Q!!Kq93!
+!!%d!!!!!!!'JQ3!!!"T`FQ9Q!!M+H`!!!%i!!!!!!!'JX`!!%0"`FQ9Q!!N6p!!
+!!%m!!!!!!!'aJ`!!"K4`FQ9Q!!M$+3!!!&!!!!!!!!'hP`!!#5C`FQ9Q!!L!9`!
+!!&%!!!!!!!(![3!!!3G`FQ9Q!!N`BJ!!!&)!!!!!!!("a!!!!b"`FQ9Q!!M3)3!
+!!&-!!!!!!!(%j!!!!"4`FQ9Q!!L4H3!!!&3!!!!!!!(%q!!!!!T`FQ9Q!!NR0J!
+!!&8!!!!!!!(&!J!!!!a`FQ9Q!!L'$3!!!&B!!!!!!!(&$J!!!!j`FQ9Q!!MR53!
+!!&F!!!!!!!(&(!!!!3C`FQ9Q!!PEH!!!!&J!!!!!!!(')J!!!$j`FQ9Q!!MfA3!
+!!&N!!!!!!!('B!!!!!j`FQ9Q!!N&53!!!&S!!!!!!!('EJ!!!GT`FQ9Q!!LB-`!
+!!&X!!!!!!!()5!!!!'*`FQ9Q!!L6[3!!!&`!!!!!!!()UJ!!!"4`FQ9Q!!LeT`!
+!!&d!!!!!!!()[J!!!!T`FQ9Q!!N,D`!!!&i!!!!!!!()b!!!!!a`FQ9Q!!LcY`!
+!!&m!!!!!!!()e!!!!-T`FQ9Q!!LFj`!!!'!!!!!!!!(*RJ!!!4K`FQ9Q!!N!V3!
+!!'%!!!!!!!(+YJ!!!+K`FQ9Q!!N(2!!!!')!!!!!!!(,AJ!!!#j`FQ9Q!!LQY!!
+!!'-!!!!!!!(,M!!!!Ja`FQ9Q!!M053!!!'3!!!!!!!(0Q!!!#J"YG("X!!!!"!!
+!!!!!!!!!!!(AQ!!!!3"YG("c!!!!"!!!!!!!!!!!!!(BQ!!!!""YG("T!!!!"!!
+!!!!!!!!!!!(BU!!!!#"YG(0X!!!!"!!!!!!!!!!!!!(Bb!!!!)aYG'a[!!!!"!!
+!!!!!!!!!!!(C9!!!"4"`FQ9Q!!MM#`!!!'8!!!!!!!(HC!!!!!K`FQ9Q!!M"$!!
+!!'B!!!!!!!(HE!!!!"T`FQ9Q!!MYHJ!!!'F!!!!!!!(HKJ!!%0"`FQ9Q!!MKm`!
+!!'J!!!!!!!([9J!!"K4`FQ9Q!!Nre3!!!'N!!!!!!!(eDJ!!#5C`FQ9Q!!LZ3J!
+!!'S!!!!!!!(qN!!!!!%(F(*PCJ!)KRi!!!"V!!!!!!!"rjF!!!-JF(*PCJ!)PD8
+!!!"X!!!!!!!#!VF!!!!8F(*PCJ!*0m)!!!"Y!!!!!!!#!XX!!!!+F(*PCJ!*AZd
+!!!"Z!!!!!!!#!Y8!!!!-F(*PCJ!)Vii!!!"[!!!!!!!#!Z%!!!!1F(*PCJ!*,[d
+!!!"`!!!!!!!#!Zm!!!%'F(*PCJ!*'EB!!!"a!!!!!!!#!r8!!!!qF(*PCJ!*0P8
+!!!"b!!!!!!!#"$-!!!!1F(*PCJ!*-D%!!!"c!!!!!!!#"%%!!!(DF(*PCJ!*0"i
+!!!"d!!!!!!!#"KX!!!"LF(*PCJ!)GH!!!!"e!!!!!!!#"Rd!!!!8F(*PCJ!)Q)S
+!!!"f!!!!!!!#"T%!!!!+F(*PCJ!*!Pd!!!"h!!!!!!!#"TX!!!!-F(*PCJ!)PR-
+!!!"i!!!!!!!#"UF!!!$+F(*PCJ!)TC!!!!!!H3!!!!!!!JGa!!!"'("bC@B!#-A
+9!!!!HJ!!!!!!!JL*!!!!U("bC@B!#86U!!!!H`!!!!!!!JNa!!!!,R"bC@B!#@@
+8!!!!I!!!!!!!!JPI!!!#$("bC@B!#(ep!!!!I3!!!!!!!JYV!!!&!'edF'`!!!!
+&!!!!!!!!!!!!!K"V!!!!J'edF(-!!!!&!!!!!!!!!!!!!K$V!!!!%'edF'N!!!!
+&!!!!!!!!!!!!!K$l!!!!)'edFf`!!!!&!!!!!!!!!!!!!K%E!!!!J'edE'm!!!!
+&!!!!!!!!!!!!!K'E!!!&%("bC@B!#8UQ!!!!IJ!!!!!!!KDV!!!!#("bC@B!#22
+(!!!!I`!!!!!!!KDc!!!!'R"bC@B!#3#p!!!!J!!!!!!!!KE0!!!3d("bC@B!#2`
+[!!!!J3!!!!!!!LHG!!!'&("bC@B!#1[4!!!!JJ!!!!!!!Lfa!!!)PR"bC@B!#(,
+9!!!!J`!!!!!!!MC(!!!""h"bC@B!#@rk!!!!K!!!!!!!!MG1!!!$)("bC@B!#1G
+'!!!!K3!!!!!!!MTZ!!!!&("bC@B!#128!!!!KJ!!!!!!!MU#!!!!#R"bC@B!#,1
+q!!!!K`!!!!!!!MU-!!!!$("bC@B!#)c'!!!!L!!!!!!!!MUB!!!!$R"bC@B!#4S
+,!!!!L3!!!!!!!MUQ!!!""R"bC@B!#-iX!!!!LJ!!!!!!!MZX!!!!2R"bC@B!#(C
+#!!!!L`!!!!!!!M[U!!!!$R"bC@B!#@+F!!!!M!!!!!!!!M[i!!!"fR"bC@B!#8(
+h!!!!M3!!!!!!!Mh5!!!!BR"bC@B!#2!L!!!!MJ!!!!!!!Mid!!!!&("bC@B!#(d
+@!!!!M`!!!!!!!Mj)!!!!#R"bC@B!#2iC!!!!N!!!!!!!!!)q8J!!!!a`FQ9Q!!M
+YZ!!!!*%!!!!!!!)qAJ!!!-T`FQ9Q!!Pb83!!!*)!!!!!!!)r+!!!!4K`FQ9Q!!L
+a"3!!!*-!!!!!!!*!3!!!!+K`FQ9Q!!NZf`!!!*3!!!!!!!*!k!!!!#j`FQ9Q!!K
+j[`!!!*8!!!!!!!*"&J!!!Ja`FQ9Q!!Mi,3!!!*B!!!!!!!*$)J!!#J"YG("X!!!
+!"J!!!!!!!!!!!!*0)J!!!3"YG("c!!!!"J!!!!!!!!!!!!*1)J!!!""YG("T!!!
+!"J!!!!!!!!!!!!*1-J!!!)aYG'a[!!!!"J!!!!!!!!!!!!*1[J!!!#"YG(0X!!!
+!"J!!!!!!!!!!!!*1hJ!!"4"`FQ9Q!!Kf)J!!!*F!!!!!!!*6lJ!!!!K`FQ9Q!!N
+bh`!!!*J!!!!!!!*6pJ!!!"T`FQ9Q!!MZB3!!!*N!!!!!!!*8%!!!%0"`FQ9Q!!M
+[m`!!!*S!!!!!!!*Ni!!!"K4`FQ9Q!!NVZ`!!!*X!!!!!!!*Up!!!#*C`FQ9Q!!M
+b!J!!!*`!!!!!!!*cLJ!!!3G`FQ9Q!!P083!!!*d!!!!!!!*dN3!!!b"`FQ9Q!!M
+a13!!!*i!!!!!!!*hX3!!!"4`FQ9Q!!P9h3!!!*m!!!!!!!*ha3!!!!T`FQ9Q!!M
++,3!!!+!!!!!!!!*hc`!!!!a`FQ9Q!!L6T`!!!+%!!!!!!!*hf`!!!!j`FQ9Q!!M
+jB3!!!+)!!!!!!!*hk3!!!3C`FQ9Q!!L0Z`!!!+-!!!!!!!*il`!!!$j`FQ9Q!!M
+P3J!!!+3!!!!!!!*j,3!!!!j`FQ9Q!!N6hJ!!!+8!!!!!!!*j1`!!!GT`FQ9Q!!N
+kJ`!!!+B!!!!!!!*l&3!!!'*`FQ9Q!!N&H!!!!+F!!!!!!!*lG`!!!"4`FQ9Q!!L
+,iJ!!!+J!!!!!!!*lL`!!!!T`FQ9Q!!MDI3!!!+N!!!!!!!*lP3!!!!a`FQ9Q!!K
+l33!!!+S!!!!!!!*lS3!!!-T`FQ9Q!!MlG3!!!+X!!!!!!!*mD`!!!4K`FQ9Q!!L
+e&!!!!+`!!!!!!!*pJ`!!!+K`FQ9Q!!MK1`!!!+d!!!!!!!*q+`!!!#j`FQ9Q!!L
+Y#!!!!+i!!!!!!!*q@3!!!Ja`FQ9Q!!L42`!!!+m!!!!!!!+!C3!!2!"YG("X!!!
+!"`!!!!!!!!!!!!+mC3!!"J"YG("c!!!!"`!!!!!!!!!!!!,#C3!!!""YG("T!!!
+!"`!!!!!!!!!!!!,#G3!!"G4YG'a[!!!!"`!!!!!!!!!!!!,)53!!!#"YG(0X!!!
+!"`!!!!!!!!!!!!,)D3!!"4"`FQ9Q!!NXL3!!!,!!!!!!!!,0H3!!!!K`FQ9Q!!P
+%U3!!!,%!!!!!!!,0J3!!!"T`FQ9Q!!LT(!!!!,)!!!!!!!,0Q`!!%0"`FQ9Q!!N
+(M3!!!,-!!!!!!!,HD`!!"K4`FQ9Q!!PH[`!!!,3!!!!!!!,NI`!!#5C`FQ9Q!!M
+Hh!!!!,8!!!!!!!,YT3!!!3G`FQ9Q!!M`h!!!!,B!!!!!!!,ZV!!!!b"`FQ9Q!!L
+N03!!!,F!!!!!!!,ac!!!!"4`FQ9Q!!Mb6J!!!,J!!!!!!!,ai!!!!!T`FQ9Q!!N
+a@!!!!,N!!!!!!!,akJ!!!!a`FQ9Q!!LH1J!!!,S!!!!!!!,apJ!!!!j`FQ9Q!!N
+"f3!!!,X!!!!!!!,b"!!!!3C`FQ9Q!!P`p!!!!,`!!!!!!!,c#J!!!$j`FQ9Q!!P
+Qf!!!!,d!!!!!!!,c5!!!!!j`FQ9Q!!PYDJ!!!,i!!!!!!!,c9J!!!GT`FQ9Q!!N
+#-!!!!,m!!!!!!!,e-!!!!'*`FQ9Q!!ME@!!!!-!!!!!!!!,eNJ!!!"4`FQ9Q!!L
+j4`!!!-%!!!!!!!,eTJ!!!!T`FQ9Q!!Mf$3!!!-)!!!!!!!,eX!!!!!a`FQ9Q!!M
+eDJ!!!--!!!!!!!,e[!!!!-T`FQ9Q!!MfF3!!!-3!!!!!!!,fKJ!!!4K`FQ9Q!!N
+`R`!!!-8!!!!!!!,hRJ!!!+K`FQ9Q!!LqH3!!!-B!!!!!!!,i4J!!!#j`FQ9Q!!L
+3!*S!!!$(!!!!!!!#q(3!!!)-F(*PCJ!)d'B!!!$)!!!!!!!#qS!!!$`!EA4`E!!
+!!!J!!!!!!!!!!!!$0S!!!!B!EA4`F`!!!!J!!!!!!!!!!!!$2)!!!!!3EA4`D3!
+!!!J!!!!!!!!!!!!$2*!!!!!!)'edFf`!!!!)!!!!!!!!!!!!!cb`!!!&e'edE'm
+!!!!)!!!!!!!!!!!!!d+%!!!3a'edCf`!!!2S!!!!!!!!!!!!!e0)!!!!,'e[G'N
+!!!!!!!!!!!!!!!!!!h(U!!!6J&"-Fh3!#,"V!!!!b3!!!!!!!&LS!!!#,'e`FfN
+!!!2S!!!!!!!!!!!!!fMk!!!!%'ecG(!!!!!#!!!!!!!!!!!!!fN+!!!!%'ecG(!
+!!!!&!!!!!!!!!!!!!&V8!!!!+'ecG'N!!!2S!!!!!!!!!!!!!fP#!!!!+'ecG'N
+!!!!!!!!!!!!!!!!!!&Vm!!!!$'eKE'`!!!!!!!!!!!!!!!!!!fE1!!!!a'eKF'`
+!!!!!!!!!!!!!!!$B03!!:
diff --git a/lib/libssl/src/MacOS/Randomizer.cpp b/lib/libssl/src/MacOS/Randomizer.cpp
new file mode 100644 (file)
index 0000000..cceb6bd
--- /dev/null
@@ -0,0 +1,476 @@
+/* 
+------- Strong random data generation on a Macintosh (pre - OS X) ------
+               
+--     GENERAL: We aim to generate unpredictable bits without explicit
+       user interaction. A general review of the problem may be found
+       in RFC 1750, "Randomness Recommendations for Security", and some
+       more discussion, of general and Mac-specific issues has appeared
+       in "Using and Creating Cryptographic- Quality Random Numbers" by
+       Jon Callas (www.merrymeet.com/jon/usingrandom.html).
+
+       The data and entropy estimates provided below are based on my
+       limited experimentation and estimates, rather than by any
+       rigorous study, and the entropy estimates tend to be optimistic.
+       They should not be considered absolute.
+
+       Some of the information being collected may be correlated in
+       subtle ways. That includes mouse positions, timings, and disk
+       size measurements. Some obvious correlations will be eliminated
+       by the programmer, but other, weaker ones may remain. The
+       reliability of the code depends on such correlations being
+       poorly understood, both by us and by potential interceptors.
+
+       This package has been planned to be used with OpenSSL, v. 0.9.5.
+       It requires the OpenSSL function RAND_add. 
+
+--     OTHER WORK: Some source code and other details have been
+       published elsewhere, but I haven't found any to be satisfactory
+       for the Mac per se:
+
+       * The Linux random number generator (by Theodore Ts'o, in
+         drivers/char/random.c), is a carefully designed open-source
+         crypto random number package. It collects data from a variety
+         of sources, including mouse, keyboard and other interrupts.
+         One nice feature is that it explicitly estimates the entropy
+         of the data it collects. Some of its features (e.g. interrupt
+         timing) cannot be reliably exported to the Mac without using
+         undocumented APIs.
+
+       * Truerand by Don P. Mitchell and Matt Blaze uses variations
+         between different timing mechanisms on the same system. This
+         has not been tested on the Mac, but requires preemptive
+         multitasking, and is hardware-dependent, and can't be relied
+         on to work well if only one oscillator is present.
+
+       * Cryptlib's RNG for the Mac (RNDMAC.C by Peter Gutmann),
+         gathers a lot of information about the machine and system
+         environment. Unfortunately, much of it is constant from one
+         startup to the next. In other words, the random seed could be
+         the same from one day to the next. Some of the APIs are
+         hardware-dependent, and not all are compatible with Carbon (OS
+         X). Incidentally, the EGD library is based on the UNIX entropy
+         gathering methods in cryptlib, and isn't suitable for MacOS
+         either.
+
+       * Mozilla (and perhaps earlier versions of Netscape) uses the
+         time of day (in seconds) and an uninitialized local variable
+         to seed the random number generator. The time of day is known
+         to an outside interceptor (to within the accuracy of the
+         system clock). The uninitialized variable could easily be
+         identical between subsequent launches of an application, if it
+         is reached through the same path.
+
+       * OpenSSL provides the function RAND_screen(), by G. van
+         Oosten, which hashes the contents of the screen to generate a
+         seed. This is not useful for an extension or for an
+         application which launches at startup time, since the screen
+         is likely to look identical from one launch to the next. This
+         method is also rather slow.
+
+       * Using variations in disk drive seek times has been proposed
+         (Davis, Ihaka and Fenstermacher, world.std.com/~dtd/;
+         Jakobsson, Shriver, Hillyer and Juels,
+         www.bell-labs.com/user/shriver/random.html). These variations
+         appear to be due to air turbulence inside the disk drive
+         mechanism, and are very strongly unpredictable. Unfortunately
+         this technique is slow, and some implementations of it may be
+         patented (see Shriver's page above.) It of course cannot be
+         used with a RAM disk.
+
+--     TIMING: On the 601 PowerPC the time base register is guaranteed
+       to change at least once every 10 addi instructions, i.e. 10
+       cycles. On a 60 MHz machine (slowest PowerPC) this translates to
+       a resolution of 1/6 usec. Newer machines seem to be using a 10
+       cycle resolution as well.
+       
+       For 68K Macs, the Microseconds() call may be used. See Develop
+       issue 29 on the Apple developer site
+       (developer.apple.com/dev/techsupport/develop/issue29/minow.html)
+       for information on its accuracy and resolution. The code below
+       has been tested only on PowerPC based machines.
+
+       The time from machine startup to the launch of an application in
+       the startup folder has a variance of about 1.6 msec on a new G4
+       machine with a defragmented and optimized disk, most extensions
+       off and no icons on the desktop. This can be reasonably taken as
+       a lower bound on the variance. Most of this variation is likely
+       due to disk seek time variability. The distribution of startup
+       times is probably not entirely even or uncorrelated. This needs
+       to be investigated, but I am guessing that it not a majpor
+       problem. Entropy = log2 (1600/0.166) ~= 13 bits on a 60 MHz
+       machine, ~16 bits for a 450 MHz machine.
+
+       User-launched application startup times will have a variance of
+       a second or more relative to machine startup time. Entropy >~22
+       bits.
+
+       Machine startup time is available with a 1-second resolution. It
+       is predictable to no better a minute or two, in the case of
+       people who show up punctually to work at the same time and
+       immediately start their computer. Using the scheduled startup
+       feature (when available) will cause the machine to start up at
+       the same time every day, making the value predictable. Entropy
+       >~7 bits, or 0 bits with scheduled startup.
+
+       The time of day is of course known to an outsider and thus has 0
+       entropy if the system clock is regularly calibrated.
+
+--     KEY TIMING: A  very fast typist (120 wpm) will have a typical
+       inter-key timing interval of 100 msec. We can assume a variance
+       of no less than 2 msec -- maybe. Do good typists have a constant
+       rhythm, like drummers? Since what we measure is not the
+       key-generated interrupt but the time at which the key event was
+       taken off the event queue, our resolution is roughly the time
+       between process switches, at best 1 tick (17 msec). I  therefore
+       consider this technique questionable and not very useful for
+       obtaining high entropy data on the Mac.
+
+--     MOUSE POSITION AND TIMING: The high bits of the mouse position
+       are far from arbitrary, since the mouse tends to stay in a few
+       limited areas of the screen. I am guessing that the position of
+       the mouse is arbitrary within a 6 pixel square. Since the mouse
+       stays still for long periods of time, it should be sampled only
+       after it was moved, to avoid correlated data. This gives an
+       entropy of log2(6*6) ~= 5 bits per measurement.
+
+       The time during which the mouse stays still can vary from zero
+       to, say, 5 seconds (occasionally longer). If the still time is
+       measured by sampling the mouse during null events, and null
+       events are received once per tick, its resolution is 1/60th of a
+       second, giving an entropy of log2 (60*5) ~= 8 bits per
+       measurement. Since the distribution of still times is uneven,
+       this estimate is on the high side.
+
+       For simplicity and compatibility across system versions, the
+       mouse is to be sampled explicitly (e.g. in the event loop),
+       rather than in a time manager task.
+
+--     STARTUP DISK TOTAL FILE SIZE: Varies typically by at least 20k
+       from one startup to the next, with 'minimal' computer use. Won't
+       vary at all if machine is started again immediately after
+       startup (unless virtual memory is on), but any application which
+       uses the web and caches information to disk is likely to cause
+       this much variation or more. The variation is probably not
+       random, but I don't know in what way. File sizes tend to be
+       divisible by 4 bytes since file format fields are often
+       long-aligned. Entropy > log2 (20000/4) ~= 12 bits.
+       
+--     STARTUP DISK FIRST AVAILABLE ALLOCATION BLOCK: As the volume
+       gets fragmented this could be anywhere in principle. In a
+       perfectly unfragmented volume this will be strongly correlated
+       with the total file size on the disk. With more fragmentation
+       comes less certainty. I took the variation in this value to be
+       1/8 of the total file size on the volume.
+
+--     SYSTEM REQUIREMENTS: The code here requires System 7.0 and above
+       (for Gestalt and Microseconds calls). All the calls used are
+       Carbon-compatible.
+*/
+
+/*------------------------------ Includes ----------------------------*/
+
+#include "Randomizer.h"
+
+// Mac OS API
+#include <Files.h>
+#include <Folders.h>
+#include <Events.h>
+#include <Processes.h>
+#include <Gestalt.h>
+#include <Resources.h>
+#include <LowMem.h>
+
+// Standard C library
+#include <stdlib.h>
+#include <math.h>
+
+/*---------------------- Function declarations -----------------------*/
+
+// declared in OpenSSL/crypto/rand/rand.h
+extern "C" void RAND_add (const void *buf, int num, double entropy);
+
+unsigned long GetPPCTimer (bool is601);        // Make it global if needed
+                                       // elsewhere
+
+/*---------------------------- Constants -----------------------------*/
+
+#define kMouseResolution 6             // Mouse position has to differ
+                                       // from the last one by this
+                                       // much to be entered
+#define kMousePositionEntropy 5.16     // log2 (kMouseResolution**2)
+#define kTypicalMouseIdleTicks 300.0   // I am guessing that a typical
+                                       // amount of time between mouse
+                                       // moves is 5 seconds
+#define kVolumeBytesEntropy 12.0       // about log2 (20000/4),
+                                       // assuming a variation of 20K
+                                       // in total file size and
+                                       // long-aligned file formats.
+#define kApplicationUpTimeEntropy 6.0  // Variance > 1 second, uptime
+                                       // in ticks  
+#define kSysStartupEntropy 7.0         // Entropy for machine startup
+                                       // time
+
+
+/*------------------------ Function definitions ----------------------*/
+
+CRandomizer::CRandomizer (void)
+{
+       long    result;
+       
+       mSupportsLargeVolumes =
+               (Gestalt(gestaltFSAttr, &result) == noErr) &&
+               ((result & (1L << gestaltFSSupports2TBVols)) != 0);
+       
+       if (Gestalt (gestaltNativeCPUtype, &result) != noErr)
+       {
+               mIsPowerPC = false;
+               mIs601 = false;
+       }
+       else
+       {
+               mIs601 = (result == gestaltCPU601);
+               mIsPowerPC = (result >= gestaltCPU601);
+       }
+       mLastMouse.h = mLastMouse.v = -10;      // First mouse will
+                                               // always be recorded
+       mLastPeriodicTicks = TickCount();
+       GetTimeBaseResolution ();
+       
+       // Add initial entropy
+       AddTimeSinceMachineStartup ();
+       AddAbsoluteSystemStartupTime ();
+       AddStartupVolumeInfo ();
+       AddFiller ();
+}
+
+void CRandomizer::PeriodicAction (void)
+{
+       AddCurrentMouse ();
+       AddNow (0.0);   // Should have a better entropy estimate here
+       mLastPeriodicTicks = TickCount();
+}
+
+/*------------------------- Private Methods --------------------------*/
+
+void CRandomizer::AddCurrentMouse (void)
+{
+       Point mouseLoc;
+       unsigned long lastCheck;        // Ticks since mouse was last
+                                       // sampled
+
+#if TARGET_API_MAC_CARBON
+       GetGlobalMouse (&mouseLoc);
+#else
+       mouseLoc = LMGetMouseLocation();
+#endif
+       
+       if (labs (mLastMouse.h - mouseLoc.h) > kMouseResolution/2 &&
+           labs (mLastMouse.v - mouseLoc.v) > kMouseResolution/2)
+               AddBytes (&mouseLoc, sizeof (mouseLoc),
+                               kMousePositionEntropy);
+       
+       if (mLastMouse.h == mouseLoc.h && mLastMouse.v == mouseLoc.v)
+               mMouseStill ++;
+       else
+       {
+               double entropy;
+               
+               // Mouse has moved. Add the number of measurements for
+               // which it's been still. If the resolution is too
+               // coarse, assume the entropy is 0.
+
+               lastCheck = TickCount() - mLastPeriodicTicks;
+               if (lastCheck <= 0)
+                       lastCheck = 1;
+               entropy = log2l
+                       (kTypicalMouseIdleTicks/(double)lastCheck);
+               if (entropy < 0.0)
+                       entropy = 0.0;
+               AddBytes (&mMouseStill, sizeof (mMouseStill), entropy);
+               mMouseStill = 0;
+       }
+       mLastMouse = mouseLoc;
+}
+
+void CRandomizer::AddAbsoluteSystemStartupTime (void)
+{
+       unsigned long   now;            // Time in seconds since
+                                       // 1/1/1904
+       GetDateTime (&now);
+       now -= TickCount() / 60;        // Time in ticks since machine
+                                       // startup
+       AddBytes (&now, sizeof (now), kSysStartupEntropy);
+}
+
+void CRandomizer::AddTimeSinceMachineStartup (void)
+{
+       AddNow (1.5);                   // Uncertainty in app startup
+                                       // time is > 1.5 msec (for
+                                       // automated app startup).
+}
+
+void CRandomizer::AddAppRunningTime (void)
+{
+       ProcessSerialNumber PSN;
+       ProcessInfoRec          ProcessInfo;
+       
+       ProcessInfo.processInfoLength = sizeof (ProcessInfoRec);
+       ProcessInfo.processName = nil;
+       ProcessInfo.processAppSpec = nil;
+       
+       GetCurrentProcess (&PSN);
+       GetProcessInformation (&PSN, &ProcessInfo);
+
+       // Now add the amount of time in ticks that the current process
+       // has been active
+
+       AddBytes (&ProcessInfo, sizeof (ProcessInfoRec),
+                       kApplicationUpTimeEntropy);
+}
+
+void CRandomizer::AddStartupVolumeInfo (void)
+{
+       short                   vRefNum;
+       long                    dirID;
+       XVolumeParam    pb;
+       OSErr                   err;
+       
+       if (!mSupportsLargeVolumes)
+               return;
+               
+       FindFolder (kOnSystemDisk, kSystemFolderType, kDontCreateFolder,
+                       &vRefNum, &dirID);
+       pb.ioVRefNum = vRefNum;
+       pb.ioCompletion = 0;
+       pb.ioNamePtr = 0;
+       pb.ioVolIndex = 0;
+       err = PBXGetVolInfoSync (&pb);
+       if (err != noErr)
+               return;
+               
+       // Base the entropy on the amount of space used on the disk and
+       // on the next available allocation block. A lot else might be
+       // unpredictable, so might as well toss the whole block in. See
+       // comments for entropy estimate justifications.
+
+       AddBytes (&pb, sizeof (pb),
+               kVolumeBytesEntropy +
+               log2l (((pb.ioVTotalBytes.hi - pb.ioVFreeBytes.hi)
+                               * 4294967296.0D +
+                       (pb.ioVTotalBytes.lo - pb.ioVFreeBytes.lo))
+                               / pb.ioVAlBlkSiz - 3.0));
+}
+
+/*
+       On a typical startup CRandomizer will come up with about 60
+       bits of good, unpredictable data. Assuming no more input will
+       be available, we'll need some more lower-quality data to give
+       OpenSSL the 128 bits of entropy it desires. AddFiller adds some
+       relatively predictable data into the soup.
+*/
+
+void CRandomizer::AddFiller (void)
+{
+       struct
+       {
+               ProcessSerialNumber psn;        // Front process serial
+                                               // number
+               RGBColor        hiliteRGBValue; // User-selected
+                                               // highlight color
+               long            processCount;   // Number of active
+                                               // processes
+               long            cpuSpeed;       // Processor speed
+               long            totalMemory;    // Total logical memory
+                                               // (incl. virtual one)
+               long            systemVersion;  // OS version
+               short           resFile;        // Current resource file
+       } data;
+       
+       GetNextProcess ((ProcessSerialNumber*) kNoProcess);
+       while (GetNextProcess (&data.psn) == noErr)
+               data.processCount++;
+       GetFrontProcess (&data.psn);
+       LMGetHiliteRGB (&data.hiliteRGBValue);
+       Gestalt (gestaltProcClkSpeed, &data.cpuSpeed);
+       Gestalt (gestaltLogicalRAMSize, &data.totalMemory);
+       Gestalt (gestaltSystemVersion, &data.systemVersion);
+       data.resFile = CurResFile ();
+       
+       // Here we pretend to feed the PRNG completely random data. This
+       // is of course false, as much of the above data is predictable
+       // by an outsider. At this point we don't have any more
+       // randomness to add, but with OpenSSL we must have a 128 bit
+       // seed before we can start. We just add what we can, without a
+       // real entropy estimate, and hope for the best.
+
+       AddBytes (&data, sizeof(data), 8.0 * sizeof(data));
+       AddCurrentMouse ();
+       AddNow (1.0);
+}
+
+//-------------------  LOW LEVEL ---------------------
+
+void CRandomizer::AddBytes (void *data, long size, double entropy)
+{
+       RAND_add (data, size, entropy * 0.125); // Convert entropy bits
+                                               // to bytes
+}
+
+void CRandomizer::AddNow (double millisecondUncertainty)
+{
+       long time = SysTimer();
+       AddBytes (&time, sizeof (time), log2l (millisecondUncertainty *
+                       mTimebaseTicksPerMillisec));
+}
+
+//----------------- TIMING SUPPORT ------------------
+
+void CRandomizer::GetTimeBaseResolution (void)
+{      
+#ifdef __powerc
+       long speed;
+       
+       // gestaltProcClkSpeed available on System 7.5.2 and above
+       if (Gestalt (gestaltProcClkSpeed, &speed) != noErr)
+               // Only PowerPCs running pre-7.5.2 are 60-80 MHz
+               // machines.
+               mTimebaseTicksPerMillisec =  6000.0D;
+       // Assume 10 cycles per clock update, as in 601 spec. Seems true
+       // for later chips as well.
+       mTimebaseTicksPerMillisec = speed / 1.0e4D;
+#else
+       // 68K VIA-based machines (see Develop Magazine no. 29)
+       mTimebaseTicksPerMillisec = 783.360D;
+#endif
+}
+
+unsigned long CRandomizer::SysTimer (void)     // returns the lower 32
+                                               // bit of the chip timer
+{
+#ifdef __powerc
+       return GetPPCTimer (mIs601);
+#else
+       UnsignedWide usec;
+       Microseconds (&usec);
+       return usec.lo;
+#endif
+}
+
+#ifdef __powerc
+// The timebase is available through mfspr on 601, mftb on later chips.
+// Motorola recommends that an 601 implementation map mftb to mfspr
+// through an exception, but I haven't tested to see if MacOS actually
+// does this. We only sample the lower 32 bits of the timer (i.e. a
+// few minutes of resolution)
+
+asm unsigned long GetPPCTimer (register bool is601)
+{
+       cmplwi  is601, 0        // Check if 601
+       bne     _601            // if non-zero goto _601
+       mftb    r3              // Available on 603 and later.
+       blr                     // return with result in r3
+_601:
+       mfspr r3, spr5          // Available on 601 only.
+                               // blr inserted automatically
+}
+#endif
diff --git a/lib/libssl/src/MacOS/Randomizer.h b/lib/libssl/src/MacOS/Randomizer.h
new file mode 100644 (file)
index 0000000..565537b
--- /dev/null
@@ -0,0 +1,43 @@
+
+//     Gathers unpredictable system data to be used for generating
+//     random bits
+
+#include <MacTypes.h>
+
+class CRandomizer
+{
+public:
+       CRandomizer (void);
+       void PeriodicAction (void);
+       
+private:
+
+       // Private calls
+
+       void            AddTimeSinceMachineStartup (void);
+       void            AddAbsoluteSystemStartupTime (void);
+       void            AddAppRunningTime (void);
+       void            AddStartupVolumeInfo (void);
+       void            AddFiller (void);
+
+       void            AddCurrentMouse (void);
+       void            AddNow (double millisecondUncertainty);
+       void            AddBytes (void *data, long size, double entropy);
+       
+       void            GetTimeBaseResolution (void);
+       unsigned long   SysTimer (void);
+
+       // System Info  
+       bool            mSupportsLargeVolumes;
+       bool            mIsPowerPC;
+       bool            mIs601;
+       
+       // Time info
+       double          mTimebaseTicksPerMillisec;
+       unsigned long   mLastPeriodicTicks;
+       
+       // Mouse info
+       long            mSamplePeriod;
+       Point           mLastMouse;
+       long            mMouseStill;
+};
index beebee7..4eef57e 100644 (file)
@@ -1,4 +1,4 @@
-#!/sw/bin/perl
+#!/usr/local/bin/perl
 #
 # CA - wrapper around ca to make it easier to use ... basically ca requires
 #      some setup stuff to be done before you can use it and this makes
index f97154b..c7373f7 100644 (file)
@@ -38,7 +38,7 @@ E_EXE=        verify asn1pars req dgst dh dhparam enc passwd gendh errstr \
        ca crl rsa dsa dsaparam \
        x509 genrsa gendsa s_server s_client speed \
        s_time version pkcs7 crl2pkcs7 sess_id ciphers nseq pkcs12 \
-       pkcs8 spkac smime
+       pkcs8 spkac smime rand
 
 PROGS= $(PROGRAM).c
 
@@ -54,18 +54,14 @@ E_OBJ=      verify.o asn1pars.o req.o dgst.o dh.o dhparam.o enc.o passwd.o gendh.o er
        rsa.o dsa.o dsaparam.o \
        x509.o genrsa.o gendsa.o s_server.o s_client.o speed.o \
        s_time.o $(A_OBJ) $(S_OBJ) $(RAND_OBJ) version.o sess_id.o \
-       ciphers.o nseq.o pkcs12.o pkcs8.o spkac.o smime.o
-
-#      pem_mail.o
+       ciphers.o nseq.o pkcs12.o pkcs8.o spkac.o smime.o rand.o
 
 E_SRC= verify.c asn1pars.c req.c dgst.c dh.c enc.c passwd.c gendh.c errstr.c ca.c \
        pkcs7.c crl2p7.c crl.c \
        rsa.c dsa.c dsaparam.c \
        x509.c genrsa.c gendsa.c s_server.c s_client.c speed.c \
        s_time.c $(A_SRC) $(S_SRC) $(RAND_SRC) version.c sess_id.c \
-       ciphers.c nseq.c pkcs12.c pkcs8.c spkac.c smime.c
-
-#      pem_mail.c
+       ciphers.c nseq.c pkcs12.c pkcs8.c spkac.c smime.c rand.c
 
 SRC=$(E_SRC)
 
@@ -537,6 +533,23 @@ pkcs8.o: ../include/openssl/ripemd.h ../include/openssl/rsa.h
 pkcs8.o: ../include/openssl/safestack.h ../include/openssl/sha.h
 pkcs8.o: ../include/openssl/stack.h ../include/openssl/x509.h
 pkcs8.o: ../include/openssl/x509_vfy.h apps.h
+rand.o: ../include/openssl/asn1.h ../include/openssl/bio.h
+rand.o: ../include/openssl/blowfish.h ../include/openssl/bn.h
+rand.o: ../include/openssl/buffer.h ../include/openssl/cast.h
+rand.o: ../include/openssl/crypto.h ../include/openssl/des.h
+rand.o: ../include/openssl/dh.h ../include/openssl/dsa.h
+rand.o: ../include/openssl/e_os.h ../include/openssl/e_os2.h
+rand.o: ../include/openssl/err.h ../include/openssl/evp.h
+rand.o: ../include/openssl/idea.h ../include/openssl/md2.h
+rand.o: ../include/openssl/md5.h ../include/openssl/mdc2.h
+rand.o: ../include/openssl/objects.h ../include/openssl/opensslconf.h
+rand.o: ../include/openssl/opensslv.h ../include/openssl/pkcs7.h
+rand.o: ../include/openssl/rand.h ../include/openssl/rc2.h
+rand.o: ../include/openssl/rc4.h ../include/openssl/rc5.h
+rand.o: ../include/openssl/ripemd.h ../include/openssl/rsa.h
+rand.o: ../include/openssl/safestack.h ../include/openssl/sha.h
+rand.o: ../include/openssl/stack.h ../include/openssl/x509.h
+rand.o: ../include/openssl/x509_vfy.h apps.h
 req.o: ../include/openssl/asn1.h ../include/openssl/bio.h
 req.o: ../include/openssl/blowfish.h ../include/openssl/bn.h
 req.o: ../include/openssl/buffer.h ../include/openssl/cast.h
@@ -734,11 +747,12 @@ speed.o: ./testrsa.h apps.h
 spkac.o: ../include/openssl/asn1.h ../include/openssl/bio.h
 spkac.o: ../include/openssl/blowfish.h ../include/openssl/bn.h
 spkac.o: ../include/openssl/buffer.h ../include/openssl/cast.h
-spkac.o: ../include/openssl/crypto.h ../include/openssl/des.h
-spkac.o: ../include/openssl/dh.h ../include/openssl/dsa.h
-spkac.o: ../include/openssl/e_os.h ../include/openssl/e_os2.h
-spkac.o: ../include/openssl/err.h ../include/openssl/evp.h
-spkac.o: ../include/openssl/idea.h ../include/openssl/md2.h
+spkac.o: ../include/openssl/conf.h ../include/openssl/crypto.h
+spkac.o: ../include/openssl/des.h ../include/openssl/dh.h
+spkac.o: ../include/openssl/dsa.h ../include/openssl/e_os.h
+spkac.o: ../include/openssl/e_os2.h ../include/openssl/err.h
+spkac.o: ../include/openssl/evp.h ../include/openssl/idea.h
+spkac.o: ../include/openssl/lhash.h ../include/openssl/md2.h
 spkac.o: ../include/openssl/md5.h ../include/openssl/mdc2.h
 spkac.o: ../include/openssl/objects.h ../include/openssl/opensslconf.h
 spkac.o: ../include/openssl/opensslv.h ../include/openssl/pem.h
index f7f1338..1146f9f 100644 (file)
@@ -56,7 +56,7 @@
  * [including the GNU Public Licence.]
  */
 /* ====================================================================
- * Copyright (c) 1998-1999 The OpenSSL Project.  All rights reserved.
+ * Copyright (c) 1998-2000 The OpenSSL Project.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  *
  */
 
+#define NON_MAIN
 #include "apps.h"
+#undef NON_MAIN
 #include <openssl/bio.h>
 #include <openssl/rand.h>
 
@@ -162,7 +164,7 @@ long app_RAND_load_files(char *name)
        char *p,*n;
        int last;
        long tot=0;
-    int egd;
+       int egd;
        
        for (;;)
                {
@@ -174,9 +176,9 @@ long app_RAND_load_files(char *name)
                name=p+1;
                if (*n == '\0') break;
 
-        egd=RAND_egd(n);
+               egd=RAND_egd(n);
                if (egd > 0) tot+=egd;
-               tot+=RAND_load_file(n,1024L*1024L);
+               tot+=RAND_load_file(n,-1);
                if (last) break;
                }
        if (tot > 512)
index e22beda..73df13f 100644 (file)
@@ -1662,7 +1662,7 @@ again2:
                                        }
                                if (j < 0)
                                        {
-                                       BIO_printf(bio_err,"The %s field needed to be the same in the\nCA certificate (%s) and the request (%s)\n",cv->name,((str == NULL)?"NULL":(char *)str->data),((str2 == NULL)?"NULL":(char *)str2->data));
+                                       BIO_printf(bio_err,"The %s field needed to be the same in the\nCA certificate (%s) and the request (%s)\n",cv->name,((str2 == NULL)?"NULL":(char *)str2->data),((str == NULL)?"NULL":(char *)str->data));
                                        goto err;
                                        }
                                }
index b3c20e2..674963f 100644 (file)
@@ -1,4 +1,5 @@
 /* apps/dh.c */
+/* obsoleted by dhparam.c */
 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
@@ -234,8 +235,8 @@ bad:
                        }
                if (i & DH_CHECK_P_NOT_PRIME)
                        printf("p value is not prime\n");
-               if (i & DH_CHECK_P_NOT_STRONG_PRIME)
-                       printf("p value is not a strong prime\n");
+               if (i & DH_CHECK_P_NOT_SAFE_PRIME)
+                       printf("p value is not a safe prime\n");
                if (i & DH_UNABLE_TO_CHECK_GENERATOR)
                        printf("unable to check the generator value\n");
                if (i & DH_NOT_SUITABLE_GENERATOR)
index 293a400..709547f 100644 (file)
  * copied and put under another distribution licence
  * [including the GNU Public Licence.]
  */
+/* ====================================================================
+ * Copyright (c) 1998-2000 The OpenSSL Project.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer. 
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. All advertising materials mentioning features or use of this
+ *    software must display the following acknowledgment:
+ *    "This product includes software developed by the OpenSSL Project
+ *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
+ *
+ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
+ *    endorse or promote products derived from this software without
+ *    prior written permission. For written permission, please contact
+ *    openssl-core@openssl.org.
+ *
+ * 5. Products derived from this software may not be called "OpenSSL"
+ *    nor may "OpenSSL" appear in their names without prior written
+ *    permission of the OpenSSL Project.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ *    acknowledgment:
+ *    "This product includes software developed by the OpenSSL Project
+ *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This product includes cryptographic software written by Eric Young
+ * (eay@cryptsoft.com).  This product includes software written by Tim
+ * Hudson (tjh@cryptsoft.com).
+ *
+ */
 
 #ifndef NO_DH
 #include <stdio.h>
 #include <openssl/x509.h>
 #include <openssl/pem.h>
 
+#ifndef NO_DSA
+#include <openssl/dsa.h>
+#endif
+
 #undef PROG
 #define PROG   dhparam_main
 
  * -outform arg - output format - default PEM
  * -in arg     - input file - default stdin
  * -out arg    - output file - default stdout
+ * -dsaparam  - read or generate DSA parameters, convert to DH
  * -check      - check the parameters are ok
  * -noout
  * -text
@@ -92,6 +150,9 @@ int MAIN(int argc, char **argv)
        {
        DH *dh=NULL;
        int i,badops=0,text=0;
+#ifndef NO_DSA
+       int dsaparam=0;
+#endif
        BIO *in=NULL,*out=NULL;
        int informat,outformat,check=0,noout=0,C=0,ret=1;
        char *infile,*outfile,*prog;
@@ -138,6 +199,10 @@ int MAIN(int argc, char **argv)
                        check=1;
                else if (strcmp(*argv,"-text") == 0)
                        text=1;
+#ifndef NO_DSA
+               else if (strcmp(*argv,"-dsaparam") == 0)
+                       dsaparam=1;
+#endif
                else if (strcmp(*argv,"-C") == 0)
                        C=1;
                else if (strcmp(*argv,"-noout") == 0)
@@ -166,13 +231,16 @@ bad:
                BIO_printf(bio_err," -outform arg  output format - one of DER PEM\n");
                BIO_printf(bio_err," -in arg       input file\n");
                BIO_printf(bio_err," -out arg      output file\n");
+#ifndef NO_DSA
+               BIO_printf(bio_err," -dsaparam     read or generate DSA parameters, convert to DH\n");
+#endif
                BIO_printf(bio_err," -check        check the DH parameters\n");
                BIO_printf(bio_err," -text         print a text form of the DH parameters\n");
                BIO_printf(bio_err," -C            Output C code\n");
                BIO_printf(bio_err," -2            generate parameters using  2 as the generator value\n");
                BIO_printf(bio_err," -5            generate parameters using  5 as the generator value\n");
                BIO_printf(bio_err," numbits       number of bits in to generate (default 512)\n");
-               BIO_printf(bio_err," -rand file:file:...\n");
+               BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
                BIO_printf(bio_err,"               - load the file (or the files in the directory) into\n");
                BIO_printf(bio_err,"               the random number generator\n");
                BIO_printf(bio_err," -noout        no output\n");
@@ -181,8 +249,25 @@ bad:
 
        ERR_load_crypto_strings();
 
-       if(g && !num) num = DEFBITS;
-       else if(num && !g) g = 2;
+       if (g && !num)
+               num = DEFBITS;
+
+#ifndef NO_DSA
+       if (dsaparam)
+               {
+               if (g)
+                       {
+                       BIO_printf(bio_err, "generator may not be chosen for DSA parameters\n");
+                       goto end;
+                       }
+               }
+       else
+#endif
+               {
+               /* DH parameters */
+               if (num && !g)
+                       g = 2;
+               }
 
        if(num) {
 
@@ -194,11 +279,40 @@ bad:
                        BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
                                app_RAND_load_files(inrand));
 
-               BIO_printf(bio_err,"Generating DH parameters, %d bit long strong prime, generator of %d\n",num,g);
-               BIO_printf(bio_err,"This is going to take a long time\n");
-               dh=DH_generate_parameters(num,g,dh_cb,bio_err);
+#ifndef NO_DSA
+               if (dsaparam)
+                       {
+                       DSA *dsa;
                        
-               if (dh == NULL) goto end;
+                       BIO_printf(bio_err,"Generating DSA parameters, %d bit long prime\n",num);
+               dsa = DSA_generate_parameters(num, NULL, 0, NULL, NULL, dh_cb, bio_err);
+                       if (dsa == NULL)
+                               {
+                               ERR_print_errors(bio_err);
+                               goto end;
+                               }
+
+                       dh = DSA_dup_DH(dsa);
+                       DSA_free(dsa);
+                       if (dh == NULL)
+                               {
+                               ERR_print_errors(bio_err);
+                               goto end;
+                               }
+                       }
+               else
+#endif
+                       {
+                       BIO_printf(bio_err,"Generating DH parameters, %d bit long safe prime, generator %d\n",num,g);
+                       BIO_printf(bio_err,"This is going to take a long time\n");
+                       dh=DH_generate_parameters(num,g,dh_cb,bio_err);
+                       
+                       if (dh == NULL)
+                               {
+                               ERR_print_errors(bio_err);
+                               goto end;
+                               }
+                       }
 
                app_RAND_write_file(NULL, bio_err);
        } else {
@@ -220,24 +334,56 @@ bad:
                                }
                        }
 
-               if      (informat == FORMAT_ASN1)
-                       dh=d2i_DHparams_bio(in,NULL);
-               else if (informat == FORMAT_PEM)
-                       dh=PEM_read_bio_DHparams(in,NULL,NULL,NULL);
-               else
+               if      (informat != FORMAT_ASN1 && informat != FORMAT_PEM)
                        {
                        BIO_printf(bio_err,"bad input format specified\n");
                        goto end;
                        }
-               if (dh == NULL)
+
+#ifndef NO_DSA
+               if (dsaparam)
                        {
-                       BIO_printf(bio_err,"unable to load DH parameters\n");
-                       ERR_print_errors(bio_err);
-                       goto end;
+                       DSA *dsa;
+                       
+                       if (informat == FORMAT_ASN1)
+                               dsa=d2i_DSAparams_bio(in,NULL);
+                       else /* informat == FORMAT_PEM */
+                               dsa=PEM_read_bio_DSAparams(in,NULL,NULL,NULL);
+                       
+                       if (dsa == NULL)
+                               {
+                               BIO_printf(bio_err,"unable to load DSA parameters\n");
+                               ERR_print_errors(bio_err);
+                               goto end;
+                               }
+                       
+                       dh = DSA_dup_DH(dsa);
+                       DSA_free(dsa);
+                       if (dh == NULL)
+                               {
+                               ERR_print_errors(bio_err);
+                               goto end;
+                               }
                        }
-
+               else
+#endif
+                       {
+                       if (informat == FORMAT_ASN1)
+                               dh=d2i_DHparams_bio(in,NULL);
+                       else /* informat == FORMAT_PEM */
+                               dh=PEM_read_bio_DHparams(in,NULL,NULL,NULL);
+                       
+                       if (dh == NULL)
+                               {
+                               BIO_printf(bio_err,"unable to load DH parameters\n");
+                               ERR_print_errors(bio_err);
+                               goto end;
+                               }
+                       }
+               
+               /* dh != NULL */
        }
-
+       
        out=BIO_new(BIO_s_file());
        if (out == NULL)
                {
@@ -255,7 +401,6 @@ bad:
                        }
                }
 
-       
 
        if (text)
                {
@@ -271,8 +416,8 @@ bad:
                        }
                if (i & DH_CHECK_P_NOT_PRIME)
                        printf("p value is not prime\n");
-               if (i & DH_CHECK_P_NOT_STRONG_PRIME)
-                       printf("p value is not a strong prime\n");
+               if (i & DH_CHECK_P_NOT_SAFE_PRIME)
+                       printf("p value is not a safe prime\n");
                if (i & DH_UNABLE_TO_CHECK_GENERATOR)
                        printf("unable to check the generator value\n");
                if (i & DH_NOT_SUITABLE_GENERATOR)
@@ -293,25 +438,29 @@ bad:
                        perror("Malloc");
                        goto end;
                        }
+               printf("#ifndef HEADER_DH_H\n"
+                      "#include <openssl/dh.h>\n"
+                      "#endif\n");
+               printf("DH *get_dh%d()\n\t{\n",bits);
+
                l=BN_bn2bin(dh->p,data);
-               printf("static unsigned char dh%d_p[]={",bits);
+               printf("\tstatic unsigned char dh%d_p[]={",bits);
                for (i=0; i<l; i++)
                        {
-                       if ((i%12) == 0) printf("\n\t");
+                       if ((i%12) == 0) printf("\n\t\t");
                        printf("0x%02X,",data[i]);
                        }
-               printf("\n\t};\n");
+               printf("\n\t\t};\n");
 
                l=BN_bn2bin(dh->g,data);
-               printf("static unsigned char dh%d_g[]={",bits);
+               printf("\tstatic unsigned char dh%d_g[]={",bits);
                for (i=0; i<l; i++)
                        {
-                       if ((i%12) == 0) printf("\n\t");
+                       if ((i%12) == 0) printf("\n\t\t");
                        printf("0x%02X,",data[i]);
                        }
-               printf("\n\t};\n\n");
+               printf("\n\t\t};\n");
 
-               printf("DH *get_dh%d()\n\t{\n",bits);
                printf("\tDH *dh;\n\n");
                printf("\tif ((dh=DH_new()) == NULL) return(NULL);\n");
                printf("\tdh->p=BN_bin2bn(dh%d_p,sizeof(dh%d_p),NULL);\n",
@@ -319,7 +468,9 @@ bad:
                printf("\tdh->g=BN_bin2bn(dh%d_g,sizeof(dh%d_g),NULL);\n",
                        bits,bits);
                printf("\tif ((dh->p == NULL) || (dh->g == NULL))\n");
-               printf("\t\treturn(NULL);\n");
+               printf("\t\t{ DH_free(dh); return(NULL); }\n");
+               if (dh->length)
+                       printf("\tdh->length = %d;\n", dh->length);
                printf("\treturn(dh);\n\t}\n");
                Free(data);
                }
@@ -350,6 +501,7 @@ end:
        EXIT(ret);
        }
 
+/* dh_cb is identical to dsa_cb in apps/dsaparam.c */
 static void MS_CALLBACK dh_cb(int p, int n, void *arg)
        {
        char c='*';
index a84aa38..e69de29 100644 (file)
@@ -1,131 +0,0 @@
-/* apps/eay.c */
-/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
- * All rights reserved.
- *
- * This package is an SSL implementation written
- * by Eric Young (eay@cryptsoft.com).
- * The implementation was written so as to conform with Netscapes SSL.
- * 
- * This library is free for commercial and non-commercial use as long as
- * the following conditions are aheared to.  The following conditions
- * apply to all code found in this distribution, be it the RC4, RSA,
- * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
- * included with this distribution is covered by the same copyright terms
- * except that the holder is Tim Hudson (tjh@cryptsoft.com).
- * 
- * Copyright remains Eric Young's, and as such any Copyright notices in
- * the code are not to be removed.
- * If this package is used in a product, Eric Young should be given attribution
- * as the author of the parts of the library used.
- * This can be in the form of a textual message at program startup or
- * in documentation (online or textual) provided with the package.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *    "This product includes cryptographic software written by
- *     Eric Young (eay@cryptsoft.com)"
- *    The word 'cryptographic' can be left out if the rouines from the library
- *    being used are not cryptographic related :-).
- * 4. If you include any Windows specific code (or a derivative thereof) from 
- *    the apps directory (application code) you must include an acknowledgement:
- *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
- * 
- * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * 
- * The licence and distribution terms for any publically available version or
- * derivative of this code cannot be changed.  i.e. this code cannot simply be
- * copied and put under another distribution licence
- * [including the GNU Public Licence.]
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#define MONOLITH
-#define USE_SOCKETS
-
-#include "openssl/e_os.h"
-
-#include <openssl/bio.h>
-#include <openssl/stack.h>
-#include <openssl/lhash.h>
-
-#include <openssl/err.h>
-
-#include <openssl/bn.h>
-
-#include <openssl/evp.h>
-
-#include <openssl/rand.h>
-#include <openssl/conf.h>
-#include <openssl/txt_db.h>
-
-#include <openssl/err.h>
-
-#include <openssl/x509.h>
-#include <openssl/pkcs7.h>
-#include <openssl/pem.h>
-#include <openssl/asn1.h>
-#include <openssl/objects.h>
-
-#define MONOLITH
-
-#include "openssl.c"
-#include "apps.c"
-#include "asn1pars.c"
-#ifndef NO_RSA
-#include "ca.c"
-#include "genrsa.c"
-#include "req.c"
-#include "rsa.c"
-#endif
-#ifndef NO_DH
-#include "gendh.c"
-#include "dh.c"
-#endif
-#include "crl.c"
-#include "crl2p7.c"
-#include "dgst.c"
-#include "enc.c"
-#include "errstr.c"
-#if !defined(NO_SSL2) || !defined(NO_SSL3)
-#ifndef NO_SOCK
-#include "s_cb.c"
-#include "s_client.c"
-#include "s_server.c"
-#include "s_socket.c"
-#include "s_time.c"
-#endif
-#endif
-#include "speed.c"
-#include "verify.c"
-#include "version.c"
-#include "x509.c"
-#include "ciphers.c"
-#include "sess_id.c"
-#include "pkcs7.c"
-#ifndef NO_DSA
-#include "dsaparam.c"
-#include "dsa.c"
-#include "gendsa.c"
-#endif
-
index 1f6be96..caf5e8d 100644 (file)
@@ -1,4 +1,5 @@
 /* apps/gendh.c */
+/* obsoleted by dhparam.c */
 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
@@ -127,7 +128,7 @@ bad:
                BIO_printf(bio_err," -2    use 2 as the generator value\n");
        /*      BIO_printf(bio_err," -3    use 3 as the generator value\n"); */
                BIO_printf(bio_err," -5    use 5 as the generator value\n");
-               BIO_printf(bio_err," -rand file:file:...\n");
+               BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
                BIO_printf(bio_err,"           - load the file (or the files in the directory) into\n");
                BIO_printf(bio_err,"             the random number generator\n");
                goto end;
@@ -159,7 +160,7 @@ bad:
                BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
                        app_RAND_load_files(inrand));
 
-       BIO_printf(bio_err,"Generating DH parameters, %d bit long strong prime, generator of %d\n",num,g);
+       BIO_printf(bio_err,"Generating DH parameters, %d bit long safe prime, generator %d\n",num,g);
        BIO_printf(bio_err,"This is going to take a long time\n");
        dh=DH_generate_parameters(num,g,dh_cb,bio_err);
                
index d69a93d..b1a1c4f 100644 (file)
@@ -145,7 +145,7 @@ bad:
 #ifndef NO_IDEA
                BIO_printf(bio_err," -idea     - encrypt the generated key with IDEA in cbc mode\n");
 #endif
-               BIO_printf(bio_err," -rand file:file:...\n");
+               BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
                BIO_printf(bio_err,"           - load the file (or the files in the directory) into\n");
                BIO_printf(bio_err,"             the random number generator\n");
                BIO_printf(bio_err," dsaparam-file\n");
index dc63ff0..6fe578d 100644 (file)
@@ -154,7 +154,7 @@ bad:
                BIO_printf(bio_err," -passout arg    output file pass phrase source\n");
                BIO_printf(bio_err," -f4             use F4 (0x10001) for the E value\n");
                BIO_printf(bio_err," -3              use 3 for the E value\n");
-               BIO_printf(bio_err," -rand file:file:...\n");
+               BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
                BIO_printf(bio_err,"                 load the file (or the files in the directory) into\n");
                BIO_printf(bio_err,"                 the random number generator\n");
                goto err;
index 5ef6a89..94acbf8 100644 (file)
@@ -157,13 +157,13 @@ $ LIB_FILES = "VERIFY;ASN1PARS;REQ;DGST;DH;DHPARAM;ENC;PASSWD;GENDH;ERRSTR;"+-
              "RSA;DSA;DSAPARAM;"+-
              "X509;GENRSA;GENDSA;S_SERVER;S_CLIENT;SPEED;"+-
              "S_TIME;APPS;S_CB;S_SOCKET;APP_RAND;VERSION;SESS_ID;"+-
-             "CIPHERS;NSEQ;PKCS12;PKCS8;SPKAC;SMIME"
+             "CIPHERS;NSEQ;PKCS12;PKCS8;SPKAC;SMIME;RAND"
 $ APP_FILES := OPENSSL,'OBJ_DIR'VERIFY.OBJ,ASN1PARS.OBJ,REQ.OBJ,DGST.OBJ,DH.OBJ,DHPARAM.OBJ,ENC.OBJ,PASSWD.OBJ,GENDH.OBJ,ERRSTR.OBJ,-
               CA.OBJ,PKCS7.OBJ,CRL2P7.OBJ,CRL.OBJ,-
               RSA.OBJ,DSA.OBJ,DSAPARAM.OBJ,-
               X509.OBJ,GENRSA.OBJ,GENDSA.OBJ,S_SERVER.OBJ,S_CLIENT.OBJ,SPEED.OBJ,-
               S_TIME.OBJ,APPS.OBJ,S_CB.OBJ,S_SOCKET.OBJ,APP_RAND.OBJ,VERSION.OBJ,SESS_ID.OBJ,-
-              CIPHERS.OBJ,NSEQ.OBJ,PKCS12.OBJ,PKCS8.OBJ,SPKAC.OBJ,SMIME.OBJ
+              CIPHERS.OBJ,NSEQ.OBJ,PKCS12.OBJ,PKCS8.OBJ,SPKAC.OBJ,SMIME.OBJ,RAND.OBJ
 $ TCPIP_PROGRAMS = ",,"
 $ IF COMPILER .EQS. "VAXC" THEN -
      TCPIP_PROGRAMS = ",OPENSSL,"
index 748c6ce..a2a2630 100644 (file)
  * [including the GNU Public Licence.]
  */
 
-#ifndef DEBUG
-#undef DEBUG
-#endif
-
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
+#define OPENSSL_C /* tells apps.h to use complete apps_startup() */
 #include <openssl/bio.h>
 #include <openssl/crypto.h>
 #include <openssl/lhash.h>
 #include <openssl/pem.h>
 #include <openssl/ssl.h>
 #define USE_SOCKETS /* needed for the _O_BINARY defs in the MS world */
-#define OPENSSL_C /* tells apps.h to use complete apps_startup() */
 #include "apps.h"
 #include "progs.h"
 #include "s_apps.h"
 #include <openssl/err.h>
 
-/*
-#ifdef WINDOWS
-#include "bss_file.c"
-#endif
-*/
-
 static unsigned long MS_CALLBACK hash(FUNCTION *a);
 static int MS_CALLBACK cmp(FUNCTION *a,FUNCTION *b);
 static LHASH *prog_init(void );
@@ -90,15 +80,6 @@ static int do_cmd(LHASH *prog,int argc,char *argv[]);
 LHASH *config=NULL;
 char *default_config_file=NULL;
 
-#ifdef DEBUG
-static void sig_stop(int i)
-       {
-       char *a=NULL;
-
-       *a='\0';
-       }
-#endif
-
 /* Make sure there is only one when MONOLITH is defined */
 #ifdef MONOLITH
 BIO *bio_err=NULL;
@@ -120,15 +101,6 @@ int main(int Argc, char *Argv[])
        arg.data=NULL;
        arg.count=0;
 
-#if defined(DEBUG) && !defined(WINDOWS) && !defined(MSDOS)
-#ifdef SIGBUS
-       signal(SIGBUS,sig_stop);
-#endif
-#ifdef SIGSEGV
-       signal(SIGSEGV,sig_stop);
-#endif
-#endif
-
        CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
 
        apps_startup();
@@ -234,13 +206,7 @@ end:
 
        EVP_cleanup();
        ERR_free_strings();
-
-#ifdef LEVITTE_DEBUG
-       CRYPTO_push_info("Just to make sure I get a memory leak I can see :-)");
-       (void)Malloc(1024);
-       CRYPTO_pop_info();
-#endif
-
+       
        CRYPTO_mem_leaks(bio_err);
        if (bio_err != NULL)
                {
@@ -267,6 +233,18 @@ static int do_cmd(LHASH *prog, int argc, char *argv[])
                {
                ret=fp->func(argc,argv);
                }
+       else if ((strncmp(argv[0],"no-",3)) == 0)
+               {
+               BIO *bio_stdout = BIO_new_fp(stdout,BIO_NOCLOSE);
+               f.name=argv[0]+3;
+               ret = (lh_retrieve(prog,&f) != NULL);
+               if (!ret)
+                       BIO_printf(bio_stdout, "%s\n", argv[0]);
+               else
+                       BIO_printf(bio_stdout, "%s\n", argv[0]+3);
+               BIO_free(bio_stdout);
+               goto end;
+               }
        else if ((strcmp(argv[0],"quit") == 0) ||
                (strcmp(argv[0],"q") == 0) ||
                (strcmp(argv[0],"exit") == 0) ||
index d535a71..bf76864 100644 (file)
@@ -265,7 +265,7 @@ int MAIN(int argc, char **argv)
        BIO_printf (bio_err, "-password p   set import/export password source\n");
        BIO_printf (bio_err, "-passin p     input file pass phrase source\n");
        BIO_printf (bio_err, "-passout p    output file pass phrase source\n");
-       BIO_printf(bio_err,  "-rand file:file:...\n");
+       BIO_printf(bio_err,  "-rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
        BIO_printf(bio_err,  "              load the file (or the files in the directory) into\n");
        BIO_printf(bio_err,  "              the random number generator\n");
        goto end;
index ffb21bd..7d22384 100644 (file)
@@ -33,6 +33,7 @@ extern int pkcs12_main(int argc,char *argv[]);
 extern int pkcs8_main(int argc,char *argv[]);
 extern int spkac_main(int argc,char *argv[]);
 extern int smime_main(int argc,char *argv[]);
+extern int rand_main(int argc,char *argv[]);
 
 #define FUNC_TYPE_GENERAL      1
 #define FUNC_TYPE_MD           2
@@ -103,6 +104,7 @@ FUNCTION functions[] = {
        {FUNC_TYPE_GENERAL,"pkcs8",pkcs8_main},
        {FUNC_TYPE_GENERAL,"spkac",spkac_main},
        {FUNC_TYPE_GENERAL,"smime",smime_main},
+       {FUNC_TYPE_GENERAL,"rand",rand_main},
        {FUNC_TYPE_MD,"md2",dgst_main},
        {FUNC_TYPE_MD,"md5",dgst_main},
        {FUNC_TYPE_MD,"sha",dgst_main},
diff --git a/lib/libssl/src/apps/rand.c b/lib/libssl/src/apps/rand.c
new file mode 100644 (file)
index 0000000..cfbba30
--- /dev/null
@@ -0,0 +1,140 @@
+/* apps/rand.c */
+
+#include "apps.h"
+
+#include <ctype.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <openssl/bio.h>
+#include <openssl/err.h>
+#include <openssl/rand.h>
+
+#undef PROG
+#define PROG rand_main
+
+/* -out file         - write to file
+ * -rand file:file   - PRNG seed files
+ * -base64           - encode output
+ * num               - write 'num' bytes
+ */
+
+int MAIN(int, char **);
+
+int MAIN(int argc, char **argv)
+       {
+       int i, r, ret = 1;
+       int badopt;
+       char *outfile = NULL;
+       char *inrand = NULL;
+       int base64 = 0;
+       BIO *out = NULL;
+       int num = -1;
+
+       apps_startup();
+
+       if (bio_err == NULL)
+               if ((bio_err = BIO_new(BIO_s_file())) != NULL)
+                       BIO_set_fp(bio_err, stderr, BIO_NOCLOSE|BIO_FP_TEXT);
+
+       badopt = 0;
+       i = 0;
+       while (!badopt && argv[++i] != NULL)
+               {
+               if (strcmp(argv[i], "-out") == 0)
+                       {
+                       if ((argv[i+1] != NULL) && (outfile == NULL))
+                               outfile = argv[++i];
+                       else
+                               badopt = 1;
+                       }
+               else if (strcmp(argv[i], "-rand") == 0)
+                       {
+                       if ((argv[i+1] != NULL) && (inrand == NULL))
+                               inrand = argv[++i];
+                       else
+                               badopt = 1;
+                       }
+               else if (strcmp(argv[i], "-base64") == 0)
+                       {
+                       if (!base64)
+                               base64 = 1;
+                       else
+                               badopt = 1;
+                       }
+               else if (isdigit(argv[i][0]))
+                       {
+                       if (num < 0)
+                               {
+                               r = sscanf(argv[i], "%d", &num);
+                               if (r == 0 || num < 0)
+                                       badopt = 1;
+                               }
+                       else
+                               badopt = 1;
+                       }
+               else
+                       badopt = 1;
+               }
+
+       if (num < 0)
+               badopt = 1;
+       
+       if (badopt) 
+               {
+               BIO_printf(bio_err, "Usage: rand [options] num\n");
+               BIO_printf(bio_err, "where options are\n");
+               BIO_printf(bio_err, "-out file            - write to file\n");
+               BIO_printf(bio_err, "-rand file%cfile%c...  - seed PRNG from files\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
+               BIO_printf(bio_err, "-base64              - encode output\n");
+               goto err;
+               }
+
+       app_RAND_load_file(NULL, bio_err, (inrand != NULL));
+       if (inrand != NULL)
+               BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
+                       app_RAND_load_files(inrand));
+
+       out = BIO_new(BIO_s_file());
+       if (out == NULL)
+               goto err;
+       if (outfile != NULL)
+               r = BIO_write_filename(out, outfile);
+       else
+               r = BIO_set_fp(out, stdout, BIO_NOCLOSE | BIO_FP_TEXT);
+       if (r <= 0)
+               goto err;
+
+       if (base64)
+               {
+               BIO *b64 = BIO_new(BIO_f_base64());
+               if (b64 == NULL)
+                       goto err;
+               out = BIO_push(b64, out);
+               }
+       
+       while (num > 0) 
+               {
+               unsigned char buf[4096];
+               int chunk;
+
+               chunk = num;
+               if (chunk > sizeof buf)
+                       chunk = sizeof buf;
+               r = RAND_bytes(buf, chunk);
+               if (r <= 0)
+                       goto err;
+               BIO_write(out, buf, chunk);
+               num -= chunk;
+               }
+       BIO_flush(out);
+
+       app_RAND_write_file(NULL, bio_err);
+       ret = 0;
+       
+err:
+       ERR_print_errors(bio_err);
+       if (out)
+               BIO_free_all(out);
+       EXIT(ret);
+       }
index 97bb0d0..eb338ee 100644 (file)
@@ -878,8 +878,8 @@ end:
        EVP_PKEY_free(pkey);
        X509_REQ_free(req);
        X509_free(x509ss);
-       if(passin) Free(passin);
-       if(passout) Free(passout);
+       if(passargin && passin) Free(passin);
+       if(passargout && passout) Free(passout);
        OBJ_cleanup();
 #ifndef NO_DSA
        if (dsa_params != NULL) DSA_free(dsa_params);
index 53d234c..9d4c2e6 100644 (file)
@@ -179,7 +179,6 @@ bad:
                BIO_printf(bio_err," -outform arg    output format - one of DER NET PEM\n");
                BIO_printf(bio_err," -in arg         input file\n");
                BIO_printf(bio_err," -passin arg     input file pass phrase source\n");
-               BIO_printf(bio_err," -in arg         input file\n");
                BIO_printf(bio_err," -out arg        output file\n");
                BIO_printf(bio_err," -passout arg    output file pass phrase source\n");
                BIO_printf(bio_err," -des            encrypt PEM output with cbc des\n");
index 36ec575..e69de29 100644 (file)
@@ -1,15 +0,0 @@
------BEGIN CERTIFICATE-----
-MIICTjCCAbsCEGiuFKTJn6nzmiPPLxUZs1owDQYJKoZIhvcNAQEEBQAwXzELMAkG
-A1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD
-VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk4
-MDUxODAwMDAwMFoXDTk5MDUxODIzNTk1OVowdTELMAkGA1UEBhMCVVMxETAPBgNV
-BAgTCE5ldyBZb3JrMREwDwYDVQQHFAhOZXcgWW9yazEeMBwGA1UEChQVSW5kdXN0
-cmlhbCBQcmVzcyBJbmMuMSAwHgYDVQQDFBd3d3cuaW5kdXN0cmlhbHByZXNzLmNv
-bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAqiH9xUJNHvqCmaDon27ValJb
-qTLymF3yKKWBxbODLWjX7yKjewoqWhotaEARI6jXPqomU87gFU1tH4r/bgwh3FmU
-MK3qo92XOsvwNAHzXzWRXQNJmm54g2F1RUt00pgYiOximDse1t9RL5POCDEbfX8D
-gugrE/WwkS2FrSoc5/cCAwEAATANBgkqhkiG9w0BAQQFAAN+AIw7fvF0EtEvrNS/
-LYuqAgUw/tH0FLgCkqKLmYYm/yR+Z0hD2eP/UhF+jAwmV8rHtBnaTM7oN23RVW2k
-Cf8soiGfr2PYtfufpXtd7azUFa+WJCWnp0N29EG0BR1JOFC0Q/4dh/X9qulM8luq
-Pjrmw2eSgbdmmdumWAcNPVbV
------END CERTIFICATE-----
index 95a862e..e69de29 100644 (file)
@@ -1,50 +0,0 @@
-issuer= /C=US/O=RSA Data Security, Inc./OU=Secure Server Certification Authority
-subject=/C=US/ST=New York/L=New York/O=Industrial Press Inc./CN=www.industrialpress.com
-Certificate:
-    Data:
-        Version: 1 (0x0)
-        Serial Number:
-            68:ae:14:a4:c9:9f:a9:f3:9a:23:cf:2f:15:19:b3:5a
-        Signature Algorithm: md5WithRSAEncryption
-        Issuer: C=US, O=RSA Data Security, Inc., OU=Secure Server Certification Authority
-        Validity
-            Not Before: May 18 00:00:00 1998 GMT
-            Not After : May 18 23:59:59 1999 GMT
-        Subject: C=US, ST=New York, L=New York, O=Industrial Press Inc., CN=www.industrialpress.com
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-            RSA Public Key: (1024 bit)
-                Modulus (1024 bit):
-                    00:aa:21:fd:c5:42:4d:1e:fa:82:99:a0:e8:9f:6e:
-                    d5:6a:52:5b:a9:32:f2:98:5d:f2:28:a5:81:c5:b3:
-                    83:2d:68:d7:ef:22:a3:7b:0a:2a:5a:1a:2d:68:40:
-                    11:23:a8:d7:3e:aa:26:53:ce:e0:15:4d:6d:1f:8a:
-                    ff:6e:0c:21:dc:59:94:30:ad:ea:a3:dd:97:3a:cb:
-                    f0:34:01:f3:5f:35:91:5d:03:49:9a:6e:78:83:61:
-                    75:45:4b:74:d2:98:18:88:ec:62:98:3b:1e:d6:df:
-                    51:2f:93:ce:08:31:1b:7d:7f:03:82:e8:2b:13:f5:
-                    b0:91:2d:85:ad:2a:1c:e7:f7
-                Exponent: 65537 (0x10001)
-    Signature Algorithm: md5WithRSAEncryption
-        8c:3b:7e:f1:74:12:d1:2f:ac:d4:bf:2d:8b:aa:02:05:30:fe:
-        d1:f4:14:b8:02:92:a2:8b:99:86:26:ff:24:7e:67:48:43:d9:
-        e3:ff:52:11:7e:8c:0c:26:57:ca:c7:b4:19:da:4c:ce:e8:37:
-        6d:d1:55:6d:a4:09:ff:2c:a2:21:9f:af:63:d8:b5:fb:9f:a5:
-        7b:5d:ed:ac:d4:15:af:96:24:25:a7:a7:43:76:f4:41:b4:05:
-        1d:49:38:50:b4:43:fe:1d:87:f5:fd:aa:e9:4c:f2:5b:aa:3e:
-        3a:e6:c3:67:92:81:b7:66:99:db:a6:58:07:0d:3d:56:d5
------BEGIN CERTIFICATE-----
-MIICTjCCAbsCEGiuFKTJn6nzmiPPLxUZs1owDQYJKoZIhvcNAQEEBQAwXzELMAkG
-A1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD
-VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk4
-MDUxODAwMDAwMFoXDTk5MDUxODIzNTk1OVowdTELMAkGA1UEBhMCVVMxETAPBgNV
-BAgTCE5ldyBZb3JrMREwDwYDVQQHFAhOZXcgWW9yazEeMBwGA1UEChQVSW5kdXN0
-cmlhbCBQcmVzcyBJbmMuMSAwHgYDVQQDFBd3d3cuaW5kdXN0cmlhbHByZXNzLmNv
-bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAqiH9xUJNHvqCmaDon27ValJb
-qTLymF3yKKWBxbODLWjX7yKjewoqWhotaEARI6jXPqomU87gFU1tH4r/bgwh3FmU
-MK3qo92XOsvwNAHzXzWRXQNJmm54g2F1RUt00pgYiOximDse1t9RL5POCDEbfX8D
-gugrE/WwkS2FrSoc5/cCAwEAATANBgkqhkiG9w0BAQQFAAN+AIw7fvF0EtEvrNS/
-LYuqAgUw/tH0FLgCkqKLmYYm/yR+Z0hD2eP/UhF+jAwmV8rHtBnaTM7oN23RVW2k
-Cf8soiGfr2PYtfufpXtd7azUFa+WJCWnp0N29EG0BR1JOFC0Q/4dh/X9qulM8luq
-Pjrmw2eSgbdmmdumWAcNPVbV
------END CERTIFICATE-----
index 7c8ffb2..e69de29 100644 (file)
@@ -1,47 +0,0 @@
-Certificate:
-    Data:
-        Version: 1 (0x0)
-        Serial Number:
-            02:ad:66:7e:4e:45:fe:5e:57:6f:3c:98:19:5e:dd:c0
-        Signature Algorithm: md2WithRSAEncryption
-        Issuer: C=US, O=RSA Data Security, Inc., OU=Secure Server Certification Authority
-        Validity
-            Not Before: Nov  9 00:00:00 1994 GMT
-            Not After : Jan  7 23:59:59 2010 GMT
-        Subject: C=US, O=RSA Data Security, Inc., OU=Secure Server Certification Authority
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-            RSA Public Key: (1000 bit)
-                Modulus (1000 bit):
-                    00:92:ce:7a:c1:ae:83:3e:5a:aa:89:83:57:ac:25:
-                    01:76:0c:ad:ae:8e:2c:37:ce:eb:35:78:64:54:03:
-                    e5:84:40:51:c9:bf:8f:08:e2:8a:82:08:d2:16:86:
-                    37:55:e9:b1:21:02:ad:76:68:81:9a:05:a2:4b:c9:
-                    4b:25:66:22:56:6c:88:07:8f:f7:81:59:6d:84:07:
-                    65:70:13:71:76:3e:9b:77:4c:e3:50:89:56:98:48:
-                    b9:1d:a7:29:1a:13:2e:4a:11:59:9c:1e:15:d5:49:
-                    54:2c:73:3a:69:82:b1:97:39:9c:6d:70:67:48:e5:
-                    dd:2d:d6:c8:1e:7b
-                Exponent: 65537 (0x10001)
-    Signature Algorithm: md2WithRSAEncryption
-        65:dd:7e:e1:b2:ec:b0:e2:3a:e0:ec:71:46:9a:19:11:b8:d3:
-        c7:a0:b4:03:40:26:02:3e:09:9c:e1:12:b3:d1:5a:f6:37:a5:
-        b7:61:03:b6:5b:16:69:3b:c6:44:08:0c:88:53:0c:6b:97:49:
-        c7:3e:35:dc:6c:b9:bb:aa:df:5c:bb:3a:2f:93:60:b6:a9:4b:
-        4d:f2:20:f7:cd:5f:7f:64:7b:8e:dc:00:5c:d7:fa:77:ca:39:
-        16:59:6f:0e:ea:d3:b5:83:7f:4d:4d:42:56:76:b4:c9:5f:04:
-        f8:38:f8:eb:d2:5f:75:5f:cd:7b:fc:e5:8e:80:7c:fc:50
------BEGIN CERTIFICATE-----
-MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzELMAkG
-A1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD
-VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk0
-MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UEBhMCVVMxIDAeBgNV
-BAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2Vy
-dmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGbMA0GCSqGSIb3DQEBAQUAA4GJ
-ADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6OLDfO6zV4ZFQD5YRAUcm/jwjiioII
-0haGN1XpsSECrXZogZoFokvJSyVmIlZsiAeP94FZbYQHZXATcXY+m3dM41CJVphI
-uR2nKRoTLkoRWZweFdVJVCxzOmmCsZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZI
-hvcNAQECBQADfgBl3X7hsuyw4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3
-YQO2WxZpO8ZECAyIUwxrl0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc
-1/p3yjkWWW8O6tO1g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA==
------END CERTIFICATE-----
index 7de7e07..e69de29 100644 (file)
@@ -1,49 +0,0 @@
-issuer= /C=US/O=RSA Data Security, Inc./OU=Secure Server Certification Authority
-subject=/C=US/O=RSA Data Security, Inc./OU=Secure Server Certification Authority
-Certificate:
-    Data:
-        Version: 1 (0x0)
-        Serial Number:
-            02:ad:66:7e:4e:45:fe:5e:57:6f:3c:98:19:5e:dd:c0
-        Signature Algorithm: md2WithRSAEncryption
-        Issuer: C=US, O=RSA Data Security, Inc., OU=Secure Server Certification Authority
-        Validity
-            Not Before: Nov  9 00:00:00 1994 GMT
-            Not After : Jan  7 23:59:59 2010 GMT
-        Subject: C=US, O=RSA Data Security, Inc., OU=Secure Server Certification Authority
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-            RSA Public Key: (1000 bit)
-                Modulus (1000 bit):
-                    00:92:ce:7a:c1:ae:83:3e:5a:aa:89:83:57:ac:25:
-                    01:76:0c:ad:ae:8e:2c:37:ce:eb:35:78:64:54:03:
-                    e5:84:40:51:c9:bf:8f:08:e2:8a:82:08:d2:16:86:
-                    37:55:e9:b1:21:02:ad:76:68:81:9a:05:a2:4b:c9:
-                    4b:25:66:22:56:6c:88:07:8f:f7:81:59:6d:84:07:
-                    65:70:13:71:76:3e:9b:77:4c:e3:50:89:56:98:48:
-                    b9:1d:a7:29:1a:13:2e:4a:11:59:9c:1e:15:d5:49:
-                    54:2c:73:3a:69:82:b1:97:39:9c:6d:70:67:48:e5:
-                    dd:2d:d6:c8:1e:7b
-                Exponent: 65537 (0x10001)
-    Signature Algorithm: md2WithRSAEncryption
-        65:dd:7e:e1:b2:ec:b0:e2:3a:e0:ec:71:46:9a:19:11:b8:d3:
-        c7:a0:b4:03:40:26:02:3e:09:9c:e1:12:b3:d1:5a:f6:37:a5:
-        b7:61:03:b6:5b:16:69:3b:c6:44:08:0c:88:53:0c:6b:97:49:
-        c7:3e:35:dc:6c:b9:bb:aa:df:5c:bb:3a:2f:93:60:b6:a9:4b:
-        4d:f2:20:f7:cd:5f:7f:64:7b:8e:dc:00:5c:d7:fa:77:ca:39:
-        16:59:6f:0e:ea:d3:b5:83:7f:4d:4d:42:56:76:b4:c9:5f:04:
-        f8:38:f8:eb:d2:5f:75:5f:cd:7b:fc:e5:8e:80:7c:fc:50
------BEGIN CERTIFICATE-----
-MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzELMAkG
-A1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD
-VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk0
-MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UEBhMCVVMxIDAeBgNV
-BAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2Vy
-dmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGbMA0GCSqGSIb3DQEBAQUAA4GJ
-ADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6OLDfO6zV4ZFQD5YRAUcm/jwjiioII
-0haGN1XpsSECrXZogZoFokvJSyVmIlZsiAeP94FZbYQHZXATcXY+m3dM41CJVphI
-uR2nKRoTLkoRWZweFdVJVCxzOmmCsZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZI
-hvcNAQECBQADfgBl3X7hsuyw4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3
-YQO2WxZpO8ZECAyIUwxrl0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc
-1/p3yjkWWW8O6tO1g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA==
------END CERTIFICATE-----
index 1a0e9f9..57af7c0 100644 (file)
@@ -84,7 +84,6 @@ typedef fd_mask fd_set;
 #define PORT_STR        "4433"
 #define PROTOCOL        "tcp"
 
-int do_accept(int acc_sock, int *sock, char **host);
 int do_server(int port, int *ret, int (*cb) (), char *context);
 #ifdef HEADER_X509_H
 int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx);
@@ -97,17 +96,9 @@ int set_cert_stuff(SSL_CTX *ctx, char *cert_file, char *key_file);
 int set_cert_stuff(char *ctx, char *cert_file, char *key_file);
 #endif
 int init_client(int *sock, char *server, int port);
-int init_client_ip(int *sock,unsigned char ip[4], int port);
-int nbio_init_client_ip(int *sock,unsigned char ip[4], int port);
-int nbio_sock_error(int sock);
-int spawn(int argc, char **argv, int *in, int *out);
-int init_server(int *sock, int port);
-int init_server_long(int *sock, int port,char *ip);
 int should_retry(int i);
-void sock_cleanup(void );
 int extract_port(char *str, short *port_ptr);
 int extract_host_port(char *str,char **host_ptr,unsigned char *ip,short *p);
-int host_ip(char *str, unsigned char ip[4]);
 
 long MS_CALLBACK bio_dump_cb(BIO *bio, int cmd, const char *argp,
        int argi, long argl, long ret);
index fdb11a1..fd62259 100644 (file)
@@ -1,4 +1,4 @@
-/* apps/s_cb.c */
+/* apps/s_cb.c - callback functions used by s_client, s_server, and s_time */
 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
index c4c3b0e..e629f8e 100644 (file)
@@ -117,6 +117,7 @@ static void sc_usage(void);
 static void print_stuff(BIO *berr,SSL *con,int full);
 static BIO *bio_c_out=NULL;
 static int c_quiet=0;
+static int c_ign_eof=0;
 
 static void sc_usage(void)
        {
@@ -143,6 +144,7 @@ static void sc_usage(void)
 #endif
        BIO_printf(bio_err," -crlf         - convert LF from terminal into CRLF\n");
        BIO_printf(bio_err," -quiet        - no s_client output\n");
+       BIO_printf(bio_err," -ign_eof      - ignore input eof (default when -quiet)\n");
        BIO_printf(bio_err," -ssl2         - just use SSLv2\n");
        BIO_printf(bio_err," -ssl3         - just use SSLv3\n");
        BIO_printf(bio_err," -tls1         - just use TLSv1\n");
@@ -192,6 +194,7 @@ int MAIN(int argc, char **argv)
        apps_startup();
        c_Pause=0;
        c_quiet=0;
+       c_ign_eof=0;
        c_debug=0;
        c_showcerts=0;
 
@@ -249,7 +252,12 @@ int MAIN(int argc, char **argv)
                else if (strcmp(*argv,"-crlf") == 0)
                        crlf=1;
                else if (strcmp(*argv,"-quiet") == 0)
+                       {
                        c_quiet=1;
+                       c_ign_eof=1;
+                       }
+               else if (strcmp(*argv,"-ign_eof") == 0)
+                       c_ign_eof=1;
                else if (strcmp(*argv,"-pause") == 0)
                        c_Pause=1;
                else if (strcmp(*argv,"-debug") == 0)
@@ -711,13 +719,13 @@ printf("read=%d pending=%d peek=%d\n",k,SSL_pending(con),SSL_peek(con,zbuf,10240
                        else
                                i=read(fileno(stdin),cbuf,BUFSIZZ);
 
-                       if ((!c_quiet) && ((i <= 0) || (cbuf[0] == 'Q')))
+                       if ((!c_ign_eof) && ((i <= 0) || (cbuf[0] == 'Q')))
                                {
                                BIO_printf(bio_err,"DONE\n");
                                goto shut;
                                }
 
-                       if ((!c_quiet) && (cbuf[0] == 'R'))
+                       if ((!c_ign_eof) && (cbuf[0] == 'R'))
                                {
                                BIO_printf(bio_err,"RENEGOTIATING\n");
                                SSL_renegotiate(con);
index 888b66d..081b1a5 100644 (file)
@@ -1,4 +1,4 @@
-/* apps/s_socket.c */
+/* apps/s_socket.c -  socket-related functions used by s_client and s_server */
 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
@@ -79,16 +79,17 @@ typedef unsigned int u_int;
 #include "s_apps.h"
 #include <openssl/ssl.h>
 
-#ifdef VMS
-#if (__VMS_VER < 70000000) /* FIONBIO used as a switch to enable ioctl,
-                             and that isn't in VMS < 7.0 */
-#undef FIONBIO
-#endif
-#include <processes.h> /* for vfork() */
+static struct hostent *GetHostByName(char *name);
+#ifdef WINDOWS
+static void sock_cleanup(void);
 #endif
+static int sock_init(void);
+static int init_client_ip(int *sock,unsigned char ip[4], int port);
+static int init_server(int *sock, int port);
+static int init_server_long(int *sock, int port,char *ip);
+static int do_accept(int acc_sock, int *sock, char **host);
+static int host_ip(char *str, unsigned char ip[4]);
 
-static struct hostent *GetHostByName(char *name);
-int sock_init(void );
 #ifdef WIN16
 #define SOCKET_PROTOCOL        0 /* more microsoft stupidity */
 #else
@@ -131,19 +132,19 @@ static BOOL CALLBACK enumproc(HWND hwnd,LPARAM lParam)
 #endif /* WIN32 */
 #endif /* WINDOWS */
 
-void sock_cleanup(void)
-       {
 #ifdef WINDOWS
+static void sock_cleanup(void)
+       {
        if (wsa_init_done)
                {
                wsa_init_done=0;
                WSACancelBlockingCall();
                WSACleanup();
                }
-#endif
        }
+#endif
 
-int sock_init(void)
+static int sock_init(void)
        {
 #ifdef WINDOWS
        if (!wsa_init_done)
@@ -187,7 +188,7 @@ int init_client(int *sock, char *host, int port)
        return(init_client_ip(sock,ip,port));
        }
 
-int init_client_ip(int *sock, unsigned char ip[4], int port)
+static int init_client_ip(int *sock, unsigned char ip[4], int port)
        {
        unsigned long addr;
        struct sockaddr_in them;
@@ -218,75 +219,6 @@ int init_client_ip(int *sock, unsigned char ip[4], int port)
        return(1);
        }
 
-int nbio_sock_error(int sock)
-       {
-       int j,i;
-       int size;
-
-       size=sizeof(int);
-       /* Note: under VMS with SOCKETSHR the third parameter is currently
-        * of type (int *) whereas under other systems it is (void *) if
-        * you don't have a cast it will choke the compiler: if you do
-        * have a cast then you can either go for (int *) or (void *).
-        */
-       i=getsockopt(sock,SOL_SOCKET,SO_ERROR,(char *)&j,(void *)&size);
-       if (i < 0)
-               return(1);
-       else
-               return(j);
-       }
-
-int nbio_init_client_ip(int *sock, unsigned char ip[4], int port)
-       {
-       unsigned long addr;
-       struct sockaddr_in them;
-       int s,i;
-
-       if (!sock_init()) return(0);
-
-       memset((char *)&them,0,sizeof(them));
-       them.sin_family=AF_INET;
-       them.sin_port=htons((unsigned short)port);
-       addr=   (unsigned long)
-               ((unsigned long)ip[0]<<24L)|
-               ((unsigned long)ip[1]<<16L)|
-               ((unsigned long)ip[2]<< 8L)|
-               ((unsigned long)ip[3]);
-       them.sin_addr.s_addr=htonl(addr);
-
-       if (*sock <= 0)
-               {
-#ifdef FIONBIO
-               unsigned long l=1;
-#endif
-
-               s=socket(AF_INET,SOCK_STREAM,SOCKET_PROTOCOL);
-               if (s == INVALID_SOCKET) { perror("socket"); return(0); }
-
-               i=0;
-               i=setsockopt(s,SOL_SOCKET,SO_KEEPALIVE,(char *)&i,sizeof(i));
-               if (i < 0) { perror("keepalive"); return(0); }
-               *sock=s;
-
-#ifdef FIONBIO
-               BIO_socket_ioctl(s,FIONBIO,&l);
-#endif
-               }
-       else
-               s= *sock;
-
-       i=connect(s,(struct sockaddr *)&them,sizeof(them));
-       if (i == INVALID_SOCKET)
-               {
-               if (BIO_sock_should_retry(i))
-                       return(-1);
-               else
-                       return(0);
-               }
-       else
-               return(1);
-       }
-
 int do_server(int port, int *ret, int (*cb)(), char *context)
        {
        int sock;
@@ -319,7 +251,7 @@ int do_server(int port, int *ret, int (*cb)(), char *context)
                }
        }
 
-int init_server_long(int *sock, int port, char *ip)
+static int init_server_long(int *sock, int port, char *ip)
        {
        int ret=0;
        struct sockaddr_in server;
@@ -369,12 +301,12 @@ err:
        return(ret);
        }
 
-int init_server(int *sock, int port)
+static int init_server(int *sock, int port)
        {
        return(init_server_long(sock, port, NULL));
        }
 
-int do_accept(int acc_sock, int *sock, char **host)
+static int do_accept(int acc_sock, int *sock, char **host)
        {
        int ret,i;
        struct hostent *h1,*h2;
@@ -490,7 +422,7 @@ err:
        return(0);
        }
 
-int host_ip(char *str, unsigned char ip[4])
+static int host_ip(char *str, unsigned char ip[4])
        {
        unsigned int in[4]; 
        int i;
@@ -606,69 +538,3 @@ static struct hostent *GetHostByName(char *name)
                return(ret);
                }
        }
-
-#ifndef MSDOS
-int spawn(int argc, char **argv, int *in, int *out)
-       {
-       int pid;
-#define CHILD_READ     p1[0]
-#define CHILD_WRITE    p2[1]
-#define PARENT_READ    p2[0]
-#define PARENT_WRITE   p1[1]
-       int p1[2],p2[2];
-
-       if ((pipe(p1) < 0) || (pipe(p2) < 0)) return(-1);
-
-#ifdef VMS
-       if ((pid=vfork()) == 0)
-#else
-       if ((pid=fork()) == 0)
-#endif
-               { /* child */
-               if (dup2(CHILD_WRITE,fileno(stdout)) < 0)
-                       perror("dup2");
-               if (dup2(CHILD_WRITE,fileno(stderr)) < 0)
-                       perror("dup2");
-               if (dup2(CHILD_READ,fileno(stdin)) < 0)
-                       perror("dup2");
-               close(CHILD_READ); 
-               close(CHILD_WRITE);
-
-               close(PARENT_READ);
-               close(PARENT_WRITE);
-               execvp(argv[0],argv);
-               perror("child");
-               exit(1);
-               }
-
-       /* parent */
-       *in= PARENT_READ;
-       *out=PARENT_WRITE;
-       close(CHILD_READ);
-       close(CHILD_WRITE);
-       return(pid);
-       }
-#endif /* MSDOS */
-
-
-#ifdef undef
-       /* Turn on synchronous sockets so that we can do a WaitForMultipleObjects
-        * on sockets */
-       {
-       SOCKET s;
-       int optionValue = SO_SYNCHRONOUS_NONALERT;
-       int err;
-
-       err = setsockopt( 
-           INVALID_SOCKET, 
-           SOL_SOCKET, 
-           SO_OPENTYPE, 
-           (char *)&optionValue, 
-           sizeof(optionValue));
-       if (err != NO_ERROR) {
-       /* failed for some reason... */
-               BIO_printf(bio_err, "failed to setsockopt(SO_OPENTYPE, SO_SYNCHRONOUS_ALERT) - %d\n",
-                       WSAGetLastError());
-               }
-       }
-#endif
index 77633cf..7dc66d6 100644 (file)
@@ -272,7 +272,7 @@ int MAIN(int argc, char **argv)
                BIO_printf (bio_err, "-text          include or delete text MIME headers\n");
                BIO_printf (bio_err, "-CApath dir    trusted certificates directory\n");
                BIO_printf (bio_err, "-CAfile file   trusted certificates file\n");
-               BIO_printf(bio_err,  "-rand file:file:...\n");
+               BIO_printf(bio_err,  "-rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
                BIO_printf(bio_err,  "               load the file (or the files in the directory) into\n");
                BIO_printf(bio_err,  "               the random number generator\n");
                BIO_printf (bio_err, "cert.pem       recipient certificate(s) for encryption\n");
@@ -309,9 +309,6 @@ int MAIN(int argc, char **argv)
                        goto end;
 #endif
                }
-#ifdef CRYPTO_MDEBUG
-               CRYPTO_push_info("load encryption certificates");
-#endif         
                encerts = sk_X509_new_null();
                while (*args) {
                        if(!(cert = load_cert(*args))) {
@@ -322,50 +319,29 @@ int MAIN(int argc, char **argv)
                        cert = NULL;
                        args++;
                }
-#ifdef CRYPTO_MDEBUG
-               CRYPTO_pop_info();
-#endif         
        }
 
        if(signerfile && (operation == SMIME_SIGN)) {
-#ifdef CRYPTO_MDEBUG
-               CRYPTO_push_info("load signer certificate");
-#endif         
                if(!(signer = load_cert(signerfile))) {
                        BIO_printf(bio_err, "Can't read signer certificate file %s\n", signerfile);
                        goto end;
                }
-#ifdef CRYPTO_MDEBUG
-               CRYPTO_pop_info();
-#endif         
        }
 
        if(certfile) {
-#ifdef CRYPTO_MDEBUG
-               CRYPTO_push_info("load other certfiles");
-#endif         
                if(!(other = load_certs(certfile))) {
                        BIO_printf(bio_err, "Can't read certificate file %s\n", certfile);
                        ERR_print_errors(bio_err);
                        goto end;
                }
-#ifdef CRYPTO_MDEBUG
-               CRYPTO_pop_info();
-#endif         
        }
 
        if(recipfile && (operation == SMIME_DECRYPT)) {
-#ifdef CRYPTO_MDEBUG
-               CRYPTO_push_info("load recipient certificate");
-#endif         
                if(!(recip = load_cert(recipfile))) {
                        BIO_printf(bio_err, "Can't read recipient certificate file %s\n", recipfile);
                        ERR_print_errors(bio_err);
                        goto end;
                }
-#ifdef CRYPTO_MDEBUG
-               CRYPTO_pop_info();
-#endif         
        }
 
        if(operation == SMIME_DECRYPT) {
@@ -375,22 +351,13 @@ int MAIN(int argc, char **argv)
        } else keyfile = NULL;
 
        if(keyfile) {
-#ifdef CRYPTO_MDEBUG
-               CRYPTO_push_info("load keyfile");
-#endif         
                if(!(key = load_key(keyfile, passin))) {
                        BIO_printf(bio_err, "Can't read recipient certificate file %s\n", keyfile);
                        ERR_print_errors(bio_err);
                        goto end;
                }
-#ifdef CRYPTO_MDEBUG
-               CRYPTO_pop_info();
-#endif         
        }
 
-#ifdef CRYPTO_MDEBUG
-       CRYPTO_push_info("open input files");
-#endif         
        if (infile) {
                if (!(in = BIO_new_file(infile, inmode))) {
                        BIO_printf (bio_err,
@@ -398,13 +365,7 @@ int MAIN(int argc, char **argv)
                        goto end;
                }
        } else in = BIO_new_fp(stdin, BIO_NOCLOSE);
-#ifdef CRYPTO_MDEBUG
-       CRYPTO_pop_info();
-#endif         
 
-#ifdef CRYPTO_MDEBUG
-       CRYPTO_push_info("open output files");
-#endif         
        if (outfile) {
                if (!(out = BIO_new_file(outfile, outmode))) {
                        BIO_printf (bio_err,
@@ -412,50 +373,23 @@ int MAIN(int argc, char **argv)
                        goto end;
                }
        } else out = BIO_new_fp(stdout, BIO_NOCLOSE);
-#ifdef CRYPTO_MDEBUG
-       CRYPTO_pop_info();
-#endif         
 
        if(operation == SMIME_VERIFY) {
-#ifdef CRYPTO_MDEBUG
-               CRYPTO_push_info("setup_verify");
-#endif         
                if(!(store = setup_verify(CAfile, CApath))) goto end;
-#ifdef CRYPTO_MDEBUG
-               CRYPTO_pop_info();
-#endif         
        }
 
        ret = 3;
 
        if(operation == SMIME_ENCRYPT) {
-#ifdef CRYPTO_MDEBUG
-               CRYPTO_push_info("PKCS7_encrypt");
-#endif         
                p7 = PKCS7_encrypt(encerts, in, cipher, flags);
-#ifdef CRYPTO_MDEBUG
-               CRYPTO_pop_info();
-#endif         
        } else if(operation == SMIME_SIGN) {
-#ifdef CRYPTO_MDEBUG
-               CRYPTO_push_info("PKCS7_sign");
-#endif         
                p7 = PKCS7_sign(signer, key, other, in, flags);
                BIO_reset(in);
-#ifdef CRYPTO_MDEBUG
-               CRYPTO_pop_info();
-#endif         
        } else {
-#ifdef CRYPTO_MDEBUG
-               CRYPTO_push_info("SMIME_read_PKCS7");
-#endif         
                if(!(p7 = SMIME_read_PKCS7(in, &indata))) {
                        BIO_printf(bio_err, "Error reading S/MIME message\n");
                        goto end;
                }
-#ifdef CRYPTO_MDEBUG
-               CRYPTO_pop_info();
-#endif         
        }
 
        if(!p7) {
@@ -465,45 +399,25 @@ int MAIN(int argc, char **argv)
 
        ret = 4;
        if(operation == SMIME_DECRYPT) {
-#ifdef CRYPTO_MDEBUG
-               CRYPTO_push_info("PKCS7_decrypt");
-#endif         
                if(!PKCS7_decrypt(p7, key, recip, out, flags)) {
                        BIO_printf(bio_err, "Error decrypting PKCS#7 structure\n");
                        goto end;
                }
-#ifdef CRYPTO_MDEBUG
-               CRYPTO_pop_info();
-#endif         
        } else if(operation == SMIME_VERIFY) {
                STACK_OF(X509) *signers;
-#ifdef CRYPTO_MDEBUG
-               CRYPTO_push_info("PKCS7_verify");
-#endif         
                if(PKCS7_verify(p7, other, store, indata, out, flags)) {
                        BIO_printf(bio_err, "Verification Successful\n");
                } else {
                        BIO_printf(bio_err, "Verification Failure\n");
                        goto end;
                }
-#ifdef CRYPTO_MDEBUG
-               CRYPTO_pop_info();
-               CRYPTO_push_info("PKCS7_get0_signers");
-#endif         
                signers = PKCS7_get0_signers(p7, other, flags);
-#ifdef CRYPTO_MDEBUG
-               CRYPTO_pop_info();
-               CRYPTO_push_info("save_certs");
-#endif         
                if(!save_certs(signerfile, signers)) {
                        BIO_printf(bio_err, "Error writing signers to %s\n",
                                                                signerfile);
                        ret = 5;
                        goto end;
                }
-#ifdef CRYPTO_MDEBUG
-               CRYPTO_pop_info();
-#endif         
                sk_X509_free(signers);
        } else if(operation == SMIME_PK7OUT) {
                PEM_write_bio_PKCS7(out, p7);
@@ -515,9 +429,6 @@ int MAIN(int argc, char **argv)
        }
        ret = 0;
 end:
-#ifdef CRYPTO_MDEBUG
-       CRYPTO_remove_all_info();
-#endif
        if (need_rand)
                app_RAND_write_file(NULL, bio_err);
        if(ret) ERR_print_errors(bio_err);
@@ -583,20 +494,9 @@ static X509_STORE *setup_verify(char *CAfile, char *CApath)
 {
        X509_STORE *store;
        X509_LOOKUP *lookup;
-#ifdef CRYPTO_MDEBUG
-       CRYPTO_push_info("X509_STORE_new");
-#endif 
        if(!(store = X509_STORE_new())) goto end;
-#ifdef CRYPTO_MDEBUG
-       CRYPTO_pop_info();
-       CRYPTO_push_info("X509_STORE_add_lookup(...file)");
-#endif 
        lookup=X509_STORE_add_lookup(store,X509_LOOKUP_file());
        if (lookup == NULL) goto end;
-#ifdef CRYPTO_MDEBUG
-       CRYPTO_pop_info();
-       CRYPTO_push_info("X509_LOOKUP_load_file");
-#endif 
        if (CAfile) {
                if(!X509_LOOKUP_load_file(lookup,CAfile,X509_FILETYPE_PEM)) {
                        BIO_printf(bio_err, "Error loading file %s\n", CAfile);
@@ -604,25 +504,14 @@ static X509_STORE *setup_verify(char *CAfile, char *CApath)
                }
        } else X509_LOOKUP_load_file(lookup,NULL,X509_FILETYPE_DEFAULT);
                
-#ifdef CRYPTO_MDEBUG
-       CRYPTO_pop_info();
-       CRYPTO_push_info("X509_STORE_add_lookup(...hash_dir)");
-#endif 
        lookup=X509_STORE_add_lookup(store,X509_LOOKUP_hash_dir());
        if (lookup == NULL) goto end;
-#ifdef CRYPTO_MDEBUG
-       CRYPTO_pop_info();
-       CRYPTO_push_info("X509_LOOKUP_add_dir");
-#endif 
        if (CApath) {
                if(!X509_LOOKUP_add_dir(lookup,CApath,X509_FILETYPE_PEM)) {
                        BIO_printf(bio_err, "Error loading directory %s\n", CApath);
                        goto end;
                }
        } else X509_LOOKUP_add_dir(lookup,NULL,X509_FILETYPE_DEFAULT);
-#ifdef CRYPTO_MDEBUG
-       CRYPTO_pop_info();
-#endif 
 
        ERR_clear_error();
        return store;
index b3130de..f7a8e00 100644 (file)
@@ -1030,6 +1030,11 @@ int MAIN(int argc, char **argv)
 
        RAND_pseudo_bytes(buf,20);
 #ifndef NO_DSA
+       if (RAND_status() != 1)
+               {
+               RAND_seed(rnd_seed, sizeof rnd_seed);
+               rnd_fake = 1;
+               }
        for (j=0; j<DSA_NUM; j++)
                {
                unsigned int kk;
@@ -1089,6 +1094,7 @@ int MAIN(int argc, char **argv)
                                dsa_doit[j]=0;
                        }
                }
+       if (rnd_fake) RAND_cleanup();
 #endif
 
        fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
index b35354a..f3ee7e3 100644 (file)
 #include <time.h>
 #include "apps.h"
 #include <openssl/bio.h>
+#include <openssl/conf.h>
 #include <openssl/err.h>
 #include <openssl/evp.h>
+#include <openssl/lhash.h>
 #include <openssl/x509.h>
 #include <openssl/pem.h>
 
index a322978..f0bfbb1 100644 (file)
@@ -1,4 +1,5 @@
 /* NOCW */
+/* used by apps/speed.c */
 DSA *get_dsa512(void );
 DSA *get_dsa1024(void );
 DSA *get_dsa2048(void );
@@ -146,3 +147,5 @@ DSA *get_dsa2048()
        return(dsa);
        }
 
+static const char rnd_seed[] = "string to make the random number generator think it has entropy";
+static int rnd_fake = 0;
index 9a0e811..3007d79 100644 (file)
@@ -1,4 +1,5 @@
 /* apps/testrsa.h */
+/* used by apps/speed.c */
 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
index bdaf216..e69de29 100644 (file)
@@ -1,66 +0,0 @@
-#!/usr/local/bin/perl5
-#
-# This is only something I'm playing with, it does not work :-)
-#
-
-use Tk;
-
-my $main=MainWindow->new();
-my $f=$main->Frame(-relief => "ridge", -borderwidth => 2);
-$f->pack(-fill => 'x');
-
-my $ff=$f->Frame;
-$ff->pack(-fill => 'x');
-my $l=$ff->Label(-text => "TkCA - SSLeay",
-       -relief => "ridge", -borderwidth => 2);
-$l->pack(-fill => 'x', -ipady => 5);
-
-my $l=$ff->Button(-text => "Certify");
-$l->pack(-fill => 'x', -ipady => 5);
-
-my $l=$ff->Button(-text => "Review");
-$l->pack(-fill => 'x', -ipady => 5);
-
-my $l=$ff->Button(-text => "Revoke");
-$l->pack(-fill => 'x', -ipady => 5);
-
-my $l=$ff->Button(-text => "Generate CRL");
-$l->pack(-fill => 'x', -ipady => 5);
-
-my($db)=&load_db("demoCA/index.txt");
-
-MainLoop;
-
-sub load_db
-       {
-       my(%ret);
-       my($file)=@_;
-       my(*IN);
-       my(%db_serial,%db_name,@f,@db_s);
-
-       $ret{'serial'}=\%db_serial;
-       $ret{'name'}=\%db_name;
-
-       open(IN,"<$file") || die "unable to open $file:$!\n";
-       while (<IN>)
-               {
-               chop;
-               s/([^\\])\t/\1\t\t/g;
-               my(@f)=split(/\t\t/);
-               die "wrong number of fields in $file, line $.\n"
-                       if ($#f != 5);
-
-               my(%f);
-               $f{'type'}=$f[0];
-               $f{'exp'}=$f[1];
-               $f{'rev'}=$f[2];
-               $f{'serial'}=$f[3];
-               $f{'file'}=$f[4];
-               $f{'name'}=$f[5];
-               die "serial number $f{'serial'} appears twice (line $.)\n"
-                       if (defined($db{$f{'serial'}}))
-               $db_serial{$f{'serial'}}=\%f;
-               $db_name{$f{'name'}}.=$f{'serial'}." ";
-               }
-       return \%ret;
-       }
diff --git a/lib/libssl/src/apps/winrand.c b/lib/libssl/src/apps/winrand.c
new file mode 100644 (file)
index 0000000..d042258
--- /dev/null
@@ -0,0 +1,149 @@
+/* apps/winrand.c */
+/* ====================================================================
+ * Copyright (c) 1998-2000 The OpenSSL Project.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer. 
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. All advertising materials mentioning features or use of this
+ *    software must display the following acknowledgment:
+ *    "This product includes software developed by the OpenSSL Project
+ *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
+ *
+ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
+ *    endorse or promote products derived from this software without
+ *    prior written permission. For written permission, please contact
+ *    openssl-core@openssl.org.
+ *
+ * 5. Products derived from this software may not be called "OpenSSL"
+ *    nor may "OpenSSL" appear in their names without prior written
+ *    permission of the OpenSSL Project.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ *    acknowledgment:
+ *    "This product includes software developed by the OpenSSL Project
+ *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This product includes cryptographic software written by Eric Young
+ * (eay@cryptsoft.com).  This product includes software written by Tim
+ * Hudson (tjh@cryptsoft.com).
+ *
+ */
+
+/* Usage: winrand [filename]
+ *
+ * Collects entropy from mouse movements and other events and writes
+ * random data to filename or .rnd
+ */
+
+#include <windows.h>
+#include <openssl/opensslv.h>
+#include <openssl/rand.h>
+
+LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
+const char *filename;
+
+int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
+        PSTR cmdline, int iCmdShow)
+       {
+       static char appname[] = "OpenSSL";
+       HWND hwnd;
+       MSG msg;
+       WNDCLASSEX wndclass;
+        char buffer[200];
+
+        if (cmdline[0] == '\0')
+                filename = RAND_file_name(buffer, sizeof buffer);
+        else
+                filename = cmdline;
+
+        RAND_load_file(filename, -1);
+
+       wndclass.cbSize = sizeof(wndclass);
+       wndclass.style = CS_HREDRAW | CS_VREDRAW;
+       wndclass.lpfnWndProc = WndProc;
+       wndclass.cbClsExtra = 0;
+       wndclass.cbWndExtra = 0;
+       wndclass.hInstance = hInstance;
+       wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
+       wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
+       wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
+       wndclass.lpszMenuName = NULL;
+        wndclass.lpszClassName = appname;
+       wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
+       RegisterClassEx(&wndclass);
+
+        hwnd = CreateWindow(appname, OPENSSL_VERSION_TEXT,
+               WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
+               CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
+
+       ShowWindow(hwnd, iCmdShow);
+       UpdateWindow(hwnd);
+
+
+       while (GetMessage(&msg, NULL, 0, 0))
+               {
+               TranslateMessage(&msg);
+               DispatchMessage(&msg);
+               }
+
+       return msg.wParam;
+       }
+
+LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
+       {
+        HDC hdc;
+       PAINTSTRUCT ps;
+        RECT rect;
+        char buffer[200];
+        static int seeded = 0;
+
+       switch (iMsg)
+               {
+       case WM_PAINT:
+               hdc = BeginPaint(hwnd, &ps);
+               GetClientRect(hwnd, &rect);
+                DrawText(hdc, "Seeding the PRNG. Please move the mouse!", -1,
+                       &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
+               EndPaint(hwnd, &ps);
+               return 0;
+               
+        case WM_DESTROY:
+                PostQuitMessage(0);
+                return 0;
+                }
+
+        if (RAND_event(iMsg, wParam, lParam) == 1 && seeded == 0)
+                {
+                seeded = 1;
+                if (RAND_write_file(filename) <= 0)
+                        MessageBox(hwnd, "Couldn't write random file!",
+                               "OpenSSL", MB_OK | MB_ICONERROR);
+                PostQuitMessage(0);
+                }
+
+       return DefWindowProc(hwnd, iMsg, wParam, lParam);
+       }
index d5c0d04..2d63841 100644 (file)
@@ -126,7 +126,7 @@ static char *x509_usage[]={
 " -md2/-md5/-sha1/-mdc2 - digest to use\n",
 " -extfile        - configuration file with X509V3 extensions to add\n",
 " -extensions     - section from config file with X509V3 extensions to add\n",
-" -crlext         - delete extensions before signing and input certificate\n",
+" -clrext         - delete extensions before signing and input certificate\n",
 NULL
 };
 
@@ -365,8 +365,15 @@ int MAIN(int argc, char **argv)
                        aliasout= ++num;
                else if (strcmp(*argv,"-CAcreateserial") == 0)
                        CA_createserial= ++num;
+               else if (strcmp(*argv,"-clrext") == 0)
+                       clrext = 1;
+#if 1 /* stay backwards-compatible with 0.9.5; this should go away soon */
                else if (strcmp(*argv,"-crlext") == 0)
+                       {
+                       BIO_printf(bio_err,"use -clrext instead of -crlext\n");
                        clrext = 1;
+                       }
+#endif
                else if ((md_alg=EVP_get_digestbyname(*argv + 1)))
                        {
                        /* ok */
index 24b7f32..b980f54 100644 (file)
@@ -40,7 +40,7 @@ LIBOBJ= cryptlib.o mem.o mem_dbg.o cversion.o ex_data.o tmdiff.o cpt_err.o ebcdi
 SRC= $(LIBSRC)
 
 EXHEADER= crypto.h tmdiff.h opensslv.h opensslconf.h ebcdic.h
-HEADER=        cryptlib.h buildinf.h $(EXHEADER)
+HEADER=        cryptlib.h buildinf.h md32_common.h $(EXHEADER)
 
 ALL=    $(GENERAL) $(SRC) $(HEADER)
 
index cab75d9..f9b3358 100644 (file)
@@ -40,7 +40,7 @@ LIBOBJ= cryptlib.o mem.o mem_dbg.o cversion.o ex_data.o tmdiff.o cpt_err.o ebcdi
 SRC= $(LIBSRC)
 
 EXHEADER= crypto.h tmdiff.h opensslv.h opensslconf.h ebcdic.h
-HEADER=        cryptlib.h buildinf.h $(EXHEADER)
+HEADER=        cryptlib.h buildinf.h md32_common.h $(EXHEADER)
 
 ALL=    $(GENERAL) $(SRC) $(HEADER)
 
index b183814..cecd555 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index 64e9023..a147ac3 100644 (file)
@@ -129,7 +129,7 @@ X509_ALGOR *PKCS5_pbe_set(int alg, int iter, unsigned char *salt,
        }
        pbe->salt->length = saltlen;
        if (salt) memcpy (pbe->salt->data, salt, saltlen);
-       else if (RAND_bytes (pbe->salt->data, saltlen) <= 0)
+       else if (RAND_pseudo_bytes (pbe->salt->data, saltlen) < 0)
                return NULL;
 
        if (!(astype = ASN1_TYPE_new())) {
index 4ce06a9..1bbdb10 100644 (file)
@@ -194,7 +194,8 @@ X509_ALGOR *PKCS5_pbe2_set(const EVP_CIPHER *cipher, int iter,
        if(!(scheme->parameter = ASN1_TYPE_new())) goto merr;
 
        /* Create random IV */
-       RAND_pseudo_bytes(iv, EVP_CIPHER_iv_length(cipher));
+       if (RAND_pseudo_bytes(iv, EVP_CIPHER_iv_length(cipher)) < 0)
+               goto err;
 
        /* Dummy cipherinit to just setup the IV */
        EVP_CipherInit(&ctx, cipher, NULL, iv, 0);
@@ -212,7 +213,7 @@ X509_ALGOR *PKCS5_pbe2_set(const EVP_CIPHER *cipher, int iter,
        if (!(osalt->data = Malloc (saltlen))) goto merr;
        osalt->length = saltlen;
        if (salt) memcpy (osalt->data, salt, saltlen);
-       else if (RAND_bytes (osalt->data, saltlen) <= 0) goto merr;
+       else if (RAND_pseudo_bytes (osalt->data, saltlen) < 0) goto merr;
 
        if(iter <= 0) iter = PKCS5_DEFAULT_ITER;
        if(!ASN1_INTEGER_set(kdf->iter, iter)) goto merr;
index 81dd635..ea1af09 100644 (file)
@@ -119,7 +119,7 @@ int X509_REQ_print(BIO *bp, X509_REQ *x)
 
        pkey=X509_REQ_get_pubkey(x);
 #ifndef NO_RSA
-       if (pkey->type == EVP_PKEY_RSA)
+       if (pkey != NULL && pkey->type == EVP_PKEY_RSA)
                {
                BIO_printf(bp,"%12sRSA Public Key: (%d bit)\n","",
                        BN_num_bits(pkey->pkey.rsa->n));
@@ -128,7 +128,7 @@ int X509_REQ_print(BIO *bp, X509_REQ *x)
        else 
 #endif
 #ifndef NO_DSA
-               if (pkey->type == EVP_PKEY_DSA)
+               if (pkey != NULL && pkey->type == EVP_PKEY_DSA)
                {
                BIO_printf(bp,"%12sDSA Public Key:\n","");
                DSA_print(bp,pkey->pkey.dsa,16);
@@ -137,7 +137,8 @@ int X509_REQ_print(BIO *bp, X509_REQ *x)
 #endif
                BIO_printf(bp,"%12sUnknown Public Key:\n","");
 
-       EVP_PKEY_free(pkey);
+       if (pkey != NULL)
+           EVP_PKEY_free(pkey);
 
        /* may not be */
        sprintf(str,"%8sAttributes:\n","");
index 81e9815..7a05d57 100644 (file)
@@ -183,8 +183,10 @@ int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey)
 
        Free(s);
 
+#if 0
        CRYPTO_add(&pkey->references,1,CRYPTO_LOCK_EVP_PKEY);
        pk->pkey=pkey;
+#endif
 
        if (*x != NULL)
                X509_PUBKEY_free(*x);
index 15f6a63..cf2f7dd 100644 (file)
@@ -49,7 +49,7 @@ lib:  $(LIBOBJ)
 
 # elf
 asm/bx86-elf.o: asm/bx86unix.cpp
-       $(CPP) -DELF asm/bx86unix.cpp | as -o asm/bx86-elf.o
+       $(CPP) -DELF -x c asm/bx86unix.cpp | as -o asm/bx86-elf.o
 
 # solaris
 asm/bx86-sol.o: asm/bx86unix.cpp
@@ -65,7 +65,7 @@ asm/bx86-out.o: asm/bx86unix.cpp
 asm/bx86bsdi.o: asm/bx86unix.cpp
        $(CPP) -DBSDI asm/bx86unix.cpp | sed 's/ :/:/' | as -o asm/bx86bsdi.o
 
-asm/bx86unix.cpp:
+asm/bx86unix.cpp: asm/bf-586.pl ../perlasm/x86asm.pl ../perlasm/cbc.pl
        (cd asm; $(PERL) bf-586.pl cpp $(PROCESSOR) >bx86unix.cpp)
 
 files:
index f67e5ca..e69de29 100644 (file)
@@ -1,157 +0,0 @@
-# Targets
-# make          - twidle the options yourself :-)
-# make cc       - standard cc options
-# make gcc      - standard gcc options
-# make x86-elf  - linux-elf etc
-# make x86-out  - linux-a.out, FreeBSD etc
-# make x86-solaris
-# make x86-bdsi
-
-DIR=   bf
-TOP=   .
-# use BF_PTR2 for intel boxes,
-# BF_PTR for sparc and MIPS/SGI
-# use nothing for Alpha and HP.
-
-# There are 3 possible performance options, experiment :-)
-#OPTS= -DBF_PTR  # usr for sparc and MIPS/SGI
-#OPTS= -DBF_PTR2 # use for pentium
-OPTS=           # use for pentium pro, Alpha and HP
-
-MAKE=make -f Makefile
-#CC=cc
-#CFLAG= -O
-
-CC=gcc
-#CFLAG= -O4 -funroll-loops -fomit-frame-pointer
-CFLAG= -O3 -fomit-frame-pointer
-
-CFLAGS=$(OPTS) $(CFLAG)
-CPP=$(CC) -E
-AS=as
-RANLIB=ranlib
-
-# Assember version of bf_encrypt().
-BF_ENC=bf_enc.o                # normal C version
-#BF_ENC=asm/bx86-elf.o # elf format x86
-#BF_ENC=asm/bx86-out.o # a.out format x86
-#BF_ENC=asm/bx86-sol.o # solaris format x86 
-#BF_ENC=asm/bx86bsdi.o # bsdi format x86 
-
-LIBDIR=/usr/local/lib
-BINDIR=/usr/local/bin
-INCDIR=/usr/local/include
-MANDIR=/usr/local/man
-MAN1=1
-MAN3=3
-SHELL=/bin/sh
-LIBOBJ=bf_skey.o bf_ecb.o $(BF_ENC) bf_cfb64.o bf_ofb64.o
-LIBSRC=bf_skey.c bf_ecb.c bf_enc.c bf_cfb64.c bf_ofb64.c
-
-GENERAL=Makefile Makefile.ssl Makefile.uni asm bf_locl.org README \
-       COPYRIGHT blowfish.doc INSTALL
-
-TESTING=    bftest bfspeed bf_opts
-TESTING_SRC=bftest.c bfspeed.c bf_opts.c
-HEADERS=bf_locl.h blowfish.h bf_pi.h
-
-ALL=   $(GENERAL) $(TESTING_SRC) $(LIBSRC) $(HEADERS)
-
-BLIB=  libblowfish.a
-
-all: $(BLIB) $(TESTING)
-
-cc:
-       $(MAKE) CC=cc CFLAGS="-O $(OPTS) $(CFLAG)" all
-
-gcc:
-       $(MAKE) CC=gcc CFLAGS="-O3 -fomit-frame-pointer $(OPTS) $(CFLAG)" all
-
-x86-elf:
-       $(MAKE) BF_ENC='asm/bx86-elf.o' CC=$(CC) CFLAGS="-DELF $(OPTS) $(CFLAG)" all
-
-x86-out:
-       $(MAKE) BF_ENC='asm/bx86-out.o' CC=$(CC) CFLAGS="-DOUT $(OPTS) $(CFLAG)" all
-
-x86-solaris:
-       $(MAKE) BF_ENC='asm/bx86-sol.o' CC=$(CC) CFLAGS="-DSOL $(OPTS) $(CFLAG)" all
-
-x86-bsdi:
-       $(MAKE) BF_ENC='asm/bx86bsdi.o' CC=$(CC) CFLAGS="-DBSDI $(OPTS) $(CFLAG)" all
-
-# elf
-asm/bx86-elf.o: asm/bx86unix.cpp
-       $(CPP) -DELF asm/bx86unix.cpp | $(AS) -o asm/bx86-elf.o
-
-# solaris
-asm/bx86-sol.o: asm/bx86unix.cpp
-       $(CC) -E -DSOL asm/bx86unix.cpp | sed 's/^#.*//' > asm/bx86-sol.s
-       as -o asm/bx86-sol.o asm/bx86-sol.s
-       rm -f asm/bx86-sol.s
-
-# a.out
-asm/bx86-out.o: asm/bx86unix.cpp
-       $(CPP) -DOUT asm/bx86unix.cpp | $(AS) -o asm/bx86-out.o
-
-# bsdi
-asm/bx86bsdi.o: asm/bx86unix.cpp
-       $(CPP) -DBSDI asm/bx86unix.cpp | $(AS) -o asm/bx86bsdi.o
-
-asm/bx86unix.cpp:
-       (cd asm; perl bf-586.pl cpp >bx86unix.cpp)
-       
-test:  all
-       ./bftest
-
-$(BLIB): $(LIBOBJ)
-       /bin/rm -f $(BLIB)
-       ar cr $(BLIB) $(LIBOBJ)
-       $(RANLIB) $(BLIB)
-
-bftest: bftest.o $(BLIB)
-       $(CC) $(CFLAGS) -o bftest bftest.o $(BLIB)
-
-bfspeed: bfspeed.o $(BLIB)
-       $(CC) $(CFLAGS) -o bfspeed bfspeed.o $(BLIB)
-
-bf_opts: bf_opts.o $(BLIB)
-       $(CC) $(CFLAGS) -o bf_opts bf_opts.o $(BLIB)
-
-tags:
-       ctags $(TESTING_SRC) $(LIBBF)
-
-tar:
-       tar chf libbf.tar $(ALL)
-
-shar:
-       shar $(ALL) >libbf.shar
-
-depend:
-       makedepend $(LIBBF) $(TESTING_SRC)
-
-clean:
-       /bin/rm -f *.o tags core $(TESTING) $(BLIB) .nfs* *.old *.bak asm/*.o 
-
-dclean:
-       sed -e '/^# DO NOT DELETE THIS LINE/ q' Makefile >Makefile.new
-       mv -f Makefile.new Makefile
-
-# Eric is probably going to choke when he next looks at this --tjh
-install: $(BLIB)
-       if test $(INSTALLTOP); then \
-           echo SSL style install; \
-           cp $(BLIB) $(INSTALLTOP)/lib; \
-               $(RANLIB) $(BLIB); \
-           chmod 644 $(INSTALLTOP)/lib/$(BLIB); \
-           cp blowfish.h $(INSTALLTOP)/include; \
-           chmod 644 $(INSTALLTOP)/include/blowfish.h; \
-       else \
-           echo Standalone install; \
-           cp $(BLIB) $(LIBDIR)/$(BLIB); \
-               $(RANLIB) $(BLIB); \
-           chmod 644 $(LIBDIR)/$(BLIB); \
-           cp blowfish.h $(INCDIR)/blowfish.h; \
-           chmod 644 $(INCDIR)/blowfish.h; \
-       fi
-
-# DO NOT DELETE THIS LINE -- make depend depends on it.
index 138c99d..e69de29 100644 (file)
@@ -1,906 +0,0 @@
-       ; Don't even think of reading this code
-       ; It was automatically generated by bf-586.pl
-       ; Which is a perl program used to generate the x86 assember for
-       ; any of elf, a.out, BSDI,Win32, or Solaris
-       ; eric <eay@cryptsoft.com>
-       ; 
-       TITLE   bf-586.asm
-        .486
-.model FLAT
-_TEXT  SEGMENT
-PUBLIC _BF_encrypt
-
-_BF_encrypt PROC NEAR
-       ; 
-       push    ebp
-       push    ebx
-       mov     ebx,            DWORD PTR 12[esp]
-       mov     ebp,            DWORD PTR 16[esp]
-       push    esi
-       push    edi
-       ; Load the 2 words
-       mov     edi,            DWORD PTR [ebx]
-       mov     esi,            DWORD PTR 4[ebx]
-       xor     eax,            eax
-       mov     ebx,            DWORD PTR [ebp]
-       xor     ecx,            ecx
-       xor     edi,            ebx
-       ; 
-       ; Round 0
-       mov     edx,            DWORD PTR 4[ebp]
-       mov     ebx,            edi
-       xor     esi,            edx
-       shr     ebx,            16
-       mov     edx,            edi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     esi,            ebx
-       ; 
-       ; Round 1
-       mov     edx,            DWORD PTR 8[ebp]
-       mov     ebx,            esi
-       xor     edi,            edx
-       shr     ebx,            16
-       mov     edx,            esi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     edi,            ebx
-       ; 
-       ; Round 2
-       mov     edx,            DWORD PTR 12[ebp]
-       mov     ebx,            edi
-       xor     esi,            edx
-       shr     ebx,            16
-       mov     edx,            edi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     esi,            ebx
-       ; 
-       ; Round 3
-       mov     edx,            DWORD PTR 16[ebp]
-       mov     ebx,            esi
-       xor     edi,            edx
-       shr     ebx,            16
-       mov     edx,            esi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     edi,            ebx
-       ; 
-       ; Round 4
-       mov     edx,            DWORD PTR 20[ebp]
-       mov     ebx,            edi
-       xor     esi,            edx
-       shr     ebx,            16
-       mov     edx,            edi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     esi,            ebx
-       ; 
-       ; Round 5
-       mov     edx,            DWORD PTR 24[ebp]
-       mov     ebx,            esi
-       xor     edi,            edx
-       shr     ebx,            16
-       mov     edx,            esi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     edi,            ebx
-       ; 
-       ; Round 6
-       mov     edx,            DWORD PTR 28[ebp]
-       mov     ebx,            edi
-       xor     esi,            edx
-       shr     ebx,            16
-       mov     edx,            edi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     esi,            ebx
-       ; 
-       ; Round 7
-       mov     edx,            DWORD PTR 32[ebp]
-       mov     ebx,            esi
-       xor     edi,            edx
-       shr     ebx,            16
-       mov     edx,            esi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     edi,            ebx
-       ; 
-       ; Round 8
-       mov     edx,            DWORD PTR 36[ebp]
-       mov     ebx,            edi
-       xor     esi,            edx
-       shr     ebx,            16
-       mov     edx,            edi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     esi,            ebx
-       ; 
-       ; Round 9
-       mov     edx,            DWORD PTR 40[ebp]
-       mov     ebx,            esi
-       xor     edi,            edx
-       shr     ebx,            16
-       mov     edx,            esi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     edi,            ebx
-       ; 
-       ; Round 10
-       mov     edx,            DWORD PTR 44[ebp]
-       mov     ebx,            edi
-       xor     esi,            edx
-       shr     ebx,            16
-       mov     edx,            edi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     esi,            ebx
-       ; 
-       ; Round 11
-       mov     edx,            DWORD PTR 48[ebp]
-       mov     ebx,            esi
-       xor     edi,            edx
-       shr     ebx,            16
-       mov     edx,            esi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     edi,            ebx
-       ; 
-       ; Round 12
-       mov     edx,            DWORD PTR 52[ebp]
-       mov     ebx,            edi
-       xor     esi,            edx
-       shr     ebx,            16
-       mov     edx,            edi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     esi,            ebx
-       ; 
-       ; Round 13
-       mov     edx,            DWORD PTR 56[ebp]
-       mov     ebx,            esi
-       xor     edi,            edx
-       shr     ebx,            16
-       mov     edx,            esi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     edi,            ebx
-       ; 
-       ; Round 14
-       mov     edx,            DWORD PTR 60[ebp]
-       mov     ebx,            edi
-       xor     esi,            edx
-       shr     ebx,            16
-       mov     edx,            edi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     esi,            ebx
-       ; 
-       ; Round 15
-       mov     edx,            DWORD PTR 64[ebp]
-       mov     ebx,            esi
-       xor     edi,            edx
-       shr     ebx,            16
-       mov     edx,            esi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       ; Load parameter 0 (16) enc=1
-       mov     eax,            DWORD PTR 20[esp]
-       xor     edi,            ebx
-       mov     edx,            DWORD PTR 68[ebp]
-       xor     esi,            edx
-       mov     DWORD PTR 4[eax],edi
-       mov     DWORD PTR [eax],esi
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-_BF_encrypt ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _BF_decrypt
-
-_BF_decrypt PROC NEAR
-       ; 
-       push    ebp
-       push    ebx
-       mov     ebx,            DWORD PTR 12[esp]
-       mov     ebp,            DWORD PTR 16[esp]
-       push    esi
-       push    edi
-       ; Load the 2 words
-       mov     edi,            DWORD PTR [ebx]
-       mov     esi,            DWORD PTR 4[ebx]
-       xor     eax,            eax
-       mov     ebx,            DWORD PTR 68[ebp]
-       xor     ecx,            ecx
-       xor     edi,            ebx
-       ; 
-       ; Round 16
-       mov     edx,            DWORD PTR 64[ebp]
-       mov     ebx,            edi
-       xor     esi,            edx
-       shr     ebx,            16
-       mov     edx,            edi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     esi,            ebx
-       ; 
-       ; Round 15
-       mov     edx,            DWORD PTR 60[ebp]
-       mov     ebx,            esi
-       xor     edi,            edx
-       shr     ebx,            16
-       mov     edx,            esi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     edi,            ebx
-       ; 
-       ; Round 14
-       mov     edx,            DWORD PTR 56[ebp]
-       mov     ebx,            edi
-       xor     esi,            edx
-       shr     ebx,            16
-       mov     edx,            edi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     esi,            ebx
-       ; 
-       ; Round 13
-       mov     edx,            DWORD PTR 52[ebp]
-       mov     ebx,            esi
-       xor     edi,            edx
-       shr     ebx,            16
-       mov     edx,            esi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     edi,            ebx
-       ; 
-       ; Round 12
-       mov     edx,            DWORD PTR 48[ebp]
-       mov     ebx,            edi
-       xor     esi,            edx
-       shr     ebx,            16
-       mov     edx,            edi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     esi,            ebx
-       ; 
-       ; Round 11
-       mov     edx,            DWORD PTR 44[ebp]
-       mov     ebx,            esi
-       xor     edi,            edx
-       shr     ebx,            16
-       mov     edx,            esi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     edi,            ebx
-       ; 
-       ; Round 10
-       mov     edx,            DWORD PTR 40[ebp]
-       mov     ebx,            edi
-       xor     esi,            edx
-       shr     ebx,            16
-       mov     edx,            edi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     esi,            ebx
-       ; 
-       ; Round 9
-       mov     edx,            DWORD PTR 36[ebp]
-       mov     ebx,            esi
-       xor     edi,            edx
-       shr     ebx,            16
-       mov     edx,            esi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     edi,            ebx
-       ; 
-       ; Round 8
-       mov     edx,            DWORD PTR 32[ebp]
-       mov     ebx,            edi
-       xor     esi,            edx
-       shr     ebx,            16
-       mov     edx,            edi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     esi,            ebx
-       ; 
-       ; Round 7
-       mov     edx,            DWORD PTR 28[ebp]
-       mov     ebx,            esi
-       xor     edi,            edx
-       shr     ebx,            16
-       mov     edx,            esi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     edi,            ebx
-       ; 
-       ; Round 6
-       mov     edx,            DWORD PTR 24[ebp]
-       mov     ebx,            edi
-       xor     esi,            edx
-       shr     ebx,            16
-       mov     edx,            edi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     esi,            ebx
-       ; 
-       ; Round 5
-       mov     edx,            DWORD PTR 20[ebp]
-       mov     ebx,            esi
-       xor     edi,            edx
-       shr     ebx,            16
-       mov     edx,            esi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     edi,            ebx
-       ; 
-       ; Round 4
-       mov     edx,            DWORD PTR 16[ebp]
-       mov     ebx,            edi
-       xor     esi,            edx
-       shr     ebx,            16
-       mov     edx,            edi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     esi,            ebx
-       ; 
-       ; Round 3
-       mov     edx,            DWORD PTR 12[ebp]
-       mov     ebx,            esi
-       xor     edi,            edx
-       shr     ebx,            16
-       mov     edx,            esi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     edi,            ebx
-       ; 
-       ; Round 2
-       mov     edx,            DWORD PTR 8[ebp]
-       mov     ebx,            edi
-       xor     esi,            edx
-       shr     ebx,            16
-       mov     edx,            edi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       xor     eax,            eax
-       xor     esi,            ebx
-       ; 
-       ; Round 1
-       mov     edx,            DWORD PTR 4[ebp]
-       mov     ebx,            esi
-       xor     edi,            edx
-       shr     ebx,            16
-       mov     edx,            esi
-       mov     al,             bh
-       and     ebx,            255
-       mov     cl,             dh
-       and     edx,            255
-       mov     eax,            DWORD PTR 72[eax*4+ebp]
-       mov     ebx,            DWORD PTR 1096[ebx*4+ebp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 2120[ecx*4+ebp]
-       xor     ebx,            eax
-       mov     edx,            DWORD PTR 3144[edx*4+ebp]
-       add     ebx,            edx
-       ; Load parameter 0 (1) enc=0
-       mov     eax,            DWORD PTR 20[esp]
-       xor     edi,            ebx
-       mov     edx,            DWORD PTR [ebp]
-       xor     esi,            edx
-       mov     DWORD PTR 4[eax],edi
-       mov     DWORD PTR [eax],esi
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-_BF_decrypt ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _BF_cbc_encrypt
-
-_BF_cbc_encrypt PROC NEAR
-       ; 
-       push    ebp
-       push    ebx
-       push    esi
-       push    edi
-       mov     ebp,            DWORD PTR 28[esp]
-       ; getting iv ptr from parameter 4
-       mov     ebx,            DWORD PTR 36[esp]
-       mov     esi,            DWORD PTR [ebx]
-       mov     edi,            DWORD PTR 4[ebx]
-       push    edi
-       push    esi
-       push    edi
-       push    esi
-       mov     ebx,            esp
-       mov     esi,            DWORD PTR 36[esp]
-       mov     edi,            DWORD PTR 40[esp]
-       ; getting encrypt flag from parameter 5
-       mov     ecx,            DWORD PTR 56[esp]
-       ; get and push parameter 3
-       mov     eax,            DWORD PTR 48[esp]
-       push    eax
-       push    ebx
-       cmp     ecx,            0
-       jz      $L000decrypt
-       and     ebp,            4294967288
-       mov     eax,            DWORD PTR 8[esp]
-       mov     ebx,            DWORD PTR 12[esp]
-       jz      $L001encrypt_finish
-L002encrypt_loop:
-       mov     ecx,            DWORD PTR [esi]
-       mov     edx,            DWORD PTR 4[esi]
-       xor     eax,            ecx
-       xor     ebx,            edx
-       bswap   eax
-       bswap   ebx
-       mov     DWORD PTR 8[esp],eax
-       mov     DWORD PTR 12[esp],ebx
-       call    _BF_encrypt
-       mov     eax,            DWORD PTR 8[esp]
-       mov     ebx,            DWORD PTR 12[esp]
-       bswap   eax
-       bswap   ebx
-       mov     DWORD PTR [edi],eax
-       mov     DWORD PTR 4[edi],ebx
-       add     esi,            8
-       add     edi,            8
-       sub     ebp,            8
-       jnz     L002encrypt_loop
-$L001encrypt_finish:
-       mov     ebp,            DWORD PTR 52[esp]
-       and     ebp,            7
-       jz      $L003finish
-       xor     ecx,            ecx
-       xor     edx,            edx
-       mov     ebp,            DWORD PTR $L004cbc_enc_jmp_table[ebp*4]
-       jmp      ebp
-L005ej7:
-       mov     dh,             BYTE PTR 6[esi]
-       shl     edx,            8
-L006ej6:
-       mov     dh,             BYTE PTR 5[esi]
-L007ej5:
-       mov     dl,             BYTE PTR 4[esi]
-L008ej4:
-       mov     ecx,            DWORD PTR [esi]
-       jmp     $L009ejend
-L010ej3:
-       mov     ch,             BYTE PTR 2[esi]
-       shl     ecx,            8
-L011ej2:
-       mov     ch,             BYTE PTR 1[esi]
-L012ej1:
-       mov     cl,             BYTE PTR [esi]
-$L009ejend:
-       xor     eax,            ecx
-       xor     ebx,            edx
-       bswap   eax
-       bswap   ebx
-       mov     DWORD PTR 8[esp],eax
-       mov     DWORD PTR 12[esp],ebx
-       call    _BF_encrypt
-       mov     eax,            DWORD PTR 8[esp]
-       mov     ebx,            DWORD PTR 12[esp]
-       bswap   eax
-       bswap   ebx
-       mov     DWORD PTR [edi],eax
-       mov     DWORD PTR 4[edi],ebx
-       jmp     $L003finish
-$L000decrypt:
-       and     ebp,            4294967288
-       mov     eax,            DWORD PTR 16[esp]
-       mov     ebx,            DWORD PTR 20[esp]
-       jz      $L013decrypt_finish
-L014decrypt_loop:
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-       bswap   eax
-       bswap   ebx
-       mov     DWORD PTR 8[esp],eax
-       mov     DWORD PTR 12[esp],ebx
-       call    _BF_decrypt
-       mov     eax,            DWORD PTR 8[esp]
-       mov     ebx,            DWORD PTR 12[esp]
-       bswap   eax
-       bswap   ebx
-       mov     ecx,            DWORD PTR 16[esp]
-       mov     edx,            DWORD PTR 20[esp]
-       xor     ecx,            eax
-       xor     edx,            ebx
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-       mov     DWORD PTR [edi],ecx
-       mov     DWORD PTR 4[edi],edx
-       mov     DWORD PTR 16[esp],eax
-       mov     DWORD PTR 20[esp],ebx
-       add     esi,            8
-       add     edi,            8
-       sub     ebp,            8
-       jnz     L014decrypt_loop
-$L013decrypt_finish:
-       mov     ebp,            DWORD PTR 52[esp]
-       and     ebp,            7
-       jz      $L003finish
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-       bswap   eax
-       bswap   ebx
-       mov     DWORD PTR 8[esp],eax
-       mov     DWORD PTR 12[esp],ebx
-       call    _BF_decrypt
-       mov     eax,            DWORD PTR 8[esp]
-       mov     ebx,            DWORD PTR 12[esp]
-       bswap   eax
-       bswap   ebx
-       mov     ecx,            DWORD PTR 16[esp]
-       mov     edx,            DWORD PTR 20[esp]
-       xor     ecx,            eax
-       xor     edx,            ebx
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-L015dj7:
-       ror     edx,            16
-       mov     BYTE PTR 6[edi],dl
-       shr     edx,            16
-L016dj6:
-       mov     BYTE PTR 5[edi],dh
-L017dj5:
-       mov     BYTE PTR 4[edi],dl
-L018dj4:
-       mov     DWORD PTR [edi],ecx
-       jmp     $L019djend
-L020dj3:
-       ror     ecx,            16
-       mov     BYTE PTR 2[edi],cl
-       shl     ecx,            16
-L021dj2:
-       mov     BYTE PTR 1[esi],ch
-L022dj1:
-       mov     BYTE PTR [esi], cl
-$L019djend:
-       jmp     $L003finish
-$L003finish:
-       mov     ecx,            DWORD PTR 60[esp]
-       add     esp,            24
-       mov     DWORD PTR [ecx],eax
-       mov     DWORD PTR 4[ecx],ebx
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-$L004cbc_enc_jmp_table:
-       DD      0
-       DD      L012ej1
-       DD      L011ej2
-       DD      L010ej3
-       DD      L008ej4
-       DD      L007ej5
-       DD      L006ej6
-       DD      L005ej7
-L023cbc_dec_jmp_table:
-       DD      0
-       DD      L022dj1
-       DD      L021dj2
-       DD      L020dj3
-       DD      L018dj4
-       DD      L017dj5
-       DD      L016dj6
-       DD      L015dj7
-_BF_cbc_encrypt ENDP
-_TEXT  ENDS
-END
index 2e7480e..755f255 100644 (file)
@@ -172,8 +172,10 @@ bss_acpt.o: ../../include/openssl/opensslconf.h
 bss_acpt.o: ../../include/openssl/opensslv.h ../../include/openssl/safestack.h
 bss_acpt.o: ../../include/openssl/stack.h ../cryptlib.h
 bss_bio.o: ../../include/openssl/bio.h ../../include/openssl/crypto.h
-bss_bio.o: ../../include/openssl/err.h ../../include/openssl/opensslv.h
-bss_bio.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h
+bss_bio.o: ../../include/openssl/e_os.h ../../include/openssl/e_os2.h
+bss_bio.o: ../../include/openssl/err.h ../../include/openssl/opensslconf.h
+bss_bio.o: ../../include/openssl/opensslv.h ../../include/openssl/safestack.h
+bss_bio.o: ../../include/openssl/stack.h
 bss_conn.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
 bss_conn.o: ../../include/openssl/crypto.h ../../include/openssl/e_os.h
 bss_conn.o: ../../include/openssl/e_os2.h ../../include/openssl/err.h
index 2a5e8b5..b11b501 100644 (file)
@@ -64,6 +64,8 @@
 #include <stdarg.h>
 #include <string.h>
 #include <ctype.h>
+#include <assert.h>
+#include <limits.h>
 #include "cryptlib.h"
 #ifndef NO_SYS_TYPES_H
 #include <sys/types.h>
 
 #ifdef BN_LLONG
 # ifndef HAVE_LONG_LONG
-#  define HAVE_LONG_LONG
+#  define HAVE_LONG_LONG 1
 # endif
 #endif
 
 static void dopr (char *buffer, size_t maxlen, size_t *retlen,
        const char *format, va_list args);
+#ifdef USE_ALLOCATING_PRINT
+static void doapr (char **buffer, size_t *retlen,
+       const char *format, va_list args);
+#endif
 
 int BIO_printf (BIO *bio, ...)
        {
@@ -85,15 +91,32 @@ int BIO_printf (BIO *bio, ...)
        char *format;
        int ret;
        size_t retlen;
+#ifdef USE_ALLOCATING_PRINT
+       char *hugebuf;
+#else
        MS_STATIC char hugebuf[1024*2]; /* 10k in one chunk is the limit */
+#endif
 
        va_start(args, bio);
        format=va_arg(args, char *);
 
+#ifndef USE_ALLOCATING_PRINT
        hugebuf[0]='\0';
        dopr(hugebuf, sizeof(hugebuf), &retlen, format, args);
-       ret=BIO_write(bio, hugebuf, (int)retlen);
+#else
+       hugebuf = NULL;
+       CRYPTO_push_info("doapr()");
+       doapr(&hugebuf, &retlen, format, args);
+       if (hugebuf)
+               {
+#endif
+               ret=BIO_write(bio, hugebuf, (int)retlen);
 
+#ifdef USE_ALLOCATING_PRINT
+               Free(hugebuf);
+               }
+       CRYPTO_pop_info();
+#endif
        va_end(args);
        return(ret);
        }
@@ -131,10 +154,26 @@ int BIO_printf (BIO *bio, ...)
 #define LLONG long
 #endif
 
-static void fmtstr     (char *, size_t *, size_t, char *, int, int, int);
-static void fmtint     (char *, size_t *, size_t, LLONG, int, int, int, int);
-static void fmtfp      (char *, size_t *, size_t, LDOUBLE, int, int, int);
-static void dopr_outch (char *, size_t *, size_t, int);
+static void fmtstr     (void (*)(char **, size_t *, size_t *, int),
+                       char **, size_t *, size_t *, const char *, int, int,
+                       int);
+static void fmtint     (void (*)(char **, size_t *, size_t *, int),
+                       char **, size_t *, size_t *, LLONG, int, int, int, int);
+static void fmtfp      (void (*)(char **, size_t *, size_t *, int),
+                       char **, size_t *, size_t *, LDOUBLE, int, int, int);
+#ifndef USE_ALLOCATING_PRINT
+static int dopr_isbig (size_t, size_t);
+static int dopr_copy (size_t);
+static void dopr_outch (char **, size_t *, size_t *, int);
+#else
+static int doapr_isbig (size_t, size_t);
+static int doapr_copy (size_t);
+static void doapr_outch (char **, size_t *, size_t *, int);
+#endif
+static void _dopr(void (*)(char **, size_t *, size_t *, int),
+                 int (*)(size_t, size_t), int (*)(size_t),
+                 char **buffer, size_t *maxlen, size_t *retlen,
+                 const char *format, va_list args);
 
 /* format read states */
 #define DP_S_DEFAULT    0
@@ -165,6 +204,7 @@ static void dopr_outch (char *, size_t *, size_t, int);
 #define char_to_int(p) (p - '0')
 #define MAX(p,q) ((p >= q) ? p : q)
 
+#ifndef USE_ALLOCATING_PRINT
 static void
 dopr(
     char *buffer,
@@ -172,6 +212,35 @@ dopr(
     size_t *retlen,
     const char *format,
     va_list args)
+{
+    _dopr(dopr_outch, dopr_isbig, dopr_copy,
+         &buffer, &maxlen, retlen, format, args);
+}
+
+#else
+static void
+doapr(
+    char **buffer,
+    size_t *retlen,
+    const char *format,
+    va_list args)
+{
+    size_t dummy_maxlen = 0;
+    _dopr(doapr_outch, doapr_isbig, doapr_copy,
+         buffer, &dummy_maxlen, retlen, format, args);
+}
+#endif
+
+static void
+_dopr(
+    void (*outch_fn)(char **, size_t *, size_t *, int),
+    int (*isbig_fn)(size_t, size_t),
+    int (*copy_fn)(size_t),
+    char **buffer,
+    size_t *maxlen,
+    size_t *retlen,
+    const char *format,
+    va_list args)
 {
     char ch;
     LLONG value;
@@ -190,7 +259,7 @@ dopr(
     ch = *format++;
 
     while (state != DP_S_DONE) {
-        if ((ch == '\0') || (currlen >= maxlen))
+        if ((ch == '\0') || (*isbig_fn)(currlen, *maxlen))
             state = DP_S_DONE;
 
         switch (state) {
@@ -198,7 +267,7 @@ dopr(
             if (ch == '%')
                 state = DP_S_FLAGS;
             else
-                dopr_outch(buffer, &currlen, maxlen, ch);
+                (*outch_fn)(buffer, &currlen, maxlen, ch);
             ch = *format++;
             break;
         case DP_S_FLAGS:
@@ -304,7 +373,8 @@ dopr(
                     value = va_arg(args, int);
                     break;
                 }
-                fmtint(buffer, &currlen, maxlen, value, 10, min, max, flags);
+                fmtint(outch_fn, buffer, &currlen, maxlen,
+                      value, 10, min, max, flags);
                 break;
             case 'X':
                 flags |= DP_F_UP;
@@ -329,7 +399,7 @@ dopr(
                         unsigned int);
                     break;
                 }
-                fmtint(buffer, &currlen, maxlen, value,
+                fmtint(outch_fn, buffer, &currlen, maxlen, value,
                        ch == 'o' ? 8 : (ch == 'u' ? 10 : 16),
                        min, max, flags);
                 break;
@@ -338,7 +408,8 @@ dopr(
                     fvalue = va_arg(args, LDOUBLE);
                 else
                     fvalue = va_arg(args, double);
-                fmtfp(buffer, &currlen, maxlen, fvalue, min, max, flags);
+                fmtfp(outch_fn, buffer, &currlen, maxlen,
+                     fvalue, min, max, flags);
                 break;
             case 'E':
                 flags |= DP_F_UP;
@@ -357,19 +428,19 @@ dopr(
                     fvalue = va_arg(args, double);
                 break;
             case 'c':
-                dopr_outch(buffer, &currlen, maxlen,
+                (*outch_fn)(buffer, &currlen, maxlen,
                     va_arg(args, int));
                 break;
             case 's':
                 strvalue = va_arg(args, char *);
                 if (max < 0)
-                    max = maxlen;
-                fmtstr(buffer, &currlen, maxlen, strvalue,
-                    flags, min, max);
+                    max = (*copy_fn)(*maxlen);
+                fmtstr(outch_fn, buffer, &currlen, maxlen, strvalue,
+                      flags, min, max);
                 break;
             case 'p':
                 value = (long)va_arg(args, void *);
-                fmtint(buffer, &currlen, maxlen,
+                fmtint(outch_fn, buffer, &currlen, maxlen,
                     value, 16, min, max, flags);
                 break;
             case 'n': /* XXX */
@@ -392,7 +463,7 @@ dopr(
                 }
                 break;
             case '%':
-                dopr_outch(buffer, &currlen, maxlen, ch);
+                (*outch_fn)(buffer, &currlen, maxlen, ch);
                 break;
             case 'w':
                 /* not supported yet, treat as next char */
@@ -413,19 +484,20 @@ dopr(
             break;
         }
     }
-    if (currlen >= maxlen - 1)
-        currlen = maxlen - 1;
-    buffer[currlen] = '\0';
+    if (currlen >= *maxlen - 1)
+        currlen = *maxlen - 1;
+    (*buffer)[currlen] = '\0';
     *retlen = currlen;
     return;
 }
 
 static void
 fmtstr(
-    char *buffer,
+    void (*outch_fn)(char **, size_t *, size_t *, int),
+    char **buffer,
     size_t *currlen,
-    size_t maxlen,
-    char *value,
+    size_t *maxlen,
+    const char *value,
     int flags,
     int min,
     int max)
@@ -444,16 +516,16 @@ fmtstr(
         padlen = -padlen;
 
     while ((padlen > 0) && (cnt < max)) {
-        dopr_outch(buffer, currlen, maxlen, ' ');
+        (*outch_fn)(buffer, currlen, maxlen, ' ');
         --padlen;
         ++cnt;
     }
     while (*value && (cnt < max)) {
-        dopr_outch(buffer, currlen, maxlen, *value++);
+        (*outch_fn)(buffer, currlen, maxlen, *value++);
         ++cnt;
     }
     while ((padlen < 0) && (cnt < max)) {
-        dopr_outch(buffer, currlen, maxlen, ' ');
+        (*outch_fn)(buffer, currlen, maxlen, ' ');
         ++padlen;
         ++cnt;
     }
@@ -461,9 +533,10 @@ fmtstr(
 
 static void
 fmtint(
-    char *buffer,
+    void (*outch_fn)(char **, size_t *, size_t *, int),
+    char **buffer,
     size_t *currlen,
-    size_t maxlen,
+    size_t *maxlen,
     LLONG value,
     int base,
     int min,
@@ -517,28 +590,28 @@ fmtint(
 
     /* spaces */
     while (spadlen > 0) {
-        dopr_outch(buffer, currlen, maxlen, ' ');
+        (*outch_fn)(buffer, currlen, maxlen, ' ');
         --spadlen;
     }
 
     /* sign */
     if (signvalue)
-        dopr_outch(buffer, currlen, maxlen, signvalue);
+        (*outch_fn)(buffer, currlen, maxlen, signvalue);
 
     /* zeros */
     if (zpadlen > 0) {
         while (zpadlen > 0) {
-            dopr_outch(buffer, currlen, maxlen, '0');
+            (*outch_fn)(buffer, currlen, maxlen, '0');
             --zpadlen;
         }
     }
     /* digits */
     while (place > 0)
-        dopr_outch(buffer, currlen, maxlen, convert[--place]);
+        (*outch_fn)(buffer, currlen, maxlen, convert[--place]);
 
     /* left justified spaces */
     while (spadlen < 0) {
-        dopr_outch(buffer, currlen, maxlen, ' ');
+        (*outch_fn)(buffer, currlen, maxlen, ' ');
         ++spadlen;
     }
     return;
@@ -577,9 +650,10 @@ round(LDOUBLE value)
 
 static void
 fmtfp(
-    char *buffer,
+    void (*outch_fn)(char **, size_t *, size_t *, int),
+    char **buffer,
     size_t *currlen,
-    size_t maxlen,
+    size_t *maxlen,
     LDOUBLE fvalue,
     int min,
     int max,
@@ -657,54 +731,114 @@ fmtfp(
 
     if ((flags & DP_F_ZERO) && (padlen > 0)) {
         if (signvalue) {
-            dopr_outch(buffer, currlen, maxlen, signvalue);
+            (*outch_fn)(buffer, currlen, maxlen, signvalue);
             --padlen;
             signvalue = 0;
         }
         while (padlen > 0) {
-            dopr_outch(buffer, currlen, maxlen, '0');
+            (*outch_fn)(buffer, currlen, maxlen, '0');
             --padlen;
         }
     }
     while (padlen > 0) {
-        dopr_outch(buffer, currlen, maxlen, ' ');
+        (*outch_fn)(buffer, currlen, maxlen, ' ');
         --padlen;
     }
     if (signvalue)
-        dopr_outch(buffer, currlen, maxlen, signvalue);
+        (*outch_fn)(buffer, currlen, maxlen, signvalue);
 
     while (iplace > 0)
-        dopr_outch(buffer, currlen, maxlen, iconvert[--iplace]);
+        (*outch_fn)(buffer, currlen, maxlen, iconvert[--iplace]);
 
     /*
      * Decimal point. This should probably use locale to find the correct
      * char to print out.
      */
     if (max > 0) {
-        dopr_outch(buffer, currlen, maxlen, '.');
+        (*outch_fn)(buffer, currlen, maxlen, '.');
 
         while (fplace > 0)
-            dopr_outch(buffer, currlen, maxlen, fconvert[--fplace]);
+            (*outch_fn)(buffer, currlen, maxlen, fconvert[--fplace]);
     }
     while (zpadlen > 0) {
-        dopr_outch(buffer, currlen, maxlen, '0');
+        (*outch_fn)(buffer, currlen, maxlen, '0');
         --zpadlen;
     }
 
     while (padlen < 0) {
-        dopr_outch(buffer, currlen, maxlen, ' ');
+        (*outch_fn)(buffer, currlen, maxlen, ' ');
         ++padlen;
     }
 }
 
+static int
+dopr_copy(
+    size_t len)
+{
+    return len;
+}
+
+#ifdef USE_ALLOCATING_PRINT
+static int
+doapr_copy(
+    size_t len)
+{
+    /* Return as high an integer as possible */
+    return INT_MAX;
+}
+#endif
+
+static int
+dopr_isbig(
+    size_t currlen,
+    size_t maxlen)
+{
+    return currlen > maxlen;
+}
+
+#ifdef USE_ALLOCATING_PRINT
+static int
+doapr_isbig(
+    size_t currlen,
+    size_t maxlen)
+{
+    return 0;
+}
+#endif
+
 static void
 dopr_outch(
-    char *buffer,
+    char **buffer,
     size_t *currlen,
-    size_t maxlen,
+    size_t *maxlen,
+    int c)
+{
+    if (*currlen < *maxlen)
+        (*buffer)[(*currlen)++] = (char)c;
+    return;
+}
+
+#ifdef USE_ALLOCATING_PRINT
+static void
+doapr_outch(
+    char **buffer,
+    size_t *currlen,
+    size_t *maxlen,
     int c)
 {
-    if (*currlen < maxlen)
-        buffer[(*currlen)++] = (char)c;
+    if (*buffer == NULL) {
+       if (*maxlen == 0)
+           *maxlen = 1024;
+       *buffer = Malloc(*maxlen);
+    }
+    while (*currlen >= *maxlen) {
+       *maxlen += 1024;
+       *buffer = Realloc(*buffer, *maxlen);
+    }
+    /* What to do if *buffer is NULL? */
+    assert(*buffer != NULL);
+
+    (*buffer)[(*currlen)++] = (char)c;
     return;
 }
+#endif
index bc08401..ebdb181 100644 (file)
@@ -507,7 +507,7 @@ int BIO_set(BIO *a,BIO_METHOD *type);
 int    BIO_free(BIO *a);
 int    BIO_read(BIO *b, void *data, int len);
 int    BIO_gets(BIO *bp,char *buf, int size);
-int    BIO_write(BIO *b, const char *data, int len);
+int    BIO_write(BIO *b, const void *data, int len);
 int    BIO_puts(BIO *bp,const char *buf);
 long   BIO_ctrl(BIO *bp,int cmd,long larg,void *parg);
 long   BIO_callback_ctrl(BIO *bp,int cmd,void (*fp)());
index b5f07de..f38e7b9 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index cf8e615..e88dcc8 100644 (file)
@@ -169,7 +169,7 @@ int BIO_read(BIO *b, void *out, int outl)
        return(i);
        }
 
-int BIO_write(BIO *b, const char *in, int inl)
+int BIO_write(BIO *b, const void *in, int inl)
        {
        int i;
        long (*cb)();
index 0d0f935..1e2d749 100644 (file)
 
 #include <openssl/bio.h>
 #include <openssl/err.h>
+#include <openssl/err.h>
 #include <openssl/crypto.h>
 
+#include "openssl/e_os.h"
+#ifndef SSIZE_MAX
+# define SSIZE_MAX INT_MAX
+#endif
+
 static int bio_new(BIO *bio);
 static int bio_free(BIO *bio);
 static int bio_read(BIO *bio, char *buf, int size);
@@ -205,10 +211,10 @@ static int bio_read(BIO *bio, char *buf, int size_)
  */
 /* WARNING: The non-copying interface is largely untested as of yet
  * and may contain bugs. */
-static size_t bio_nread0(BIO *bio, char **buf)
+static ssize_t bio_nread0(BIO *bio, char **buf)
        {
        struct bio_bio_st *b, *peer_b;
-       size_t num;
+       ssize_t num;
        
        BIO_clear_retry_flags(bio);
 
@@ -243,15 +249,20 @@ static size_t bio_nread0(BIO *bio, char **buf)
        return num;
        }
 
-static size_t bio_nread(BIO *bio, char **buf, size_t num)
+static ssize_t bio_nread(BIO *bio, char **buf, size_t num_)
        {
        struct bio_bio_st *b, *peer_b;
-       size_t available;
+       ssize_t num, available;
+
+       if (num_ > SSIZE_MAX)
+               num = SSIZE_MAX;
+       else
+               num = (ssize_t)num_;
 
        available = bio_nread0(bio, buf);
        if (num > available)
                num = available;
-       if (num == 0)
+       if (num <= 0)
                return num;
 
        b = bio->ptr;
@@ -351,7 +362,7 @@ static int bio_write(BIO *bio, char *buf, int num_)
  * (example usage:  bio_nwrite0(), write to buffer, bio_nwrite()
  *  or just         bio_nwrite(), write to buffer)
  */
-static size_t bio_nwrite0(BIO *bio, char **buf)
+static ssize_t bio_nwrite0(BIO *bio, char **buf)
        {
        struct bio_bio_st *b;
        size_t num;
@@ -399,15 +410,20 @@ static size_t bio_nwrite0(BIO *bio, char **buf)
        return num;
        }
 
-static size_t bio_nwrite(BIO *bio, char **buf, size_t num)
+static ssize_t bio_nwrite(BIO *bio, char **buf, size_t num_)
        {
        struct bio_bio_st *b;
-       size_t space;
+       ssize_t num, space;
+
+       if (num_ > SSIZE_MAX)
+               num = SSIZE_MAX;
+       else
+               num = (ssize_t)num_;
 
        space = bio_nwrite0(bio, buf);
        if (num > space)
                num = space;
-       if (num == 0)
+       if (num <= 0)
                return num;
        b = bio->ptr;
        assert(b != NULL);
@@ -509,6 +525,11 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr)
                ret = 1;
                break;
 
+       case BIO_C_NREAD0:
+               /* prepare for non-copying read */
+               ret = (long) bio_nread0(bio, ptr);
+               break;
+               
        case BIO_C_NREAD:
                /* non-copying read */
                ret = (long) bio_nread(bio, ptr, (size_t) num);
index 4308b19..497eb1a 100644 (file)
@@ -57,8 +57,8 @@
        Why BIO_s_log?
 
        BIO_s_log is useful for system daemons (or services under NT).
-       It is one-way BIO, it sends all stuff to syslogd (or event log
-       under NT).
+       It is one-way BIO, it sends all stuff to syslogd (on system that
+       commonly use that), or event log (on NT), or OPCOM (on OpenVMS).
 
 */
 
 #include <stdio.h>
 #include <errno.h>
 
-#ifndef WIN32
-#ifdef __ultrix
-#include <sys/syslog.h>
-#else
-#include <syslog.h>
-#endif
-#else
-#include <process.h>
+#if defined(WIN32)
+#  include <process.h>
+#elif defined(VMS) || defined(__VMS)
+#  include <opcdef.h>
+#  include <descrip.h>
+#  include <lib$routines.h>
+#  include <starlet.h>
+#elif defined(__ultrix)
+#  include <sys/syslog.h>
+#elif !defined(MSDOS) /* Unix */
+#  include <syslog.h>
 #endif
 
 #include "cryptlib.h"
 #include <openssl/buffer.h>
 #include <openssl/err.h>
+
 #ifndef NO_SYSLOG
 
+#if defined(WIN32)
+#define LOG_EMERG      0
+#define LOG_ALERT      1
+#define LOG_CRIT       2
+#define LOG_ERR                3
+#define LOG_WARNING    4
+#define LOG_NOTICE     5
+#define LOG_INFO       6
+#define LOG_DEBUG      7
+
+#define LOG_DAEMON     (3<<3)
+#elif defined(VMS)
+/* On VMS, we don't really care about these, but we need them to compile */
+#define LOG_EMERG      0
+#define LOG_ALERT      1
+#define LOG_CRIT       2
+#define LOG_ERR                3
+#define LOG_WARNING    4
+#define LOG_NOTICE     5
+#define LOG_INFO       6
+#define LOG_DEBUG      7
+
+#define LOG_DAEMON     OPC$M_NM_NTWORK
+#endif
 
 static int MS_CALLBACK slg_write(BIO *h,char *buf,int num);
 static int MS_CALLBACK slg_puts(BIO *h,char *str);
 static long MS_CALLBACK slg_ctrl(BIO *h,int cmd,long arg1,char *arg2);
 static int MS_CALLBACK slg_new(BIO *h);
 static int MS_CALLBACK slg_free(BIO *data);
-static int xopenlog(BIO* bp, const char* name, int level);
-static int xcloselog(BIO* bp);
+static void xopenlog(BIO* bp, const char* name, int level);
+static void xsyslog(BIO* bp, int priority, const char* string);
+static void xcloselog(BIO* bp);
 
 static BIO_METHOD methods_slg=
        {
@@ -113,11 +142,7 @@ static int MS_CALLBACK slg_new(BIO *bi)
        bi->init=1;
        bi->num=0;
        bi->ptr=NULL;
-#ifndef WIN32
        xopenlog(bi, "application", LOG_DAEMON);
-#else
-       xopenlog(bi, "application", 0);
-#endif
        return(1);
        }
 
@@ -133,43 +158,14 @@ static int MS_CALLBACK slg_write(BIO *b, char *in, int inl)
        int ret= inl;
        char* buf= in;
        char* pp;
-#if defined(WIN32)
-       LPCSTR lpszStrings[2];
-       WORD evtype= EVENTLOG_ERROR_TYPE;
-       int pid = _getpid();
-       char pidbuf[20];
-#else
        int priority;
-#endif
 
        if((buf= (char *)Malloc(inl+ 1)) == NULL){
                return(0);
        }
        strncpy(buf, in, inl);
        buf[inl]= '\0';
-#if defined(WIN32)
-       if(strncmp(buf, "ERR ", 4) == 0){
-               evtype= EVENTLOG_ERROR_TYPE;
-               pp= buf+ 4;
-       }else if(strncmp(buf, "WAR ", 4) == 0){
-               evtype= EVENTLOG_WARNING_TYPE;
-               pp= buf+ 4;
-       }else if(strncmp(buf, "INF ", 4) == 0){
-               evtype= EVENTLOG_INFORMATION_TYPE;
-               pp= buf+ 4;
-       }else{
-               evtype= EVENTLOG_ERROR_TYPE;
-               pp= buf;
-       }
 
-       sprintf(pidbuf, "[%d] ", pid);
-       lpszStrings[0] = pidbuf;
-       lpszStrings[1] = pp;
-
-       if(b->ptr)
-               ReportEvent(b->ptr, evtype, 0, 1024, NULL, 2, 0,
-                               lpszStrings, NULL);
-#else
        if(strncmp(buf, "ERR ", 4) == 0){
                priority= LOG_ERR;
                pp= buf+ 4;
@@ -184,8 +180,8 @@ static int MS_CALLBACK slg_write(BIO *b, char *in, int inl)
                pp= buf;
        }
 
-       syslog(priority, "%s", pp);
-#endif
+       xsyslog(b, priority, pp);
+
        Free(buf);
        return(ret);
        }
@@ -213,28 +209,128 @@ static int MS_CALLBACK slg_puts(BIO *bp, char *str)
        return(ret);
        }
 
-static int xopenlog(BIO* bp, const char* name, int level)
-{
 #if defined(WIN32)
-       if((bp->ptr= (char *)RegisterEventSource(NULL, name)) == NULL){
-               return(0);
-       }
-#else
-       openlog(name, LOG_PID|LOG_CONS, level);
-#endif
-       return(1);
+
+static void xopenlog(BIO* bp, const char* name, int level)
+{
+       bp->ptr= (char *)RegisterEventSource(NULL, name);
 }
 
-static int xcloselog(BIO* bp)
+static void xsyslog(BIO *bp, int priority, const char *string)
+{
+       LPCSTR lpszStrings[2];
+       WORD evtype= EVENTLOG_ERROR_TYPE;
+       int pid = _getpid();
+       char pidbuf[20];
+
+       switch (priority)
+               {
+       case LOG_ERR:
+               evtype = EVENTLOG_ERROR_TYPE;
+               break;
+       case LOG_WARNING:
+               evtype = EVENTLOG_WARNING_TYPE;
+               break;
+       case LOG_INFO:
+               evtype = EVENTLOG_INFORMATION_TYPE;
+               break;
+       default:
+               evtype = EVENTLOG_ERROR_TYPE;
+               break;
+               }
+
+       sprintf(pidbuf, "[%d] ", pid);
+       lpszStrings[0] = pidbuf;
+       lpszStrings[1] = string;
+
+       if(bp->ptr)
+               ReportEvent(bp->ptr, evtype, 0, 1024, NULL, 2, 0,
+                               lpszStrings, NULL);
+}
+       
+static void xcloselog(BIO* bp)
 {
-#if defined(WIN32)
        if(bp->ptr)
                DeregisterEventSource((HANDLE)(bp->ptr));
        bp->ptr= NULL;
-#else
+}
+
+#elif defined(VMS)
+
+static int VMS_OPC_target = LOG_DAEMON;
+
+static void xopenlog(BIO* bp, const char* name, int level)
+{
+       VMS_OPC_target = level; 
+}
+
+static void xsyslog(BIO *bp, int priority, const char *string)
+{
+       struct dsc$descriptor_s opc_dsc;
+       struct opcdef *opcdef_p;
+       char buf[10240];
+       unsigned int len;
+        struct dsc$descriptor_s buf_dsc;
+       $DESCRIPTOR(fao_cmd, "!AZ: !AZ");
+       char *priority_tag;
+
+       switch (priority)
+         {
+         case LOG_EMERG: priority_tag = "Emergency"; break;
+         case LOG_ALERT: priority_tag = "Alert"; break;
+         case LOG_CRIT: priority_tag = "Critical"; break;
+         case LOG_ERR: priority_tag = "Error"; break;
+         case LOG_WARNING: priority_tag = "Warning"; break;
+         case LOG_NOTICE: priority_tag = "Notice"; break;
+         case LOG_INFO: priority_tag = "Info"; break;
+         case LOG_DEBUG: priority_tag = "DEBUG"; break;
+         }
+
+       buf_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
+       buf_dsc.dsc$b_class = DSC$K_CLASS_S;
+       buf_dsc.dsc$a_pointer = buf;
+       buf_dsc.dsc$w_length = sizeof(buf) - 1;
+
+       lib$sys_fao(&fao_cmd, &len, &buf_dsc, priority_tag, string);
+
+       /* we know there's an 8 byte header.  That's documented */
+       opcdef_p = (struct opcdef *) Malloc(8 + len);
+       opcdef_p->opc$b_ms_type = OPC$_RQ_RQST;
+       memcpy(opcdef_p->opc$z_ms_target_classes, &VMS_OPC_target, 3);
+       opcdef_p->opc$l_ms_rqstid = 0;
+       memcpy(&opcdef_p->opc$l_ms_text, buf, len);
+
+       opc_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
+       opc_dsc.dsc$b_class = DSC$K_CLASS_S;
+       opc_dsc.dsc$a_pointer = (char *)opcdef_p;
+       opc_dsc.dsc$w_length = len + 8;
+
+       sys$sndopr(opc_dsc, 0);
+
+       Free(opcdef_p);
+}
+
+static void xcloselog(BIO* bp)
+{
+}
+
+#else /* Unix */
+
+static void xopenlog(BIO* bp, const char* name, int level)
+{
+       openlog(name, LOG_PID|LOG_CONS, level);
+}
+
+static void xsyslog(BIO *bp, int priority, const char *string)
+{
+       syslog(priority, "%s", string);
+}
+
+static void xcloselog(BIO* bp)
+{
        closelog();
-#endif
-       return(1);
 }
 
-#endif
+#endif /* Unix */
+
+#endif /* NO_SYSLOG */
index fa23a43..beb9c1b 100644 (file)
@@ -5,6 +5,7 @@
 DIR=   bn
 TOP=   ../..
 CC=    cc
+CPP=    $(CC) -E
 INCLUDES= -I.. -I../../include
 CFLAG=-g
 INSTALL_PREFIX=
@@ -72,10 +73,10 @@ lib:        $(LIBOBJ)
 
 # elf
 asm/bn86-elf.o: asm/bn86unix.cpp
-       $(CPP) -DELF asm/bn86unix.cpp | as -o asm/bn86-elf.o
+       $(CPP) -DELF -x c asm/bn86unix.cpp | as -o asm/bn86-elf.o
 
 asm/co86-elf.o: asm/co86unix.cpp
-       $(CPP) -DELF asm/co86unix.cpp | as -o asm/co86-elf.o
+       $(CPP) -DELF -x c asm/co86unix.cpp | as -o asm/co86-elf.o
 
 # solaris
 asm/bn86-sol.o: asm/bn86unix.cpp
@@ -102,10 +103,10 @@ asm/bn86bsdi.o: asm/bn86unix.cpp
 asm/co86bsdi.o: asm/co86unix.cpp
        $(CPP) -DBSDI asm/co86unix.cpp | sed 's/ :/:/' | as -o asm/co86bsdi.o
 
-asm/bn86unix.cpp: asm/bn-586.pl
+asm/bn86unix.cpp: asm/bn-586.pl ../perlasm/x86asm.pl
        (cd asm; $(PERL) bn-586.pl cpp >bn86unix.cpp )
 
-asm/co86unix.cpp: asm/co-586.pl
+asm/co86unix.cpp: asm/co-586.pl ../perlasm/x86asm.pl
        (cd asm; $(PERL) co-586.pl cpp >co86unix.cpp )
 
 asm/sparcv8.o: asm/sparcv8.S
index 871bd88..e69de29 100644 (file)
-       ; Don't even think of reading this code
-       ; It was automatically generated by bn-586.pl
-       ; Which is a perl program used to generate the x86 assember for
-       ; any of elf, a.out, BSDI,Win32, or Solaris
-       ; eric <eay@cryptsoft.com>
-       ; 
-       TITLE   bn-586.asm
-        .386
-.model FLAT
-_TEXT  SEGMENT
-PUBLIC _bn_mul_add_words
-
-_bn_mul_add_words PROC NEAR
-       push    ebp
-       push    ebx
-       push    esi
-       push    edi
-       ; 
-       xor     esi,            esi
-       mov     edi,            DWORD PTR 20[esp]
-       mov     ecx,            DWORD PTR 28[esp]
-       mov     ebx,            DWORD PTR 24[esp]
-       and     ecx,            4294967288
-       mov     ebp,            DWORD PTR 32[esp]
-       push    ecx
-       jz      $L000maw_finish
-L001maw_loop:
-       mov     DWORD PTR [esp],ecx
-       ; Round 0
-       mov     eax,            DWORD PTR [ebx]
-       mul     ebp
-       add     eax,            esi
-       mov     esi,            DWORD PTR [edi]
-       adc     edx,            0
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR [edi],eax
-       mov     esi,            edx
-       ; Round 4
-       mov     eax,            DWORD PTR 4[ebx]
-       mul     ebp
-       add     eax,            esi
-       mov     esi,            DWORD PTR 4[edi]
-       adc     edx,            0
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 4[edi],eax
-       mov     esi,            edx
-       ; Round 8
-       mov     eax,            DWORD PTR 8[ebx]
-       mul     ebp
-       add     eax,            esi
-       mov     esi,            DWORD PTR 8[edi]
-       adc     edx,            0
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 8[edi],eax
-       mov     esi,            edx
-       ; Round 12
-       mov     eax,            DWORD PTR 12[ebx]
-       mul     ebp
-       add     eax,            esi
-       mov     esi,            DWORD PTR 12[edi]
-       adc     edx,            0
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 12[edi],eax
-       mov     esi,            edx
-       ; Round 16
-       mov     eax,            DWORD PTR 16[ebx]
-       mul     ebp
-       add     eax,            esi
-       mov     esi,            DWORD PTR 16[edi]
-       adc     edx,            0
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 16[edi],eax
-       mov     esi,            edx
-       ; Round 20
-       mov     eax,            DWORD PTR 20[ebx]
-       mul     ebp
-       add     eax,            esi
-       mov     esi,            DWORD PTR 20[edi]
-       adc     edx,            0
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 20[edi],eax
-       mov     esi,            edx
-       ; Round 24
-       mov     eax,            DWORD PTR 24[ebx]
-       mul     ebp
-       add     eax,            esi
-       mov     esi,            DWORD PTR 24[edi]
-       adc     edx,            0
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 24[edi],eax
-       mov     esi,            edx
-       ; Round 28
-       mov     eax,            DWORD PTR 28[ebx]
-       mul     ebp
-       add     eax,            esi
-       mov     esi,            DWORD PTR 28[edi]
-       adc     edx,            0
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 28[edi],eax
-       mov     esi,            edx
-       ; 
-       mov     ecx,            DWORD PTR [esp]
-       add     ebx,            32
-       add     edi,            32
-       sub     ecx,            8
-       jnz     L001maw_loop
-$L000maw_finish:
-       mov     ecx,            DWORD PTR 32[esp]
-       and     ecx,            7
-       jnz     $L002maw_finish2
-       jmp     $L003maw_end
-$L002maw_finish2:
-       ; Tail Round 0
-       mov     eax,            DWORD PTR [ebx]
-       mul     ebp
-       add     eax,            esi
-       mov     esi,            DWORD PTR [edi]
-       adc     edx,            0
-       add     eax,            esi
-       adc     edx,            0
-       dec     ecx
-       mov     DWORD PTR [edi],eax
-       mov     esi,            edx
-       jz      $L003maw_end
-       ; Tail Round 1
-       mov     eax,            DWORD PTR 4[ebx]
-       mul     ebp
-       add     eax,            esi
-       mov     esi,            DWORD PTR 4[edi]
-       adc     edx,            0
-       add     eax,            esi
-       adc     edx,            0
-       dec     ecx
-       mov     DWORD PTR 4[edi],eax
-       mov     esi,            edx
-       jz      $L003maw_end
-       ; Tail Round 2
-       mov     eax,            DWORD PTR 8[ebx]
-       mul     ebp
-       add     eax,            esi
-       mov     esi,            DWORD PTR 8[edi]
-       adc     edx,            0
-       add     eax,            esi
-       adc     edx,            0
-       dec     ecx
-       mov     DWORD PTR 8[edi],eax
-       mov     esi,            edx
-       jz      $L003maw_end
-       ; Tail Round 3
-       mov     eax,            DWORD PTR 12[ebx]
-       mul     ebp
-       add     eax,            esi
-       mov     esi,            DWORD PTR 12[edi]
-       adc     edx,            0
-       add     eax,            esi
-       adc     edx,            0
-       dec     ecx
-       mov     DWORD PTR 12[edi],eax
-       mov     esi,            edx
-       jz      $L003maw_end
-       ; Tail Round 4
-       mov     eax,            DWORD PTR 16[ebx]
-       mul     ebp
-       add     eax,            esi
-       mov     esi,            DWORD PTR 16[edi]
-       adc     edx,            0
-       add     eax,            esi
-       adc     edx,            0
-       dec     ecx
-       mov     DWORD PTR 16[edi],eax
-       mov     esi,            edx
-       jz      $L003maw_end
-       ; Tail Round 5
-       mov     eax,            DWORD PTR 20[ebx]
-       mul     ebp
-       add     eax,            esi
-       mov     esi,            DWORD PTR 20[edi]
-       adc     edx,            0
-       add     eax,            esi
-       adc     edx,            0
-       dec     ecx
-       mov     DWORD PTR 20[edi],eax
-       mov     esi,            edx
-       jz      $L003maw_end
-       ; Tail Round 6
-       mov     eax,            DWORD PTR 24[ebx]
-       mul     ebp
-       add     eax,            esi
-       mov     esi,            DWORD PTR 24[edi]
-       adc     edx,            0
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 24[edi],eax
-       mov     esi,            edx
-$L003maw_end:
-       mov     eax,            esi
-       pop     ecx
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-_bn_mul_add_words ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _bn_mul_words
-
-_bn_mul_words PROC NEAR
-       push    ebp
-       push    ebx
-       push    esi
-       push    edi
-       ; 
-       xor     esi,            esi
-       mov     edi,            DWORD PTR 20[esp]
-       mov     ebx,            DWORD PTR 24[esp]
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     ecx,            DWORD PTR 32[esp]
-       and     ebp,            4294967288
-       jz      $L004mw_finish
-L005mw_loop:
-       ; Round 0
-       mov     eax,            DWORD PTR [ebx]
-       mul     ecx
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR [edi],eax
-       mov     esi,            edx
-       ; Round 4
-       mov     eax,            DWORD PTR 4[ebx]
-       mul     ecx
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 4[edi],eax
-       mov     esi,            edx
-       ; Round 8
-       mov     eax,            DWORD PTR 8[ebx]
-       mul     ecx
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 8[edi],eax
-       mov     esi,            edx
-       ; Round 12
-       mov     eax,            DWORD PTR 12[ebx]
-       mul     ecx
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 12[edi],eax
-       mov     esi,            edx
-       ; Round 16
-       mov     eax,            DWORD PTR 16[ebx]
-       mul     ecx
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 16[edi],eax
-       mov     esi,            edx
-       ; Round 20
-       mov     eax,            DWORD PTR 20[ebx]
-       mul     ecx
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 20[edi],eax
-       mov     esi,            edx
-       ; Round 24
-       mov     eax,            DWORD PTR 24[ebx]
-       mul     ecx
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 24[edi],eax
-       mov     esi,            edx
-       ; Round 28
-       mov     eax,            DWORD PTR 28[ebx]
-       mul     ecx
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 28[edi],eax
-       mov     esi,            edx
-       ; 
-       add     ebx,            32
-       add     edi,            32
-       sub     ebp,            8
-       jz      $L004mw_finish
-       jmp     L005mw_loop
-$L004mw_finish:
-       mov     ebp,            DWORD PTR 28[esp]
-       and     ebp,            7
-       jnz     $L006mw_finish2
-       jmp     $L007mw_end
-$L006mw_finish2:
-       ; Tail Round 0
-       mov     eax,            DWORD PTR [ebx]
-       mul     ecx
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR [edi],eax
-       mov     esi,            edx
-       dec     ebp
-       jz      $L007mw_end
-       ; Tail Round 1
-       mov     eax,            DWORD PTR 4[ebx]
-       mul     ecx
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 4[edi],eax
-       mov     esi,            edx
-       dec     ebp
-       jz      $L007mw_end
-       ; Tail Round 2
-       mov     eax,            DWORD PTR 8[ebx]
-       mul     ecx
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 8[edi],eax
-       mov     esi,            edx
-       dec     ebp
-       jz      $L007mw_end
-       ; Tail Round 3
-       mov     eax,            DWORD PTR 12[ebx]
-       mul     ecx
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 12[edi],eax
-       mov     esi,            edx
-       dec     ebp
-       jz      $L007mw_end
-       ; Tail Round 4
-       mov     eax,            DWORD PTR 16[ebx]
-       mul     ecx
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 16[edi],eax
-       mov     esi,            edx
-       dec     ebp
-       jz      $L007mw_end
-       ; Tail Round 5
-       mov     eax,            DWORD PTR 20[ebx]
-       mul     ecx
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 20[edi],eax
-       mov     esi,            edx
-       dec     ebp
-       jz      $L007mw_end
-       ; Tail Round 6
-       mov     eax,            DWORD PTR 24[ebx]
-       mul     ecx
-       add     eax,            esi
-       adc     edx,            0
-       mov     DWORD PTR 24[edi],eax
-       mov     esi,            edx
-$L007mw_end:
-       mov     eax,            esi
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-_bn_mul_words ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _bn_sqr_words
-
-_bn_sqr_words PROC NEAR
-       push    ebp
-       push    ebx
-       push    esi
-       push    edi
-       ; 
-       mov     esi,            DWORD PTR 20[esp]
-       mov     edi,            DWORD PTR 24[esp]
-       mov     ebx,            DWORD PTR 28[esp]
-       and     ebx,            4294967288
-       jz      $L008sw_finish
-L009sw_loop:
-       ; Round 0
-       mov     eax,            DWORD PTR [edi]
-       mul     eax
-       mov     DWORD PTR [esi],eax
-       mov     DWORD PTR 4[esi],edx
-       ; Round 4
-       mov     eax,            DWORD PTR 4[edi]
-       mul     eax
-       mov     DWORD PTR 8[esi],eax
-       mov     DWORD PTR 12[esi],edx
-       ; Round 8
-       mov     eax,            DWORD PTR 8[edi]
-       mul     eax
-       mov     DWORD PTR 16[esi],eax
-       mov     DWORD PTR 20[esi],edx
-       ; Round 12
-       mov     eax,            DWORD PTR 12[edi]
-       mul     eax
-       mov     DWORD PTR 24[esi],eax
-       mov     DWORD PTR 28[esi],edx
-       ; Round 16
-       mov     eax,            DWORD PTR 16[edi]
-       mul     eax
-       mov     DWORD PTR 32[esi],eax
-       mov     DWORD PTR 36[esi],edx
-       ; Round 20
-       mov     eax,            DWORD PTR 20[edi]
-       mul     eax
-       mov     DWORD PTR 40[esi],eax
-       mov     DWORD PTR 44[esi],edx
-       ; Round 24
-       mov     eax,            DWORD PTR 24[edi]
-       mul     eax
-       mov     DWORD PTR 48[esi],eax
-       mov     DWORD PTR 52[esi],edx
-       ; Round 28
-       mov     eax,            DWORD PTR 28[edi]
-       mul     eax
-       mov     DWORD PTR 56[esi],eax
-       mov     DWORD PTR 60[esi],edx
-       ; 
-       add     edi,            32
-       add     esi,            64
-       sub     ebx,            8
-       jnz     L009sw_loop
-$L008sw_finish:
-       mov     ebx,            DWORD PTR 28[esp]
-       and     ebx,            7
-       jz      $L010sw_end
-       ; Tail Round 0
-       mov     eax,            DWORD PTR [edi]
-       mul     eax
-       mov     DWORD PTR [esi],eax
-       dec     ebx
-       mov     DWORD PTR 4[esi],edx
-       jz      $L010sw_end
-       ; Tail Round 1
-       mov     eax,            DWORD PTR 4[edi]
-       mul     eax
-       mov     DWORD PTR 8[esi],eax
-       dec     ebx
-       mov     DWORD PTR 12[esi],edx
-       jz      $L010sw_end
-       ; Tail Round 2
-       mov     eax,            DWORD PTR 8[edi]
-       mul     eax
-       mov     DWORD PTR 16[esi],eax
-       dec     ebx
-       mov     DWORD PTR 20[esi],edx
-       jz      $L010sw_end
-       ; Tail Round 3
-       mov     eax,            DWORD PTR 12[edi]
-       mul     eax
-       mov     DWORD PTR 24[esi],eax
-       dec     ebx
-       mov     DWORD PTR 28[esi],edx
-       jz      $L010sw_end
-       ; Tail Round 4
-       mov     eax,            DWORD PTR 16[edi]
-       mul     eax
-       mov     DWORD PTR 32[esi],eax
-       dec     ebx
-       mov     DWORD PTR 36[esi],edx
-       jz      $L010sw_end
-       ; Tail Round 5
-       mov     eax,            DWORD PTR 20[edi]
-       mul     eax
-       mov     DWORD PTR 40[esi],eax
-       dec     ebx
-       mov     DWORD PTR 44[esi],edx
-       jz      $L010sw_end
-       ; Tail Round 6
-       mov     eax,            DWORD PTR 24[edi]
-       mul     eax
-       mov     DWORD PTR 48[esi],eax
-       mov     DWORD PTR 52[esi],edx
-$L010sw_end:
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-_bn_sqr_words ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _bn_div_words
-
-_bn_div_words PROC NEAR
-       push    ebp
-       push    ebx
-       push    esi
-       push    edi
-       mov     edx,            DWORD PTR 20[esp]
-       mov     eax,            DWORD PTR 24[esp]
-       mov     ebx,            DWORD PTR 28[esp]
-       div     ebx
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-_bn_div_words ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _bn_add_words
-
-_bn_add_words PROC NEAR
-       push    ebp
-       push    ebx
-       push    esi
-       push    edi
-       ; 
-       mov     ebx,            DWORD PTR 20[esp]
-       mov     esi,            DWORD PTR 24[esp]
-       mov     edi,            DWORD PTR 28[esp]
-       mov     ebp,            DWORD PTR 32[esp]
-       xor     eax,            eax
-       and     ebp,            4294967288
-       jz      $L011aw_finish
-L012aw_loop:
-       ; Round 0
-       mov     ecx,            DWORD PTR [esi]
-       mov     edx,            DWORD PTR [edi]
-       add     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       add     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR [ebx],ecx
-       ; Round 1
-       mov     ecx,            DWORD PTR 4[esi]
-       mov     edx,            DWORD PTR 4[edi]
-       add     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       add     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR 4[ebx],ecx
-       ; Round 2
-       mov     ecx,            DWORD PTR 8[esi]
-       mov     edx,            DWORD PTR 8[edi]
-       add     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       add     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR 8[ebx],ecx
-       ; Round 3
-       mov     ecx,            DWORD PTR 12[esi]
-       mov     edx,            DWORD PTR 12[edi]
-       add     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       add     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR 12[ebx],ecx
-       ; Round 4
-       mov     ecx,            DWORD PTR 16[esi]
-       mov     edx,            DWORD PTR 16[edi]
-       add     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       add     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR 16[ebx],ecx
-       ; Round 5
-       mov     ecx,            DWORD PTR 20[esi]
-       mov     edx,            DWORD PTR 20[edi]
-       add     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       add     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR 20[ebx],ecx
-       ; Round 6
-       mov     ecx,            DWORD PTR 24[esi]
-       mov     edx,            DWORD PTR 24[edi]
-       add     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       add     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR 24[ebx],ecx
-       ; Round 7
-       mov     ecx,            DWORD PTR 28[esi]
-       mov     edx,            DWORD PTR 28[edi]
-       add     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       add     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR 28[ebx],ecx
-       ; 
-       add     esi,            32
-       add     edi,            32
-       add     ebx,            32
-       sub     ebp,            8
-       jnz     L012aw_loop
-$L011aw_finish:
-       mov     ebp,            DWORD PTR 32[esp]
-       and     ebp,            7
-       jz      $L013aw_end
-       ; Tail Round 0
-       mov     ecx,            DWORD PTR [esi]
-       mov     edx,            DWORD PTR [edi]
-       add     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       add     ecx,            edx
-       adc     eax,            0
-       dec     ebp
-       mov     DWORD PTR [ebx],ecx
-       jz      $L013aw_end
-       ; Tail Round 1
-       mov     ecx,            DWORD PTR 4[esi]
-       mov     edx,            DWORD PTR 4[edi]
-       add     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       add     ecx,            edx
-       adc     eax,            0
-       dec     ebp
-       mov     DWORD PTR 4[ebx],ecx
-       jz      $L013aw_end
-       ; Tail Round 2
-       mov     ecx,            DWORD PTR 8[esi]
-       mov     edx,            DWORD PTR 8[edi]
-       add     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       add     ecx,            edx
-       adc     eax,            0
-       dec     ebp
-       mov     DWORD PTR 8[ebx],ecx
-       jz      $L013aw_end
-       ; Tail Round 3
-       mov     ecx,            DWORD PTR 12[esi]
-       mov     edx,            DWORD PTR 12[edi]
-       add     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       add     ecx,            edx
-       adc     eax,            0
-       dec     ebp
-       mov     DWORD PTR 12[ebx],ecx
-       jz      $L013aw_end
-       ; Tail Round 4
-       mov     ecx,            DWORD PTR 16[esi]
-       mov     edx,            DWORD PTR 16[edi]
-       add     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       add     ecx,            edx
-       adc     eax,            0
-       dec     ebp
-       mov     DWORD PTR 16[ebx],ecx
-       jz      $L013aw_end
-       ; Tail Round 5
-       mov     ecx,            DWORD PTR 20[esi]
-       mov     edx,            DWORD PTR 20[edi]
-       add     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       add     ecx,            edx
-       adc     eax,            0
-       dec     ebp
-       mov     DWORD PTR 20[ebx],ecx
-       jz      $L013aw_end
-       ; Tail Round 6
-       mov     ecx,            DWORD PTR 24[esi]
-       mov     edx,            DWORD PTR 24[edi]
-       add     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       add     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR 24[ebx],ecx
-$L013aw_end:
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-_bn_add_words ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _bn_sub_words
-
-_bn_sub_words PROC NEAR
-       push    ebp
-       push    ebx
-       push    esi
-       push    edi
-       ; 
-       mov     ebx,            DWORD PTR 20[esp]
-       mov     esi,            DWORD PTR 24[esp]
-       mov     edi,            DWORD PTR 28[esp]
-       mov     ebp,            DWORD PTR 32[esp]
-       xor     eax,            eax
-       and     ebp,            4294967288
-       jz      $L014aw_finish
-L015aw_loop:
-       ; Round 0
-       mov     ecx,            DWORD PTR [esi]
-       mov     edx,            DWORD PTR [edi]
-       sub     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       sub     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR [ebx],ecx
-       ; Round 1
-       mov     ecx,            DWORD PTR 4[esi]
-       mov     edx,            DWORD PTR 4[edi]
-       sub     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       sub     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR 4[ebx],ecx
-       ; Round 2
-       mov     ecx,            DWORD PTR 8[esi]
-       mov     edx,            DWORD PTR 8[edi]
-       sub     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       sub     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR 8[ebx],ecx
-       ; Round 3
-       mov     ecx,            DWORD PTR 12[esi]
-       mov     edx,            DWORD PTR 12[edi]
-       sub     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       sub     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR 12[ebx],ecx
-       ; Round 4
-       mov     ecx,            DWORD PTR 16[esi]
-       mov     edx,            DWORD PTR 16[edi]
-       sub     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       sub     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR 16[ebx],ecx
-       ; Round 5
-       mov     ecx,            DWORD PTR 20[esi]
-       mov     edx,            DWORD PTR 20[edi]
-       sub     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       sub     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR 20[ebx],ecx
-       ; Round 6
-       mov     ecx,            DWORD PTR 24[esi]
-       mov     edx,            DWORD PTR 24[edi]
-       sub     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       sub     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR 24[ebx],ecx
-       ; Round 7
-       mov     ecx,            DWORD PTR 28[esi]
-       mov     edx,            DWORD PTR 28[edi]
-       sub     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       sub     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR 28[ebx],ecx
-       ; 
-       add     esi,            32
-       add     edi,            32
-       add     ebx,            32
-       sub     ebp,            8
-       jnz     L015aw_loop
-$L014aw_finish:
-       mov     ebp,            DWORD PTR 32[esp]
-       and     ebp,            7
-       jz      $L016aw_end
-       ; Tail Round 0
-       mov     ecx,            DWORD PTR [esi]
-       mov     edx,            DWORD PTR [edi]
-       sub     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       sub     ecx,            edx
-       adc     eax,            0
-       dec     ebp
-       mov     DWORD PTR [ebx],ecx
-       jz      $L016aw_end
-       ; Tail Round 1
-       mov     ecx,            DWORD PTR 4[esi]
-       mov     edx,            DWORD PTR 4[edi]
-       sub     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       sub     ecx,            edx
-       adc     eax,            0
-       dec     ebp
-       mov     DWORD PTR 4[ebx],ecx
-       jz      $L016aw_end
-       ; Tail Round 2
-       mov     ecx,            DWORD PTR 8[esi]
-       mov     edx,            DWORD PTR 8[edi]
-       sub     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       sub     ecx,            edx
-       adc     eax,            0
-       dec     ebp
-       mov     DWORD PTR 8[ebx],ecx
-       jz      $L016aw_end
-       ; Tail Round 3
-       mov     ecx,            DWORD PTR 12[esi]
-       mov     edx,            DWORD PTR 12[edi]
-       sub     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       sub     ecx,            edx
-       adc     eax,            0
-       dec     ebp
-       mov     DWORD PTR 12[ebx],ecx
-       jz      $L016aw_end
-       ; Tail Round 4
-       mov     ecx,            DWORD PTR 16[esi]
-       mov     edx,            DWORD PTR 16[edi]
-       sub     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       sub     ecx,            edx
-       adc     eax,            0
-       dec     ebp
-       mov     DWORD PTR 16[ebx],ecx
-       jz      $L016aw_end
-       ; Tail Round 5
-       mov     ecx,            DWORD PTR 20[esi]
-       mov     edx,            DWORD PTR 20[edi]
-       sub     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       sub     ecx,            edx
-       adc     eax,            0
-       dec     ebp
-       mov     DWORD PTR 20[ebx],ecx
-       jz      $L016aw_end
-       ; Tail Round 6
-       mov     ecx,            DWORD PTR 24[esi]
-       mov     edx,            DWORD PTR 24[edi]
-       sub     ecx,            eax
-       mov     eax,            0
-       adc     eax,            eax
-       sub     ecx,            edx
-       adc     eax,            0
-       mov     DWORD PTR 24[ebx],ecx
-$L016aw_end:
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-_bn_sub_words ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _bn_mul_comba8
-
-_bn_mul_comba8 PROC NEAR
-       push    esi
-       mov     esi,            DWORD PTR 12[esp]
-       push    edi
-       mov     edi,            DWORD PTR 20[esp]
-       push    ebp
-       push    ebx
-       xor     ebx,            ebx
-       mov     eax,            DWORD PTR [esi]
-       xor     ecx,            ecx
-       mov     edx,            DWORD PTR [edi]
-       ; ################## Calculate word 0
-       xor     ebp,            ebp
-       ; mul a[0]*b[0]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR [edi]
-       adc     ebp,            0
-       mov     DWORD PTR [eax],ebx
-       mov     eax,            DWORD PTR 4[esi]
-       ; saved r[0]
-       ; ################## Calculate word 1
-       xor     ebx,            ebx
-       ; mul a[1]*b[0]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR [esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 4[edi]
-       adc     ebx,            0
-       ; mul a[0]*b[1]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR [edi]
-       adc     ebx,            0
-       mov     DWORD PTR 4[eax],ecx
-       mov     eax,            DWORD PTR 8[esi]
-       ; saved r[1]
-       ; ################## Calculate word 2
-       xor     ecx,            ecx
-       ; mul a[2]*b[0]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 4[esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 4[edi]
-       adc     ecx,            0
-       ; mul a[1]*b[1]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR [esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 8[edi]
-       adc     ecx,            0
-       ; mul a[0]*b[2]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR [edi]
-       adc     ecx,            0
-       mov     DWORD PTR 8[eax],ebp
-       mov     eax,            DWORD PTR 12[esi]
-       ; saved r[2]
-       ; ################## Calculate word 3
-       xor     ebp,            ebp
-       ; mul a[3]*b[0]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 8[esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 4[edi]
-       adc     ebp,            0
-       ; mul a[2]*b[1]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 4[esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 8[edi]
-       adc     ebp,            0
-       ; mul a[1]*b[2]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR [esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 12[edi]
-       adc     ebp,            0
-       ; mul a[0]*b[3]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR [edi]
-       adc     ebp,            0
-       mov     DWORD PTR 12[eax],ebx
-       mov     eax,            DWORD PTR 16[esi]
-       ; saved r[3]
-       ; ################## Calculate word 4
-       xor     ebx,            ebx
-       ; mul a[4]*b[0]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 12[esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 4[edi]
-       adc     ebx,            0
-       ; mul a[3]*b[1]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 8[esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 8[edi]
-       adc     ebx,            0
-       ; mul a[2]*b[2]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 4[esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 12[edi]
-       adc     ebx,            0
-       ; mul a[1]*b[3]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR [esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 16[edi]
-       adc     ebx,            0
-       ; mul a[0]*b[4]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR [edi]
-       adc     ebx,            0
-       mov     DWORD PTR 16[eax],ecx
-       mov     eax,            DWORD PTR 20[esi]
-       ; saved r[4]
-       ; ################## Calculate word 5
-       xor     ecx,            ecx
-       ; mul a[5]*b[0]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 16[esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 4[edi]
-       adc     ecx,            0
-       ; mul a[4]*b[1]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 12[esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 8[edi]
-       adc     ecx,            0
-       ; mul a[3]*b[2]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 8[esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 12[edi]
-       adc     ecx,            0
-       ; mul a[2]*b[3]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 4[esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 16[edi]
-       adc     ecx,            0
-       ; mul a[1]*b[4]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR [esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 20[edi]
-       adc     ecx,            0
-       ; mul a[0]*b[5]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR [edi]
-       adc     ecx,            0
-       mov     DWORD PTR 20[eax],ebp
-       mov     eax,            DWORD PTR 24[esi]
-       ; saved r[5]
-       ; ################## Calculate word 6
-       xor     ebp,            ebp
-       ; mul a[6]*b[0]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 20[esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 4[edi]
-       adc     ebp,            0
-       ; mul a[5]*b[1]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 16[esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 8[edi]
-       adc     ebp,            0
-       ; mul a[4]*b[2]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 12[esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 12[edi]
-       adc     ebp,            0
-       ; mul a[3]*b[3]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 8[esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 16[edi]
-       adc     ebp,            0
-       ; mul a[2]*b[4]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 4[esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 20[edi]
-       adc     ebp,            0
-       ; mul a[1]*b[5]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR [esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 24[edi]
-       adc     ebp,            0
-       ; mul a[0]*b[6]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR [edi]
-       adc     ebp,            0
-       mov     DWORD PTR 24[eax],ebx
-       mov     eax,            DWORD PTR 28[esi]
-       ; saved r[6]
-       ; ################## Calculate word 7
-       xor     ebx,            ebx
-       ; mul a[7]*b[0]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 24[esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 4[edi]
-       adc     ebx,            0
-       ; mul a[6]*b[1]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 20[esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 8[edi]
-       adc     ebx,            0
-       ; mul a[5]*b[2]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 16[esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 12[edi]
-       adc     ebx,            0
-       ; mul a[4]*b[3]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 12[esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 16[edi]
-       adc     ebx,            0
-       ; mul a[3]*b[4]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 8[esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 20[edi]
-       adc     ebx,            0
-       ; mul a[2]*b[5]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 4[esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 24[edi]
-       adc     ebx,            0
-       ; mul a[1]*b[6]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR [esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 28[edi]
-       adc     ebx,            0
-       ; mul a[0]*b[7]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 4[edi]
-       adc     ebx,            0
-       mov     DWORD PTR 28[eax],ecx
-       mov     eax,            DWORD PTR 28[esi]
-       ; saved r[7]
-       ; ################## Calculate word 8
-       xor     ecx,            ecx
-       ; mul a[7]*b[1]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 24[esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 8[edi]
-       adc     ecx,            0
-       ; mul a[6]*b[2]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 20[esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 12[edi]
-       adc     ecx,            0
-       ; mul a[5]*b[3]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 16[esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 16[edi]
-       adc     ecx,            0
-       ; mul a[4]*b[4]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 12[esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 20[edi]
-       adc     ecx,            0
-       ; mul a[3]*b[5]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 8[esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 24[edi]
-       adc     ecx,            0
-       ; mul a[2]*b[6]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 4[esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 28[edi]
-       adc     ecx,            0
-       ; mul a[1]*b[7]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 8[edi]
-       adc     ecx,            0
-       mov     DWORD PTR 32[eax],ebp
-       mov     eax,            DWORD PTR 28[esi]
-       ; saved r[8]
-       ; ################## Calculate word 9
-       xor     ebp,            ebp
-       ; mul a[7]*b[2]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 24[esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 12[edi]
-       adc     ebp,            0
-       ; mul a[6]*b[3]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 20[esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 16[edi]
-       adc     ebp,            0
-       ; mul a[5]*b[4]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 16[esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 20[edi]
-       adc     ebp,            0
-       ; mul a[4]*b[5]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 12[esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 24[edi]
-       adc     ebp,            0
-       ; mul a[3]*b[6]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 8[esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 28[edi]
-       adc     ebp,            0
-       ; mul a[2]*b[7]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 12[edi]
-       adc     ebp,            0
-       mov     DWORD PTR 36[eax],ebx
-       mov     eax,            DWORD PTR 28[esi]
-       ; saved r[9]
-       ; ################## Calculate word 10
-       xor     ebx,            ebx
-       ; mul a[7]*b[3]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 24[esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 16[edi]
-       adc     ebx,            0
-       ; mul a[6]*b[4]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 20[esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 20[edi]
-       adc     ebx,            0
-       ; mul a[5]*b[5]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 16[esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 24[edi]
-       adc     ebx,            0
-       ; mul a[4]*b[6]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 12[esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 28[edi]
-       adc     ebx,            0
-       ; mul a[3]*b[7]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 16[edi]
-       adc     ebx,            0
-       mov     DWORD PTR 40[eax],ecx
-       mov     eax,            DWORD PTR 28[esi]
-       ; saved r[10]
-       ; ################## Calculate word 11
-       xor     ecx,            ecx
-       ; mul a[7]*b[4]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 24[esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 20[edi]
-       adc     ecx,            0
-       ; mul a[6]*b[5]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 20[esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 24[edi]
-       adc     ecx,            0
-       ; mul a[5]*b[6]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 16[esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 28[edi]
-       adc     ecx,            0
-       ; mul a[4]*b[7]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 20[edi]
-       adc     ecx,            0
-       mov     DWORD PTR 44[eax],ebp
-       mov     eax,            DWORD PTR 28[esi]
-       ; saved r[11]
-       ; ################## Calculate word 12
-       xor     ebp,            ebp
-       ; mul a[7]*b[5]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 24[esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 24[edi]
-       adc     ebp,            0
-       ; mul a[6]*b[6]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 20[esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 28[edi]
-       adc     ebp,            0
-       ; mul a[5]*b[7]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 24[edi]
-       adc     ebp,            0
-       mov     DWORD PTR 48[eax],ebx
-       mov     eax,            DWORD PTR 28[esi]
-       ; saved r[12]
-       ; ################## Calculate word 13
-       xor     ebx,            ebx
-       ; mul a[7]*b[6]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 24[esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 28[edi]
-       adc     ebx,            0
-       ; mul a[6]*b[7]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 28[edi]
-       adc     ebx,            0
-       mov     DWORD PTR 52[eax],ecx
-       mov     eax,            DWORD PTR 28[esi]
-       ; saved r[13]
-       ; ################## Calculate word 14
-       xor     ecx,            ecx
-       ; mul a[7]*b[7]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ebx,            edx
-       adc     ecx,            0
-       mov     DWORD PTR 56[eax],ebp
-       ; saved r[14]
-       ; save r[15]
-       mov     DWORD PTR 60[eax],ebx
-       pop     ebx
-       pop     ebp
-       pop     edi
-       pop     esi
-       ret
-_bn_mul_comba8 ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _bn_mul_comba4
-
-_bn_mul_comba4 PROC NEAR
-       push    esi
-       mov     esi,            DWORD PTR 12[esp]
-       push    edi
-       mov     edi,            DWORD PTR 20[esp]
-       push    ebp
-       push    ebx
-       xor     ebx,            ebx
-       mov     eax,            DWORD PTR [esi]
-       xor     ecx,            ecx
-       mov     edx,            DWORD PTR [edi]
-       ; ################## Calculate word 0
-       xor     ebp,            ebp
-       ; mul a[0]*b[0]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR [edi]
-       adc     ebp,            0
-       mov     DWORD PTR [eax],ebx
-       mov     eax,            DWORD PTR 4[esi]
-       ; saved r[0]
-       ; ################## Calculate word 1
-       xor     ebx,            ebx
-       ; mul a[1]*b[0]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR [esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 4[edi]
-       adc     ebx,            0
-       ; mul a[0]*b[1]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR [edi]
-       adc     ebx,            0
-       mov     DWORD PTR 4[eax],ecx
-       mov     eax,            DWORD PTR 8[esi]
-       ; saved r[1]
-       ; ################## Calculate word 2
-       xor     ecx,            ecx
-       ; mul a[2]*b[0]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 4[esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 4[edi]
-       adc     ecx,            0
-       ; mul a[1]*b[1]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR [esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 8[edi]
-       adc     ecx,            0
-       ; mul a[0]*b[2]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR [edi]
-       adc     ecx,            0
-       mov     DWORD PTR 8[eax],ebp
-       mov     eax,            DWORD PTR 12[esi]
-       ; saved r[2]
-       ; ################## Calculate word 3
-       xor     ebp,            ebp
-       ; mul a[3]*b[0]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 8[esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 4[edi]
-       adc     ebp,            0
-       ; mul a[2]*b[1]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 4[esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 8[edi]
-       adc     ebp,            0
-       ; mul a[1]*b[2]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR [esi]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 12[edi]
-       adc     ebp,            0
-       ; mul a[0]*b[3]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 4[edi]
-       adc     ebp,            0
-       mov     DWORD PTR 12[eax],ebx
-       mov     eax,            DWORD PTR 12[esi]
-       ; saved r[3]
-       ; ################## Calculate word 4
-       xor     ebx,            ebx
-       ; mul a[3]*b[1]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 8[esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 8[edi]
-       adc     ebx,            0
-       ; mul a[2]*b[2]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 4[esi]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 12[edi]
-       adc     ebx,            0
-       ; mul a[1]*b[3]
-       mul     edx
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 8[edi]
-       adc     ebx,            0
-       mov     DWORD PTR 16[eax],ecx
-       mov     eax,            DWORD PTR 12[esi]
-       ; saved r[4]
-       ; ################## Calculate word 5
-       xor     ecx,            ecx
-       ; mul a[3]*b[2]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 8[esi]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 12[edi]
-       adc     ecx,            0
-       ; mul a[2]*b[3]
-       mul     edx
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 12[edi]
-       adc     ecx,            0
-       mov     DWORD PTR 20[eax],ebp
-       mov     eax,            DWORD PTR 12[esi]
-       ; saved r[5]
-       ; ################## Calculate word 6
-       xor     ebp,            ebp
-       ; mul a[3]*b[3]
-       mul     edx
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       adc     ecx,            edx
-       adc     ebp,            0
-       mov     DWORD PTR 24[eax],ebx
-       ; saved r[6]
-       ; save r[7]
-       mov     DWORD PTR 28[eax],ecx
-       pop     ebx
-       pop     ebp
-       pop     edi
-       pop     esi
-       ret
-_bn_mul_comba4 ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _bn_sqr_comba8
-
-_bn_sqr_comba8 PROC NEAR
-       push    esi
-       push    edi
-       push    ebp
-       push    ebx
-       mov     edi,            DWORD PTR 20[esp]
-       mov     esi,            DWORD PTR 24[esp]
-       xor     ebx,            ebx
-       xor     ecx,            ecx
-       mov     eax,            DWORD PTR [esi]
-       ; ############### Calculate word 0
-       xor     ebp,            ebp
-       ; sqr a[0]*a[0]
-       mul     eax
-       add     ebx,            eax
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR [esi]
-       adc     ebp,            0
-       mov     DWORD PTR [edi],ebx
-       mov     eax,            DWORD PTR 4[esi]
-       ; saved r[0]
-       ; ############### Calculate word 1
-       xor     ebx,            ebx
-       ; sqr a[1]*a[0]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebx,            0
-       add     ecx,            eax
-       adc     ebp,            edx
-       mov     eax,            DWORD PTR 8[esi]
-       adc     ebx,            0
-       mov     DWORD PTR 4[edi],ecx
-       mov     edx,            DWORD PTR [esi]
-       ; saved r[1]
-       ; ############### Calculate word 2
-       xor     ecx,            ecx
-       ; sqr a[2]*a[0]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ecx,            0
-       add     ebp,            eax
-       adc     ebx,            edx
-       mov     eax,            DWORD PTR 4[esi]
-       adc     ecx,            0
-       ; sqr a[1]*a[1]
-       mul     eax
-       add     ebp,            eax
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR [esi]
-       adc     ecx,            0
-       mov     DWORD PTR 8[edi],ebp
-       mov     eax,            DWORD PTR 12[esi]
-       ; saved r[2]
-       ; ############### Calculate word 3
-       xor     ebp,            ebp
-       ; sqr a[3]*a[0]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebp,            0
-       add     ebx,            eax
-       adc     ecx,            edx
-       mov     eax,            DWORD PTR 8[esi]
-       adc     ebp,            0
-       mov     edx,            DWORD PTR 4[esi]
-       ; sqr a[2]*a[1]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebp,            0
-       add     ebx,            eax
-       adc     ecx,            edx
-       mov     eax,            DWORD PTR 16[esi]
-       adc     ebp,            0
-       mov     DWORD PTR 12[edi],ebx
-       mov     edx,            DWORD PTR [esi]
-       ; saved r[3]
-       ; ############### Calculate word 4
-       xor     ebx,            ebx
-       ; sqr a[4]*a[0]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebx,            0
-       add     ecx,            eax
-       adc     ebp,            edx
-       mov     eax,            DWORD PTR 12[esi]
-       adc     ebx,            0
-       mov     edx,            DWORD PTR 4[esi]
-       ; sqr a[3]*a[1]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebx,            0
-       add     ecx,            eax
-       adc     ebp,            edx
-       mov     eax,            DWORD PTR 8[esi]
-       adc     ebx,            0
-       ; sqr a[2]*a[2]
-       mul     eax
-       add     ecx,            eax
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR [esi]
-       adc     ebx,            0
-       mov     DWORD PTR 16[edi],ecx
-       mov     eax,            DWORD PTR 20[esi]
-       ; saved r[4]
-       ; ############### Calculate word 5
-       xor     ecx,            ecx
-       ; sqr a[5]*a[0]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ecx,            0
-       add     ebp,            eax
-       adc     ebx,            edx
-       mov     eax,            DWORD PTR 16[esi]
-       adc     ecx,            0
-       mov     edx,            DWORD PTR 4[esi]
-       ; sqr a[4]*a[1]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ecx,            0
-       add     ebp,            eax
-       adc     ebx,            edx
-       mov     eax,            DWORD PTR 12[esi]
-       adc     ecx,            0
-       mov     edx,            DWORD PTR 8[esi]
-       ; sqr a[3]*a[2]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ecx,            0
-       add     ebp,            eax
-       adc     ebx,            edx
-       mov     eax,            DWORD PTR 24[esi]
-       adc     ecx,            0
-       mov     DWORD PTR 20[edi],ebp
-       mov     edx,            DWORD PTR [esi]
-       ; saved r[5]
-       ; ############### Calculate word 6
-       xor     ebp,            ebp
-       ; sqr a[6]*a[0]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebp,            0
-       add     ebx,            eax
-       adc     ecx,            edx
-       mov     eax,            DWORD PTR 20[esi]
-       adc     ebp,            0
-       mov     edx,            DWORD PTR 4[esi]
-       ; sqr a[5]*a[1]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebp,            0
-       add     ebx,            eax
-       adc     ecx,            edx
-       mov     eax,            DWORD PTR 16[esi]
-       adc     ebp,            0
-       mov     edx,            DWORD PTR 8[esi]
-       ; sqr a[4]*a[2]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebp,            0
-       add     ebx,            eax
-       adc     ecx,            edx
-       mov     eax,            DWORD PTR 12[esi]
-       adc     ebp,            0
-       ; sqr a[3]*a[3]
-       mul     eax
-       add     ebx,            eax
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR [esi]
-       adc     ebp,            0
-       mov     DWORD PTR 24[edi],ebx
-       mov     eax,            DWORD PTR 28[esi]
-       ; saved r[6]
-       ; ############### Calculate word 7
-       xor     ebx,            ebx
-       ; sqr a[7]*a[0]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebx,            0
-       add     ecx,            eax
-       adc     ebp,            edx
-       mov     eax,            DWORD PTR 24[esi]
-       adc     ebx,            0
-       mov     edx,            DWORD PTR 4[esi]
-       ; sqr a[6]*a[1]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebx,            0
-       add     ecx,            eax
-       adc     ebp,            edx
-       mov     eax,            DWORD PTR 20[esi]
-       adc     ebx,            0
-       mov     edx,            DWORD PTR 8[esi]
-       ; sqr a[5]*a[2]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebx,            0
-       add     ecx,            eax
-       adc     ebp,            edx
-       mov     eax,            DWORD PTR 16[esi]
-       adc     ebx,            0
-       mov     edx,            DWORD PTR 12[esi]
-       ; sqr a[4]*a[3]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebx,            0
-       add     ecx,            eax
-       adc     ebp,            edx
-       mov     eax,            DWORD PTR 28[esi]
-       adc     ebx,            0
-       mov     DWORD PTR 28[edi],ecx
-       mov     edx,            DWORD PTR 4[esi]
-       ; saved r[7]
-       ; ############### Calculate word 8
-       xor     ecx,            ecx
-       ; sqr a[7]*a[1]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ecx,            0
-       add     ebp,            eax
-       adc     ebx,            edx
-       mov     eax,            DWORD PTR 24[esi]
-       adc     ecx,            0
-       mov     edx,            DWORD PTR 8[esi]
-       ; sqr a[6]*a[2]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ecx,            0
-       add     ebp,            eax
-       adc     ebx,            edx
-       mov     eax,            DWORD PTR 20[esi]
-       adc     ecx,            0
-       mov     edx,            DWORD PTR 12[esi]
-       ; sqr a[5]*a[3]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ecx,            0
-       add     ebp,            eax
-       adc     ebx,            edx
-       mov     eax,            DWORD PTR 16[esi]
-       adc     ecx,            0
-       ; sqr a[4]*a[4]
-       mul     eax
-       add     ebp,            eax
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR 8[esi]
-       adc     ecx,            0
-       mov     DWORD PTR 32[edi],ebp
-       mov     eax,            DWORD PTR 28[esi]
-       ; saved r[8]
-       ; ############### Calculate word 9
-       xor     ebp,            ebp
-       ; sqr a[7]*a[2]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebp,            0
-       add     ebx,            eax
-       adc     ecx,            edx
-       mov     eax,            DWORD PTR 24[esi]
-       adc     ebp,            0
-       mov     edx,            DWORD PTR 12[esi]
-       ; sqr a[6]*a[3]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebp,            0
-       add     ebx,            eax
-       adc     ecx,            edx
-       mov     eax,            DWORD PTR 20[esi]
-       adc     ebp,            0
-       mov     edx,            DWORD PTR 16[esi]
-       ; sqr a[5]*a[4]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebp,            0
-       add     ebx,            eax
-       adc     ecx,            edx
-       mov     eax,            DWORD PTR 28[esi]
-       adc     ebp,            0
-       mov     DWORD PTR 36[edi],ebx
-       mov     edx,            DWORD PTR 12[esi]
-       ; saved r[9]
-       ; ############### Calculate word 10
-       xor     ebx,            ebx
-       ; sqr a[7]*a[3]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebx,            0
-       add     ecx,            eax
-       adc     ebp,            edx
-       mov     eax,            DWORD PTR 24[esi]
-       adc     ebx,            0
-       mov     edx,            DWORD PTR 16[esi]
-       ; sqr a[6]*a[4]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebx,            0
-       add     ecx,            eax
-       adc     ebp,            edx
-       mov     eax,            DWORD PTR 20[esi]
-       adc     ebx,            0
-       ; sqr a[5]*a[5]
-       mul     eax
-       add     ecx,            eax
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 16[esi]
-       adc     ebx,            0
-       mov     DWORD PTR 40[edi],ecx
-       mov     eax,            DWORD PTR 28[esi]
-       ; saved r[10]
-       ; ############### Calculate word 11
-       xor     ecx,            ecx
-       ; sqr a[7]*a[4]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ecx,            0
-       add     ebp,            eax
-       adc     ebx,            edx
-       mov     eax,            DWORD PTR 24[esi]
-       adc     ecx,            0
-       mov     edx,            DWORD PTR 20[esi]
-       ; sqr a[6]*a[5]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ecx,            0
-       add     ebp,            eax
-       adc     ebx,            edx
-       mov     eax,            DWORD PTR 28[esi]
-       adc     ecx,            0
-       mov     DWORD PTR 44[edi],ebp
-       mov     edx,            DWORD PTR 20[esi]
-       ; saved r[11]
-       ; ############### Calculate word 12
-       xor     ebp,            ebp
-       ; sqr a[7]*a[5]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebp,            0
-       add     ebx,            eax
-       adc     ecx,            edx
-       mov     eax,            DWORD PTR 24[esi]
-       adc     ebp,            0
-       ; sqr a[6]*a[6]
-       mul     eax
-       add     ebx,            eax
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR 24[esi]
-       adc     ebp,            0
-       mov     DWORD PTR 48[edi],ebx
-       mov     eax,            DWORD PTR 28[esi]
-       ; saved r[12]
-       ; ############### Calculate word 13
-       xor     ebx,            ebx
-       ; sqr a[7]*a[6]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebx,            0
-       add     ecx,            eax
-       adc     ebp,            edx
-       mov     eax,            DWORD PTR 28[esi]
-       adc     ebx,            0
-       mov     DWORD PTR 52[edi],ecx
-       ; saved r[13]
-       ; ############### Calculate word 14
-       xor     ecx,            ecx
-       ; sqr a[7]*a[7]
-       mul     eax
-       add     ebp,            eax
-       adc     ebx,            edx
-       adc     ecx,            0
-       mov     DWORD PTR 56[edi],ebp
-       ; saved r[14]
-       mov     DWORD PTR 60[edi],ebx
-       pop     ebx
-       pop     ebp
-       pop     edi
-       pop     esi
-       ret
-_bn_sqr_comba8 ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _bn_sqr_comba4
-
-_bn_sqr_comba4 PROC NEAR
-       push    esi
-       push    edi
-       push    ebp
-       push    ebx
-       mov     edi,            DWORD PTR 20[esp]
-       mov     esi,            DWORD PTR 24[esp]
-       xor     ebx,            ebx
-       xor     ecx,            ecx
-       mov     eax,            DWORD PTR [esi]
-       ; ############### Calculate word 0
-       xor     ebp,            ebp
-       ; sqr a[0]*a[0]
-       mul     eax
-       add     ebx,            eax
-       adc     ecx,            edx
-       mov     edx,            DWORD PTR [esi]
-       adc     ebp,            0
-       mov     DWORD PTR [edi],ebx
-       mov     eax,            DWORD PTR 4[esi]
-       ; saved r[0]
-       ; ############### Calculate word 1
-       xor     ebx,            ebx
-       ; sqr a[1]*a[0]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebx,            0
-       add     ecx,            eax
-       adc     ebp,            edx
-       mov     eax,            DWORD PTR 8[esi]
-       adc     ebx,            0
-       mov     DWORD PTR 4[edi],ecx
-       mov     edx,            DWORD PTR [esi]
-       ; saved r[1]
-       ; ############### Calculate word 2
-       xor     ecx,            ecx
-       ; sqr a[2]*a[0]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ecx,            0
-       add     ebp,            eax
-       adc     ebx,            edx
-       mov     eax,            DWORD PTR 4[esi]
-       adc     ecx,            0
-       ; sqr a[1]*a[1]
-       mul     eax
-       add     ebp,            eax
-       adc     ebx,            edx
-       mov     edx,            DWORD PTR [esi]
-       adc     ecx,            0
-       mov     DWORD PTR 8[edi],ebp
-       mov     eax,            DWORD PTR 12[esi]
-       ; saved r[2]
-       ; ############### Calculate word 3
-       xor     ebp,            ebp
-       ; sqr a[3]*a[0]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebp,            0
-       add     ebx,            eax
-       adc     ecx,            edx
-       mov     eax,            DWORD PTR 8[esi]
-       adc     ebp,            0
-       mov     edx,            DWORD PTR 4[esi]
-       ; sqr a[2]*a[1]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebp,            0
-       add     ebx,            eax
-       adc     ecx,            edx
-       mov     eax,            DWORD PTR 12[esi]
-       adc     ebp,            0
-       mov     DWORD PTR 12[edi],ebx
-       mov     edx,            DWORD PTR 4[esi]
-       ; saved r[3]
-       ; ############### Calculate word 4
-       xor     ebx,            ebx
-       ; sqr a[3]*a[1]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ebx,            0
-       add     ecx,            eax
-       adc     ebp,            edx
-       mov     eax,            DWORD PTR 8[esi]
-       adc     ebx,            0
-       ; sqr a[2]*a[2]
-       mul     eax
-       add     ecx,            eax
-       adc     ebp,            edx
-       mov     edx,            DWORD PTR 8[esi]
-       adc     ebx,            0
-       mov     DWORD PTR 16[edi],ecx
-       mov     eax,            DWORD PTR 12[esi]
-       ; saved r[4]
-       ; ############### Calculate word 5
-       xor     ecx,            ecx
-       ; sqr a[3]*a[2]
-       mul     edx
-       add     eax,            eax
-       adc     edx,            edx
-       adc     ecx,            0
-       add     ebp,            eax
-       adc     ebx,            edx
-       mov     eax,            DWORD PTR 12[esi]
-       adc     ecx,            0
-       mov     DWORD PTR 20[edi],ebp
-       ; saved r[5]
-       ; ############### Calculate word 6
-       xor     ebp,            ebp
-       ; sqr a[3]*a[3]
-       mul     eax
-       add     ebx,            eax
-       adc     ecx,            edx
-       adc     ebp,            0
-       mov     DWORD PTR 24[edi],ebx
-       ; saved r[6]
-       mov     DWORD PTR 28[edi],ecx
-       pop     ebx
-       pop     ebp
-       pop     edi
-       pop     esi
-       ret
-_bn_sqr_comba4 ENDP
-_TEXT  ENDS
-END
index 80a9ed6..e69de29 100644 (file)
@@ -1,297 +0,0 @@
-;      Static Name Aliases
-;
-       TITLE   bn_mulw.c
-       .8087
-F_TEXT SEGMENT  WORD PUBLIC 'CODE'
-F_TEXT ENDS
-_DATA  SEGMENT  WORD PUBLIC 'DATA'
-_DATA  ENDS
-_CONST SEGMENT  WORD PUBLIC 'CONST'
-_CONST ENDS
-_BSS   SEGMENT  WORD PUBLIC 'BSS'
-_BSS   ENDS
-DGROUP GROUP   _CONST, _BSS, _DATA
-       ASSUME DS: DGROUP, SS: DGROUP
-F_TEXT      SEGMENT
-       ASSUME  CS: F_TEXT
-       PUBLIC  _bn_mul_add_words
-_bn_mul_add_words      PROC FAR
-; Line 58
-       push    bp
-       push    bx
-       push    si
-       push    di
-       push    ds
-       push    es
-       mov     bp,sp
-;      w = 26
-;      num = 24
-;      ap = 20
-;      rp = 16
-       xor     si,si                   ;c=0;
-       mov     di,WORD PTR [bp+16]     ; load r
-       mov     ds,WORD PTR [bp+18]     ; load r
-       mov     bx,WORD PTR [bp+20]     ; load a
-       mov     es,WORD PTR [bp+22]     ; load a
-       mov     cx,WORD PTR [bp+26]     ; load w
-       mov     bp,WORD PTR [bp+24]     ; load num
-
-       shr     bp,1    ; div count by 4 and do groups of 4
-       shr     bp,1
-       je      $L555
-
-$L546:
-       mov     ax,cx
-       mul     WORD PTR es:[bx]        ; w* *a
-       add     ax,WORD PTR ds:[di]     ; + *r
-       adc     dx,0
-       adc     ax,si
-       adc     dx,0
-       mov     WORD PTR ds:[di],ax
-       mov     si,dx
-       ;
-       mov     ax,cx
-       mul     WORD PTR es:[bx+2]      ; w* *a
-       add     ax,WORD PTR ds:[di+2]   ; + *r
-       adc     dx,0
-       adc     ax,si
-       adc     dx,0
-       mov     WORD PTR ds:[di+2],ax
-       mov     si,dx
-       ;
-       mov     ax,cx
-       mul     WORD PTR es:[bx+4]      ; w* *a
-       add     ax,WORD PTR ds:[di+4]   ; + *r
-       adc     dx,0
-       adc     ax,si
-       adc     dx,0
-       mov     WORD PTR ds:[di+4],ax
-       mov     si,dx
-       ;
-       mov     ax,cx
-       mul     WORD PTR es:[bx+6]      ; w* *a
-       add     ax,WORD PTR ds:[di+6]   ; + *r
-       adc     dx,0
-       adc     ax,si
-       adc     dx,0
-       mov     WORD PTR ds:[di+6],ax
-       mov     si,dx
-       ;
-       add     bx,8
-       add     di,8
-       ;
-       dec     bp
-       je      $L555
-       jmp     $L546
-;
-;
-$L555:
-       mov     bp,sp
-       mov     bp,WORD PTR [bp+24]     ; load num
-       and     bp,3
-       dec     bp
-       js      $L547
-
-       mov     ax,cx
-       mul     WORD PTR es:[bx]        ; w* *a
-       add     ax,WORD PTR ds:[di]     ; + *r
-       adc     dx,0
-       adc     ax,si
-       adc     dx,0
-       mov     WORD PTR ds:[di],ax
-       mov     si,dx
-       dec     bp
-       js      $L547                   ; Note that we are now testing for -1
-       ;
-       mov     ax,cx
-       mul     WORD PTR es:[bx+2]      ; w* *a
-       add     ax,WORD PTR ds:[di+2]   ; + *r
-       adc     dx,0
-       adc     ax,si
-       adc     dx,0
-       mov     WORD PTR ds:[di+2],ax
-       mov     si,dx
-       dec     bp
-       js      $L547
-       ;
-       mov     ax,cx
-       mul     WORD PTR es:[bx+4]      ; w* *a
-       add     ax,WORD PTR ds:[di+4]   ; + *r
-       adc     dx,0
-       adc     ax,si
-       adc     dx,0
-       mov     WORD PTR ds:[di+4],ax
-       mov     si,dx
-$L547:
-       mov     ax,si
-       pop     es
-       pop     ds
-       pop     di
-       pop     si
-       pop     bx
-       pop     bp
-       ret     
-       nop     
-
-_bn_mul_add_words      ENDP
-       PUBLIC  _bn_mul_words
-_bn_mul_words  PROC FAR
-; Line 76
-       push    bp
-       push    bx
-       push    si
-       push    di
-       push    ds
-       push    es
-       xor     si,si
-       mov     bp,sp
-       mov     di,WORD PTR [bp+16]     ; r
-       mov     ds,WORD PTR [bp+18]
-       mov     bx,WORD PTR [bp+20]     ; a
-       mov     es,WORD PTR [bp+22]
-       mov     cx,WORD PTR [bp+26]     ; w
-       mov     bp,WORD PTR [bp+24]     ; num 
-$FC743:
-       mov     ax,cx
-       mul     WORD PTR es:[bx]
-       add     ax,si
-       adc     dx,0
-       mov     WORD PTR ds:[di],ax
-       mov     si,dx
-       dec     bp
-       je      $L764
-       ;
-       mov     ax,cx
-       mul     WORD PTR es:[bx+2]
-       add     ax,si
-       adc     dx,0
-       mov     WORD PTR ds:[di+2],ax
-       mov     si,dx
-       dec     bp
-       je      $L764
-       ;
-       mov     ax,cx
-       mul     WORD PTR es:[bx+4]
-       add     ax,si
-       adc     dx,0
-       mov     WORD PTR ds:[di+4],ax
-       mov     si,dx
-       dec     bp
-       je      $L764
-       ;
-       mov     ax,cx
-       mul     WORD PTR es:[bx+6]
-       add     ax,si
-       adc     dx,0
-       mov     WORD PTR ds:[di+6],ax
-       mov     si,dx
-       dec     bp
-       je      $L764
-       ;
-       add     bx,8
-       add     di,8
-       jmp     $FC743
-       nop
-$L764:
-       mov     ax,si
-       pop     es
-       pop     ds
-       pop     di
-       pop     si
-       pop     bx
-       pop     bp
-       ret     
-       nop     
-_bn_mul_words  ENDP
-       PUBLIC  _bn_sqr_words
-_bn_sqr_words  PROC FAR
-; Line 92
-       push    bp
-       push    bx
-       push    si
-       push    di
-       push    ds
-       push    es
-       mov     bp,sp
-       mov     si,WORD PTR [bp+16]
-       mov     ds,WORD PTR [bp+18]
-       mov     di,WORD PTR [bp+20]
-       mov     es,WORD PTR [bp+22]
-       mov     bx,WORD PTR [bp+24]
-
-       mov     bp,bx   ; save a memory lookup later
-       shr     bx,1    ; div count by 4 and do groups of 4
-       shr     bx,1
-       je      $L666
-
-$L765:
-       mov     ax,WORD PTR es:[di]
-       mul     ax
-       mov     WORD PTR ds:[si],ax
-       mov     WORD PTR ds:[si+2],dx
-       ;
-       mov     ax,WORD PTR es:[di+2]
-       mul     ax
-       mov     WORD PTR ds:[si+4],ax
-       mov     WORD PTR ds:[si+6],dx
-       ;
-       mov     ax,WORD PTR es:[di+4]
-       mul     ax
-       mov     WORD PTR ds:[si+8],ax
-       mov     WORD PTR ds:[si+10],dx
-       ;
-       mov     ax,WORD PTR es:[di+6]
-       mul     ax
-       mov     WORD PTR ds:[si+12],ax
-       mov     WORD PTR ds:[si+14],dx
-       ;
-       add     di,8
-       add     si,16
-       dec     bx
-       je      $L666
-       jmp     $L765
-$L666:
-       and     bp,3
-       dec     bp      ; The copied value of bx (num)
-       js      $L645
-       ;
-       mov     ax,WORD PTR es:[di]
-       mul     ax
-       mov     WORD PTR ds:[si],ax
-       mov     WORD PTR ds:[si+2],dx
-       dec     bp
-       js      $L645
-       ;
-       mov     ax,WORD PTR es:[di+2]
-       mul     ax
-       mov     WORD PTR ds:[si+4],ax
-       mov     WORD PTR ds:[si+6],dx
-       dec     bp
-       js      $L645
-       ;
-       mov     ax,WORD PTR es:[di+4]
-       mul     ax
-       mov     WORD PTR ds:[si+8],ax
-       mov     WORD PTR ds:[si+10],dx
-$L645:
-       pop     es
-       pop     ds
-       pop     di
-       pop     si
-       pop     bx
-       pop     bp
-       ret     
-
-_bn_sqr_words  ENDP
-       PUBLIC  _bn_div64
-_bn_div64      PROC FAR
-       push    bp
-       mov     bp,sp
-       mov     dx, WORD PTR [bp+6]
-       mov     ax, WORD PTR [bp+8]
-       div     WORD PTR [bp+10]
-       pop     bp
-       ret     
-_bn_div64      ENDP
-F_TEXT ENDS
-END
index 957d71e..e69de29 100644 (file)
@@ -1,360 +0,0 @@
-;      Static Name Aliases
-;
-       TITLE   bn_mulw.c
-       .386
-F_TEXT SEGMENT  WORD USE16 PUBLIC 'CODE'
-F_TEXT ENDS
-_DATA  SEGMENT  WORD USE16 PUBLIC 'DATA'
-_DATA  ENDS
-_CONST SEGMENT  WORD USE16 PUBLIC 'CONST'
-_CONST ENDS
-_BSS   SEGMENT  WORD USE16 PUBLIC 'BSS'
-_BSS   ENDS
-DGROUP GROUP   _CONST, _BSS, _DATA
-       ASSUME DS: DGROUP, SS: DGROUP
-F_TEXT      SEGMENT
-       ASSUME  CS: F_TEXT
-       PUBLIC  _bn_mul_add_words
-_bn_mul_add_words      PROC FAR
-; Line 58
-       push    bp
-       push    bx
-       push    esi
-       push    di
-       push    ds
-       push    es
-       mov     bp,sp
-;      w = 28
-;      num = 26
-;      ap = 22
-;      rp = 18
-       xor     esi,esi                 ;c=0;
-       mov     di,WORD PTR [bp+18]     ; load r
-       mov     ds,WORD PTR [bp+20]     ; load r
-       mov     bx,WORD PTR [bp+22]     ; load a
-       mov     es,WORD PTR [bp+24]     ; load a
-       mov     ecx,DWORD PTR [bp+28]   ; load w
-       mov     bp,WORD PTR [bp+26]     ; load num
-       shr     bp,1    ; div count by 4 and do groups of 4
-       shr     bp,1
-       je      $L555
-
-$L546:
-       mov     eax,ecx
-       mul     DWORD PTR es:[bx]       ; w* *a
-       add     eax,DWORD PTR ds:[di]   ; + *r
-       adc     edx,0
-       adc     eax,esi
-       adc     edx,0
-       mov     DWORD PTR ds:[di],eax
-       mov     esi,edx
-       ;
-       mov     eax,ecx
-       mul     DWORD PTR es:[bx+4]     ; w* *a
-       add     eax,DWORD PTR ds:[di+4] ; + *r
-       adc     edx,0
-       adc     eax,esi
-       adc     edx,0
-       mov     DWORD PTR ds:[di+4],eax
-       mov     esi,edx
-       ;
-       mov     eax,ecx
-       mul     DWORD PTR es:[bx+8]     ; w* *a
-       add     eax,DWORD PTR ds:[di+8] ; + *r
-       adc     edx,0
-       adc     eax,esi
-       adc     edx,0
-       mov     DWORD PTR ds:[di+8],eax
-       mov     esi,edx
-       ;
-       mov     eax,ecx
-       mul     DWORD PTR es:[bx+12]    ; w* *a
-       add     eax,DWORD PTR ds:[di+12]        ; + *r
-       adc     edx,0
-       adc     eax,esi
-       adc     edx,0
-       mov     DWORD PTR ds:[di+12],eax
-       mov     esi,edx
-       ;
-       add     bx,16
-       add     di,16
-       ;
-       dec     bp
-       je      $L555
-       jmp     $L546
-;
-;
-$L555:
-       mov     bp,sp
-       mov     bp,WORD PTR [bp+26]     ; load num
-       and     bp,3
-       dec     bp
-       js      $L547m
-
-       mov     eax,ecx
-       mul     DWORD PTR es:[bx]       ; w* *a
-       add     eax,DWORD PTR ds:[di]   ; + *r
-       adc     edx,0
-       adc     eax,esi
-       adc     edx,0
-       mov     DWORD PTR ds:[di],eax
-       mov     esi,edx
-       dec     bp
-       js      $L547m                  ; Note that we are now testing for -1
-       ;
-       mov     eax,ecx
-       mul     DWORD PTR es:[bx+4]     ; w* *a
-       add     eax,DWORD PTR ds:[di+4] ; + *r
-       adc     edx,0
-       adc     eax,esi
-       adc     edx,0
-       mov     DWORD PTR ds:[di+4],eax
-       mov     esi,edx
-       dec     bp
-       js      $L547m
-       ;
-       mov     eax,ecx
-       mul     DWORD PTR es:[bx+8]     ; w* *a
-       add     eax,DWORD PTR ds:[di+8] ; + *r
-       adc     edx,0
-       adc     eax,esi
-       adc     edx,0
-       mov     DWORD PTR ds:[di+8],eax
-       mov     esi,edx
-$L547m:
-       mov     eax,esi
-       mov     edx,esi
-       shr     edx,16
-       pop     es
-       pop     ds
-       pop     di
-       pop     esi
-       pop     bx
-       pop     bp
-       ret     
-       nop     
-_bn_mul_add_words      ENDP
-
-       PUBLIC  _bn_mul_words
-_bn_mul_words  PROC FAR
-; Line 76
-       push    bp
-       push    bx
-       push    esi
-       push    di
-       push    ds
-       push    es
-       xor     esi,esi
-       mov     bp,sp
-       mov     di,WORD PTR [bp+18]     ; r
-       mov     ds,WORD PTR [bp+20]
-       mov     bx,WORD PTR [bp+22]     ; a
-       mov     es,WORD PTR [bp+24]
-       mov     ecx,DWORD PTR [bp+28]   ; w
-       mov     bp,WORD PTR [bp+26]     ; num 
-
-$FC743:
-       mov     eax,ecx
-       mul     DWORD PTR es:[bx]
-       add     eax,esi
-       adc     edx,0
-       mov     DWORD PTR ds:[di],eax
-       mov     esi,edx
-       dec     bp
-       je      $L764
-       ;
-       mov     eax,ecx
-       mul     DWORD PTR es:[bx+4]
-       add     eax,esi
-       adc     edx,0
-       mov     DWORD PTR ds:[di+4],eax
-       mov     esi,edx
-       dec     bp
-       je      $L764
-       ;
-       mov     eax,ecx
-       mul     DWORD PTR es:[bx+8]
-       add     eax,esi
-       adc     edx,0
-       mov     DWORD PTR ds:[di+8],eax
-       mov     esi,edx
-       dec     bp
-       je      $L764
-       ;
-       mov     eax,ecx
-       mul     DWORD PTR es:[bx+12]
-       add     eax,esi
-       adc     edx,0
-       mov     DWORD PTR ds:[di+12],eax
-       mov     esi,edx
-       dec     bp
-       je      $L764
-       ;
-       add     bx,16
-       add     di,16
-       jmp     $FC743
-       nop
-$L764:
-       mov     eax,esi
-       mov     edx,esi
-       shr     edx,16
-       pop     es
-       pop     ds
-       pop     di
-       pop     esi
-       pop     bx
-       pop     bp
-       ret     
-       nop     
-_bn_mul_words  ENDP
-       PUBLIC  _bn_sqr_words
-_bn_sqr_words  PROC FAR
-; Line 92
-       push    bp
-       push    bx
-       push    si
-       push    di
-       push    ds
-       push    es
-       mov     bp,sp
-       mov     si,WORD PTR [bp+16]
-       mov     ds,WORD PTR [bp+18]
-       mov     di,WORD PTR [bp+20]
-       mov     es,WORD PTR [bp+22]
-       mov     bx,WORD PTR [bp+24]
-
-       mov     bp,bx   ; save a memory lookup later
-       shr     bx,1    ; div count by 4 and do groups of 4
-       shr     bx,1
-       je      $L666
-
-$L765:
-       mov     eax,DWORD PTR es:[di]
-       mul     eax
-       mov     DWORD PTR ds:[si],eax
-       mov     DWORD PTR ds:[si+4],edx
-       ;
-       mov     eax,DWORD PTR es:[di+4]
-       mul     eax
-       mov     DWORD PTR ds:[si+8],eax
-       mov     DWORD PTR ds:[si+12],edx
-       ;
-       mov     eax,DWORD PTR es:[di+8]
-       mul     eax
-       mov     DWORD PTR ds:[si+16],eax
-       mov     DWORD PTR ds:[si+20],edx
-       ;
-       mov     eax,DWORD PTR es:[di+12]
-       mul     eax
-       mov     DWORD PTR ds:[si+24],eax
-       mov     DWORD PTR ds:[si+28],edx
-       ;
-       add     di,16
-       add     si,32
-       dec     bx
-       je      $L666
-       jmp     $L765
-$L666:
-       and     bp,3
-       dec     bp      ; The copied value of bx (num)
-       js      $L645
-       ;
-       mov     eax,DWORD PTR es:[di]
-       mul     eax
-       mov     DWORD PTR ds:[si],eax
-       mov     DWORD PTR ds:[si+4],edx
-       dec     bp
-       js      $L645
-       ;
-       mov     eax,DWORD PTR es:[di+4]
-       mul     eax
-       mov     DWORD PTR ds:[si+8],eax
-       mov     DWORD PTR ds:[si+12],edx
-       dec     bp
-       js      $L645
-       ;
-       mov     eax,DWORD PTR es:[di+8]
-       mul     eax
-       mov     DWORD PTR ds:[si+16],eax
-       mov     DWORD PTR ds:[si+20],edx
-$L645:
-       pop     es
-       pop     ds
-       pop     di
-       pop     si
-       pop     bx
-       pop     bp
-       ret     
-_bn_sqr_words  ENDP
-
-       PUBLIC  _bn_div64
-_bn_div64      PROC FAR
-       push    bp
-       mov     bp,sp
-       mov     edx, DWORD PTR [bp+6]
-       mov     eax, DWORD PTR [bp+10]
-       div     DWORD PTR [bp+14]
-       mov     edx,eax
-       shr     edx,16
-       pop     bp
-       ret     
-_bn_div64      ENDP
-
-       PUBLIC  _bn_add_words
-_bn_add_words  PROC FAR
-; Line 58
-       push    bp
-       push    bx
-       push    esi
-       push    di
-       push    ds
-       push    es
-       mov     bp,sp
-;      w = 28
-;      num = 26
-;      ap = 22
-;      rp = 18
-       xor     esi,esi                 ;c=0;
-       mov     bx,WORD PTR [bp+18]     ; load low r
-       mov     si,WORD PTR [bp+22]     ; load a
-       mov     es,WORD PTR [bp+24]     ; load a
-       mov     di,WORD PTR [bp+26]     ; load b
-       mov     ds,WORD PTR [bp+28]     ; load b
-
-       mov     dx,WORD PTR [bp+30]     ; load num
-       xor     ecx,ecx
-       dec     dx
-       js      $L547a
-
-$L5477:
-       mov     eax,DWORD PTR es:[si]   ; *a
-       add     eax,ecx
-       mov     ecx,0
-       adc     ecx,0
-       add     si,4                    ; a++
-       add     eax,DWORD PTR ds:[di]   ; + *b
-       adc     ecx,0
-       mov     ds,WORD PTR [bp+20]
-       add     di,4
-       mov     DWORD PTR ds:[bx],eax
-       mov     ds,WORD PTR [bp+28]
-       add     bx,4
-       dec     dx
-       js      $L547a                  ; Note that we are now testing for -1
-       jmp     $L5477
-       ;
-$L547a:
-       mov     eax,ecx
-       mov     edx,ecx
-       shr     edx,16
-       pop     es
-       pop     ds
-       pop     di
-       pop     esi
-       pop     bx
-       pop     bp
-       ret     
-       nop     
-_bn_add_words  ENDP
-F_TEXT ENDS
-END
index d882261..009b0eb 100644 (file)
@@ -89,7 +89,7 @@ extern "C" {
  * For machines with only one compiler (or shared libraries), this should
  * be on.  Again this in only really a problem on machines
  * using "long long's", are 32bit, and are not using my assembler code. */
-#if defined(MSDOS) || defined(WINDOWS) || defined(linux)
+#if defined(MSDOS) || defined(WINDOWS) || defined(WIN32) || defined(linux)
 #define BN_DIV2W
 #endif
 
index f3b9497..988270b 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index 7bb0b91..598fecb 100644 (file)
@@ -73,6 +73,7 @@ int BN_mod_mul_montgomery(BIGNUM *r, BIGNUM *a, BIGNUM *b,
                          BN_MONT_CTX *mont, BN_CTX *ctx)
        {
        BIGNUM *tmp,*tmp2;
+       int ret=0;
 
        BN_CTX_start(ctx);
        tmp = BN_CTX_get(ctx);
@@ -101,10 +102,10 @@ int BN_mod_mul_montgomery(BIGNUM *r, BIGNUM *a, BIGNUM *b,
                }
        /* reduce from aRR to aR */
        if (!BN_from_montgomery(r,tmp,mont,ctx)) goto err;
-       BN_CTX_end(ctx);
-       return(1);
+       ret=1;
 err:
-       return(0);
+       BN_CTX_end(ctx);
+       return(ret);
        }
 
 int BN_from_montgomery(BIGNUM *ret, BIGNUM *a, BN_MONT_CTX *mont,
index eb007e1..3e8baaa 100644 (file)
@@ -61,6 +61,9 @@
 #include "bn_lcl.h"
 
 #ifdef BN_RECURSION
+/* Karatsuba recursive multiplication algorithm
+ * (cf. Knuth, The Art of Computer Programming, Vol. 2) */
+
 /* r is 2*n2 words in size,
  * a and b are both n2 words in size.
  * n2 must be a power of 2.
index 41c22f5..0a97af6 100644 (file)
@@ -234,7 +234,8 @@ int main(int argc, char *argv[])
 /**/
        exit(0);
 err:
-       BIO_puts(out,"1\n"); /* make sure bc fails if we are piping to it */
+       BIO_puts(out,"1\n"); /* make sure the Perl script fed by bc notices
+                             * the failure, see test_bn in test/Makefile.ssl*/
        BIO_flush(out);
        ERR_load_crypto_strings();
        ERR_print_errors_fp(stderr);
index 7f9fd1f..2f971a5 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index 763148e..4c70d1e 100644 (file)
@@ -52,7 +52,7 @@ lib:  $(LIBOBJ)
 
 # elf
 asm/cx86-elf.o: asm/cx86unix.cpp
-       $(CPP) -DELF asm/cx86unix.cpp | as -o asm/cx86-elf.o
+       $(CPP) -DELF -x c asm/cx86unix.cpp | as -o asm/cx86-elf.o
 
 # solaris
 asm/cx86-sol.o: asm/cx86unix.cpp
@@ -68,7 +68,7 @@ asm/cx86-out.o: asm/cx86unix.cpp
 asm/cx86bsdi.o: asm/cx86unix.cpp
        $(CPP) -DBSDI asm/cx86unix.cpp | sed 's/ :/:/' | as -o asm/cx86bsdi.o
 
-asm/cx86unix.cpp: asm/cast-586.pl
+asm/cx86unix.cpp: asm/cast-586.pl ../perlasm/x86asm.pl ../perlasm/cbc.pl
        (cd asm; $(PERL) cast-586.pl cpp $(PROCESSOR) >cx86unix.cpp)
 
 files:
index a587089..e69de29 100644 (file)
@@ -1,124 +0,0 @@
-# Targets
-# make          - twidle the options yourself :-)
-# make cc       - standard cc options
-# make gcc      - standard gcc options
-# make x86-elf  - linux-elf etc
-# make x86-out  - linux-a.out, FreeBSD etc
-# make x86-solaris
-# make x86-bdsi
-
-# There are 3 possible performance options, experiment :-)
-#OPTS= -DBF_PTR
-#OPTS= -DBF_PTR2
-OPTS=
-
-DIR=    cast
-TOP=    .
-CC=     gcc
-CFLAG= -O3 -fomit-frame-pointer
-
-CPP=    $(CC) -E
-INCLUDES=
-INSTALLTOP=/usr/local/lib
-MAKE=           make
-MAKEDEPEND=     makedepend
-MAKEFILE=       Makefile.uni
-AR=             ar r
-RANLIB=         ranlib
-
-CAST_ENC=c_enc.o
-# or use
-#CAST_ENC=asm/cx86-elf.o
-#CAST_ENC=asm/cx86-out.o
-#CAST_ENC=asm/cx86-sol.o
-#CAST_ENC=asm/cx86bdsi.o
-
-CFLAGS= $(OPTS) $(INCLUDES) $(CFLAG) -DFULL_TEST
-
-GENERAL=Makefile
-TEST=casttest
-APP1=cast_spd
-APP2=castopts
-APPS=$(APP1) $(APP2)
-
-LIB=libcast.a
-LIBSRC=c_skey.c c_ecb.c c_enc.c c_cfb64.c c_ofb64.c
-LIBOBJ=c_skey.o c_ecb.o $(CAST_ENC) c_cfb64.o c_ofb64.o
-
-SRC= $(LIBSRC)
-
-EXHEADER= cast.h
-HEADER= cast_lcl.h $(EXHEADER)
-
-ALL=    $(GENERAL) $(SRC) $(HEADER)
-
-all:    $(LIB) $(TEST) $(APPS)
-
-$(LIB):    $(LIBOBJ)
-       $(AR) $(LIB) $(LIBOBJ)
-       $(RANLIB) $(LIB)
-# elf
-asm/cx86-elf.o: asm/cx86unix.cpp
-       $(CPP) -DELF asm/cx86unix.cpp | as -o asm/cx86-elf.o
-
-# solaris
-asm/cx86-sol.o: asm/cx86unix.cpp
-       $(CC) -E -DSOL asm/cx86unix.cpp | sed 's/^#.*//' > asm/cx86-sol.s
-       as -o asm/cx86-sol.o asm/cx86-sol.s
-       rm -f asm/cx86-sol.s
-
-# a.out
-asm/cx86-out.o: asm/cx86unix.cpp
-       $(CPP) -DOUT asm/cx86unix.cpp | as -o asm/cx86-out.o
-
-# bsdi
-asm/cx86bsdi.o: asm/cx86unix.cpp
-       $(CPP) -DBSDI asm/cx86unix.cpp | as -o asm/cx86bsdi.o
-
-asm/cx86unix.cpp:
-       (cd asm; perl cast-586.pl cpp >cx86unix.cpp)
-
-test:  $(TEST)
-       ./$(TEST)
-
-$(TEST): $(TEST).c $(LIB)
-       $(CC) -o $(TEST) $(CFLAGS) $(TEST).c $(LIB)
-
-$(APP1): $(APP1).c $(LIB)
-       $(CC) -o $(APP1) $(CFLAGS) $(APP1).c $(LIB)
-
-$(APP2): $(APP2).c $(LIB)
-       $(CC) -o $(APP2) $(CFLAGS) $(APP2).c $(LIB)
-
-lint:
-       lint -DLINT $(INCLUDES) $(SRC)>fluff
-
-depend:
-       $(MAKEDEPEND) $(INCLUDES) $(PROGS) $(LIBSRC)
-
-dclean:
-       perl -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) >Makefile.new
-       mv -f Makefile.new $(MAKEFILE)
-
-clean:
-       /bin/rm -f $(LIB) $(TEST) $(APPS) *.o asm/*.o *.obj lib tags core .pure .nfs* *.old *.bak fluff
-
-cc:
-       $(MAKE) CC="cc" CFLAG="-O" all
-
-gcc:
-       $(MAKE) CC="gcc" CFLAGS="-O3 -fomit-frame-pointer" all
-
-x86-elf:
-       $(MAKE) CAST_ENC="asm/cx86-elf.o" CFLAG="-DELF $(CFLAGS)" all
-
-x86-out:
-       $(MAKE) CAST_ENC="asm/cx86-out.o" CFLAG="-DOUT $(CFLAGS)" all
-
-x86-solaris:
-       $(MAKE) CAST_ENC="asm/cx86-sol.o" CFLAG="-DSOL $(CFLAGS)" all
-
-x86-bdsi:
-       $(MAKE) CAST_ENC="asm/cx86-bdsi.o" CFLAG="-DBDSI $(CFLAGS)" all
-
-# DO NOT DELETE THIS LINE -- make depend depends on it.
index ba78a3c..e69de29 100644 (file)
@@ -1,953 +0,0 @@
-       ; Don't even think of reading this code
-       ; It was automatically generated by cast-586.pl
-       ; Which is a perl program used to generate the x86 assember for
-       ; any of elf, a.out, BSDI,Win32, or Solaris
-       ; eric <eay@cryptsoft.com>
-       ; 
-       TITLE   cast-586.asm
-        .486
-.model FLAT
-_TEXT  SEGMENT
-PUBLIC _CAST_encrypt
-EXTERN _CAST_S_table0:DWORD
-EXTERN _CAST_S_table1:DWORD
-EXTERN _CAST_S_table2:DWORD
-EXTERN _CAST_S_table3:DWORD
-
-_CAST_encrypt PROC NEAR
-       ; 
-       push    ebp
-       push    ebx
-       mov     ebx,            DWORD PTR 12[esp]
-       mov     ebp,            DWORD PTR 16[esp]
-       push    esi
-       push    edi
-       ; Load the 2 words
-       mov     edi,            DWORD PTR [ebx]
-       mov     esi,            DWORD PTR 4[ebx]
-       ; Get short key flag
-       mov     eax,            DWORD PTR 128[ebp]
-       push    eax
-       xor     eax,            eax
-       ; round 0
-       mov     edx,            DWORD PTR [ebp]
-       mov     ecx,            DWORD PTR 4[ebp]
-       add     edx,            esi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       add     ecx,            ebx
-       xor     edi,            ecx
-       ; round 1
-       mov     edx,            DWORD PTR 8[ebp]
-       mov     ecx,            DWORD PTR 12[ebp]
-       xor     edx,            edi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       xor     ecx,            ebx
-       xor     esi,            ecx
-       ; round 2
-       mov     edx,            DWORD PTR 16[ebp]
-       mov     ecx,            DWORD PTR 20[ebp]
-       sub     edx,            esi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       sub     ecx,            ebx
-       xor     edi,            ecx
-       ; round 3
-       mov     edx,            DWORD PTR 24[ebp]
-       mov     ecx,            DWORD PTR 28[ebp]
-       add     edx,            edi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       add     ecx,            ebx
-       xor     esi,            ecx
-       ; round 4
-       mov     edx,            DWORD PTR 32[ebp]
-       mov     ecx,            DWORD PTR 36[ebp]
-       xor     edx,            esi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       xor     ecx,            ebx
-       xor     edi,            ecx
-       ; round 5
-       mov     edx,            DWORD PTR 40[ebp]
-       mov     ecx,            DWORD PTR 44[ebp]
-       sub     edx,            edi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       sub     ecx,            ebx
-       xor     esi,            ecx
-       ; round 6
-       mov     edx,            DWORD PTR 48[ebp]
-       mov     ecx,            DWORD PTR 52[ebp]
-       add     edx,            esi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       add     ecx,            ebx
-       xor     edi,            ecx
-       ; round 7
-       mov     edx,            DWORD PTR 56[ebp]
-       mov     ecx,            DWORD PTR 60[ebp]
-       xor     edx,            edi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       xor     ecx,            ebx
-       xor     esi,            ecx
-       ; round 8
-       mov     edx,            DWORD PTR 64[ebp]
-       mov     ecx,            DWORD PTR 68[ebp]
-       sub     edx,            esi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       sub     ecx,            ebx
-       xor     edi,            ecx
-       ; round 9
-       mov     edx,            DWORD PTR 72[ebp]
-       mov     ecx,            DWORD PTR 76[ebp]
-       add     edx,            edi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       add     ecx,            ebx
-       xor     esi,            ecx
-       ; round 10
-       mov     edx,            DWORD PTR 80[ebp]
-       mov     ecx,            DWORD PTR 84[ebp]
-       xor     edx,            esi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       xor     ecx,            ebx
-       xor     edi,            ecx
-       ; round 11
-       mov     edx,            DWORD PTR 88[ebp]
-       mov     ecx,            DWORD PTR 92[ebp]
-       sub     edx,            edi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       sub     ecx,            ebx
-       xor     esi,            ecx
-       ; test short key flag
-       pop     edx
-       or      edx,            edx
-       jnz     $L000cast_enc_done
-       ; round 12
-       mov     edx,            DWORD PTR 96[ebp]
-       mov     ecx,            DWORD PTR 100[ebp]
-       add     edx,            esi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       add     ecx,            ebx
-       xor     edi,            ecx
-       ; round 13
-       mov     edx,            DWORD PTR 104[ebp]
-       mov     ecx,            DWORD PTR 108[ebp]
-       xor     edx,            edi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       xor     ecx,            ebx
-       xor     esi,            ecx
-       ; round 14
-       mov     edx,            DWORD PTR 112[ebp]
-       mov     ecx,            DWORD PTR 116[ebp]
-       sub     edx,            esi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       sub     ecx,            ebx
-       xor     edi,            ecx
-       ; round 15
-       mov     edx,            DWORD PTR 120[ebp]
-       mov     ecx,            DWORD PTR 124[ebp]
-       add     edx,            edi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       add     ecx,            ebx
-       xor     esi,            ecx
-$L000cast_enc_done:
-       nop
-       mov     eax,            DWORD PTR 20[esp]
-       mov     DWORD PTR 4[eax],edi
-       mov     DWORD PTR [eax],esi
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-_CAST_encrypt ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _CAST_decrypt
-EXTERN _CAST_S_table0:DWORD
-EXTERN _CAST_S_table1:DWORD
-EXTERN _CAST_S_table2:DWORD
-EXTERN _CAST_S_table3:DWORD
-
-_CAST_decrypt PROC NEAR
-       ; 
-       push    ebp
-       push    ebx
-       mov     ebx,            DWORD PTR 12[esp]
-       mov     ebp,            DWORD PTR 16[esp]
-       push    esi
-       push    edi
-       ; Load the 2 words
-       mov     edi,            DWORD PTR [ebx]
-       mov     esi,            DWORD PTR 4[ebx]
-       ; Get short key flag
-       mov     eax,            DWORD PTR 128[ebp]
-       or      eax,            eax
-       jnz     $L001cast_dec_skip
-       xor     eax,            eax
-       ; round 15
-       mov     edx,            DWORD PTR 120[ebp]
-       mov     ecx,            DWORD PTR 124[ebp]
-       add     edx,            esi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       add     ecx,            ebx
-       xor     edi,            ecx
-       ; round 14
-       mov     edx,            DWORD PTR 112[ebp]
-       mov     ecx,            DWORD PTR 116[ebp]
-       sub     edx,            edi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       sub     ecx,            ebx
-       xor     esi,            ecx
-       ; round 13
-       mov     edx,            DWORD PTR 104[ebp]
-       mov     ecx,            DWORD PTR 108[ebp]
-       xor     edx,            esi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       xor     ecx,            ebx
-       xor     edi,            ecx
-       ; round 12
-       mov     edx,            DWORD PTR 96[ebp]
-       mov     ecx,            DWORD PTR 100[ebp]
-       add     edx,            edi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       add     ecx,            ebx
-       xor     esi,            ecx
-$L001cast_dec_skip:
-       ; round 11
-       mov     edx,            DWORD PTR 88[ebp]
-       mov     ecx,            DWORD PTR 92[ebp]
-       sub     edx,            esi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       sub     ecx,            ebx
-       xor     edi,            ecx
-       ; round 10
-       mov     edx,            DWORD PTR 80[ebp]
-       mov     ecx,            DWORD PTR 84[ebp]
-       xor     edx,            edi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       xor     ecx,            ebx
-       xor     esi,            ecx
-       ; round 9
-       mov     edx,            DWORD PTR 72[ebp]
-       mov     ecx,            DWORD PTR 76[ebp]
-       add     edx,            esi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       add     ecx,            ebx
-       xor     edi,            ecx
-       ; round 8
-       mov     edx,            DWORD PTR 64[ebp]
-       mov     ecx,            DWORD PTR 68[ebp]
-       sub     edx,            edi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       sub     ecx,            ebx
-       xor     esi,            ecx
-       ; round 7
-       mov     edx,            DWORD PTR 56[ebp]
-       mov     ecx,            DWORD PTR 60[ebp]
-       xor     edx,            esi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       xor     ecx,            ebx
-       xor     edi,            ecx
-       ; round 6
-       mov     edx,            DWORD PTR 48[ebp]
-       mov     ecx,            DWORD PTR 52[ebp]
-       add     edx,            edi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       add     ecx,            ebx
-       xor     esi,            ecx
-       ; round 5
-       mov     edx,            DWORD PTR 40[ebp]
-       mov     ecx,            DWORD PTR 44[ebp]
-       sub     edx,            esi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       sub     ecx,            ebx
-       xor     edi,            ecx
-       ; round 4
-       mov     edx,            DWORD PTR 32[ebp]
-       mov     ecx,            DWORD PTR 36[ebp]
-       xor     edx,            edi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       xor     ecx,            ebx
-       xor     esi,            ecx
-       ; round 3
-       mov     edx,            DWORD PTR 24[ebp]
-       mov     ecx,            DWORD PTR 28[ebp]
-       add     edx,            esi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       add     ecx,            ebx
-       xor     edi,            ecx
-       ; round 2
-       mov     edx,            DWORD PTR 16[ebp]
-       mov     ecx,            DWORD PTR 20[ebp]
-       sub     edx,            edi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       sub     ecx,            ebx
-       xor     esi,            ecx
-       ; round 1
-       mov     edx,            DWORD PTR 8[ebp]
-       mov     ecx,            DWORD PTR 12[ebp]
-       xor     edx,            esi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       add     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       xor     ecx,            ebx
-       xor     edi,            ecx
-       ; round 0
-       mov     edx,            DWORD PTR [ebp]
-       mov     ecx,            DWORD PTR 4[ebp]
-       add     edx,            edi
-       rol     edx,            cl
-       mov     ebx,            edx
-       xor     ecx,            ecx
-       mov     cl,             dh
-       and     ebx,            255
-       shr     edx,            16
-       xor     eax,            eax
-       mov     al,             dh
-       and     edx,            255
-       mov     ecx,            DWORD PTR _CAST_S_table0[ecx*4]
-       mov     ebx,            DWORD PTR _CAST_S_table1[ebx*4]
-       xor     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table2[eax*4]
-       sub     ecx,            ebx
-       mov     ebx,            DWORD PTR _CAST_S_table3[edx*4]
-       add     ecx,            ebx
-       xor     esi,            ecx
-       nop
-       mov     eax,            DWORD PTR 20[esp]
-       mov     DWORD PTR 4[eax],edi
-       mov     DWORD PTR [eax],esi
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-_CAST_decrypt ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _CAST_cbc_encrypt
-
-_CAST_cbc_encrypt PROC NEAR
-       ; 
-       push    ebp
-       push    ebx
-       push    esi
-       push    edi
-       mov     ebp,            DWORD PTR 28[esp]
-       ; getting iv ptr from parameter 4
-       mov     ebx,            DWORD PTR 36[esp]
-       mov     esi,            DWORD PTR [ebx]
-       mov     edi,            DWORD PTR 4[ebx]
-       push    edi
-       push    esi
-       push    edi
-       push    esi
-       mov     ebx,            esp
-       mov     esi,            DWORD PTR 36[esp]
-       mov     edi,            DWORD PTR 40[esp]
-       ; getting encrypt flag from parameter 5
-       mov     ecx,            DWORD PTR 56[esp]
-       ; get and push parameter 3
-       mov     eax,            DWORD PTR 48[esp]
-       push    eax
-       push    ebx
-       cmp     ecx,            0
-       jz      $L002decrypt
-       and     ebp,            4294967288
-       mov     eax,            DWORD PTR 8[esp]
-       mov     ebx,            DWORD PTR 12[esp]
-       jz      $L003encrypt_finish
-L004encrypt_loop:
-       mov     ecx,            DWORD PTR [esi]
-       mov     edx,            DWORD PTR 4[esi]
-       xor     eax,            ecx
-       xor     ebx,            edx
-       bswap   eax
-       bswap   ebx
-       mov     DWORD PTR 8[esp],eax
-       mov     DWORD PTR 12[esp],ebx
-       call    _CAST_encrypt
-       mov     eax,            DWORD PTR 8[esp]
-       mov     ebx,            DWORD PTR 12[esp]
-       bswap   eax
-       bswap   ebx
-       mov     DWORD PTR [edi],eax
-       mov     DWORD PTR 4[edi],ebx
-       add     esi,            8
-       add     edi,            8
-       sub     ebp,            8
-       jnz     L004encrypt_loop
-$L003encrypt_finish:
-       mov     ebp,            DWORD PTR 52[esp]
-       and     ebp,            7
-       jz      $L005finish
-       xor     ecx,            ecx
-       xor     edx,            edx
-       mov     ebp,            DWORD PTR $L006cbc_enc_jmp_table[ebp*4]
-       jmp      ebp
-L007ej7:
-       xor     edx,            edx
-       mov     dh,             BYTE PTR 6[esi]
-       shl     edx,            8
-L008ej6:
-       mov     dh,             BYTE PTR 5[esi]
-L009ej5:
-       mov     dl,             BYTE PTR 4[esi]
-L010ej4:
-       mov     ecx,            DWORD PTR [esi]
-       jmp     $L011ejend
-L012ej3:
-       mov     ch,             BYTE PTR 2[esi]
-       xor     ecx,            ecx
-       shl     ecx,            8
-L013ej2:
-       mov     ch,             BYTE PTR 1[esi]
-L014ej1:
-       mov     cl,             BYTE PTR [esi]
-$L011ejend:
-       xor     eax,            ecx
-       xor     ebx,            edx
-       bswap   eax
-       bswap   ebx
-       mov     DWORD PTR 8[esp],eax
-       mov     DWORD PTR 12[esp],ebx
-       call    _CAST_encrypt
-       mov     eax,            DWORD PTR 8[esp]
-       mov     ebx,            DWORD PTR 12[esp]
-       bswap   eax
-       bswap   ebx
-       mov     DWORD PTR [edi],eax
-       mov     DWORD PTR 4[edi],ebx
-       jmp     $L005finish
-$L002decrypt:
-       and     ebp,            4294967288
-       mov     eax,            DWORD PTR 16[esp]
-       mov     ebx,            DWORD PTR 20[esp]
-       jz      $L015decrypt_finish
-L016decrypt_loop:
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-       bswap   eax
-       bswap   ebx
-       mov     DWORD PTR 8[esp],eax
-       mov     DWORD PTR 12[esp],ebx
-       call    _CAST_decrypt
-       mov     eax,            DWORD PTR 8[esp]
-       mov     ebx,            DWORD PTR 12[esp]
-       bswap   eax
-       bswap   ebx
-       mov     ecx,            DWORD PTR 16[esp]
-       mov     edx,            DWORD PTR 20[esp]
-       xor     ecx,            eax
-       xor     edx,            ebx
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-       mov     DWORD PTR [edi],ecx
-       mov     DWORD PTR 4[edi],edx
-       mov     DWORD PTR 16[esp],eax
-       mov     DWORD PTR 20[esp],ebx
-       add     esi,            8
-       add     edi,            8
-       sub     ebp,            8
-       jnz     L016decrypt_loop
-$L015decrypt_finish:
-       mov     ebp,            DWORD PTR 52[esp]
-       and     ebp,            7
-       jz      $L005finish
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-       bswap   eax
-       bswap   ebx
-       mov     DWORD PTR 8[esp],eax
-       mov     DWORD PTR 12[esp],ebx
-       call    _CAST_decrypt
-       mov     eax,            DWORD PTR 8[esp]
-       mov     ebx,            DWORD PTR 12[esp]
-       bswap   eax
-       bswap   ebx
-       mov     ecx,            DWORD PTR 16[esp]
-       mov     edx,            DWORD PTR 20[esp]
-       xor     ecx,            eax
-       xor     edx,            ebx
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-L017dj7:
-       ror     edx,            16
-       mov     BYTE PTR 6[edi],dl
-       shr     edx,            16
-L018dj6:
-       mov     BYTE PTR 5[edi],dh
-L019dj5:
-       mov     BYTE PTR 4[edi],dl
-L020dj4:
-       mov     DWORD PTR [edi],ecx
-       jmp     $L021djend
-L022dj3:
-       ror     ecx,            16
-       mov     BYTE PTR 2[edi],cl
-       shl     ecx,            16
-L023dj2:
-       mov     BYTE PTR 1[esi],ch
-L024dj1:
-       mov     BYTE PTR [esi], cl
-$L021djend:
-       jmp     $L005finish
-$L005finish:
-       mov     ecx,            DWORD PTR 60[esp]
-       add     esp,            24
-       mov     DWORD PTR [ecx],eax
-       mov     DWORD PTR 4[ecx],ebx
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-$L006cbc_enc_jmp_table:
-       DD      0
-       DD      L014ej1
-       DD      L013ej2
-       DD      L012ej3
-       DD      L010ej4
-       DD      L009ej5
-       DD      L008ej6
-       DD      L007ej7
-L025cbc_dec_jmp_table:
-       DD      0
-       DD      L024dj1
-       DD      L023dj2
-       DD      L022dj3
-       DD      L020dj4
-       DD      L019dj5
-       DD      L018dj6
-       DD      L017dj7
-_CAST_cbc_encrypt ENDP
-_TEXT  ENDS
-END
index cfe3842..5fab8a4 100644 (file)
                          *((c)++)=(unsigned char)(((l)>> 8L)&0xff), \
                          *((c)++)=(unsigned char)(((l)     )&0xff))
 
-#if defined(WIN32)
+#if defined(WIN32) && defined(_MSC_VER)
 #define ROTL(a,n)     (_lrotl(a,n))
 #else
 #define ROTL(a,n)     ((((a)<<(n))&0xffffffffL)|((a)>>(32-(n))))
index 77a3f70..c10282a 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index eb4b3cf..5c1ca59 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index c2a2dd4..dadd8d8 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index 79d8677..8ddeafb 100644 (file)
@@ -186,7 +186,7 @@ $ LIB_DES = "set_key,ecb_enc,cbc_enc,"+ -
        "enc_read,enc_writ,ofb64enc,"+ -
        "ofb_enc,str2key,pcbc_enc,qud_cksm,rand_key,"+ -
        "des_enc,fcrypt_b,read2pwd,"+ -
-       "fcrypt,xcbc_enc,read_pwd,rpc_enc,cbc_cksm,supp,ede_cbcm_enc"
+       "fcrypt,xcbc_enc,read_pwd,rpc_enc,cbc_cksm,ede_cbcm_enc"
 $ LIB_RC2 = "rc2_ecb,rc2_skey,rc2_cbc,rc2cfb64,rc2ofb64"
 $ LIB_RC4 = "rc4_skey,rc4_enc"
 $ LIB_RC5 = "rc5_skey,rc5_ecb,rc5_enc,rc5cfb64,rc5ofb64"
@@ -208,7 +208,7 @@ $ LIB_BIO = "bio_lib,bio_cb,bio_err,"+ -
        "bss_mem,bss_null,bss_fd,"+ -
        "bss_file,bss_sock,bss_conn,"+ -
        "bf_null,bf_buff,b_print,b_dump,"+ -
-       "b_sock,bss_acpt,bf_nbio,bss_rtcp,bss_bio" ! + ",bss_log" for syslog
+       "b_sock,bss_acpt,bf_nbio,bss_rtcp,bss_bio,bss_log"
 $ LIB_STACK = "stack"
 $ LIB_LHASH = "lhash,lh_stats"
 $ LIB_RAND = "md_rand,randfile,rand_lib,rand_err,rand_egd"
@@ -266,7 +266,7 @@ $!
 $! Setup exceptional compilations
 $!
 $ COMPILEWITH_CC3 = ",bss_rtcp,"
-$ COMPILEWITH_CC4 = ",a_utctm,"
+$ COMPILEWITH_CC4 = ",a_utctm,bss_log,"
 $ COMPILEWITH_CC5 = ",md2_dgst,md5_dgst,mdc2dgst,sha_dgst,sha1dgst," + -
                     "rmd_dgst,bf_enc,"
 $!
@@ -1441,6 +1441,7 @@ $!
 $ IF P7 .NES. ""
 $ THEN
 $   ENCRYPT_TYPES = P7
+$! NYI:   ENCRYPT_PROGRAMS = P7
 $ ENDIF
 $!
 $!  Time To RETURN...
index 8a739e7..e69de29 100644 (file)
@@ -1,16 +0,0 @@
-crypt  <=      crypt(buf,salt)
-key    <=      set_odd_parity(key)
-int    <=      is_weak_key(key)
-keysched<=     set_key(key)
-key    <=      ecb_encrypt(string8,ks,enc)
-key    <=      ecb3_encrypt(input,ks1,ks2,enc)
-string <=      cbc_encrypt(input,ks,ivec,enc)                  => ivec 
-string <=      cbc3_encrypt(input,ks1,ks2,ivec1,ivec2,enc)     => ivec1&ivec2 
-ck1,ck2        <=      cbc_cksum(input,ks,ivec)                        => ivec
-string <=      pcbc_encrypt(input,ks,ivec,enc)                 => ivec 
-string <=      ofb_encrypt(input,numbits,ks,ivec)              => ivec
-string <=      cfb_encrypt(input,numbits,ks,ivec,enc)          => ivec
-key    <=      random_key()
-key    <=      string_to_key(string)
-key1,key2<=    string_to_2keys(string)
-
index 0cbc44f..e69de29 100644 (file)
@@ -1,84 +0,0 @@
-Modes of DES
-Quite a bit of the following information has been taken from
-       AS 2805.5.2
-       Australian Standard
-       Electronic funds transfer - Requirements for interfaces,
-       Part 5.2: Modes of operation for an n-bit block cipher algorithm
-       Appendix A
-
-There are several different modes in which DES can be used, they are
-as follows.
-
-Electronic Codebook Mode (ECB) (des_ecb_encrypt())
-- 64 bits are enciphered at a time.
-- The order of the blocks can be rearranged without detection.
-- The same plaintext block always produces the same ciphertext block
-  (for the same key) making it vulnerable to a 'dictionary attack'.
-- An error will only affect one ciphertext block.
-
-Cipher Block Chaining Mode (CBC) (des_cbc_encrypt())
-- a multiple of 64 bits are enciphered at a time.
-- The CBC mode produces the same ciphertext whenever the same
-  plaintext is encrypted using the same key and starting variable.
-- The chaining operation makes the ciphertext blocks dependent on the
-  current and all preceding plaintext blocks and therefore blocks can not
-  be rearranged.
-- The use of different starting variables prevents the same plaintext
-  enciphering to the same ciphertext.
-- An error will affect the current and the following ciphertext blocks.
-
-Cipher Feedback Mode (CFB) (des_cfb_encrypt())
-- a number of bits (j) <= 64 are enciphered at a time.
-- The CFB mode produces the same ciphertext whenever the same
-  plaintext is encrypted using the same key and starting variable.
-- The chaining operation makes the ciphertext variables dependent on the
-  current and all preceding variables and therefore j-bit variables are
-  chained together and con not be rearranged.
-- The use of different starting variables prevents the same plaintext
-  enciphering to the same ciphertext.
-- The strength of the CFB mode depends on the size of k (maximal if
-  j == k).  In my implementation this is always the case.
-- Selection of a small value for j will require more cycles through
-  the encipherment algorithm per unit of plaintext and thus cause
-  greater processing overheads.
-- Only multiples of j bits can be enciphered.
-- An error will affect the current and the following ciphertext variables.
-
-Output Feedback Mode (OFB) (des_ofb_encrypt())
-- a number of bits (j) <= 64 are enciphered at a time.
-- The OFB mode produces the same ciphertext whenever the same
-  plaintext enciphered using the same key and starting variable.  More
-  over, in the OFB mode the same key stream is produced when the same
-  key and start variable are used.  Consequently, for security reasons
-  a specific start variable should be used only once for a given key.
-- The absence of chaining makes the OFB more vulnerable to specific attacks.
-- The use of different start variables values prevents the same
-  plaintext enciphering to the same ciphertext, by producing different
-  key streams.
-- Selection of a small value for j will require more cycles through
-  the encipherment algorithm per unit of plaintext and thus cause
-  greater processing overheads.
-- Only multiples of j bits can be enciphered.
-- OFB mode of operation does not extend ciphertext errors in the
-  resultant plaintext output.  Every bit error in the ciphertext causes
-  only one bit to be in error in the deciphered plaintext.
-- OFB mode is not self-synchronising.  If the two operation of
-  encipherment and decipherment get out of synchronism, the system needs
-  to be re-initialised.
-- Each re-initialisation should use a value of the start variable
-different from the start variable values used before with the same
-key.  The reason for this is that an identical bit stream would be
-produced each time from the same parameters.  This would be
-susceptible to a 'known plaintext' attack.
-
-Triple ECB Mode (des_ecb3_encrypt())
-- Encrypt with key1, decrypt with key2 and encrypt with key1 again.
-- As for ECB encryption but increases the effective key length to 112 bits.
-- If both keys are the same it is equivalent to encrypting once with
-  just one key.
-
-Triple CBC Mode (des_3cbc_encrypt())
-- Encrypt with key1, decrypt with key2 and encrypt with key1 again.
-- As for CBC encryption but increases the effective key length to 112 bits.
-- If both keys are the same it is equivalent to encrypting once with
-  just one key.
index b54a243..e69de29 100644 (file)
@@ -1,14 +0,0 @@
-use ExtUtils::MakeMaker;
-# See lib/ExtUtils/MakeMaker.pm for details of how to influence
-# the contents of the Makefile being created.
-&writeMakefile(
-       'potential_libs' => '',   # e.g., '-lm' 
-       'INC' => '',     # e.g., '-I/usr/include/other' 
-       'DISTNAME' => 'DES',
-       'VERSION' => '0.1',
-       'DEFINE' => '-DPERL5',
-       'OBJECT' => 'DES.o cbc_cksm.o cbc_enc.o ecb_enc.o pcbc_enc.o \
-       rand_key.o set_key.o str2key.o \
-       enc_read.o enc_writ.o fcrypt.o cfb_enc.o \
-       ecb3_enc.o ofb_enc.o cbc3_enc.o des_enc.o',
-       );
index c09f696..e69de29 100644 (file)
@@ -1,250 +0,0 @@
-# You must select the correct terminal control system to be used to
-# turn character echo off when reading passwords.  There a 5 systems
-# SGTTY   - the old BSD system
-# TERMIO  - most system V boxes
-# TERMIOS - SGI (ala IRIX).
-# VMS     - the DEC operating system
-# MSDOS   - we all know what it is :-)
-# read_pwd.c makes a reasonable guess at what is correct.
-
-# Targets
-# make          - twidle the options yourself :-)
-# make cc       - standard cc options
-# make gcc      - standard gcc options
-# make x86-elf  - linux-elf etc
-# make x86-out  - linux-a.out, FreeBSD etc
-# make x86-solaris
-# make x86-bdsi
-
-# If you are on a DEC Alpha, edit des.h and change the DES_LONG
-# define to 'unsigned int'.  I have seen this give a %20 speedup.
-
-OPTS0= -DLIBDES_LIT -DRAND -DTERMIO #-DNOCONST
-
-# Version 1.94 has changed the strings_to_key function so that it is
-# now compatible with MITs when the string is longer than 8 characters.
-# If you wish to keep the old version, uncomment the following line.
-# This will affect the -E/-D options on des(1).
-#OPTS1= -DOLD_STR_TO_KEY
-
-# There are 4 possible performance options
-# -DDES_PTR
-# -DDES_RISC1
-# -DDES_RISC2 (only one of DES_RISC1 and DES_RISC2)
-# -DDES_UNROLL
-# after the initial build, run 'des_opts' to see which options are best
-# for your platform.  There are some listed in options.txt
-#OPTS2= -DDES_PTR 
-#OPTS3= -DDES_RISC1 # or DES_RISC2
-#OPTS4= -DDES_UNROLL
-
-OPTS= $(OPTS0) $(OPTS1) $(OPTS2) $(OPTS3) $(OPTS4)
-
-MAKE=make -f Makefile
-#CC=cc
-#CFLAG= -O
-
-CC=gcc
-#CFLAG= -O4 -funroll-loops -fomit-frame-pointer
-CFLAG= -O3 -fomit-frame-pointer
-
-CFLAGS=$(OPTS) $(CFLAG)
-CPP=$(CC) -E
-AS=as
-
-# Assember version of des_encrypt*().
-DES_ENC=des_enc.o fcrypt_b.o           # normal C version
-#DES_ENC=asm/dx86-elf.o        asm/yx86-elf.o  # elf format x86
-#DES_ENC=asm/dx86-out.o        asm/yx86-out.o  # a.out format x86
-#DES_ENC=asm/dx86-sol.o        asm/yx86-sol.o  # solaris format x86 
-#DES_ENC=asm/dx86bsdi.o        asm/yx86basi.o  # bsdi format x86 
-
-LIBDIR=/usr/local/lib
-BINDIR=/usr/local/bin
-INCDIR=/usr/local/include
-MANDIR=/usr/local/man
-MAN1=1
-MAN3=3
-SHELL=/bin/sh
-OBJ_LIT=cbc_enc.o ecb_enc.o $(DES_ENC) fcrypt.o set_key.o
-OBJ_FULL=cbc_cksm.o $(OBJ_LIT) pcbc_enc.o \
-       xcbc_enc.o qud_cksm.o \
-       cfb64ede.o cfb64enc.o cfb_enc.o ecb3_enc.o \
-       enc_read.o enc_writ.o ofb64ede.o ofb64enc.o ofb_enc.o  \
-       rand_key.o read_pwd.o read2pwd.o rpc_enc.o  str2key.o supp.o
-
-GENERAL_LIT=COPYRIGHT INSTALL README VERSION Makefile des_crypt.man \
-       des.doc options.txt asm
-GENERAL_FULL=$(GENERAL_LIT) FILES Imakefile times vms.com KERBEROS MODES.DES \
-       des.man DES.pm DES.pod DES.xs Makefile.PL dess.cpp des3s.cpp \
-       Makefile.uni typemap t Makefile.ssl makefile.bc Makefile.lit \
-       des.org des_locl.org
-TESTING_LIT=   destest speed des_opts
-TESTING_FULL=  rpw $(TESTING_LIT)
-TESTING_SRC_LIT=destest.c speed.c des_opts.c
-TESTING_SRC_FULL=rpw.c $(TESTING_SRC_LIT)
-HEADERS_LIT=des_ver.h des.h des_locl.h podd.h sk.h spr.h
-HEADERS_FULL= $(HEADERS_LIT) rpc_des.h
-LIBDES_LIT=cbc_enc.c ecb_enc.c fcrypt.c set_key.c des_enc.c fcrypt_b.c
-LIBDES_FULL= cbc_cksm.c pcbc_enc.c qud_cksm.c \
-       cfb64ede.c cfb64enc.c cfb_enc.c ecb3_enc.c \
-       enc_read.c enc_writ.c ofb64ede.c ofb64enc.c ofb_enc.c  \
-       rand_key.c rpc_enc.c  str2key.c  supp.c \
-       xcbc_enc.c $(LIBDES_LIT) read_pwd.c read2pwd.c
-
-PERL=  des.pl testdes.pl doIP doPC1 doPC2 PC1 PC2 shifts.pl
-
-OBJ=   $(OBJ_LIT)
-GENERAL=$(GENERAL_LIT)
-TESTING=$(TESTING_LIT)
-TESTING_SRC=$(TESTING_SRC_LIT)
-HEADERS=$(HEADERS_LIT)
-LIBDES=        $(LIBDES_LIT)
-
-ALL=   $(GENERAL) $(TESTING_SRC) $(LIBDES) $(PERL) $(HEADERS)
-
-DLIB=  libdes.a
-
-all: $(DLIB) $(TESTING)
-
-cc:
-       $(MAKE) CC=cc CFLAGS="-O $(OPTS) $(CFLAG)" all
-
-gcc:
-       $(MAKE) CC=gcc CFLAGS="-O3 -fomit-frame-pointer $(OPTS) $(CFLAG)" all
-
-x86-elf:
-       $(MAKE) DES_ENC='asm/dx86-elf.o asm/yx86-elf.o' CC=$(CC) CFLAGS="-DELF $(OPTS) $(CFLAG)" all
-
-x86-out:
-       $(MAKE) DES_ENC='asm/dx86-out.o asm/yx86-out.o' CC=$(CC) CFLAGS="-DOUT $(OPTS) $(CFLAG)" all
-
-x86-solaris:
-       $(MAKE) DES_ENC='asm/dx86-sol.o asm/yx86-sol.o' CC=$(CC) CFLAGS="-DSOL $(OPTS) $(CFLAG)" all
-
-x86-bsdi:
-       $(MAKE) DES_ENC='asm/dx86bsdi.o asm/yx86bsdi.o' CC=$(CC) CFLAGS="-DBSDI $(OPTS) $(CFLAG)" all
-
-# elf
-asm/dx86-elf.o: asm/dx86unix.cpp
-       $(CPP) -DELF asm/dx86unix.cpp | $(AS) -o asm/dx86-elf.o
-
-asm/yx86-elf.o: asm/yx86unix.cpp
-       $(CPP) -DELF asm/yx86unix.cpp | $(AS) -o asm/yx86-elf.o
-
-# solaris
-asm/dx86-sol.o: asm/dx86unix.cpp
-       $(CC) -E -DSOL asm/dx86unix.cpp | sed 's/^#.*//' > asm/dx86-sol.s
-       as -o asm/dx86-sol.o asm/dx86-sol.s
-       rm -f asm/dx86-sol.s
-
-asm/yx86-sol.o: asm/yx86unix.cpp
-       $(CC) -E -DSOL asm/yx86unix.cpp | sed 's/^#.*//' > asm/yx86-sol.s
-       as -o asm/yx86-sol.o asm/yx86-sol.s
-       rm -f asm/yx86-sol.s
-
-# a.out
-asm/dx86-out.o: asm/dx86unix.cpp
-       $(CPP) -DOUT asm/dx86unix.cpp | $(AS) -o asm/dx86-out.o
-
-asm/yx86-out.o: asm/yx86unix.cpp
-       $(CPP) -DOUT asm/yx86unix.cpp | $(AS) -o asm/yx86-out.o
-
-# bsdi
-asm/dx86bsdi.o: asm/dx86unix.cpp
-       $(CPP) -DBSDI asm/dx86unix.cpp | $(AS) -o asm/dx86bsdi.o
-
-asm/yx86bsdi.o: asm/yx86unix.cpp
-       $(CPP) -DBSDI asm/yx86unix.cpp | $(AS) -o asm/yx86bsdi.o
-
-asm/dx86unix.cpp:
-       (cd asm; perl des-586.pl cpp >dx86unix.cpp)
-
-asm/yx86unix.cpp:
-       (cd asm; perl crypt586.pl cpp >yx86unix.cpp)
-
-test:  all
-       ./destest
-
-$(DLIB): $(OBJ)
-       /bin/rm -f $(DLIB)
-       ar cr $(DLIB) $(OBJ)
-       -if test -s /bin/ranlib; then /bin/ranlib $(DLIB); \
-       else if test -s /usr/bin/ranlib; then /usr/bin/ranlib $(DLIB); \
-       else exit 0; fi; fi
-
-des_opts: des_opts.o $(DLIB)
-       $(CC) $(CFLAGS) -o des_opts des_opts.o $(DLIB)
-
-destest: destest.o $(DLIB)
-       $(CC) $(CFLAGS) -o destest destest.o $(DLIB)
-
-rpw: rpw.o $(DLIB)
-       $(CC) $(CFLAGS) -o rpw rpw.o $(DLIB)
-
-speed: speed.o $(DLIB)
-       $(CC) $(CFLAGS) -o speed speed.o $(DLIB)
-
-des: des.o $(DLIB)
-       $(CC) $(CFLAGS) -o des des.o $(DLIB)
-
-tags:
-       ctags $(TESTING_SRC) $(LIBDES)
-
-tar_lit:
-       /bin/mv Makefile Makefile.tmp
-       /bin/cp Makefile.lit Makefile
-       tar chf libdes-l.tar $(LIBDES_LIT) $(HEADERS_LIT) \
-               $(GENERAL_LIT) $(TESTING_SRC_LIT)
-       /bin/rm -f Makefile
-       /bin/mv Makefile.tmp Makefile
-
-tar:
-       tar chf libdes.tar $(ALL)
-
-shar:
-       shar $(ALL) >libdes.shar
-
-depend:
-       makedepend $(LIBDES) $(TESTING_SRC)
-
-clean:
-       /bin/rm -f *.o tags core $(TESTING) $(DLIB) .nfs* *.old *.bak asm/*.o 
-
-dclean:
-       sed -e '/^# DO NOT DELETE THIS LINE/ q' Makefile >Makefile.new
-       mv -f Makefile.new Makefile
-
-# Eric is probably going to choke when he next looks at this --tjh
-install:
-       if test $(INSTALLTOP); then \
-           echo SSL style install; \
-           cp $(DLIB) $(INSTALLTOP)/lib; \
-           if test -s /bin/ranlib; then \
-               /bin/ranlib $(INSTALLTOP)/lib/$(DLIB); \
-           else \
-               if test -s /usr/bin/ranlib; then \
-               /usr/bin/ranlib $(INSTALLTOP)/lib/$(DLIB); \
-           fi; fi; \
-           chmod 644 $(INSTALLTOP)/lib/$(DLIB); \
-           cp des.h $(INSTALLTOP)/include; \
-           chmod 644 $(INSTALLTOP)/include/des.h; \
-       else \
-           echo Standalone install; \
-           cp $(DLIB) $(LIBDIR)/$(DLIB); \
-           if test -s /bin/ranlib; then \
-             /bin/ranlib $(LIBDIR)/$(DLIB); \
-           else \
-             if test -s /usr/bin/ranlib; then \
-               /usr/bin/ranlib $(LIBDIR)/$(DLIB); \
-             fi; \
-           fi; \
-           chmod 644 $(LIBDIR)/$(DLIB); \
-           cp des_crypt.man $(MANDIR)/man$(MAN3)/des_crypt.$(MAN3); \
-           chmod 644 $(MANDIR)/man$(MAN3)/des_crypt.$(MAN3); \
-           cp des.man $(MANDIR)/man$(MAN1)/des.$(MAN1); \
-           chmod 644 $(MANDIR)/man$(MAN1)/des.$(MAN1); \
-           cp des.h $(INCDIR)/des.h; \
-           chmod 644 $(INCDIR)/des.h; \
-       fi
-# DO NOT DELETE THIS LINE -- make depend depends on it.
index 4197665..3eb0738 100644 (file)
@@ -32,21 +32,21 @@ LIBSRC=     cbc_cksm.c cbc_enc.c  cfb64enc.c cfb_enc.c  \
        fcrypt.c ofb64enc.c ofb_enc.c  pcbc_enc.c \
        qud_cksm.c rand_key.c read_pwd.c rpc_enc.c  set_key.c  \
        des_enc.c fcrypt_b.c read2pwd.c \
-       fcrypt.c xcbc_enc.c \
-       str2key.c  cfb64ede.c ofb64ede.c supp.c ede_cbcm_enc.c
+       xcbc_enc.c \
+       str2key.c  cfb64ede.c ofb64ede.c ede_cbcm_enc.c
 
 LIBOBJ= set_key.o  ecb_enc.o  cbc_enc.o \
        ecb3_enc.o cfb64enc.o cfb64ede.o cfb_enc.o  ofb64ede.o \
        enc_read.o enc_writ.o ofb64enc.o \
        ofb_enc.o  str2key.o  pcbc_enc.o qud_cksm.o rand_key.o \
        ${DES_ENC} read2pwd.o \
-       fcrypt.o xcbc_enc.o read_pwd.o rpc_enc.o  cbc_cksm.o supp.o \
+       fcrypt.o xcbc_enc.o read_pwd.o rpc_enc.o  cbc_cksm.o \
        ede_cbcm_enc.o
 
 SRC= $(LIBSRC)
 
 EXHEADER= des.h
-HEADER=        des_locl.h rpc_des.h podd.h sk.h spr.h des_ver.h $(EXHEADER)
+HEADER=        des_locl.h rpc_des.h spr.h des_ver.h $(EXHEADER)
 
 ALL=    $(GENERAL) $(SRC) $(HEADER)
 
@@ -65,10 +65,10 @@ des: des.o cbc3_enc.o lib
 
 # elf
 asm/dx86-elf.o: asm/dx86unix.cpp
-       $(CPP) -DELF asm/dx86unix.cpp | as -o asm/dx86-elf.o
+       $(CPP) -DELF -x c asm/dx86unix.cpp | as -o asm/dx86-elf.o
 
 asm/yx86-elf.o: asm/yx86unix.cpp
-       $(CPP) -DELF asm/yx86unix.cpp | as -o asm/yx86-elf.o
+       $(CPP) -DELF -x c asm/yx86unix.cpp | as -o asm/yx86-elf.o
 
 # solaris
 asm/dx86-sol.o: asm/dx86unix.cpp
@@ -95,10 +95,10 @@ asm/dx86bsdi.o: asm/dx86unix.cpp
 asm/yx86bsdi.o: asm/yx86unix.cpp
        $(CPP) -DBSDI asm/yx86unix.cpp | sed 's/ :/:/' | as -o asm/yx86bsdi.o
 
-asm/dx86unix.cpp: asm/des-586.pl
+asm/dx86unix.cpp: asm/des-586.pl ../perlasm/x86asm.pl ../perlasm/cbc.pl
        (cd asm; $(PERL) des-586.pl cpp >dx86unix.cpp)
 
-asm/yx86unix.cpp: asm/crypt586.pl
+asm/yx86unix.cpp: asm/crypt586.pl ../perlasm/x86asm.pl
        (cd asm; $(PERL) crypt586.pl cpp >yx86unix.cpp)
 
 files:
@@ -172,10 +172,8 @@ enc_writ.o: ../../include/openssl/err.h ../../include/openssl/opensslconf.h
 enc_writ.o: ../../include/openssl/opensslv.h ../../include/openssl/rand.h
 enc_writ.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h
 enc_writ.o: ../cryptlib.h des_locl.h
-fcrypt.o: ../../include/openssl/des.h ../../include/openssl/des.h
-fcrypt.o: ../../include/openssl/e_os2.h ../../include/openssl/e_os2.h
-fcrypt.o: ../../include/openssl/opensslconf.h
-fcrypt.o: ../../include/openssl/opensslconf.h des_locl.h des_locl.h
+fcrypt.o: ../../include/openssl/des.h ../../include/openssl/e_os2.h
+fcrypt.o: ../../include/openssl/opensslconf.h des_locl.h
 fcrypt_b.o: ../../include/openssl/des.h ../../include/openssl/e_os2.h
 fcrypt_b.o: ../../include/openssl/opensslconf.h des_locl.h
 ofb64ede.o: ../../include/openssl/des.h ../../include/openssl/e_os2.h
@@ -201,10 +199,8 @@ read_pwd.o: ../../include/openssl/stack.h ../cryptlib.h des_locl.h
 rpc_enc.o: ../../include/openssl/des.h ../../include/openssl/e_os2.h
 rpc_enc.o: ../../include/openssl/opensslconf.h des_locl.h des_ver.h rpc_des.h
 set_key.o: ../../include/openssl/des.h ../../include/openssl/e_os2.h
-set_key.o: ../../include/openssl/opensslconf.h des_locl.h podd.h sk.h
+set_key.o: ../../include/openssl/opensslconf.h des_locl.h
 str2key.o: ../../include/openssl/des.h ../../include/openssl/e_os2.h
 str2key.o: ../../include/openssl/opensslconf.h des_locl.h
-supp.o: ../../include/openssl/des.h ../../include/openssl/e_os2.h
-supp.o: ../../include/openssl/opensslconf.h des_locl.h
 xcbc_enc.o: ../../include/openssl/des.h ../../include/openssl/e_os2.h
 xcbc_enc.o: ../../include/openssl/opensslconf.h des_locl.h
index ec19d75..e69de29 100644 (file)
@@ -1,251 +0,0 @@
-# You must select the correct terminal control system to be used to
-# turn character echo off when reading passwords.  There a 5 systems
-# SGTTY   - the old BSD system
-# TERMIO  - most system V boxes
-# TERMIOS - SGI (ala IRIX).
-# VMS     - the DEC operating system
-# MSDOS   - we all know what it is :-)
-# read_pwd.c makes a reasonable guess at what is correct.
-
-# Targets
-# make          - twidle the options yourself :-)
-# make cc       - standard cc options
-# make gcc      - standard gcc options
-# make x86-elf  - linux-elf etc
-# make x86-out  - linux-a.out, FreeBSD etc
-# make x86-solaris
-# make x86-bdsi
-
-# If you are on a DEC Alpha, edit des.h and change the DES_LONG
-# define to 'unsigned int'.  I have seen this give a %20 speedup.
-
-OPTS0= -DRAND -DTERMIO #-DNOCONST
-
-# Version 1.94 has changed the strings_to_key function so that it is
-# now compatible with MITs when the string is longer than 8 characters.
-# If you wish to keep the old version, uncomment the following line.
-# This will affect the -E/-D options on des(1).
-#OPTS1= -DOLD_STR_TO_KEY
-
-# There are 4 possible performance options
-# -DDES_PTR
-# -DDES_RISC1
-# -DDES_RISC2 (only one of DES_RISC1 and DES_RISC2)
-# -DDES_UNROLL
-# after the initial build, run 'des_opts' to see which options are best
-# for your platform.  There are some listed in options.txt
-#OPTS2= -DDES_PTR 
-#OPTS3= -DDES_RISC1 # or DES_RISC2
-#OPTS4= -DDES_UNROLL
-
-OPTS= $(OPTS0) $(OPTS1) $(OPTS2) $(OPTS3) $(OPTS4)
-
-MAKE=make -f Makefile
-#CC=cc
-#CFLAG= -O
-
-CC=gcc
-#CFLAG= -O4 -funroll-loops -fomit-frame-pointer
-CFLAG= -O3 -fomit-frame-pointer
-
-CFLAGS=$(OPTS) $(CFLAG)
-CPP=$(CC) -E
-AS=as
-RANLIB=ranlib
-
-# Assember version of des_encrypt*().
-DES_ENC=des_enc.o fcrypt_b.o           # normal C version
-#DES_ENC=asm/dx86-elf.o        asm/yx86-elf.o  # elf format x86
-#DES_ENC=asm/dx86-out.o        asm/yx86-out.o  # a.out format x86
-#DES_ENC=asm/dx86-sol.o        asm/yx86-sol.o  # solaris format x86 
-#DES_ENC=asm/dx86bsdi.o        asm/yx86basi.o  # bsdi format x86 
-
-LIBDIR=/usr/local/lib
-BINDIR=/usr/local/bin
-INCDIR=/usr/local/include
-MANDIR=/usr/local/man
-MAN1=1
-MAN3=3
-SHELL=/bin/sh
-OBJ_LIT=cbc_enc.o ecb_enc.o $(DES_ENC) fcrypt.o set_key.o
-OBJ_FULL=cbc_cksm.o $(OBJ_LIT) pcbc_enc.o \
-       xcbc_enc.o qud_cksm.o cbc3_enc.o \
-       cfb64ede.o cfb64enc.o cfb_enc.o ecb3_enc.o \
-       enc_read.o enc_writ.o ofb64ede.o ofb64enc.o ofb_enc.o  \
-       rand_key.o read_pwd.o read2pwd.o rpc_enc.o  str2key.o supp.o
-
-GENERAL_LIT=COPYRIGHT INSTALL README VERSION Makefile des_crypt.man \
-       des.doc options.txt asm
-GENERAL_FULL=$(GENERAL_LIT) FILES Imakefile times vms.com KERBEROS MODES.DES \
-       des.man DES.pm DES.pod DES.xs Makefile.PL dess.cpp des3s.cpp \
-       Makefile.uni typemap t Makefile.ssl makefile.bc Makefile.lit \
-       des.org des_locl.org
-TESTING_LIT=   destest speed des_opts
-TESTING_FULL=  rpw des $(TESTING_LIT)
-TESTING_SRC_LIT=destest.c speed.c des_opts.c
-TESTING_SRC_FULL=rpw.c des.c $(TESTING_SRC_LIT)
-HEADERS_LIT=des_ver.h des.h des_locl.h podd.h sk.h spr.h
-HEADERS_FULL= $(HEADERS_LIT) rpc_des.h
-LIBDES_LIT=cbc_enc.c ecb_enc.c fcrypt.c set_key.c des_enc.c fcrypt_b.c
-LIBDES_FULL= cbc_cksm.c pcbc_enc.c qud_cksm.c cbc3_enc.c \
-       cfb64ede.c cfb64enc.c cfb_enc.c ecb3_enc.c \
-       enc_read.c enc_writ.c ofb64ede.c ofb64enc.c ofb_enc.c  \
-       rand_key.c rpc_enc.c  str2key.c  supp.c \
-       xcbc_enc.c $(LIBDES_LIT) read_pwd.c read2pwd.c
-
-PERL=  des.pl testdes.pl doIP doPC1 doPC2 PC1 PC2 shifts.pl
-
-OBJ=   $(OBJ_FULL)
-GENERAL=$(GENERAL_FULL)
-TESTING=$(TESTING_FULL)
-TESTING_SRC=$(TESTING_SRC_FULL)
-HEADERS=$(HEADERS_FULL)
-LIBDES=        $(LIBDES_FULL)
-
-ALL=   $(GENERAL) $(TESTING_SRC) $(LIBDES) $(PERL) $(HEADERS)
-
-DLIB=  libdes.a
-
-all: $(DLIB) $(TESTING)
-
-cc:
-       $(MAKE) CC=cc CFLAGS="-O $(OPTS) $(CFLAG)" all
-
-gcc:
-       $(MAKE) CC=gcc CFLAGS="-O3 -fomit-frame-pointer $(OPTS) $(CFLAG)" all
-
-x86-elf:
-       $(MAKE) DES_ENC='asm/dx86-elf.o asm/yx86-elf.o' CC=$(CC) CFLAGS="-DELF $(OPTS) $(CFLAG)" all
-
-x86-out:
-       $(MAKE) DES_ENC='asm/dx86-out.o asm/yx86-out.o' CC=$(CC) CFLAGS="-DOUT $(OPTS) $(CFLAG)" all
-
-x86-solaris:
-       $(MAKE) DES_ENC='asm/dx86-sol.o asm/yx86-sol.o' CC=$(CC) CFLAGS="-DSOL $(OPTS) $(CFLAG)" all
-
-x86-bsdi:
-       $(MAKE) DES_ENC='asm/dx86bsdi.o asm/yx86bsdi.o' CC=$(CC) CFLAGS="-DBSDI $(OPTS) $(CFLAG)" all
-
-# elf
-asm/dx86-elf.o: asm/dx86unix.cpp
-       $(CPP) -DELF asm/dx86unix.cpp | $(AS) -o asm/dx86-elf.o
-
-asm/yx86-elf.o: asm/yx86unix.cpp
-       $(CPP) -DELF asm/yx86unix.cpp | $(AS) -o asm/yx86-elf.o
-
-# solaris
-asm/dx86-sol.o: asm/dx86unix.cpp
-       $(CC) -E -DSOL asm/dx86unix.cpp | sed 's/^#.*//' > asm/dx86-sol.s
-       as -o asm/dx86-sol.o asm/dx86-sol.s
-       rm -f asm/dx86-sol.s
-
-asm/yx86-sol.o: asm/yx86unix.cpp
-       $(CC) -E -DSOL asm/yx86unix.cpp | sed 's/^#.*//' > asm/yx86-sol.s
-       as -o asm/yx86-sol.o asm/yx86-sol.s
-       rm -f asm/yx86-sol.s
-
-# a.out
-asm/dx86-out.o: asm/dx86unix.cpp
-       $(CPP) -DOUT asm/dx86unix.cpp | $(AS) -o asm/dx86-out.o
-
-asm/yx86-out.o: asm/yx86unix.cpp
-       $(CPP) -DOUT asm/yx86unix.cpp | $(AS) -o asm/yx86-out.o
-
-# bsdi
-asm/dx86bsdi.o: asm/dx86unix.cpp
-       $(CPP) -DBSDI asm/dx86unix.cpp | $(AS) -o asm/dx86bsdi.o
-
-asm/yx86bsdi.o: asm/yx86unix.cpp
-       $(CPP) -DBSDI asm/yx86unix.cpp | $(AS) -o asm/yx86bsdi.o
-
-asm/dx86unix.cpp:
-       (cd asm; perl des-586.pl cpp >dx86unix.cpp)
-
-asm/yx86unix.cpp:
-       (cd asm; perl crypt586.pl cpp >yx86unix.cpp)
-
-test:  all
-       ./destest
-
-$(DLIB): $(OBJ)
-       /bin/rm -f $(DLIB)
-       ar cr $(DLIB) $(OBJ)
-       $(RANLIB) $(DLIB)
-
-des_opts: des_opts.o $(DLIB)
-       $(CC) $(CFLAGS) -o des_opts des_opts.o $(DLIB)
-
-destest: destest.o $(DLIB)
-       $(CC) $(CFLAGS) -o destest destest.o $(DLIB)
-
-rpw: rpw.o $(DLIB)
-       $(CC) $(CFLAGS) -o rpw rpw.o $(DLIB)
-
-speed: speed.o $(DLIB)
-       $(CC) $(CFLAGS) -o speed speed.o $(DLIB)
-
-des: des.o $(DLIB)
-       $(CC) $(CFLAGS) -o des des.o $(DLIB)
-
-tags:
-       ctags $(TESTING_SRC) $(LIBDES)
-
-tar_lit:
-       /bin/mv Makefile Makefile.tmp
-       /bin/cp Makefile.lit Makefile
-       for i in $(HEADERS_LIT) $(LIBDES_LIT) $(GENERAL_LIT) $(TESTING_SRC_LIT) ;\
-       do \
-               n="$$n des/$$i"; \
-       done; \
-       ( cd .. ; tar chf - $$n )| gzip > libdes-l.tgz
-       /bin/rm -f Makefile
-       /bin/mv Makefile.tmp Makefile
-
-tar:
-       mv Makefile Makefile.tmp
-       /bin/cp Makefile.uni Makefile
-       for i in $(ALL) ;\
-       do \
-               n="$$n des/$$i"; \
-       done; \
-       ( cd .. ; tar chf - $$n )| gzip > libdes.tgz
-       /bin/rm -f Makefile
-       /bin/mv Makefile.tmp Makefile
-
-shar:
-       shar $(ALL) >libdes.shar
-
-depend:
-       makedepend $(LIBDES) $(TESTING_SRC)
-
-clean:
-       /bin/rm -f *.o tags core $(TESTING) $(DLIB) .nfs* *.old *.bak asm/*.o 
-
-dclean:
-       sed -e '/^# DO NOT DELETE THIS LINE/ q' Makefile >Makefile.new
-       mv -f Makefile.new Makefile
-
-# Eric is probably going to choke when he next looks at this --tjh
-install: des
-       if test $(INSTALLTOP); then \
-           echo SSL style install; \
-           cp $(DLIB) $(INSTALLTOP)/lib; \
-               $(RANLIB) $(DLIB); \
-           chmod 644 $(INSTALLTOP)/lib/$(DLIB); \
-           cp des.h $(INSTALLTOP)/include; \
-           chmod 644 $(INSTALLTOP)/include/des.h; \
-       else \
-           echo Standalone install; \
-           cp $(DLIB) $(LIBDIR)/$(DLIB); \
-               $(RANLIB) $(DLIB); \
-           chmod 644 $(LIBDIR)/$(DLIB); \
-           cp des $(BINDIR)/des; \
-           chmod 711 $(BINDIR)/des; \
-           cp des_crypt.man $(MANDIR)/man$(MAN3)/des_crypt.$(MAN3); \
-           chmod 644 $(MANDIR)/man$(MAN3)/des_crypt.$(MAN3); \
-           cp des.man $(MANDIR)/man$(MAN1)/des.$(MAN1); \
-           chmod 644 $(MANDIR)/man$(MAN1)/des.$(MAN1); \
-           cp des.h $(INCDIR)/des.h; \
-           chmod 644 $(INCDIR)/des.h; \
-       fi
-# DO NOT DELETE THIS LINE -- make depend depends on it.
index efb8348..e69de29 100644 (file)
@@ -1,28 +0,0 @@
-#!/usr/local/bin/perl
-
-@PC1=(  57,49,41,33,25,17, 9,
-        1,58,50,42,34,26,18,
-       10, 2,59,51,43,35,27,
-       19,11, 3,60,52,44,36,
-       "-","-","-","-",
-       63,55,47,39,31,23,15,
-        7,62,54,46,38,30,22,
-       14, 6,61,53,45,37,29,
-       21,13, 5,28,20,12, 4,
-       "-","-","-","-",
-       );
-
-foreach (@PC1)
-       {
-       if ($_ ne "-")
-               {
-               $_--;
-               $_=int($_/8)*8+7-($_%8);
-               printf "%2d  ",$_;
-               }
-       else
-               { print "--  "; }
-       print "\n" if (((++$i) % 8) == 0);
-       print "\n" if ((($i) % 32) == 0);
-       }
-
index 2d56027..e69de29 100644 (file)
@@ -1,57 +0,0 @@
-#!/usr/local/bin/perl
-
-@PC2_C=(14,17,11,24, 1, 5,
-        3,28,15, 6,21,10,
-       23,19,12, 4,26, 8,
-       16, 7,27,20,13, 2,
-       );
-
-@PC2_D=(41,52,31,37,47,55,
-       30,40,51,45,33,48,
-       44,49,39,56,34,53,
-       46,42,50,36,29,32,
-       );
-
-foreach (@PC2_C) {
-       if ($_ ne "-")
-               {
-               $_--;
-               printf "%2d  ",$_; }
-       else { print "--  "; }
-       $C{$_}=1;
-       print "\n" if (((++$i) % 8) == 0);
-       }
-$i=0;
-print "\n";
-foreach (@PC2_D) {
-       if ($_ ne "-")
-               {
-               $_-=29;
-               printf "%2d  ",$_; }
-       else { print "--  "; }
-       $D{$_}=1;
-       print "\n" if (((++$i) % 8) == 0); }
-
-print "\n";
-foreach $i (0 .. 27)
-       {
-       $_=$C{$i};
-       if ($_ ne "-") {printf "%2d ",$_;}
-       else { print "--  "; }
-       print "\n" if (((++$i) % 8) == 0);
-       }
-print "\n";
-
-print "\n";
-foreach $i (0 .. 27)
-       {
-       $_=$D{$i};
-       if ($_ ne "-") {printf "%2d  ",$_;}
-       else { print "--  "; }
-       print "\n" if (((++$i) % 8) == 0);
-       }
-print "\n";
-sub numsort
-       {
-       $a-$b;
-       }
index 9e3dc9c..e69de29 100644 (file)
-       ; Don't even think of reading this code
-       ; It was automatically generated by des-586.pl
-       ; Which is a perl program used to generate the x86 assember for
-       ; any of elf, a.out, BSDI,Win32, or Solaris
-       ; eric <eay@cryptsoft.com>
-       ; 
-       TITLE   des-586.asm
-        .386
-.model FLAT
-_TEXT  SEGMENT
-PUBLIC _des_encrypt
-EXTRN   _des_SPtrans:DWORD
-_des_encrypt PROC NEAR
-       push    esi
-       push    edi
-       ; 
-       ; Load the 2 words
-       mov     esi,            DWORD PTR 12[esp]
-       xor     ecx,            ecx
-       push    ebx
-       push    ebp
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 28[esp]
-       mov     edi,            DWORD PTR 4[esi]
-       ; 
-       ; IP
-       rol     eax,            4
-       mov     esi,            eax
-       xor     eax,            edi
-       and     eax,            0f0f0f0f0h
-       xor     esi,            eax
-       xor     edi,            eax
-       ; 
-       rol     edi,            20
-       mov     eax,            edi
-       xor     edi,            esi
-       and     edi,            0fff0000fh
-       xor     eax,            edi
-       xor     esi,            edi
-       ; 
-       rol     eax,            14
-       mov     edi,            eax
-       xor     eax,            esi
-       and     eax,            033333333h
-       xor     edi,            eax
-       xor     esi,            eax
-       ; 
-       rol     esi,            22
-       mov     eax,            esi
-       xor     esi,            edi
-       and     esi,            003fc03fch
-       xor     eax,            esi
-       xor     edi,            esi
-       ; 
-       rol     eax,            9
-       mov     esi,            eax
-       xor     eax,            edi
-       and     eax,            0aaaaaaaah
-       xor     esi,            eax
-       xor     edi,            eax
-       ; 
-       rol     edi,            1
-       mov     ebp,            DWORD PTR 24[esp]
-       cmp     ebx,            0
-       je      $L000start_decrypt
-       ; 
-       ; Round 0
-       mov     eax,            DWORD PTR [ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 4[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 1
-       mov     eax,            DWORD PTR 8[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 12[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 2
-       mov     eax,            DWORD PTR 16[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 20[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 3
-       mov     eax,            DWORD PTR 24[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 28[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 4
-       mov     eax,            DWORD PTR 32[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 36[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 5
-       mov     eax,            DWORD PTR 40[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 44[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 6
-       mov     eax,            DWORD PTR 48[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 52[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 7
-       mov     eax,            DWORD PTR 56[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 60[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 8
-       mov     eax,            DWORD PTR 64[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 68[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 9
-       mov     eax,            DWORD PTR 72[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 76[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 10
-       mov     eax,            DWORD PTR 80[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 84[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 11
-       mov     eax,            DWORD PTR 88[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 92[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 12
-       mov     eax,            DWORD PTR 96[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 100[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 13
-       mov     eax,            DWORD PTR 104[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 108[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 14
-       mov     eax,            DWORD PTR 112[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 116[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 15
-       mov     eax,            DWORD PTR 120[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 124[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       jmp     $L001end
-$L000start_decrypt:
-       ; 
-       ; Round 15
-       mov     eax,            DWORD PTR 120[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 124[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 14
-       mov     eax,            DWORD PTR 112[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 116[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 13
-       mov     eax,            DWORD PTR 104[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 108[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 12
-       mov     eax,            DWORD PTR 96[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 100[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 11
-       mov     eax,            DWORD PTR 88[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 92[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 10
-       mov     eax,            DWORD PTR 80[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 84[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 9
-       mov     eax,            DWORD PTR 72[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 76[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 8
-       mov     eax,            DWORD PTR 64[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 68[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 7
-       mov     eax,            DWORD PTR 56[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 60[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 6
-       mov     eax,            DWORD PTR 48[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 52[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 5
-       mov     eax,            DWORD PTR 40[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 44[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 4
-       mov     eax,            DWORD PTR 32[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 36[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 3
-       mov     eax,            DWORD PTR 24[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 28[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 2
-       mov     eax,            DWORD PTR 16[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 20[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 1
-       mov     eax,            DWORD PTR 8[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 12[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 0
-       mov     eax,            DWORD PTR [ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 4[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-$L001end:
-       ; 
-       ; FP
-       mov     edx,            DWORD PTR 20[esp]
-       ror     esi,            1
-       mov     eax,            edi
-       xor     edi,            esi
-       and     edi,            0aaaaaaaah
-       xor     eax,            edi
-       xor     esi,            edi
-       ; 
-       rol     eax,            23
-       mov     edi,            eax
-       xor     eax,            esi
-       and     eax,            003fc03fch
-       xor     edi,            eax
-       xor     esi,            eax
-       ; 
-       rol     edi,            10
-       mov     eax,            edi
-       xor     edi,            esi
-       and     edi,            033333333h
-       xor     eax,            edi
-       xor     esi,            edi
-       ; 
-       rol     esi,            18
-       mov     edi,            esi
-       xor     esi,            eax
-       and     esi,            0fff0000fh
-       xor     edi,            esi
-       xor     eax,            esi
-       ; 
-       rol     edi,            12
-       mov     esi,            edi
-       xor     edi,            eax
-       and     edi,            0f0f0f0f0h
-       xor     esi,            edi
-       xor     eax,            edi
-       ; 
-       ror     eax,            4
-       mov     DWORD PTR [edx],eax
-       mov     DWORD PTR 4[edx],esi
-       pop     ebp
-       pop     ebx
-       pop     edi
-       pop     esi
-       ret
-_des_encrypt ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _des_encrypt2
-EXTRN   _des_SPtrans:DWORD
-_des_encrypt2 PROC NEAR
-       push    esi
-       push    edi
-       ; 
-       ; Load the 2 words
-       mov     eax,            DWORD PTR 12[esp]
-       xor     ecx,            ecx
-       push    ebx
-       push    ebp
-       mov     esi,            DWORD PTR [eax]
-       mov     ebx,            DWORD PTR 28[esp]
-       rol     esi,            3
-       mov     edi,            DWORD PTR 4[eax]
-       rol     edi,            3
-       mov     ebp,            DWORD PTR 24[esp]
-       cmp     ebx,            0
-       je      $L002start_decrypt
-       ; 
-       ; Round 0
-       mov     eax,            DWORD PTR [ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 4[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 1
-       mov     eax,            DWORD PTR 8[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 12[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 2
-       mov     eax,            DWORD PTR 16[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 20[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 3
-       mov     eax,            DWORD PTR 24[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 28[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 4
-       mov     eax,            DWORD PTR 32[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 36[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 5
-       mov     eax,            DWORD PTR 40[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 44[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 6
-       mov     eax,            DWORD PTR 48[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 52[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 7
-       mov     eax,            DWORD PTR 56[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 60[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 8
-       mov     eax,            DWORD PTR 64[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 68[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 9
-       mov     eax,            DWORD PTR 72[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 76[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 10
-       mov     eax,            DWORD PTR 80[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 84[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 11
-       mov     eax,            DWORD PTR 88[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 92[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 12
-       mov     eax,            DWORD PTR 96[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 100[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 13
-       mov     eax,            DWORD PTR 104[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 108[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 14
-       mov     eax,            DWORD PTR 112[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 116[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 15
-       mov     eax,            DWORD PTR 120[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 124[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       jmp     $L003end
-$L002start_decrypt:
-       ; 
-       ; Round 15
-       mov     eax,            DWORD PTR 120[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 124[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 14
-       mov     eax,            DWORD PTR 112[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 116[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 13
-       mov     eax,            DWORD PTR 104[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 108[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 12
-       mov     eax,            DWORD PTR 96[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 100[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 11
-       mov     eax,            DWORD PTR 88[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 92[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 10
-       mov     eax,            DWORD PTR 80[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 84[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 9
-       mov     eax,            DWORD PTR 72[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 76[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 8
-       mov     eax,            DWORD PTR 64[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 68[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 7
-       mov     eax,            DWORD PTR 56[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 60[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 6
-       mov     eax,            DWORD PTR 48[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 52[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 5
-       mov     eax,            DWORD PTR 40[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 44[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 4
-       mov     eax,            DWORD PTR 32[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 36[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 3
-       mov     eax,            DWORD PTR 24[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 28[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 2
-       mov     eax,            DWORD PTR 16[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 20[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 1
-       mov     eax,            DWORD PTR 8[ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 12[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 0
-       mov     eax,            DWORD PTR [ebp]
-       xor     ebx,            ebx
-       mov     edx,            DWORD PTR 4[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       and     eax,            0fcfcfcfch
-       and     edx,            0cfcfcfcfh
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-$L003end:
-       ; 
-       ; Fixup
-       ror     edi,            3
-       mov     eax,            DWORD PTR 20[esp]
-       ror     esi,            3
-       mov     DWORD PTR [eax],edi
-       mov     DWORD PTR 4[eax],esi
-       pop     ebp
-       pop     ebx
-       pop     edi
-       pop     esi
-       ret
-_des_encrypt2 ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _des_encrypt3
-
-_des_encrypt3 PROC NEAR
-       push    ebx
-       mov     ebx,            DWORD PTR 8[esp]
-       push    ebp
-       push    esi
-       push    edi
-       ; 
-       ; Load the data words
-       mov     edi,            DWORD PTR [ebx]
-       mov     esi,            DWORD PTR 4[ebx]
-       sub     esp,            12
-       ; 
-       ; IP
-       rol     edi,            4
-       mov     edx,            edi
-       xor     edi,            esi
-       and     edi,            0f0f0f0f0h
-       xor     edx,            edi
-       xor     esi,            edi
-       ; 
-       rol     esi,            20
-       mov     edi,            esi
-       xor     esi,            edx
-       and     esi,            0fff0000fh
-       xor     edi,            esi
-       xor     edx,            esi
-       ; 
-       rol     edi,            14
-       mov     esi,            edi
-       xor     edi,            edx
-       and     edi,            033333333h
-       xor     esi,            edi
-       xor     edx,            edi
-       ; 
-       rol     edx,            22
-       mov     edi,            edx
-       xor     edx,            esi
-       and     edx,            003fc03fch
-       xor     edi,            edx
-       xor     esi,            edx
-       ; 
-       rol     edi,            9
-       mov     edx,            edi
-       xor     edi,            esi
-       and     edi,            0aaaaaaaah
-       xor     edx,            edi
-       xor     esi,            edi
-       ; 
-       ror     edx,            3
-       ror     esi,            2
-       mov     DWORD PTR 4[ebx],esi
-       mov     eax,            DWORD PTR 36[esp]
-       mov     DWORD PTR [ebx],edx
-       mov     edi,            DWORD PTR 40[esp]
-       mov     esi,            DWORD PTR 44[esp]
-       mov     DWORD PTR 8[esp],1
-       mov     DWORD PTR 4[esp],eax
-       mov     DWORD PTR [esp],ebx
-       call    _des_encrypt2
-       mov     DWORD PTR 8[esp],0
-       mov     DWORD PTR 4[esp],edi
-       mov     DWORD PTR [esp],ebx
-       call    _des_encrypt2
-       mov     DWORD PTR 8[esp],1
-       mov     DWORD PTR 4[esp],esi
-       mov     DWORD PTR [esp],ebx
-       call    _des_encrypt2
-       add     esp,            12
-       mov     edi,            DWORD PTR [ebx]
-       mov     esi,            DWORD PTR 4[ebx]
-       ; 
-       ; FP
-       rol     esi,            2
-       rol     edi,            3
-       mov     eax,            edi
-       xor     edi,            esi
-       and     edi,            0aaaaaaaah
-       xor     eax,            edi
-       xor     esi,            edi
-       ; 
-       rol     eax,            23
-       mov     edi,            eax
-       xor     eax,            esi
-       and     eax,            003fc03fch
-       xor     edi,            eax
-       xor     esi,            eax
-       ; 
-       rol     edi,            10
-       mov     eax,            edi
-       xor     edi,            esi
-       and     edi,            033333333h
-       xor     eax,            edi
-       xor     esi,            edi
-       ; 
-       rol     esi,            18
-       mov     edi,            esi
-       xor     esi,            eax
-       and     esi,            0fff0000fh
-       xor     edi,            esi
-       xor     eax,            esi
-       ; 
-       rol     edi,            12
-       mov     esi,            edi
-       xor     edi,            eax
-       and     edi,            0f0f0f0f0h
-       xor     esi,            edi
-       xor     eax,            edi
-       ; 
-       ror     eax,            4
-       mov     DWORD PTR [ebx],eax
-       mov     DWORD PTR 4[ebx],esi
-       pop     edi
-       pop     esi
-       pop     ebp
-       pop     ebx
-       ret
-_des_encrypt3 ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _des_decrypt3
-
-_des_decrypt3 PROC NEAR
-       push    ebx
-       mov     ebx,            DWORD PTR 8[esp]
-       push    ebp
-       push    esi
-       push    edi
-       ; 
-       ; Load the data words
-       mov     edi,            DWORD PTR [ebx]
-       mov     esi,            DWORD PTR 4[ebx]
-       sub     esp,            12
-       ; 
-       ; IP
-       rol     edi,            4
-       mov     edx,            edi
-       xor     edi,            esi
-       and     edi,            0f0f0f0f0h
-       xor     edx,            edi
-       xor     esi,            edi
-       ; 
-       rol     esi,            20
-       mov     edi,            esi
-       xor     esi,            edx
-       and     esi,            0fff0000fh
-       xor     edi,            esi
-       xor     edx,            esi
-       ; 
-       rol     edi,            14
-       mov     esi,            edi
-       xor     edi,            edx
-       and     edi,            033333333h
-       xor     esi,            edi
-       xor     edx,            edi
-       ; 
-       rol     edx,            22
-       mov     edi,            edx
-       xor     edx,            esi
-       and     edx,            003fc03fch
-       xor     edi,            edx
-       xor     esi,            edx
-       ; 
-       rol     edi,            9
-       mov     edx,            edi
-       xor     edi,            esi
-       and     edi,            0aaaaaaaah
-       xor     edx,            edi
-       xor     esi,            edi
-       ; 
-       ror     edx,            3
-       ror     esi,            2
-       mov     DWORD PTR 4[ebx],esi
-       mov     esi,            DWORD PTR 36[esp]
-       mov     DWORD PTR [ebx],edx
-       mov     edi,            DWORD PTR 40[esp]
-       mov     eax,            DWORD PTR 44[esp]
-       mov     DWORD PTR 8[esp],0
-       mov     DWORD PTR 4[esp],eax
-       mov     DWORD PTR [esp],ebx
-       call    _des_encrypt2
-       mov     DWORD PTR 8[esp],1
-       mov     DWORD PTR 4[esp],edi
-       mov     DWORD PTR [esp],ebx
-       call    _des_encrypt2
-       mov     DWORD PTR 8[esp],0
-       mov     DWORD PTR 4[esp],esi
-       mov     DWORD PTR [esp],ebx
-       call    _des_encrypt2
-       add     esp,            12
-       mov     edi,            DWORD PTR [ebx]
-       mov     esi,            DWORD PTR 4[ebx]
-       ; 
-       ; FP
-       rol     esi,            2
-       rol     edi,            3
-       mov     eax,            edi
-       xor     edi,            esi
-       and     edi,            0aaaaaaaah
-       xor     eax,            edi
-       xor     esi,            edi
-       ; 
-       rol     eax,            23
-       mov     edi,            eax
-       xor     eax,            esi
-       and     eax,            003fc03fch
-       xor     edi,            eax
-       xor     esi,            eax
-       ; 
-       rol     edi,            10
-       mov     eax,            edi
-       xor     edi,            esi
-       and     edi,            033333333h
-       xor     eax,            edi
-       xor     esi,            edi
-       ; 
-       rol     esi,            18
-       mov     edi,            esi
-       xor     esi,            eax
-       and     esi,            0fff0000fh
-       xor     edi,            esi
-       xor     eax,            esi
-       ; 
-       rol     edi,            12
-       mov     esi,            edi
-       xor     edi,            eax
-       and     edi,            0f0f0f0f0h
-       xor     esi,            edi
-       xor     eax,            edi
-       ; 
-       ror     eax,            4
-       mov     DWORD PTR [ebx],eax
-       mov     DWORD PTR 4[ebx],esi
-       pop     edi
-       pop     esi
-       pop     ebp
-       pop     ebx
-       ret
-_des_decrypt3 ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _des_ncbc_encrypt
-
-_des_ncbc_encrypt PROC NEAR
-       ; 
-       push    ebp
-       push    ebx
-       push    esi
-       push    edi
-       mov     ebp,            DWORD PTR 28[esp]
-       ; getting iv ptr from parameter 4
-       mov     ebx,            DWORD PTR 36[esp]
-       mov     esi,            DWORD PTR [ebx]
-       mov     edi,            DWORD PTR 4[ebx]
-       push    edi
-       push    esi
-       push    edi
-       push    esi
-       mov     ebx,            esp
-       mov     esi,            DWORD PTR 36[esp]
-       mov     edi,            DWORD PTR 40[esp]
-       ; getting encrypt flag from parameter 5
-       mov     ecx,            DWORD PTR 56[esp]
-       ; get and push parameter 5
-       push    ecx
-       ; get and push parameter 3
-       mov     eax,            DWORD PTR 52[esp]
-       push    eax
-       push    ebx
-       cmp     ecx,            0
-       jz      $L004decrypt
-       and     ebp,            4294967288
-       mov     eax,            DWORD PTR 12[esp]
-       mov     ebx,            DWORD PTR 16[esp]
-       jz      $L005encrypt_finish
-L006encrypt_loop:
-       mov     ecx,            DWORD PTR [esi]
-       mov     edx,            DWORD PTR 4[esi]
-       xor     eax,            ecx
-       xor     ebx,            edx
-       mov     DWORD PTR 12[esp],eax
-       mov     DWORD PTR 16[esp],ebx
-       call    _des_encrypt
-       mov     eax,            DWORD PTR 12[esp]
-       mov     ebx,            DWORD PTR 16[esp]
-       mov     DWORD PTR [edi],eax
-       mov     DWORD PTR 4[edi],ebx
-       add     esi,            8
-       add     edi,            8
-       sub     ebp,            8
-       jnz     L006encrypt_loop
-$L005encrypt_finish:
-       mov     ebp,            DWORD PTR 56[esp]
-       and     ebp,            7
-       jz      $L007finish
-       xor     ecx,            ecx
-       xor     edx,            edx
-       mov     ebp,            DWORD PTR $L008cbc_enc_jmp_table[ebp*4]
-       jmp      ebp
-L009ej7:
-       mov     dh,             BYTE PTR 6[esi]
-       shl     edx,            8
-L010ej6:
-       mov     dh,             BYTE PTR 5[esi]
-L011ej5:
-       mov     dl,             BYTE PTR 4[esi]
-L012ej4:
-       mov     ecx,            DWORD PTR [esi]
-       jmp     $L013ejend
-L014ej3:
-       mov     ch,             BYTE PTR 2[esi]
-       shl     ecx,            8
-L015ej2:
-       mov     ch,             BYTE PTR 1[esi]
-L016ej1:
-       mov     cl,             BYTE PTR [esi]
-$L013ejend:
-       xor     eax,            ecx
-       xor     ebx,            edx
-       mov     DWORD PTR 12[esp],eax
-       mov     DWORD PTR 16[esp],ebx
-       call    _des_encrypt
-       mov     eax,            DWORD PTR 12[esp]
-       mov     ebx,            DWORD PTR 16[esp]
-       mov     DWORD PTR [edi],eax
-       mov     DWORD PTR 4[edi],ebx
-       jmp     $L007finish
-$L004decrypt:
-       and     ebp,            4294967288
-       mov     eax,            DWORD PTR 20[esp]
-       mov     ebx,            DWORD PTR 24[esp]
-       jz      $L017decrypt_finish
-L018decrypt_loop:
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-       mov     DWORD PTR 12[esp],eax
-       mov     DWORD PTR 16[esp],ebx
-       call    _des_encrypt
-       mov     eax,            DWORD PTR 12[esp]
-       mov     ebx,            DWORD PTR 16[esp]
-       mov     ecx,            DWORD PTR 20[esp]
-       mov     edx,            DWORD PTR 24[esp]
-       xor     ecx,            eax
-       xor     edx,            ebx
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-       mov     DWORD PTR [edi],ecx
-       mov     DWORD PTR 4[edi],edx
-       mov     DWORD PTR 20[esp],eax
-       mov     DWORD PTR 24[esp],ebx
-       add     esi,            8
-       add     edi,            8
-       sub     ebp,            8
-       jnz     L018decrypt_loop
-$L017decrypt_finish:
-       mov     ebp,            DWORD PTR 56[esp]
-       and     ebp,            7
-       jz      $L007finish
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-       mov     DWORD PTR 12[esp],eax
-       mov     DWORD PTR 16[esp],ebx
-       call    _des_encrypt
-       mov     eax,            DWORD PTR 12[esp]
-       mov     ebx,            DWORD PTR 16[esp]
-       mov     ecx,            DWORD PTR 20[esp]
-       mov     edx,            DWORD PTR 24[esp]
-       xor     ecx,            eax
-       xor     edx,            ebx
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-L019dj7:
-       ror     edx,            16
-       mov     BYTE PTR 6[edi],dl
-       shr     edx,            16
-L020dj6:
-       mov     BYTE PTR 5[edi],dh
-L021dj5:
-       mov     BYTE PTR 4[edi],dl
-L022dj4:
-       mov     DWORD PTR [edi],ecx
-       jmp     $L023djend
-L024dj3:
-       ror     ecx,            16
-       mov     BYTE PTR 2[edi],cl
-       shl     ecx,            16
-L025dj2:
-       mov     BYTE PTR 1[esi],ch
-L026dj1:
-       mov     BYTE PTR [esi], cl
-$L023djend:
-       jmp     $L007finish
-$L007finish:
-       mov     ecx,            DWORD PTR 64[esp]
-       add     esp,            28
-       mov     DWORD PTR [ecx],eax
-       mov     DWORD PTR 4[ecx],ebx
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-$L008cbc_enc_jmp_table:
-       DD      0
-       DD      L016ej1
-       DD      L015ej2
-       DD      L014ej3
-       DD      L012ej4
-       DD      L011ej5
-       DD      L010ej6
-       DD      L009ej7
-L027cbc_dec_jmp_table:
-       DD      0
-       DD      L026dj1
-       DD      L025dj2
-       DD      L024dj3
-       DD      L022dj4
-       DD      L021dj5
-       DD      L020dj6
-       DD      L019dj7
-_des_ncbc_encrypt ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _des_ede3_cbc_encrypt
-
-_des_ede3_cbc_encrypt PROC NEAR
-       ; 
-       push    ebp
-       push    ebx
-       push    esi
-       push    edi
-       mov     ebp,            DWORD PTR 28[esp]
-       ; getting iv ptr from parameter 6
-       mov     ebx,            DWORD PTR 44[esp]
-       mov     esi,            DWORD PTR [ebx]
-       mov     edi,            DWORD PTR 4[ebx]
-       push    edi
-       push    esi
-       push    edi
-       push    esi
-       mov     ebx,            esp
-       mov     esi,            DWORD PTR 36[esp]
-       mov     edi,            DWORD PTR 40[esp]
-       ; getting encrypt flag from parameter 7
-       mov     ecx,            DWORD PTR 64[esp]
-       ; get and push parameter 5
-       mov     eax,            DWORD PTR 56[esp]
-       push    eax
-       ; get and push parameter 4
-       mov     eax,            DWORD PTR 56[esp]
-       push    eax
-       ; get and push parameter 3
-       mov     eax,            DWORD PTR 56[esp]
-       push    eax
-       push    ebx
-       cmp     ecx,            0
-       jz      $L028decrypt
-       and     ebp,            4294967288
-       mov     eax,            DWORD PTR 16[esp]
-       mov     ebx,            DWORD PTR 20[esp]
-       jz      $L029encrypt_finish
-L030encrypt_loop:
-       mov     ecx,            DWORD PTR [esi]
-       mov     edx,            DWORD PTR 4[esi]
-       xor     eax,            ecx
-       xor     ebx,            edx
-       mov     DWORD PTR 16[esp],eax
-       mov     DWORD PTR 20[esp],ebx
-       call    _des_encrypt3
-       mov     eax,            DWORD PTR 16[esp]
-       mov     ebx,            DWORD PTR 20[esp]
-       mov     DWORD PTR [edi],eax
-       mov     DWORD PTR 4[edi],ebx
-       add     esi,            8
-       add     edi,            8
-       sub     ebp,            8
-       jnz     L030encrypt_loop
-$L029encrypt_finish:
-       mov     ebp,            DWORD PTR 60[esp]
-       and     ebp,            7
-       jz      $L031finish
-       xor     ecx,            ecx
-       xor     edx,            edx
-       mov     ebp,            DWORD PTR $L032cbc_enc_jmp_table[ebp*4]
-       jmp      ebp
-L033ej7:
-       mov     dh,             BYTE PTR 6[esi]
-       shl     edx,            8
-L034ej6:
-       mov     dh,             BYTE PTR 5[esi]
-L035ej5:
-       mov     dl,             BYTE PTR 4[esi]
-L036ej4:
-       mov     ecx,            DWORD PTR [esi]
-       jmp     $L037ejend
-L038ej3:
-       mov     ch,             BYTE PTR 2[esi]
-       shl     ecx,            8
-L039ej2:
-       mov     ch,             BYTE PTR 1[esi]
-L040ej1:
-       mov     cl,             BYTE PTR [esi]
-$L037ejend:
-       xor     eax,            ecx
-       xor     ebx,            edx
-       mov     DWORD PTR 16[esp],eax
-       mov     DWORD PTR 20[esp],ebx
-       call    _des_encrypt3
-       mov     eax,            DWORD PTR 16[esp]
-       mov     ebx,            DWORD PTR 20[esp]
-       mov     DWORD PTR [edi],eax
-       mov     DWORD PTR 4[edi],ebx
-       jmp     $L031finish
-$L028decrypt:
-       and     ebp,            4294967288
-       mov     eax,            DWORD PTR 24[esp]
-       mov     ebx,            DWORD PTR 28[esp]
-       jz      $L041decrypt_finish
-L042decrypt_loop:
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-       mov     DWORD PTR 16[esp],eax
-       mov     DWORD PTR 20[esp],ebx
-       call    _des_decrypt3
-       mov     eax,            DWORD PTR 16[esp]
-       mov     ebx,            DWORD PTR 20[esp]
-       mov     ecx,            DWORD PTR 24[esp]
-       mov     edx,            DWORD PTR 28[esp]
-       xor     ecx,            eax
-       xor     edx,            ebx
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-       mov     DWORD PTR [edi],ecx
-       mov     DWORD PTR 4[edi],edx
-       mov     DWORD PTR 24[esp],eax
-       mov     DWORD PTR 28[esp],ebx
-       add     esi,            8
-       add     edi,            8
-       sub     ebp,            8
-       jnz     L042decrypt_loop
-$L041decrypt_finish:
-       mov     ebp,            DWORD PTR 60[esp]
-       and     ebp,            7
-       jz      $L031finish
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-       mov     DWORD PTR 16[esp],eax
-       mov     DWORD PTR 20[esp],ebx
-       call    _des_decrypt3
-       mov     eax,            DWORD PTR 16[esp]
-       mov     ebx,            DWORD PTR 20[esp]
-       mov     ecx,            DWORD PTR 24[esp]
-       mov     edx,            DWORD PTR 28[esp]
-       xor     ecx,            eax
-       xor     edx,            ebx
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-L043dj7:
-       ror     edx,            16
-       mov     BYTE PTR 6[edi],dl
-       shr     edx,            16
-L044dj6:
-       mov     BYTE PTR 5[edi],dh
-L045dj5:
-       mov     BYTE PTR 4[edi],dl
-L046dj4:
-       mov     DWORD PTR [edi],ecx
-       jmp     $L047djend
-L048dj3:
-       ror     ecx,            16
-       mov     BYTE PTR 2[edi],cl
-       shl     ecx,            16
-L049dj2:
-       mov     BYTE PTR 1[esi],ch
-L050dj1:
-       mov     BYTE PTR [esi], cl
-$L047djend:
-       jmp     $L031finish
-$L031finish:
-       mov     ecx,            DWORD PTR 76[esp]
-       add     esp,            32
-       mov     DWORD PTR [ecx],eax
-       mov     DWORD PTR 4[ecx],ebx
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-$L032cbc_enc_jmp_table:
-       DD      0
-       DD      L040ej1
-       DD      L039ej2
-       DD      L038ej3
-       DD      L036ej4
-       DD      L035ej5
-       DD      L034ej6
-       DD      L033ej7
-L051cbc_dec_jmp_table:
-       DD      0
-       DD      L050dj1
-       DD      L049dj2
-       DD      L048dj3
-       DD      L046dj4
-       DD      L045dj5
-       DD      L044dj6
-       DD      L043dj7
-_des_ede3_cbc_encrypt ENDP
-_TEXT  ENDS
-END
index af5c102..e69de29 100644 (file)
@@ -1,929 +0,0 @@
-       ; Don't even think of reading this code
-       ; It was automatically generated by crypt586.pl
-       ; Which is a perl program used to generate the x86 assember for
-       ; any of elf, a.out, BSDI,Win32, or Solaris
-       ; eric <eay@cryptsoft.com>
-       ; 
-       TITLE   crypt586.asm
-        .386
-.model FLAT
-_TEXT  SEGMENT
-PUBLIC _fcrypt_body
-EXTRN   _des_SPtrans:DWORD
-_fcrypt_body PROC NEAR
-       push    ebp
-       push    ebx
-       push    esi
-       push    edi
-       ; 
-       ; Load the 2 words
-       xor     edi,            edi
-       xor     esi,            esi
-       mov     ebp,            DWORD PTR 24[esp]
-       push    25
-L000start:
-       ; 
-       ; Round 0
-       mov     eax,            DWORD PTR 32[esp]
-       mov     edx,            esi
-       shr     edx,            16
-       mov     ecx,            DWORD PTR 36[esp]
-       xor     edx,            esi
-       and     eax,            edx
-       and     edx,            ecx
-       mov     ebx,            eax
-       shl     ebx,            16
-       mov     ecx,            edx
-       shl     ecx,            16
-       xor     eax,            ebx
-       xor     edx,            ecx
-       mov     ebx,            DWORD PTR [ebp]
-       xor     eax,            ebx
-       mov     ecx,            DWORD PTR 4[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       xor     edx,            ecx
-       and     eax,            0fcfcfcfch
-       xor     ebx,            ebx
-       and     edx,            0cfcfcfcfh
-       xor     ecx,            ecx
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 1
-       mov     eax,            DWORD PTR 32[esp]
-       mov     edx,            edi
-       shr     edx,            16
-       mov     ecx,            DWORD PTR 36[esp]
-       xor     edx,            edi
-       and     eax,            edx
-       and     edx,            ecx
-       mov     ebx,            eax
-       shl     ebx,            16
-       mov     ecx,            edx
-       shl     ecx,            16
-       xor     eax,            ebx
-       xor     edx,            ecx
-       mov     ebx,            DWORD PTR 8[ebp]
-       xor     eax,            ebx
-       mov     ecx,            DWORD PTR 12[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       xor     edx,            ecx
-       and     eax,            0fcfcfcfch
-       xor     ebx,            ebx
-       and     edx,            0cfcfcfcfh
-       xor     ecx,            ecx
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 2
-       mov     eax,            DWORD PTR 32[esp]
-       mov     edx,            esi
-       shr     edx,            16
-       mov     ecx,            DWORD PTR 36[esp]
-       xor     edx,            esi
-       and     eax,            edx
-       and     edx,            ecx
-       mov     ebx,            eax
-       shl     ebx,            16
-       mov     ecx,            edx
-       shl     ecx,            16
-       xor     eax,            ebx
-       xor     edx,            ecx
-       mov     ebx,            DWORD PTR 16[ebp]
-       xor     eax,            ebx
-       mov     ecx,            DWORD PTR 20[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       xor     edx,            ecx
-       and     eax,            0fcfcfcfch
-       xor     ebx,            ebx
-       and     edx,            0cfcfcfcfh
-       xor     ecx,            ecx
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 3
-       mov     eax,            DWORD PTR 32[esp]
-       mov     edx,            edi
-       shr     edx,            16
-       mov     ecx,            DWORD PTR 36[esp]
-       xor     edx,            edi
-       and     eax,            edx
-       and     edx,            ecx
-       mov     ebx,            eax
-       shl     ebx,            16
-       mov     ecx,            edx
-       shl     ecx,            16
-       xor     eax,            ebx
-       xor     edx,            ecx
-       mov     ebx,            DWORD PTR 24[ebp]
-       xor     eax,            ebx
-       mov     ecx,            DWORD PTR 28[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       xor     edx,            ecx
-       and     eax,            0fcfcfcfch
-       xor     ebx,            ebx
-       and     edx,            0cfcfcfcfh
-       xor     ecx,            ecx
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 4
-       mov     eax,            DWORD PTR 32[esp]
-       mov     edx,            esi
-       shr     edx,            16
-       mov     ecx,            DWORD PTR 36[esp]
-       xor     edx,            esi
-       and     eax,            edx
-       and     edx,            ecx
-       mov     ebx,            eax
-       shl     ebx,            16
-       mov     ecx,            edx
-       shl     ecx,            16
-       xor     eax,            ebx
-       xor     edx,            ecx
-       mov     ebx,            DWORD PTR 32[ebp]
-       xor     eax,            ebx
-       mov     ecx,            DWORD PTR 36[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       xor     edx,            ecx
-       and     eax,            0fcfcfcfch
-       xor     ebx,            ebx
-       and     edx,            0cfcfcfcfh
-       xor     ecx,            ecx
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 5
-       mov     eax,            DWORD PTR 32[esp]
-       mov     edx,            edi
-       shr     edx,            16
-       mov     ecx,            DWORD PTR 36[esp]
-       xor     edx,            edi
-       and     eax,            edx
-       and     edx,            ecx
-       mov     ebx,            eax
-       shl     ebx,            16
-       mov     ecx,            edx
-       shl     ecx,            16
-       xor     eax,            ebx
-       xor     edx,            ecx
-       mov     ebx,            DWORD PTR 40[ebp]
-       xor     eax,            ebx
-       mov     ecx,            DWORD PTR 44[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       xor     edx,            ecx
-       and     eax,            0fcfcfcfch
-       xor     ebx,            ebx
-       and     edx,            0cfcfcfcfh
-       xor     ecx,            ecx
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 6
-       mov     eax,            DWORD PTR 32[esp]
-       mov     edx,            esi
-       shr     edx,            16
-       mov     ecx,            DWORD PTR 36[esp]
-       xor     edx,            esi
-       and     eax,            edx
-       and     edx,            ecx
-       mov     ebx,            eax
-       shl     ebx,            16
-       mov     ecx,            edx
-       shl     ecx,            16
-       xor     eax,            ebx
-       xor     edx,            ecx
-       mov     ebx,            DWORD PTR 48[ebp]
-       xor     eax,            ebx
-       mov     ecx,            DWORD PTR 52[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       xor     edx,            ecx
-       and     eax,            0fcfcfcfch
-       xor     ebx,            ebx
-       and     edx,            0cfcfcfcfh
-       xor     ecx,            ecx
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 7
-       mov     eax,            DWORD PTR 32[esp]
-       mov     edx,            edi
-       shr     edx,            16
-       mov     ecx,            DWORD PTR 36[esp]
-       xor     edx,            edi
-       and     eax,            edx
-       and     edx,            ecx
-       mov     ebx,            eax
-       shl     ebx,            16
-       mov     ecx,            edx
-       shl     ecx,            16
-       xor     eax,            ebx
-       xor     edx,            ecx
-       mov     ebx,            DWORD PTR 56[ebp]
-       xor     eax,            ebx
-       mov     ecx,            DWORD PTR 60[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       xor     edx,            ecx
-       and     eax,            0fcfcfcfch
-       xor     ebx,            ebx
-       and     edx,            0cfcfcfcfh
-       xor     ecx,            ecx
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 8
-       mov     eax,            DWORD PTR 32[esp]
-       mov     edx,            esi
-       shr     edx,            16
-       mov     ecx,            DWORD PTR 36[esp]
-       xor     edx,            esi
-       and     eax,            edx
-       and     edx,            ecx
-       mov     ebx,            eax
-       shl     ebx,            16
-       mov     ecx,            edx
-       shl     ecx,            16
-       xor     eax,            ebx
-       xor     edx,            ecx
-       mov     ebx,            DWORD PTR 64[ebp]
-       xor     eax,            ebx
-       mov     ecx,            DWORD PTR 68[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       xor     edx,            ecx
-       and     eax,            0fcfcfcfch
-       xor     ebx,            ebx
-       and     edx,            0cfcfcfcfh
-       xor     ecx,            ecx
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 9
-       mov     eax,            DWORD PTR 32[esp]
-       mov     edx,            edi
-       shr     edx,            16
-       mov     ecx,            DWORD PTR 36[esp]
-       xor     edx,            edi
-       and     eax,            edx
-       and     edx,            ecx
-       mov     ebx,            eax
-       shl     ebx,            16
-       mov     ecx,            edx
-       shl     ecx,            16
-       xor     eax,            ebx
-       xor     edx,            ecx
-       mov     ebx,            DWORD PTR 72[ebp]
-       xor     eax,            ebx
-       mov     ecx,            DWORD PTR 76[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       xor     edx,            ecx
-       and     eax,            0fcfcfcfch
-       xor     ebx,            ebx
-       and     edx,            0cfcfcfcfh
-       xor     ecx,            ecx
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 10
-       mov     eax,            DWORD PTR 32[esp]
-       mov     edx,            esi
-       shr     edx,            16
-       mov     ecx,            DWORD PTR 36[esp]
-       xor     edx,            esi
-       and     eax,            edx
-       and     edx,            ecx
-       mov     ebx,            eax
-       shl     ebx,            16
-       mov     ecx,            edx
-       shl     ecx,            16
-       xor     eax,            ebx
-       xor     edx,            ecx
-       mov     ebx,            DWORD PTR 80[ebp]
-       xor     eax,            ebx
-       mov     ecx,            DWORD PTR 84[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       xor     edx,            ecx
-       and     eax,            0fcfcfcfch
-       xor     ebx,            ebx
-       and     edx,            0cfcfcfcfh
-       xor     ecx,            ecx
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 11
-       mov     eax,            DWORD PTR 32[esp]
-       mov     edx,            edi
-       shr     edx,            16
-       mov     ecx,            DWORD PTR 36[esp]
-       xor     edx,            edi
-       and     eax,            edx
-       and     edx,            ecx
-       mov     ebx,            eax
-       shl     ebx,            16
-       mov     ecx,            edx
-       shl     ecx,            16
-       xor     eax,            ebx
-       xor     edx,            ecx
-       mov     ebx,            DWORD PTR 88[ebp]
-       xor     eax,            ebx
-       mov     ecx,            DWORD PTR 92[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       xor     edx,            ecx
-       and     eax,            0fcfcfcfch
-       xor     ebx,            ebx
-       and     edx,            0cfcfcfcfh
-       xor     ecx,            ecx
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 12
-       mov     eax,            DWORD PTR 32[esp]
-       mov     edx,            esi
-       shr     edx,            16
-       mov     ecx,            DWORD PTR 36[esp]
-       xor     edx,            esi
-       and     eax,            edx
-       and     edx,            ecx
-       mov     ebx,            eax
-       shl     ebx,            16
-       mov     ecx,            edx
-       shl     ecx,            16
-       xor     eax,            ebx
-       xor     edx,            ecx
-       mov     ebx,            DWORD PTR 96[ebp]
-       xor     eax,            ebx
-       mov     ecx,            DWORD PTR 100[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       xor     edx,            ecx
-       and     eax,            0fcfcfcfch
-       xor     ebx,            ebx
-       and     edx,            0cfcfcfcfh
-       xor     ecx,            ecx
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 13
-       mov     eax,            DWORD PTR 32[esp]
-       mov     edx,            edi
-       shr     edx,            16
-       mov     ecx,            DWORD PTR 36[esp]
-       xor     edx,            edi
-       and     eax,            edx
-       and     edx,            ecx
-       mov     ebx,            eax
-       shl     ebx,            16
-       mov     ecx,            edx
-       shl     ecx,            16
-       xor     eax,            ebx
-       xor     edx,            ecx
-       mov     ebx,            DWORD PTR 104[ebp]
-       xor     eax,            ebx
-       mov     ecx,            DWORD PTR 108[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       xor     edx,            ecx
-       and     eax,            0fcfcfcfch
-       xor     ebx,            ebx
-       and     edx,            0cfcfcfcfh
-       xor     ecx,            ecx
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       ; 
-       ; Round 14
-       mov     eax,            DWORD PTR 32[esp]
-       mov     edx,            esi
-       shr     edx,            16
-       mov     ecx,            DWORD PTR 36[esp]
-       xor     edx,            esi
-       and     eax,            edx
-       and     edx,            ecx
-       mov     ebx,            eax
-       shl     ebx,            16
-       mov     ecx,            edx
-       shl     ecx,            16
-       xor     eax,            ebx
-       xor     edx,            ecx
-       mov     ebx,            DWORD PTR 112[ebp]
-       xor     eax,            ebx
-       mov     ecx,            DWORD PTR 116[ebp]
-       xor     eax,            esi
-       xor     edx,            esi
-       xor     edx,            ecx
-       and     eax,            0fcfcfcfch
-       xor     ebx,            ebx
-       and     edx,            0cfcfcfcfh
-       xor     ecx,            ecx
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     edi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     edi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     edi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     edi,            ebx
-       ; 
-       ; Round 15
-       mov     eax,            DWORD PTR 32[esp]
-       mov     edx,            edi
-       shr     edx,            16
-       mov     ecx,            DWORD PTR 36[esp]
-       xor     edx,            edi
-       and     eax,            edx
-       and     edx,            ecx
-       mov     ebx,            eax
-       shl     ebx,            16
-       mov     ecx,            edx
-       shl     ecx,            16
-       xor     eax,            ebx
-       xor     edx,            ecx
-       mov     ebx,            DWORD PTR 120[ebp]
-       xor     eax,            ebx
-       mov     ecx,            DWORD PTR 124[ebp]
-       xor     eax,            edi
-       xor     edx,            edi
-       xor     edx,            ecx
-       and     eax,            0fcfcfcfch
-       xor     ebx,            ebx
-       and     edx,            0cfcfcfcfh
-       xor     ecx,            ecx
-       mov     bl,             al
-       mov     cl,             ah
-       ror     edx,            4
-       mov     ebp,            DWORD PTR _des_SPtrans[ebx]
-       mov     bl,             dl
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR _des_SPtrans[0200h+ecx]
-       xor     esi,            ebp
-       mov     cl,             dh
-       shr     eax,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0100h+ebx]
-       xor     esi,            ebp
-       mov     bl,             ah
-       shr     edx,            16
-       mov     ebp,            DWORD PTR _des_SPtrans[0300h+ecx]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       mov     cl,             dh
-       and     eax,            0ffh
-       and     edx,            0ffh
-       mov     ebx,            DWORD PTR _des_SPtrans[0600h+ebx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0700h+ecx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0400h+eax]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR _des_SPtrans[0500h+edx]
-       xor     esi,            ebx
-       mov     ebx,            DWORD PTR [esp]
-       mov     eax,            edi
-       dec     ebx
-       mov     edi,            esi
-       mov     esi,            eax
-       mov     DWORD PTR [esp],ebx
-       jnz     L000start
-       ; 
-       ; FP
-       mov     edx,            DWORD PTR 24[esp]
-       ror     edi,            1
-       mov     eax,            esi
-       xor     esi,            edi
-       and     esi,            0aaaaaaaah
-       xor     eax,            esi
-       xor     edi,            esi
-       ; 
-       rol     eax,            23
-       mov     esi,            eax
-       xor     eax,            edi
-       and     eax,            003fc03fch
-       xor     esi,            eax
-       xor     edi,            eax
-       ; 
-       rol     esi,            10
-       mov     eax,            esi
-       xor     esi,            edi
-       and     esi,            033333333h
-       xor     eax,            esi
-       xor     edi,            esi
-       ; 
-       rol     edi,            18
-       mov     esi,            edi
-       xor     edi,            eax
-       and     edi,            0fff0000fh
-       xor     esi,            edi
-       xor     eax,            edi
-       ; 
-       rol     esi,            12
-       mov     edi,            esi
-       xor     esi,            eax
-       and     esi,            0f0f0f0f0h
-       xor     edi,            esi
-       xor     eax,            esi
-       ; 
-       ror     eax,            4
-       mov     DWORD PTR [edx],eax
-       mov     DWORD PTR 4[edx],edi
-       pop     ecx
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-_fcrypt_body ENDP
-_TEXT  ENDS
-END
index 91d7153..0197489 100644 (file)
@@ -58,6 +58,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #ifndef MSDOS
 #ifndef VMS
 #include <openssl/opensslconf.h>
@@ -69,7 +70,7 @@
 #include <math.h>
 #endif /* __DECC */
 #endif /* VMS */
-#else
+#else /* MSDOS */
 #include <io.h>
 #endif
 
 #include <openssl/des.h>
 #include <openssl/rand.h>
 
-#if defined(__STDC__) || defined(VMS) || defined(M_XENIX) || defined(MSDOS)
-#include <string.h>
-#endif
-
 void usage(void);
 void doencryption(void);
 int uufwrite(unsigned char *data, int size, unsigned int num, FILE *fp);
index 98a9c41..ead6798 100644 (file)
@@ -78,10 +78,7 @@ extern "C" {
 typedef unsigned char des_cblock[8];
 typedef /* const */ unsigned char const_des_cblock[8];
 /* With "const", gcc 2.8.1 on Solaris thinks that des_cblock *
- * and const_des_cblock * are incompatible pointer types.
- * I haven't seen that warning on other systems ... I'll look
- * what the standard says. */
-
+ * and const_des_cblock * are incompatible pointer types. */
 
 typedef struct des_ks_struct
        {
@@ -141,8 +138,26 @@ void des_cfb_encrypt(const unsigned char *in,unsigned char *out,int numbits,
                     int enc);
 void des_ecb_encrypt(const_des_cblock *input,des_cblock *output,
                     des_key_schedule ks,int enc);
+
+/*     This is the DES encryption function that gets called by just about
+       every other DES routine in the library.  You should not use this
+       function except to implement 'modes' of DES.  I say this because the
+       functions that call this routine do the conversion from 'char *' to
+       long, and this needs to be done to make sure 'non-aligned' memory
+       access do not occur.  The characters are loaded 'little endian'.
+       Data is a pointer to 2 unsigned long's and ks is the
+       des_key_schedule to use.  enc, is non zero specifies encryption,
+       zero if decryption. */
 void des_encrypt(DES_LONG *data,des_key_schedule ks, int enc);
+
+/*     This functions is the same as des_encrypt() except that the DES
+       initial permutation (IP) and final permutation (FP) have been left
+       out.  As for des_encrypt(), you should not use this function.
+       It is used by the routines in the library that implement triple DES.
+       IP() des_encrypt2() des_encrypt2() des_encrypt2() FP() is the same
+       as des_encrypt() des_encrypt() des_encrypt() except faster :-). */
 void des_encrypt2(DES_LONG *data,des_key_schedule ks, int enc);
+
 void des_encrypt3(DES_LONG *data, des_key_schedule ks1,
        des_key_schedule ks2, des_key_schedule ks3);
 void des_decrypt3(DES_LONG *data, des_key_schedule ks1,
@@ -192,6 +207,7 @@ int des_read_2passwords(des_cblock *key1,des_cblock *key2,
                        const char *prompt,int verify);
 int des_read_pw_string(char *buf,int length,const char *prompt,int verify);
 void des_set_odd_parity(des_cblock *key);
+int des_check_key_parity(const_des_cblock *key);
 int des_is_weak_key(const_des_cblock *key);
 /* des_set_key (= set_key = des_key_sched = key_sched) calls
  * des_set_key_checked if global variable des_check_key is set,
@@ -209,9 +225,6 @@ void des_ofb64_encrypt(const unsigned char *in,unsigned char *out,long length,
                       des_key_schedule schedule,des_cblock *ivec,int *num);
 int des_read_pw(char *buf,char *buff,int size,const char *prompt,int verify);
 
-/* Extra functions from Mark Murray <mark@grondar.za> */
-void des_cblock_print_file(const_des_cblock *cb, FILE *fp);
-
 /* The following definitions provide compatibility with the MIT Kerberos
  * library. The des_key_schedule structure is not binary compatible. */
 
@@ -241,11 +254,11 @@ void des_cblock_print_file(const_des_cblock *cb, FILE *fp);
 #  define xcbc_encrypt des_xcbc_encrypt
 #  define cbc_cksum des_cbc_cksum
 #  define quad_cksum des_quad_cksum
+#  define check_parity des_check_key_parity
 #endif
 
 typedef des_key_schedule bit_64;
 #define des_fixup_key_parity des_set_odd_parity
-#define des_check_key_parity check_parity
 
 #ifdef  __cplusplus
 }
index 7e06a18..e69de29 100644 (file)
@@ -1,186 +0,0 @@
-.TH DES 1 
-.SH NAME
-des - encrypt or decrypt data using Data Encryption Standard
-.SH SYNOPSIS
-.B des
-(
-.B \-e
-|
-.B \-E
-) | (
-.B \-d
-|
-.B \-D
-) | (
-.B \-\fR[\fPcC\fR][\fPckname\fR]\fP
-) |
-[
-.B \-b3hfs
-] [
-.B \-k
-.I key
-]
-] [
-.B \-u\fR[\fIuuname\fR]
-[
-.I input-file
-[
-.I output-file
-] ]
-.SH DESCRIPTION
-.B des
-encrypts and decrypts data using the
-Data Encryption Standard algorithm.
-One of
-.B \-e, \-E
-(for encrypt) or
-.B \-d, \-D
-(for decrypt) must be specified.
-It is also possible to use
-.B \-c
-or
-.B \-C
-in conjunction or instead of the a encrypt/decrypt option to generate
-a 16 character hexadecimal checksum, generated via the
-.I des_cbc_cksum.
-.LP
-Two standard encryption modes are supported by the
-.B des
-program, Cipher Block Chaining (the default) and Electronic Code Book
-(specified with
-.B \-b
-).
-.LP
-The key used for the DES
-algorithm is obtained by prompting the user unless the
-.B `\-k
-.I key'
-option is given.
-If the key is an argument to the
-.B des
-command, it is potentially visible to users executing
-.BR ps (1)
-or a derivative.  To minimise this possibility,
-.B des
-takes care to destroy the key argument immediately upon entry.
-If your shell keeps a history file be careful to make sure it is not
-world readable.
-.LP
-Since this program attempts to maintain compatability with sunOS's
-des(1) command, there are 2 different methods used to convert the user
-supplied key to a des key.
-Whenever and one or more of
-.B \-E, \-D, \-C
-or
-.B \-3
-options are used, the key conversion procedure will not be compatible
-with the sunOS des(1) version but will use all the user supplied
-character to generate the des key.
-.B des
-command reads from standard input unless
-.I input-file
-is specified and writes to standard output unless
-.I output-file
-is given.
-.SH OPTIONS
-.TP
-.B \-b
-Select ECB
-(eight bytes at a time) encryption mode.
-.TP
-.B \-3
-Encrypt using triple encryption.
-By default triple cbc encryption is used but if the
-.B \-b
-option is used then triple ecb encryption is performed.
-If the key is less than 8 characters long, the flag has no effect.
-.TP
-.B \-e
-Encrypt data using an 8 byte key in a manner compatible with sunOS
-des(1).
-.TP
-.B \-E
-Encrypt data using a key of nearly unlimited length (1024 bytes).
-This will product a more secure encryption.
-.TP
-.B \-d
-Decrypt data that was encrypted with the \-e option.
-.TP
-.B \-D
-Decrypt data that was encrypted with the \-E option.
-.TP
-.B \-c
-Generate a 16 character hexadecimal cbc checksum and output this to
-stderr.
-If a filename was specified after the
-.B \-c
-option, the checksum is output to that file.
-The checksum is generated using a key generated in a sunOS compatible
-manner.
-.TP
-.B \-C
-A cbc checksum is generated in the same manner as described for the
-.B \-c
-option but the DES key is generated in the same manner as used for the
-.B \-E
-and
-.B \-D
-options
-.TP
-.B \-f
-Does nothing - allowed for compatibility with sunOS des(1) command.
-.TP
-.B \-s
-Does nothing - allowed for compatibility with sunOS des(1) command.
-.TP
-.B "\-k \fIkey\fP"
-Use the encryption 
-.I key
-specified.
-.TP
-.B "\-h"
-The
-.I key
-is assumed to be a 16 character hexadecimal number.
-If the
-.B "\-3"
-option is used the key is assumed to be a 32 character hexadecimal
-number.
-.TP
-.B \-u
-This flag is used to read and write uuencoded files.  If decrypting,
-the input file is assumed to contain uuencoded, DES encrypted data.
-If encrypting, the characters following the -u are used as the name of
-the uuencoded file to embed in the begin line of the uuencoded
-output.  If there is no name specified after the -u, the name text.des
-will be embedded in the header.
-.SH SEE ALSO
-.B ps (1)
-.B des_crypt(3)
-.SH BUGS
-.LP
-The problem with using the
-.B -e
-option is the short key length.
-It would be better to use a real 56-bit key rather than an
-ASCII-based 56-bit pattern.  Knowing that the key was derived from ASCII
-radically reduces the time necessary for a brute-force cryptographic attack.
-My attempt to remove this problem is to add an alternative text-key to
-DES-key function.  This alternative function (accessed via
-.B -E, -D, -S
-and
-.B -3
-)
-uses DES to help generate the key.
-.LP
-Be carefully when using the -u option.  Doing des -ud <filename> will
-not decrypt filename (the -u option will gobble the d option).
-.LP
-The VMS operating system operates in a world where files are always a
-multiple of 512 bytes.  This causes problems when encrypted data is
-send from unix to VMS since a 88 byte file will suddenly be padded
-with 424 null bytes.  To get around this problem, use the -u option
-to uuencode the data before it is send to the VMS system.
-.SH AUTHOR
-.LP
-Eric Young (eay@cryptsoft.com)
index 8a3f7e3..e69de29 100644 (file)
@@ -1,552 +0,0 @@
-#!/usr/local/bin/perl
-# des.pl - eric young 22/11/1991 eay@cryptsoft.com
-#
-# Copyright (C) 1993 Eric Young
-#
-# 11 April 1996 - patched to circumvent Perl 5 (through 5.002) problem
-#                 with sign-extension on right shift operations.
-#                 Ed Kubaitis - ejk@uiuc.edu
-#
-# eay - 92/08/31 - I think I have fixed all problems for 64bit
-# versions of perl but I could be wrong since I have not tested it yet :-).
-#
-# This is an implementation of DES in perl.
-# The two routines (des_set_key and des_ecb_encrypt)
-# take 8 byte objects as arguments.
-#
-# des_set_key takes an 8 byte string as a key and returns a key schedule
-# for use in calls to des_ecb_encrypt.
-# des_ecb_encrypt takes three arguments, the first is a key schedule
-# (make sure to pass it by reference with the *), the second is 1
-# to encrypt, 0 to decrypt.  The third argument is an 8 byte object
-# to encrypt.  The function returns an 8 byte object that has been
-# DES encrypted.
-#
-# example:
-# require 'des.pl'
-#
-# $key =pack("C8",0x12,0x23,0x45,0x67,0x89,0xab,0xcd,0xef);
-# @ks=  &des_set_key($key);
-#
-# $outbytes= &des_ecb_encrypt(*ks,1,$data);
-# @enc =unpack("C8",$outbytes);
-#
-                 
-package des;
-
-eval("use integer;") if (int($]) > 4);
-
-# The following 8 arrays are used in des_set_key
-@skb0=(
-# for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 
-0x00000000,0x00000010,0x20000000,0x20000010,
-0x00010000,0x00010010,0x20010000,0x20010010,
-0x00000800,0x00000810,0x20000800,0x20000810,
-0x00010800,0x00010810,0x20010800,0x20010810,
-0x00000020,0x00000030,0x20000020,0x20000030,
-0x00010020,0x00010030,0x20010020,0x20010030,
-0x00000820,0x00000830,0x20000820,0x20000830,
-0x00010820,0x00010830,0x20010820,0x20010830,
-0x00080000,0x00080010,0x20080000,0x20080010,
-0x00090000,0x00090010,0x20090000,0x20090010,
-0x00080800,0x00080810,0x20080800,0x20080810,
-0x00090800,0x00090810,0x20090800,0x20090810,
-0x00080020,0x00080030,0x20080020,0x20080030,
-0x00090020,0x00090030,0x20090020,0x20090030,
-0x00080820,0x00080830,0x20080820,0x20080830,
-0x00090820,0x00090830,0x20090820,0x20090830,
-);
-@skb1=(
-# for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 
-0x00000000,0x02000000,0x00002000,0x02002000,
-0x00200000,0x02200000,0x00202000,0x02202000,
-0x00000004,0x02000004,0x00002004,0x02002004,
-0x00200004,0x02200004,0x00202004,0x02202004,
-0x00000400,0x02000400,0x00002400,0x02002400,
-0x00200400,0x02200400,0x00202400,0x02202400,
-0x00000404,0x02000404,0x00002404,0x02002404,
-0x00200404,0x02200404,0x00202404,0x02202404,
-0x10000000,0x12000000,0x10002000,0x12002000,
-0x10200000,0x12200000,0x10202000,0x12202000,
-0x10000004,0x12000004,0x10002004,0x12002004,
-0x10200004,0x12200004,0x10202004,0x12202004,
-0x10000400,0x12000400,0x10002400,0x12002400,
-0x10200400,0x12200400,0x10202400,0x12202400,
-0x10000404,0x12000404,0x10002404,0x12002404,
-0x10200404,0x12200404,0x10202404,0x12202404,
-);
-@skb2=(
-# for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 
-0x00000000,0x00000001,0x00040000,0x00040001,
-0x01000000,0x01000001,0x01040000,0x01040001,
-0x00000002,0x00000003,0x00040002,0x00040003,
-0x01000002,0x01000003,0x01040002,0x01040003,
-0x00000200,0x00000201,0x00040200,0x00040201,
-0x01000200,0x01000201,0x01040200,0x01040201,
-0x00000202,0x00000203,0x00040202,0x00040203,
-0x01000202,0x01000203,0x01040202,0x01040203,
-0x08000000,0x08000001,0x08040000,0x08040001,
-0x09000000,0x09000001,0x09040000,0x09040001,
-0x08000002,0x08000003,0x08040002,0x08040003,
-0x09000002,0x09000003,0x09040002,0x09040003,
-0x08000200,0x08000201,0x08040200,0x08040201,
-0x09000200,0x09000201,0x09040200,0x09040201,
-0x08000202,0x08000203,0x08040202,0x08040203,
-0x09000202,0x09000203,0x09040202,0x09040203,
-);
-@skb3=(
-# for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 
-0x00000000,0x00100000,0x00000100,0x00100100,
-0x00000008,0x00100008,0x00000108,0x00100108,
-0x00001000,0x00101000,0x00001100,0x00101100,
-0x00001008,0x00101008,0x00001108,0x00101108,
-0x04000000,0x04100000,0x04000100,0x04100100,
-0x04000008,0x04100008,0x04000108,0x04100108,
-0x04001000,0x04101000,0x04001100,0x04101100,
-0x04001008,0x04101008,0x04001108,0x04101108,
-0x00020000,0x00120000,0x00020100,0x00120100,
-0x00020008,0x00120008,0x00020108,0x00120108,
-0x00021000,0x00121000,0x00021100,0x00121100,
-0x00021008,0x00121008,0x00021108,0x00121108,
-0x04020000,0x04120000,0x04020100,0x04120100,
-0x04020008,0x04120008,0x04020108,0x04120108,
-0x04021000,0x04121000,0x04021100,0x04121100,
-0x04021008,0x04121008,0x04021108,0x04121108,
-);
-@skb4=(
-# for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 
-0x00000000,0x10000000,0x00010000,0x10010000,
-0x00000004,0x10000004,0x00010004,0x10010004,
-0x20000000,0x30000000,0x20010000,0x30010000,
-0x20000004,0x30000004,0x20010004,0x30010004,
-0x00100000,0x10100000,0x00110000,0x10110000,
-0x00100004,0x10100004,0x00110004,0x10110004,
-0x20100000,0x30100000,0x20110000,0x30110000,
-0x20100004,0x30100004,0x20110004,0x30110004,
-0x00001000,0x10001000,0x00011000,0x10011000,
-0x00001004,0x10001004,0x00011004,0x10011004,
-0x20001000,0x30001000,0x20011000,0x30011000,
-0x20001004,0x30001004,0x20011004,0x30011004,
-0x00101000,0x10101000,0x00111000,0x10111000,
-0x00101004,0x10101004,0x00111004,0x10111004,
-0x20101000,0x30101000,0x20111000,0x30111000,
-0x20101004,0x30101004,0x20111004,0x30111004,
-);
-@skb5=(
-# for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 
-0x00000000,0x08000000,0x00000008,0x08000008,
-0x00000400,0x08000400,0x00000408,0x08000408,
-0x00020000,0x08020000,0x00020008,0x08020008,
-0x00020400,0x08020400,0x00020408,0x08020408,
-0x00000001,0x08000001,0x00000009,0x08000009,
-0x00000401,0x08000401,0x00000409,0x08000409,
-0x00020001,0x08020001,0x00020009,0x08020009,
-0x00020401,0x08020401,0x00020409,0x08020409,
-0x02000000,0x0A000000,0x02000008,0x0A000008,
-0x02000400,0x0A000400,0x02000408,0x0A000408,
-0x02020000,0x0A020000,0x02020008,0x0A020008,
-0x02020400,0x0A020400,0x02020408,0x0A020408,
-0x02000001,0x0A000001,0x02000009,0x0A000009,
-0x02000401,0x0A000401,0x02000409,0x0A000409,
-0x02020001,0x0A020001,0x02020009,0x0A020009,
-0x02020401,0x0A020401,0x02020409,0x0A020409,
-);
-@skb6=(
-# for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 
-0x00000000,0x00000100,0x00080000,0x00080100,
-0x01000000,0x01000100,0x01080000,0x01080100,
-0x00000010,0x00000110,0x00080010,0x00080110,
-0x01000010,0x01000110,0x01080010,0x01080110,
-0x00200000,0x00200100,0x00280000,0x00280100,
-0x01200000,0x01200100,0x01280000,0x01280100,
-0x00200010,0x00200110,0x00280010,0x00280110,
-0x01200010,0x01200110,0x01280010,0x01280110,
-0x00000200,0x00000300,0x00080200,0x00080300,
-0x01000200,0x01000300,0x01080200,0x01080300,
-0x00000210,0x00000310,0x00080210,0x00080310,
-0x01000210,0x01000310,0x01080210,0x01080310,
-0x00200200,0x00200300,0x00280200,0x00280300,
-0x01200200,0x01200300,0x01280200,0x01280300,
-0x00200210,0x00200310,0x00280210,0x00280310,
-0x01200210,0x01200310,0x01280210,0x01280310,
-);
-@skb7=(
-# for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 
-0x00000000,0x04000000,0x00040000,0x04040000,
-0x00000002,0x04000002,0x00040002,0x04040002,
-0x00002000,0x04002000,0x00042000,0x04042000,
-0x00002002,0x04002002,0x00042002,0x04042002,
-0x00000020,0x04000020,0x00040020,0x04040020,
-0x00000022,0x04000022,0x00040022,0x04040022,
-0x00002020,0x04002020,0x00042020,0x04042020,
-0x00002022,0x04002022,0x00042022,0x04042022,
-0x00000800,0x04000800,0x00040800,0x04040800,
-0x00000802,0x04000802,0x00040802,0x04040802,
-0x00002800,0x04002800,0x00042800,0x04042800,
-0x00002802,0x04002802,0x00042802,0x04042802,
-0x00000820,0x04000820,0x00040820,0x04040820,
-0x00000822,0x04000822,0x00040822,0x04040822,
-0x00002820,0x04002820,0x00042820,0x04042820,
-0x00002822,0x04002822,0x00042822,0x04042822,
-);
-
-@shifts2=(0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0);
-
-# used in ecb_encrypt
-@SP0=(
-0x00410100, 0x00010000, 0x40400000, 0x40410100,
-0x00400000, 0x40010100, 0x40010000, 0x40400000,
-0x40010100, 0x00410100, 0x00410000, 0x40000100,
-0x40400100, 0x00400000, 0x00000000, 0x40010000,
-0x00010000, 0x40000000, 0x00400100, 0x00010100,
-0x40410100, 0x00410000, 0x40000100, 0x00400100,
-0x40000000, 0x00000100, 0x00010100, 0x40410000,
-0x00000100, 0x40400100, 0x40410000, 0x00000000,
-0x00000000, 0x40410100, 0x00400100, 0x40010000,
-0x00410100, 0x00010000, 0x40000100, 0x00400100,
-0x40410000, 0x00000100, 0x00010100, 0x40400000,
-0x40010100, 0x40000000, 0x40400000, 0x00410000,
-0x40410100, 0x00010100, 0x00410000, 0x40400100,
-0x00400000, 0x40000100, 0x40010000, 0x00000000,
-0x00010000, 0x00400000, 0x40400100, 0x00410100,
-0x40000000, 0x40410000, 0x00000100, 0x40010100,
-);
-@SP1=(
-0x08021002, 0x00000000, 0x00021000, 0x08020000,
-0x08000002, 0x00001002, 0x08001000, 0x00021000,
-0x00001000, 0x08020002, 0x00000002, 0x08001000,
-0x00020002, 0x08021000, 0x08020000, 0x00000002,
-0x00020000, 0x08001002, 0x08020002, 0x00001000,
-0x00021002, 0x08000000, 0x00000000, 0x00020002,
-0x08001002, 0x00021002, 0x08021000, 0x08000002,
-0x08000000, 0x00020000, 0x00001002, 0x08021002,
-0x00020002, 0x08021000, 0x08001000, 0x00021002,
-0x08021002, 0x00020002, 0x08000002, 0x00000000,
-0x08000000, 0x00001002, 0x00020000, 0x08020002,
-0x00001000, 0x08000000, 0x00021002, 0x08001002,
-0x08021000, 0x00001000, 0x00000000, 0x08000002,
-0x00000002, 0x08021002, 0x00021000, 0x08020000,
-0x08020002, 0x00020000, 0x00001002, 0x08001000,
-0x08001002, 0x00000002, 0x08020000, 0x00021000,
-);
-@SP2=(
-0x20800000, 0x00808020, 0x00000020, 0x20800020,
-0x20008000, 0x00800000, 0x20800020, 0x00008020,
-0x00800020, 0x00008000, 0x00808000, 0x20000000,
-0x20808020, 0x20000020, 0x20000000, 0x20808000,
-0x00000000, 0x20008000, 0x00808020, 0x00000020,
-0x20000020, 0x20808020, 0x00008000, 0x20800000,
-0x20808000, 0x00800020, 0x20008020, 0x00808000,
-0x00008020, 0x00000000, 0x00800000, 0x20008020,
-0x00808020, 0x00000020, 0x20000000, 0x00008000,
-0x20000020, 0x20008000, 0x00808000, 0x20800020,
-0x00000000, 0x00808020, 0x00008020, 0x20808000,
-0x20008000, 0x00800000, 0x20808020, 0x20000000,
-0x20008020, 0x20800000, 0x00800000, 0x20808020,
-0x00008000, 0x00800020, 0x20800020, 0x00008020,
-0x00800020, 0x00000000, 0x20808000, 0x20000020,
-0x20800000, 0x20008020, 0x00000020, 0x00808000,
-);
-@SP3=(
-0x00080201, 0x02000200, 0x00000001, 0x02080201,
-0x00000000, 0x02080000, 0x02000201, 0x00080001,
-0x02080200, 0x02000001, 0x02000000, 0x00000201,
-0x02000001, 0x00080201, 0x00080000, 0x02000000,
-0x02080001, 0x00080200, 0x00000200, 0x00000001,
-0x00080200, 0x02000201, 0x02080000, 0x00000200,
-0x00000201, 0x00000000, 0x00080001, 0x02080200,
-0x02000200, 0x02080001, 0x02080201, 0x00080000,
-0x02080001, 0x00000201, 0x00080000, 0x02000001,
-0x00080200, 0x02000200, 0x00000001, 0x02080000,
-0x02000201, 0x00000000, 0x00000200, 0x00080001,
-0x00000000, 0x02080001, 0x02080200, 0x00000200,
-0x02000000, 0x02080201, 0x00080201, 0x00080000,
-0x02080201, 0x00000001, 0x02000200, 0x00080201,
-0x00080001, 0x00080200, 0x02080000, 0x02000201,
-0x00000201, 0x02000000, 0x02000001, 0x02080200,
-);
-@SP4=(
-0x01000000, 0x00002000, 0x00000080, 0x01002084,
-0x01002004, 0x01000080, 0x00002084, 0x01002000,
-0x00002000, 0x00000004, 0x01000004, 0x00002080,
-0x01000084, 0x01002004, 0x01002080, 0x00000000,
-0x00002080, 0x01000000, 0x00002004, 0x00000084,
-0x01000080, 0x00002084, 0x00000000, 0x01000004,
-0x00000004, 0x01000084, 0x01002084, 0x00002004,
-0x01002000, 0x00000080, 0x00000084, 0x01002080,
-0x01002080, 0x01000084, 0x00002004, 0x01002000,
-0x00002000, 0x00000004, 0x01000004, 0x01000080,
-0x01000000, 0x00002080, 0x01002084, 0x00000000,
-0x00002084, 0x01000000, 0x00000080, 0x00002004,
-0x01000084, 0x00000080, 0x00000000, 0x01002084,
-0x01002004, 0x01002080, 0x00000084, 0x00002000,
-0x00002080, 0x01002004, 0x01000080, 0x00000084,
-0x00000004, 0x00002084, 0x01002000, 0x01000004,
-);
-@SP5=(
-0x10000008, 0x00040008, 0x00000000, 0x10040400,
-0x00040008, 0x00000400, 0x10000408, 0x00040000,
-0x00000408, 0x10040408, 0x00040400, 0x10000000,
-0x10000400, 0x10000008, 0x10040000, 0x00040408,
-0x00040000, 0x10000408, 0x10040008, 0x00000000,
-0x00000400, 0x00000008, 0x10040400, 0x10040008,
-0x10040408, 0x10040000, 0x10000000, 0x00000408,
-0x00000008, 0x00040400, 0x00040408, 0x10000400,
-0x00000408, 0x10000000, 0x10000400, 0x00040408,
-0x10040400, 0x00040008, 0x00000000, 0x10000400,
-0x10000000, 0x00000400, 0x10040008, 0x00040000,
-0x00040008, 0x10040408, 0x00040400, 0x00000008,
-0x10040408, 0x00040400, 0x00040000, 0x10000408,
-0x10000008, 0x10040000, 0x00040408, 0x00000000,
-0x00000400, 0x10000008, 0x10000408, 0x10040400,
-0x10040000, 0x00000408, 0x00000008, 0x10040008,
-);
-@SP6=(
-0x00000800, 0x00000040, 0x00200040, 0x80200000,
-0x80200840, 0x80000800, 0x00000840, 0x00000000,
-0x00200000, 0x80200040, 0x80000040, 0x00200800,
-0x80000000, 0x00200840, 0x00200800, 0x80000040,
-0x80200040, 0x00000800, 0x80000800, 0x80200840,
-0x00000000, 0x00200040, 0x80200000, 0x00000840,
-0x80200800, 0x80000840, 0x00200840, 0x80000000,
-0x80000840, 0x80200800, 0x00000040, 0x00200000,
-0x80000840, 0x00200800, 0x80200800, 0x80000040,
-0x00000800, 0x00000040, 0x00200000, 0x80200800,
-0x80200040, 0x80000840, 0x00000840, 0x00000000,
-0x00000040, 0x80200000, 0x80000000, 0x00200040,
-0x00000000, 0x80200040, 0x00200040, 0x00000840,
-0x80000040, 0x00000800, 0x80200840, 0x00200000,
-0x00200840, 0x80000000, 0x80000800, 0x80200840,
-0x80200000, 0x00200840, 0x00200800, 0x80000800,
-);
-@SP7=(
-0x04100010, 0x04104000, 0x00004010, 0x00000000,
-0x04004000, 0x00100010, 0x04100000, 0x04104010,
-0x00000010, 0x04000000, 0x00104000, 0x00004010,
-0x00104010, 0x04004010, 0x04000010, 0x04100000,
-0x00004000, 0x00104010, 0x00100010, 0x04004000,
-0x04104010, 0x04000010, 0x00000000, 0x00104000,
-0x04000000, 0x00100000, 0x04004010, 0x04100010,
-0x00100000, 0x00004000, 0x04104000, 0x00000010,
-0x00100000, 0x00004000, 0x04000010, 0x04104010,
-0x00004010, 0x04000000, 0x00000000, 0x00104000,
-0x04100010, 0x04004010, 0x04004000, 0x00100010,
-0x04104000, 0x00000010, 0x00100010, 0x04004000,
-0x04104010, 0x00100000, 0x04100000, 0x04000010,
-0x00104000, 0x00004010, 0x04004010, 0x04100000,
-0x00000010, 0x04104000, 0x00104010, 0x00000000,
-0x04000000, 0x04100010, 0x00004000, 0x00104010,
-);
-
-sub main'des_set_key
-       {
-       local($param)=@_;
-       local(@key);
-       local($c,$d,$i,$s,$t);
-       local(@ks)=();
-
-       # Get the bytes in the order we want.
-       @key=unpack("C8",$param);
-
-       $c=     ($key[0]    )|
-               ($key[1]<< 8)|
-               ($key[2]<<16)|
-               ($key[3]<<24);
-       $d=     ($key[4]    )|
-               ($key[5]<< 8)|
-               ($key[6]<<16)|
-               ($key[7]<<24);
-
-       &doPC1(*c,*d);
-
-       for $i (@shifts2)
-               {
-               if ($i)
-                       {
-                       $c=($c>>2)|($c<<26);
-                       $d=($d>>2)|($d<<26);
-                       }
-               else
-                       {
-                       $c=($c>>1)|($c<<27);
-                       $d=($d>>1)|($d<<27);
-                       }
-               $c&=0x0fffffff;
-               $d&=0x0fffffff;
-               $s=     $skb0[ ($c    )&0x3f                 ]|
-                       $skb1[(($c>> 6)&0x03)|(($c>> 7)&0x3c)]|
-                       $skb2[(($c>>13)&0x0f)|(($c>>14)&0x30)]|
-                       $skb3[(($c>>20)&0x01)|(($c>>21)&0x06) |
-                                            (($c>>22)&0x38)];
-               $t=     $skb4[ ($d    )&0x3f                ]|
-                       $skb5[(($d>> 7)&0x03)|(($d>> 8)&0x3c)]|
-                       $skb6[ ($d>>15)&0x3f                 ]|
-                       $skb7[(($d>>21)&0x0f)|(($d>>22)&0x30)];
-               push(@ks,(($t<<16)|($s&0x0000ffff))&0xffffffff);
-               $s=      (($s>>16)&0x0000ffff)|($t&0xffff0000) ;
-               push(@ks,(($s<<4)|(($s>>28)&0xf))&0xffffffff);
-               }
-       @ks;
-       }
-
-sub doPC1
-       {
-       local(*a,*b)=@_;
-       local($t);
-
-       $t=(($b>>4)^$a)&0x0f0f0f0f;
-       $b^=($t<<4); $a^=$t;
-       # do $a first 
-       $t=(($a<<18)^$a)&0xcccc0000;
-       $a=$a^$t^(($t>>18)&0x00003fff);
-       $t=(($a<<17)^$a)&0xaaaa0000;
-       $a=$a^$t^(($t>>17)&0x00007fff);
-       $t=(($a<< 8)^$a)&0x00ff0000;
-       $a=$a^$t^(($t>> 8)&0x00ffffff);
-       $t=(($a<<17)^$a)&0xaaaa0000;
-       $a=$a^$t^(($t>>17)&0x00007fff);
-
-       # now do $b
-       $t=(($b<<24)^$b)&0xff000000;
-       $b=$b^$t^(($t>>24)&0x000000ff);
-       $t=(($b<< 8)^$b)&0x00ff0000;
-       $b=$b^$t^(($t>> 8)&0x00ffffff);
-       $t=(($b<<14)^$b)&0x33330000;
-       $b=$b^$t^(($t>>14)&0x0003ffff);
-       $b=(($b&0x00aa00aa)<<7)|(($b&0x55005500)>>7)|($b&0xaa55aa55);
-       $b=(($b>>8)&0x00ffffff)|((($a&0xf0000000)>>4)&0x0fffffff);
-       $a&=0x0fffffff;
-       }
-
-sub doIP
-       {
-       local(*a,*b)=@_;
-       local($t);
-
-       $t=(($b>> 4)^$a)&0x0f0f0f0f;
-       $b^=($t<< 4); $a^=$t;
-       $t=(($a>>16)^$b)&0x0000ffff;
-       $a^=($t<<16); $b^=$t;
-       $t=(($b>> 2)^$a)&0x33333333;
-       $b^=($t<< 2); $a^=$t;
-       $t=(($a>> 8)^$b)&0x00ff00ff;
-       $a^=($t<< 8); $b^=$t;
-       $t=(($b>> 1)^$a)&0x55555555;
-       $b^=($t<< 1); $a^=$t;
-       $t=$a;
-       $a=$b&0xffffffff;
-       $b=$t&0xffffffff;
-       }
-
-sub doFP
-       {
-       local(*a,*b)=@_;
-       local($t);
-
-       $t=(($b>> 1)^$a)&0x55555555;
-       $b^=($t<< 1); $a^=$t;
-       $t=(($a>> 8)^$b)&0x00ff00ff;
-       $a^=($t<< 8); $b^=$t;
-       $t=(($b>> 2)^$a)&0x33333333;
-       $b^=($t<< 2); $a^=$t;
-       $t=(($a>>16)^$b)&0x0000ffff;
-       $a^=($t<<16); $b^=$t;
-       $t=(($b>> 4)^$a)&0x0f0f0f0f;
-       $b^=($t<< 4); $a^=$t;
-       $a&=0xffffffff;
-       $b&=0xffffffff;
-       }
-
-sub main'des_ecb_encrypt
-       {
-       local(*ks,$encrypt,$in)=@_;
-       local($l,$r,$i,$t,$u,@input);
-       
-       @input=unpack("C8",$in);
-       # Get the bytes in the order we want.
-       $l=     ($input[0]    )|
-               ($input[1]<< 8)|
-               ($input[2]<<16)|
-               ($input[3]<<24);
-       $r=     ($input[4]    )|
-               ($input[5]<< 8)|
-               ($input[6]<<16)|
-               ($input[7]<<24);
-
-       $l&=0xffffffff;
-       $r&=0xffffffff;
-       &doIP(*l,*r);
-       if ($encrypt)
-               {
-               for ($i=0; $i<32; $i+=4)
-                       {
-                       $t=((($r&0x7fffffff)<<1)|(($r>>31)&0x00000001));
-                       $u=$t^$ks[$i  ];
-                       $t=$t^$ks[$i+1];
-                       $t2=(($t&0x0000000f)<<28);
-
-                       $t=((($t>>4)&0x0fffffff)|(($t&0x0000000f)<<28));
-                       $l^=    $SP1[ $t     &0x3f]|
-                               $SP3[($t>> 8)&0x3f]|
-                               $SP5[($t>>16)&0x3f]|
-                               $SP7[($t>>24)&0x3f]|
-                               $SP0[ $u     &0x3f]|
-                               $SP2[($u>> 8)&0x3f]|
-                               $SP4[($u>>16)&0x3f]|
-                               $SP6[($u>>24)&0x3f];
-
-                       $t=(($l<<1)|(($l>>31)&0x1))&0xffffffff;
-                       $u=$t^$ks[$i+2];
-                       $t=$t^$ks[$i+3];
-                       $t=((($t>>4)&0x0fffffff)|($t<<28))&0xffffffff;
-                       $r^=    $SP1[ $t     &0x3f]|
-                               $SP3[($t>> 8)&0x3f]|
-                               $SP5[($t>>16)&0x3f]|
-                               $SP7[($t>>24)&0x3f]|
-                               $SP0[ $u     &0x3f]|
-                               $SP2[($u>> 8)&0x3f]|
-                               $SP4[($u>>16)&0x3f]|
-                               $SP6[($u>>24)&0x3f];
-                       }
-               }
-       else    
-               {
-               for ($i=30; $i>0; $i-=4)
-                       {
-                       $t=(($r<<1)|(($r>>31)&0x1))&0xffffffff;
-                       $u=$t^$ks[$i  ];
-                       $t=$t^$ks[$i+1];
-                       $t=((($t>>4)&0x0fffffff)|($t<<28))&0xffffffff;
-                       $l^=    $SP1[ $t     &0x3f]|
-                               $SP3[($t>> 8)&0x3f]|
-                               $SP5[($t>>16)&0x3f]|
-                               $SP7[($t>>24)&0x3f]|
-                               $SP0[ $u     &0x3f]|
-                               $SP2[($u>> 8)&0x3f]|
-                               $SP4[($u>>16)&0x3f]|
-                               $SP6[($u>>24)&0x3f];
-
-                       $t=(($l<<1)|(($l>>31)&0x1))&0xffffffff;
-                       $u=$t^$ks[$i-2];
-                       $t=$t^$ks[$i-1];
-                       $t=((($t>>4)&0x0fffffff)|($t<<28))&0xffffffff;
-                       $r^=    $SP1[ $t     &0x3f]|
-                               $SP3[($t>> 8)&0x3f]|
-                               $SP5[($t>>16)&0x3f]|
-                               $SP7[($t>>24)&0x3f]|
-                               $SP0[ $u     &0x3f]|
-                               $SP2[($u>> 8)&0x3f]|
-                               $SP4[($u>>16)&0x3f]|
-                               $SP6[($u>>24)&0x3f];
-                       }
-               }
-       &doFP(*l,*r);
-       pack("C8",$l&0xff, 
-                 ($l>> 8)&0x00ffffff,
-                 ($l>>16)&0x0000ffff,
-                 ($l>>24)&0x000000ff,
-                 $r&0xff,
-                 ($r>> 8)&0x00ffffff,
-                 ($r>>16)&0x0000ffff,
-                 ($r>>24)&0x000000ff);
-       }
diff --git a/lib/libssl/src/crypto/des/des.pod b/lib/libssl/src/crypto/des/des.pod
new file mode 100644 (file)
index 0000000..bf479e8
--- /dev/null
@@ -0,0 +1,217 @@
+=pod
+
+=head1 NAME
+
+des - encrypt or decrypt data using Data Encryption Standard
+
+=head1 SYNOPSIS
+
+B<des>
+(
+B<-e>
+|
+B<-E>
+) | (
+B<-d>
+|
+B<-D>
+) | (
+B<->[B<cC>][B<ckname>]
+) |
+[
+B<-b3hfs>
+] [
+B<-k>
+I<key>
+]
+] [
+B<-u>[I<uuname>]
+[
+I<input-file>
+[
+I<output-file>
+] ]
+
+=head1 NOTE
+
+This page describes the B<des> stand-alone program, not the B<openssl des>
+command.
+
+=head1 DESCRIPTION
+
+B<des>
+encrypts and decrypts data using the
+Data Encryption Standard algorithm.
+One of
+B<-e>, B<-E>
+(for encrypt) or
+B<-d>, B<-D>
+(for decrypt) must be specified.
+It is also possible to use
+B<-c>
+or
+B<-C>
+in conjunction or instead of the a encrypt/decrypt option to generate
+a 16 character hexadecimal checksum, generated via the
+I<des_cbc_cksum>.
+
+Two standard encryption modes are supported by the
+B<des>
+program, Cipher Block Chaining (the default) and Electronic Code Book
+(specified with
+B<-b>).
+
+The key used for the DES
+algorithm is obtained by prompting the user unless the
+B<-k>
+I<key>
+option is given.
+If the key is an argument to the
+B<des>
+command, it is potentially visible to users executing
+ps(1)
+or a derivative.  To minimise this possibility,
+B<des>
+takes care to destroy the key argument immediately upon entry.
+If your shell keeps a history file be careful to make sure it is not
+world readable.
+
+Since this program attempts to maintain compatibility with sunOS's
+des(1) command, there are 2 different methods used to convert the user
+supplied key to a des key.
+Whenever and one or more of
+B<-E>, B<-D>, B<-C>
+or
+B<-3>
+options are used, the key conversion procedure will not be compatible
+with the sunOS des(1) version but will use all the user supplied
+character to generate the des key.
+B<des>
+command reads from standard input unless
+I<input-file>
+is specified and writes to standard output unless
+I<output-file>
+is given.
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<-b>
+
+Select ECB
+(eight bytes at a time) encryption mode.
+
+=item B<-3>
+
+Encrypt using triple encryption.
+By default triple cbc encryption is used but if the
+B<-b>
+option is used then triple ECB encryption is performed.
+If the key is less than 8 characters long, the flag has no effect.
+
+=item B<-e>
+
+Encrypt data using an 8 byte key in a manner compatible with sunOS
+des(1).
+
+=item B<-E>
+
+Encrypt data using a key of nearly unlimited length (1024 bytes).
+This will product a more secure encryption.
+
+=item B<-d>
+
+Decrypt data that was encrypted with the B<-e> option.
+
+=item B<-D>
+
+Decrypt data that was encrypted with the B<-E> option.
+
+=item B<-c>
+
+Generate a 16 character hexadecimal cbc checksum and output this to
+stderr.
+If a filename was specified after the
+B<-c>
+option, the checksum is output to that file.
+The checksum is generated using a key generated in a sunOS compatible
+manner.
+
+=item B<-C>
+
+A cbc checksum is generated in the same manner as described for the
+B<-c>
+option but the DES key is generated in the same manner as used for the
+B<-E>
+and
+B<-D>
+options
+
+=item B<-f>
+
+Does nothing - allowed for compatibility with sunOS des(1) command.
+
+=item B<-s>
+
+Does nothing - allowed for compatibility with sunOS des(1) command.
+
+=item B<-k> I<key>
+
+Use the encryption 
+I<key>
+specified.
+
+=item B<-h>
+
+The
+I<key>
+is assumed to be a 16 character hexadecimal number.
+If the
+B<-3>
+option is used the key is assumed to be a 32 character hexadecimal
+number.
+
+=item B<-u>
+
+This flag is used to read and write uuencoded files.  If decrypting,
+the input file is assumed to contain uuencoded, DES encrypted data.
+If encrypting, the characters following the B<-u> are used as the name of
+the uuencoded file to embed in the begin line of the uuencoded
+output.  If there is no name specified after the B<-u>, the name text.des
+will be embedded in the header.
+
+=head1 SEE ALSO
+
+ps(1),
+L<des_crypt(3)|des_crypt(3)>
+
+=head1 BUGS
+
+The problem with using the
+B<-e>
+option is the short key length.
+It would be better to use a real 56-bit key rather than an
+ASCII-based 56-bit pattern.  Knowing that the key was derived from ASCII
+radically reduces the time necessary for a brute-force cryptographic attack.
+My attempt to remove this problem is to add an alternative text-key to
+DES-key function.  This alternative function (accessed via
+B<-E>, B<-D>, B<-S>
+and
+B<-3>)
+uses DES to help generate the key.
+
+Be carefully when using the B<-u> option.  Doing B<des -ud> I<filename> will
+not decrypt filename (the B<-u> option will gobble the B<-d> option).
+
+The VMS operating system operates in a world where files are always a
+multiple of 512 bytes.  This causes problems when encrypted data is
+send from Unix to VMS since a 88 byte file will suddenly be padded
+with 424 null bytes.  To get around this problem, use the B<-u> option
+to uuencode the data before it is send to the VMS system.
+
+=head1 AUTHOR
+
+Eric Young (eay@cryptsoft.com)
+
+=cut
index 0ecc416..e69de29 100644 (file)
@@ -1,508 +0,0 @@
-.TH DES_CRYPT 3 
-.SH NAME
-des_read_password, des_read_2password,
-des_string_to_key, des_string_to_2key, des_read_pw_string,
-des_random_key, des_set_key,
-des_key_sched, des_ecb_encrypt, des_ecb3_encrypt, des_cbc_encrypt,
-des_3cbc_encrypt,
-des_pcbc_encrypt, des_cfb_encrypt, des_ofb_encrypt,
-des_cbc_cksum, des_quad_cksum,
-des_enc_read, des_enc_write, des_set_odd_parity,
-des_is_weak_key, crypt \- (non USA) DES encryption
-.SH SYNOPSIS
-.nf
-.nj
-.ft B
-#include <des.h>
-.PP
-.B int des_read_password(key,prompt,verify)
-des_cblock *key;
-char *prompt;
-int verify;
-.PP
-.B int des_read_2password(key1,key2,prompt,verify)
-des_cblock *key1,*key2;
-char *prompt;
-int verify;
-.PP
-.B int des_string_to_key(str,key)
-char *str;
-des_cblock *key;
-.PP
-.B int des_string_to_2keys(str,key1,key2)
-char *str;
-des_cblock *key1,*key2;
-.PP
-.B int des_read_pw_string(buf,length,prompt,verify)
-char *buf;
-int length;
-char *prompt;
-int verify;
-.PP
-.B int des_random_key(key)
-des_cblock *key;
-.PP
-.B int des_set_key(key,schedule)
-des_cblock *key;
-des_key_schedule schedule;
-.PP
-.B int des_key_sched(key,schedule)
-des_cblock *key;
-des_key_schedule schedule;
-.PP
-.B int des_ecb_encrypt(input,output,schedule,encrypt)
-des_cblock *input;
-des_cblock *output;
-des_key_schedule schedule;
-int encrypt;
-.PP
-.B int des_ecb3_encrypt(input,output,ks1,ks2,encrypt)
-des_cblock *input;
-des_cblock *output;
-des_key_schedule ks1,ks2;
-int encrypt;
-.PP
-.B int des_cbc_encrypt(input,output,length,schedule,ivec,encrypt)
-des_cblock *input;
-des_cblock *output;
-long length;
-des_key_schedule schedule;
-des_cblock *ivec;
-int encrypt;
-.PP
-.B int des_3cbc_encrypt(input,output,length,sk1,sk2,ivec1,ivec2,encrypt)
-des_cblock *input;
-des_cblock *output;
-long length;
-des_key_schedule sk1;
-des_key_schedule sk2;
-des_cblock *ivec1;
-des_cblock *ivec2;
-int encrypt;
-.PP
-.B int des_pcbc_encrypt(input,output,length,schedule,ivec,encrypt)
-des_cblock *input;
-des_cblock *output;
-long length;
-des_key_schedule schedule;
-des_cblock *ivec;
-int encrypt;
-.PP
-.B int des_cfb_encrypt(input,output,numbits,length,schedule,ivec,encrypt)
-unsigned char *input;
-unsigned char *output;
-int numbits;
-long length;
-des_key_schedule schedule;
-des_cblock *ivec;
-int encrypt;
-.PP
-.B int des_ofb_encrypt(input,output,numbits,length,schedule,ivec)
-unsigned char *input,*output;
-int numbits;
-long length;
-des_key_schedule schedule;
-des_cblock *ivec;
-.PP
-.B unsigned long des_cbc_cksum(input,output,length,schedule,ivec)
-des_cblock *input;
-des_cblock *output;
-long length;
-des_key_schedule schedule;
-des_cblock *ivec;
-.PP
-.B unsigned long des_quad_cksum(input,output,length,out_count,seed)
-des_cblock *input;
-des_cblock *output;
-long length;
-int out_count;
-des_cblock *seed;
-.PP
-.B int des_check_key;
-.PP
-.B int des_enc_read(fd,buf,len,sched,iv)
-int fd;
-char *buf;
-int len;
-des_key_schedule sched;
-des_cblock *iv;
-.PP
-.B int des_enc_write(fd,buf,len,sched,iv)
-int fd;
-char *buf;
-int len;
-des_key_schedule sched;
-des_cblock *iv;
-.PP
-.B extern int des_rw_mode;
-.PP
-.B void des_set_odd_parity(key)
-des_cblock *key;
-.PP
-.B int des_is_weak_key(key)
-des_cblock *key;
-.PP
-.B char *crypt(passwd,salt)
-char *passwd;
-char *salt;
-.PP
-.fi
-.SH DESCRIPTION
-This library contains a fast implementation of the DES encryption
-algorithm.
-.PP
-There are two phases to the use of DES encryption.
-The first is the generation of a
-.I des_key_schedule
-from a key,
-the second is the actual encryption.
-A des key is of type
-.I des_cblock.
-This type is made from 8 characters with odd parity.
-The least significant bit in the character is the parity bit.
-The key schedule is an expanded form of the key; it is used to speed the
-encryption process.
-.PP
-.I des_read_password
-writes the string specified by prompt to the standard output,
-turns off echo and reads an input string from standard input
-until terminated with a newline.
-If verify is non-zero, it prompts and reads the input again and verifies
-that both entered passwords are the same.
-The entered string is converted into a des key by using the
-.I des_string_to_key
-routine.
-The new key is placed in the
-.I des_cblock
-that was passed (by reference) to the routine.
-If there were no errors,
-.I des_read_password
-returns 0,
--1 is returned if there was a terminal error and 1 is returned for
-any other error.
-.PP
-.I des_read_2password
-operates in the same way as
-.I des_read_password
-except that it generates 2 keys by using the
-.I des_string_to_2key
-function.
-.PP
-.I des_read_pw_string
-is called by
-.I des_read_password
-to read and verify a string from a terminal device.
-The string is returned in
-.I buf.
-The size of
-.I buf
-is passed to the routine via the
-.I length
-parameter.
-.PP
-.I des_string_to_key
-converts a string into a valid des key.
-.PP
-.I des_string_to_2key
-converts a string into 2 valid des keys.
-This routine is best suited for used to generate keys for use with
-.I des_ecb3_encrypt.
-.PP
-.I des_random_key
-returns a random key that is made of a combination of process id,
-time and an increasing counter.
-.PP
-Before a des key can be used it is converted into a
-.I des_key_schedule
-via the
-.I des_set_key
-routine.
-If the
-.I des_check_key
-flag is non-zero,
-.I des_set_key
-will check that the key passed is of odd parity and is not a week or
-semi-weak key.
-If the parity is wrong,
-then -1 is returned.
-If the key is a weak key,
-then -2 is returned.
-If an error is returned,
-the key schedule is not generated.
-.PP
-.I des_key_sched
-is another name for the
-.I des_set_key
-function.
-.PP
-The following routines mostly operate on an input and output stream of
-.I des_cblock's.
-.PP
-.I des_ecb_encrypt
-is the basic DES encryption routine that encrypts or decrypts a single 8-byte
-.I des_cblock
-in
-.I electronic code book
-mode.
-It always transforms the input data, pointed to by
-.I input,
-into the output data,
-pointed to by the
-.I output
-argument.
-If the
-.I encrypt
-argument is non-zero (DES_ENCRYPT),
-the
-.I input
-(cleartext) is encrypted in to the
-.I output
-(ciphertext) using the key_schedule specified by the
-.I schedule
-argument,
-previously set via
-.I des_set_key.
-If
-.I encrypt
-is zero (DES_DECRYPT),
-the
-.I input
-(now ciphertext)
-is decrypted into the
-.I output
-(now cleartext).
-Input and output may overlap.
-No meaningful value is returned.
-.PP
-.I des_ecb3_encrypt
-encrypts/decrypts the
-.I input
-block by using triple ecb DES encryption.
-This involves encrypting the input with 
-.I ks1,
-decryption with the key schedule
-.I ks2,
-and then encryption with the first again.
-This routine greatly reduces the chances of brute force breaking of
-DES and has the advantage of if
-.I ks1
-and
-.I ks2
-are the same, it is equivalent to just encryption using ecb mode and
-.I ks1
-as the key.
-.PP
-.I des_cbc_encrypt
-encrypts/decrypts using the
-.I cipher-block-chaining
-mode of DES.
-If the
-.I encrypt
-argument is non-zero,
-the routine cipher-block-chain encrypts the cleartext data pointed to by the
-.I input
-argument into the ciphertext pointed to by the
-.I output
-argument,
-using the key schedule provided by the
-.I schedule
-argument,
-and initialisation vector provided by the
-.I ivec
-argument.
-If the
-.I length
-argument is not an integral multiple of eight bytes, 
-the last block is copied to a temporary area and zero filled.
-The output is always
-an integral multiple of eight bytes.
-To make multiple cbc encrypt calls on a large amount of data appear to
-be one 
-.I des_cbc_encrypt
-call, the
-.I ivec
-of subsequent calls should be the last 8 bytes of the output.
-.PP
-.I des_3cbc_encrypt
-encrypts/decrypts the
-.I input
-block by using triple cbc DES encryption.
-This involves encrypting the input with key schedule
-.I ks1,
-decryption with the key schedule
-.I ks2,
-and then encryption with the first again.
-2 initialisation vectors are required,
-.I ivec1
-and
-.I ivec2.
-Unlike
-.I des_cbc_encrypt,
-these initialisation vectors are modified by the subroutine.
-This routine greatly reduces the chances of brute force breaking of
-DES and has the advantage of if
-.I ks1
-and
-.I ks2
-are the same, it is equivalent to just encryption using cbc mode and
-.I ks1
-as the key.
-.PP
-.I des_pcbc_encrypt
-encrypt/decrypts using a modified block chaining mode.
-It provides better error propagation characteristics than cbc
-encryption.
-.PP
-.I des_cfb_encrypt
-encrypt/decrypts using cipher feedback mode.  This method takes an
-array of characters as input and outputs and array of characters.  It
-does not require any padding to 8 character groups.  Note: the ivec
-variable is changed and the new changed value needs to be passed to
-the next call to this function.  Since this function runs a complete
-DES ecb encryption per numbits, this function is only suggested for
-use when sending small numbers of characters.
-.PP
-.I des_ofb_encrypt
-encrypt using output feedback mode.  This method takes an
-array of characters as input and outputs and array of characters.  It
-does not require any padding to 8 character groups.  Note: the ivec
-variable is changed and the new changed value needs to be passed to
-the next call to this function.  Since this function runs a complete
-DES ecb encryption per numbits, this function is only suggested for
-use when sending small numbers of characters.
-.PP
-.I des_cbc_cksum
-produces an 8 byte checksum based on the input stream (via cbc encryption).
-The last 4 bytes of the checksum is returned and the complete 8 bytes is
-placed in
-.I output.
-.PP
-.I des_quad_cksum
-returns a 4 byte checksum from the input bytes.
-The algorithm can be iterated over the input,
-depending on
-.I out_count,
-1, 2, 3 or 4 times.
-If
-.I output
-is non-NULL,
-the 8 bytes generated by each pass are written into
-.I output.
-.PP
-.I des_enc_write
-is used to write
-.I len
-bytes
-to file descriptor
-.I fd
-from buffer
-.I buf.
-The data is encrypted via
-.I pcbc_encrypt
-(default) using
-.I sched
-for the key and
-.I iv
-as a starting vector.
-The actual data send down
-.I fd
-consists of 4 bytes (in network byte order) containing the length of the
-following encrypted data.  The encrypted data then follows, padded with random
-data out to a multiple of 8 bytes.
-.PP
-.I des_enc_read
-is used to read
-.I len
-bytes
-from file descriptor
-.I fd
-into buffer
-.I buf.
-The data being read from
-.I fd
-is assumed to have come from
-.I des_enc_write
-and is decrypted using
-.I sched
-for the key schedule and
-.I iv
-for the initial vector.
-The
-.I des_enc_read/des_enc_write
-pair can be used to read/write to files, pipes and sockets.
-I have used them in implementing a version of rlogin in which all
-data is encrypted.
-.PP
-.I des_rw_mode
-is used to specify the encryption mode to use with 
-.I des_enc_read
-and 
-.I des_end_write.
-If set to
-.I DES_PCBC_MODE
-(the default), des_pcbc_encrypt is used.
-If set to
-.I DES_CBC_MODE
-des_cbc_encrypt is used.
-These two routines and the variable are not part of the normal MIT library.
-.PP
-.I des_set_odd_parity
-sets the parity of the passed
-.I key
-to odd.  This routine is not part of the standard MIT library.
-.PP
-.I des_is_weak_key
-returns 1 is the passed key is a weak key (pick again :-),
-0 if it is ok.
-This routine is not part of the standard MIT library.
-.PP
-.I crypt
-is a replacement for the normal system crypt.
-It is much faster than the system crypt.
-.PP
-.SH FILES
-/usr/include/des.h
-.br
-/usr/lib/libdes.a
-.PP
-The encryption routines have been tested on 16bit, 32bit and 64bit
-machines of various endian and even works under VMS.
-.PP
-.SH BUGS
-.PP
-If you think this manual is sparse,
-read the des_crypt(3) manual from the MIT kerberos (or bones outside
-of the USA) distribution.
-.PP
-.I des_cfb_encrypt
-and
-.I des_ofb_encrypt
-operates on input of 8 bits.  What this means is that if you set
-numbits to 12, and length to 2, the first 12 bits will come from the 1st
-input byte and the low half of the second input byte.  The second 12
-bits will have the low 8 bits taken from the 3rd input byte and the
-top 4 bits taken from the 4th input byte.  The same holds for output.
-This function has been implemented this way because most people will
-be using a multiple of 8 and because once you get into pulling bytes input
-bytes apart things get ugly!
-.PP
-.I des_read_pw_string
-is the most machine/OS dependent function and normally generates the
-most problems when porting this code.
-.PP
-.I des_string_to_key
-is probably different from the MIT version since there are lots
-of fun ways to implement one-way encryption of a text string.
-.PP
-The routines are optimised for 32 bit machines and so are not efficient
-on IBM PCs.
-.PP
-NOTE: extensive work has been done on this library since this document
-was origionally written.  Please try to read des.doc from the libdes
-distribution since it is far more upto date and documents more of the
-functions.  Libdes is now also being shipped as part of SSLeay, a
-general cryptographic library that amonst other things implements
-netscapes SSL protocoll.  The most recent version can be found in
-SSLeay distributions.
-.SH AUTHOR
-Eric Young (eay@cryptsoft.com)
index 4dfed19..1ace8f5 100644 (file)
                                } \
                        }
 
-#if defined(WIN32)
+#if defined(WIN32) && defined(_MSC_VER)
 #define        ROTATE(a,n)     (_lrotr(a,n))
 #else
 #define        ROTATE(a,n)     (((a)>>(n))+((a)<<(32-(n))))
index 9ad4ecb..df0d615 100644 (file)
@@ -336,8 +336,15 @@ int main(int argc, char *argv[])
        unsigned char cbc_in[40];
        unsigned char cbc_out[40];
        DES_LONG cs;
-       unsigned char qret[4][4],cret[8];
-       DES_LONG lqret[4];
+       unsigned char cret[8];
+#ifdef _CRAY
+        struct {
+            int a:32;
+            int b:32;
+        } lqret[2];
+#else
+        DES_LONG lqret[4];
+#endif
        int num;
        char *str;
 
@@ -701,43 +708,40 @@ plain[8+4], plain[8+5], plain[8+6], plain[8+7]);
                }
 
        printf("Doing quad_cksum\n");
-       /* This is obviously done this way especially to puzzle me. Although
-          quad_cksum returns up to 4 groups of 8 bytes, this test gets it to
-          produce 2 groups then treats them as 4 groups of 4 bytes.
-          Ben 13 Feb 1999 */
-       cs=quad_cksum(cbc_data,(des_cblock *)qret,strlen((char *)cbc_data),2,
-                     &cbc_iv);
-
-       { /* Big-endian fix */
-       static DES_LONG l=1;
-       static unsigned char *c=(unsigned char *)&l;
-       DES_LONG ll;
-
-       j=sizeof(lqret[0])-4;
-       for (i=0; i<4; i++)
+       cs=quad_cksum(cbc_data,(des_cblock *)lqret,
+               (long)strlen((char *)cbc_data),2,(des_cblock *)cbc_iv);
+       if (cs != 0x70d7a63aL)
                {
-               lqret[i]=0;
-               memcpy(&(lqret[i]),&(qret[i][0]),4);
-               if (!c[0] && (j > 0))
-                       lqret[i]=lqret[i]>>(j*8); /* For Cray */
+               printf("quad_cksum error, ret %08lx should be 70d7a63a\n",
+                       (unsigned long)cs);
+               err=1;
                }
-
-       if (!c[0])
+#ifdef _CRAY
+       if (lqret[0].a != 0x327eba8dL)
                {
-               ll=lqret[0]^lqret[3];
-               lqret[0]^=ll;
-               lqret[3]^=ll;
-               ll=lqret[1]^lqret[2];
-               lqret[1]^=ll;
-               lqret[2]^=ll;
+               printf("quad_cksum error, out[0] %08lx is not %08lx\n",
+                       (unsigned long)lqret[0].a,0x327eba8dUL);
+               err=1;
                }
-       }
-       if (cs != 0x70d7a63aL)
+       if (lqret[0].b != 0x201a49ccL)
                {
-               printf("quad_cksum error, ret %08lx should be 70d7a63a\n",
-                       (unsigned long)cs);
+               printf("quad_cksum error, out[1] %08lx is not %08lx\n",
+                       (unsigned long)lqret[0].b,0x201a49ccUL);
+               err=1;
+               }
+       if (lqret[1].a != 0x70d7a63aL)
+               {
+               printf("quad_cksum error, out[2] %08lx is not %08lx\n",
+                       (unsigned long)lqret[1].a,0x70d7a63aUL);
                err=1;
                }
+       if (lqret[1].b != 0x501c2c26L)
+               {
+               printf("quad_cksum error, out[3] %08lx is not %08lx\n",
+                       (unsigned long)lqret[1].b,0x501c2c26UL);
+               err=1;
+               }
+#else
        if (lqret[0] != 0x327eba8dL)
                {
                printf("quad_cksum error, out[0] %08lx is not %08lx\n",
@@ -762,6 +766,7 @@ plain[8+4], plain[8+5], plain[8+6], plain[8+7]);
                        (unsigned long)lqret[3],0x501c2c26UL);
                err=1;
                }
+#endif
 #endif
 
        printf("input word alignment test");
index 18cf231..e69de29 100644 (file)
@@ -1,46 +0,0 @@
-#!/usr/local/bin/perl
-
-@l=(
-        0, 1, 2, 3, 4, 5, 6, 7,
-        8, 9,10,11,12,13,14,15,
-       16,17,18,19,20,21,22,23,
-       24,25,26,27,28,29,30,31
-       );
-@r=(
-       32,33,34,35,36,37,38,39,
-       40,41,42,43,44,45,46,47,
-       48,49,50,51,52,53,54,55,
-       56,57,58,59,60,61,62,63
-       );
-
-require 'shifts.pl';
-
-sub PERM_OP
-       {
-       local(*a,*b,*t,$n,$m)=@_;
-
-       @z=&shift(*a,-$n);
-       @z=&xor(*b,*z);
-       @z=&and(*z,$m);
-       @b=&xor(*b,*z);
-       @z=&shift(*z,$n);
-       @a=&xor(*a,*z);
-       }
-
-
-@L=@l;
-@R=@r;
-&PERM_OP(*R,*L,*T,4,0x0f0f0f0f);
-&PERM_OP(*L,*R,*T,16,0x0000ffff);
-&PERM_OP(*R,*L,*T,2,0x33333333);
-&PERM_OP(*L,*R,*T,8,0x00ff00ff);
-&PERM_OP(*R,*L,*T,1,0x55555555);
-       &printit(@L);
-       &printit(@R);
-&PERM_OP(*R,*L,*T,1,0x55555555);
-&PERM_OP(*L,*R,*T,8,0x00ff00ff);
-&PERM_OP(*R,*L,*T,2,0x33333333);
-&PERM_OP(*L,*R,*T,16,0x0000ffff);
-&PERM_OP(*R,*L,*T,4,0x0f0f0f0f);
-       &printit(@L);
-       &printit(@R);
index 096afd8..e69de29 100644 (file)
@@ -1,110 +0,0 @@
-#!/usr/local/bin/perl
-
-@l=(
-        0, 1, 2, 3, 4, 5, 6, 7,
-        8, 9,10,11,12,13,14,15,
-       16,17,18,19,20,21,22,23,
-       24,25,26,27,28,29,30,31
-       );
-@r=(
-       32,33,34,35,36,37,38,39,
-       40,41,42,43,44,45,46,47,
-       48,49,50,51,52,53,54,55,
-       56,57,58,59,60,61,62,63
-       );
-
-require 'shifts.pl';
-
-sub PERM_OP
-       {
-       local(*a,*b,*t,$n,$m)=@_;
-
-       @z=&shift(*a,-$n);
-       @z=&xor(*b,*z);
-       @z=&and(*z,$m);
-       @b=&xor(*b,*z);
-       @z=&shift(*z,$n);
-       @a=&xor(*a,*z);
-       }
-
-sub HPERM_OP2
-       {
-       local(*a,*t,$n,$m)=@_;
-       local(@x,@y,$i);
-
-       @z=&shift(*a,16-$n);
-       @z=&xor(*a,*z);
-       @z=&and(*z,$m);
-       @a=&xor(*a,*z);
-       @z=&shift(*z,$n-16);
-       @a=&xor(*a,*z);
-       }
-
-sub HPERM_OP
-        {
-        local(*a,*t,$n,$m)=@_;
-        local(@x,@y,$i);
-
-        for ($i=0; $i<16; $i++)
-                {
-                $x[$i]=$a[$i];
-                $y[$i]=$a[16+$i];
-                }
-        @z=&shift(*x,-$n);
-        @z=&xor(*y,*z);
-        @z=&and(*z,$m);
-        @y=&xor(*y,*z);
-        @z=&shift(*z,$n);
-        @x=&xor(*x,*z);
-        for ($i=0; $i<16; $i++)
-                {
-                $a[$i]=$x[$i];
-                $a[16+$i]=$y[$i];
-                }
-        }
-
-@L=@l;
-@R=@r;
-
-       print "---\n"; &printit(@R);
-&PERM_OP(*R,*L,*T,4,0x0f0f0f0f);
-       print "---\n"; &printit(@R);
-&HPERM_OP2(*L,*T,-2,0xcccc0000);
-&HPERM_OP2(*R,*T,-2,0xcccc0000);
-       print "---\n"; &printit(@R);
-&PERM_OP(*R,*L,*T,1,0x55555555);
-       print "---\n"; &printit(@R);
-&PERM_OP(*L,*R,*T,8,0x00ff00ff);
-       print "---\n"; &printit(@R);
-&PERM_OP(*R,*L,*T,1,0x55555555);
-       print "---\n"; &printit(@R);
-#      &printit(@L);
-       &printit(@R);
-print <<"EOF";
-==============================
-63  55  47  39  31  23  15   7  
-62  54  46  38  30  22  14   6  
-61  53  45  37  29  21  13   5  
-60  52  44  36  --  --  --  --  
-
-57  49  41  33  25  17   9   1  
-58  50  42  34  26  18  10   2  
-59  51  43  35  27  19  11   3  
-28  20  12   4  --  --  --  --  
-EOF
-exit(1);
-@A=&and(*R,0x000000ff);
-@A=&shift(*A,16);
-@B=&and(*R,0x0000ff00);
-@C=&and(*R,0x00ff0000);
-@C=&shift(*C,-16);
-@D=&and(*L,0xf0000000);
-@D=&shift(*D,-4);
-@A=&or(*A,*B);
-@B=&or(*D,*C);
-@R=&or(*A,*B);
-@L=&and(*L,0x0fffffff);
-
-       &printit(@L);
-       &printit(@R);
-
index fa5cf74..e69de29 100644 (file)
@@ -1,94 +0,0 @@
-#!/usr/local/bin/perl
-
-@PC2_C=(14,17,11,24, 1, 5,
-        3,28,15, 6,21,10,
-       23,19,12, 4,26, 8,
-       16, 7,27,20,13, 2,
-       );
-
-@PC2_D=(41,52,31,37,47,55,
-       30,40,51,45,33,48,
-       44,49,39,56,34,53,
-       46,42,50,36,29,32,
-       );
-
-$i=0;
-foreach (@PC2_C) {
-       $_--;
-#      printf "%2d,",$_;
-       $C{$_}=$i;
-       ++$i;
-#      print "\n" if ((($i) % 8) == 0);
-       }
-$i=0;
-#print "\n";
-foreach (@PC2_D) {
-       $_-=28;
-       $_--;
-#      printf "%2d,",$_;
-       $D{$_}=$i;
-       $i++;
-#      print "\n" if ((($i) % 8) == 0);
-       }
-
-#print "\n";
-foreach $i (0 .. 27)
-       {
-       $_=$C{$i};
-#      printf "%2d,",$_;
-       $i++;
-#      print "\n" if ((($i) % 8) == 0);
-       }
-#print "\n";
-
-#print "\n";
-foreach $i (0 .. 27)
-       {
-       $_=$D{$i};
-#      printf "%2d,",$_;
-       $i++;
-#      print "\n" if ((($i) % 8) == 0);
-       }
-#print "\n";
-
-print "static ulong skb[8][64]={\n";
-&doit("C",*C, 0, 1, 2, 3, 4, 5);
-&doit("C",*C, 6, 7, 9,10,11,12);
-&doit("C",*C,13,14,15,16,18,19);
-&doit("C",*C,20,22,23,25,26,27);
-
-&doit("D",*D, 0, 1, 2, 3, 4, 5);
-&doit("D",*D, 7, 8,10,11,12,13);
-&doit("D",*D,15,16,17,18,19,20);
-&doit("D",*D,21,22,23,24,26,27);
-print "};\n";
-
-sub doit
-       {
-       local($l,*A,@b)=@_;
-       local(@out);
-
-       printf("/* for $l bits (numbered as per FIPS 46) %d %d %d %d %d %d */\n",
-               $b[0]+1, $b[1]+1, $b[2]+1, $b[3]+1, $b[4]+1, $b[5]+1);
-       for ($i=0; $i<64; $i++)
-               {
-               $out[$i]=0;
-               $j=1;
-#print "\n";
-               for ($k=0; $k<6; $k++)
-                       {
-                       $l=$A{$b[$k]};
-#print"$l - ";
-                       if ((1<<$k) & $i)
-                               {
-                               $ll=int($l/6)*8+($l%6);
-                               $out[$i]|=1<<($ll);
-                               }
-                       }
-               $pp=$out[$i];
-               $pp=($pp&0xff0000ff)|   (($pp&0x00ff0000)>>8)|
-                                       (($pp&0x0000ff00)<<8);
-               printf("0x%08X,",$pp);
-               print "\n" if (($i+1) % 4 == 0);
-               }
-       }
index fa1b8aa..9b21f81 100644 (file)
@@ -3,7 +3,6 @@
 
 /* This version of crypt has been developed from my MIT compatible
  * DES library.
- * The library is available at pub/Crypto/DES at ftp.psy.uq.oz.au
  * Eric Young (eay@cryptsoft.com)
  */
 
index 83c9405..22c87f5 100644 (file)
@@ -97,7 +97,7 @@ void fcrypt_body(DES_LONG *out, des_key_schedule ks, DES_LONG Eswap0,
 
        for (j=0; j<25; j++)
                {
-#ifdef DES_UNROLL
+#ifndef DES_UNROLL
                register int i;
 
                for (i=0; i<32; i+=8)
index e0e67a4..3b68169 100644 (file)
@@ -1,4 +1,9 @@
 /* crypto/des/ncbc_enc.c */
+/*
+ * #included by:
+ *    cbc_enc.c  (des_cbc_encrypt)
+ *    des_enc.c  (des_ncbc_encrypt)
+ */
 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
index 1b2bfe0..e69de29 100644 (file)
@@ -1,75 +0,0 @@
-/* crypto/des/podd.h */
-/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
- * All rights reserved.
- *
- * This package is an SSL implementation written
- * by Eric Young (eay@cryptsoft.com).
- * The implementation was written so as to conform with Netscapes SSL.
- * 
- * This library is free for commercial and non-commercial use as long as
- * the following conditions are aheared to.  The following conditions
- * apply to all code found in this distribution, be it the RC4, RSA,
- * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
- * included with this distribution is covered by the same copyright terms
- * except that the holder is Tim Hudson (tjh@cryptsoft.com).
- * 
- * Copyright remains Eric Young's, and as such any Copyright notices in
- * the code are not to be removed.
- * If this package is used in a product, Eric Young should be given attribution
- * as the author of the parts of the library used.
- * This can be in the form of a textual message at program startup or
- * in documentation (online or textual) provided with the package.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *    "This product includes cryptographic software written by
- *     Eric Young (eay@cryptsoft.com)"
- *    The word 'cryptographic' can be left out if the rouines from the library
- *    being used are not cryptographic related :-).
- * 4. If you include any Windows specific code (or a derivative thereof) from 
- *    the apps directory (application code) you must include an acknowledgement:
- *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
- * 
- * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * 
- * The licence and distribution terms for any publically available version or
- * derivative of this code cannot be changed.  i.e. this code cannot simply be
- * copied and put under another distribution licence
- * [including the GNU Public Licence.]
- */
-
-static const unsigned char odd_parity[256]={
-  1,  1,  2,  2,  4,  4,  7,  7,  8,  8, 11, 11, 13, 13, 14, 14,
- 16, 16, 19, 19, 21, 21, 22, 22, 25, 25, 26, 26, 28, 28, 31, 31,
- 32, 32, 35, 35, 37, 37, 38, 38, 41, 41, 42, 42, 44, 44, 47, 47,
- 49, 49, 50, 50, 52, 52, 55, 55, 56, 56, 59, 59, 61, 61, 62, 62,
- 64, 64, 67, 67, 69, 69, 70, 70, 73, 73, 74, 74, 76, 76, 79, 79,
- 81, 81, 82, 82, 84, 84, 87, 87, 88, 88, 91, 91, 93, 93, 94, 94,
- 97, 97, 98, 98,100,100,103,103,104,104,107,107,109,109,110,110,
-112,112,115,115,117,117,118,118,121,121,122,122,124,124,127,127,
-128,128,131,131,133,133,134,134,137,137,138,138,140,140,143,143,
-145,145,146,146,148,148,151,151,152,152,155,155,157,157,158,158,
-161,161,162,162,164,164,167,167,168,168,171,171,173,173,174,174,
-176,176,179,179,181,181,182,182,185,185,186,186,188,188,191,191,
-193,193,194,194,196,196,199,199,200,200,203,203,205,205,206,206,
-208,208,211,211,213,213,214,214,217,217,218,218,220,220,223,223,
-224,224,227,227,229,229,230,230,233,233,234,234,236,236,239,239,
-241,241,242,242,244,244,247,247,248,248,251,251,253,253,254,254};
index 6ce8c61..5f0ec53 100644 (file)
@@ -80,10 +80,14 @@ DES_LONG des_quad_cksum(const unsigned char *input, des_cblock output[],
        int i;
        long l;
        const unsigned char *cp;
-       unsigned char *lp;
+#ifdef _CRAY
+       short *lp;
+#else
+       DES_LONG *lp;
+#endif
 
        if (out_count < 1) out_count=1;
-       lp = &(output[0])[0];
+       lp = (DES_LONG *) &(output[0])[0];
 
        z0=Q_B0((*seed)[0])|Q_B1((*seed)[1])|Q_B2((*seed)[2])|Q_B3((*seed)[3]);
        z1=Q_B0((*seed)[4])|Q_B1((*seed)[5])|Q_B2((*seed)[6])|Q_B3((*seed)[7]);
@@ -114,25 +118,10 @@ DES_LONG des_quad_cksum(const unsigned char *input, des_cblock output[],
                        }
                if (lp != NULL)
                        {
-                       /* I believe I finally have things worked out.
-                        * The MIT library assumes that the checksum
-                        * is one huge number and it is returned in a
-                        * host dependant byte order.
-                        */
-                       static DES_LONG ltmp=1;
-                       static unsigned char *c=(unsigned char *)&ltmp;
-
-                       if (c[0])
-                               {
-                               l2c(z0,lp);
-                               l2c(z1,lp);
-                               }
-                       else
-                               {
-                               lp = &(output[out_count-i-1])[0];
-                               l2n(z1,lp);
-                               l2n(z0,lp);
-                               }
+                       /* The MIT library assumes that the checksum is
+                        * composed of 2*out_count 32 bit ints */
+                       *lp++ = z0;
+                       *lp++ = z1;
                        }
                }
        return(z0);
index 7816a8f..ee1a6c2 100644 (file)
@@ -63,7 +63,11 @@ void des_random_seed(des_cblock *key)
 
 int des_random_key(des_cblock *ret)
        {
-       int r = RAND_bytes((unsigned char *)ret, sizeof(des_cblock));
+       do
+               {
+               if (RAND_bytes((unsigned char *)ret, sizeof(des_cblock)) != 1)
+                       return (0);
+               } while (des_is_weak_key(ret));
        des_set_odd_parity(ret);
-       return r;
+       return (1);
        }
index bbdc71b..09afd4f 100644 (file)
  * 1.0 First working version
  */
 #include "des_locl.h"
-#include "podd.h"
-#include "sk.h"
 
-static int check_parity(const_des_cblock *key);
 OPENSSL_GLOBAL int des_check_key=0;
 
+static const unsigned char odd_parity[256]={
+  1,  1,  2,  2,  4,  4,  7,  7,  8,  8, 11, 11, 13, 13, 14, 14,
+ 16, 16, 19, 19, 21, 21, 22, 22, 25, 25, 26, 26, 28, 28, 31, 31,
+ 32, 32, 35, 35, 37, 37, 38, 38, 41, 41, 42, 42, 44, 44, 47, 47,
+ 49, 49, 50, 50, 52, 52, 55, 55, 56, 56, 59, 59, 61, 61, 62, 62,
+ 64, 64, 67, 67, 69, 69, 70, 70, 73, 73, 74, 74, 76, 76, 79, 79,
+ 81, 81, 82, 82, 84, 84, 87, 87, 88, 88, 91, 91, 93, 93, 94, 94,
+ 97, 97, 98, 98,100,100,103,103,104,104,107,107,109,109,110,110,
+112,112,115,115,117,117,118,118,121,121,122,122,124,124,127,127,
+128,128,131,131,133,133,134,134,137,137,138,138,140,140,143,143,
+145,145,146,146,148,148,151,151,152,152,155,155,157,157,158,158,
+161,161,162,162,164,164,167,167,168,168,171,171,173,173,174,174,
+176,176,179,179,181,181,182,182,185,185,186,186,188,188,191,191,
+193,193,194,194,196,196,199,199,200,200,203,203,205,205,206,206,
+208,208,211,211,213,213,214,214,217,217,218,218,220,220,223,223,
+224,224,227,227,229,229,230,230,233,233,234,234,236,236,239,239,
+241,241,242,242,244,244,247,247,248,248,251,251,253,253,254,254};
+
 void des_set_odd_parity(des_cblock *key)
        {
        int i;
@@ -78,7 +93,7 @@ void des_set_odd_parity(des_cblock *key)
                (*key)[i]=odd_parity[(*key)[i]];
        }
 
-static int check_parity(const_des_cblock *key)
+int des_check_key_parity(const_des_cblock *key)
        {
        int i;
 
@@ -145,6 +160,153 @@ int des_is_weak_key(const_des_cblock *key)
 #define HPERM_OP(a,t,n,m) ((t)=((((a)<<(16-(n)))^(a))&(m)),\
        (a)=(a)^(t)^(t>>(16-(n))))
 
+static const DES_LONG des_skb[8][64]={
+       {
+       /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
+       0x00000000L,0x00000010L,0x20000000L,0x20000010L,
+       0x00010000L,0x00010010L,0x20010000L,0x20010010L,
+       0x00000800L,0x00000810L,0x20000800L,0x20000810L,
+       0x00010800L,0x00010810L,0x20010800L,0x20010810L,
+       0x00000020L,0x00000030L,0x20000020L,0x20000030L,
+       0x00010020L,0x00010030L,0x20010020L,0x20010030L,
+       0x00000820L,0x00000830L,0x20000820L,0x20000830L,
+       0x00010820L,0x00010830L,0x20010820L,0x20010830L,
+       0x00080000L,0x00080010L,0x20080000L,0x20080010L,
+       0x00090000L,0x00090010L,0x20090000L,0x20090010L,
+       0x00080800L,0x00080810L,0x20080800L,0x20080810L,
+       0x00090800L,0x00090810L,0x20090800L,0x20090810L,
+       0x00080020L,0x00080030L,0x20080020L,0x20080030L,
+       0x00090020L,0x00090030L,0x20090020L,0x20090030L,
+       0x00080820L,0x00080830L,0x20080820L,0x20080830L,
+       0x00090820L,0x00090830L,0x20090820L,0x20090830L,
+       },{
+       /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */
+       0x00000000L,0x02000000L,0x00002000L,0x02002000L,
+       0x00200000L,0x02200000L,0x00202000L,0x02202000L,
+       0x00000004L,0x02000004L,0x00002004L,0x02002004L,
+       0x00200004L,0x02200004L,0x00202004L,0x02202004L,
+       0x00000400L,0x02000400L,0x00002400L,0x02002400L,
+       0x00200400L,0x02200400L,0x00202400L,0x02202400L,
+       0x00000404L,0x02000404L,0x00002404L,0x02002404L,
+       0x00200404L,0x02200404L,0x00202404L,0x02202404L,
+       0x10000000L,0x12000000L,0x10002000L,0x12002000L,
+       0x10200000L,0x12200000L,0x10202000L,0x12202000L,
+       0x10000004L,0x12000004L,0x10002004L,0x12002004L,
+       0x10200004L,0x12200004L,0x10202004L,0x12202004L,
+       0x10000400L,0x12000400L,0x10002400L,0x12002400L,
+       0x10200400L,0x12200400L,0x10202400L,0x12202400L,
+       0x10000404L,0x12000404L,0x10002404L,0x12002404L,
+       0x10200404L,0x12200404L,0x10202404L,0x12202404L,
+       },{
+       /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */
+       0x00000000L,0x00000001L,0x00040000L,0x00040001L,
+       0x01000000L,0x01000001L,0x01040000L,0x01040001L,
+       0x00000002L,0x00000003L,0x00040002L,0x00040003L,
+       0x01000002L,0x01000003L,0x01040002L,0x01040003L,
+       0x00000200L,0x00000201L,0x00040200L,0x00040201L,
+       0x01000200L,0x01000201L,0x01040200L,0x01040201L,
+       0x00000202L,0x00000203L,0x00040202L,0x00040203L,
+       0x01000202L,0x01000203L,0x01040202L,0x01040203L,
+       0x08000000L,0x08000001L,0x08040000L,0x08040001L,
+       0x09000000L,0x09000001L,0x09040000L,0x09040001L,
+       0x08000002L,0x08000003L,0x08040002L,0x08040003L,
+       0x09000002L,0x09000003L,0x09040002L,0x09040003L,
+       0x08000200L,0x08000201L,0x08040200L,0x08040201L,
+       0x09000200L,0x09000201L,0x09040200L,0x09040201L,
+       0x08000202L,0x08000203L,0x08040202L,0x08040203L,
+       0x09000202L,0x09000203L,0x09040202L,0x09040203L,
+       },{
+       /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */
+       0x00000000L,0x00100000L,0x00000100L,0x00100100L,
+       0x00000008L,0x00100008L,0x00000108L,0x00100108L,
+       0x00001000L,0x00101000L,0x00001100L,0x00101100L,
+       0x00001008L,0x00101008L,0x00001108L,0x00101108L,
+       0x04000000L,0x04100000L,0x04000100L,0x04100100L,
+       0x04000008L,0x04100008L,0x04000108L,0x04100108L,
+       0x04001000L,0x04101000L,0x04001100L,0x04101100L,
+       0x04001008L,0x04101008L,0x04001108L,0x04101108L,
+       0x00020000L,0x00120000L,0x00020100L,0x00120100L,
+       0x00020008L,0x00120008L,0x00020108L,0x00120108L,
+       0x00021000L,0x00121000L,0x00021100L,0x00121100L,
+       0x00021008L,0x00121008L,0x00021108L,0x00121108L,
+       0x04020000L,0x04120000L,0x04020100L,0x04120100L,
+       0x04020008L,0x04120008L,0x04020108L,0x04120108L,
+       0x04021000L,0x04121000L,0x04021100L,0x04121100L,
+       0x04021008L,0x04121008L,0x04021108L,0x04121108L,
+       },{
+       /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
+       0x00000000L,0x10000000L,0x00010000L,0x10010000L,
+       0x00000004L,0x10000004L,0x00010004L,0x10010004L,
+       0x20000000L,0x30000000L,0x20010000L,0x30010000L,
+       0x20000004L,0x30000004L,0x20010004L,0x30010004L,
+       0x00100000L,0x10100000L,0x00110000L,0x10110000L,
+       0x00100004L,0x10100004L,0x00110004L,0x10110004L,
+       0x20100000L,0x30100000L,0x20110000L,0x30110000L,
+       0x20100004L,0x30100004L,0x20110004L,0x30110004L,
+       0x00001000L,0x10001000L,0x00011000L,0x10011000L,
+       0x00001004L,0x10001004L,0x00011004L,0x10011004L,
+       0x20001000L,0x30001000L,0x20011000L,0x30011000L,
+       0x20001004L,0x30001004L,0x20011004L,0x30011004L,
+       0x00101000L,0x10101000L,0x00111000L,0x10111000L,
+       0x00101004L,0x10101004L,0x00111004L,0x10111004L,
+       0x20101000L,0x30101000L,0x20111000L,0x30111000L,
+       0x20101004L,0x30101004L,0x20111004L,0x30111004L,
+       },{
+       /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
+       0x00000000L,0x08000000L,0x00000008L,0x08000008L,
+       0x00000400L,0x08000400L,0x00000408L,0x08000408L,
+       0x00020000L,0x08020000L,0x00020008L,0x08020008L,
+       0x00020400L,0x08020400L,0x00020408L,0x08020408L,
+       0x00000001L,0x08000001L,0x00000009L,0x08000009L,
+       0x00000401L,0x08000401L,0x00000409L,0x08000409L,
+       0x00020001L,0x08020001L,0x00020009L,0x08020009L,
+       0x00020401L,0x08020401L,0x00020409L,0x08020409L,
+       0x02000000L,0x0A000000L,0x02000008L,0x0A000008L,
+       0x02000400L,0x0A000400L,0x02000408L,0x0A000408L,
+       0x02020000L,0x0A020000L,0x02020008L,0x0A020008L,
+       0x02020400L,0x0A020400L,0x02020408L,0x0A020408L,
+       0x02000001L,0x0A000001L,0x02000009L,0x0A000009L,
+       0x02000401L,0x0A000401L,0x02000409L,0x0A000409L,
+       0x02020001L,0x0A020001L,0x02020009L,0x0A020009L,
+       0x02020401L,0x0A020401L,0x02020409L,0x0A020409L,
+       },{
+       /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
+       0x00000000L,0x00000100L,0x00080000L,0x00080100L,
+       0x01000000L,0x01000100L,0x01080000L,0x01080100L,
+       0x00000010L,0x00000110L,0x00080010L,0x00080110L,
+       0x01000010L,0x01000110L,0x01080010L,0x01080110L,
+       0x00200000L,0x00200100L,0x00280000L,0x00280100L,
+       0x01200000L,0x01200100L,0x01280000L,0x01280100L,
+       0x00200010L,0x00200110L,0x00280010L,0x00280110L,
+       0x01200010L,0x01200110L,0x01280010L,0x01280110L,
+       0x00000200L,0x00000300L,0x00080200L,0x00080300L,
+       0x01000200L,0x01000300L,0x01080200L,0x01080300L,
+       0x00000210L,0x00000310L,0x00080210L,0x00080310L,
+       0x01000210L,0x01000310L,0x01080210L,0x01080310L,
+       0x00200200L,0x00200300L,0x00280200L,0x00280300L,
+       0x01200200L,0x01200300L,0x01280200L,0x01280300L,
+       0x00200210L,0x00200310L,0x00280210L,0x00280310L,
+       0x01200210L,0x01200310L,0x01280210L,0x01280310L,
+       },{
+       /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
+       0x00000000L,0x04000000L,0x00040000L,0x04040000L,
+       0x00000002L,0x04000002L,0x00040002L,0x04040002L,
+       0x00002000L,0x04002000L,0x00042000L,0x04042000L,
+       0x00002002L,0x04002002L,0x00042002L,0x04042002L,
+       0x00000020L,0x04000020L,0x00040020L,0x04040020L,
+       0x00000022L,0x04000022L,0x00040022L,0x04040022L,
+       0x00002020L,0x04002020L,0x00042020L,0x04042020L,
+       0x00002022L,0x04002022L,0x00042022L,0x04042022L,
+       0x00000800L,0x04000800L,0x00040800L,0x04040800L,
+       0x00000802L,0x04000802L,0x00040802L,0x04040802L,
+       0x00002800L,0x04002800L,0x00042800L,0x04042800L,
+       0x00002802L,0x04002802L,0x00042802L,0x04042802L,
+       0x00000820L,0x04000820L,0x00040820L,0x04040820L,
+       0x00000822L,0x04000822L,0x00040822L,0x04040822L,
+       0x00002820L,0x04002820L,0x00042820L,0x04042820L,
+       0x00002822L,0x04002822L,0x00042822L,0x04042822L,
+       }};
+
 int des_set_key(const_des_cblock *key, des_key_schedule schedule)
        {
        if (des_check_key)
@@ -164,7 +326,7 @@ int des_set_key(const_des_cblock *key, des_key_schedule schedule)
  */
 int des_set_key_checked(const_des_cblock *key, des_key_schedule schedule)
        {
-       if (!check_parity(key))
+       if (!des_check_key_parity(key))
                return(-1);
        if (des_is_weak_key(key))
                return(-2);
@@ -186,20 +348,7 @@ void des_set_key_unchecked(const_des_cblock *key, des_key_schedule schedule)
        c2l(in,c);
        c2l(in,d);
 
-       /* do PC1 in 60 simple operations */ 
-/*     PERM_OP(d,c,t,4,0x0f0f0f0fL);
-       HPERM_OP(c,t,-2, 0xcccc0000L);
-       HPERM_OP(c,t,-1, 0xaaaa0000L);
-       HPERM_OP(c,t, 8, 0x00ff0000L);
-       HPERM_OP(c,t,-1, 0xaaaa0000L);
-       HPERM_OP(d,t,-8, 0xff000000L);
-       HPERM_OP(d,t, 8, 0x00ff0000L);
-       HPERM_OP(d,t, 2, 0x33330000L);
-       d=((d&0x00aa00aaL)<<7L)|((d&0x55005500L)>>7L)|(d&0xaa55aa55L);
-       d=(d>>8)|((c&0xf0000000L)>>4);
-       c&=0x0fffffffL; */
-
-       /* I now do it in 47 simple operations :-)
+       /* do PC1 in 47 simple operations :-)
         * Thanks to John Fletcher (john_fletcher@lccmail.ocf.llnl.gov)
         * for the inspiration. :-) */
        PERM_OP (d,c,t,4,0x0f0f0f0fL);
@@ -223,9 +372,9 @@ void des_set_key_unchecked(const_des_cblock *key, des_key_schedule schedule)
                /* could be a few less shifts but I am to lazy at this
                 * point in time to investigate */
                s=      des_skb[0][ (c    )&0x3f                ]|
-                       des_skb[1][((c>> 6)&0x03)|((c>> 7L)&0x3c)]|
-                       des_skb[2][((c>>13)&0x0f)|((c>>14L)&0x30)]|
-                       des_skb[3][((c>>20)&0x01)|((c>>21L)&0x06) |
+                       des_skb[1][((c>> 6L)&0x03)|((c>> 7L)&0x3c)]|
+                       des_skb[2][((c>>13L)&0x0f)|((c>>14L)&0x30)]|
+                       des_skb[3][((c>>20L)&0x01)|((c>>21L)&0x06) |
                                                  ((c>>22L)&0x38)];
                t=      des_skb[4][ (d    )&0x3f                ]|
                        des_skb[5][((d>> 7L)&0x03)|((d>> 8L)&0x3c)]|
@@ -245,3 +394,9 @@ int des_key_sched(const_des_cblock *key, des_key_schedule schedule)
        {
        return(des_set_key(key,schedule));
        }
+
+#undef des_fixup_key_parity
+void des_fixup_key_parity(des_cblock *key)
+       {
+       des_set_odd_parity(key);
+       }
index ba686d8..e69de29 100644 (file)
@@ -1,198 +0,0 @@
-#!/usr/local/bin/perl
-
-sub lab_shift
-       {
-       local(*a,$n)=@_;
-       local(@r,$i,$j,$k,$d,@z);
-
-       @r=&shift(*a,$n);
-       foreach $i (0 .. 31)
-               {
-               @z=split(/\^/,$r[$i]);
-               for ($j=0; $j <= $#z; $j++)
-                       {
-                       ($d)=($z[$j] =~ /^(..)/);
-                       ($k)=($z[$j] =~ /\[(.*)\]$/);
-                       $k.=",$n" if ($k ne "");
-                       $k="$n"   if ($k eq "");
-                       $d="$d[$k]";
-                       $z[$j]=$d;
-                       }
-               $r[$i]=join('^',@z);
-               }
-       return(@r);
-       }
-
-sub shift
-       {
-       local(*a,$n)=@_;
-       local(@f);
-
-       if ($n > 0)
-               {
-               @f=&shiftl(*a,$n);
-               }
-       else
-               {
-               @f=&shiftr(*a,-$n);
-               }
-       return(@f);
-       }
-
-sub rotate
-       {
-       local(*a,$n)=@_;
-       local(@f);
-
-       if ($n > 0)
-               { @f=&rotatel(*a,$n); }
-       else
-               { @f=&rotater(*a,-$n); }
-       return(@f);
-       }
-
-sub rotater
-       {
-       local(*a,$n)=@_;
-       local(@f,@g);
-
-       @f=&shiftr(*a,$n);
-       @g=&shiftl(*a,32-$n);
-       $#f=31;
-       $#g=31;
-       return(&or(*f,*g));
-       }
-
-sub rotatel
-       {
-       local(*a,$n)=@_;
-       local(@f,@g);
-
-       @f=&shiftl(*a,$n);
-       @g=&shiftr(*a,32-$n);
-       $#f=31;
-       $#g=31;
-       return(&or(*f,*g));
-       }
-
-sub shiftr
-       {
-       local(*a,$n)=@_;
-       local(@r,$i);
-
-       $#r=31;
-       foreach $i (0 .. 31)
-               {
-               if (($i+$n) > 31)
-                       {
-                       $r[$i]="--";
-                       }
-               else
-                       {
-                       $r[$i]=$a[$i+$n];
-                       }
-               }
-       return(@r);
-       }
-
-sub shiftl
-       {
-       local(*a,$n)=@_;
-       local(@r,$i);
-
-       $#r=31;
-       foreach $i (0 .. 31)
-               {
-               if ($i < $n)
-                       {
-                       $r[$i]="--";
-                       }
-               else
-                       {
-                       $r[$i]=$a[$i-$n];
-                       }
-               }
-       return(@r);
-       }
-
-sub printit
-       {
-       local(@a)=@_;
-       local($i);
-
-       foreach $i (0 .. 31)
-               {
-               printf "%2s  ",$a[$i];
-               print "\n" if (($i%8) == 7);
-               }
-       print "\n";
-       }
-
-sub xor
-       {
-       local(*a,*b)=@_;
-       local(@r,$i);
-
-       $#r=31;
-       foreach $i (0 .. 31)
-               {
-               $r[$i]=&compress($a[$i].'^'.$b[$i]);
-#              $r[$i]=$a[$i]."^".$b[$i];
-               }
-       return(@r);
-       }
-
-sub and
-       {
-       local(*a,$m)=@_;
-       local(@r,$i);
-
-       $#r=31;
-       foreach $i (0 .. 31)
-               {
-               $r[$i]=(($m & (1<<$i))?($a[$i]):('--'));
-               }
-       return(@r);
-       }
-
-sub or
-       {
-       local(*a,*b)=@_;
-       local(@r,$i);
-
-       $#r=31;
-       foreach $i (0 .. 31)
-               {
-               $r[$i]='--'   if (($a[$i] eq '--') && ($b[$i] eq '--'));
-               $r[$i]=$a[$i] if (($a[$i] ne '--') && ($b[$i] eq '--'));
-               $r[$i]=$b[$i] if (($a[$i] eq '--') && ($b[$i] ne '--'));
-               $r[$i]='++'   if (($a[$i] ne '--') && ($b[$i] ne '--'));
-               }
-       return(@r);
-       }
-
-sub compress
-       {
-       local($s)=@_;
-       local($_,$i,@a,%a,$r);
-
-       $s =~ s/\^\^/\^/g;
-       $s =~ s/^\^//;
-       $s =~ s/\^$//;
-       @a=split(/\^/,$s);
-
-       while ($#a >= 0)
-               {
-               $_=shift(@a);
-               next unless /\d/;
-               $a{$_}++;
-               }
-       foreach $i (sort keys %a)
-               {
-               next if ($a{$i}%2 == 0);
-               $r.="$i^";
-               }
-       chop($r);
-       return($r);
-       }
-1;
index f2ade88..e69de29 100644 (file)
@@ -1,204 +0,0 @@
-/* crypto/des/sk.h */
-/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
- * All rights reserved.
- *
- * This package is an SSL implementation written
- * by Eric Young (eay@cryptsoft.com).
- * The implementation was written so as to conform with Netscapes SSL.
- * 
- * This library is free for commercial and non-commercial use as long as
- * the following conditions are aheared to.  The following conditions
- * apply to all code found in this distribution, be it the RC4, RSA,
- * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
- * included with this distribution is covered by the same copyright terms
- * except that the holder is Tim Hudson (tjh@cryptsoft.com).
- * 
- * Copyright remains Eric Young's, and as such any Copyright notices in
- * the code are not to be removed.
- * If this package is used in a product, Eric Young should be given attribution
- * as the author of the parts of the library used.
- * This can be in the form of a textual message at program startup or
- * in documentation (online or textual) provided with the package.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *    "This product includes cryptographic software written by
- *     Eric Young (eay@cryptsoft.com)"
- *    The word 'cryptographic' can be left out if the rouines from the library
- *    being used are not cryptographic related :-).
- * 4. If you include any Windows specific code (or a derivative thereof) from 
- *    the apps directory (application code) you must include an acknowledgement:
- *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
- * 
- * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * 
- * The licence and distribution terms for any publically available version or
- * derivative of this code cannot be changed.  i.e. this code cannot simply be
- * copied and put under another distribution licence
- * [including the GNU Public Licence.]
- */
-
-static const DES_LONG des_skb[8][64]={
-{
-/* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
-0x00000000L,0x00000010L,0x20000000L,0x20000010L,
-0x00010000L,0x00010010L,0x20010000L,0x20010010L,
-0x00000800L,0x00000810L,0x20000800L,0x20000810L,
-0x00010800L,0x00010810L,0x20010800L,0x20010810L,
-0x00000020L,0x00000030L,0x20000020L,0x20000030L,
-0x00010020L,0x00010030L,0x20010020L,0x20010030L,
-0x00000820L,0x00000830L,0x20000820L,0x20000830L,
-0x00010820L,0x00010830L,0x20010820L,0x20010830L,
-0x00080000L,0x00080010L,0x20080000L,0x20080010L,
-0x00090000L,0x00090010L,0x20090000L,0x20090010L,
-0x00080800L,0x00080810L,0x20080800L,0x20080810L,
-0x00090800L,0x00090810L,0x20090800L,0x20090810L,
-0x00080020L,0x00080030L,0x20080020L,0x20080030L,
-0x00090020L,0x00090030L,0x20090020L,0x20090030L,
-0x00080820L,0x00080830L,0x20080820L,0x20080830L,
-0x00090820L,0x00090830L,0x20090820L,0x20090830L,
-},{
-/* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */
-0x00000000L,0x02000000L,0x00002000L,0x02002000L,
-0x00200000L,0x02200000L,0x00202000L,0x02202000L,
-0x00000004L,0x02000004L,0x00002004L,0x02002004L,
-0x00200004L,0x02200004L,0x00202004L,0x02202004L,
-0x00000400L,0x02000400L,0x00002400L,0x02002400L,
-0x00200400L,0x02200400L,0x00202400L,0x02202400L,
-0x00000404L,0x02000404L,0x00002404L,0x02002404L,
-0x00200404L,0x02200404L,0x00202404L,0x02202404L,
-0x10000000L,0x12000000L,0x10002000L,0x12002000L,
-0x10200000L,0x12200000L,0x10202000L,0x12202000L,
-0x10000004L,0x12000004L,0x10002004L,0x12002004L,
-0x10200004L,0x12200004L,0x10202004L,0x12202004L,
-0x10000400L,0x12000400L,0x10002400L,0x12002400L,
-0x10200400L,0x12200400L,0x10202400L,0x12202400L,
-0x10000404L,0x12000404L,0x10002404L,0x12002404L,
-0x10200404L,0x12200404L,0x10202404L,0x12202404L,
-},{
-/* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */
-0x00000000L,0x00000001L,0x00040000L,0x00040001L,
-0x01000000L,0x01000001L,0x01040000L,0x01040001L,
-0x00000002L,0x00000003L,0x00040002L,0x00040003L,
-0x01000002L,0x01000003L,0x01040002L,0x01040003L,
-0x00000200L,0x00000201L,0x00040200L,0x00040201L,
-0x01000200L,0x01000201L,0x01040200L,0x01040201L,
-0x00000202L,0x00000203L,0x00040202L,0x00040203L,
-0x01000202L,0x01000203L,0x01040202L,0x01040203L,
-0x08000000L,0x08000001L,0x08040000L,0x08040001L,
-0x09000000L,0x09000001L,0x09040000L,0x09040001L,
-0x08000002L,0x08000003L,0x08040002L,0x08040003L,
-0x09000002L,0x09000003L,0x09040002L,0x09040003L,
-0x08000200L,0x08000201L,0x08040200L,0x08040201L,
-0x09000200L,0x09000201L,0x09040200L,0x09040201L,
-0x08000202L,0x08000203L,0x08040202L,0x08040203L,
-0x09000202L,0x09000203L,0x09040202L,0x09040203L,
-},{
-/* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */
-0x00000000L,0x00100000L,0x00000100L,0x00100100L,
-0x00000008L,0x00100008L,0x00000108L,0x00100108L,
-0x00001000L,0x00101000L,0x00001100L,0x00101100L,
-0x00001008L,0x00101008L,0x00001108L,0x00101108L,
-0x04000000L,0x04100000L,0x04000100L,0x04100100L,
-0x04000008L,0x04100008L,0x04000108L,0x04100108L,
-0x04001000L,0x04101000L,0x04001100L,0x04101100L,
-0x04001008L,0x04101008L,0x04001108L,0x04101108L,
-0x00020000L,0x00120000L,0x00020100L,0x00120100L,
-0x00020008L,0x00120008L,0x00020108L,0x00120108L,
-0x00021000L,0x00121000L,0x00021100L,0x00121100L,
-0x00021008L,0x00121008L,0x00021108L,0x00121108L,
-0x04020000L,0x04120000L,0x04020100L,0x04120100L,
-0x04020008L,0x04120008L,0x04020108L,0x04120108L,
-0x04021000L,0x04121000L,0x04021100L,0x04121100L,
-0x04021008L,0x04121008L,0x04021108L,0x04121108L,
-},{
-/* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
-0x00000000L,0x10000000L,0x00010000L,0x10010000L,
-0x00000004L,0x10000004L,0x00010004L,0x10010004L,
-0x20000000L,0x30000000L,0x20010000L,0x30010000L,
-0x20000004L,0x30000004L,0x20010004L,0x30010004L,
-0x00100000L,0x10100000L,0x00110000L,0x10110000L,
-0x00100004L,0x10100004L,0x00110004L,0x10110004L,
-0x20100000L,0x30100000L,0x20110000L,0x30110000L,
-0x20100004L,0x30100004L,0x20110004L,0x30110004L,
-0x00001000L,0x10001000L,0x00011000L,0x10011000L,
-0x00001004L,0x10001004L,0x00011004L,0x10011004L,
-0x20001000L,0x30001000L,0x20011000L,0x30011000L,
-0x20001004L,0x30001004L,0x20011004L,0x30011004L,
-0x00101000L,0x10101000L,0x00111000L,0x10111000L,
-0x00101004L,0x10101004L,0x00111004L,0x10111004L,
-0x20101000L,0x30101000L,0x20111000L,0x30111000L,
-0x20101004L,0x30101004L,0x20111004L,0x30111004L,
-},{
-/* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
-0x00000000L,0x08000000L,0x00000008L,0x08000008L,
-0x00000400L,0x08000400L,0x00000408L,0x08000408L,
-0x00020000L,0x08020000L,0x00020008L,0x08020008L,
-0x00020400L,0x08020400L,0x00020408L,0x08020408L,
-0x00000001L,0x08000001L,0x00000009L,0x08000009L,
-0x00000401L,0x08000401L,0x00000409L,0x08000409L,
-0x00020001L,0x08020001L,0x00020009L,0x08020009L,
-0x00020401L,0x08020401L,0x00020409L,0x08020409L,
-0x02000000L,0x0A000000L,0x02000008L,0x0A000008L,
-0x02000400L,0x0A000400L,0x02000408L,0x0A000408L,
-0x02020000L,0x0A020000L,0x02020008L,0x0A020008L,
-0x02020400L,0x0A020400L,0x02020408L,0x0A020408L,
-0x02000001L,0x0A000001L,0x02000009L,0x0A000009L,
-0x02000401L,0x0A000401L,0x02000409L,0x0A000409L,
-0x02020001L,0x0A020001L,0x02020009L,0x0A020009L,
-0x02020401L,0x0A020401L,0x02020409L,0x0A020409L,
-},{
-/* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
-0x00000000L,0x00000100L,0x00080000L,0x00080100L,
-0x01000000L,0x01000100L,0x01080000L,0x01080100L,
-0x00000010L,0x00000110L,0x00080010L,0x00080110L,
-0x01000010L,0x01000110L,0x01080010L,0x01080110L,
-0x00200000L,0x00200100L,0x00280000L,0x00280100L,
-0x01200000L,0x01200100L,0x01280000L,0x01280100L,
-0x00200010L,0x00200110L,0x00280010L,0x00280110L,
-0x01200010L,0x01200110L,0x01280010L,0x01280110L,
-0x00000200L,0x00000300L,0x00080200L,0x00080300L,
-0x01000200L,0x01000300L,0x01080200L,0x01080300L,
-0x00000210L,0x00000310L,0x00080210L,0x00080310L,
-0x01000210L,0x01000310L,0x01080210L,0x01080310L,
-0x00200200L,0x00200300L,0x00280200L,0x00280300L,
-0x01200200L,0x01200300L,0x01280200L,0x01280300L,
-0x00200210L,0x00200310L,0x00280210L,0x00280310L,
-0x01200210L,0x01200310L,0x01280210L,0x01280310L,
-},{
-/* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
-0x00000000L,0x04000000L,0x00040000L,0x04040000L,
-0x00000002L,0x04000002L,0x00040002L,0x04040002L,
-0x00002000L,0x04002000L,0x00042000L,0x04042000L,
-0x00002002L,0x04002002L,0x00042002L,0x04042002L,
-0x00000020L,0x04000020L,0x00040020L,0x04040020L,
-0x00000022L,0x04000022L,0x00040022L,0x04040022L,
-0x00002020L,0x04002020L,0x00042020L,0x04042020L,
-0x00002022L,0x04002022L,0x00042022L,0x04042022L,
-0x00000800L,0x04000800L,0x00040800L,0x04040800L,
-0x00000802L,0x04000802L,0x00040802L,0x04040802L,
-0x00002800L,0x04002800L,0x00042800L,0x04042800L,
-0x00002802L,0x04002802L,0x00042802L,0x04042802L,
-0x00000820L,0x04000820L,0x00040820L,0x04040820L,
-0x00000822L,0x04000822L,0x00040822L,0x04040822L,
-0x00002820L,0x04002820L,0x00042820L,0x04042820L,
-0x00002822L,0x04002822L,0x00042822L,0x04042822L,
-}};
index 01a165a..e69de29 100644 (file)
@@ -1,167 +0,0 @@
-#!/usr/local/bin/perl
-
-# des.pl tesing code
-
-require 'des.pl';
-
-$num_tests=34;
-@key_data=(
-       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-       0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-       0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-       0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
-       0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,
-       0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
-       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-       0xFE,0xDC,0xBA,0x98,0x76,0x54,0x32,0x10,
-       0x7C,0xA1,0x10,0x45,0x4A,0x1A,0x6E,0x57,
-       0x01,0x31,0xD9,0x61,0x9D,0xC1,0x37,0x6E,
-       0x07,0xA1,0x13,0x3E,0x4A,0x0B,0x26,0x86,
-       0x38,0x49,0x67,0x4C,0x26,0x02,0x31,0x9E,
-       0x04,0xB9,0x15,0xBA,0x43,0xFE,0xB5,0xB6,
-       0x01,0x13,0xB9,0x70,0xFD,0x34,0xF2,0xCE,
-       0x01,0x70,0xF1,0x75,0x46,0x8F,0xB5,0xE6,
-       0x43,0x29,0x7F,0xAD,0x38,0xE3,0x73,0xFE,
-       0x07,0xA7,0x13,0x70,0x45,0xDA,0x2A,0x16,
-       0x04,0x68,0x91,0x04,0xC2,0xFD,0x3B,0x2F,
-       0x37,0xD0,0x6B,0xB5,0x16,0xCB,0x75,0x46,
-       0x1F,0x08,0x26,0x0D,0x1A,0xC2,0x46,0x5E,
-       0x58,0x40,0x23,0x64,0x1A,0xBA,0x61,0x76,
-       0x02,0x58,0x16,0x16,0x46,0x29,0xB0,0x07,
-       0x49,0x79,0x3E,0xBC,0x79,0xB3,0x25,0x8F,
-       0x4F,0xB0,0x5E,0x15,0x15,0xAB,0x73,0xA7,
-       0x49,0xE9,0x5D,0x6D,0x4C,0xA2,0x29,0xBF,
-       0x01,0x83,0x10,0xDC,0x40,0x9B,0x26,0xD6,
-       0x1C,0x58,0x7F,0x1C,0x13,0x92,0x4F,0xEF,
-       0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
-       0x1F,0x1F,0x1F,0x1F,0x0E,0x0E,0x0E,0x0E,
-       0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1,0xFE,
-       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-       0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-       0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,
-       0xFE,0xDC,0xBA,0x98,0x76,0x54,0x32,0x10,
-       );
-
-@plain_data=(
-       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-       0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-       0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
-       0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
-       0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
-       0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,
-       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-       0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,
-       0x01,0xA1,0xD6,0xD0,0x39,0x77,0x67,0x42,
-       0x5C,0xD5,0x4C,0xA8,0x3D,0xEF,0x57,0xDA,
-       0x02,0x48,0xD4,0x38,0x06,0xF6,0x71,0x72,
-       0x51,0x45,0x4B,0x58,0x2D,0xDF,0x44,0x0A,
-       0x42,0xFD,0x44,0x30,0x59,0x57,0x7F,0xA2,
-       0x05,0x9B,0x5E,0x08,0x51,0xCF,0x14,0x3A,
-       0x07,0x56,0xD8,0xE0,0x77,0x47,0x61,0xD2,
-       0x76,0x25,0x14,0xB8,0x29,0xBF,0x48,0x6A,
-       0x3B,0xDD,0x11,0x90,0x49,0x37,0x28,0x02,
-       0x26,0x95,0x5F,0x68,0x35,0xAF,0x60,0x9A,
-       0x16,0x4D,0x5E,0x40,0x4F,0x27,0x52,0x32,
-       0x6B,0x05,0x6E,0x18,0x75,0x9F,0x5C,0xCA,
-       0x00,0x4B,0xD6,0xEF,0x09,0x17,0x60,0x62,
-       0x48,0x0D,0x39,0x00,0x6E,0xE7,0x62,0xF2,
-       0x43,0x75,0x40,0xC8,0x69,0x8F,0x3C,0xFA,
-       0x07,0x2D,0x43,0xA0,0x77,0x07,0x52,0x92,
-       0x02,0xFE,0x55,0x77,0x81,0x17,0xF1,0x2A,
-       0x1D,0x9D,0x5C,0x50,0x18,0xF7,0x28,0xC2,
-       0x30,0x55,0x32,0x28,0x6D,0x6F,0x29,0x5A,
-       0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,
-       0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,
-       0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,
-       0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
-       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-       0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF);
-
-@cipher_data=(
-       0x8C,0xA6,0x4D,0xE9,0xC1,0xB1,0x23,0xA7,
-       0x73,0x59,0xB2,0x16,0x3E,0x4E,0xDC,0x58,
-       0x95,0x8E,0x6E,0x62,0x7A,0x05,0x55,0x7B,
-       0xF4,0x03,0x79,0xAB,0x9E,0x0E,0xC5,0x33,
-       0x17,0x66,0x8D,0xFC,0x72,0x92,0x53,0x2D,
-       0x8A,0x5A,0xE1,0xF8,0x1A,0xB8,0xF2,0xDD,
-       0x8C,0xA6,0x4D,0xE9,0xC1,0xB1,0x23,0xA7,
-       0xED,0x39,0xD9,0x50,0xFA,0x74,0xBC,0xC4,
-       0x69,0x0F,0x5B,0x0D,0x9A,0x26,0x93,0x9B,
-       0x7A,0x38,0x9D,0x10,0x35,0x4B,0xD2,0x71,
-       0x86,0x8E,0xBB,0x51,0xCA,0xB4,0x59,0x9A,
-       0x71,0x78,0x87,0x6E,0x01,0xF1,0x9B,0x2A,
-       0xAF,0x37,0xFB,0x42,0x1F,0x8C,0x40,0x95,
-       0x86,0xA5,0x60,0xF1,0x0E,0xC6,0xD8,0x5B,
-       0x0C,0xD3,0xDA,0x02,0x00,0x21,0xDC,0x09,
-       0xEA,0x67,0x6B,0x2C,0xB7,0xDB,0x2B,0x7A,
-       0xDF,0xD6,0x4A,0x81,0x5C,0xAF,0x1A,0x0F,
-       0x5C,0x51,0x3C,0x9C,0x48,0x86,0xC0,0x88,
-       0x0A,0x2A,0xEE,0xAE,0x3F,0xF4,0xAB,0x77,
-       0xEF,0x1B,0xF0,0x3E,0x5D,0xFA,0x57,0x5A,
-       0x88,0xBF,0x0D,0xB6,0xD7,0x0D,0xEE,0x56,
-       0xA1,0xF9,0x91,0x55,0x41,0x02,0x0B,0x56,
-       0x6F,0xBF,0x1C,0xAF,0xCF,0xFD,0x05,0x56,
-       0x2F,0x22,0xE4,0x9B,0xAB,0x7C,0xA1,0xAC,
-       0x5A,0x6B,0x61,0x2C,0xC2,0x6C,0xCE,0x4A,
-       0x5F,0x4C,0x03,0x8E,0xD1,0x2B,0x2E,0x41,
-       0x63,0xFA,0xC0,0xD0,0x34,0xD9,0xF7,0x93,
-       0x61,0x7B,0x3A,0x0C,0xE8,0xF0,0x71,0x00,
-       0xDB,0x95,0x86,0x05,0xF8,0xC8,0xC6,0x06,
-       0xED,0xBF,0xD1,0xC6,0x6C,0x29,0xCC,0xC7,
-       0x35,0x55,0x50,0xB2,0x15,0x0E,0x24,0x51,
-       0xCA,0xAA,0xAF,0x4D,0xEA,0xF1,0xDB,0xAE,
-       0xD5,0xD4,0x4F,0xF7,0x20,0x68,0x3D,0x0D,
-       0x2A,0x2B,0xB0,0x08,0xDF,0x97,0xC2,0xF2);
-
-print "Doing ecb tests\n";
-for ($i=0; $i<$num_tests; $i++)
-       {
-       printf "Doing test $i\n";
-       $key =pack("C8",splice(@key_data   ,0,8));
-       $data=pack("C8",splice(@plain_data ,0,8));
-       $res =pack("C8",splice(@cipher_data,0,8));
-
-       @ks=  &des_set_key($key);
-       $out1= &des_ecb_encrypt(*ks,1,$data);
-       $out2= &des_ecb_encrypt(*ks,0,$out1);
-       $out3= &des_ecb_encrypt(*ks,0,$res);
-       &eprint("encryption failure",$res,$out1)
-               if ($out1 ne $res);
-       &eprint("encryption/decryption failure",$data,$out2)
-               if ($out2 ne $data);
-       &eprint("decryption failure",$data,$out3)
-               if ($data ne $out3);
-       }
-print "Done\n";
-
-print "doing speed test over 30 seconds\n";
-$SIG{'ALRM'}='done';
-sub done {$done=1;}
-$done=0;
-
-$count=0;
-$d=pack("C8",0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef);
-@ks=  &des_set_key($d);
-alarm(30);
-$start=(times)[0];
-while (!$done)
-       {
-       $count++;
-       $d=&des_ecb_encrypt(*ks,1,$d);
-       }
-$end=(times)[0];
-$t=$end-$start;
-printf "$count DESs in %.2f seconds is %.2f DESs/sec or %.2f bytes/sec\n",
-       1.0*$t,1.0*$count/$t,$count*8.0/$t;
-
-sub eprint
-       {
-       local($s,$c,$e)=@_;
-       local(@k);
-
-       @k=unpack("C8",$c);
-       printf "%02x%02x%02x%02x %02x%02x%02x%02x - ",unpack("C8",$c);
-       printf "%02x%02x%02x%02x %02x%02x%02x%02x :",unpack("C8",$e);
-       print " $s\n";
-       }
index 0348bd2..ff2d168 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index 38e4af9..2b3ab3a 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index ab7f38f..5aef2d5 100644 (file)
@@ -84,7 +84,8 @@ int DSA_generate_key(DSA *dsa)
        i=BN_num_bits(dsa->q);
        for (;;)
                {
-               BN_rand(priv_key,i,1,0);
+               if (!BN_rand(priv_key,i,1,0))
+                       goto err;
                if (BN_cmp(priv_key,dsa->q) >= 0)
                        BN_sub(priv_key,priv_key,dsa->q);
                if (!BN_is_zero(priv_key)) break;
index 93c64cb..eb8c76a 100644 (file)
  * copied and put under another distribution licence
  * [including the GNU Public Licence.]
  */
+/* ====================================================================
+ * Copyright (c) 1998-2000 The OpenSSL Project.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer. 
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. All advertising materials mentioning features or use of this
+ *    software must display the following acknowledgment:
+ *    "This product includes software developed by the OpenSSL Project
+ *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
+ *
+ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
+ *    endorse or promote products derived from this software without
+ *    prior written permission. For written permission, please contact
+ *    openssl-core@openssl.org.
+ *
+ * 5. Products derived from this software may not be called "OpenSSL"
+ *    nor may "OpenSSL" appear in their names without prior written
+ *    permission of the OpenSSL Project.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ *    acknowledgment:
+ *    "This product includes software developed by the OpenSSL Project
+ *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This product includes cryptographic software written by Eric Young
+ * (eay@cryptsoft.com).  This product includes software written by Tim
+ * Hudson (tjh@cryptsoft.com).
+ *
+ */
 
 #include <stdio.h>
 #include <stdarg.h>
+#include <string.h>
 #include <openssl/lhash.h>
 #include <openssl/crypto.h>
 #include "cryptlib.h"
@@ -154,6 +208,54 @@ static ERR_STRING_DATA ERR_str_reasons[]=
 
 {0,NULL},
        };
+
+
+#define NUM_SYS_STR_REASONS 127
+#define LEN_SYS_STR_REASON 32
+
+static ERR_STRING_DATA SYS_str_reasons[NUM_SYS_STR_REASONS + 1];
+/* SYS_str_reasons is filled with copies of strerror() results at
+ * initialization.
+ * 'errno' values up to 127 should cover all usual errors,
+ * others will be displayed numerically by ERR_error_string.
+ * It is crucial that we have something for each reason code
+ * that occurs in ERR_str_reasons, or bogus reason strings
+ * will be returned for SYSerr(), which always gets an errno
+ * value and never one of those 'standard' reason codes. */
+
+static void build_SYS_str_reasons()
+       {
+       /* Malloc cannot be used here, use static storage instead */
+       static char strerror_tab[NUM_SYS_STR_REASONS][LEN_SYS_STR_REASON];
+       int i;
+
+       CRYPTO_w_lock(CRYPTO_LOCK_ERR_HASH);
+
+       for (i = 1; i <= NUM_SYS_STR_REASONS; i++)
+               {
+               ERR_STRING_DATA *str = &SYS_str_reasons[i - 1];
+
+               str->error = (unsigned long)i;
+               if (str->string == NULL)
+                       {
+                       char (*dest)[LEN_SYS_STR_REASON] = &(strerror_tab[i - 1]);
+                       char *src = strerror(i);
+                       if (src != NULL)
+                               {
+                               strncpy(*dest, src, sizeof *dest);
+                               (*dest)[sizeof *dest - 1] = '\0';
+                               str->string = *dest;
+                               }
+                       }
+               if (str->string == NULL)
+                       str->string = "unknown";
+               }
+
+       /* Now we still have SYS_str_reasons[NUM_SYS_STR_REASONS] = {0, NULL},
+        * as required by ERR_load_strings. */
+
+       CRYPTO_w_unlock(CRYPTO_LOCK_ERR_HASH);
+       }
 #endif
 
 #define err_clear_data(p,i) \
@@ -191,14 +293,16 @@ void ERR_load_ERR_strings(void)
                        CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
                        return;
                        }
-               init=0;
                CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
 
 #ifndef NO_ERR
                ERR_load_strings(0,ERR_str_libraries);
                ERR_load_strings(0,ERR_str_reasons);
                ERR_load_strings(ERR_LIB_SYS,ERR_str_functs);
+               build_SYS_str_reasons();
+               ERR_load_strings(ERR_LIB_SYS,SYS_str_reasons);
 #endif
+               init=0;
                }
        }
 
index 97953a0..fc149cb 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index d5e6f58..4ab091f 100644 (file)
@@ -133,7 +133,7 @@ EVP_PKEY *EVP_PKCS82PKEY (PKCS8_PRIV_KEY_INFO *p8)
                     * SEQUENCE {parameters, priv_key}
                     * SEQUENCE {pub_key, priv_key}
                     */
-                     
+
                    t1 = (ASN1_TYPE *)sk_value(ndsa, 0);
                    t2 = (ASN1_TYPE *)sk_value(ndsa, 1);
                    if(t1->type == V_ASN1_SEQUENCE) {
@@ -152,7 +152,14 @@ EVP_PKEY *EVP_PKCS82PKEY (PKCS8_PRIV_KEY_INFO *p8)
                        goto dsaerr;
                    }
                    privkey = t2->value.integer;
-               } else if (!(privkey=d2i_ASN1_INTEGER (NULL, &p, pkeylen))) {
+               } else {
+                       if (!(privkey=d2i_ASN1_INTEGER (NULL, &p, pkeylen))) {
+                               EVPerr(EVP_F_EVP_PKCS82PKEY, EVP_R_DECODE_ERROR);
+                               goto dsaerr;
+                       }
+                       param = p8->pkeyalg->parameter;
+               }
+               if (!param || (param->type != V_ASN1_SEQUENCE)) {
                        EVPerr(EVP_F_EVP_PKCS82PKEY, EVP_R_DECODE_ERROR);
                        goto dsaerr;
                }
@@ -186,7 +193,8 @@ EVP_PKEY *EVP_PKCS82PKEY (PKCS8_PRIV_KEY_INFO *p8)
 
                EVP_PKEY_assign_DSA(pkey, dsa);
                BN_CTX_free (ctx);
-               sk_pop_free(ndsa, ASN1_TYPE_free);
+               if(ndsa) sk_pop_free(ndsa, ASN1_TYPE_free);
+               else ASN1_INTEGER_free(privkey);
                break;
                dsaerr:
                BN_CTX_free (ctx);
index 3e8f460..620f43f 100644 (file)
@@ -114,5 +114,10 @@ void EVP_cleanup(void)
        {
        OBJ_NAME_cleanup(OBJ_NAME_TYPE_CIPHER_METH);
        OBJ_NAME_cleanup(OBJ_NAME_TYPE_MD_METH);
+       /* The above calls will only clean out the contents of the name
+          hash table, but not the hash table itself.  The following line
+          does that part.  -- Richard Levitte */
+       OBJ_NAME_cleanup(-1);
+
        EVP_PBE_cleanup();
        }
index 23b7c98..e1ec79e 100644 (file)
@@ -88,9 +88,11 @@ void HMAC_Init(HMAC_CTX *ctx, const void *key, int len,
                else
                        {
                        memcpy(ctx->key,key,len);
-                       memset(&(ctx->key[len]),0,sizeof(ctx->key)-len);
                        ctx->key_length=len;
                        }
+               if(ctx->key_length != HMAC_MAX_MD_CBLOCK)
+                       memset(&ctx->key[ctx->key_length], 0,
+                               HMAC_MAX_MD_CBLOCK - ctx->key_length);
                }
 
        if (reset)      
index 6a340a2..7eb92a1 100644 (file)
@@ -159,7 +159,7 @@ void lh_free(LHASH *lh)
        unsigned int i;
        LHASH_NODE *n,*nn;
 
-       if(lh == NULL)
+       if (lh == NULL)
            return;
 
        for (i=0; i<lh->num_nodes; i++)
@@ -422,21 +422,6 @@ static LHASH_NODE **getrn(LHASH *lh, void *data, unsigned long *rhash)
        return(ret);
        }
 
-/*
-unsigned long lh_strhash(char *str)
-       {
-       int i,l;
-       unsigned long ret=0;
-       unsigned short *s;
-
-       if (str == NULL) return(0);
-       l=(strlen(str)+1)/2;
-       s=(unsigned short *)str;
-       for (i=0; i<l; i++)
-               ret^=(s[i]<<(i&0x0f));
-       return(ret);
-       } */
-
 /* The following hash seems to work very well on normal text strings
  * no collisions on /usr/dict/words and it distributes on %2^n quite
  * well, not as good as MD5, but still good.
@@ -470,3 +455,7 @@ unsigned long lh_strhash(const char *c)
        return((ret>>16)^ret);
        }
 
+unsigned long lh_num_items(LHASH *lh)
+       {
+       return lh ? lh->num_items : 0;
+       }
index 6f6eeb2..d315fd9 100644 (file)
@@ -124,6 +124,7 @@ void *lh_retrieve(LHASH *lh, void *data);
     void lh_doall(LHASH *lh, void (*func)(/*void *b*/));
 void lh_doall_arg(LHASH *lh, void (*func)(/*void *a,void *b*/),void *arg);
 unsigned long lh_strhash(const char *c);
+unsigned long lh_num_items(LHASH *lh);
 
 #ifndef NO_FP_API
 void lh_stats(LHASH *lh, FILE *out);
index d50f967..45fbd04 100644 (file)
@@ -55,7 +55,7 @@ lib:    $(LIBOBJ)
 
 # elf
 asm/mx86-elf.o: asm/mx86unix.cpp
-       $(CPP) -DELF asm/mx86unix.cpp | as -o asm/mx86-elf.o
+       $(CPP) -DELF -x c asm/mx86unix.cpp | as -o asm/mx86-elf.o
 
 # solaris
 asm/mx86-sol.o: asm/mx86unix.cpp
@@ -71,7 +71,7 @@ asm/mx86-out.o: asm/mx86unix.cpp
 asm/mx86bsdi.o: asm/mx86unix.cpp
        $(CPP) -DBSDI asm/mx86unix.cpp | sed 's/ :/:/' | as -o asm/mx86bsdi.o
 
-asm/mx86unix.cpp: asm/md5-586.pl
+asm/mx86unix.cpp: asm/md5-586.pl ../perlasm/x86asm.pl
        (cd asm; $(PERL) md5-586.pl cpp >mx86unix.cpp)
 
 asm/md5-sparcv8plus.o: asm/md5-sparcv9.S
index d21c72f..e69de29 100644 (file)
@@ -1,110 +0,0 @@
-# Targets
-# make          - twidle the options yourself :-)
-# make cc       - standard cc options
-# make gcc      - standard gcc options
-# make x86-elf  - linux-elf etc
-# make x86-out  - linux-a.out, FreeBSD etc
-# make x86-solaris
-# make x86-bdsi
-
-DIR=    md5
-TOP=    .
-CC=     gcc
-CFLAG= -O3 -fomit-frame-pointer
-
-CPP=    $(CC) -E
-INCLUDES=
-INSTALLTOP=/usr/local/lib
-MAKE=           make
-MAKEDEPEND=     makedepend
-MAKEFILE=       Makefile.uni
-AR=             ar r
-RANLIB=         ranlib
-
-MD5_ASM_OBJ=
-
-CFLAGS= $(INCLUDES) $(CFLAG)
-
-GENERAL=Makefile
-TEST=md5test
-APPS=md5
-
-LIB=libmd5.a
-LIBSRC=md5_dgst.c md5_one.c
-LIBOBJ=md5_dgst.o md5_one.o $(MD5_ASM_OBJ)
-
-SRC= $(LIBSRC)
-
-EXHEADER= md5.h
-HEADER= md5_locl.h $(EXHEADER)
-
-ALL=    $(GENERAL) $(SRC) $(HEADER)
-
-all:    $(LIB) $(TEST) $(APPS)
-
-$(LIB):    $(LIBOBJ)
-       $(AR) $(LIB) $(LIBOBJ)
-       $(RANLIB) $(LIB)
-
-# elf
-asm/mx86-elf.o: asm/mx86unix.cpp
-       $(CPP) -DELF asm/mx86unix.cpp | as -o asm/mx86-elf.o
-
-# solaris
-asm/mx86-sol.o: asm/mx86unix.cpp
-       $(CC) -E -DSOL asm/mx86unix.cpp | sed 's/^#.*//' > asm/mx86-sol.s
-       as -o asm/mx86-sol.o asm/mx86-sol.s
-       rm -f asm/mx86-sol.s
-
-# a.out
-asm/mx86-out.o: asm/mx86unix.cpp
-       $(CPP) -DOUT asm/mx86unix.cpp | as -o asm/mx86-out.o
-
-# bsdi
-asm/mx86bsdi.o: asm/mx86unix.cpp
-       $(CPP) -DBSDI asm/mx86unix.cpp | as -o asm/mx86bsdi.o
-
-asm/mx86unix.cpp:
-       (cd asm; perl md5-586.pl cpp >mx86unix.cpp)
-
-test:  $(TEST)
-       ./$(TEST)
-
-$(TEST): $(TEST).c $(LIB)
-       $(CC) -o $(TEST) $(CFLAGS) $(TEST).c $(LIB)
-
-$(APPS): $(APPS).c $(LIB)
-       $(CC) -o $(APPS) $(CFLAGS) $(APPS).c $(LIB)
-
-lint:
-       lint -DLINT $(INCLUDES) $(SRC)>fluff
-
-depend:
-       $(MAKEDEPEND) $(INCLUDES) $(PROGS) $(LIBSRC)
-
-dclean:
-       perl -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) >Makefile.new
-       mv -f Makefile.new $(MAKEFILE)
-
-clean:
-       /bin/rm -f $(LIB) $(TEST) $(APPS) *.o asm/*.o *.obj lib tags core .pure .nfs* *.old *.bak fluff
-
-cc:
-       $(MAKE) MD5_ASM_OBJ="" CC="cc" CFLAG="-O" all
-
-gcc:
-       $(MAKE) MD5_ASM_OBJ="" CC="gcc" CFLAGS="-O3 -fomit-frame-pointer" all
-
-x86-elf:
-       $(MAKE) MD5_ASM_OBJ="asm/mx86-elf.o" CFLAG="-DELF -DMD5_ASM -DL_ENDIAN $(CFLAGS)" all
-
-x86-out:
-       $(MAKE) MD5_ASM_OBJ="asm/mx86-out.o" CFLAG="-DOUT -DMD5_ASM -DL_ENDIAN $(CFLAGS)" all
-
-x86-solaris:
-       $(MAKE) MD5_ASM_OBJ="asm/mx86-sol.o" CFLAG="-DSOL -DMD5_ASM -DL_ENDIAN $(CFLAGS)" all
-
-x86-bdsi:
-       $(MAKE) MD5_ASM_OBJ="asm/mx86-bdsi.o" CFLAG="-DBDSI -DMD5_ASM -DL_ENDIAN $(CFLAGS)" all
-
-# DO NOT DELETE THIS LINE -- make depend depends on it.
index 51f5f17..e69de29 100644 (file)
@@ -1,687 +0,0 @@
-       ; Don't even think of reading this code
-       ; It was automatically generated by md5-586.pl
-       ; Which is a perl program used to generate the x86 assember for
-       ; any of elf, a.out, BSDI,Win32, or Solaris
-       ; eric <eay@cryptsoft.com>
-       ; 
-       TITLE   md5-586.asm
-        .386
-.model FLAT
-_TEXT  SEGMENT
-PUBLIC _md5_block_asm_host_order
-
-_md5_block_asm_host_order PROC NEAR
-       push    esi
-       push    edi
-       mov     edi,            DWORD PTR 12[esp]
-       mov     esi,            DWORD PTR 16[esp]
-       mov     ecx,            DWORD PTR 20[esp]
-       push    ebp
-       shl     ecx,            6
-       push    ebx
-       add     ecx,            esi
-       sub     ecx,            64
-       mov     eax,            DWORD PTR [edi]
-       push    ecx
-       mov     ebx,            DWORD PTR 4[edi]
-       mov     ecx,            DWORD PTR 8[edi]
-       mov     edx,            DWORD PTR 12[edi]
-L000start:
-       ; 
-       ; R0 section
-       mov     edi,            ecx
-       mov     ebp,            DWORD PTR [esi]
-       ; R0 0
-       xor     edi,            edx
-       and     edi,            ebx
-       lea     eax,            DWORD PTR 3614090360[ebp*1+eax]
-       xor     edi,            edx
-       add     eax,            edi
-       mov     edi,            ebx
-       rol     eax,            7
-       mov     ebp,            DWORD PTR 4[esi]
-       add     eax,            ebx
-       ; R0 1
-       xor     edi,            ecx
-       and     edi,            eax
-       lea     edx,            DWORD PTR 3905402710[ebp*1+edx]
-       xor     edi,            ecx
-       add     edx,            edi
-       mov     edi,            eax
-       rol     edx,            12
-       mov     ebp,            DWORD PTR 8[esi]
-       add     edx,            eax
-       ; R0 2
-       xor     edi,            ebx
-       and     edi,            edx
-       lea     ecx,            DWORD PTR 606105819[ebp*1+ecx]
-       xor     edi,            ebx
-       add     ecx,            edi
-       mov     edi,            edx
-       rol     ecx,            17
-       mov     ebp,            DWORD PTR 12[esi]
-       add     ecx,            edx
-       ; R0 3
-       xor     edi,            eax
-       and     edi,            ecx
-       lea     ebx,            DWORD PTR 3250441966[ebp*1+ebx]
-       xor     edi,            eax
-       add     ebx,            edi
-       mov     edi,            ecx
-       rol     ebx,            22
-       mov     ebp,            DWORD PTR 16[esi]
-       add     ebx,            ecx
-       ; R0 4
-       xor     edi,            edx
-       and     edi,            ebx
-       lea     eax,            DWORD PTR 4118548399[ebp*1+eax]
-       xor     edi,            edx
-       add     eax,            edi
-       mov     edi,            ebx
-       rol     eax,            7
-       mov     ebp,            DWORD PTR 20[esi]
-       add     eax,            ebx
-       ; R0 5
-       xor     edi,            ecx
-       and     edi,            eax
-       lea     edx,            DWORD PTR 1200080426[ebp*1+edx]
-       xor     edi,            ecx
-       add     edx,            edi
-       mov     edi,            eax
-       rol     edx,            12
-       mov     ebp,            DWORD PTR 24[esi]
-       add     edx,            eax
-       ; R0 6
-       xor     edi,            ebx
-       and     edi,            edx
-       lea     ecx,            DWORD PTR 2821735955[ebp*1+ecx]
-       xor     edi,            ebx
-       add     ecx,            edi
-       mov     edi,            edx
-       rol     ecx,            17
-       mov     ebp,            DWORD PTR 28[esi]
-       add     ecx,            edx
-       ; R0 7
-       xor     edi,            eax
-       and     edi,            ecx
-       lea     ebx,            DWORD PTR 4249261313[ebp*1+ebx]
-       xor     edi,            eax
-       add     ebx,            edi
-       mov     edi,            ecx
-       rol     ebx,            22
-       mov     ebp,            DWORD PTR 32[esi]
-       add     ebx,            ecx
-       ; R0 8
-       xor     edi,            edx
-       and     edi,            ebx
-       lea     eax,            DWORD PTR 1770035416[ebp*1+eax]
-       xor     edi,            edx
-       add     eax,            edi
-       mov     edi,            ebx
-       rol     eax,            7
-       mov     ebp,            DWORD PTR 36[esi]
-       add     eax,            ebx
-       ; R0 9
-       xor     edi,            ecx
-       and     edi,            eax
-       lea     edx,            DWORD PTR 2336552879[ebp*1+edx]
-       xor     edi,            ecx
-       add     edx,            edi
-       mov     edi,            eax
-       rol     edx,            12
-       mov     ebp,            DWORD PTR 40[esi]
-       add     edx,            eax
-       ; R0 10
-       xor     edi,            ebx
-       and     edi,            edx
-       lea     ecx,            DWORD PTR 4294925233[ebp*1+ecx]
-       xor     edi,            ebx
-       add     ecx,            edi
-       mov     edi,            edx
-       rol     ecx,            17
-       mov     ebp,            DWORD PTR 44[esi]
-       add     ecx,            edx
-       ; R0 11
-       xor     edi,            eax
-       and     edi,            ecx
-       lea     ebx,            DWORD PTR 2304563134[ebp*1+ebx]
-       xor     edi,            eax
-       add     ebx,            edi
-       mov     edi,            ecx
-       rol     ebx,            22
-       mov     ebp,            DWORD PTR 48[esi]
-       add     ebx,            ecx
-       ; R0 12
-       xor     edi,            edx
-       and     edi,            ebx
-       lea     eax,            DWORD PTR 1804603682[ebp*1+eax]
-       xor     edi,            edx
-       add     eax,            edi
-       mov     edi,            ebx
-       rol     eax,            7
-       mov     ebp,            DWORD PTR 52[esi]
-       add     eax,            ebx
-       ; R0 13
-       xor     edi,            ecx
-       and     edi,            eax
-       lea     edx,            DWORD PTR 4254626195[ebp*1+edx]
-       xor     edi,            ecx
-       add     edx,            edi
-       mov     edi,            eax
-       rol     edx,            12
-       mov     ebp,            DWORD PTR 56[esi]
-       add     edx,            eax
-       ; R0 14
-       xor     edi,            ebx
-       and     edi,            edx
-       lea     ecx,            DWORD PTR 2792965006[ebp*1+ecx]
-       xor     edi,            ebx
-       add     ecx,            edi
-       mov     edi,            edx
-       rol     ecx,            17
-       mov     ebp,            DWORD PTR 60[esi]
-       add     ecx,            edx
-       ; R0 15
-       xor     edi,            eax
-       and     edi,            ecx
-       lea     ebx,            DWORD PTR 1236535329[ebp*1+ebx]
-       xor     edi,            eax
-       add     ebx,            edi
-       mov     edi,            ecx
-       rol     ebx,            22
-       mov     ebp,            DWORD PTR 4[esi]
-       add     ebx,            ecx
-       ; 
-       ; R1 section
-       ; R1 16
-       lea     eax,            DWORD PTR 4129170786[ebp*1+eax]
-       xor     edi,            ebx
-       and     edi,            edx
-       mov     ebp,            DWORD PTR 24[esi]
-       xor     edi,            ecx
-       add     eax,            edi
-       mov     edi,            ebx
-       rol     eax,            5
-       add     eax,            ebx
-       ; R1 17
-       lea     edx,            DWORD PTR 3225465664[ebp*1+edx]
-       xor     edi,            eax
-       and     edi,            ecx
-       mov     ebp,            DWORD PTR 44[esi]
-       xor     edi,            ebx
-       add     edx,            edi
-       mov     edi,            eax
-       rol     edx,            9
-       add     edx,            eax
-       ; R1 18
-       lea     ecx,            DWORD PTR 643717713[ebp*1+ecx]
-       xor     edi,            edx
-       and     edi,            ebx
-       mov     ebp,            DWORD PTR [esi]
-       xor     edi,            eax
-       add     ecx,            edi
-       mov     edi,            edx
-       rol     ecx,            14
-       add     ecx,            edx
-       ; R1 19
-       lea     ebx,            DWORD PTR 3921069994[ebp*1+ebx]
-       xor     edi,            ecx
-       and     edi,            eax
-       mov     ebp,            DWORD PTR 20[esi]
-       xor     edi,            edx
-       add     ebx,            edi
-       mov     edi,            ecx
-       rol     ebx,            20
-       add     ebx,            ecx
-       ; R1 20
-       lea     eax,            DWORD PTR 3593408605[ebp*1+eax]
-       xor     edi,            ebx
-       and     edi,            edx
-       mov     ebp,            DWORD PTR 40[esi]
-       xor     edi,            ecx
-       add     eax,            edi
-       mov     edi,            ebx
-       rol     eax,            5
-       add     eax,            ebx
-       ; R1 21
-       lea     edx,            DWORD PTR 38016083[ebp*1+edx]
-       xor     edi,            eax
-       and     edi,            ecx
-       mov     ebp,            DWORD PTR 60[esi]
-       xor     edi,            ebx
-       add     edx,            edi
-       mov     edi,            eax
-       rol     edx,            9
-       add     edx,            eax
-       ; R1 22
-       lea     ecx,            DWORD PTR 3634488961[ebp*1+ecx]
-       xor     edi,            edx
-       and     edi,            ebx
-       mov     ebp,            DWORD PTR 16[esi]
-       xor     edi,            eax
-       add     ecx,            edi
-       mov     edi,            edx
-       rol     ecx,            14
-       add     ecx,            edx
-       ; R1 23
-       lea     ebx,            DWORD PTR 3889429448[ebp*1+ebx]
-       xor     edi,            ecx
-       and     edi,            eax
-       mov     ebp,            DWORD PTR 36[esi]
-       xor     edi,            edx
-       add     ebx,            edi
-       mov     edi,            ecx
-       rol     ebx,            20
-       add     ebx,            ecx
-       ; R1 24
-       lea     eax,            DWORD PTR 568446438[ebp*1+eax]
-       xor     edi,            ebx
-       and     edi,            edx
-       mov     ebp,            DWORD PTR 56[esi]
-       xor     edi,            ecx
-       add     eax,            edi
-       mov     edi,            ebx
-       rol     eax,            5
-       add     eax,            ebx
-       ; R1 25
-       lea     edx,            DWORD PTR 3275163606[ebp*1+edx]
-       xor     edi,            eax
-       and     edi,            ecx
-       mov     ebp,            DWORD PTR 12[esi]
-       xor     edi,            ebx
-       add     edx,            edi
-       mov     edi,            eax
-       rol     edx,            9
-       add     edx,            eax
-       ; R1 26
-       lea     ecx,            DWORD PTR 4107603335[ebp*1+ecx]
-       xor     edi,            edx
-       and     edi,            ebx
-       mov     ebp,            DWORD PTR 32[esi]
-       xor     edi,            eax
-       add     ecx,            edi
-       mov     edi,            edx
-       rol     ecx,            14
-       add     ecx,            edx
-       ; R1 27
-       lea     ebx,            DWORD PTR 1163531501[ebp*1+ebx]
-       xor     edi,            ecx
-       and     edi,            eax
-       mov     ebp,            DWORD PTR 52[esi]
-       xor     edi,            edx
-       add     ebx,            edi
-       mov     edi,            ecx
-       rol     ebx,            20
-       add     ebx,            ecx
-       ; R1 28
-       lea     eax,            DWORD PTR 2850285829[ebp*1+eax]
-       xor     edi,            ebx
-       and     edi,            edx
-       mov     ebp,            DWORD PTR 8[esi]
-       xor     edi,            ecx
-       add     eax,            edi
-       mov     edi,            ebx
-       rol     eax,            5
-       add     eax,            ebx
-       ; R1 29
-       lea     edx,            DWORD PTR 4243563512[ebp*1+edx]
-       xor     edi,            eax
-       and     edi,            ecx
-       mov     ebp,            DWORD PTR 28[esi]
-       xor     edi,            ebx
-       add     edx,            edi
-       mov     edi,            eax
-       rol     edx,            9
-       add     edx,            eax
-       ; R1 30
-       lea     ecx,            DWORD PTR 1735328473[ebp*1+ecx]
-       xor     edi,            edx
-       and     edi,            ebx
-       mov     ebp,            DWORD PTR 48[esi]
-       xor     edi,            eax
-       add     ecx,            edi
-       mov     edi,            edx
-       rol     ecx,            14
-       add     ecx,            edx
-       ; R1 31
-       lea     ebx,            DWORD PTR 2368359562[ebp*1+ebx]
-       xor     edi,            ecx
-       and     edi,            eax
-       mov     ebp,            DWORD PTR 20[esi]
-       xor     edi,            edx
-       add     ebx,            edi
-       mov     edi,            ecx
-       rol     ebx,            20
-       add     ebx,            ecx
-       ; 
-       ; R2 section
-       ; R2 32
-       xor     edi,            edx
-       xor     edi,            ebx
-       lea     eax,            DWORD PTR 4294588738[ebp*1+eax]
-       add     eax,            edi
-       rol     eax,            4
-       mov     ebp,            DWORD PTR 32[esi]
-       mov     edi,            ebx
-       ; R2 33
-       lea     edx,            DWORD PTR 2272392833[ebp*1+edx]
-       add     eax,            ebx
-       xor     edi,            ecx
-       xor     edi,            eax
-       mov     ebp,            DWORD PTR 44[esi]
-       add     edx,            edi
-       mov     edi,            eax
-       rol     edx,            11
-       add     edx,            eax
-       ; R2 34
-       xor     edi,            ebx
-       xor     edi,            edx
-       lea     ecx,            DWORD PTR 1839030562[ebp*1+ecx]
-       add     ecx,            edi
-       rol     ecx,            16
-       mov     ebp,            DWORD PTR 56[esi]
-       mov     edi,            edx
-       ; R2 35
-       lea     ebx,            DWORD PTR 4259657740[ebp*1+ebx]
-       add     ecx,            edx
-       xor     edi,            eax
-       xor     edi,            ecx
-       mov     ebp,            DWORD PTR 4[esi]
-       add     ebx,            edi
-       mov     edi,            ecx
-       rol     ebx,            23
-       add     ebx,            ecx
-       ; R2 36
-       xor     edi,            edx
-       xor     edi,            ebx
-       lea     eax,            DWORD PTR 2763975236[ebp*1+eax]
-       add     eax,            edi
-       rol     eax,            4
-       mov     ebp,            DWORD PTR 16[esi]
-       mov     edi,            ebx
-       ; R2 37
-       lea     edx,            DWORD PTR 1272893353[ebp*1+edx]
-       add     eax,            ebx
-       xor     edi,            ecx
-       xor     edi,            eax
-       mov     ebp,            DWORD PTR 28[esi]
-       add     edx,            edi
-       mov     edi,            eax
-       rol     edx,            11
-       add     edx,            eax
-       ; R2 38
-       xor     edi,            ebx
-       xor     edi,            edx
-       lea     ecx,            DWORD PTR 4139469664[ebp*1+ecx]
-       add     ecx,            edi
-       rol     ecx,            16
-       mov     ebp,            DWORD PTR 40[esi]
-       mov     edi,            edx
-       ; R2 39
-       lea     ebx,            DWORD PTR 3200236656[ebp*1+ebx]
-       add     ecx,            edx
-       xor     edi,            eax
-       xor     edi,            ecx
-       mov     ebp,            DWORD PTR 52[esi]
-       add     ebx,            edi
-       mov     edi,            ecx
-       rol     ebx,            23
-       add     ebx,            ecx
-       ; R2 40
-       xor     edi,            edx
-       xor     edi,            ebx
-       lea     eax,            DWORD PTR 681279174[ebp*1+eax]
-       add     eax,            edi
-       rol     eax,            4
-       mov     ebp,            DWORD PTR [esi]
-       mov     edi,            ebx
-       ; R2 41
-       lea     edx,            DWORD PTR 3936430074[ebp*1+edx]
-       add     eax,            ebx
-       xor     edi,            ecx
-       xor     edi,            eax
-       mov     ebp,            DWORD PTR 12[esi]
-       add     edx,            edi
-       mov     edi,            eax
-       rol     edx,            11
-       add     edx,            eax
-       ; R2 42
-       xor     edi,            ebx
-       xor     edi,            edx
-       lea     ecx,            DWORD PTR 3572445317[ebp*1+ecx]
-       add     ecx,            edi
-       rol     ecx,            16
-       mov     ebp,            DWORD PTR 24[esi]
-       mov     edi,            edx
-       ; R2 43
-       lea     ebx,            DWORD PTR 76029189[ebp*1+ebx]
-       add     ecx,            edx
-       xor     edi,            eax
-       xor     edi,            ecx
-       mov     ebp,            DWORD PTR 36[esi]
-       add     ebx,            edi
-       mov     edi,            ecx
-       rol     ebx,            23
-       add     ebx,            ecx
-       ; R2 44
-       xor     edi,            edx
-       xor     edi,            ebx
-       lea     eax,            DWORD PTR 3654602809[ebp*1+eax]
-       add     eax,            edi
-       rol     eax,            4
-       mov     ebp,            DWORD PTR 48[esi]
-       mov     edi,            ebx
-       ; R2 45
-       lea     edx,            DWORD PTR 3873151461[ebp*1+edx]
-       add     eax,            ebx
-       xor     edi,            ecx
-       xor     edi,            eax
-       mov     ebp,            DWORD PTR 60[esi]
-       add     edx,            edi
-       mov     edi,            eax
-       rol     edx,            11
-       add     edx,            eax
-       ; R2 46
-       xor     edi,            ebx
-       xor     edi,            edx
-       lea     ecx,            DWORD PTR 530742520[ebp*1+ecx]
-       add     ecx,            edi
-       rol     ecx,            16
-       mov     ebp,            DWORD PTR 8[esi]
-       mov     edi,            edx
-       ; R2 47
-       lea     ebx,            DWORD PTR 3299628645[ebp*1+ebx]
-       add     ecx,            edx
-       xor     edi,            eax
-       xor     edi,            ecx
-       mov     ebp,            DWORD PTR [esi]
-       add     ebx,            edi
-       mov     edi,            -1
-       rol     ebx,            23
-       add     ebx,            ecx
-       ; 
-       ; R3 section
-       ; R3 48
-       xor     edi,            edx
-       or      edi,            ebx
-       lea     eax,            DWORD PTR 4096336452[ebp*1+eax]
-       xor     edi,            ecx
-       mov     ebp,            DWORD PTR 28[esi]
-       add     eax,            edi
-       mov     edi,            -1
-       rol     eax,            6
-       xor     edi,            ecx
-       add     eax,            ebx
-       ; R3 49
-       or      edi,            eax
-       lea     edx,            DWORD PTR 1126891415[ebp*1+edx]
-       xor     edi,            ebx
-       mov     ebp,            DWORD PTR 56[esi]
-       add     edx,            edi
-       mov     edi,            -1
-       rol     edx,            10
-       xor     edi,            ebx
-       add     edx,            eax
-       ; R3 50
-       or      edi,            edx
-       lea     ecx,            DWORD PTR 2878612391[ebp*1+ecx]
-       xor     edi,            eax
-       mov     ebp,            DWORD PTR 20[esi]
-       add     ecx,            edi
-       mov     edi,            -1
-       rol     ecx,            15
-       xor     edi,            eax
-       add     ecx,            edx
-       ; R3 51
-       or      edi,            ecx
-       lea     ebx,            DWORD PTR 4237533241[ebp*1+ebx]
-       xor     edi,            edx
-       mov     ebp,            DWORD PTR 48[esi]
-       add     ebx,            edi
-       mov     edi,            -1
-       rol     ebx,            21
-       xor     edi,            edx
-       add     ebx,            ecx
-       ; R3 52
-       or      edi,            ebx
-       lea     eax,            DWORD PTR 1700485571[ebp*1+eax]
-       xor     edi,            ecx
-       mov     ebp,            DWORD PTR 12[esi]
-       add     eax,            edi
-       mov     edi,            -1
-       rol     eax,            6
-       xor     edi,            ecx
-       add     eax,            ebx
-       ; R3 53
-       or      edi,            eax
-       lea     edx,            DWORD PTR 2399980690[ebp*1+edx]
-       xor     edi,            ebx
-       mov     ebp,            DWORD PTR 40[esi]
-       add     edx,            edi
-       mov     edi,            -1
-       rol     edx,            10
-       xor     edi,            ebx
-       add     edx,            eax
-       ; R3 54
-       or      edi,            edx
-       lea     ecx,            DWORD PTR 4293915773[ebp*1+ecx]
-       xor     edi,            eax
-       mov     ebp,            DWORD PTR 4[esi]
-       add     ecx,            edi
-       mov     edi,            -1
-       rol     ecx,            15
-       xor     edi,            eax
-       add     ecx,            edx
-       ; R3 55
-       or      edi,            ecx
-       lea     ebx,            DWORD PTR 2240044497[ebp*1+ebx]
-       xor     edi,            edx
-       mov     ebp,            DWORD PTR 32[esi]
-       add     ebx,            edi
-       mov     edi,            -1
-       rol     ebx,            21
-       xor     edi,            edx
-       add     ebx,            ecx
-       ; R3 56
-       or      edi,            ebx
-       lea     eax,            DWORD PTR 1873313359[ebp*1+eax]
-       xor     edi,            ecx
-       mov     ebp,            DWORD PTR 60[esi]
-       add     eax,            edi
-       mov     edi,            -1
-       rol     eax,            6
-       xor     edi,            ecx
-       add     eax,            ebx
-       ; R3 57
-       or      edi,            eax
-       lea     edx,            DWORD PTR 4264355552[ebp*1+edx]
-       xor     edi,            ebx
-       mov     ebp,            DWORD PTR 24[esi]
-       add     edx,            edi
-       mov     edi,            -1
-       rol     edx,            10
-       xor     edi,            ebx
-       add     edx,            eax
-       ; R3 58
-       or      edi,            edx
-       lea     ecx,            DWORD PTR 2734768916[ebp*1+ecx]
-       xor     edi,            eax
-       mov     ebp,            DWORD PTR 52[esi]
-       add     ecx,            edi
-       mov     edi,            -1
-       rol     ecx,            15
-       xor     edi,            eax
-       add     ecx,            edx
-       ; R3 59
-       or      edi,            ecx
-       lea     ebx,            DWORD PTR 1309151649[ebp*1+ebx]
-       xor     edi,            edx
-       mov     ebp,            DWORD PTR 16[esi]
-       add     ebx,            edi
-       mov     edi,            -1
-       rol     ebx,            21
-       xor     edi,            edx
-       add     ebx,            ecx
-       ; R3 60
-       or      edi,            ebx
-       lea     eax,            DWORD PTR 4149444226[ebp*1+eax]
-       xor     edi,            ecx
-       mov     ebp,            DWORD PTR 44[esi]
-       add     eax,            edi
-       mov     edi,            -1
-       rol     eax,            6
-       xor     edi,            ecx
-       add     eax,            ebx
-       ; R3 61
-       or      edi,            eax
-       lea     edx,            DWORD PTR 3174756917[ebp*1+edx]
-       xor     edi,            ebx
-       mov     ebp,            DWORD PTR 8[esi]
-       add     edx,            edi
-       mov     edi,            -1
-       rol     edx,            10
-       xor     edi,            ebx
-       add     edx,            eax
-       ; R3 62
-       or      edi,            edx
-       lea     ecx,            DWORD PTR 718787259[ebp*1+ecx]
-       xor     edi,            eax
-       mov     ebp,            DWORD PTR 36[esi]
-       add     ecx,            edi
-       mov     edi,            -1
-       rol     ecx,            15
-       xor     edi,            eax
-       add     ecx,            edx
-       ; R3 63
-       or      edi,            ecx
-       lea     ebx,            DWORD PTR 3951481745[ebp*1+ebx]
-       xor     edi,            edx
-       mov     ebp,            DWORD PTR 24[esp]
-       add     ebx,            edi
-       add     esi,            64
-       rol     ebx,            21
-       mov     edi,            DWORD PTR [ebp]
-       add     ebx,            ecx
-       add     eax,            edi
-       mov     edi,            DWORD PTR 4[ebp]
-       add     ebx,            edi
-       mov     edi,            DWORD PTR 8[ebp]
-       add     ecx,            edi
-       mov     edi,            DWORD PTR 12[ebp]
-       add     edx,            edi
-       mov     DWORD PTR [ebp],eax
-       mov     DWORD PTR 4[ebp],ebx
-       mov     edi,            DWORD PTR [esp]
-       mov     DWORD PTR 8[ebp],ecx
-       mov     DWORD PTR 12[ebp],edx
-       cmp     edi,            esi
-       jge     L000start
-       pop     eax
-       pop     ebx
-       pop     ebp
-       pop     edi
-       pop     esi
-       ret
-_md5_block_asm_host_order ENDP
-_TEXT  ENDS
-END
index 06af633..c912484 100644 (file)
@@ -135,11 +135,7 @@ void md5_block_data_order (MD5_CTX *c, const void *p,int num);
  */
 #endif
 
-#ifndef FLAT_INC
-#include "../md32_common.h"
-#else
 #include "md32_common.h"
-#endif
 
 /*
 #define        F(x,y,z)        (((x) & (y))  |  ((~(x)) & (z)))
index 14770c0..a399485 100644 (file)
@@ -640,19 +640,54 @@ void CRYPTO_mem_leaks(BIO *b)
        MEM_LEAK ml;
        char buf[80];
 
-       if (mh == NULL) return;
+       if (mh == NULL && amih == NULL)
+               return;
        ml.bio=b;
        ml.bytes=0;
        ml.chunks=0;
-       CRYPTO_w_lock(CRYPTO_LOCK_MALLOC2);
-       lh_doall_arg(mh,(void (*)())print_leak,(char *)&ml);
-       CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC2);
+       MemCheck_off(); /* obtains CRYPTO_LOCK_MALLOC2 */
+       if (mh != NULL)
+               lh_doall_arg(mh,(void (*)())print_leak,(char *)&ml);
        if (ml.chunks != 0)
                {
                sprintf(buf,"%ld bytes leaked in %d chunks\n",
                        ml.bytes,ml.chunks);
                BIO_puts(b,buf);
                }
+       else
+               {
+               /* Make sure that, if we found no leaks, memory-leak debugging itself
+                * does not introduce memory leaks (which might irritate
+                * external debugging tools).
+                * (When someone enables leak checking, but does not call
+                * this function, we declare it to be their fault.)
+                *
+                * XXX    This should be in CRYPTO_mem_leaks_cb,
+                * and CRYPTO_mem_leaks should be implemented by
+                * using CRYPTO_mem_leaks_cb.
+                * (Also their should be a variant of lh_doall_arg
+                * that takes a function pointer instead of a void *;
+                * this would obviate the ugly and illegal
+                * void_fn_to_char kludge in CRYPTO_mem_leaks_cb.
+                * Otherwise the code police will come and get us.)
+                */
+               CRYPTO_w_lock(CRYPTO_LOCK_MALLOC);
+               if (mh != NULL)
+                       {
+                       lh_free(mh);
+                       mh = NULL;
+                       }
+               if (amih != NULL)
+                       {
+                       if (lh_num_items(amih) == 0) 
+                               {
+                               lh_free(amih);
+                               amih = NULL;
+                               }
+                       }
+               CRYPTO_w_unlock(CRYPTO_LOCK_MALLOC);
+               }
+       MemCheck_on(); /* releases CRYPTO_LOCK_MALLOC2 */
 
 #if 0
        lh_stats_bio(mh,b);
index d654eb2..d9389a5 100644 (file)
@@ -22,7 +22,7 @@ typedef struct name_funcs_st
 DECLARE_STACK_OF(NAME_FUNCS)
 IMPLEMENT_STACK_OF(NAME_FUNCS)
 
-STACK_OF(NAME_FUNCS) *name_funcs_stack;
+static STACK_OF(NAME_FUNCS) *name_funcs_stack;
 
 static unsigned long obj_name_hash(OBJ_NAME *a);
 static int obj_name_cmp(OBJ_NAME *a,OBJ_NAME *b);
index cef401d..7aec0ed 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index d1a5ad2..95c8a21 100644 (file)
@@ -949,7 +949,7 @@ extern "C" {
 #define NID_ad_ca_issuers              179
 #define OBJ_ad_ca_issuers              OBJ_id_ad,2L
 
-#define SN_OSCP_sign                   "OCSPSigning"
+#define SN_OCSP_sign                   "OCSPSigning"
 #define LN_OCSP_sign                   "OCSP Signing"
 #define NID_OCSP_sign                  180
 #define OBJ_OCSP_sign                  OBJ_id_kp,9L
index 55d5d06..55ec973 100644 (file)
@@ -2,20 +2,31 @@
 #define HEADER_OPENSSLV_H
 
 /* Numeric release version identifier:
- * MMNNFFRBB: major minor fix final beta/patch
+ * MMNNFFPPS: major minor fix patch status
+ * The status nibble has one of the values 0 for development, 1 to e for betas
+ * 1 to 14, and f for release.  The patch level is exactly that.
  * For example:
  * 0.9.3-dev     0x00903000
- * 0.9.3beta1    0x00903001
- * 0.9.3beta2-dev 0x00903002
- * 0.9.3beta2     0x00903002 (same as ...beta2-dev)
- * 0.9.3         0x00903100
- * 0.9.3a        0x00903101
- * 0.9.4         0x00904100
- * 1.2.3z        0x1020311a
+ * 0.9.3-beta1   0x00903001
+ * 0.9.3-beta2-dev 0x00903002
+ * 0.9.3-beta2    0x00903002 (same as ...beta2-dev)
+ * 0.9.3         0x0090300f
+ * 0.9.3a        0x0090301f
+ * 0.9.4         0x0090400f
+ * 1.2.3z        0x102031af
+ *
+ * For continuity reasons (because 0.9.5 is already out, and is coded
+ * 0x00905100), between 0.9.5 and 0.9.6 the coding of the patch level
+ * part is slightly different, by setting the highest bit.  This means
+ * that 0.9.5a looks like this: 0x0090581f.  At 0.9.6, we can start
+ * with 0x0090600S...
+ *
  * (Prior to 0.9.3-dev a different scheme was used: 0.9.2b is 0x0922.)
+ * (Prior to 0.9.5a beta1, a different scheme was used: MMNNFFRBB for
+ *  major minor fix final patch/beta)
  */
-#define OPENSSL_VERSION_NUMBER 0x00905100L
-#define OPENSSL_VERSION_TEXT   "OpenSSL 0.9.5 28 Feb 2000"
+#define OPENSSL_VERSION_NUMBER 0x0090581fL
+#define OPENSSL_VERSION_TEXT   "OpenSSL 0.9.5a 1 Apr 2000"
 #define OPENSSL_VERSION_PTEXT  " part of " OPENSSL_VERSION_TEXT
 
 #endif /* HEADER_OPENSSLV_H */
index 642129d..8b1789b 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index 072211b..b5e0a65 100644 (file)
@@ -373,7 +373,7 @@ int PEM_ASN1_write_bio(int (*i2d)(), const char *name, BIO *bp, char *x,
                        kstr=(unsigned char *)buf;
                        }
                RAND_add(data,i,0);/* put in the RSA key. */
-               if (RAND_bytes(iv,8) <= 0)      /* Generate a salt */
+               if (RAND_pseudo_bytes(iv,8) < 0)        /* Generate a salt */
                        goto err;
                /* The 'iv' is used as the iv and as a salt.  It is
                 * NOT taken from the BytesToKey function */
index 44e330e..81c6e64 100644 (file)
@@ -18,11 +18,13 @@ sub main'asm_init
        ($type,$fn,$i386)=@_;
        $filename=$fn;
 
-       $cpp=$sol=$aout=$win32=0;
+       $cpp=$sol=$aout=$win32=$gaswin=0;
        if (    ($type eq "elf"))
                { require "x86unix.pl"; }
        elsif ( ($type eq "a.out"))
                { $aout=1; require "x86unix.pl"; }
+       elsif ( ($type eq "gaswin"))
+               { $gaswin=1; $aout=1; require "x86unix.pl"; }
        elsif ( ($type eq "sol"))
                { $sol=1; require "x86unix.pl"; }
        elsif ( ($type eq "cpp"))
@@ -50,7 +52,7 @@ EOF
 &comment("Don't even think of reading this code");
 &comment("It was automatically generated by $filename");
 &comment("Which is a perl program used to generate the x86 assember for");
-&comment("any of elf, a.out, BSDI,Win32, or Solaris");
+&comment("any of elf, a.out, BSDI, Win32, gaswin (for GNU as on Win32) or Solaris");
 &comment("eric <eay\@cryptsoft.com>");
 &comment("");
 
index 252a57b..2064523 100644 (file)
@@ -341,7 +341,7 @@ sub main'set_label
                $label{$_[0]}="${label}${_[0]}";
                $label++;
                }
-       if((defined $_[1]) && ($_[1] == 1))
+       if((defined $_[2]) && ($_[2] == 1))
                {
                push(@out,"$label{$_[0]}::\n");
                }
index 60d75f5..309060e 100644 (file)
@@ -292,6 +292,8 @@ EOF
        push(@out,$tmp);
        if ($main'cpp)
                { $tmp=push(@out,"\tTYPE($func,\@function)\n"); }
+       elsif ($main'gaswin)
+               { $tmp=push(@out,"\t.def\t$func;\t.scl\t2;\t.type\t32;\t.endef\n"); }
        else    { $tmp=push(@out,"\t.type\t$func,\@function\n"); }
        push(@out,"$func:\n");
        $tmp=<<"EOF";
@@ -320,6 +322,8 @@ EOF
        push(@out,$tmp);
        if ($main'cpp)
                { push(@out,"\tTYPE($func,\@function)\n"); }
+       elsif ($main'gaswin)
+               { $tmp=push(@out,"\t.def\t$func;\t.scl\t2;\t.type\t32;\t.endef\n"); }
        else    { push(@out,"\t.type    $func,\@function\n"); }
        push(@out,"$func:\n");
        $stack=4;
@@ -342,6 +346,8 @@ EOF
        push(@out,$tmp);
        if ($main'cpp)
                { push(@out,"\tSIZE($func,.${func}_end-$func)\n"); }
+       elsif ($main'gaswin)
+                { $tmp=push(@out,"\t.align 4\n"); }
        else    { push(@out,"\t.size\t$func,.${func}_end-$func\n"); }
        push(@out,".ident       \"$func\"\n");
        $stack=0;
@@ -371,6 +377,8 @@ sub main'function_end_B
        push(@out,".L_${func}_end:\n");
        if ($main'cpp)
                { push(@out,"\tSIZE($func,.L_${func}_end-$func)\n"); }
+        elsif ($main'gaswin)
+                { push(@out,"\t.align 4\n"); }
        else    { push(@out,"\t.size\t$func,.L_${func}_end-$func\n"); }
        push(@out,".ident       \"desasm.pl\"\n");
        $stack=0;
index 56d88b0..ee8aed5 100644 (file)
@@ -61,7 +61,7 @@
 #include <openssl/pkcs12.h>
 
 PKCS12 *PKCS12_create(char *pass, char *name, EVP_PKEY *pkey, X509 *cert,
-            STACK *ca, int nid_key, int nid_cert, int iter, int mac_iter,
+            STACK_OF(X509) *ca, int nid_key, int nid_cert, int iter, int mac_iter,
             int keytype)
 {
        PKCS12 *p12;
@@ -103,8 +103,8 @@ PKCS12 *PKCS12_create(char *pass, char *name, EVP_PKEY *pkey, X509 *cert,
        
        /* Add all other certificates */
        if(ca) {
-               for(i = 0; i < sk_num(ca); i++) {
-                       tcert = (X509 *)sk_value(ca, i);
+               for(i = 0; i < sk_X509_num(ca); i++) {
+                       tcert = sk_X509_value(ca, i);
                        if(!(bag = M_PKCS12_x5092certbag(tcert))) return NULL;
                        if(!sk_push(bags, (char *)bag)) {
                                PKCS12err(PKCS12_F_PKCS12_CREATE,ERR_R_MALLOC_FAILURE);
index 02fdd20..b364671 100644 (file)
@@ -104,6 +104,14 @@ int PKCS12_key_gen_uni (unsigned char *pass, int passlen, unsigned char *salt,
 #ifdef  DEBUG_KEYGEN
        unsigned char *tmpout = out;
        int tmpn = n;
+#endif
+
+       if (!pass) {
+               PKCS12err(PKCS12_F_PKCS12_KEY_GEN_UNI,ERR_R_PASSED_NULL_PARAMETER);
+               return 0;
+       }
+
+#ifdef  DEBUG_KEYGEN
        fprintf(stderr, "KEYGEN DEBUG\n");
        fprintf(stderr, "ID %d, ITER %d\n", id, iter);
        fprintf(stderr, "Password (length %d):\n", passlen);
index 08a6055..ee257ff 100644 (file)
 
 /* Simplified PKCS#12 routines */
 
-static int parse_pk12( PKCS12 *p12, const char *pass, int passlen, EVP_PKEY **pkey, X509 **cert, STACK **ca);
-static int parse_bags( STACK *bags, const char *pass, int passlen, EVP_PKEY **pkey, X509 **cert, STACK **ca, ASN1_OCTET_STRING **keyid, char *keymatch);
-static int parse_bag( PKCS12_SAFEBAG *bag, const char *pass, int passlen, EVP_PKEY **pkey, X509 **cert, STACK **ca, ASN1_OCTET_STRING **keyid, char *keymatch);
+static int parse_pk12( PKCS12 *p12, const char *pass, int passlen,
+               EVP_PKEY **pkey, X509 **cert, STACK_OF(X509) **ca);
+
+static int parse_bags( STACK *bags, const char *pass, int passlen,
+               EVP_PKEY **pkey, X509 **cert, STACK_OF(X509) **ca,
+               ASN1_OCTET_STRING **keyid, char *keymatch);
+
+static int parse_bag( PKCS12_SAFEBAG *bag, const char *pass, int passlen,
+                       EVP_PKEY **pkey, X509 **cert, STACK_OF(X509) **ca,
+                       ASN1_OCTET_STRING **keyid, char *keymatch);
+
 /* Parse and decrypt a PKCS#12 structure returning user key, user cert
  * and other (CA) certs. Note either ca should be NULL, *ca should be NULL,
  * or it should point to a valid STACK structure. pkey and cert can be
@@ -72,54 +80,59 @@ static int parse_bag( PKCS12_SAFEBAG *bag, const char *pass, int passlen, EVP_PK
  */
 
 int PKCS12_parse (PKCS12 *p12, const char *pass, EVP_PKEY **pkey, X509 **cert,
-            STACK **ca)
+            STACK_OF(X509) **ca)
 {
 
-/* Check for NULL PKCS12 structure */
-
-if(!p12) {
-       PKCS12err(PKCS12_F_PKCS12_PARSE,PKCS12_R_INVALID_NULL_PKCS12_POINTER);
-       return 0;
-}
+       /* Check for NULL PKCS12 structure */
 
-/* Allocate stack for ca certificates if needed */
-if ((ca != NULL) && (*ca == NULL)) {
-       if (!(*ca = sk_new(NULL))) {
-               PKCS12err(PKCS12_F_PKCS12_PARSE,ERR_R_MALLOC_FAILURE);
+       if(!p12)
+               {
+               PKCS12err(PKCS12_F_PKCS12_PARSE,PKCS12_R_INVALID_NULL_PKCS12_POINTER);
                return 0;
-       }
-}
+               }
+
+       /* Allocate stack for ca certificates if needed */
+       if ((ca != NULL) && (*ca == NULL))
+               {
+               if (!(*ca = sk_X509_new(NULL)))
+                       {
+                       PKCS12err(PKCS12_F_PKCS12_PARSE,ERR_R_MALLOC_FAILURE);
+                       return 0;
+                       }
+               }
 
-if(pkey) *pkey = NULL;
-if(cert) *cert = NULL;
+       if(pkey) *pkey = NULL;
+       if(cert) *cert = NULL;
 
-/* Check the mac */
+       /* Check the mac */
 
-if (!PKCS12_verify_mac (p12, pass, -1)) {
-       PKCS12err(PKCS12_F_PKCS12_PARSE,PKCS12_R_MAC_VERIFY_FAILURE);
-       goto err;
-}
+       if (!PKCS12_verify_mac (p12, pass, -1))
+               {
+               PKCS12err(PKCS12_F_PKCS12_PARSE,PKCS12_R_MAC_VERIFY_FAILURE);
+               goto err;
+               }
 
-if (!parse_pk12 (p12, pass, -1, pkey, cert, ca)) {
-       PKCS12err(PKCS12_F_PKCS12_PARSE,PKCS12_R_PARSE_ERROR);
-       goto err;
-}
+       if (!parse_pk12 (p12, pass, -1, pkey, cert, ca))
+               {
+               PKCS12err(PKCS12_F_PKCS12_PARSE,PKCS12_R_PARSE_ERROR);
+               goto err;
+               }
 
-return 1;
+       return 1;
 
-err:
+ err:
 
-if (pkey && *pkey) EVP_PKEY_free (*pkey);
-if (cert && *cert) X509_free (*cert);
-if (ca) sk_pop_free (*ca, X509_free);
-return 0;
+       if (pkey && *pkey) EVP_PKEY_free (*pkey);
+       if (cert && *cert) X509_free (*cert);
+       if (ca) sk_X509_pop_free (*ca, X509_free);
+       return 0;
 
 }
 
 /* Parse the outer PKCS#12 structure */
 
 static int parse_pk12 (PKCS12 *p12, const char *pass, int passlen,
-            EVP_PKEY **pkey, X509 **cert, STACK **ca)
+            EVP_PKEY **pkey, X509 **cert, STACK_OF(X509) **ca)
 {
        STACK *asafes, *bags;
        int i, bagnid;
@@ -154,7 +167,7 @@ static int parse_pk12 (PKCS12 *p12, const char *pass, int passlen,
 
 
 static int parse_bags (STACK *bags, const char *pass, int passlen,
-                      EVP_PKEY **pkey, X509 **cert, STACK **ca,
+                      EVP_PKEY **pkey, X509 **cert, STACK_OF(X509) **ca,
                       ASN1_OCTET_STRING **keyid, char *keymatch)
 {
        int i;
@@ -171,7 +184,7 @@ static int parse_bags (STACK *bags, const char *pass, int passlen,
 #define MATCH_ALL  0x3
 
 static int parse_bag(PKCS12_SAFEBAG *bag, const char *pass, int passlen,
-                     EVP_PKEY **pkey, X509 **cert, STACK **ca,
+                     EVP_PKEY **pkey, X509 **cert, STACK_OF(X509) **ca,
                      ASN1_OCTET_STRING **keyid,
             char *keymatch)
 {
@@ -221,7 +234,10 @@ static int parse_bag(PKCS12_SAFEBAG *bag, const char *pass, int passlen,
                if (lkey) {
                        *keymatch |= MATCH_CERT;
                        if (cert) *cert = x509;
-               } else if (ca) sk_push (*ca, (char *)x509);
+               } else {
+                       if(ca) sk_X509_push (*ca, x509);
+                       else X509_free(x509);
+               }
        break;
 
        case NID_safeContentsBag:
index f1094b3..369257e 100644 (file)
@@ -157,7 +157,7 @@ int PKCS12_setup_mac (PKCS12 *p12, int iter, unsigned char *salt, int saltlen,
                return 0;
        }
        if (!salt) {
-               if (RAND_bytes (p12->mac->salt->data, saltlen) <= 0)
+               if (RAND_pseudo_bytes (p12->mac->salt->data, saltlen) < 0)
                        return 0;
        }
        else memcpy (p12->mac->salt->data, salt, saltlen);
index 9d8de10..12db54f 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index 254000f..dad356c 100644 (file)
@@ -265,9 +265,9 @@ void PKCS12_SAFEBAG_free(PKCS12_SAFEBAG *a);
 void ERR_load_PKCS12_strings(void);
 void PKCS12_PBE_add(void);
 int PKCS12_parse(PKCS12 *p12, const char *pass, EVP_PKEY **pkey, X509 **cert,
-                STACK **ca);
+                STACK_OF(X509) **ca);
 PKCS12 *PKCS12_create(char *pass, char *name, EVP_PKEY *pkey, X509 *cert,
-                        STACK *ca, int nid_key, int nid_cert, int iter,
+                        STACK_OF(X509) *ca, int nid_key, int nid_cert, int iter,
                                                 int mac_iter, int keytype);
 int i2d_PKCS12_bio(BIO *bp, PKCS12 *p12);
 int i2d_PKCS12_fp(FILE *fp, PKCS12 *p12);
index 27001c6..e69de29 100644 (file)
@@ -1,5 +0,0 @@
-WARNING
-
-Everything in this directory is experimental and is subject to change.
-
-Do not rely on the stuff in here not changing in the next release
index 80ac5e3..4ab24a8 100644 (file)
@@ -699,6 +699,7 @@ int PKCS7_dataVerify(X509_STORE *cert_store, X509_STORE_CTX *ctx, BIO *bio,
        if (i <= 0) 
                {
                PKCS7err(PKCS7_F_PKCS7_DATAVERIFY,ERR_R_X509_LIB);
+               X509_STORE_CTX_cleanup(ctx);
                goto err;
                }
        X509_STORE_CTX_cleanup(ctx);
index 813a8af..8ded891 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index 6b158f0..da4258c 100644 (file)
  * copied and put under another distribution licence
  * [including the GNU Public Licence.]
  */
+/* ====================================================================
+ * Copyright (c) 1998-2000 The OpenSSL Project.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer. 
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. All advertising materials mentioning features or use of this
+ *    software must display the following acknowledgment:
+ *    "This product includes software developed by the OpenSSL Project
+ *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
+ *
+ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
+ *    endorse or promote products derived from this software without
+ *    prior written permission. For written permission, please contact
+ *    openssl-core@openssl.org.
+ *
+ * 5. Products derived from this software may not be called "OpenSSL"
+ *    nor may "OpenSSL" appear in their names without prior written
+ *    permission of the OpenSSL Project.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ *    acknowledgment:
+ *    "This product includes software developed by the OpenSSL Project
+ *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This product includes cryptographic software written by Eric Young
+ * (eay@cryptsoft.com).  This product includes software written by Tim
+ * Hudson (tjh@cryptsoft.com).
+ *
+ */
 
 #define ENTROPY_NEEDED 16  /* require 128 bits = 16 bytes of randomness */
 
 
 #include <openssl/rand.h>
 
+#ifdef BN_DEBUG
+# define PREDICT
+#endif
+
 /* #define NORAND      1 */
 /* #define PREDICT     1 */
 
@@ -141,6 +198,10 @@ static long md_count[2]={0,0};
 static double entropy=0;
 static int initialized=0;
 
+#ifdef PREDICT
+int rand_predictable=0;
+#endif
+
 const char *RAND_version="RAND" OPENSSL_VERSION_PTEXT;
 
 static void ssleay_rand_cleanup(void);
@@ -148,6 +209,7 @@ static void ssleay_rand_seed(const void *buf, int num);
 static void ssleay_rand_add(const void *buf, int num, double add_entropy);
 static int ssleay_rand_bytes(unsigned char *buf, int num);
 static int ssleay_rand_pseudo_bytes(unsigned char *buf, int num);
+static int ssleay_rand_status(void);
 
 RAND_METHOD rand_ssleay_meth={
        ssleay_rand_seed,
@@ -155,6 +217,7 @@ RAND_METHOD rand_ssleay_meth={
        ssleay_rand_cleanup,
        ssleay_rand_add,
        ssleay_rand_pseudo_bytes,
+       ssleay_rand_status
        }; 
 
 RAND_METHOD *RAND_SSLeay(void)
@@ -306,6 +369,10 @@ static void ssleay_rand_initialize(void)
        FILE *fh;
 #endif
 
+#ifdef NORAND
+       return;
+#endif
+
        CRYPTO_w_unlock(CRYPTO_LOCK_RAND);
        /* put in some default random data, we need more than just this */
 #ifndef GETPID_IS_MEANINGLESS
@@ -354,13 +421,14 @@ static int ssleay_rand_bytes(unsigned char *buf, int num)
 #endif
 
 #ifdef PREDICT
-       {
-       static unsigned char val=0;
+       if (rand_predictable)
+               {
+               static unsigned char val=0;
 
-       for (i=0; i<num; i++)
-               buf[i]=val++;
-       return(1);
-       }
+               for (i=0; i<num; i++)
+                       buf[i]=val++;
+               return(1);
+               }
 #endif
 
        /*
@@ -489,17 +557,66 @@ static int ssleay_rand_pseudo_bytes(unsigned char *buf, int num)
        return (ret);
        }
 
-int RAND_status(void)
+static int ssleay_rand_status(void)
        {
+       int ret;
+
+       CRYPTO_w_lock(CRYPTO_LOCK_RAND);
+
        if (!initialized)
                ssleay_rand_initialize();
-       return (entropy >= ENTROPY_NEEDED);
+       ret = entropy >= ENTROPY_NEEDED;
+
+       CRYPTO_w_unlock(CRYPTO_LOCK_RAND);
+
+       return ret;
        }
 
 #ifdef WINDOWS
 #include <windows.h>
 #include <openssl/rand.h>
 
+int RAND_event(UINT iMsg, WPARAM wParam, LPARAM lParam)
+        {
+        double add_entropy=0;
+        SYSTEMTIME t;
+
+        switch (iMsg)
+                {
+        case WM_KEYDOWN:
+                        {
+                        static WPARAM key;
+                        if (key != wParam)
+                                add_entropy = 0.05;
+                        key = wParam;
+                        }
+                        break;
+       case WM_MOUSEMOVE:
+                        {
+                        static int lastx,lasty,lastdx,lastdy;
+                        int x,y,dx,dy;
+
+                        x=LOWORD(lParam);
+                        y=HIWORD(lParam);
+                        dx=lastx-x;
+                        dy=lasty-y;
+                        if (dx != 0 && dy != 0 && dx-lastdx != 0 && dy-lastdy != 0)
+                                add_entropy=.2;
+                        lastx=x, lasty=y;
+                        lastdx=dx, lastdy=dy;
+                        }
+               break;
+               }
+
+        GetSystemTime(&t);
+        RAND_add(&iMsg, sizeof(iMsg), add_entropy);
+       RAND_add(&wParam, sizeof(wParam), 0);
+       RAND_add(&lParam, sizeof(lParam), 0);
+        RAND_add(&t, sizeof(t), 0);
+
+       return (RAND_status());
+       }
+
 /*****************************************************************************
  * Initialisation function for the SSL random generator.  Takes the contents
  * of the screen as random seed.
index 28f45ec..2973ee9 100644 (file)
@@ -70,8 +70,13 @@ typedef struct rand_meth_st
        void (*cleanup)(void);
        void (*add)(const void *buf, int num, double entropy);
        int (*pseudorand)(unsigned char *buf, int num);
+       int (*status)(void);
        } RAND_METHOD;
 
+#ifdef BN_DEBUG
+extern int rand_predictable;
+#endif
+
 void RAND_set_rand_method(RAND_METHOD *meth);
 RAND_METHOD *RAND_get_rand_method(void );
 RAND_METHOD *RAND_SSLeay(void);
@@ -85,8 +90,10 @@ int  RAND_write_file(const char *file);
 const char *RAND_file_name(char *file,int num);
 int RAND_status(void);
 int RAND_egd(const char *path);
-#ifdef WINDOWS
+#if defined(WINDOWS) || defined(WIN32)
+#include <windows.h>
 void RAND_screen(void);
+int RAND_event(UINT, WPARAM, LPARAM);
 #endif
 void   ERR_load_RAND_strings(void);
 
index d834408..380c782 100644 (file)
@@ -97,7 +97,7 @@ int RAND_egd(const char *path)
        buf[1] = 255;
        write(fd, buf, 2);
        if (read(fd, buf, 1) != 1) goto err;
-    if (buf[0] == 0) goto err;
+       if (buf[0] == 0) goto err;
        num = read(fd, buf, 255);
        if (num < 1) goto err;
        RAND_seed(buf, num);
index d1263ed..1af0aa0 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
@@ -71,7 +72,7 @@ static ERR_STRING_DATA RAND_str_functs[]=
 
 static ERR_STRING_DATA RAND_str_reasons[]=
        {
-{RAND_R_PRNG_NOT_SEEDED                  ,"prng not seeded"},
+{RAND_R_PRNG_NOT_SEEDED                  ,"PRNG not seeded"},
 {0,NULL}
        };
 
index b09a300..7da74aa 100644 (file)
@@ -108,3 +108,10 @@ int RAND_pseudo_bytes(unsigned char *buf, int num)
                return rand_meth->pseudorand(buf,num);
        return(-1);
        }
+
+int RAND_status(void)
+       {
+       if (rand_meth != NULL)
+               return rand_meth->status();
+       return 0;
+       }
index 658a8d6..9ff3974 100644 (file)
@@ -133,35 +133,20 @@ int RAND_write_file(const char *file)
        int i,ret=0,err=0;
        FILE *out = NULL;
        int n;
-
-#ifdef VMS
-       /* Under VMS, fopen(file, "wb") will create a new version of the
-          same file.  This is not good, so let's try updating an existing
-          one, and create file only if it doesn't already exist. */
-       /* At the same time, if we just update a file, we also need to
-          truncate it, and unfortunately, ftruncate() and truncate() do
-          not exist everywhere.  All that remains is to delete old versions
-          of the random data file (done at the end). */
-#if 0
-       out=fopen(file,"rb+");
-       if (out == NULL && errno != ENOENT)
-               goto err;
-#endif
+       
+#if defined(O_CREAT) && defined(O_EXCL) && !defined(WIN32)
+       /* For some reason Win32 can't write to files created this way */
+
+        /* chmod(..., 0600) is too late to protect the file,
+         * permissions should be restrictive from the start */
+        int fd = open(file, O_CREAT | O_EXCL, 0600);
+        if (fd != -1)
+                out = fdopen(fd, "wb");
 #endif
+        if (out == NULL)
+                out = fopen(file,"wb");
+        if (out == NULL) goto err;
 
-       if (out == NULL)
-               {
-#if defined O_CREAT && defined O_EXCL
-               /* chmod(..., 0600) is too late to protect the file,
-                * permissions should be restrictive from the start */
-               int fd = open(file, O_CREAT | O_EXCL, 0600);
-               if (fd != -1)
-                       out = fdopen(fd, "wb");
-#else          
-               out=fopen(file,"wb");
-#endif
-               }
-       if (out == NULL) goto err;
 #ifndef NO_CHMOD
        chmod(file,0600);
 #endif
@@ -180,14 +165,8 @@ int RAND_write_file(const char *file)
                        }
                ret+=i;
                if (n <= 0) break;
-               }
+                }
 #ifdef VMS
-       /* We may have updated an existing file using mode "rb+",
-        * now remove any old extra bytes */
-#if 0
-       if (ret > 0)
-               ftruncate(fileno(out), ret);
-#else
        /* Try to delete older versions of the file, until there aren't
           any */
        {
@@ -205,8 +184,7 @@ int RAND_write_file(const char *file)
                                      some point... */
                }
        }
-#endif
-#endif
+#endif /* VMS */
 
        fclose(out);
        memset(buf,0,BUFSIZE);
index 4dc20c6..e69de29 100644 (file)
@@ -1,73 +0,0 @@
-# Targets
-# make          - twidle the options yourself :-)
-# make cc       - standard cc options
-# make gcc      - standard gcc options
-
-DIR=    rc2
-TOP=    .
-CC=     gcc
-CFLAG= -O3 -fomit-frame-pointer
-
-CPP=    $(CC) -E
-INCLUDES=
-INSTALLTOP=/usr/local/lib
-MAKE=           make
-MAKEDEPEND=     makedepend
-MAKEFILE=       Makefile.uni
-AR=             ar r
-RANLIB=         ranlib
-
-IDEA_ENC=rc2_cbc.o
-
-CFLAGS= $(INCLUDES) $(CFLAG)
-
-GENERAL=Makefile
-TEST=rc2test
-APPS=rc2speed
-
-LIB=librc2.a
-LIBSRC=rc2_skey.c rc2_ecb.c rc2_cbc.c rc2cfb64.c rc2ofb64.c
-LIBOBJ=rc2_skey.o rc2_ecb.o $(IDEA_ENC) rc2cfb64.o rc2ofb64.o
-
-SRC= $(LIBSRC)
-
-EXHEADER= rc2.h
-HEADER= rc2_locl.h $(EXHEADER)
-
-ALL=    $(GENERAL) $(SRC) $(HEADER)
-
-all:    $(LIB) $(TEST) $(APPS)
-
-$(LIB):    $(LIBOBJ)
-       $(AR) $(LIB) $(LIBOBJ)
-       $(RANLIB) $(LIB)
-
-test:  $(TEST)
-       ./$(TEST)
-
-$(TEST): $(TEST).c $(LIB)
-       $(CC) -o $(TEST) $(CFLAGS) $(TEST).c $(LIB)
-
-$(APPS): $(APPS).c $(LIB)
-       $(CC) -o $(APPS) $(CFLAGS) $(APPS).c $(LIB)
-
-lint:
-       lint -DLINT $(INCLUDES) $(SRC)>fluff
-
-depend:
-       $(MAKEDEPEND) $(INCLUDES) $(PROGS) $(LIBSRC)
-
-dclean:
-       perl -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) >Makefile.new
-       mv -f Makefile.new $(MAKEFILE)
-
-clean:
-       /bin/rm -f $(LIB) $(TEST) $(APPS) *.o asm/*.o *.obj lib tags core .pure .nfs* *.old *.bak fluff
-
-cc:
-       $(MAKE) CC="cc" CFLAG="-O" all
-
-gcc:
-       $(MAKE) CC="gcc" CFLAGS="-O3 -fomit-frame-pointer" all
-
-# DO NOT DELETE THIS LINE -- make depend depends on it.
index 2ea95f0..8d2a795 100644 (file)
@@ -5,6 +5,7 @@
 DIR=   rc4
 TOP=   ../..
 CC=    cc
+CPP=    $(CC) -E
 INCLUDES=
 CFLAG=-g
 INSTALL_PREFIX=
@@ -51,7 +52,7 @@ lib:  $(LIBOBJ)
 
 # elf
 asm/rx86-elf.o: asm/rx86unix.cpp
-       $(CPP) -DELF asm/rx86unix.cpp | as -o asm/rx86-elf.o
+       $(CPP) -DELF -x c asm/rx86unix.cpp | as -o asm/rx86-elf.o
 
 # solaris
 asm/rx86-sol.o: asm/rx86unix.cpp
@@ -67,7 +68,7 @@ asm/rx86-out.o: asm/rx86unix.cpp
 asm/rx86bsdi.o: asm/rx86unix.cpp
        $(CPP) -DBSDI asm/rx86unix.cpp | sed 's/ :/:/' | as -o asm/rx86bsdi.o
 
-asm/rx86unix.cpp: asm/rc4-586.pl
+asm/rx86unix.cpp: asm/rc4-586.pl ../perlasm/x86asm.pl
        (cd asm; $(PERL) rc4-586.pl cpp >rx86unix.cpp)
 
 files:
index 855d9e5..e69de29 100644 (file)
@@ -1,103 +0,0 @@
-# Targets
-# make          - twidle the options yourself :-)
-# make cc       - standard cc options
-# make gcc      - standard gcc options
-# make x86-elf  - linux-elf etc
-# make x86-out  - linux-a.out, FreeBSD etc
-# make x86-solaris
-# make x86-bdsi
-
-DIR=    rc4
-TOP=    .
-CC=     gcc
-CFLAG= -O3 -fomit-frame-pointer
-
-CPP=    $(CC) -E
-INCLUDES=
-INSTALLTOP=/usr/local/lib
-MAKE=           make
-MAKEDEPEND=     makedepend
-MAKEFILE=       Makefile.uni
-AR=             ar r
-RANLIB=         ranlib
-
-RC4_ENC=rc4_enc.o
-# or use
-#RC4_ENC=asm/rx86-elf.o
-#RC4_ENC=asm/rx86-out.o
-#RC4_ENC=asm/rx86-sol.o
-#RC4_ENC=asm/rx86bdsi.o
-
-CFLAGS= $(INCLUDES) $(CFLAG)
-
-GENERAL=Makefile
-TEST=rc4test
-APPS=rc4speed
-
-LIB=librc4.a
-LIBSRC=rc4_skey.c rc4_enc.c
-LIBOBJ=rc4_skey.o $(RC4_ENC)
-
-SRC= $(LIBSRC)
-
-EXHEADER= rc4.h
-HEADER= $(EXHEADER) rc4_locl.h
-
-ALL=    $(GENERAL) $(SRC) $(HEADER)
-
-all:    $(LIB) $(TEST) $(APPS)
-
-$(LIB):    $(LIBOBJ)
-       $(AR) $(LIB) $(LIBOBJ)
-       $(RANLIB) $(LIB)
-
-# elf
-asm/rx86-elf.o: asm/rx86unix.cpp
-       $(CPP) -DELF asm/rx86unix.cpp | as -o asm/rx86-elf.o
-
-# solaris
-asm/rx86-sol.o: asm/rx86unix.cpp
-       $(CC) -E -DSOL asm/rx86unix.cpp | sed 's/^#.*//' > asm/rx86-sol.s
-       as -o asm/rx86-sol.o asm/rx86-sol.s
-       rm -f asm/rx86-sol.s
-
-# a.out
-asm/rx86-out.o: asm/rx86unix.cpp
-       $(CPP) -DOUT asm/rx86unix.cpp | as -o asm/rx86-out.o
-
-# bsdi
-asm/rx86bsdi.o: asm/rx86unix.cpp
-       $(CPP) -DBSDI asm/rx86unix.cpp | as -o asm/rx86bsdi.o
-
-asm/rx86unix.cpp:
-       (cd asm; perl rc4-586.pl cpp >rx86unix.cpp)
-
-test:  $(TEST)
-       ./$(TEST)
-
-$(TEST): $(TEST).c $(LIB)
-       $(CC) -o $(TEST) $(CFLAGS) $(TEST).c $(LIB)
-
-$(APPS): $(APPS).c $(LIB)
-       $(CC) -o $(APPS) $(CFLAGS) $(APPS).c $(LIB)
-
-lint:
-       lint -DLINT $(INCLUDES) $(SRC)>fluff
-
-depend:
-       $(MAKEDEPEND) $(INCLUDES) $(PROGS) $(LIBSRC)
-
-dclean:
-       perl -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) >Makefile.new
-       mv -f Makefile.new $(MAKEFILE)
-
-clean:
-       /bin/rm -f $(LIB) $(TEST) $(APPS) *.o asm/*.o *.obj lib tags core .pure .nfs* *.old *.bak fluff
-
-cc:
-       $(MAKE) CC="cc" CFLAG="-O" all
-
-gcc:
-       $(MAKE) CC="gcc" CFLAGS="-O3 -fomit-frame-pointer" all
-
-# DO NOT DELETE THIS LINE -- make depend depends on it.
index 70b0f74..e69de29 100644 (file)
@@ -1,314 +0,0 @@
-       ; Don't even think of reading this code
-       ; It was automatically generated by rc4-586.pl
-       ; Which is a perl program used to generate the x86 assember for
-       ; any of elf, a.out, BSDI,Win32, or Solaris
-       ; eric <eay@cryptsoft.com>
-       ; 
-       TITLE   rc4-586.asm
-        .386
-.model FLAT
-_TEXT  SEGMENT
-PUBLIC _RC4
-
-_RC4 PROC NEAR
-       ; 
-       push    ebp
-       push    ebx
-       mov     ebp,            DWORD PTR 12[esp]
-       mov     ebx,            DWORD PTR 16[esp]
-       push    esi
-       push    edi
-       mov     ecx,            DWORD PTR [ebp]
-       mov     edx,            DWORD PTR 4[ebp]
-       mov     esi,            DWORD PTR 28[esp]
-       inc     ecx
-       sub     esp,            12
-       add     ebp,            8
-       and     ecx,            255
-       lea     ebx,            DWORD PTR [esi+ebx-8]
-       mov     edi,            DWORD PTR 44[esp]
-       mov     DWORD PTR 8[esp],ebx
-       mov     eax,            DWORD PTR [ecx*4+ebp]
-       cmp     ebx,            esi
-       jl      $L000end
-L001start:
-       add     esi,            8
-       ; Round 0
-       add     edx,            eax
-       and     edx,            255
-       inc     ecx
-       mov     ebx,            DWORD PTR [edx*4+ebp]
-       mov     DWORD PTR [ecx*4+ebp-4],ebx
-       add     ebx,            eax
-       and     ecx,            255
-       and     ebx,            255
-       mov     DWORD PTR [edx*4+ebp],eax
-       nop
-       mov     ebx,            DWORD PTR [ebx*4+ebp]
-       mov     eax,            DWORD PTR [ecx*4+ebp]
-       mov     BYTE PTR [esp], bl
-       ; Round 1
-       add     edx,            eax
-       and     edx,            255
-       inc     ecx
-       mov     ebx,            DWORD PTR [edx*4+ebp]
-       mov     DWORD PTR [ecx*4+ebp-4],ebx
-       add     ebx,            eax
-       and     ecx,            255
-       and     ebx,            255
-       mov     DWORD PTR [edx*4+ebp],eax
-       nop
-       mov     ebx,            DWORD PTR [ebx*4+ebp]
-       mov     eax,            DWORD PTR [ecx*4+ebp]
-       mov     BYTE PTR 1[esp],bl
-       ; Round 2
-       add     edx,            eax
-       and     edx,            255
-       inc     ecx
-       mov     ebx,            DWORD PTR [edx*4+ebp]
-       mov     DWORD PTR [ecx*4+ebp-4],ebx
-       add     ebx,            eax
-       and     ecx,            255
-       and     ebx,            255
-       mov     DWORD PTR [edx*4+ebp],eax
-       nop
-       mov     ebx,            DWORD PTR [ebx*4+ebp]
-       mov     eax,            DWORD PTR [ecx*4+ebp]
-       mov     BYTE PTR 2[esp],bl
-       ; Round 3
-       add     edx,            eax
-       and     edx,            255
-       inc     ecx
-       mov     ebx,            DWORD PTR [edx*4+ebp]
-       mov     DWORD PTR [ecx*4+ebp-4],ebx
-       add     ebx,            eax
-       and     ecx,            255
-       and     ebx,            255
-       mov     DWORD PTR [edx*4+ebp],eax
-       nop
-       mov     ebx,            DWORD PTR [ebx*4+ebp]
-       mov     eax,            DWORD PTR [ecx*4+ebp]
-       mov     BYTE PTR 3[esp],bl
-       ; Round 4
-       add     edx,            eax
-       and     edx,            255
-       inc     ecx
-       mov     ebx,            DWORD PTR [edx*4+ebp]
-       mov     DWORD PTR [ecx*4+ebp-4],ebx
-       add     ebx,            eax
-       and     ecx,            255
-       and     ebx,            255
-       mov     DWORD PTR [edx*4+ebp],eax
-       nop
-       mov     ebx,            DWORD PTR [ebx*4+ebp]
-       mov     eax,            DWORD PTR [ecx*4+ebp]
-       mov     BYTE PTR 4[esp],bl
-       ; Round 5
-       add     edx,            eax
-       and     edx,            255
-       inc     ecx
-       mov     ebx,            DWORD PTR [edx*4+ebp]
-       mov     DWORD PTR [ecx*4+ebp-4],ebx
-       add     ebx,            eax
-       and     ecx,            255
-       and     ebx,            255
-       mov     DWORD PTR [edx*4+ebp],eax
-       nop
-       mov     ebx,            DWORD PTR [ebx*4+ebp]
-       mov     eax,            DWORD PTR [ecx*4+ebp]
-       mov     BYTE PTR 5[esp],bl
-       ; Round 6
-       add     edx,            eax
-       and     edx,            255
-       inc     ecx
-       mov     ebx,            DWORD PTR [edx*4+ebp]
-       mov     DWORD PTR [ecx*4+ebp-4],ebx
-       add     ebx,            eax
-       and     ecx,            255
-       and     ebx,            255
-       mov     DWORD PTR [edx*4+ebp],eax
-       nop
-       mov     ebx,            DWORD PTR [ebx*4+ebp]
-       mov     eax,            DWORD PTR [ecx*4+ebp]
-       mov     BYTE PTR 6[esp],bl
-       ; Round 7
-       add     edx,            eax
-       and     edx,            255
-       inc     ecx
-       mov     ebx,            DWORD PTR [edx*4+ebp]
-       mov     DWORD PTR [ecx*4+ebp-4],ebx
-       add     ebx,            eax
-       and     ecx,            255
-       and     ebx,            255
-       mov     DWORD PTR [edx*4+ebp],eax
-       nop
-       mov     ebx,            DWORD PTR [ebx*4+ebp]
-       add     edi,            8
-       mov     BYTE PTR 7[esp],bl
-       ; apply the cipher text
-       mov     eax,            DWORD PTR [esp]
-       mov     ebx,            DWORD PTR [esi-8]
-       xor     eax,            ebx
-       mov     ebx,            DWORD PTR [esi-4]
-       mov     DWORD PTR [edi-8],eax
-       mov     eax,            DWORD PTR 4[esp]
-       xor     eax,            ebx
-       mov     ebx,            DWORD PTR 8[esp]
-       mov     DWORD PTR [edi-4],eax
-       mov     eax,            DWORD PTR [ecx*4+ebp]
-       cmp     esi,            ebx
-       jle     L001start
-$L000end:
-       ; Round 0
-       add     ebx,            8
-       inc     esi
-       cmp     ebx,            esi
-       jl      $L002finished
-       mov     DWORD PTR 8[esp],ebx
-       add     edx,            eax
-       and     edx,            255
-       inc     ecx
-       mov     ebx,            DWORD PTR [edx*4+ebp]
-       mov     DWORD PTR [ecx*4+ebp-4],ebx
-       add     ebx,            eax
-       and     ecx,            255
-       and     ebx,            255
-       mov     DWORD PTR [edx*4+ebp],eax
-       nop
-       mov     ebx,            DWORD PTR [ebx*4+ebp]
-       mov     eax,            DWORD PTR [ecx*4+ebp]
-       mov     bh,             BYTE PTR [esi-1]
-       xor     bl,             bh
-       mov     BYTE PTR [edi], bl
-       ; Round 1
-       mov     ebx,            DWORD PTR 8[esp]
-       cmp     ebx,            esi
-       jle     $L002finished
-       inc     esi
-       add     edx,            eax
-       and     edx,            255
-       inc     ecx
-       mov     ebx,            DWORD PTR [edx*4+ebp]
-       mov     DWORD PTR [ecx*4+ebp-4],ebx
-       add     ebx,            eax
-       and     ecx,            255
-       and     ebx,            255
-       mov     DWORD PTR [edx*4+ebp],eax
-       nop
-       mov     ebx,            DWORD PTR [ebx*4+ebp]
-       mov     eax,            DWORD PTR [ecx*4+ebp]
-       mov     bh,             BYTE PTR [esi-1]
-       xor     bl,             bh
-       mov     BYTE PTR 1[edi],bl
-       ; Round 2
-       mov     ebx,            DWORD PTR 8[esp]
-       cmp     ebx,            esi
-       jle     $L002finished
-       inc     esi
-       add     edx,            eax
-       and     edx,            255
-       inc     ecx
-       mov     ebx,            DWORD PTR [edx*4+ebp]
-       mov     DWORD PTR [ecx*4+ebp-4],ebx
-       add     ebx,            eax
-       and     ecx,            255
-       and     ebx,            255
-       mov     DWORD PTR [edx*4+ebp],eax
-       nop
-       mov     ebx,            DWORD PTR [ebx*4+ebp]
-       mov     eax,            DWORD PTR [ecx*4+ebp]
-       mov     bh,             BYTE PTR [esi-1]
-       xor     bl,             bh
-       mov     BYTE PTR 2[edi],bl
-       ; Round 3
-       mov     ebx,            DWORD PTR 8[esp]
-       cmp     ebx,            esi
-       jle     $L002finished
-       inc     esi
-       add     edx,            eax
-       and     edx,            255
-       inc     ecx
-       mov     ebx,            DWORD PTR [edx*4+ebp]
-       mov     DWORD PTR [ecx*4+ebp-4],ebx
-       add     ebx,            eax
-       and     ecx,            255
-       and     ebx,            255
-       mov     DWORD PTR [edx*4+ebp],eax
-       nop
-       mov     ebx,            DWORD PTR [ebx*4+ebp]
-       mov     eax,            DWORD PTR [ecx*4+ebp]
-       mov     bh,             BYTE PTR [esi-1]
-       xor     bl,             bh
-       mov     BYTE PTR 3[edi],bl
-       ; Round 4
-       mov     ebx,            DWORD PTR 8[esp]
-       cmp     ebx,            esi
-       jle     $L002finished
-       inc     esi
-       add     edx,            eax
-       and     edx,            255
-       inc     ecx
-       mov     ebx,            DWORD PTR [edx*4+ebp]
-       mov     DWORD PTR [ecx*4+ebp-4],ebx
-       add     ebx,            eax
-       and     ecx,            255
-       and     ebx,            255
-       mov     DWORD PTR [edx*4+ebp],eax
-       nop
-       mov     ebx,            DWORD PTR [ebx*4+ebp]
-       mov     eax,            DWORD PTR [ecx*4+ebp]
-       mov     bh,             BYTE PTR [esi-1]
-       xor     bl,             bh
-       mov     BYTE PTR 4[edi],bl
-       ; Round 5
-       mov     ebx,            DWORD PTR 8[esp]
-       cmp     ebx,            esi
-       jle     $L002finished
-       inc     esi
-       add     edx,            eax
-       and     edx,            255
-       inc     ecx
-       mov     ebx,            DWORD PTR [edx*4+ebp]
-       mov     DWORD PTR [ecx*4+ebp-4],ebx
-       add     ebx,            eax
-       and     ecx,            255
-       and     ebx,            255
-       mov     DWORD PTR [edx*4+ebp],eax
-       nop
-       mov     ebx,            DWORD PTR [ebx*4+ebp]
-       mov     eax,            DWORD PTR [ecx*4+ebp]
-       mov     bh,             BYTE PTR [esi-1]
-       xor     bl,             bh
-       mov     BYTE PTR 5[edi],bl
-       ; Round 6
-       mov     ebx,            DWORD PTR 8[esp]
-       cmp     ebx,            esi
-       jle     $L002finished
-       inc     esi
-       add     edx,            eax
-       and     edx,            255
-       inc     ecx
-       mov     ebx,            DWORD PTR [edx*4+ebp]
-       mov     DWORD PTR [ecx*4+ebp-4],ebx
-       add     ebx,            eax
-       and     ecx,            255
-       and     ebx,            255
-       mov     DWORD PTR [edx*4+ebp],eax
-       nop
-       mov     ebx,            DWORD PTR [ebx*4+ebp]
-       mov     bh,             BYTE PTR [esi-1]
-       xor     bl,             bh
-       mov     BYTE PTR 6[edi],bl
-$L002finished:
-       dec     ecx
-       add     esp,            12
-       mov     DWORD PTR [ebp-4],edx
-       mov     BYTE PTR [ebp-8],cl
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-_RC4 ENDP
-_TEXT  ENDS
-END
index 35abb9d..5a54a16 100644 (file)
@@ -49,7 +49,7 @@ lib:  $(LIBOBJ)
 
 # elf
 asm/r586-elf.o: asm/r586unix.cpp
-       $(CPP) -DELF asm/r586unix.cpp | as -o asm/r586-elf.o
+       $(CPP) -DELF -x c asm/r586unix.cpp | as -o asm/r586-elf.o
 
 # solaris
 asm/r586-sol.o: asm/r586unix.cpp
@@ -65,7 +65,7 @@ asm/r586-out.o: asm/r586unix.cpp
 asm/r586bsdi.o: asm/r586unix.cpp
        $(CPP) -DBSDI asm/r586unix.cpp | sed 's/ :/:/' | as -o asm/r586bsdi.o
 
-asm/r586unix.cpp:
+asm/r586unix.cpp: asm/rc5-586.pl ../perlasm/x86asm.pl ../perlasm/cbc.pl
        (cd asm; $(PERL) rc5-586.pl cpp >r586unix.cpp)
 
 files:
index 4dc20c6..e69de29 100644 (file)
@@ -1,73 +0,0 @@
-# Targets
-# make          - twidle the options yourself :-)
-# make cc       - standard cc options
-# make gcc      - standard gcc options
-
-DIR=    rc2
-TOP=    .
-CC=     gcc
-CFLAG= -O3 -fomit-frame-pointer
-
-CPP=    $(CC) -E
-INCLUDES=
-INSTALLTOP=/usr/local/lib
-MAKE=           make
-MAKEDEPEND=     makedepend
-MAKEFILE=       Makefile.uni
-AR=             ar r
-RANLIB=         ranlib
-
-IDEA_ENC=rc2_cbc.o
-
-CFLAGS= $(INCLUDES) $(CFLAG)
-
-GENERAL=Makefile
-TEST=rc2test
-APPS=rc2speed
-
-LIB=librc2.a
-LIBSRC=rc2_skey.c rc2_ecb.c rc2_cbc.c rc2cfb64.c rc2ofb64.c
-LIBOBJ=rc2_skey.o rc2_ecb.o $(IDEA_ENC) rc2cfb64.o rc2ofb64.o
-
-SRC= $(LIBSRC)
-
-EXHEADER= rc2.h
-HEADER= rc2_locl.h $(EXHEADER)
-
-ALL=    $(GENERAL) $(SRC) $(HEADER)
-
-all:    $(LIB) $(TEST) $(APPS)
-
-$(LIB):    $(LIBOBJ)
-       $(AR) $(LIB) $(LIBOBJ)
-       $(RANLIB) $(LIB)
-
-test:  $(TEST)
-       ./$(TEST)
-
-$(TEST): $(TEST).c $(LIB)
-       $(CC) -o $(TEST) $(CFLAGS) $(TEST).c $(LIB)
-
-$(APPS): $(APPS).c $(LIB)
-       $(CC) -o $(APPS) $(CFLAGS) $(APPS).c $(LIB)
-
-lint:
-       lint -DLINT $(INCLUDES) $(SRC)>fluff
-
-depend:
-       $(MAKEDEPEND) $(INCLUDES) $(PROGS) $(LIBSRC)
-
-dclean:
-       perl -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) >Makefile.new
-       mv -f Makefile.new $(MAKEFILE)
-
-clean:
-       /bin/rm -f $(LIB) $(TEST) $(APPS) *.o asm/*.o *.obj lib tags core .pure .nfs* *.old *.bak fluff
-
-cc:
-       $(MAKE) CC="cc" CFLAG="-O" all
-
-gcc:
-       $(MAKE) CC="gcc" CFLAGS="-O3 -fomit-frame-pointer" all
-
-# DO NOT DELETE THIS LINE -- make depend depends on it.
index f43d371..e69de29 100644 (file)
@@ -1,574 +0,0 @@
-       ; Don't even think of reading this code
-       ; It was automatically generated by rc5-586.pl
-       ; Which is a perl program used to generate the x86 assember for
-       ; any of elf, a.out, BSDI,Win32, or Solaris
-       ; eric <eay@cryptsoft.com>
-       ; 
-       TITLE   rc5-586.asm
-        .386
-.model FLAT
-_TEXT  SEGMENT
-PUBLIC _RC5_32_encrypt
-
-_RC5_32_encrypt PROC NEAR
-       ; 
-       push    ebp
-       push    esi
-       push    edi
-       mov     edx,            DWORD PTR 16[esp]
-       mov     ebp,            DWORD PTR 20[esp]
-       ; Load the 2 words
-       mov     edi,            DWORD PTR [edx]
-       mov     esi,            DWORD PTR 4[edx]
-       push    ebx
-       mov     ebx,            DWORD PTR [ebp]
-       add     edi,            DWORD PTR 4[ebp]
-       add     esi,            DWORD PTR 8[ebp]
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 12[ebp]
-       mov     ecx,            esi
-       rol     edi,            cl
-       add     edi,            eax
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 16[ebp]
-       mov     ecx,            edi
-       rol     esi,            cl
-       add     esi,            eax
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 20[ebp]
-       mov     ecx,            esi
-       rol     edi,            cl
-       add     edi,            eax
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 24[ebp]
-       mov     ecx,            edi
-       rol     esi,            cl
-       add     esi,            eax
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 28[ebp]
-       mov     ecx,            esi
-       rol     edi,            cl
-       add     edi,            eax
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 32[ebp]
-       mov     ecx,            edi
-       rol     esi,            cl
-       add     esi,            eax
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 36[ebp]
-       mov     ecx,            esi
-       rol     edi,            cl
-       add     edi,            eax
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 40[ebp]
-       mov     ecx,            edi
-       rol     esi,            cl
-       add     esi,            eax
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 44[ebp]
-       mov     ecx,            esi
-       rol     edi,            cl
-       add     edi,            eax
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 48[ebp]
-       mov     ecx,            edi
-       rol     esi,            cl
-       add     esi,            eax
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 52[ebp]
-       mov     ecx,            esi
-       rol     edi,            cl
-       add     edi,            eax
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 56[ebp]
-       mov     ecx,            edi
-       rol     esi,            cl
-       add     esi,            eax
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 60[ebp]
-       mov     ecx,            esi
-       rol     edi,            cl
-       add     edi,            eax
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 64[ebp]
-       mov     ecx,            edi
-       rol     esi,            cl
-       add     esi,            eax
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 68[ebp]
-       mov     ecx,            esi
-       rol     edi,            cl
-       add     edi,            eax
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 72[ebp]
-       mov     ecx,            edi
-       rol     esi,            cl
-       add     esi,            eax
-       cmp     ebx,            8
-       je      $L000rc5_exit
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 76[ebp]
-       mov     ecx,            esi
-       rol     edi,            cl
-       add     edi,            eax
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 80[ebp]
-       mov     ecx,            edi
-       rol     esi,            cl
-       add     esi,            eax
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 84[ebp]
-       mov     ecx,            esi
-       rol     edi,            cl
-       add     edi,            eax
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 88[ebp]
-       mov     ecx,            edi
-       rol     esi,            cl
-       add     esi,            eax
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 92[ebp]
-       mov     ecx,            esi
-       rol     edi,            cl
-       add     edi,            eax
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 96[ebp]
-       mov     ecx,            edi
-       rol     esi,            cl
-       add     esi,            eax
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 100[ebp]
-       mov     ecx,            esi
-       rol     edi,            cl
-       add     edi,            eax
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 104[ebp]
-       mov     ecx,            edi
-       rol     esi,            cl
-       add     esi,            eax
-       cmp     ebx,            12
-       je      $L000rc5_exit
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 108[ebp]
-       mov     ecx,            esi
-       rol     edi,            cl
-       add     edi,            eax
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 112[ebp]
-       mov     ecx,            edi
-       rol     esi,            cl
-       add     esi,            eax
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 116[ebp]
-       mov     ecx,            esi
-       rol     edi,            cl
-       add     edi,            eax
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 120[ebp]
-       mov     ecx,            edi
-       rol     esi,            cl
-       add     esi,            eax
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 124[ebp]
-       mov     ecx,            esi
-       rol     edi,            cl
-       add     edi,            eax
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 128[ebp]
-       mov     ecx,            edi
-       rol     esi,            cl
-       add     esi,            eax
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 132[ebp]
-       mov     ecx,            esi
-       rol     edi,            cl
-       add     edi,            eax
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 136[ebp]
-       mov     ecx,            edi
-       rol     esi,            cl
-       add     esi,            eax
-$L000rc5_exit:
-       mov     DWORD PTR [edx],edi
-       mov     DWORD PTR 4[edx],esi
-       pop     ebx
-       pop     edi
-       pop     esi
-       pop     ebp
-       ret
-_RC5_32_encrypt ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _RC5_32_decrypt
-
-_RC5_32_decrypt PROC NEAR
-       ; 
-       push    ebp
-       push    esi
-       push    edi
-       mov     edx,            DWORD PTR 16[esp]
-       mov     ebp,            DWORD PTR 20[esp]
-       ; Load the 2 words
-       mov     edi,            DWORD PTR [edx]
-       mov     esi,            DWORD PTR 4[edx]
-       push    ebx
-       mov     ebx,            DWORD PTR [ebp]
-       cmp     ebx,            12
-       je      $L001rc5_dec_12
-       cmp     ebx,            8
-       je      $L002rc5_dec_8
-       mov     eax,            DWORD PTR 136[ebp]
-       sub     esi,            eax
-       mov     ecx,            edi
-       ror     esi,            cl
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 132[ebp]
-       sub     edi,            eax
-       mov     ecx,            esi
-       ror     edi,            cl
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 128[ebp]
-       sub     esi,            eax
-       mov     ecx,            edi
-       ror     esi,            cl
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 124[ebp]
-       sub     edi,            eax
-       mov     ecx,            esi
-       ror     edi,            cl
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 120[ebp]
-       sub     esi,            eax
-       mov     ecx,            edi
-       ror     esi,            cl
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 116[ebp]
-       sub     edi,            eax
-       mov     ecx,            esi
-       ror     edi,            cl
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 112[ebp]
-       sub     esi,            eax
-       mov     ecx,            edi
-       ror     esi,            cl
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 108[ebp]
-       sub     edi,            eax
-       mov     ecx,            esi
-       ror     edi,            cl
-       xor     edi,            esi
-$L001rc5_dec_12:
-       mov     eax,            DWORD PTR 104[ebp]
-       sub     esi,            eax
-       mov     ecx,            edi
-       ror     esi,            cl
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 100[ebp]
-       sub     edi,            eax
-       mov     ecx,            esi
-       ror     edi,            cl
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 96[ebp]
-       sub     esi,            eax
-       mov     ecx,            edi
-       ror     esi,            cl
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 92[ebp]
-       sub     edi,            eax
-       mov     ecx,            esi
-       ror     edi,            cl
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 88[ebp]
-       sub     esi,            eax
-       mov     ecx,            edi
-       ror     esi,            cl
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 84[ebp]
-       sub     edi,            eax
-       mov     ecx,            esi
-       ror     edi,            cl
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 80[ebp]
-       sub     esi,            eax
-       mov     ecx,            edi
-       ror     esi,            cl
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 76[ebp]
-       sub     edi,            eax
-       mov     ecx,            esi
-       ror     edi,            cl
-       xor     edi,            esi
-$L002rc5_dec_8:
-       mov     eax,            DWORD PTR 72[ebp]
-       sub     esi,            eax
-       mov     ecx,            edi
-       ror     esi,            cl
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 68[ebp]
-       sub     edi,            eax
-       mov     ecx,            esi
-       ror     edi,            cl
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 64[ebp]
-       sub     esi,            eax
-       mov     ecx,            edi
-       ror     esi,            cl
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 60[ebp]
-       sub     edi,            eax
-       mov     ecx,            esi
-       ror     edi,            cl
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 56[ebp]
-       sub     esi,            eax
-       mov     ecx,            edi
-       ror     esi,            cl
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 52[ebp]
-       sub     edi,            eax
-       mov     ecx,            esi
-       ror     edi,            cl
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 48[ebp]
-       sub     esi,            eax
-       mov     ecx,            edi
-       ror     esi,            cl
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 44[ebp]
-       sub     edi,            eax
-       mov     ecx,            esi
-       ror     edi,            cl
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 40[ebp]
-       sub     esi,            eax
-       mov     ecx,            edi
-       ror     esi,            cl
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 36[ebp]
-       sub     edi,            eax
-       mov     ecx,            esi
-       ror     edi,            cl
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 32[ebp]
-       sub     esi,            eax
-       mov     ecx,            edi
-       ror     esi,            cl
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 28[ebp]
-       sub     edi,            eax
-       mov     ecx,            esi
-       ror     edi,            cl
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 24[ebp]
-       sub     esi,            eax
-       mov     ecx,            edi
-       ror     esi,            cl
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 20[ebp]
-       sub     edi,            eax
-       mov     ecx,            esi
-       ror     edi,            cl
-       xor     edi,            esi
-       mov     eax,            DWORD PTR 16[ebp]
-       sub     esi,            eax
-       mov     ecx,            edi
-       ror     esi,            cl
-       xor     esi,            edi
-       mov     eax,            DWORD PTR 12[ebp]
-       sub     edi,            eax
-       mov     ecx,            esi
-       ror     edi,            cl
-       xor     edi,            esi
-       sub     esi,            DWORD PTR 8[ebp]
-       sub     edi,            DWORD PTR 4[ebp]
-L003rc5_exit:
-       mov     DWORD PTR [edx],edi
-       mov     DWORD PTR 4[edx],esi
-       pop     ebx
-       pop     edi
-       pop     esi
-       pop     ebp
-       ret
-_RC5_32_decrypt ENDP
-_TEXT  ENDS
-_TEXT  SEGMENT
-PUBLIC _RC5_32_cbc_encrypt
-
-_RC5_32_cbc_encrypt PROC NEAR
-       ; 
-       push    ebp
-       push    ebx
-       push    esi
-       push    edi
-       mov     ebp,            DWORD PTR 28[esp]
-       ; getting iv ptr from parameter 4
-       mov     ebx,            DWORD PTR 36[esp]
-       mov     esi,            DWORD PTR [ebx]
-       mov     edi,            DWORD PTR 4[ebx]
-       push    edi
-       push    esi
-       push    edi
-       push    esi
-       mov     ebx,            esp
-       mov     esi,            DWORD PTR 36[esp]
-       mov     edi,            DWORD PTR 40[esp]
-       ; getting encrypt flag from parameter 5
-       mov     ecx,            DWORD PTR 56[esp]
-       ; get and push parameter 3
-       mov     eax,            DWORD PTR 48[esp]
-       push    eax
-       push    ebx
-       cmp     ecx,            0
-       jz      $L004decrypt
-       and     ebp,            4294967288
-       mov     eax,            DWORD PTR 8[esp]
-       mov     ebx,            DWORD PTR 12[esp]
-       jz      $L005encrypt_finish
-L006encrypt_loop:
-       mov     ecx,            DWORD PTR [esi]
-       mov     edx,            DWORD PTR 4[esi]
-       xor     eax,            ecx
-       xor     ebx,            edx
-       mov     DWORD PTR 8[esp],eax
-       mov     DWORD PTR 12[esp],ebx
-       call    _RC5_32_encrypt
-       mov     eax,            DWORD PTR 8[esp]
-       mov     ebx,            DWORD PTR 12[esp]
-       mov     DWORD PTR [edi],eax
-       mov     DWORD PTR 4[edi],ebx
-       add     esi,            8
-       add     edi,            8
-       sub     ebp,            8
-       jnz     L006encrypt_loop
-$L005encrypt_finish:
-       mov     ebp,            DWORD PTR 52[esp]
-       and     ebp,            7
-       jz      $L007finish
-       xor     ecx,            ecx
-       xor     edx,            edx
-       mov     ebp,            DWORD PTR $L008cbc_enc_jmp_table[ebp*4]
-       jmp      ebp
-L009ej7:
-       mov     dh,             BYTE PTR 6[esi]
-       shl     edx,            8
-L010ej6:
-       mov     dh,             BYTE PTR 5[esi]
-L011ej5:
-       mov     dl,             BYTE PTR 4[esi]
-L012ej4:
-       mov     ecx,            DWORD PTR [esi]
-       jmp     $L013ejend
-L014ej3:
-       mov     ch,             BYTE PTR 2[esi]
-       shl     ecx,            8
-L015ej2:
-       mov     ch,             BYTE PTR 1[esi]
-L016ej1:
-       mov     cl,             BYTE PTR [esi]
-$L013ejend:
-       xor     eax,            ecx
-       xor     ebx,            edx
-       mov     DWORD PTR 8[esp],eax
-       mov     DWORD PTR 12[esp],ebx
-       call    _RC5_32_encrypt
-       mov     eax,            DWORD PTR 8[esp]
-       mov     ebx,            DWORD PTR 12[esp]
-       mov     DWORD PTR [edi],eax
-       mov     DWORD PTR 4[edi],ebx
-       jmp     $L007finish
-$L004decrypt:
-       and     ebp,            4294967288
-       mov     eax,            DWORD PTR 16[esp]
-       mov     ebx,            DWORD PTR 20[esp]
-       jz      $L017decrypt_finish
-L018decrypt_loop:
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-       mov     DWORD PTR 8[esp],eax
-       mov     DWORD PTR 12[esp],ebx
-       call    _RC5_32_decrypt
-       mov     eax,            DWORD PTR 8[esp]
-       mov     ebx,            DWORD PTR 12[esp]
-       mov     ecx,            DWORD PTR 16[esp]
-       mov     edx,            DWORD PTR 20[esp]
-       xor     ecx,            eax
-       xor     edx,            ebx
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-       mov     DWORD PTR [edi],ecx
-       mov     DWORD PTR 4[edi],edx
-       mov     DWORD PTR 16[esp],eax
-       mov     DWORD PTR 20[esp],ebx
-       add     esi,            8
-       add     edi,            8
-       sub     ebp,            8
-       jnz     L018decrypt_loop
-$L017decrypt_finish:
-       mov     ebp,            DWORD PTR 52[esp]
-       and     ebp,            7
-       jz      $L007finish
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-       mov     DWORD PTR 8[esp],eax
-       mov     DWORD PTR 12[esp],ebx
-       call    _RC5_32_decrypt
-       mov     eax,            DWORD PTR 8[esp]
-       mov     ebx,            DWORD PTR 12[esp]
-       mov     ecx,            DWORD PTR 16[esp]
-       mov     edx,            DWORD PTR 20[esp]
-       xor     ecx,            eax
-       xor     edx,            ebx
-       mov     eax,            DWORD PTR [esi]
-       mov     ebx,            DWORD PTR 4[esi]
-L019dj7:
-       ror     edx,            16
-       mov     BYTE PTR 6[edi],dl
-       shr     edx,            16
-L020dj6:
-       mov     BYTE PTR 5[edi],dh
-L021dj5:
-       mov     BYTE PTR 4[edi],dl
-L022dj4:
-       mov     DWORD PTR [edi],ecx
-       jmp     $L023djend
-L024dj3:
-       ror     ecx,            16
-       mov     BYTE PTR 2[edi],cl
-       shl     ecx,            16
-L025dj2:
-       mov     BYTE PTR 1[esi],ch
-L026dj1:
-       mov     BYTE PTR [esi], cl
-$L023djend:
-       jmp     $L007finish
-$L007finish:
-       mov     ecx,            DWORD PTR 60[esp]
-       add     esp,            24
-       mov     DWORD PTR [ecx],eax
-       mov     DWORD PTR 4[ecx],ebx
-       pop     edi
-       pop     esi
-       pop     ebx
-       pop     ebp
-       ret
-$L008cbc_enc_jmp_table:
-       DD      0
-       DD      L016ej1
-       DD      L015ej2
-       DD      L014ej3
-       DD      L012ej4
-       DD      L011ej5
-       DD      L010ej6
-       DD      L009ej7
-L027cbc_dec_jmp_table:
-       DD      0
-       DD      L026dj1
-       DD      L025dj2
-       DD      L024dj3
-       DD      L022dj4
-       DD      L021dj5
-       DD      L020dj6
-       DD      L019dj7
-_RC5_32_cbc_encrypt ENDP
-_TEXT  ENDS
-END
index c6153d4..6ada9f0 100644 (file)
@@ -47,7 +47,7 @@ lib:    $(LIBOBJ)
 
 # elf
 asm/rm86-elf.o: asm/rm86unix.cpp
-       $(CPP) -DELF asm/rm86unix.cpp | as -o asm/rm86-elf.o
+       $(CPP) -DELF -x c asm/rm86unix.cpp | as -o asm/rm86-elf.o
 
 # solaris
 asm/rm86-sol.o: asm/rm86unix.cpp
@@ -63,7 +63,7 @@ asm/rm86-out.o: asm/rm86unix.cpp
 asm/rm86bsdi.o: asm/rm86unix.cpp
        $(CPP) -DBSDI asm/rm86unix.cpp | sed 's/ :/:/' | as -o asm/rm86bsdi.o
 
-asm/rm86unix.cpp: asm/rmd-586.pl
+asm/rm86unix.cpp: asm/rmd-586.pl ../perlasm/x86asm.pl
        (cd asm; $(PERL) rmd-586.pl cpp >rm86unix.cpp)
 
 files:
index 5310020..e69de29 100644 (file)
@@ -1,109 +0,0 @@
-# Targets
-# make          - twidle the options yourself :-)
-# make cc       - standard cc options
-# make gcc      - standard gcc options
-# make x86-elf  - linux-elf etc
-# make x86-out  - linux-a.out, FreeBSD etc
-# make x86-solaris
-# make x86-bdsi
-
-DIR=    md5
-TOP=    .
-CC=     gcc
-CFLAG= -O3 -fomit-frame-pointer
-
-CPP=    $(CC) -E
-INCLUDES=
-INSTALLTOP=/usr/local/lib
-MAKE=           make
-MAKEDEPEND=     makedepend
-MAKEFILE=       Makefile.uni
-AR=             ar r
-
-MD5_ASM_OBJ=
-
-CFLAGS= $(INCLUDES) $(CFLAG)
-
-GENERAL=Makefile
-TEST=md5test
-APPS=md5
-
-LIB=libmd5.a
-LIBSRC=md5_dgst.c md5_one.c
-LIBOBJ=md5_dgst.o md5_one.o $(MD5_ASM_OBJ)
-
-SRC= $(LIBSRC)
-
-EXHEADER= md5.h
-HEADER= md5_locl.h $(EXHEADER)
-
-ALL=    $(GENERAL) $(SRC) $(HEADER)
-
-all:    $(LIB) $(TEST) $(APPS)
-
-$(LIB):    $(LIBOBJ)
-       $(AR) $(LIB) $(LIBOBJ)
-       $(RANLIB) $(LIB)
-
-# elf
-asm/mx86-elf.o: asm/mx86unix.cpp
-       $(CPP) -DELF asm/mx86unix.cpp | as -o asm/mx86-elf.o
-
-# solaris
-asm/mx86-sol.o: asm/mx86unix.cpp
-       $(CC) -E -DSOL asm/mx86unix.cpp | sed 's/^#.*//' > asm/mx86-sol.s
-       as -o asm/mx86-sol.o asm/mx86-sol.s
-       rm -f asm/mx86-sol.s
-
-# a.out
-asm/mx86-out.o: asm/mx86unix.cpp
-       $(CPP) -DOUT asm/mx86unix.cpp | as -o asm/mx86-out.o
-
-# bsdi
-asm/mx86bsdi.o: asm/mx86unix.cpp
-       $(CPP) -DBSDI asm/mx86unix.cpp | as -o asm/mx86bsdi.o
-
-asm/mx86unix.cpp:
-       (cd asm; perl md5-586.pl cpp >mx86unix.cpp)
-
-test:  $(TEST)
-       ./$(TEST)
-
-$(TEST): $(TEST).c $(LIB)
-       $(CC) -o $(TEST) $(CFLAGS) $(TEST).c $(LIB)
-
-$(APPS): $(APPS).c $(LIB)
-       $(CC) -o $(APPS) $(CFLAGS) $(APPS).c $(LIB)
-
-lint:
-       lint -DLINT $(INCLUDES) $(SRC)>fluff
-
-depend:
-       $(MAKEDEPEND) $(INCLUDES) $(PROGS) $(LIBSRC)
-
-dclean:
-       perl -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) >Makefile.new
-       mv -f Makefile.new $(MAKEFILE)
-
-clean:
-       /bin/rm -f $(LIB) $(TEST) $(APPS) *.o asm/*.o *.obj lib tags core .pure .nfs* *.old *.bak fluff
-
-cc:
-       $(MAKE) MD5_ASM_OBJ="" CC="cc" CFLAG="-O" all
-
-gcc:
-       $(MAKE) MD5_ASM_OBJ="" CC="gcc" CFLAGS="-O3 -fomit-frame-pointer" all
-
-x86-elf:
-       $(MAKE) MD5_ASM_OBJ="asm/mx86-elf.o" CFLAG="-DELF -DMD5_ASM -DL_ENDIAN $(CFLAGS)" all
-
-x86-out:
-       $(MAKE) MD5_ASM_OBJ="asm/mx86-out.o" CFLAG="-DOUT -DMD5_ASM -DL_ENDIAN $(CFLAGS)" all
-
-x86-solaris:
-       $(MAKE) MD5_ASM_OBJ="asm/mx86-sol.o" CFLAG="-DSOL -DMD5_ASM -DL_ENDIAN $(CFLAGS)" all
-
-x86-bdsi:
-       $(MAKE) MD5_ASM_OBJ="asm/mx86-bdsi.o" CFLAG="-DBDSI -DMD5_ASM -DL_ENDIAN $(CFLAGS)" all
-
-# DO NOT DELETE THIS LINE -- make depend depends on it.
index f07d517..e69de29 100644 (file)
-       ; Don't even think of reading this code
-       ; It was automatically generated by rmd-586.pl
-       ; Which is a perl program used to generate the x86 assember for
-       ; any of elf, a.out, BSDI,Win32, or Solaris
-       ; eric <eay@cryptsoft.com>
-       ; 
-       TITLE   rmd-586.asm
-        .386
-.model FLAT
-_TEXT  SEGMENT
-PUBLIC _ripemd160_block_asm_host_order
-
-_ripemd160_block_asm_host_order PROC NEAR
-       mov     edx,            DWORD PTR 4[esp]
-       mov     eax,            DWORD PTR 8[esp]
-       push    esi
-       mov     ecx,            DWORD PTR [edx]
-       push    edi
-       mov     esi,            DWORD PTR 4[edx]
-       push    ebp
-       mov     edi,            DWORD PTR 8[edx]
-       push    ebx
-       sub     esp,            108
-L000start:
-       ; 
-       mov     ebx,            DWORD PTR [eax]
-       mov     ebp,            DWORD PTR 4[eax]
-       mov     DWORD PTR [esp],ebx
-       mov     DWORD PTR 4[esp],ebp
-       mov     ebx,            DWORD PTR 8[eax]
-       mov     ebp,            DWORD PTR 12[eax]
-       mov     DWORD PTR 8[esp],ebx
-       mov     DWORD PTR 12[esp],ebp
-       mov     ebx,            DWORD PTR 16[eax]
-       mov     ebp,            DWORD PTR 20[eax]
-       mov     DWORD PTR 16[esp],ebx
-       mov     DWORD PTR 20[esp],ebp
-       mov     ebx,            DWORD PTR 24[eax]
-       mov     ebp,            DWORD PTR 28[eax]
-       mov     DWORD PTR 24[esp],ebx
-       mov     DWORD PTR 28[esp],ebp
-       mov     ebx,            DWORD PTR 32[eax]
-       mov     ebp,            DWORD PTR 36[eax]
-       mov     DWORD PTR 32[esp],ebx
-       mov     DWORD PTR 36[esp],ebp
-       mov     ebx,            DWORD PTR 40[eax]
-       mov     ebp,            DWORD PTR 44[eax]
-       mov     DWORD PTR 40[esp],ebx
-       mov     DWORD PTR 44[esp],ebp
-       mov     ebx,            DWORD PTR 48[eax]
-       mov     ebp,            DWORD PTR 52[eax]
-       mov     DWORD PTR 48[esp],ebx
-       mov     DWORD PTR 52[esp],ebp
-       mov     ebx,            DWORD PTR 56[eax]
-       mov     ebp,            DWORD PTR 60[eax]
-       mov     DWORD PTR 56[esp],ebx
-       mov     DWORD PTR 60[esp],ebp
-       mov     eax,            edi
-       mov     ebx,            DWORD PTR 12[edx]
-       mov     ebp,            DWORD PTR 16[edx]
-       ; 0
-       xor     eax,            ebx
-       mov     edx,            DWORD PTR [esp]
-       xor     eax,            esi
-       add     ecx,            edx
-       rol     edi,            10
-       add     ecx,            eax
-       mov     eax,            esi
-       rol     ecx,            11
-       add     ecx,            ebp
-       ; 1
-       xor     eax,            edi
-       mov     edx,            DWORD PTR 4[esp]
-       xor     eax,            ecx
-       add     ebp,            eax
-       mov     eax,            ecx
-       rol     esi,            10
-       add     ebp,            edx
-       xor     eax,            esi
-       rol     ebp,            14
-       add     ebp,            ebx
-       ; 2
-       mov     edx,            DWORD PTR 8[esp]
-       xor     eax,            ebp
-       add     ebx,            edx
-       rol     ecx,            10
-       add     ebx,            eax
-       mov     eax,            ebp
-       rol     ebx,            15
-       add     ebx,            edi
-       ; 3
-       xor     eax,            ecx
-       mov     edx,            DWORD PTR 12[esp]
-       xor     eax,            ebx
-       add     edi,            eax
-       mov     eax,            ebx
-       rol     ebp,            10
-       add     edi,            edx
-       xor     eax,            ebp
-       rol     edi,            12
-       add     edi,            esi
-       ; 4
-       mov     edx,            DWORD PTR 16[esp]
-       xor     eax,            edi
-       add     esi,            edx
-       rol     ebx,            10
-       add     esi,            eax
-       mov     eax,            edi
-       rol     esi,            5
-       add     esi,            ecx
-       ; 5
-       xor     eax,            ebx
-       mov     edx,            DWORD PTR 20[esp]
-       xor     eax,            esi
-       add     ecx,            eax
-       mov     eax,            esi
-       rol     edi,            10
-       add     ecx,            edx
-       xor     eax,            edi
-       rol     ecx,            8
-       add     ecx,            ebp
-       ; 6
-       mov     edx,            DWORD PTR 24[esp]
-       xor     eax,            ecx
-       add     ebp,            edx
-       rol     esi,            10
-       add     ebp,            eax
-       mov     eax,            ecx
-       rol     ebp,            7
-       add     ebp,            ebx
-       ; 7
-       xor     eax,            esi
-       mov     edx,            DWORD PTR 28[esp]
-       xor     eax,            ebp
-       add     ebx,            eax
-       mov     eax,            ebp
-       rol     ecx,            10
-       add     ebx,            edx
-       xor     eax,            ecx
-       rol     ebx,            9
-       add     ebx,            edi
-       ; 8
-       mov     edx,            DWORD PTR 32[esp]
-       xor     eax,            ebx
-       add     edi,            edx
-       rol     ebp,            10
-       add     edi,            eax
-       mov     eax,            ebx
-       rol     edi,            11
-       add     edi,            esi
-       ; 9
-       xor     eax,            ebp
-       mov     edx,            DWORD PTR 36[esp]
-       xor     eax,            edi
-       add     esi,            eax
-       mov     eax,            edi
-       rol     ebx,            10
-       add     esi,            edx
-       xor     eax,            ebx
-       rol     esi,            13
-       add     esi,            ecx
-       ; 10
-       mov     edx,            DWORD PTR 40[esp]
-       xor     eax,            esi
-       add     ecx,            edx
-       rol     edi,            10
-       add     ecx,            eax
-       mov     eax,            esi
-       rol     ecx,            14
-       add     ecx,            ebp
-       ; 11
-       xor     eax,            edi
-       mov     edx,            DWORD PTR 44[esp]
-       xor     eax,            ecx
-       add     ebp,            eax
-       mov     eax,            ecx
-       rol     esi,            10
-       add     ebp,            edx
-       xor     eax,            esi
-       rol     ebp,            15
-       add     ebp,            ebx
-       ; 12
-       mov     edx,            DWORD PTR 48[esp]
-       xor     eax,            ebp
-       add     ebx,            edx
-       rol     ecx,            10
-       add     ebx,            eax
-       mov     eax,            ebp
-       rol     ebx,            6
-       add     ebx,            edi
-       ; 13
-       xor     eax,            ecx
-       mov     edx,            DWORD PTR 52[esp]
-       xor     eax,            ebx
-       add     edi,            eax
-       mov     eax,            ebx
-       rol     ebp,            10
-       add     edi,            edx
-       xor     eax,            ebp
-       rol     edi,            7
-       add     edi,            esi
-       ; 14
-       mov     edx,            DWORD PTR 56[esp]
-       xor     eax,            edi
-       add     esi,            edx
-       rol     ebx,            10
-       add     esi,            eax
-       mov     eax,            edi
-       rol     esi,            9
-       add     esi,            ecx
-       ; 15
-       xor     eax,            ebx
-       mov     edx,            DWORD PTR 60[esp]
-       xor     eax,            esi
-       add     ecx,            eax
-       mov     eax,            -1
-       rol     edi,            10
-       add     ecx,            edx
-       mov     edx,            DWORD PTR 28[esp]
-       rol     ecx,            8
-       add     ecx,            ebp
-       ; 16
-       add     ebp,            edx
-       mov     edx,            esi
-       sub     eax,            ecx
-       and     edx,            ecx
-       and     eax,            edi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 16[esp]
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1518500249[edx*1+ebp]
-       mov     edx,            -1
-       rol     ebp,            7
-       add     ebp,            ebx
-       ; 17
-       add     ebx,            eax
-       mov     eax,            ecx
-       sub     edx,            ebp
-       and     eax,            ebp
-       and     edx,            esi
-       or      eax,            edx
-       mov     edx,            DWORD PTR 52[esp]
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1518500249[eax*1+ebx]
-       mov     eax,            -1
-       rol     ebx,            6
-       add     ebx,            edi
-       ; 18
-       add     edi,            edx
-       mov     edx,            ebp
-       sub     eax,            ebx
-       and     edx,            ebx
-       and     eax,            ecx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 4[esp]
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 1518500249[edx*1+edi]
-       mov     edx,            -1
-       rol     edi,            8
-       add     edi,            esi
-       ; 19
-       add     esi,            eax
-       mov     eax,            ebx
-       sub     edx,            edi
-       and     eax,            edi
-       and     edx,            ebp
-       or      eax,            edx
-       mov     edx,            DWORD PTR 40[esp]
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 1518500249[eax*1+esi]
-       mov     eax,            -1
-       rol     esi,            13
-       add     esi,            ecx
-       ; 20
-       add     ecx,            edx
-       mov     edx,            edi
-       sub     eax,            esi
-       and     edx,            esi
-       and     eax,            ebx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 24[esp]
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 1518500249[edx*1+ecx]
-       mov     edx,            -1
-       rol     ecx,            11
-       add     ecx,            ebp
-       ; 21
-       add     ebp,            eax
-       mov     eax,            esi
-       sub     edx,            ecx
-       and     eax,            ecx
-       and     edx,            edi
-       or      eax,            edx
-       mov     edx,            DWORD PTR 60[esp]
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1518500249[eax*1+ebp]
-       mov     eax,            -1
-       rol     ebp,            9
-       add     ebp,            ebx
-       ; 22
-       add     ebx,            edx
-       mov     edx,            ecx
-       sub     eax,            ebp
-       and     edx,            ebp
-       and     eax,            esi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 12[esp]
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1518500249[edx*1+ebx]
-       mov     edx,            -1
-       rol     ebx,            7
-       add     ebx,            edi
-       ; 23
-       add     edi,            eax
-       mov     eax,            ebp
-       sub     edx,            ebx
-       and     eax,            ebx
-       and     edx,            ecx
-       or      eax,            edx
-       mov     edx,            DWORD PTR 48[esp]
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 1518500249[eax*1+edi]
-       mov     eax,            -1
-       rol     edi,            15
-       add     edi,            esi
-       ; 24
-       add     esi,            edx
-       mov     edx,            ebx
-       sub     eax,            edi
-       and     edx,            edi
-       and     eax,            ebp
-       or      edx,            eax
-       mov     eax,            DWORD PTR [esp]
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 1518500249[edx*1+esi]
-       mov     edx,            -1
-       rol     esi,            7
-       add     esi,            ecx
-       ; 25
-       add     ecx,            eax
-       mov     eax,            edi
-       sub     edx,            esi
-       and     eax,            esi
-       and     edx,            ebx
-       or      eax,            edx
-       mov     edx,            DWORD PTR 36[esp]
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 1518500249[eax*1+ecx]
-       mov     eax,            -1
-       rol     ecx,            12
-       add     ecx,            ebp
-       ; 26
-       add     ebp,            edx
-       mov     edx,            esi
-       sub     eax,            ecx
-       and     edx,            ecx
-       and     eax,            edi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1518500249[edx*1+ebp]
-       mov     edx,            -1
-       rol     ebp,            15
-       add     ebp,            ebx
-       ; 27
-       add     ebx,            eax
-       mov     eax,            ecx
-       sub     edx,            ebp
-       and     eax,            ebp
-       and     edx,            esi
-       or      eax,            edx
-       mov     edx,            DWORD PTR 8[esp]
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1518500249[eax*1+ebx]
-       mov     eax,            -1
-       rol     ebx,            9
-       add     ebx,            edi
-       ; 28
-       add     edi,            edx
-       mov     edx,            ebp
-       sub     eax,            ebx
-       and     edx,            ebx
-       and     eax,            ecx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 56[esp]
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 1518500249[edx*1+edi]
-       mov     edx,            -1
-       rol     edi,            11
-       add     edi,            esi
-       ; 29
-       add     esi,            eax
-       mov     eax,            ebx
-       sub     edx,            edi
-       and     eax,            edi
-       and     edx,            ebp
-       or      eax,            edx
-       mov     edx,            DWORD PTR 44[esp]
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 1518500249[eax*1+esi]
-       mov     eax,            -1
-       rol     esi,            7
-       add     esi,            ecx
-       ; 30
-       add     ecx,            edx
-       mov     edx,            edi
-       sub     eax,            esi
-       and     edx,            esi
-       and     eax,            ebx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 32[esp]
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 1518500249[edx*1+ecx]
-       mov     edx,            -1
-       rol     ecx,            13
-       add     ecx,            ebp
-       ; 31
-       add     ebp,            eax
-       mov     eax,            esi
-       sub     edx,            ecx
-       and     eax,            ecx
-       and     edx,            edi
-       or      eax,            edx
-       mov     edx,            -1
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1518500249[eax*1+ebp]
-       sub     edx,            ecx
-       rol     ebp,            12
-       add     ebp,            ebx
-       ; 32
-       mov     eax,            DWORD PTR 12[esp]
-       or      edx,            ebp
-       add     ebx,            eax
-       xor     edx,            esi
-       mov     eax,            -1
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1859775393[edx*1+ebx]
-       sub     eax,            ebp
-       rol     ebx,            11
-       add     ebx,            edi
-       ; 33
-       mov     edx,            DWORD PTR 40[esp]
-       or      eax,            ebx
-       add     edi,            edx
-       xor     eax,            ecx
-       mov     edx,            -1
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 1859775393[eax*1+edi]
-       sub     edx,            ebx
-       rol     edi,            13
-       add     edi,            esi
-       ; 34
-       mov     eax,            DWORD PTR 56[esp]
-       or      edx,            edi
-       add     esi,            eax
-       xor     edx,            ebp
-       mov     eax,            -1
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 1859775393[edx*1+esi]
-       sub     eax,            edi
-       rol     esi,            6
-       add     esi,            ecx
-       ; 35
-       mov     edx,            DWORD PTR 16[esp]
-       or      eax,            esi
-       add     ecx,            edx
-       xor     eax,            ebx
-       mov     edx,            -1
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 1859775393[eax*1+ecx]
-       sub     edx,            esi
-       rol     ecx,            7
-       add     ecx,            ebp
-       ; 36
-       mov     eax,            DWORD PTR 36[esp]
-       or      edx,            ecx
-       add     ebp,            eax
-       xor     edx,            edi
-       mov     eax,            -1
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1859775393[edx*1+ebp]
-       sub     eax,            ecx
-       rol     ebp,            14
-       add     ebp,            ebx
-       ; 37
-       mov     edx,            DWORD PTR 60[esp]
-       or      eax,            ebp
-       add     ebx,            edx
-       xor     eax,            esi
-       mov     edx,            -1
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1859775393[eax*1+ebx]
-       sub     edx,            ebp
-       rol     ebx,            9
-       add     ebx,            edi
-       ; 38
-       mov     eax,            DWORD PTR 32[esp]
-       or      edx,            ebx
-       add     edi,            eax
-       xor     edx,            ecx
-       mov     eax,            -1
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 1859775393[edx*1+edi]
-       sub     eax,            ebx
-       rol     edi,            13
-       add     edi,            esi
-       ; 39
-       mov     edx,            DWORD PTR 4[esp]
-       or      eax,            edi
-       add     esi,            edx
-       xor     eax,            ebp
-       mov     edx,            -1
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 1859775393[eax*1+esi]
-       sub     edx,            edi
-       rol     esi,            15
-       add     esi,            ecx
-       ; 40
-       mov     eax,            DWORD PTR 8[esp]
-       or      edx,            esi
-       add     ecx,            eax
-       xor     edx,            ebx
-       mov     eax,            -1
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 1859775393[edx*1+ecx]
-       sub     eax,            esi
-       rol     ecx,            14
-       add     ecx,            ebp
-       ; 41
-       mov     edx,            DWORD PTR 28[esp]
-       or      eax,            ecx
-       add     ebp,            edx
-       xor     eax,            edi
-       mov     edx,            -1
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1859775393[eax*1+ebp]
-       sub     edx,            ecx
-       rol     ebp,            8
-       add     ebp,            ebx
-       ; 42
-       mov     eax,            DWORD PTR [esp]
-       or      edx,            ebp
-       add     ebx,            eax
-       xor     edx,            esi
-       mov     eax,            -1
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1859775393[edx*1+ebx]
-       sub     eax,            ebp
-       rol     ebx,            13
-       add     ebx,            edi
-       ; 43
-       mov     edx,            DWORD PTR 24[esp]
-       or      eax,            ebx
-       add     edi,            edx
-       xor     eax,            ecx
-       mov     edx,            -1
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 1859775393[eax*1+edi]
-       sub     edx,            ebx
-       rol     edi,            6
-       add     edi,            esi
-       ; 44
-       mov     eax,            DWORD PTR 52[esp]
-       or      edx,            edi
-       add     esi,            eax
-       xor     edx,            ebp
-       mov     eax,            -1
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 1859775393[edx*1+esi]
-       sub     eax,            edi
-       rol     esi,            5
-       add     esi,            ecx
-       ; 45
-       mov     edx,            DWORD PTR 44[esp]
-       or      eax,            esi
-       add     ecx,            edx
-       xor     eax,            ebx
-       mov     edx,            -1
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 1859775393[eax*1+ecx]
-       sub     edx,            esi
-       rol     ecx,            12
-       add     ecx,            ebp
-       ; 46
-       mov     eax,            DWORD PTR 20[esp]
-       or      edx,            ecx
-       add     ebp,            eax
-       xor     edx,            edi
-       mov     eax,            -1
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1859775393[edx*1+ebp]
-       sub     eax,            ecx
-       rol     ebp,            7
-       add     ebp,            ebx
-       ; 47
-       mov     edx,            DWORD PTR 48[esp]
-       or      eax,            ebp
-       add     ebx,            edx
-       xor     eax,            esi
-       mov     edx,            -1
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1859775393[eax*1+ebx]
-       mov     eax,            ecx
-       rol     ebx,            5
-       add     ebx,            edi
-       ; 48
-       sub     edx,            ecx
-       and     eax,            ebx
-       and     edx,            ebp
-       or      edx,            eax
-       mov     eax,            DWORD PTR 4[esp]
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 2400959708[edx+edi]
-       mov     edx,            -1
-       add     edi,            eax
-       mov     eax,            ebp
-       rol     edi,            11
-       add     edi,            esi
-       ; 49
-       sub     edx,            ebp
-       and     eax,            edi
-       and     edx,            ebx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 36[esp]
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 2400959708[edx+esi]
-       mov     edx,            -1
-       add     esi,            eax
-       mov     eax,            ebx
-       rol     esi,            12
-       add     esi,            ecx
-       ; 50
-       sub     edx,            ebx
-       and     eax,            esi
-       and     edx,            edi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 44[esp]
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 2400959708[edx+ecx]
-       mov     edx,            -1
-       add     ecx,            eax
-       mov     eax,            edi
-       rol     ecx,            14
-       add     ecx,            ebp
-       ; 51
-       sub     edx,            edi
-       and     eax,            ecx
-       and     edx,            esi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 40[esp]
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 2400959708[edx+ebp]
-       mov     edx,            -1
-       add     ebp,            eax
-       mov     eax,            esi
-       rol     ebp,            15
-       add     ebp,            ebx
-       ; 52
-       sub     edx,            esi
-       and     eax,            ebp
-       and     edx,            ecx
-       or      edx,            eax
-       mov     eax,            DWORD PTR [esp]
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 2400959708[edx+ebx]
-       mov     edx,            -1
-       add     ebx,            eax
-       mov     eax,            ecx
-       rol     ebx,            14
-       add     ebx,            edi
-       ; 53
-       sub     edx,            ecx
-       and     eax,            ebx
-       and     edx,            ebp
-       or      edx,            eax
-       mov     eax,            DWORD PTR 32[esp]
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 2400959708[edx+edi]
-       mov     edx,            -1
-       add     edi,            eax
-       mov     eax,            ebp
-       rol     edi,            15
-       add     edi,            esi
-       ; 54
-       sub     edx,            ebp
-       and     eax,            edi
-       and     edx,            ebx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 48[esp]
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 2400959708[edx+esi]
-       mov     edx,            -1
-       add     esi,            eax
-       mov     eax,            ebx
-       rol     esi,            9
-       add     esi,            ecx
-       ; 55
-       sub     edx,            ebx
-       and     eax,            esi
-       and     edx,            edi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 16[esp]
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 2400959708[edx+ecx]
-       mov     edx,            -1
-       add     ecx,            eax
-       mov     eax,            edi
-       rol     ecx,            8
-       add     ecx,            ebp
-       ; 56
-       sub     edx,            edi
-       and     eax,            ecx
-       and     edx,            esi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 52[esp]
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 2400959708[edx+ebp]
-       mov     edx,            -1
-       add     ebp,            eax
-       mov     eax,            esi
-       rol     ebp,            9
-       add     ebp,            ebx
-       ; 57
-       sub     edx,            esi
-       and     eax,            ebp
-       and     edx,            ecx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 12[esp]
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 2400959708[edx+ebx]
-       mov     edx,            -1
-       add     ebx,            eax
-       mov     eax,            ecx
-       rol     ebx,            14
-       add     ebx,            edi
-       ; 58
-       sub     edx,            ecx
-       and     eax,            ebx
-       and     edx,            ebp
-       or      edx,            eax
-       mov     eax,            DWORD PTR 28[esp]
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 2400959708[edx+edi]
-       mov     edx,            -1
-       add     edi,            eax
-       mov     eax,            ebp
-       rol     edi,            5
-       add     edi,            esi
-       ; 59
-       sub     edx,            ebp
-       and     eax,            edi
-       and     edx,            ebx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 60[esp]
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 2400959708[edx+esi]
-       mov     edx,            -1
-       add     esi,            eax
-       mov     eax,            ebx
-       rol     esi,            6
-       add     esi,            ecx
-       ; 60
-       sub     edx,            ebx
-       and     eax,            esi
-       and     edx,            edi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 56[esp]
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 2400959708[edx+ecx]
-       mov     edx,            -1
-       add     ecx,            eax
-       mov     eax,            edi
-       rol     ecx,            8
-       add     ecx,            ebp
-       ; 61
-       sub     edx,            edi
-       and     eax,            ecx
-       and     edx,            esi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 2400959708[edx+ebp]
-       mov     edx,            -1
-       add     ebp,            eax
-       mov     eax,            esi
-       rol     ebp,            6
-       add     ebp,            ebx
-       ; 62
-       sub     edx,            esi
-       and     eax,            ebp
-       and     edx,            ecx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 24[esp]
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 2400959708[edx+ebx]
-       mov     edx,            -1
-       add     ebx,            eax
-       mov     eax,            ecx
-       rol     ebx,            5
-       add     ebx,            edi
-       ; 63
-       sub     edx,            ecx
-       and     eax,            ebx
-       and     edx,            ebp
-       or      edx,            eax
-       mov     eax,            DWORD PTR 8[esp]
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 2400959708[edx+edi]
-       mov     edx,            -1
-       add     edi,            eax
-       sub     edx,            ebp
-       rol     edi,            12
-       add     edi,            esi
-       ; 64
-       mov     eax,            DWORD PTR 16[esp]
-       or      edx,            ebx
-       add     esi,            eax
-       xor     edx,            edi
-       mov     eax,            -1
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 2840853838[edx*1+esi]
-       sub     eax,            ebx
-       rol     esi,            9
-       add     esi,            ecx
-       ; 65
-       mov     edx,            DWORD PTR [esp]
-       or      eax,            edi
-       add     ecx,            edx
-       xor     eax,            esi
-       mov     edx,            -1
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 2840853838[eax*1+ecx]
-       sub     edx,            edi
-       rol     ecx,            15
-       add     ecx,            ebp
-       ; 66
-       mov     eax,            DWORD PTR 20[esp]
-       or      edx,            esi
-       add     ebp,            eax
-       xor     edx,            ecx
-       mov     eax,            -1
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 2840853838[edx*1+ebp]
-       sub     eax,            esi
-       rol     ebp,            5
-       add     ebp,            ebx
-       ; 67
-       mov     edx,            DWORD PTR 36[esp]
-       or      eax,            ecx
-       add     ebx,            edx
-       xor     eax,            ebp
-       mov     edx,            -1
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 2840853838[eax*1+ebx]
-       sub     edx,            ecx
-       rol     ebx,            11
-       add     ebx,            edi
-       ; 68
-       mov     eax,            DWORD PTR 28[esp]
-       or      edx,            ebp
-       add     edi,            eax
-       xor     edx,            ebx
-       mov     eax,            -1
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 2840853838[edx*1+edi]
-       sub     eax,            ebp
-       rol     edi,            6
-       add     edi,            esi
-       ; 69
-       mov     edx,            DWORD PTR 48[esp]
-       or      eax,            ebx
-       add     esi,            edx
-       xor     eax,            edi
-       mov     edx,            -1
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 2840853838[eax*1+esi]
-       sub     edx,            ebx
-       rol     esi,            8
-       add     esi,            ecx
-       ; 70
-       mov     eax,            DWORD PTR 8[esp]
-       or      edx,            edi
-       add     ecx,            eax
-       xor     edx,            esi
-       mov     eax,            -1
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 2840853838[edx*1+ecx]
-       sub     eax,            edi
-       rol     ecx,            13
-       add     ecx,            ebp
-       ; 71
-       mov     edx,            DWORD PTR 40[esp]
-       or      eax,            esi
-       add     ebp,            edx
-       xor     eax,            ecx
-       mov     edx,            -1
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 2840853838[eax*1+ebp]
-       sub     edx,            esi
-       rol     ebp,            12
-       add     ebp,            ebx
-       ; 72
-       mov     eax,            DWORD PTR 56[esp]
-       or      edx,            ecx
-       add     ebx,            eax
-       xor     edx,            ebp
-       mov     eax,            -1
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 2840853838[edx*1+ebx]
-       sub     eax,            ecx
-       rol     ebx,            5
-       add     ebx,            edi
-       ; 73
-       mov     edx,            DWORD PTR 4[esp]
-       or      eax,            ebp
-       add     edi,            edx
-       xor     eax,            ebx
-       mov     edx,            -1
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 2840853838[eax*1+edi]
-       sub     edx,            ebp
-       rol     edi,            12
-       add     edi,            esi
-       ; 74
-       mov     eax,            DWORD PTR 12[esp]
-       or      edx,            ebx
-       add     esi,            eax
-       xor     edx,            edi
-       mov     eax,            -1
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 2840853838[edx*1+esi]
-       sub     eax,            ebx
-       rol     esi,            13
-       add     esi,            ecx
-       ; 75
-       mov     edx,            DWORD PTR 32[esp]
-       or      eax,            edi
-       add     ecx,            edx
-       xor     eax,            esi
-       mov     edx,            -1
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 2840853838[eax*1+ecx]
-       sub     edx,            edi
-       rol     ecx,            14
-       add     ecx,            ebp
-       ; 76
-       mov     eax,            DWORD PTR 44[esp]
-       or      edx,            esi
-       add     ebp,            eax
-       xor     edx,            ecx
-       mov     eax,            -1
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 2840853838[edx*1+ebp]
-       sub     eax,            esi
-       rol     ebp,            11
-       add     ebp,            ebx
-       ; 77
-       mov     edx,            DWORD PTR 24[esp]
-       or      eax,            ecx
-       add     ebx,            edx
-       xor     eax,            ebp
-       mov     edx,            -1
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 2840853838[eax*1+ebx]
-       sub     edx,            ecx
-       rol     ebx,            8
-       add     ebx,            edi
-       ; 78
-       mov     eax,            DWORD PTR 60[esp]
-       or      edx,            ebp
-       add     edi,            eax
-       xor     edx,            ebx
-       mov     eax,            -1
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 2840853838[edx*1+edi]
-       sub     eax,            ebp
-       rol     edi,            5
-       add     edi,            esi
-       ; 79
-       mov     edx,            DWORD PTR 52[esp]
-       or      eax,            ebx
-       add     esi,            edx
-       xor     eax,            edi
-       mov     edx,            DWORD PTR 128[esp]
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 2840853838[eax*1+esi]
-       mov     DWORD PTR 64[esp],ecx
-       rol     esi,            6
-       add     esi,            ecx
-       mov     ecx,            DWORD PTR [edx]
-       mov     DWORD PTR 68[esp],esi
-       mov     DWORD PTR 72[esp],edi
-       mov     esi,            DWORD PTR 4[edx]
-       mov     DWORD PTR 76[esp],ebx
-       mov     edi,            DWORD PTR 8[edx]
-       mov     DWORD PTR 80[esp],ebp
-       mov     ebx,            DWORD PTR 12[edx]
-       mov     ebp,            DWORD PTR 16[edx]
-       ; 80
-       mov     edx,            -1
-       sub     edx,            ebx
-       mov     eax,            DWORD PTR 20[esp]
-       or      edx,            edi
-       add     ecx,            eax
-       xor     edx,            esi
-       mov     eax,            -1
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 1352829926[edx*1+ecx]
-       sub     eax,            edi
-       rol     ecx,            8
-       add     ecx,            ebp
-       ; 81
-       mov     edx,            DWORD PTR 56[esp]
-       or      eax,            esi
-       add     ebp,            edx
-       xor     eax,            ecx
-       mov     edx,            -1
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1352829926[eax*1+ebp]
-       sub     edx,            esi
-       rol     ebp,            9
-       add     ebp,            ebx
-       ; 82
-       mov     eax,            DWORD PTR 28[esp]
-       or      edx,            ecx
-       add     ebx,            eax
-       xor     edx,            ebp
-       mov     eax,            -1
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1352829926[edx*1+ebx]
-       sub     eax,            ecx
-       rol     ebx,            9
-       add     ebx,            edi
-       ; 83
-       mov     edx,            DWORD PTR [esp]
-       or      eax,            ebp
-       add     edi,            edx
-       xor     eax,            ebx
-       mov     edx,            -1
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 1352829926[eax*1+edi]
-       sub     edx,            ebp
-       rol     edi,            11
-       add     edi,            esi
-       ; 84
-       mov     eax,            DWORD PTR 36[esp]
-       or      edx,            ebx
-       add     esi,            eax
-       xor     edx,            edi
-       mov     eax,            -1
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 1352829926[edx*1+esi]
-       sub     eax,            ebx
-       rol     esi,            13
-       add     esi,            ecx
-       ; 85
-       mov     edx,            DWORD PTR 8[esp]
-       or      eax,            edi
-       add     ecx,            edx
-       xor     eax,            esi
-       mov     edx,            -1
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 1352829926[eax*1+ecx]
-       sub     edx,            edi
-       rol     ecx,            15
-       add     ecx,            ebp
-       ; 86
-       mov     eax,            DWORD PTR 44[esp]
-       or      edx,            esi
-       add     ebp,            eax
-       xor     edx,            ecx
-       mov     eax,            -1
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1352829926[edx*1+ebp]
-       sub     eax,            esi
-       rol     ebp,            15
-       add     ebp,            ebx
-       ; 87
-       mov     edx,            DWORD PTR 16[esp]
-       or      eax,            ecx
-       add     ebx,            edx
-       xor     eax,            ebp
-       mov     edx,            -1
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1352829926[eax*1+ebx]
-       sub     edx,            ecx
-       rol     ebx,            5
-       add     ebx,            edi
-       ; 88
-       mov     eax,            DWORD PTR 52[esp]
-       or      edx,            ebp
-       add     edi,            eax
-       xor     edx,            ebx
-       mov     eax,            -1
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 1352829926[edx*1+edi]
-       sub     eax,            ebp
-       rol     edi,            7
-       add     edi,            esi
-       ; 89
-       mov     edx,            DWORD PTR 24[esp]
-       or      eax,            ebx
-       add     esi,            edx
-       xor     eax,            edi
-       mov     edx,            -1
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 1352829926[eax*1+esi]
-       sub     edx,            ebx
-       rol     esi,            7
-       add     esi,            ecx
-       ; 90
-       mov     eax,            DWORD PTR 60[esp]
-       or      edx,            edi
-       add     ecx,            eax
-       xor     edx,            esi
-       mov     eax,            -1
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 1352829926[edx*1+ecx]
-       sub     eax,            edi
-       rol     ecx,            8
-       add     ecx,            ebp
-       ; 91
-       mov     edx,            DWORD PTR 32[esp]
-       or      eax,            esi
-       add     ebp,            edx
-       xor     eax,            ecx
-       mov     edx,            -1
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1352829926[eax*1+ebp]
-       sub     edx,            esi
-       rol     ebp,            11
-       add     ebp,            ebx
-       ; 92
-       mov     eax,            DWORD PTR 4[esp]
-       or      edx,            ecx
-       add     ebx,            eax
-       xor     edx,            ebp
-       mov     eax,            -1
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1352829926[edx*1+ebx]
-       sub     eax,            ecx
-       rol     ebx,            14
-       add     ebx,            edi
-       ; 93
-       mov     edx,            DWORD PTR 40[esp]
-       or      eax,            ebp
-       add     edi,            edx
-       xor     eax,            ebx
-       mov     edx,            -1
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 1352829926[eax*1+edi]
-       sub     edx,            ebp
-       rol     edi,            14
-       add     edi,            esi
-       ; 94
-       mov     eax,            DWORD PTR 12[esp]
-       or      edx,            ebx
-       add     esi,            eax
-       xor     edx,            edi
-       mov     eax,            -1
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 1352829926[edx*1+esi]
-       sub     eax,            ebx
-       rol     esi,            12
-       add     esi,            ecx
-       ; 95
-       mov     edx,            DWORD PTR 48[esp]
-       or      eax,            edi
-       add     ecx,            edx
-       xor     eax,            esi
-       mov     edx,            -1
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 1352829926[eax*1+ecx]
-       mov     eax,            edi
-       rol     ecx,            6
-       add     ecx,            ebp
-       ; 96
-       sub     edx,            edi
-       and     eax,            ecx
-       and     edx,            esi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 24[esp]
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1548603684[edx+ebp]
-       mov     edx,            -1
-       add     ebp,            eax
-       mov     eax,            esi
-       rol     ebp,            9
-       add     ebp,            ebx
-       ; 97
-       sub     edx,            esi
-       and     eax,            ebp
-       and     edx,            ecx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 44[esp]
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1548603684[edx+ebx]
-       mov     edx,            -1
-       add     ebx,            eax
-       mov     eax,            ecx
-       rol     ebx,            13
-       add     ebx,            edi
-       ; 98
-       sub     edx,            ecx
-       and     eax,            ebx
-       and     edx,            ebp
-       or      edx,            eax
-       mov     eax,            DWORD PTR 12[esp]
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 1548603684[edx+edi]
-       mov     edx,            -1
-       add     edi,            eax
-       mov     eax,            ebp
-       rol     edi,            15
-       add     edi,            esi
-       ; 99
-       sub     edx,            ebp
-       and     eax,            edi
-       and     edx,            ebx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 28[esp]
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 1548603684[edx+esi]
-       mov     edx,            -1
-       add     esi,            eax
-       mov     eax,            ebx
-       rol     esi,            7
-       add     esi,            ecx
-       ; 100
-       sub     edx,            ebx
-       and     eax,            esi
-       and     edx,            edi
-       or      edx,            eax
-       mov     eax,            DWORD PTR [esp]
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 1548603684[edx+ecx]
-       mov     edx,            -1
-       add     ecx,            eax
-       mov     eax,            edi
-       rol     ecx,            12
-       add     ecx,            ebp
-       ; 101
-       sub     edx,            edi
-       and     eax,            ecx
-       and     edx,            esi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 52[esp]
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1548603684[edx+ebp]
-       mov     edx,            -1
-       add     ebp,            eax
-       mov     eax,            esi
-       rol     ebp,            8
-       add     ebp,            ebx
-       ; 102
-       sub     edx,            esi
-       and     eax,            ebp
-       and     edx,            ecx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1548603684[edx+ebx]
-       mov     edx,            -1
-       add     ebx,            eax
-       mov     eax,            ecx
-       rol     ebx,            9
-       add     ebx,            edi
-       ; 103
-       sub     edx,            ecx
-       and     eax,            ebx
-       and     edx,            ebp
-       or      edx,            eax
-       mov     eax,            DWORD PTR 40[esp]
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 1548603684[edx+edi]
-       mov     edx,            -1
-       add     edi,            eax
-       mov     eax,            ebp
-       rol     edi,            11
-       add     edi,            esi
-       ; 104
-       sub     edx,            ebp
-       and     eax,            edi
-       and     edx,            ebx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 56[esp]
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 1548603684[edx+esi]
-       mov     edx,            -1
-       add     esi,            eax
-       mov     eax,            ebx
-       rol     esi,            7
-       add     esi,            ecx
-       ; 105
-       sub     edx,            ebx
-       and     eax,            esi
-       and     edx,            edi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 60[esp]
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 1548603684[edx+ecx]
-       mov     edx,            -1
-       add     ecx,            eax
-       mov     eax,            edi
-       rol     ecx,            7
-       add     ecx,            ebp
-       ; 106
-       sub     edx,            edi
-       and     eax,            ecx
-       and     edx,            esi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 32[esp]
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1548603684[edx+ebp]
-       mov     edx,            -1
-       add     ebp,            eax
-       mov     eax,            esi
-       rol     ebp,            12
-       add     ebp,            ebx
-       ; 107
-       sub     edx,            esi
-       and     eax,            ebp
-       and     edx,            ecx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 48[esp]
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1548603684[edx+ebx]
-       mov     edx,            -1
-       add     ebx,            eax
-       mov     eax,            ecx
-       rol     ebx,            7
-       add     ebx,            edi
-       ; 108
-       sub     edx,            ecx
-       and     eax,            ebx
-       and     edx,            ebp
-       or      edx,            eax
-       mov     eax,            DWORD PTR 16[esp]
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 1548603684[edx+edi]
-       mov     edx,            -1
-       add     edi,            eax
-       mov     eax,            ebp
-       rol     edi,            6
-       add     edi,            esi
-       ; 109
-       sub     edx,            ebp
-       and     eax,            edi
-       and     edx,            ebx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 36[esp]
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 1548603684[edx+esi]
-       mov     edx,            -1
-       add     esi,            eax
-       mov     eax,            ebx
-       rol     esi,            15
-       add     esi,            ecx
-       ; 110
-       sub     edx,            ebx
-       and     eax,            esi
-       and     edx,            edi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 4[esp]
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 1548603684[edx+ecx]
-       mov     edx,            -1
-       add     ecx,            eax
-       mov     eax,            edi
-       rol     ecx,            13
-       add     ecx,            ebp
-       ; 111
-       sub     edx,            edi
-       and     eax,            ecx
-       and     edx,            esi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 8[esp]
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1548603684[edx+ebp]
-       mov     edx,            -1
-       add     ebp,            eax
-       sub     edx,            ecx
-       rol     ebp,            11
-       add     ebp,            ebx
-       ; 112
-       mov     eax,            DWORD PTR 60[esp]
-       or      edx,            ebp
-       add     ebx,            eax
-       xor     edx,            esi
-       mov     eax,            -1
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1836072691[edx*1+ebx]
-       sub     eax,            ebp
-       rol     ebx,            9
-       add     ebx,            edi
-       ; 113
-       mov     edx,            DWORD PTR 20[esp]
-       or      eax,            ebx
-       add     edi,            edx
-       xor     eax,            ecx
-       mov     edx,            -1
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 1836072691[eax*1+edi]
-       sub     edx,            ebx
-       rol     edi,            7
-       add     edi,            esi
-       ; 114
-       mov     eax,            DWORD PTR 4[esp]
-       or      edx,            edi
-       add     esi,            eax
-       xor     edx,            ebp
-       mov     eax,            -1
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 1836072691[edx*1+esi]
-       sub     eax,            edi
-       rol     esi,            15
-       add     esi,            ecx
-       ; 115
-       mov     edx,            DWORD PTR 12[esp]
-       or      eax,            esi
-       add     ecx,            edx
-       xor     eax,            ebx
-       mov     edx,            -1
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 1836072691[eax*1+ecx]
-       sub     edx,            esi
-       rol     ecx,            11
-       add     ecx,            ebp
-       ; 116
-       mov     eax,            DWORD PTR 28[esp]
-       or      edx,            ecx
-       add     ebp,            eax
-       xor     edx,            edi
-       mov     eax,            -1
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1836072691[edx*1+ebp]
-       sub     eax,            ecx
-       rol     ebp,            8
-       add     ebp,            ebx
-       ; 117
-       mov     edx,            DWORD PTR 56[esp]
-       or      eax,            ebp
-       add     ebx,            edx
-       xor     eax,            esi
-       mov     edx,            -1
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1836072691[eax*1+ebx]
-       sub     edx,            ebp
-       rol     ebx,            6
-       add     ebx,            edi
-       ; 118
-       mov     eax,            DWORD PTR 24[esp]
-       or      edx,            ebx
-       add     edi,            eax
-       xor     edx,            ecx
-       mov     eax,            -1
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 1836072691[edx*1+edi]
-       sub     eax,            ebx
-       rol     edi,            6
-       add     edi,            esi
-       ; 119
-       mov     edx,            DWORD PTR 36[esp]
-       or      eax,            edi
-       add     esi,            edx
-       xor     eax,            ebp
-       mov     edx,            -1
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 1836072691[eax*1+esi]
-       sub     edx,            edi
-       rol     esi,            14
-       add     esi,            ecx
-       ; 120
-       mov     eax,            DWORD PTR 44[esp]
-       or      edx,            esi
-       add     ecx,            eax
-       xor     edx,            ebx
-       mov     eax,            -1
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 1836072691[edx*1+ecx]
-       sub     eax,            esi
-       rol     ecx,            12
-       add     ecx,            ebp
-       ; 121
-       mov     edx,            DWORD PTR 32[esp]
-       or      eax,            ecx
-       add     ebp,            edx
-       xor     eax,            edi
-       mov     edx,            -1
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1836072691[eax*1+ebp]
-       sub     edx,            ecx
-       rol     ebp,            13
-       add     ebp,            ebx
-       ; 122
-       mov     eax,            DWORD PTR 48[esp]
-       or      edx,            ebp
-       add     ebx,            eax
-       xor     edx,            esi
-       mov     eax,            -1
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1836072691[edx*1+ebx]
-       sub     eax,            ebp
-       rol     ebx,            5
-       add     ebx,            edi
-       ; 123
-       mov     edx,            DWORD PTR 8[esp]
-       or      eax,            ebx
-       add     edi,            edx
-       xor     eax,            ecx
-       mov     edx,            -1
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 1836072691[eax*1+edi]
-       sub     edx,            ebx
-       rol     edi,            14
-       add     edi,            esi
-       ; 124
-       mov     eax,            DWORD PTR 40[esp]
-       or      edx,            edi
-       add     esi,            eax
-       xor     edx,            ebp
-       mov     eax,            -1
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 1836072691[edx*1+esi]
-       sub     eax,            edi
-       rol     esi,            13
-       add     esi,            ecx
-       ; 125
-       mov     edx,            DWORD PTR [esp]
-       or      eax,            esi
-       add     ecx,            edx
-       xor     eax,            ebx
-       mov     edx,            -1
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 1836072691[eax*1+ecx]
-       sub     edx,            esi
-       rol     ecx,            13
-       add     ecx,            ebp
-       ; 126
-       mov     eax,            DWORD PTR 16[esp]
-       or      edx,            ecx
-       add     ebp,            eax
-       xor     edx,            edi
-       mov     eax,            -1
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 1836072691[edx*1+ebp]
-       sub     eax,            ecx
-       rol     ebp,            7
-       add     ebp,            ebx
-       ; 127
-       mov     edx,            DWORD PTR 52[esp]
-       or      eax,            ebp
-       add     ebx,            edx
-       xor     eax,            esi
-       mov     edx,            DWORD PTR 32[esp]
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 1836072691[eax*1+ebx]
-       mov     eax,            -1
-       rol     ebx,            5
-       add     ebx,            edi
-       ; 128
-       add     edi,            edx
-       mov     edx,            ebp
-       sub     eax,            ebx
-       and     edx,            ebx
-       and     eax,            ecx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 24[esp]
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 2053994217[edx*1+edi]
-       mov     edx,            -1
-       rol     edi,            15
-       add     edi,            esi
-       ; 129
-       add     esi,            eax
-       mov     eax,            ebx
-       sub     edx,            edi
-       and     eax,            edi
-       and     edx,            ebp
-       or      eax,            edx
-       mov     edx,            DWORD PTR 16[esp]
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 2053994217[eax*1+esi]
-       mov     eax,            -1
-       rol     esi,            5
-       add     esi,            ecx
-       ; 130
-       add     ecx,            edx
-       mov     edx,            edi
-       sub     eax,            esi
-       and     edx,            esi
-       and     eax,            ebx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 4[esp]
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 2053994217[edx*1+ecx]
-       mov     edx,            -1
-       rol     ecx,            8
-       add     ecx,            ebp
-       ; 131
-       add     ebp,            eax
-       mov     eax,            esi
-       sub     edx,            ecx
-       and     eax,            ecx
-       and     edx,            edi
-       or      eax,            edx
-       mov     edx,            DWORD PTR 12[esp]
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 2053994217[eax*1+ebp]
-       mov     eax,            -1
-       rol     ebp,            11
-       add     ebp,            ebx
-       ; 132
-       add     ebx,            edx
-       mov     edx,            ecx
-       sub     eax,            ebp
-       and     edx,            ebp
-       and     eax,            esi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 44[esp]
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 2053994217[edx*1+ebx]
-       mov     edx,            -1
-       rol     ebx,            14
-       add     ebx,            edi
-       ; 133
-       add     edi,            eax
-       mov     eax,            ebp
-       sub     edx,            ebx
-       and     eax,            ebx
-       and     edx,            ecx
-       or      eax,            edx
-       mov     edx,            DWORD PTR 60[esp]
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 2053994217[eax*1+edi]
-       mov     eax,            -1
-       rol     edi,            14
-       add     edi,            esi
-       ; 134
-       add     esi,            edx
-       mov     edx,            ebx
-       sub     eax,            edi
-       and     edx,            edi
-       and     eax,            ebp
-       or      edx,            eax
-       mov     eax,            DWORD PTR [esp]
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 2053994217[edx*1+esi]
-       mov     edx,            -1
-       rol     esi,            6
-       add     esi,            ecx
-       ; 135
-       add     ecx,            eax
-       mov     eax,            edi
-       sub     edx,            esi
-       and     eax,            esi
-       and     edx,            ebx
-       or      eax,            edx
-       mov     edx,            DWORD PTR 20[esp]
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 2053994217[eax*1+ecx]
-       mov     eax,            -1
-       rol     ecx,            14
-       add     ecx,            ebp
-       ; 136
-       add     ebp,            edx
-       mov     edx,            esi
-       sub     eax,            ecx
-       and     edx,            ecx
-       and     eax,            edi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 48[esp]
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 2053994217[edx*1+ebp]
-       mov     edx,            -1
-       rol     ebp,            6
-       add     ebp,            ebx
-       ; 137
-       add     ebx,            eax
-       mov     eax,            ecx
-       sub     edx,            ebp
-       and     eax,            ebp
-       and     edx,            esi
-       or      eax,            edx
-       mov     edx,            DWORD PTR 8[esp]
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 2053994217[eax*1+ebx]
-       mov     eax,            -1
-       rol     ebx,            9
-       add     ebx,            edi
-       ; 138
-       add     edi,            edx
-       mov     edx,            ebp
-       sub     eax,            ebx
-       and     edx,            ebx
-       and     eax,            ecx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 52[esp]
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 2053994217[edx*1+edi]
-       mov     edx,            -1
-       rol     edi,            12
-       add     edi,            esi
-       ; 139
-       add     esi,            eax
-       mov     eax,            ebx
-       sub     edx,            edi
-       and     eax,            edi
-       and     edx,            ebp
-       or      eax,            edx
-       mov     edx,            DWORD PTR 36[esp]
-       rol     ebx,            10
-       lea     esi,            DWORD PTR 2053994217[eax*1+esi]
-       mov     eax,            -1
-       rol     esi,            9
-       add     esi,            ecx
-       ; 140
-       add     ecx,            edx
-       mov     edx,            edi
-       sub     eax,            esi
-       and     edx,            esi
-       and     eax,            ebx
-       or      edx,            eax
-       mov     eax,            DWORD PTR 28[esp]
-       rol     edi,            10
-       lea     ecx,            DWORD PTR 2053994217[edx*1+ecx]
-       mov     edx,            -1
-       rol     ecx,            12
-       add     ecx,            ebp
-       ; 141
-       add     ebp,            eax
-       mov     eax,            esi
-       sub     edx,            ecx
-       and     eax,            ecx
-       and     edx,            edi
-       or      eax,            edx
-       mov     edx,            DWORD PTR 40[esp]
-       rol     esi,            10
-       lea     ebp,            DWORD PTR 2053994217[eax*1+ebp]
-       mov     eax,            -1
-       rol     ebp,            5
-       add     ebp,            ebx
-       ; 142
-       add     ebx,            edx
-       mov     edx,            ecx
-       sub     eax,            ebp
-       and     edx,            ebp
-       and     eax,            esi
-       or      edx,            eax
-       mov     eax,            DWORD PTR 56[esp]
-       rol     ecx,            10
-       lea     ebx,            DWORD PTR 2053994217[edx*1+ebx]
-       mov     edx,            -1
-       rol     ebx,            15
-       add     ebx,            edi
-       ; 143
-       add     edi,            eax
-       mov     eax,            ebp
-       sub     edx,            ebx
-       and     eax,            ebx
-       and     edx,            ecx
-       or      edx,            eax
-       mov     eax,            ebx
-       rol     ebp,            10
-       lea     edi,            DWORD PTR 2053994217[edx*1+edi]
-       xor     eax,            ebp
-       rol     edi,            8
-       add     edi,            esi
-       ; 144
-       mov     edx,            DWORD PTR 48[esp]
-       xor     eax,            edi
-       add     esi,            edx
-       rol     ebx,            10
-       add     esi,            eax
-       mov     eax,            edi
-       rol     esi,            8
-       add     esi,            ecx
-       ; 145
-       xor     eax,            ebx
-       mov     edx,            DWORD PTR 60[esp]
-       xor     eax,            esi
-       add     ecx,            eax
-       mov     eax,            esi
-       rol     edi,            10
-       add     ecx,            edx
-       xor     eax,            edi
-       rol     ecx,            5
-       add     ecx,            ebp
-       ; 146
-       mov     edx,            DWORD PTR 40[esp]
-       xor     eax,            ecx
-       add     ebp,            edx
-       rol     esi,            10
-       add     ebp,            eax
-       mov     eax,            ecx
-       rol     ebp,            12
-       add     ebp,            ebx
-       ; 147
-       xor     eax,            esi
-       mov     edx,            DWORD PTR 16[esp]
-       xor     eax,            ebp
-       add     ebx,            eax
-       mov     eax,            ebp
-       rol     ecx,            10
-       add     ebx,            edx
-       xor     eax,            ecx
-       rol     ebx,            9
-       add     ebx,            edi
-       ; 148
-       mov     edx,            DWORD PTR 4[esp]
-       xor     eax,            ebx
-       add     edi,            edx
-       rol     ebp,            10
-       add     edi,            eax
-       mov     eax,            ebx
-       rol     edi,            12
-       add     edi,            esi
-       ; 149
-       xor     eax,            ebp
-       mov     edx,            DWORD PTR 20[esp]
-       xor     eax,            edi
-       add     esi,            eax
-       mov     eax,            edi
-       rol     ebx,            10
-       add     esi,            edx
-       xor     eax,            ebx
-       rol     esi,            5
-       add     esi,            ecx
-       ; 150
-       mov     edx,            DWORD PTR 32[esp]
-       xor     eax,            esi
-       add     ecx,            edx
-       rol     edi,            10
-       add     ecx,            eax
-       mov     eax,            esi
-       rol     ecx,            14
-       add     ecx,            ebp
-       ; 151
-       xor     eax,            edi
-       mov     edx,            DWORD PTR 28[esp]
-       xor     eax,            ecx
-       add     ebp,            eax
-       mov     eax,            ecx
-       rol     esi,            10
-       add     ebp,            edx
-       xor     eax,            esi
-       rol     ebp,            6
-       add     ebp,            ebx
-       ; 152
-       mov     edx,            DWORD PTR 24[esp]
-       xor     eax,            ebp
-       add     ebx,            edx
-       rol     ecx,            10
-       add     ebx,            eax
-       mov     eax,            ebp
-       rol     ebx,            8
-       add     ebx,            edi
-       ; 153
-       xor     eax,            ecx
-       mov     edx,            DWORD PTR 8[esp]
-       xor     eax,            ebx
-       add     edi,            eax
-       mov     eax,            ebx
-       rol     ebp,            10
-       add     edi,            edx
-       xor     eax,            ebp
-       rol     edi,            13
-       add     edi,            esi
-       ; 154
-       mov     edx,            DWORD PTR 52[esp]
-       xor     eax,            edi
-       add     esi,            edx
-       rol     ebx,            10
-       add     esi,            eax
-       mov     eax,            edi
-       rol     esi,            6
-       add     esi,            ecx
-       ; 155
-       xor     eax,            ebx
-       mov     edx,            DWORD PTR 56[esp]
-       xor     eax,            esi
-       add     ecx,            eax
-       mov     eax,            esi
-       rol     edi,            10
-       add     ecx,            edx
-       xor     eax,            edi
-       rol     ecx,            5
-       add     ecx,            ebp
-       ; 156
-       mov     edx,            DWORD PTR [esp]
-       xor     eax,            ecx
-       add     ebp,            edx
-       rol     esi,            10
-       add     ebp,            eax
-       mov     eax,            ecx
-       rol     ebp,            15
-       add     ebp,            ebx
-       ; 157
-       xor     eax,            esi
-       mov     edx,            DWORD PTR 12[esp]
-       xor     eax,            ebp
-       add     ebx,            eax
-       mov     eax,            ebp
-       rol     ecx,            10
-       add     ebx,            edx
-       xor     eax,            ecx
-       rol     ebx,            13
-       add     ebx,            edi
-       ; 158
-       mov     edx,            DWORD PTR 36[esp]
-       xor     eax,            ebx
-       add     edi,            edx
-       rol     ebp,            10
-       add     edi,            eax
-       mov     eax,            ebx
-       rol     edi,            11
-       add     edi,            esi
-       ; 159
-       xor     eax,            ebp
-       mov     edx,            DWORD PTR 44[esp]
-       xor     eax,            edi
-       add     esi,            eax
-       rol     ebx,            10
-       add     esi,            edx
-       mov     edx,            DWORD PTR 128[esp]
-       rol     esi,            11
-       add     esi,            ecx
-       mov     eax,            DWORD PTR 4[edx]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 72[esp]
-       add     ebx,            eax
-       mov     eax,            DWORD PTR 8[edx]
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 76[esp]
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 12[edx]
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 80[esp]
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 16[edx]
-       add     esi,            eax
-       mov     eax,            DWORD PTR 64[esp]
-       add     esi,            eax
-       mov     eax,            DWORD PTR [edx]
-       add     edi,            eax
-       mov     eax,            DWORD PTR 68[esp]
-       add     edi,            eax
-       mov     eax,            DWORD PTR 136[esp]
-       mov     DWORD PTR [edx],ebx
-       mov     DWORD PTR 4[edx],ebp
-       mov     DWORD PTR 8[edx],ecx
-       sub     eax,            1
-       mov     DWORD PTR 12[edx],esi
-       mov     DWORD PTR 16[edx],edi
-       jle     $L001get_out
-       mov     DWORD PTR 136[esp],eax
-       mov     edi,            ecx
-       mov     eax,            DWORD PTR 132[esp]
-       mov     ecx,            ebx
-       add     eax,            64
-       mov     esi,            ebp
-       mov     DWORD PTR 132[esp],eax
-       jmp     L000start
-$L001get_out:
-       add     esp,            108
-       pop     ebx
-       pop     ebp
-       pop     edi
-       pop     esi
-       ret
-_ripemd160_block_asm_host_order ENDP
-_TEXT  ENDS
-END
index 145cf31..f537b88 100644 (file)
@@ -106,11 +106,7 @@ void ripemd160_block_data_order (RIPEMD160_CTX *c, const void *p,int num);
 #define HASH_BLOCK_DATA_ORDER   ripemd160_block_data_order
 #endif
 
-#ifndef FLAT_INC
-#include "../md32_common.h"
-#else
 #include "md32_common.h"
-#endif
 
 #if 0
 #define F1(x,y,z)       ((x)^(y)^(z))
index 5cfbea2..1cde7c0 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index 79ef43a..72acd8f 100644 (file)
@@ -5,6 +5,7 @@
 DIR=    sha
 TOP=    ../..
 CC=     cc
+CPP=    $(CC) -E
 INCLUDES=
 CFLAG=-g
 INSTALL_PREFIX=
@@ -46,7 +47,7 @@ lib:    $(LIBOBJ)
 
 # elf
 asm/sx86-elf.o: asm/sx86unix.cpp
-       $(CPP) -DELF asm/sx86unix.cpp | as -o asm/sx86-elf.o
+       $(CPP) -DELF -x c asm/sx86unix.cpp | as -o asm/sx86-elf.o
 
 # solaris
 asm/sx86-sol.o: asm/sx86unix.cpp
@@ -62,7 +63,7 @@ asm/sx86-out.o: asm/sx86unix.cpp
 asm/sx86bsdi.o: asm/sx86unix.cpp
        $(CPP) -DBSDI asm/sx86unix.cpp | sed 's/ :/:/' | as -o asm/sx86bsdi.o
 
-asm/sx86unix.cpp:
+asm/sx86unix.cpp: asm/sha1-586.pl ../perlasm/x86asm.pl
        (cd asm; $(PERL) sha1-586.pl cpp $(PROCESSOR) >sx86unix.cpp)
 
 files:
index b7ec5ca..e69de29 100644 (file)
@@ -1,122 +0,0 @@
-# Targets
-# make          - twidle the options yourself :-)
-# make cc       - standard cc options
-# make gcc      - standard gcc options
-# make x86-elf  - linux-elf etc
-# make x86-out  - linux-a.out, FreeBSD etc
-# make x86-solaris
-# make x86-bdsi
-
-DIR=    sha
-TOP=    .
-CC=     gcc
-CFLAG= -O3 -fomit-frame-pointer
-
-CPP=    $(CC) -E
-INCLUDES=
-INSTALLTOP=/usr/local/lib
-MAKE=           make
-MAKEDEPEND=     makedepend
-MAKEFILE=       Makefile.uni
-AR=             ar r
-
-SHA_ASM_OBJ=
-
-CFLAGS= $(INCLUDES) $(CFLAG)
-
-GENERAL=Makefile
-
-TEST1=shatest
-TEST2=sha1test
-APP1=sha
-APP2=sha1
-
-TEST=$(TEST1) $(TEST2)
-APPS=$(APP1) $(APP2)
-
-LIB=libsha.a
-LIBSRC=sha_dgst.c sha1dgst.c sha_one.c sha1_one.c
-LIBOBJ=sha_dgst.o sha1dgst.o sha_one.o sha1_one.o $(SHA_ASM_OBJ)
-
-SRC= $(LIBSRC)
-
-EXHEADER= sha.h
-HEADER= sha_locl.h $(EXHEADER)
-
-ALL=    $(GENERAL) $(SRC) $(HEADER)
-
-all:    $(LIB) $(TEST) $(APPS)
-
-$(LIB): $(LIBOBJ)
-       $(AR) $(LIB) $(LIBOBJ)
-       $(RANLIB) $(LIB)
-
-# elf
-asm/sx86-elf.o: asm/sx86unix.cpp
-       $(CPP) -DELF asm/sx86unix.cpp | as -o asm/sx86-elf.o
-
-# solaris
-asm/sx86-sol.o: asm/sx86unix.cpp
-       $(CC) -E -DSOL asm/sx86unix.cpp | sed 's/^#.*//' > asm/sx86-sol.s
-       as -o asm/sx86-sol.o asm/sx86-sol.s
-       rm -f asm/sx86-sol.s
-
-# a.out
-asm/sx86-out.o: asm/sx86unix.cpp
-       $(CPP) -DOUT asm/sx86unix.cpp | as -o asm/sx86-out.o
-
-# bsdi
-asm/sx86bsdi.o: asm/sx86unix.cpp
-       $(CPP) -DBSDI asm/sx86unix.cpp | as -o asm/sx86bsdi.o
-
-asm/sx86unix.cpp:
-       (cd asm; perl sha1-586.pl cpp >sx86unix.cpp)
-
-test:  $(TEST)
-       ./$(TEST1)
-       ./$(TEST2)
-
-$(TEST1): $(TEST1).c $(LIB)
-       $(CC) -o $(TEST1) $(CFLAGS) $(TEST1).c $(LIB)
-
-$(TEST2): $(TEST2).c $(LIB)
-       $(CC) -o $(TEST2) $(CFLAGS) $(TEST2).c $(LIB)
-
-$(APP1): $(APP1).c $(LIB)
-       $(CC) -o $(APP1) $(CFLAGS) $(APP1).c $(LIB)
-
-$(APP2): $(APP2).c $(LIB)
-       $(CC) -o $(APP2) $(CFLAGS) $(APP2).c $(LIB)
-
-lint:
-       lint -DLINT $(INCLUDES) $(SRC)>fluff
-
-depend:
-       $(MAKEDEPEND) $(INCLUDES) $(PROGS) $(LIBSRC)
-
-dclean:
-       perl -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) >Makefile.new
-       mv -f Makefile.new $(MAKEFILE)
-
-clean:
-       /bin/rm -f $(LIB) $(TEST) $(APPS) *.o asm/*.o *.obj lib tags core .pure .nfs* *.old *.bak fluff
-
-cc:
-       $(MAKE) SHA_ASM_OBJ="" CC="cc" CFLAG="-O" all
-
-gcc:
-       $(MAKE) SHA_ASM_OBJ="" CC="gcc" CFLAGS="-O3 -fomit-frame-pointer" all
-
-x86-elf:
-       $(MAKE) SHA_ASM_OBJ="asm/sx86-elf.o" CFLAG="-DELF -DSHA1_ASM -DL_ENDIAN $(CFLAGS)" all
-
-x86-out:
-       $(MAKE) SHA_ASM_OBJ="asm/sx86-out.o" CFLAG="-DOUT -DSHA1_ASM -DL_ENDIAN $(CFLAGS)" all
-
-x86-solaris:
-       $(MAKE) SHA_ASM_OBJ="asm/sx86-sol.o" CFLAG="-DSOL -DSHA1_ASM -DL_ENDIAN $(CFLAGS)" all
-
-x86-bdsi:
-       $(MAKE) SHA_ASM_OBJ="asm/sx86-bdsi.o" CFLAG="-DBDSI -DSHA1_ASM -DL_ENDIAN $(CFLAGS)" all
-
-# DO NOT DELETE THIS LINE -- make depend depends on it.
index 699afdb..e69de29 100644 (file)
-       ; Don't even think of reading this code
-       ; It was automatically generated by sha1-586.pl
-       ; Which is a perl program used to generate the x86 assember for
-       ; any of elf, a.out, BSDI,Win32, or Solaris
-       ; eric <eay@cryptsoft.com>
-       ; 
-       TITLE   sha1-586.asm
-        .486
-.model FLAT
-_TEXT  SEGMENT
-PUBLIC _sha1_block_asm_data_order
-
-_sha1_block_asm_data_order PROC NEAR
-       mov     ecx,            DWORD PTR 12[esp]
-       push    esi
-       shl     ecx,            6
-       mov     esi,            DWORD PTR 12[esp]
-       push    ebp
-       add     ecx,            esi
-       push    ebx
-       mov     ebp,            DWORD PTR 16[esp]
-       push    edi
-       mov     edx,            DWORD PTR 12[ebp]
-       sub     esp,            108
-       mov     edi,            DWORD PTR 16[ebp]
-       mov     ebx,            DWORD PTR 8[ebp]
-       mov     DWORD PTR 68[esp],ecx
-       ; First we need to setup the X array
-L000start:
-       ; First, load the words onto the stack in network byte order
-       mov     eax,            DWORD PTR [esi]
-       mov     ecx,            DWORD PTR 4[esi]
-       bswap   eax
-       bswap   ecx
-       mov     DWORD PTR [esp],eax
-       mov     DWORD PTR 4[esp],ecx
-       mov     eax,            DWORD PTR 8[esi]
-       mov     ecx,            DWORD PTR 12[esi]
-       bswap   eax
-       bswap   ecx
-       mov     DWORD PTR 8[esp],eax
-       mov     DWORD PTR 12[esp],ecx
-       mov     eax,            DWORD PTR 16[esi]
-       mov     ecx,            DWORD PTR 20[esi]
-       bswap   eax
-       bswap   ecx
-       mov     DWORD PTR 16[esp],eax
-       mov     DWORD PTR 20[esp],ecx
-       mov     eax,            DWORD PTR 24[esi]
-       mov     ecx,            DWORD PTR 28[esi]
-       bswap   eax
-       bswap   ecx
-       mov     DWORD PTR 24[esp],eax
-       mov     DWORD PTR 28[esp],ecx
-       mov     eax,            DWORD PTR 32[esi]
-       mov     ecx,            DWORD PTR 36[esi]
-       bswap   eax
-       bswap   ecx
-       mov     DWORD PTR 32[esp],eax
-       mov     DWORD PTR 36[esp],ecx
-       mov     eax,            DWORD PTR 40[esi]
-       mov     ecx,            DWORD PTR 44[esi]
-       bswap   eax
-       bswap   ecx
-       mov     DWORD PTR 40[esp],eax
-       mov     DWORD PTR 44[esp],ecx
-       mov     eax,            DWORD PTR 48[esi]
-       mov     ecx,            DWORD PTR 52[esi]
-       bswap   eax
-       bswap   ecx
-       mov     DWORD PTR 48[esp],eax
-       mov     DWORD PTR 52[esp],ecx
-       mov     eax,            DWORD PTR 56[esi]
-       mov     ecx,            DWORD PTR 60[esi]
-       bswap   eax
-       bswap   ecx
-       mov     DWORD PTR 56[esp],eax
-       mov     DWORD PTR 60[esp],ecx
-       ; We now have the X array on the stack
-       ; starting at sp-4
-       mov     DWORD PTR 132[esp],esi
-L001shortcut:
-       ; 
-       ; Start processing
-       mov     eax,            DWORD PTR [ebp]
-       mov     ecx,            DWORD PTR 4[ebp]
-       ; 00_15 0
-       mov     esi,            ebx
-       mov     ebp,            eax
-       xor     esi,            edx
-       rol     ebp,            5
-       and     esi,            ecx
-       add     ebp,            edi
-       ror     ecx,            1
-       mov     edi,            DWORD PTR [esp]
-       ror     ecx,            1
-       xor     esi,            edx
-       lea     ebp,            DWORD PTR 1518500249[edi*1+ebp]
-       mov     edi,            ecx
-       add     esi,            ebp
-       xor     edi,            ebx
-       mov     ebp,            esi
-       and     edi,            eax
-       rol     ebp,            5
-       add     ebp,            edx
-       mov     edx,            DWORD PTR 4[esp]
-       ror     eax,            1
-       xor     edi,            ebx
-       ror     eax,            1
-       lea     ebp,            DWORD PTR 1518500249[edx*1+ebp]
-       add     edi,            ebp
-       ; 00_15 2
-       mov     edx,            eax
-       mov     ebp,            edi
-       xor     edx,            ecx
-       rol     ebp,            5
-       and     edx,            esi
-       add     ebp,            ebx
-       ror     esi,            1
-       mov     ebx,            DWORD PTR 8[esp]
-       ror     esi,            1
-       xor     edx,            ecx
-       lea     ebp,            DWORD PTR 1518500249[ebx*1+ebp]
-       mov     ebx,            esi
-       add     edx,            ebp
-       xor     ebx,            eax
-       mov     ebp,            edx
-       and     ebx,            edi
-       rol     ebp,            5
-       add     ebp,            ecx
-       mov     ecx,            DWORD PTR 12[esp]
-       ror     edi,            1
-       xor     ebx,            eax
-       ror     edi,            1
-       lea     ebp,            DWORD PTR 1518500249[ecx*1+ebp]
-       add     ebx,            ebp
-       ; 00_15 4
-       mov     ecx,            edi
-       mov     ebp,            ebx
-       xor     ecx,            esi
-       rol     ebp,            5
-       and     ecx,            edx
-       add     ebp,            eax
-       ror     edx,            1
-       mov     eax,            DWORD PTR 16[esp]
-       ror     edx,            1
-       xor     ecx,            esi
-       lea     ebp,            DWORD PTR 1518500249[eax*1+ebp]
-       mov     eax,            edx
-       add     ecx,            ebp
-       xor     eax,            edi
-       mov     ebp,            ecx
-       and     eax,            ebx
-       rol     ebp,            5
-       add     ebp,            esi
-       mov     esi,            DWORD PTR 20[esp]
-       ror     ebx,            1
-       xor     eax,            edi
-       ror     ebx,            1
-       lea     ebp,            DWORD PTR 1518500249[esi*1+ebp]
-       add     eax,            ebp
-       ; 00_15 6
-       mov     esi,            ebx
-       mov     ebp,            eax
-       xor     esi,            edx
-       rol     ebp,            5
-       and     esi,            ecx
-       add     ebp,            edi
-       ror     ecx,            1
-       mov     edi,            DWORD PTR 24[esp]
-       ror     ecx,            1
-       xor     esi,            edx
-       lea     ebp,            DWORD PTR 1518500249[edi*1+ebp]
-       mov     edi,            ecx
-       add     esi,            ebp
-       xor     edi,            ebx
-       mov     ebp,            esi
-       and     edi,            eax
-       rol     ebp,            5
-       add     ebp,            edx
-       mov     edx,            DWORD PTR 28[esp]
-       ror     eax,            1
-       xor     edi,            ebx
-       ror     eax,            1
-       lea     ebp,            DWORD PTR 1518500249[edx*1+ebp]
-       add     edi,            ebp
-       ; 00_15 8
-       mov     edx,            eax
-       mov     ebp,            edi
-       xor     edx,            ecx
-       rol     ebp,            5
-       and     edx,            esi
-       add     ebp,            ebx
-       ror     esi,            1
-       mov     ebx,            DWORD PTR 32[esp]
-       ror     esi,            1
-       xor     edx,            ecx
-       lea     ebp,            DWORD PTR 1518500249[ebx*1+ebp]
-       mov     ebx,            esi
-       add     edx,            ebp
-       xor     ebx,            eax
-       mov     ebp,            edx
-       and     ebx,            edi
-       rol     ebp,            5
-       add     ebp,            ecx
-       mov     ecx,            DWORD PTR 36[esp]
-       ror     edi,            1
-       xor     ebx,            eax
-       ror     edi,            1
-       lea     ebp,            DWORD PTR 1518500249[ecx*1+ebp]
-       add     ebx,            ebp
-       ; 00_15 10
-       mov     ecx,            edi
-       mov     ebp,            ebx
-       xor     ecx,            esi
-       rol     ebp,            5
-       and     ecx,            edx
-       add     ebp,            eax
-       ror     edx,            1
-       mov     eax,            DWORD PTR 40[esp]
-       ror     edx,            1
-       xor     ecx,            esi
-       lea     ebp,            DWORD PTR 1518500249[eax*1+ebp]
-       mov     eax,            edx
-       add     ecx,            ebp
-       xor     eax,            edi
-       mov     ebp,            ecx
-       and     eax,            ebx
-       rol     ebp,            5
-       add     ebp,            esi
-       mov     esi,            DWORD PTR 44[esp]
-       ror     ebx,            1
-       xor     eax,            edi
-       ror     ebx,            1
-       lea     ebp,            DWORD PTR 1518500249[esi*1+ebp]
-       add     eax,            ebp
-       ; 00_15 12
-       mov     esi,            ebx
-       mov     ebp,            eax
-       xor     esi,            edx
-       rol     ebp,            5
-       and     esi,            ecx
-       add     ebp,            edi
-       ror     ecx,            1
-       mov     edi,            DWORD PTR 48[esp]
-       ror     ecx,            1
-       xor     esi,            edx
-       lea     ebp,            DWORD PTR 1518500249[edi*1+ebp]
-       mov     edi,            ecx
-       add     esi,            ebp
-       xor     edi,            ebx
-       mov     ebp,            esi
-       and     edi,            eax
-       rol     ebp,            5
-       add     ebp,            edx
-       mov     edx,            DWORD PTR 52[esp]
-       ror     eax,            1
-       xor     edi,            ebx
-       ror     eax,            1
-       lea     ebp,            DWORD PTR 1518500249[edx*1+ebp]
-       add     edi,            ebp
-       ; 00_15 14
-       mov     edx,            eax
-       mov     ebp,            edi
-       xor     edx,            ecx
-       rol     ebp,            5
-       and     edx,            esi
-       add     ebp,            ebx
-       ror     esi,            1
-       mov     ebx,            DWORD PTR 56[esp]
-       ror     esi,            1
-       xor     edx,            ecx
-       lea     ebp,            DWORD PTR 1518500249[ebx*1+ebp]
-       mov     ebx,            esi
-       add     edx,            ebp
-       xor     ebx,            eax
-       mov     ebp,            edx
-       and     ebx,            edi
-       rol     ebp,            5
-       add     ebp,            ecx
-       mov     ecx,            DWORD PTR 60[esp]
-       ror     edi,            1
-       xor     ebx,            eax
-       ror     edi,            1
-       lea     ebp,            DWORD PTR 1518500249[ecx*1+ebp]
-       add     ebx,            ebp
-       ; 16_19 16
-       nop
-       mov     ebp,            DWORD PTR [esp]
-       mov     ecx,            DWORD PTR 8[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 32[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 52[esp]
-       xor     ecx,            ebp
-       mov     ebp,            edi
-       rol     ecx,            1
-       xor     ebp,            esi
-       mov     DWORD PTR [esp],ecx
-       and     ebp,            edx
-       lea     ecx,            DWORD PTR 1518500249[eax*1+ecx]
-       xor     ebp,            esi
-       mov     eax,            ebx
-       add     ecx,            ebp
-       rol     eax,            5
-       ror     edx,            1
-       add     ecx,            eax
-       mov     eax,            DWORD PTR 4[esp]
-       mov     ebp,            DWORD PTR 12[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 36[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 56[esp]
-       ror     edx,            1
-       xor     eax,            ebp
-       rol     eax,            1
-       mov     ebp,            edx
-       xor     ebp,            edi
-       mov     DWORD PTR 4[esp],eax
-       and     ebp,            ebx
-       lea     eax,            DWORD PTR 1518500249[esi*1+eax]
-       xor     ebp,            edi
-       mov     esi,            ecx
-       rol     esi,            5
-       ror     ebx,            1
-       add     eax,            esi
-       ror     ebx,            1
-       add     eax,            ebp
-       ; 16_19 18
-       mov     ebp,            DWORD PTR 8[esp]
-       mov     esi,            DWORD PTR 16[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 40[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 60[esp]
-       xor     esi,            ebp
-       mov     ebp,            ebx
-       rol     esi,            1
-       xor     ebp,            edx
-       mov     DWORD PTR 8[esp],esi
-       and     ebp,            ecx
-       lea     esi,            DWORD PTR 1518500249[edi*1+esi]
-       xor     ebp,            edx
-       mov     edi,            eax
-       add     esi,            ebp
-       rol     edi,            5
-       ror     ecx,            1
-       add     esi,            edi
-       mov     edi,            DWORD PTR 12[esp]
-       mov     ebp,            DWORD PTR 20[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 44[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR [esp]
-       ror     ecx,            1
-       xor     edi,            ebp
-       rol     edi,            1
-       mov     ebp,            ecx
-       xor     ebp,            ebx
-       mov     DWORD PTR 12[esp],edi
-       and     ebp,            eax
-       lea     edi,            DWORD PTR 1518500249[edx*1+edi]
-       xor     ebp,            ebx
-       mov     edx,            esi
-       rol     edx,            5
-       ror     eax,            1
-       add     edi,            edx
-       ror     eax,            1
-       add     edi,            ebp
-       ; 20_39 20
-       mov     edx,            DWORD PTR 16[esp]
-       mov     ebp,            DWORD PTR 24[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 48[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 4[esp]
-       xor     edx,            ebp
-       mov     ebp,            esi
-       rol     edx,            1
-       xor     ebp,            eax
-       mov     DWORD PTR 16[esp],edx
-       xor     ebp,            ecx
-       lea     edx,            DWORD PTR 1859775393[ebx*1+edx]
-       mov     ebx,            edi
-       rol     ebx,            5
-       ror     esi,            1
-       add     ebx,            ebp
-       ror     esi,            1
-       add     edx,            ebx
-       ; 20_39 21
-       mov     ebx,            DWORD PTR 20[esp]
-       mov     ebp,            DWORD PTR 28[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 52[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 8[esp]
-       xor     ebx,            ebp
-       mov     ebp,            edi
-       rol     ebx,            1
-       xor     ebp,            esi
-       mov     DWORD PTR 20[esp],ebx
-       xor     ebp,            eax
-       lea     ebx,            DWORD PTR 1859775393[ecx*1+ebx]
-       mov     ecx,            edx
-       rol     ecx,            5
-       ror     edi,            1
-       add     ecx,            ebp
-       ror     edi,            1
-       add     ebx,            ecx
-       ; 20_39 22
-       mov     ecx,            DWORD PTR 24[esp]
-       mov     ebp,            DWORD PTR 32[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 56[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 12[esp]
-       xor     ecx,            ebp
-       mov     ebp,            edx
-       rol     ecx,            1
-       xor     ebp,            edi
-       mov     DWORD PTR 24[esp],ecx
-       xor     ebp,            esi
-       lea     ecx,            DWORD PTR 1859775393[eax*1+ecx]
-       mov     eax,            ebx
-       rol     eax,            5
-       ror     edx,            1
-       add     eax,            ebp
-       ror     edx,            1
-       add     ecx,            eax
-       ; 20_39 23
-       mov     eax,            DWORD PTR 28[esp]
-       mov     ebp,            DWORD PTR 36[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 60[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 16[esp]
-       xor     eax,            ebp
-       mov     ebp,            ebx
-       rol     eax,            1
-       xor     ebp,            edx
-       mov     DWORD PTR 28[esp],eax
-       xor     ebp,            edi
-       lea     eax,            DWORD PTR 1859775393[esi*1+eax]
-       mov     esi,            ecx
-       rol     esi,            5
-       ror     ebx,            1
-       add     esi,            ebp
-       ror     ebx,            1
-       add     eax,            esi
-       ; 20_39 24
-       mov     esi,            DWORD PTR 32[esp]
-       mov     ebp,            DWORD PTR 40[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR [esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 20[esp]
-       xor     esi,            ebp
-       mov     ebp,            ecx
-       rol     esi,            1
-       xor     ebp,            ebx
-       mov     DWORD PTR 32[esp],esi
-       xor     ebp,            edx
-       lea     esi,            DWORD PTR 1859775393[edi*1+esi]
-       mov     edi,            eax
-       rol     edi,            5
-       ror     ecx,            1
-       add     edi,            ebp
-       ror     ecx,            1
-       add     esi,            edi
-       ; 20_39 25
-       mov     edi,            DWORD PTR 36[esp]
-       mov     ebp,            DWORD PTR 44[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 4[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       xor     edi,            ebp
-       mov     ebp,            eax
-       rol     edi,            1
-       xor     ebp,            ecx
-       mov     DWORD PTR 36[esp],edi
-       xor     ebp,            ebx
-       lea     edi,            DWORD PTR 1859775393[edx*1+edi]
-       mov     edx,            esi
-       rol     edx,            5
-       ror     eax,            1
-       add     edx,            ebp
-       ror     eax,            1
-       add     edi,            edx
-       ; 20_39 26
-       mov     edx,            DWORD PTR 40[esp]
-       mov     ebp,            DWORD PTR 48[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 8[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       xor     edx,            ebp
-       mov     ebp,            esi
-       rol     edx,            1
-       xor     ebp,            eax
-       mov     DWORD PTR 40[esp],edx
-       xor     ebp,            ecx
-       lea     edx,            DWORD PTR 1859775393[ebx*1+edx]
-       mov     ebx,            edi
-       rol     ebx,            5
-       ror     esi,            1
-       add     ebx,            ebp
-       ror     esi,            1
-       add     edx,            ebx
-       ; 20_39 27
-       mov     ebx,            DWORD PTR 44[esp]
-       mov     ebp,            DWORD PTR 52[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 12[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 32[esp]
-       xor     ebx,            ebp
-       mov     ebp,            edi
-       rol     ebx,            1
-       xor     ebp,            esi
-       mov     DWORD PTR 44[esp],ebx
-       xor     ebp,            eax
-       lea     ebx,            DWORD PTR 1859775393[ecx*1+ebx]
-       mov     ecx,            edx
-       rol     ecx,            5
-       ror     edi,            1
-       add     ecx,            ebp
-       ror     edi,            1
-       add     ebx,            ecx
-       ; 20_39 28
-       mov     ecx,            DWORD PTR 48[esp]
-       mov     ebp,            DWORD PTR 56[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 16[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 36[esp]
-       xor     ecx,            ebp
-       mov     ebp,            edx
-       rol     ecx,            1
-       xor     ebp,            edi
-       mov     DWORD PTR 48[esp],ecx
-       xor     ebp,            esi
-       lea     ecx,            DWORD PTR 1859775393[eax*1+ecx]
-       mov     eax,            ebx
-       rol     eax,            5
-       ror     edx,            1
-       add     eax,            ebp
-       ror     edx,            1
-       add     ecx,            eax
-       ; 20_39 29
-       mov     eax,            DWORD PTR 52[esp]
-       mov     ebp,            DWORD PTR 60[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 20[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 40[esp]
-       xor     eax,            ebp
-       mov     ebp,            ebx
-       rol     eax,            1
-       xor     ebp,            edx
-       mov     DWORD PTR 52[esp],eax
-       xor     ebp,            edi
-       lea     eax,            DWORD PTR 1859775393[esi*1+eax]
-       mov     esi,            ecx
-       rol     esi,            5
-       ror     ebx,            1
-       add     esi,            ebp
-       ror     ebx,            1
-       add     eax,            esi
-       ; 20_39 30
-       mov     esi,            DWORD PTR 56[esp]
-       mov     ebp,            DWORD PTR [esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 44[esp]
-       xor     esi,            ebp
-       mov     ebp,            ecx
-       rol     esi,            1
-       xor     ebp,            ebx
-       mov     DWORD PTR 56[esp],esi
-       xor     ebp,            edx
-       lea     esi,            DWORD PTR 1859775393[edi*1+esi]
-       mov     edi,            eax
-       rol     edi,            5
-       ror     ecx,            1
-       add     edi,            ebp
-       ror     ecx,            1
-       add     esi,            edi
-       ; 20_39 31
-       mov     edi,            DWORD PTR 60[esp]
-       mov     ebp,            DWORD PTR 4[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 48[esp]
-       xor     edi,            ebp
-       mov     ebp,            eax
-       rol     edi,            1
-       xor     ebp,            ecx
-       mov     DWORD PTR 60[esp],edi
-       xor     ebp,            ebx
-       lea     edi,            DWORD PTR 1859775393[edx*1+edi]
-       mov     edx,            esi
-       rol     edx,            5
-       ror     eax,            1
-       add     edx,            ebp
-       ror     eax,            1
-       add     edi,            edx
-       ; 20_39 32
-       mov     edx,            DWORD PTR [esp]
-       mov     ebp,            DWORD PTR 8[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 32[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 52[esp]
-       xor     edx,            ebp
-       mov     ebp,            esi
-       rol     edx,            1
-       xor     ebp,            eax
-       mov     DWORD PTR [esp],edx
-       xor     ebp,            ecx
-       lea     edx,            DWORD PTR 1859775393[ebx*1+edx]
-       mov     ebx,            edi
-       rol     ebx,            5
-       ror     esi,            1
-       add     ebx,            ebp
-       ror     esi,            1
-       add     edx,            ebx
-       ; 20_39 33
-       mov     ebx,            DWORD PTR 4[esp]
-       mov     ebp,            DWORD PTR 12[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 36[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 56[esp]
-       xor     ebx,            ebp
-       mov     ebp,            edi
-       rol     ebx,            1
-       xor     ebp,            esi
-       mov     DWORD PTR 4[esp],ebx
-       xor     ebp,            eax
-       lea     ebx,            DWORD PTR 1859775393[ecx*1+ebx]
-       mov     ecx,            edx
-       rol     ecx,            5
-       ror     edi,            1
-       add     ecx,            ebp
-       ror     edi,            1
-       add     ebx,            ecx
-       ; 20_39 34
-       mov     ecx,            DWORD PTR 8[esp]
-       mov     ebp,            DWORD PTR 16[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 40[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 60[esp]
-       xor     ecx,            ebp
-       mov     ebp,            edx
-       rol     ecx,            1
-       xor     ebp,            edi
-       mov     DWORD PTR 8[esp],ecx
-       xor     ebp,            esi
-       lea     ecx,            DWORD PTR 1859775393[eax*1+ecx]
-       mov     eax,            ebx
-       rol     eax,            5
-       ror     edx,            1
-       add     eax,            ebp
-       ror     edx,            1
-       add     ecx,            eax
-       ; 20_39 35
-       mov     eax,            DWORD PTR 12[esp]
-       mov     ebp,            DWORD PTR 20[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 44[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR [esp]
-       xor     eax,            ebp
-       mov     ebp,            ebx
-       rol     eax,            1
-       xor     ebp,            edx
-       mov     DWORD PTR 12[esp],eax
-       xor     ebp,            edi
-       lea     eax,            DWORD PTR 1859775393[esi*1+eax]
-       mov     esi,            ecx
-       rol     esi,            5
-       ror     ebx,            1
-       add     esi,            ebp
-       ror     ebx,            1
-       add     eax,            esi
-       ; 20_39 36
-       mov     esi,            DWORD PTR 16[esp]
-       mov     ebp,            DWORD PTR 24[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 48[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 4[esp]
-       xor     esi,            ebp
-       mov     ebp,            ecx
-       rol     esi,            1
-       xor     ebp,            ebx
-       mov     DWORD PTR 16[esp],esi
-       xor     ebp,            edx
-       lea     esi,            DWORD PTR 1859775393[edi*1+esi]
-       mov     edi,            eax
-       rol     edi,            5
-       ror     ecx,            1
-       add     edi,            ebp
-       ror     ecx,            1
-       add     esi,            edi
-       ; 20_39 37
-       mov     edi,            DWORD PTR 20[esp]
-       mov     ebp,            DWORD PTR 28[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 52[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 8[esp]
-       xor     edi,            ebp
-       mov     ebp,            eax
-       rol     edi,            1
-       xor     ebp,            ecx
-       mov     DWORD PTR 20[esp],edi
-       xor     ebp,            ebx
-       lea     edi,            DWORD PTR 1859775393[edx*1+edi]
-       mov     edx,            esi
-       rol     edx,            5
-       ror     eax,            1
-       add     edx,            ebp
-       ror     eax,            1
-       add     edi,            edx
-       ; 20_39 38
-       mov     edx,            DWORD PTR 24[esp]
-       mov     ebp,            DWORD PTR 32[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 56[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 12[esp]
-       xor     edx,            ebp
-       mov     ebp,            esi
-       rol     edx,            1
-       xor     ebp,            eax
-       mov     DWORD PTR 24[esp],edx
-       xor     ebp,            ecx
-       lea     edx,            DWORD PTR 1859775393[ebx*1+edx]
-       mov     ebx,            edi
-       rol     ebx,            5
-       ror     esi,            1
-       add     ebx,            ebp
-       ror     esi,            1
-       add     edx,            ebx
-       ; 20_39 39
-       mov     ebx,            DWORD PTR 28[esp]
-       mov     ebp,            DWORD PTR 36[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 60[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 16[esp]
-       xor     ebx,            ebp
-       mov     ebp,            edi
-       rol     ebx,            1
-       xor     ebp,            esi
-       mov     DWORD PTR 28[esp],ebx
-       xor     ebp,            eax
-       lea     ebx,            DWORD PTR 1859775393[ecx*1+ebx]
-       mov     ecx,            edx
-       rol     ecx,            5
-       ror     edi,            1
-       add     ecx,            ebp
-       ror     edi,            1
-       add     ebx,            ecx
-       ; 40_59 40
-       mov     ecx,            DWORD PTR 32[esp]
-       mov     ebp,            DWORD PTR 40[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR [esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 20[esp]
-       xor     ecx,            ebp
-       mov     ebp,            edx
-       rol     ecx,            1
-       or      ebp,            edi
-       mov     DWORD PTR 32[esp],ecx
-       and     ebp,            esi
-       lea     ecx,            DWORD PTR 2400959708[eax*1+ecx]
-       mov     eax,            edx
-       ror     edx,            1
-       and     eax,            edi
-       or      ebp,            eax
-       mov     eax,            ebx
-       rol     eax,            5
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 36[esp]
-       add     ecx,            ebp
-       mov     ebp,            DWORD PTR 44[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 4[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       ror     edx,            1
-       xor     eax,            ebp
-       rol     eax,            1
-       mov     ebp,            ebx
-       mov     DWORD PTR 36[esp],eax
-       or      ebp,            edx
-       lea     eax,            DWORD PTR 2400959708[esi*1+eax]
-       mov     esi,            ebx
-       and     ebp,            edi
-       and     esi,            edx
-       or      ebp,            esi
-       mov     esi,            ecx
-       rol     esi,            5
-       ror     ebx,            1
-       add     ebp,            esi
-       ror     ebx,            1
-       add     eax,            ebp
-       ; 40_59 41
-       ; 40_59 42
-       mov     esi,            DWORD PTR 40[esp]
-       mov     ebp,            DWORD PTR 48[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 8[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       xor     esi,            ebp
-       mov     ebp,            ecx
-       rol     esi,            1
-       or      ebp,            ebx
-       mov     DWORD PTR 40[esp],esi
-       and     ebp,            edx
-       lea     esi,            DWORD PTR 2400959708[edi*1+esi]
-       mov     edi,            ecx
-       ror     ecx,            1
-       and     edi,            ebx
-       or      ebp,            edi
-       mov     edi,            eax
-       rol     edi,            5
-       add     ebp,            edi
-       mov     edi,            DWORD PTR 44[esp]
-       add     esi,            ebp
-       mov     ebp,            DWORD PTR 52[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 12[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 32[esp]
-       ror     ecx,            1
-       xor     edi,            ebp
-       rol     edi,            1
-       mov     ebp,            eax
-       mov     DWORD PTR 44[esp],edi
-       or      ebp,            ecx
-       lea     edi,            DWORD PTR 2400959708[edx*1+edi]
-       mov     edx,            eax
-       and     ebp,            ebx
-       and     edx,            ecx
-       or      ebp,            edx
-       mov     edx,            esi
-       rol     edx,            5
-       ror     eax,            1
-       add     ebp,            edx
-       ror     eax,            1
-       add     edi,            ebp
-       ; 40_59 43
-       ; 40_59 44
-       mov     edx,            DWORD PTR 48[esp]
-       mov     ebp,            DWORD PTR 56[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 16[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 36[esp]
-       xor     edx,            ebp
-       mov     ebp,            esi
-       rol     edx,            1
-       or      ebp,            eax
-       mov     DWORD PTR 48[esp],edx
-       and     ebp,            ecx
-       lea     edx,            DWORD PTR 2400959708[ebx*1+edx]
-       mov     ebx,            esi
-       ror     esi,            1
-       and     ebx,            eax
-       or      ebp,            ebx
-       mov     ebx,            edi
-       rol     ebx,            5
-       add     ebp,            ebx
-       mov     ebx,            DWORD PTR 52[esp]
-       add     edx,            ebp
-       mov     ebp,            DWORD PTR 60[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 20[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 40[esp]
-       ror     esi,            1
-       xor     ebx,            ebp
-       rol     ebx,            1
-       mov     ebp,            edi
-       mov     DWORD PTR 52[esp],ebx
-       or      ebp,            esi
-       lea     ebx,            DWORD PTR 2400959708[ecx*1+ebx]
-       mov     ecx,            edi
-       and     ebp,            eax
-       and     ecx,            esi
-       or      ebp,            ecx
-       mov     ecx,            edx
-       rol     ecx,            5
-       ror     edi,            1
-       add     ebp,            ecx
-       ror     edi,            1
-       add     ebx,            ebp
-       ; 40_59 45
-       ; 40_59 46
-       mov     ecx,            DWORD PTR 56[esp]
-       mov     ebp,            DWORD PTR [esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 44[esp]
-       xor     ecx,            ebp
-       mov     ebp,            edx
-       rol     ecx,            1
-       or      ebp,            edi
-       mov     DWORD PTR 56[esp],ecx
-       and     ebp,            esi
-       lea     ecx,            DWORD PTR 2400959708[eax*1+ecx]
-       mov     eax,            edx
-       ror     edx,            1
-       and     eax,            edi
-       or      ebp,            eax
-       mov     eax,            ebx
-       rol     eax,            5
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 60[esp]
-       add     ecx,            ebp
-       mov     ebp,            DWORD PTR 4[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 48[esp]
-       ror     edx,            1
-       xor     eax,            ebp
-       rol     eax,            1
-       mov     ebp,            ebx
-       mov     DWORD PTR 60[esp],eax
-       or      ebp,            edx
-       lea     eax,            DWORD PTR 2400959708[esi*1+eax]
-       mov     esi,            ebx
-       and     ebp,            edi
-       and     esi,            edx
-       or      ebp,            esi
-       mov     esi,            ecx
-       rol     esi,            5
-       ror     ebx,            1
-       add     ebp,            esi
-       ror     ebx,            1
-       add     eax,            ebp
-       ; 40_59 47
-       ; 40_59 48
-       mov     esi,            DWORD PTR [esp]
-       mov     ebp,            DWORD PTR 8[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 32[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 52[esp]
-       xor     esi,            ebp
-       mov     ebp,            ecx
-       rol     esi,            1
-       or      ebp,            ebx
-       mov     DWORD PTR [esp],esi
-       and     ebp,            edx
-       lea     esi,            DWORD PTR 2400959708[edi*1+esi]
-       mov     edi,            ecx
-       ror     ecx,            1
-       and     edi,            ebx
-       or      ebp,            edi
-       mov     edi,            eax
-       rol     edi,            5
-       add     ebp,            edi
-       mov     edi,            DWORD PTR 4[esp]
-       add     esi,            ebp
-       mov     ebp,            DWORD PTR 12[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 36[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 56[esp]
-       ror     ecx,            1
-       xor     edi,            ebp
-       rol     edi,            1
-       mov     ebp,            eax
-       mov     DWORD PTR 4[esp],edi
-       or      ebp,            ecx
-       lea     edi,            DWORD PTR 2400959708[edx*1+edi]
-       mov     edx,            eax
-       and     ebp,            ebx
-       and     edx,            ecx
-       or      ebp,            edx
-       mov     edx,            esi
-       rol     edx,            5
-       ror     eax,            1
-       add     ebp,            edx
-       ror     eax,            1
-       add     edi,            ebp
-       ; 40_59 49
-       ; 40_59 50
-       mov     edx,            DWORD PTR 8[esp]
-       mov     ebp,            DWORD PTR 16[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 40[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 60[esp]
-       xor     edx,            ebp
-       mov     ebp,            esi
-       rol     edx,            1
-       or      ebp,            eax
-       mov     DWORD PTR 8[esp],edx
-       and     ebp,            ecx
-       lea     edx,            DWORD PTR 2400959708[ebx*1+edx]
-       mov     ebx,            esi
-       ror     esi,            1
-       and     ebx,            eax
-       or      ebp,            ebx
-       mov     ebx,            edi
-       rol     ebx,            5
-       add     ebp,            ebx
-       mov     ebx,            DWORD PTR 12[esp]
-       add     edx,            ebp
-       mov     ebp,            DWORD PTR 20[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 44[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR [esp]
-       ror     esi,            1
-       xor     ebx,            ebp
-       rol     ebx,            1
-       mov     ebp,            edi
-       mov     DWORD PTR 12[esp],ebx
-       or      ebp,            esi
-       lea     ebx,            DWORD PTR 2400959708[ecx*1+ebx]
-       mov     ecx,            edi
-       and     ebp,            eax
-       and     ecx,            esi
-       or      ebp,            ecx
-       mov     ecx,            edx
-       rol     ecx,            5
-       ror     edi,            1
-       add     ebp,            ecx
-       ror     edi,            1
-       add     ebx,            ebp
-       ; 40_59 51
-       ; 40_59 52
-       mov     ecx,            DWORD PTR 16[esp]
-       mov     ebp,            DWORD PTR 24[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 48[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 4[esp]
-       xor     ecx,            ebp
-       mov     ebp,            edx
-       rol     ecx,            1
-       or      ebp,            edi
-       mov     DWORD PTR 16[esp],ecx
-       and     ebp,            esi
-       lea     ecx,            DWORD PTR 2400959708[eax*1+ecx]
-       mov     eax,            edx
-       ror     edx,            1
-       and     eax,            edi
-       or      ebp,            eax
-       mov     eax,            ebx
-       rol     eax,            5
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 20[esp]
-       add     ecx,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 52[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 8[esp]
-       ror     edx,            1
-       xor     eax,            ebp
-       rol     eax,            1
-       mov     ebp,            ebx
-       mov     DWORD PTR 20[esp],eax
-       or      ebp,            edx
-       lea     eax,            DWORD PTR 2400959708[esi*1+eax]
-       mov     esi,            ebx
-       and     ebp,            edi
-       and     esi,            edx
-       or      ebp,            esi
-       mov     esi,            ecx
-       rol     esi,            5
-       ror     ebx,            1
-       add     ebp,            esi
-       ror     ebx,            1
-       add     eax,            ebp
-       ; 40_59 53
-       ; 40_59 54
-       mov     esi,            DWORD PTR 24[esp]
-       mov     ebp,            DWORD PTR 32[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 56[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 12[esp]
-       xor     esi,            ebp
-       mov     ebp,            ecx
-       rol     esi,            1
-       or      ebp,            ebx
-       mov     DWORD PTR 24[esp],esi
-       and     ebp,            edx
-       lea     esi,            DWORD PTR 2400959708[edi*1+esi]
-       mov     edi,            ecx
-       ror     ecx,            1
-       and     edi,            ebx
-       or      ebp,            edi
-       mov     edi,            eax
-       rol     edi,            5
-       add     ebp,            edi
-       mov     edi,            DWORD PTR 28[esp]
-       add     esi,            ebp
-       mov     ebp,            DWORD PTR 36[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 60[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 16[esp]
-       ror     ecx,            1
-       xor     edi,            ebp
-       rol     edi,            1
-       mov     ebp,            eax
-       mov     DWORD PTR 28[esp],edi
-       or      ebp,            ecx
-       lea     edi,            DWORD PTR 2400959708[edx*1+edi]
-       mov     edx,            eax
-       and     ebp,            ebx
-       and     edx,            ecx
-       or      ebp,            edx
-       mov     edx,            esi
-       rol     edx,            5
-       ror     eax,            1
-       add     ebp,            edx
-       ror     eax,            1
-       add     edi,            ebp
-       ; 40_59 55
-       ; 40_59 56
-       mov     edx,            DWORD PTR 32[esp]
-       mov     ebp,            DWORD PTR 40[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR [esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 20[esp]
-       xor     edx,            ebp
-       mov     ebp,            esi
-       rol     edx,            1
-       or      ebp,            eax
-       mov     DWORD PTR 32[esp],edx
-       and     ebp,            ecx
-       lea     edx,            DWORD PTR 2400959708[ebx*1+edx]
-       mov     ebx,            esi
-       ror     esi,            1
-       and     ebx,            eax
-       or      ebp,            ebx
-       mov     ebx,            edi
-       rol     ebx,            5
-       add     ebp,            ebx
-       mov     ebx,            DWORD PTR 36[esp]
-       add     edx,            ebp
-       mov     ebp,            DWORD PTR 44[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 4[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       ror     esi,            1
-       xor     ebx,            ebp
-       rol     ebx,            1
-       mov     ebp,            edi
-       mov     DWORD PTR 36[esp],ebx
-       or      ebp,            esi
-       lea     ebx,            DWORD PTR 2400959708[ecx*1+ebx]
-       mov     ecx,            edi
-       and     ebp,            eax
-       and     ecx,            esi
-       or      ebp,            ecx
-       mov     ecx,            edx
-       rol     ecx,            5
-       ror     edi,            1
-       add     ebp,            ecx
-       ror     edi,            1
-       add     ebx,            ebp
-       ; 40_59 57
-       ; 40_59 58
-       mov     ecx,            DWORD PTR 40[esp]
-       mov     ebp,            DWORD PTR 48[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 8[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       xor     ecx,            ebp
-       mov     ebp,            edx
-       rol     ecx,            1
-       or      ebp,            edi
-       mov     DWORD PTR 40[esp],ecx
-       and     ebp,            esi
-       lea     ecx,            DWORD PTR 2400959708[eax*1+ecx]
-       mov     eax,            edx
-       ror     edx,            1
-       and     eax,            edi
-       or      ebp,            eax
-       mov     eax,            ebx
-       rol     eax,            5
-       add     ebp,            eax
-       mov     eax,            DWORD PTR 44[esp]
-       add     ecx,            ebp
-       mov     ebp,            DWORD PTR 52[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 12[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 32[esp]
-       ror     edx,            1
-       xor     eax,            ebp
-       rol     eax,            1
-       mov     ebp,            ebx
-       mov     DWORD PTR 44[esp],eax
-       or      ebp,            edx
-       lea     eax,            DWORD PTR 2400959708[esi*1+eax]
-       mov     esi,            ebx
-       and     ebp,            edi
-       and     esi,            edx
-       or      ebp,            esi
-       mov     esi,            ecx
-       rol     esi,            5
-       ror     ebx,            1
-       add     ebp,            esi
-       ror     ebx,            1
-       add     eax,            ebp
-       ; 40_59 59
-       ; 20_39 60
-       mov     esi,            DWORD PTR 48[esp]
-       mov     ebp,            DWORD PTR 56[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 16[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 36[esp]
-       xor     esi,            ebp
-       mov     ebp,            ecx
-       rol     esi,            1
-       xor     ebp,            ebx
-       mov     DWORD PTR 48[esp],esi
-       xor     ebp,            edx
-       lea     esi,            DWORD PTR 3395469782[edi*1+esi]
-       mov     edi,            eax
-       rol     edi,            5
-       ror     ecx,            1
-       add     edi,            ebp
-       ror     ecx,            1
-       add     esi,            edi
-       ; 20_39 61
-       mov     edi,            DWORD PTR 52[esp]
-       mov     ebp,            DWORD PTR 60[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 20[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 40[esp]
-       xor     edi,            ebp
-       mov     ebp,            eax
-       rol     edi,            1
-       xor     ebp,            ecx
-       mov     DWORD PTR 52[esp],edi
-       xor     ebp,            ebx
-       lea     edi,            DWORD PTR 3395469782[edx*1+edi]
-       mov     edx,            esi
-       rol     edx,            5
-       ror     eax,            1
-       add     edx,            ebp
-       ror     eax,            1
-       add     edi,            edx
-       ; 20_39 62
-       mov     edx,            DWORD PTR 56[esp]
-       mov     ebp,            DWORD PTR [esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 44[esp]
-       xor     edx,            ebp
-       mov     ebp,            esi
-       rol     edx,            1
-       xor     ebp,            eax
-       mov     DWORD PTR 56[esp],edx
-       xor     ebp,            ecx
-       lea     edx,            DWORD PTR 3395469782[ebx*1+edx]
-       mov     ebx,            edi
-       rol     ebx,            5
-       ror     esi,            1
-       add     ebx,            ebp
-       ror     esi,            1
-       add     edx,            ebx
-       ; 20_39 63
-       mov     ebx,            DWORD PTR 60[esp]
-       mov     ebp,            DWORD PTR 4[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 48[esp]
-       xor     ebx,            ebp
-       mov     ebp,            edi
-       rol     ebx,            1
-       xor     ebp,            esi
-       mov     DWORD PTR 60[esp],ebx
-       xor     ebp,            eax
-       lea     ebx,            DWORD PTR 3395469782[ecx*1+ebx]
-       mov     ecx,            edx
-       rol     ecx,            5
-       ror     edi,            1
-       add     ecx,            ebp
-       ror     edi,            1
-       add     ebx,            ecx
-       ; 20_39 64
-       mov     ecx,            DWORD PTR [esp]
-       mov     ebp,            DWORD PTR 8[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 32[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 52[esp]
-       xor     ecx,            ebp
-       mov     ebp,            edx
-       rol     ecx,            1
-       xor     ebp,            edi
-       mov     DWORD PTR [esp],ecx
-       xor     ebp,            esi
-       lea     ecx,            DWORD PTR 3395469782[eax*1+ecx]
-       mov     eax,            ebx
-       rol     eax,            5
-       ror     edx,            1
-       add     eax,            ebp
-       ror     edx,            1
-       add     ecx,            eax
-       ; 20_39 65
-       mov     eax,            DWORD PTR 4[esp]
-       mov     ebp,            DWORD PTR 12[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 36[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 56[esp]
-       xor     eax,            ebp
-       mov     ebp,            ebx
-       rol     eax,            1
-       xor     ebp,            edx
-       mov     DWORD PTR 4[esp],eax
-       xor     ebp,            edi
-       lea     eax,            DWORD PTR 3395469782[esi*1+eax]
-       mov     esi,            ecx
-       rol     esi,            5
-       ror     ebx,            1
-       add     esi,            ebp
-       ror     ebx,            1
-       add     eax,            esi
-       ; 20_39 66
-       mov     esi,            DWORD PTR 8[esp]
-       mov     ebp,            DWORD PTR 16[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 40[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 60[esp]
-       xor     esi,            ebp
-       mov     ebp,            ecx
-       rol     esi,            1
-       xor     ebp,            ebx
-       mov     DWORD PTR 8[esp],esi
-       xor     ebp,            edx
-       lea     esi,            DWORD PTR 3395469782[edi*1+esi]
-       mov     edi,            eax
-       rol     edi,            5
-       ror     ecx,            1
-       add     edi,            ebp
-       ror     ecx,            1
-       add     esi,            edi
-       ; 20_39 67
-       mov     edi,            DWORD PTR 12[esp]
-       mov     ebp,            DWORD PTR 20[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 44[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR [esp]
-       xor     edi,            ebp
-       mov     ebp,            eax
-       rol     edi,            1
-       xor     ebp,            ecx
-       mov     DWORD PTR 12[esp],edi
-       xor     ebp,            ebx
-       lea     edi,            DWORD PTR 3395469782[edx*1+edi]
-       mov     edx,            esi
-       rol     edx,            5
-       ror     eax,            1
-       add     edx,            ebp
-       ror     eax,            1
-       add     edi,            edx
-       ; 20_39 68
-       mov     edx,            DWORD PTR 16[esp]
-       mov     ebp,            DWORD PTR 24[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 48[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 4[esp]
-       xor     edx,            ebp
-       mov     ebp,            esi
-       rol     edx,            1
-       xor     ebp,            eax
-       mov     DWORD PTR 16[esp],edx
-       xor     ebp,            ecx
-       lea     edx,            DWORD PTR 3395469782[ebx*1+edx]
-       mov     ebx,            edi
-       rol     ebx,            5
-       ror     esi,            1
-       add     ebx,            ebp
-       ror     esi,            1
-       add     edx,            ebx
-       ; 20_39 69
-       mov     ebx,            DWORD PTR 20[esp]
-       mov     ebp,            DWORD PTR 28[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 52[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 8[esp]
-       xor     ebx,            ebp
-       mov     ebp,            edi
-       rol     ebx,            1
-       xor     ebp,            esi
-       mov     DWORD PTR 20[esp],ebx
-       xor     ebp,            eax
-       lea     ebx,            DWORD PTR 3395469782[ecx*1+ebx]
-       mov     ecx,            edx
-       rol     ecx,            5
-       ror     edi,            1
-       add     ecx,            ebp
-       ror     edi,            1
-       add     ebx,            ecx
-       ; 20_39 70
-       mov     ecx,            DWORD PTR 24[esp]
-       mov     ebp,            DWORD PTR 32[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 56[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 12[esp]
-       xor     ecx,            ebp
-       mov     ebp,            edx
-       rol     ecx,            1
-       xor     ebp,            edi
-       mov     DWORD PTR 24[esp],ecx
-       xor     ebp,            esi
-       lea     ecx,            DWORD PTR 3395469782[eax*1+ecx]
-       mov     eax,            ebx
-       rol     eax,            5
-       ror     edx,            1
-       add     eax,            ebp
-       ror     edx,            1
-       add     ecx,            eax
-       ; 20_39 71
-       mov     eax,            DWORD PTR 28[esp]
-       mov     ebp,            DWORD PTR 36[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 60[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 16[esp]
-       xor     eax,            ebp
-       mov     ebp,            ebx
-       rol     eax,            1
-       xor     ebp,            edx
-       mov     DWORD PTR 28[esp],eax
-       xor     ebp,            edi
-       lea     eax,            DWORD PTR 3395469782[esi*1+eax]
-       mov     esi,            ecx
-       rol     esi,            5
-       ror     ebx,            1
-       add     esi,            ebp
-       ror     ebx,            1
-       add     eax,            esi
-       ; 20_39 72
-       mov     esi,            DWORD PTR 32[esp]
-       mov     ebp,            DWORD PTR 40[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR [esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 20[esp]
-       xor     esi,            ebp
-       mov     ebp,            ecx
-       rol     esi,            1
-       xor     ebp,            ebx
-       mov     DWORD PTR 32[esp],esi
-       xor     ebp,            edx
-       lea     esi,            DWORD PTR 3395469782[edi*1+esi]
-       mov     edi,            eax
-       rol     edi,            5
-       ror     ecx,            1
-       add     edi,            ebp
-       ror     ecx,            1
-       add     esi,            edi
-       ; 20_39 73
-       mov     edi,            DWORD PTR 36[esp]
-       mov     ebp,            DWORD PTR 44[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 4[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       xor     edi,            ebp
-       mov     ebp,            eax
-       rol     edi,            1
-       xor     ebp,            ecx
-       mov     DWORD PTR 36[esp],edi
-       xor     ebp,            ebx
-       lea     edi,            DWORD PTR 3395469782[edx*1+edi]
-       mov     edx,            esi
-       rol     edx,            5
-       ror     eax,            1
-       add     edx,            ebp
-       ror     eax,            1
-       add     edi,            edx
-       ; 20_39 74
-       mov     edx,            DWORD PTR 40[esp]
-       mov     ebp,            DWORD PTR 48[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 8[esp]
-       xor     edx,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       xor     edx,            ebp
-       mov     ebp,            esi
-       rol     edx,            1
-       xor     ebp,            eax
-       mov     DWORD PTR 40[esp],edx
-       xor     ebp,            ecx
-       lea     edx,            DWORD PTR 3395469782[ebx*1+edx]
-       mov     ebx,            edi
-       rol     ebx,            5
-       ror     esi,            1
-       add     ebx,            ebp
-       ror     esi,            1
-       add     edx,            ebx
-       ; 20_39 75
-       mov     ebx,            DWORD PTR 44[esp]
-       mov     ebp,            DWORD PTR 52[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 12[esp]
-       xor     ebx,            ebp
-       mov     ebp,            DWORD PTR 32[esp]
-       xor     ebx,            ebp
-       mov     ebp,            edi
-       rol     ebx,            1
-       xor     ebp,            esi
-       mov     DWORD PTR 44[esp],ebx
-       xor     ebp,            eax
-       lea     ebx,            DWORD PTR 3395469782[ecx*1+ebx]
-       mov     ecx,            edx
-       rol     ecx,            5
-       ror     edi,            1
-       add     ecx,            ebp
-       ror     edi,            1
-       add     ebx,            ecx
-       ; 20_39 76
-       mov     ecx,            DWORD PTR 48[esp]
-       mov     ebp,            DWORD PTR 56[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 16[esp]
-       xor     ecx,            ebp
-       mov     ebp,            DWORD PTR 36[esp]
-       xor     ecx,            ebp
-       mov     ebp,            edx
-       rol     ecx,            1
-       xor     ebp,            edi
-       mov     DWORD PTR 48[esp],ecx
-       xor     ebp,            esi
-       lea     ecx,            DWORD PTR 3395469782[eax*1+ecx]
-       mov     eax,            ebx
-       rol     eax,            5
-       ror     edx,            1
-       add     eax,            ebp
-       ror     edx,            1
-       add     ecx,            eax
-       ; 20_39 77
-       mov     eax,            DWORD PTR 52[esp]
-       mov     ebp,            DWORD PTR 60[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 20[esp]
-       xor     eax,            ebp
-       mov     ebp,            DWORD PTR 40[esp]
-       xor     eax,            ebp
-       mov     ebp,            ebx
-       rol     eax,            1
-       xor     ebp,            edx
-       mov     DWORD PTR 52[esp],eax
-       xor     ebp,            edi
-       lea     eax,            DWORD PTR 3395469782[esi*1+eax]
-       mov     esi,            ecx
-       rol     esi,            5
-       ror     ebx,            1
-       add     esi,            ebp
-       ror     ebx,            1
-       add     eax,            esi
-       ; 20_39 78
-       mov     esi,            DWORD PTR 56[esp]
-       mov     ebp,            DWORD PTR [esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 24[esp]
-       xor     esi,            ebp
-       mov     ebp,            DWORD PTR 44[esp]
-       xor     esi,            ebp
-       mov     ebp,            ecx
-       rol     esi,            1
-       xor     ebp,            ebx
-       mov     DWORD PTR 56[esp],esi
-       xor     ebp,            edx
-       lea     esi,            DWORD PTR 3395469782[edi*1+esi]
-       mov     edi,            eax
-       rol     edi,            5
-       ror     ecx,            1
-       add     edi,            ebp
-       ror     ecx,            1
-       add     esi,            edi
-       ; 20_39 79
-       mov     edi,            DWORD PTR 60[esp]
-       mov     ebp,            DWORD PTR 4[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 28[esp]
-       xor     edi,            ebp
-       mov     ebp,            DWORD PTR 48[esp]
-       xor     edi,            ebp
-       mov     ebp,            eax
-       rol     edi,            1
-       xor     ebp,            ecx
-       mov     DWORD PTR 60[esp],edi
-       xor     ebp,            ebx
-       lea     edi,            DWORD PTR 3395469782[edx*1+edi]
-       mov     edx,            esi
-       rol     edx,            5
-       add     edx,            ebp
-       mov     ebp,            DWORD PTR 128[esp]
-       ror     eax,            1
-       add     edi,            edx
-       ror     eax,            1
-       ; End processing
-       ; 
-       mov     edx,            DWORD PTR 12[ebp]
-       add     edx,            ecx
-       mov     ecx,            DWORD PTR 4[ebp]
-       add     ecx,            esi
-       mov     esi,            eax
-       mov     eax,            DWORD PTR [ebp]
-       mov     DWORD PTR 12[ebp],edx
-       add     eax,            edi
-       mov     edi,            DWORD PTR 16[ebp]
-       add     edi,            ebx
-       mov     ebx,            DWORD PTR 8[ebp]
-       add     ebx,            esi
-       mov     DWORD PTR [ebp],eax
-       mov     esi,            DWORD PTR 132[esp]
-       mov     DWORD PTR 8[ebp],ebx
-       add     esi,            64
-       mov     eax,            DWORD PTR 68[esp]
-       mov     DWORD PTR 16[ebp],edi
-       cmp     esi,            eax
-       mov     DWORD PTR 4[ebp],ecx
-       jl      L000start
-       add     esp,            108
-       pop     edi
-       pop     ebx
-       pop     ebp
-       pop     esi
-       ret
-_TEXT  SEGMENT
-PUBLIC _sha1_block_asm_host_order
-
-_sha1_block_asm_host_order PROC NEAR
-       mov     ecx,            DWORD PTR 12[esp]
-       push    esi
-       shl     ecx,            6
-       mov     esi,            DWORD PTR 12[esp]
-       push    ebp
-       add     ecx,            esi
-       push    ebx
-       mov     ebp,            DWORD PTR 16[esp]
-       push    edi
-       mov     edx,            DWORD PTR 12[ebp]
-       sub     esp,            108
-       mov     edi,            DWORD PTR 16[ebp]
-       mov     ebx,            DWORD PTR 8[ebp]
-       mov     DWORD PTR 68[esp],ecx
-       ; First we need to setup the X array
-       mov     eax,            DWORD PTR [esi]
-       mov     ecx,            DWORD PTR 4[esi]
-       mov     DWORD PTR [esp],eax
-       mov     DWORD PTR 4[esp],ecx
-       mov     eax,            DWORD PTR 8[esi]
-       mov     ecx,            DWORD PTR 12[esi]
-       mov     DWORD PTR 8[esp],eax
-       mov     DWORD PTR 12[esp],ecx
-       mov     eax,            DWORD PTR 16[esi]
-       mov     ecx,            DWORD PTR 20[esi]
-       mov     DWORD PTR 16[esp],eax
-       mov     DWORD PTR 20[esp],ecx
-       mov     eax,            DWORD PTR 24[esi]
-       mov     ecx,            DWORD PTR 28[esi]
-       mov     DWORD PTR 24[esp],eax
-       mov     DWORD PTR 28[esp],ecx
-       mov     eax,            DWORD PTR 32[esi]
-       mov     ecx,            DWORD PTR 36[esi]
-       mov     DWORD PTR 32[esp],eax
-       mov     DWORD PTR 36[esp],ecx
-       mov     eax,            DWORD PTR 40[esi]
-       mov     ecx,            DWORD PTR 44[esi]
-       mov     DWORD PTR 40[esp],eax
-       mov     DWORD PTR 44[esp],ecx
-       mov     eax,            DWORD PTR 48[esi]
-       mov     ecx,            DWORD PTR 52[esi]
-       mov     DWORD PTR 48[esp],eax
-       mov     DWORD PTR 52[esp],ecx
-       mov     eax,            DWORD PTR 56[esi]
-       mov     ecx,            DWORD PTR 60[esi]
-       mov     DWORD PTR 56[esp],eax
-       mov     DWORD PTR 60[esp],ecx
-       jmp     L001shortcut
-_sha1_block_asm_host_order ENDP
-_TEXT  ENDS
-_sha1_block_asm_data_order ENDP
-_TEXT  ENDS
-END
index 48d9192..09df993 100644 (file)
@@ -392,7 +392,7 @@ sub sha1_block_data
        &X_expand("esi");
         &mov(&wparam(1),"esi");
 
-       &set_label("shortcut", 1);
+       &set_label("shortcut", 0, 1);
        &comment("");
        &comment("Start processing");
 
index 3e6f489..2f8aef8 100644 (file)
 # error "Either SHA_0 or SHA_1 must be defined."
 #endif
 
-#ifndef FLAT_INC
-#include "../md32_common.h"
-#else
 #include "md32_common.h"
-#endif
 
 #define INIT_DATA_h0 0x67452301UL
 #define INIT_DATA_h1 0xefcdab89UL
index d3336d9..0192272 100644 (file)
@@ -284,7 +284,9 @@ DECLARE_STACK_OF(X509_TRUST)
 
 /* standard trust ids */
 
-#define X509_TRUST_ANY         1
+#define X509_TRUST_DEFAULT     -1      /* Only valid in purpose settings */
+
+#define X509_TRUST_COMPAT      1
 #define X509_TRUST_SSL_CLIENT  2
 #define X509_TRUST_SSL_SERVER  3
 #define X509_TRUST_EMAIL       4
index fdedbda..848add5 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index 9f7d679..c779aaf 100644 (file)
@@ -65,7 +65,7 @@ static int tr_cmp(X509_TRUST **a, X509_TRUST **b);
 static void trtable_free(X509_TRUST *p);
 
 static int trust_1oidany(X509_TRUST *trust, X509 *x, int flags);
-static int trust_any(X509_TRUST *trust, X509 *x, int flags);
+static int trust_compat(X509_TRUST *trust, X509 *x, int flags);
 
 static int obj_trust(int id, X509 *x, int flags);
 static int (*default_trust)(int id, X509 *x, int flags) = obj_trust;
@@ -76,7 +76,7 @@ static int (*default_trust)(int id, X509 *x, int flags) = obj_trust;
  */
 
 static X509_TRUST trstandard[] = {
-{X509_TRUST_ANY, 0, trust_any, "Any", 0, NULL},
+{X509_TRUST_COMPAT, 0, trust_compat, "compatible", 0, NULL},
 {X509_TRUST_SSL_CLIENT, 0, trust_1oidany, "SSL Client", NID_client_auth, NULL},
 {X509_TRUST_SSL_SERVER, 0, trust_1oidany, "SSL Client", NID_server_auth, NULL},
 {X509_TRUST_EMAIL, 0, trust_1oidany, "S/MIME email", NID_email_protect, NULL},
@@ -107,8 +107,8 @@ int X509_check_trust(X509 *x, int id, int flags)
        X509_TRUST *pt;
        int idx;
        if(id == -1) return 1;
-       if(!(idx = X509_TRUST_get_by_id(id)))
-                       return default_trust(id, x, flags);
+       idx = X509_TRUST_get_by_id(id);
+       if(idx == -1) return default_trust(id, x, flags);
        pt = X509_TRUST_get0(idx);
        return pt->check_trust(pt, x, flags);
 }
@@ -230,6 +230,11 @@ static int trust_1oidany(X509_TRUST *trust, X509 *x, int flags)
        /* we don't have any trust settings: for compatibility
         * we return trusted if it is self signed
         */
+       return trust_compat(trust, x, flags);
+}
+
+static int trust_compat(X509_TRUST *trust, X509 *x, int flags)
+{
        X509_check_purpose(x, -1, 0);
        if(x->ex_flags & EXFLAG_SS) return X509_TRUST_TRUSTED;
        else return X509_TRUST_UNTRUSTED;
@@ -257,7 +262,3 @@ static int obj_trust(int id, X509 *x, int flags)
        return X509_TRUST_UNTRUSTED;
 }
 
-static int trust_any(X509_TRUST *trust, X509 *x, int flags)
-{
-       return X509_TRUST_TRUSTED;
-}
index 4fdff54..3ddb230 100644 (file)
@@ -436,11 +436,14 @@ static int internal_verify(X509_STORE_CTX *ctx)
                                }
                        if (X509_verify(xs,pkey) <= 0)
                                {
-                               EVP_PKEY_free(pkey);
                                ctx->error=X509_V_ERR_CERT_SIGNATURE_FAILURE;
                                ctx->current_cert=xs;
                                ok=(*cb)(0,ctx);
-                               if (!ok) goto end;
+                               if (!ok)
+                                       {
+                                       EVP_PKEY_free(pkey);
+                                       goto end;
+                                       }
                                }
                        EVP_PKEY_free(pkey);
                        pkey=NULL;
@@ -768,18 +771,25 @@ int X509_STORE_CTX_purpose_inherit(X509_STORE_CTX *ctx, int def_purpose,
        if(!purpose) purpose = def_purpose;
        /* If we have a purpose then check it is valid */
        if(purpose) {
+               X509_PURPOSE *ptmp;
                idx = X509_PURPOSE_get_by_id(purpose);
                if(idx == -1) {
                        X509err(X509_F_X509_STORE_CTX_PURPOSE_INHERIT,
                                                X509_R_UNKNOWN_PURPOSE_ID);
                        return 0;
                }
-               /* If trust not set then get from purpose default */
-               if(!trust) {
-                       X509_PURPOSE *ptmp;
+               ptmp = X509_PURPOSE_get0(idx);
+               if(ptmp->trust == X509_TRUST_DEFAULT) {
+                       idx = X509_PURPOSE_get_by_id(def_purpose);
+                       if(idx == -1) {
+                               X509err(X509_F_X509_STORE_CTX_PURPOSE_INHERIT,
+                                               X509_R_UNKNOWN_PURPOSE_ID);
+                               return 0;
+                       }
                        ptmp = X509_PURPOSE_get0(idx);
-                       trust = ptmp->trust;
                }
+               /* If trust not set then get from purpose default */
+               if(!trust) trust = ptmp->trust;
        }
        if(trust) {
                idx = X509_TRUST_get_by_id(trust);
index cf2382d..4c20e03 100644 (file)
@@ -352,7 +352,7 @@ int X509_NAME_ENTRY_set_data(X509_NAME_ENTRY *ne, int type,
        int i;
 
        if ((ne == NULL) || ((bytes == NULL) && (len != 0))) return(0);
-       if(type & MBSTRING_FLAG
+       if((type > 0) && (type & MBSTRING_FLAG)
                return ASN1_STRING_set_by_NID(&ne->value, bytes,
                                                len, type,
                                        OBJ_obj2nid(ne->object)) ? 1 : 0;
index b7494eb..5594a1d 100644 (file)
@@ -71,6 +71,7 @@ static int purpose_smime(X509 *x, int ca);
 static int check_purpose_smime_sign(X509_PURPOSE *xp, X509 *x, int ca);
 static int check_purpose_smime_encrypt(X509_PURPOSE *xp, X509 *x, int ca);
 static int check_purpose_crl_sign(X509_PURPOSE *xp, X509 *x, int ca);
+static int no_check(X509_PURPOSE *xp, X509 *x, int ca);
 
 static int xp_cmp(X509_PURPOSE **a, X509_PURPOSE **b);
 static void xptable_free(X509_PURPOSE *p);
@@ -81,7 +82,8 @@ static X509_PURPOSE xstandard[] = {
        {X509_PURPOSE_NS_SSL_SERVER, X509_TRUST_SSL_SERVER, 0, check_purpose_ns_ssl_server, "Netscape SSL server", "nssslserver", NULL},
        {X509_PURPOSE_SMIME_SIGN, X509_TRUST_EMAIL, 0, check_purpose_smime_sign, "S/MIME signing", "smimesign", NULL},
        {X509_PURPOSE_SMIME_ENCRYPT, X509_TRUST_EMAIL, 0, check_purpose_smime_encrypt, "S/MIME encryption", "smimeencrypt", NULL},
-       {X509_PURPOSE_CRL_SIGN, X509_TRUST_ANY, 0, check_purpose_crl_sign, "CRL signing", "crlsign", NULL},
+       {X509_PURPOSE_CRL_SIGN, X509_TRUST_COMPAT, 0, check_purpose_crl_sign, "CRL signing", "crlsign", NULL},
+       {X509_PURPOSE_ANY, X509_TRUST_DEFAULT, 0, no_check, "Any Purpose", "any", NULL},
 };
 
 #define X509_PURPOSE_COUNT (sizeof(xstandard)/sizeof(X509_PURPOSE))
@@ -454,3 +456,8 @@ static int check_purpose_crl_sign(X509_PURPOSE *xp, X509 *x, int ca)
        if(ku_reject(x, KU_CRL_SIGN)) return 0;
        return 1;
 }
+
+static int no_check(X509_PURPOSE *xp, X509 *x, int ca)
+{
+       return 1;
+}
index b7d4e35..aa4a605 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
index fe01755..96ceb7c 100644 (file)
@@ -179,8 +179,8 @@ union {
 } GENERAL_NAME;
 
 typedef struct ACCESS_DESCRIPTION_st {
-ASN1_OBJECT *method;
-GENERAL_NAME *location;
+       ASN1_OBJECT *method;
+       GENERAL_NAME *location;
 } ACCESS_DESCRIPTION;
 
 DECLARE_STACK_OF(GENERAL_NAME)
@@ -344,9 +344,10 @@ typedef struct x509_purpose_st {
 #define X509_PURPOSE_SMIME_SIGN                4
 #define X509_PURPOSE_SMIME_ENCRYPT     5
 #define X509_PURPOSE_CRL_SIGN          6
+#define X509_PURPOSE_ANY               7
 
 #define X509_PURPOSE_MIN               1
-#define X509_PURPOSE_MAX               6
+#define X509_PURPOSE_MAX               7
 
 DECLARE_STACK_OF(X509_PURPOSE)
 
index 83e4c0a..9d287f0 100644 (file)
@@ -102,6 +102,35 @@ the request and finally create a PKCS#12 file containing it.
  CA.pl -signreq
  CA.pl -pkcs12 "My Test Certificate"
 
+=head1 DSA CERTIFICATES
+
+Although the B<CA.pl> creates RSA CAs and requests it is still possible to
+use it with DSA certificates and requests using the L<req(1)|req(1)> command
+directly. The following example shows the steps that would typically be taken.
+
+Create some DSA parameters:
+
+ openssl dsaparam -out dsap.pem 1024
+
+Create a DSA CA certificate and private key:
+
+ openssl req -x509 -newkey dsa:dsap.pem -keyout cacert.pem -out cacert.pem
+
+Create the CA directories and files:
+
+ CA.pl -newca
+
+enter cacert.pem when prompted for the CA file name.
+
+Create a DSA certificate request and privat key (a different set of parameters
+can optionally be created first):
+
+ openssl req -out newreq.pem -newkey dsa:dsap.pem 
+
+Sign the request:
+
+ CA.pl -signreq
+
 =head1 NOTES
 
 Most of the filenames mentioned can be modified by editing the B<CA.pl> script.
index cbf2cc5..fcfd3ec 100644 (file)
@@ -6,7 +6,7 @@ dgst, md5, md2, sha1, sha, mdc2, ripemd160 - message digests
 
 =head1 SYNOPSIS
 
-[B<dgst>]
+B<openssl> B<dgst> 
 [B<-md5|-md2|-sha1|-sha|mdc2|-ripemd160>]
 [B<-c>]
 [B<-d>]
index 6b237ec..15aabf4 100644 (file)
@@ -6,18 +6,19 @@ dhparam - DH parameter manipulation and generation
 
 =head1 SYNOPSIS
 
-B<openssl dh>
+B<openssl dhparam>
 [B<-inform DER|PEM>]
 [B<-outform DER|PEM>]
-[B<-in filename>]
-[B<-out filename>]
+[B<-in> I<filename>]
+[B<-out> I<filename>]
+[B<-dsaparam>]
 [B<-noout>]
 [B<-text>]
 [B<-C>]
 [B<-2>]
 [B<-5>]
-[B<-rand file(s)>]
-[numbits]
+[B<-rand> I<file(s)>]
+[I<numbits>]
 
 =head1 DESCRIPTION
 
@@ -39,23 +40,35 @@ additional header and footer lines.
 This specifies the output format, the options have the same meaning as the 
 B<-inform> option.
 
-=item B<-in filename>
+=item B<-in> I<filename>
 
 This specifies the input filename to read parameters from or standard input if
 this option is not specified.
 
-=item B<-out filename>
+=item B<-out> I<filename>
 
 This specifies the output filename parameters to. Standard output is used
 if this option is not present. The output filename should B<not> be the same
 as the input filename.
 
+=item B<-dsaparam>
+
+If this option is used, DSA rather than DH parameters are read or created;
+they are converted to DH format.  Otherwise, "strong" primes (such
+that (p-1)/2 is also prime) will be used for DH parameter generation.
+
+DH parameter generation with the B<-dsaparam> option is much faster,
+and the recommended exponent length is shorter, which makes DH key
+exchange more efficient.  Beware that with such DSA-style DH
+parameters, a fresh DH key should be created for each use to
+avoid small-subgroup attacks that may be possible otherwise.
+
 =item B<-2>, B<-5>
 
 The generator to use, either 2 or 5. 2 is the default. If present then the
 input file is ignored and parameters are generated instead.
 
-=item B<-rand file(s)>
+=item B<-rand> I<file(s)>
 
 a file or files containing random data used to seed the random number
 generator, or an EGD socket (see L<RAND_egd(3)|RAND_egd(3)>).
@@ -63,10 +76,10 @@ Multiple files can be specified separated by a OS-dependent character.
 The separator is B<;> for MS-Windows, B<,> for OpenVSM, and B<:> for
 all others.
 
-=item B<numbits>
+=item I<numbits>
 
 this option specifies that a parameter set should be generated of size
-B<numbits>. It must be the last option. If not present then a value of 512
+I<numbits>. It must be the last option. If not present then a value of 512
 is used. If this option is present then the input file is ignored and 
 parameters are generated instead.
 
@@ -81,7 +94,7 @@ this option prints out the DH parameters in human readable form.
 =item B<-C>
 
 this option converts the parameters into C code. The parameters can then
-be loaded by calling the B<get_dhXXX()> function.
+be loaded by calling the B<get_dh>I<numbits>B<()> function.
 
 =back
 
@@ -112,4 +125,9 @@ There should be a way to generate and manipulate DH keys.
 
 L<dsaparam(1)|dsaparam(1)>
 
+=head1 HISTORY
+
+The B<dhparam> command was added in OpenSSL 0.9.5.
+The B<-dsaparam> option was added in OpenSSL 0.9.6.
+
 =cut
index a2d8784..70d35fe 100644 (file)
@@ -83,3 +83,6 @@ be much larger (typically 1024 bits).
 =head1 SEE ALSO
 
 L<gendsa(1)|gendsa(1)>
+
+=cut
+
index 9b13206..2fc61b6 100644 (file)
@@ -12,6 +12,10 @@ I<command>
 [ I<command_opts> ]
 [ I<command_args> ]
 
+B<openssl> [ B<list-standard-commands> | B<list-message-digest-commands> | B<list-cipher-commands> ]
+
+B<openssl> B<no->I<XXX> [ I<arbitrary options> ]
+
 =head1 DESCRIPTION
 
 OpenSSL is a cryptography toolkit implementing the Secure Sockets Layer (SSL
@@ -35,6 +39,22 @@ The B<openssl> program provides a rich variety of commands (I<command> in the
 SYNOPSIS above), each of which often has a wealth of options and arguments
 (I<command_opts> and I<command_args> in the SYNOPSIS).
 
+The pseudo-commands B<list-standard-commands>, B<list-message-digest-commands>,
+and B<list-cipher-commands> output a list (one entry per line) of the names
+of all standard commands, message digest commands, or cipher commands,
+respectively, that are available in the present B<openssl> utility.
+
+The pseudo-command B<no->I<XXX> tests whether a command of the
+specified name is available.  If no command named I<XXX> exists, it
+returns 0 (success) and prints B<no->I<XXX>; otherwise it returns 1
+and prints I<XXX>.  In both cases, the output goes to B<stdout> and
+nothing is printed to B<stderr>.  Additional command line arguments
+are always ignored.  Since for each cipher there is a command of the
+same name, this provides an easy way for shell scripts to test for the
+availability of ciphers in the B<openssl> program.  (B<no->I<XXX> is
+not able to detect pseudo-commands such as B<quit>,
+B<list->I<...>B<-commands>, or B<no->I<XXX> itself.)
+
 =head2 STANDARD COMMANDS
 
 =over 10
@@ -103,6 +123,10 @@ Generation of hashed passwords.
 
 PKCS#7 Data Management.
 
+=item L<B<rand>|rand(1)>
+
+Generate pseudo-random bytes.
+
 =item L<B<req>|req(1)>
 
 X.509 Certificate Signing Request (CSR) Management.
@@ -285,14 +309,17 @@ L<enc(1)|enc(1)>, L<gendsa(1)|gendsa(1)>,
 L<genrsa(1)|genrsa(1)>, L<nseq(1)|nseq(1)>, L<openssl(1)|openssl(1)>,
 L<passwd(1)|passwd(1)>,
 L<pkcs12(1)|pkcs12(1)>, L<pkcs7(1)|pkcs7(1)>, L<pkcs8(1)|pkcs8(1)>,
-L<req(1)|req(1)>, L<rsa(1)|rsa(1)>, L<s_client(1)|s_client(1)>,
+L<rand(1)|rand(1)>, L<req(1)|req(1)>, L<rsa(1)|rsa(1)>, L<s_client(1)|s_client(1)>,
 L<s_server(1)|s_server(1)>, L<smime(1)|smime(1)>, L<spkac(1)|spkac(1)>,
 L<verify(1)|verify(1)>, L<version(1)|version(1)>, L<x509(1)|x509(1)>,
 L<crypto(3)|crypto(3)>, L<ssl(3)|ssl(3)> 
 
 =head1 HISTORY
 
-The openssl(1) document appeared in OpenSSL 0.9.2
+The openssl(1) document appeared in OpenSSL 0.9.2.
+The B<list->I<XXX>B<-commands> pseudo-commands were added in OpenSSL 0.9.3;
+the B<no->I<XXX> pseudo-commands were added in OpenSSL 0.9.5a.
+For notes on the availability of other commands, see their individual
+manual pages.
 
 =cut
-
diff --git a/lib/libssl/src/doc/apps/rand.pod b/lib/libssl/src/doc/apps/rand.pod
new file mode 100644 (file)
index 0000000..f81eab0
--- /dev/null
@@ -0,0 +1,50 @@
+=pod
+
+=head1 NAME
+
+rand - generate pseudo-random bytes
+
+=head1 SYNOPSIS
+
+B<openssl rand>
+[B<-out> I<file>]
+[B<-rand> I<file(s)>]
+[B<-base64>]
+I<num>
+
+=head1 DESCRIPTION
+
+The B<rand> command outputs I<num> pseudo-random bytes after seeding
+the random number generater once.  As in other B<openssl> command
+line tools, PRNG seeding uses the file I<$HOME/>B<.rnd> or B<.rnd>
+in addition to the files given in the B<-rand> option.  A new
+I<$HOME>/B<.rnd> or B<.rnd> file will be written back if enough
+seeding was obtained from these sources.
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<-out> I<file>
+
+Write to I<file> instead of standard output.
+
+=item B<-rand> I<file(s)>
+
+Use specified file or files or EGD socket (see L<RAND_egd(3)|RAND_egd(3)>)
+for seeding the random number generator.
+Multiple files can be specified separated by a OS-dependent character.
+The separator is B<;> for MS-Windows, B<,> for OpenVSM, and B<:> for
+all others.
+
+=item B<-base64>
+
+Perform base64 encoding on the output.
+
+=back
+
+=head1 SEE ALSO
+
+L<RAND_bytes(3)|RAND_bytes(3)>
+
+=cut
index 3ede134..2f80375 100644 (file)
@@ -22,6 +22,7 @@ B<openssl> B<s_client>
 [B<-state>]
 [B<-nbio>]
 [B<-crlf>]
+[B<-ign_eof>]
 [B<-quiet>]
 [B<-ssl2>]
 [B<-ssl3>]
@@ -122,9 +123,15 @@ turns on non-blocking I/O
 this option translated a line feed from the terminal into CR+LF as required
 by some servers.
 
+=item B<-ign_eof>
+
+inhibit shutting down the connection when end of file is reached in the
+input.
+
 =item B<-quiet>
 
-inhibit printing of session and certificate information.
+inhibit printing of session and certificate information.  This implicitely
+turns on B<-ign_eof> as well.
 
 =item B<-ssl2>, B<-ssl3>, B<-tls1>, B<-no_ssl2>, B<-no_ssl3>, B<-no_tls1>
 
@@ -155,9 +162,10 @@ command for more information.
 
 If a connection is established with an SSL server then any data received
 from the server is displayed and any key presses will be sent to the
-server. If the line begins with an B<R> then the session will be
-renegotiated. If the line begins with a B<Q> the connection will be closed
-down.
+server. When used interactively (which means neither B<-quiet> nor B<-ign_eof>
+have been given), the session will be renegociated if the line begins with an
+B<R>, and if the line begins with a B<Q> or if end of file is reached, the
+connection will be closed down.
 
 =head1 NOTES
 
index b127182..e4ae546 100644 (file)
@@ -212,9 +212,10 @@ clears all the prohibited or rejected uses of the certificate.
 
 =item B<-addtrust arg>
 
-adds a trusted certificate use. Currently acceptable values
-are B<all> (any purpose), B<sslclient> (SSL client use), B<sslserver>
-(SSL server use) B<email> (S/MIME email) and B<objsign> (Object signing).
+adds a trusted certificate use. Any object name can be used here
+but currently only B<clientAuth> (SSL client use), B<serverAuth>
+(SSL server use) and B<emailProtection> (S/MIME email) are used.
+Other OpenSSL applications may define additional uses.
 
 =item B<-addreject arg>
 
index dca41d8..a8f75bd 100644 (file)
@@ -56,7 +56,7 @@ the default method is used.
      /* compute shared secret */
         int (*compute_key)(unsigned char *key, BIGNUM *pub_key, DH *dh);
 
-     /* compute r = a ^ p mod m. May be NULL */
+     /* compute r = a ^ p mod m (May be NULL for some implementations) */
         int (*bn_mod_exp)(DH *dh, BIGNUM *r, BIGNUM *a, const BIGNUM *p,
                                 const BIGNUM *m, BN_CTX *ctx,
                                 BN_MONT_CTX *m_ctx);
index 0b13ec9..edec464 100644 (file)
@@ -62,12 +62,13 @@ struct
        int (*dsa_do_verify)(const unsigned char *dgst, int dgst_len,
                                  DSA_SIG *sig, DSA *dsa);
 
-     /* compute rr = a1^p1 * a2^p2 mod m. May be NULL */
+     /* compute rr = a1^p1 * a2^p2 mod m (May be NULL for some
+                                          implementations) */
        int (*dsa_mod_exp)(DSA *dsa, BIGNUM *rr, BIGNUM *a1, BIGNUM *p1,
                                  BIGNUM *a2, BIGNUM *p2, BIGNUM *m,
                                  BN_CTX *ctx, BN_MONT_CTX *in_mont);
 
-     /* compute r = a ^ p mod m. May be NULL */
+     /* compute r = a ^ p mod m (May be NULL for some implementations) */
         int (*bn_mod_exp)(DSA *dsa, BIGNUM *r, BIGNUM *a,
                                  const BIGNUM *p, const BIGNUM *m,
                                  BN_CTX *ctx, BN_MONT_CTX *m_ctx);
diff --git a/lib/libssl/src/doc/crypto/EVP_OpenInit.pod b/lib/libssl/src/doc/crypto/EVP_OpenInit.pod
new file mode 100644 (file)
index 0000000..9707a4b
--- /dev/null
@@ -0,0 +1,51 @@
+=pod
+
+=head1 NAME
+
+EVP_OpenInit, EVP_OpenUpdate, EVP_OpenFinal - EVP envelope decryption
+
+=head1 SYNOPSIS
+
+ #include <openssl/evp.h>
+
+ int EVP_OpenInit(EVP_CIPHER_CTX *ctx,EVP_CIPHER *type,unsigned char *ek,
+               int ekl,unsigned char *iv,EVP_PKEY *priv);
+ void EVP_OpenUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out,
+         int *outl, unsigned char *in, int inl);
+ void EVP_OpenFinal(EVP_CIPHER_CTX *ctx, unsigned char *out,
+         int *outl);
+
+=head1 DESCRIPTION
+
+The EVP envelope routines are a high level interface to envelope
+decryption. They decrypt a public key encrypted symmetric key and
+then decrypt data using it.
+
+EVP_OpenInit() initialises a cipher context B<ctx> for decryption
+with cipher B<type>. It decrypts the encrypted symmetric key of length
+B<ekl> bytes passed in the B<ek> parameter using the private key B<priv>.
+The IV is supplied in the B<iv> parameter.
+
+EVP_OpenUpdate() and EVP_OpenFinal() have exactly the same properties
+as the EVP_DecryptUpdate() and EVP_DecryptFinal() routines, as 
+documented on the L<EVP_EncryptInit(3)|EVP_EncryptInit(3)> manual
+page. 
+
+=head1 RETURN VALUES
+
+EVP_OpenInit() returns -1 on error or an non zero integer (actually the
+recovered secret key size) if successful.
+
+EVP_SealUpdate() does not return a value.
+
+EVP_SealFinal() returns 0 if the decrypt failed or 1 for success.
+
+=head1 SEE ALSO
+
+L<evp(3)|evp(3)>,L<rand(3)|rand(3)>
+L<EVP_EncryptInit(3)|EVP_EncryptInit(3)>,
+L<EVP_SealInit(3)|EVP_SealInit(3)>
+
+=head1 HISTORY
+
+=cut
diff --git a/lib/libssl/src/doc/crypto/EVP_SealInit.pod b/lib/libssl/src/doc/crypto/EVP_SealInit.pod
new file mode 100644 (file)
index 0000000..1579d11
--- /dev/null
@@ -0,0 +1,70 @@
+=pod
+
+=head1 NAME
+
+EVP_SealInit, EVP_SealUpdate, EVP_SealFinal - EVP envelope encryption
+
+=head1 SYNOPSIS
+
+ #include <openssl/evp.h>
+
+ int EVP_SealInit(EVP_CIPHER_CTX *ctx, EVP_CIPHER *type, unsigned char **ek,
+               int *ekl, unsigned char *iv,EVP_PKEY **pubk, int npubk);
+ void EVP_SealUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out,
+         int *outl, unsigned char *in, int inl);
+ void EVP_SealFinal(EVP_CIPHER_CTX *ctx, unsigned char *out,
+         int *outl);
+
+=head1 DESCRIPTION
+
+The EVP envelope routines are a high level interface to envelope
+encryption. They generate a random key and then "envelope" it by
+using public key encryption. Data can then be encrypted using this
+key.
+
+EVP_SealInit() initialises a cipher context B<ctx> for encryption
+with cipher B<type> using a random secret key and IV supplied in
+the B<iv> parameter. B<type> is normally supplied by a function such
+as EVP_des_cbc(). The secret key is encrypted using one or more public
+keys, this allows the same encrypted data to be decrypted using any
+of the corresponding private keys. B<ek> is an array of buffers where
+the public key encrypted secret key will be written, each buffer must
+contain enough room for the corresponding encrypted key: that is
+B<ek[i]> must have room for B<EVP_PKEY_size(pubk[i])> bytes. The actual
+size of each encrypted secret key is written to the array B<ekl>. B<pubk> is
+an array of B<npubk> public keys.
+
+EVP_SealUpdate() and EVP_SealFinal() have exactly the same properties
+as the EVP_EncryptUpdate() and EVP_EncryptFinal() routines, as 
+documented on the L<EVP_EncryptInit(3)|EVP_EncryptInit(3)> manual
+page. 
+
+=head1 RETURN VALUES
+
+EVP_SealInit() returns -1 on error or B<npubk> if successful.
+
+EVP_SealUpdate() and EVP_SealFinal() do not return values.
+
+=head1 NOTES
+
+Because a random secret key is generated the random number generator
+must be seeded before calling EVP_SealInit().
+
+The public key must be RSA because it is the only OpenSSL public key
+algorithm that supports key transport.
+
+Envelope encryption is the usual method of using public key encryption
+on large amounts of data, this is because public key encryption is slow
+but symmetric encryption is fast. So symmetric encryption is used for
+bulk encryption and the small random symmetric key used is transferred
+using public key encryption.
+
+=head1 SEE ALSO
+
+L<evp(3)|evp(3)>,L<rand(3)|rand(3)>
+L<EVP_EncryptInit(3)|EVP_EncryptInit(3)>,
+L<EVP_OpenInit(3)|EVP_OpenInit(3)>
+
+=head1 HISTORY
+
+=cut
diff --git a/lib/libssl/src/doc/crypto/EVP_SignInit.pod b/lib/libssl/src/doc/crypto/EVP_SignInit.pod
new file mode 100644 (file)
index 0000000..bbc9203
--- /dev/null
@@ -0,0 +1,85 @@
+=pod
+
+=head1 NAME
+
+EVP_SignInit, EVP_SignUpdate, EVP_SignFinal - EVP signing functions
+
+=head1 SYNOPSIS
+
+ #include <openssl/evp.h>
+
+ void EVP_SignInit(EVP_MD_CTX *ctx, const EVP_MD *type);
+ void EVP_SignUpdate(EVP_MD_CTX *ctx, const void *d, unsigned int cnt);
+ int EVP_SignFinal(EVP_MD_CTX *ctx,unsigned char *sig,unsigned int *s, EVP_PKEY *pkey);
+
+ int EVP_PKEY_size(EVP_PKEY *pkey);
+
+=head1 DESCRIPTION
+
+The EVP signature routines are a high level interface to digital
+signatures.
+
+EVP_SignInit() initialises a signing context B<ctx> to using digest
+B<type>: this will typically be supplied by a function such as
+EVP_sha1().
+
+EVP_SignUpdate() hashes B<cnt> bytes of data at B<d> into the
+signature context B<ctx>. This funtion can be called several times on the
+same B<ctx> to include additional data.
+
+EVP_SignFinal() signs the data in B<ctx> using the private key B<pkey>
+and places the signature in B<sig>. If the B<s> parameter is not NULL
+then the number of bytes of data written (i.e. the length of the signature)
+will be written to the integer at B<s>, at most EVP_PKEY_size(pkey) bytes
+will be written.  After calling EVP_SignFinal() no additional calls to
+EVP_SignUpdate() can be made, but EVP_SignInit() can be called to initialiase
+a new signature operation.
+
+EVP_PKEY_size() returns the maximum size of a signature in bytes. The actual
+signature returned by EVP_SignFinal() may be smaller.
+
+=head1 RETURN VALUES
+
+EVP_SignInit() and EVP_SignUpdate() do not return values.
+
+EVP_SignFinal() returns 1 for success and 0 for failure.
+
+EVP_PKEY_size() returns the maximum size of a signature in bytes.
+
+The error codes can be obtained by L<ERR_get_error(3)|ERR_get_error(3)>.
+
+=head1 NOTES
+
+The B<EVP> interface to digital signatures should almost always be used in
+preference to the low level interfaces. This is because the code then becomes
+transparent to the algorithm used and much more flexible.
+
+Due to the link between message digests and public key algorithms the correct
+digest algorithm must be used with the correct public key type. A list of
+algorithms and associated public key algorithms appears in 
+L<EVP_DigestInit(3)|EVP_DigestInit(3)>.
+
+When signing with DSA private keys the random number generator must be seeded
+or the operation will fail. The random number generator does not need to be
+seeded for RSA signatures.
+
+=head1 BUGS
+
+Several of the functions do not return values: maybe they should. Although the
+internal digest operations will never fail some future hardware based operations
+might.
+
+=head1 SEE ALSO
+
+L<EVP_VerifyInit(3)|EVP_VerifyInit(3)>,
+L<EVP_DigestInit(3)|EVP_DigestInit(3)>, L<err(3)|err(3)>,
+L<evp(3)|evp(3)>, L<hmac(3)|hmac(3)>, L<md2(3)|md2(3)>,
+L<md5(3)|md5(3)>, L<mdc2(3)|mdc2(3)>, L<ripemd(3)|ripemd(3)>,
+L<sha(3)|sha(3)>, L<digest(1)|digest(1)>
+
+=head1 HISTORY
+
+EVP_SignInit(), EVP_SignUpdate() and EVP_SignFinal() are
+available in all versions of SSLeay and OpenSSL.
+
+=cut
diff --git a/lib/libssl/src/doc/crypto/EVP_VerifyInit.pod b/lib/libssl/src/doc/crypto/EVP_VerifyInit.pod
new file mode 100644 (file)
index 0000000..3b5e07f
--- /dev/null
@@ -0,0 +1,71 @@
+=pod
+
+=head1 NAME
+
+EVP_VerifyInit, EVP_VerifyUpdate, EVP_VerifyFinal - EVP signature verification functions
+
+=head1 SYNOPSIS
+
+ #include <openssl/evp.h>
+
+ void EVP_VerifyInit(EVP_MD_CTX *ctx, const EVP_MD *type);
+ void EVP_VerifyUpdate(EVP_MD_CTX *ctx, const void *d, unsigned int cnt);
+ int EVP_VerifyFinal(EVP_MD_CTX *ctx,unsigned char *sigbuf, unsigned int siglen,EVP_PKEY *pkey);
+
+=head1 DESCRIPTION
+
+The EVP signature verification routines are a high level interface to digital
+signatures.
+
+EVP_VerifyInit() initialises a verification context B<ctx> to using digest
+B<type>: this will typically be supplied by a function such as EVP_sha1().
+
+EVP_VerifyUpdate() hashes B<cnt> bytes of data at B<d> into the
+verification context B<ctx>. This funtion can be called several times on the
+same B<ctx> to include additional data.
+
+EVP_VerifyFinal() verifies the data in B<ctx> using the public key B<pkey>
+and against the B<siglen> bytes at B<sigbuf>. After calling EVP_VerifyFinal()
+no additional calls to EVP_VerifyUpdate() can be made, but EVP_VerifyInit()
+can be called to initialiase a new verification operation.
+
+=head1 RETURN VALUES
+
+EVP_VerifyInit() and EVP_VerifyUpdate() do not return values.
+
+EVP_VerifyFinal() returns 1 for a correct signature, 0 for failure and -1 if some
+other error occurred.
+
+The error codes can be obtained by L<ERR_get_error(3)|ERR_get_error(3)>.
+
+=head1 NOTES
+
+The B<EVP> interface to digital signatures should almost always be used in
+preference to the low level interfaces. This is because the code then becomes
+transparent to the algorithm used and much more flexible.
+
+Due to the link between message digests and public key algorithms the correct
+digest algorithm must be used with the correct public key type. A list of
+algorithms and associated public key algorithms appears in 
+L<EVP_DigestInit(3)|EVP_DigestInit(3)>.
+
+=head1 BUGS
+
+Several of the functions do not return values: maybe they should. Although the
+internal digest operations will never fail some future hardware based operations
+might.
+
+=head1 SEE ALSO
+
+L<EVP_SignInit(3)|EVP_SignInit(3)>,
+L<EVP_DigestInit(3)|EVP_DigestInit(3)>, L<err(3)|err(3)>,
+L<evp(3)|evp(3)>, L<hmac(3)|hmac(3)>, L<md2(3)|md2(3)>,
+L<md5(3)|md5(3)>, L<mdc2(3)|mdc2(3)>, L<ripemd(3)|ripemd(3)>,
+L<sha(3)|sha(3)>, L<digest(1)|digest(1)>
+
+=head1 HISTORY
+
+EVP_VerifyInit(), EVP_VerifyUpdate() and EVP_VerifyFinal() are
+available in all versions of SSLeay and OpenSSL.
+
+=cut
index 0a13ec2..67c66f3 100644 (file)
@@ -2,7 +2,8 @@
 
 =head1 NAME
 
-RAND_add, RAND_seed, RAND_screen - add entropy to the PRNG
+RAND_add, RAND_seed, RAND_status, RAND_event, RAND_screen - add
+entropy to the PRNG
 
 =head1 SYNOPSIS
 
@@ -14,6 +15,7 @@ RAND_add, RAND_seed, RAND_screen - add entropy to the PRNG
 
  int  RAND_status(void);
 
+ int  RAND_event(UINT iMsg, WPARAM wParam, LPARAM lParam);
  void RAND_screen(void);
 
 =head1 DESCRIPTION
@@ -40,17 +42,24 @@ or L<RAND_load_file(3)|RAND_load_file(3)>.
 
 RAND_seed() is equivalent to RAND_add() when B<num == entropy>.
 
+RAND_event() collects the entropy from Windows events such as mouse
+movements and other user interaction. It should be called with the
+B<iMsg>, B<wParam> and B<lParam> arguments of I<all> messages sent to
+the window procedure. It will estimate the entropy contained in the
+event message (if any), and add it to the PRNG. The program can then
+process the messages as usual.
+
 The RAND_screen() function is available for the convenience of Windows
 programmers. It adds the current contents of the screen to the PRNG.
-For applications that can catch Windows events, seeding the PRNG with
-the parameters of B<WM_MOUSEMOVE> events is a significantly better
-source of randomness. It should be noted that both methods cannot be
-used on servers that run without user interaction.
+For applications that can catch Windows events, seeding the PRNG by
+calling RAND_event() is a significantly better source of
+randomness. It should be noted that both methods cannot be used on
+servers that run without user interaction.
 
 =head1 RETURN VALUES
 
-RAND_status() returns 1 if the PRNG has been seeded with enough data,
-0 otherwise.
+RAND_status() and RAND_event() return 1 if the PRNG has been seeded
+with enough data, 0 otherwise.
 
 The other functions do not return values.
 
@@ -63,6 +72,6 @@ L<RAND_load_file(3)|RAND_load_file(3)>, L<RAND_cleanup(3)|RAND_cleanup(3)>
 
 RAND_seed() and RAND_screen() are available in all versions of SSLeay
 and OpenSSL. RAND_add() and RAND_status() have been added in OpenSSL
-0.9.5.
+0.9.5, RAND_event() in OpenSSL 0.9.5a.
 
 =cut
index 466e9b8..464eba4 100644 (file)
@@ -34,10 +34,12 @@ RAND_get_rand_method() returns a pointer to the current method.
         void (*cleanup)(void);
         void (*add)(const void *buf, int num, int entropy);
         int (*pseudorand)(unsigned char *buf, int num);
+       int (*status)(void);
  } RAND_METHOD;
 
 The components point to the implementation of RAND_seed(),
-RAND_bytes(), RAND_cleanup(), RAND_add() and RAND_pseudo_rand().
+RAND_bytes(), RAND_cleanup(), RAND_add(), RAND_pseudo_rand()
+and RAND_status().
 Each component may be NULL if the function is not implemented.
 
 =head1 RETURN VALUES
index deb1183..14b0b4c 100644 (file)
@@ -87,10 +87,11 @@ the default method is used.
        int (*rsa_priv_dec)(int flen, unsigned char *from,
           unsigned char *to, RSA *rsa, int padding);
 
-     /* compute r0 = r0 ^ I mod rsa->n. May be NULL */
+     /* compute r0 = r0 ^ I mod rsa->n (May be NULL for some
+                                        implementations) */
        int (*rsa_mod_exp)(BIGNUM *r0, BIGNUM *I, RSA *rsa);
 
-     /* compute r = a ^ p mod m. May be NULL */
+     /* compute r = a ^ p mod m (May be NULL for some implementations) */
        int (*bn_mod_exp)(BIGNUM *r, BIGNUM *a, const BIGNUM *p,
           const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx);
 
index e8c7114..e0b7774 100644 (file)
@@ -57,28 +57,31 @@ everything after the first 64 bits is ignored.
 
 The mode functions BF_cbc_encrypt(), BF_cfb64_encrypt() and BF_ofb64_encrypt()
 all operate on variable length data.  They all take an initialisation vector
-B<ivec> which must be initially filled with zeros, but then just need to be
-passed along into the next call of the same function for the same message. 
+B<ivec> which needs to be passed along into the next call of the same function 
+for the same message.  B<ivec> may be initialised with anything, but the
+recipient needs to know what it was initialised with, or it won't be able
+to decrypt.  Some programs and protocols simplify this, like SSH, where
+B<ivec> is simply initialised to zero.
 BF_cbc_encrypt() operates of data that is a multiple of 8 bytes long, while
 BF_cfb64_encrypt() and BF_ofb64_encrypt() are used to encrypt an variable
 number of bytes (the amount does not have to be an exact multiple of 8).  The
 purpose of the latter two is to simulate stream ciphers, and therefore, they
 need the parameter B<num>, which is a pointer to an integer where the current
 offset in B<ivec> is stored between calls.  This integer must be initialised
-to zero when B<ivec> is filled with zeros.
+to zero when B<ivec> is initialised.
 
 BF_cbc_encrypt() is the Cipher Block Chaining function for Blowfish.  It
 encrypts or decrypts the 64 bits chunks of B<in> using the key B<schedule>,
 putting the result in B<out>.  B<enc> decides if encryption (BF_ENCRYPT) or
 decryption (BF_DECRYPT) shall be performed.  B<ivec> must point at an 8 byte
-long initialisation vector, which must be initially filled with zeros.
+long initialisation vector.
 
 BF_cfb64_encrypt() is the CFB mode for Blowfish with 64 bit feedback.
 It encrypts or decrypts the bytes in B<in> using the key B<schedule>,
 putting the result in B<out>.  B<enc> decides if encryption (B<BF_ENCRYPT>)
 or decryption (B<BF_DECRYPT>) shall be performed.  B<ivec> must point at an
-8 byte long initialisation vector, which must be initially filled with zeros.
-B<num> must point at an integer which must be initially zero.
+8 byte long initialisation vector. B<num> must point at an integer which must
+be initially zero.
 
 BF_ofb64_encrypt() is the OFB mode for Blowfish with 64 bit feedback.
 It uses the same parameters as BF_cfb64_encrypt(), which must be initialised
diff --git a/lib/libssl/src/doc/crypto/des.pod b/lib/libssl/src/doc/crypto/des.pod
new file mode 100644 (file)
index 0000000..c553210
--- /dev/null
@@ -0,0 +1,376 @@
+=pod
+
+=head1 NAME
+
+des_random_key, des_set_key, des_key_sched, des_set_key_checked,
+des_set_key_unchecked, des_set_odd_parity, des_is_weak_key,
+des_ecb_encrypt, des_ecb2_encrypt, des_ecb3_encrypt, des_ncbc_encrypt,
+des_cfb_encrypt, des_ofb_encrypt, des_pcbc_encrypt, des_cfb64_encrypt,
+des_ofb64_encrypt, des_xcbc_encrypt, des_ede2_cbc_encrypt,
+des_ede2_cfb64_encrypt, des_ede2_ofb64_encrypt, des_ede3_cbc_encrypt,
+des_ede3_cbcm_encrypt, des_ede3_cfb64_encrypt, des_ede3_ofb64_encrypt,
+des_read_password, des_read_2passwords, des_read_pw_string,
+des_cbc_cksum, des_quad_cksum, des_string_to_key, des_string_to_2keys,
+des_fcrypt, des_crypt, des_enc_read, des_enc_write - DES encryption
+
+=head1 SYNOPSIS
+
+ #include <openssl/des.h>
+
+ void des_random_key(des_cblock *ret);
+
+ int des_set_key(const_des_cblock *key, des_key_schedule schedule);
+ int des_key_sched(const_des_cblock *key, des_key_schedule schedule);
+ int des_set_key_checked(const_des_cblock *key,
+        des_key_schedule schedule);
+ void des_set_key_unchecked(const_des_cblock *key,
+        des_key_schedule schedule);
+
+ void des_set_odd_parity(des_cblock *key);
+ int des_is_weak_key(const_des_cblock *key);
+
+ void des_ecb_encrypt(const_des_cblock *input, des_cblock *output, 
+        des_key_schedule ks, int enc);
+ void des_ecb2_encrypt(const_des_cblock *input, des_cblock *output, 
+        des_key_schedule ks1, des_key_schedule ks2, int enc);
+ void des_ecb3_encrypt(const_des_cblock *input, des_cblock *output, 
+        des_key_schedule ks1, des_key_schedule ks2, 
+        des_key_schedule ks3, int enc);
+
+ void des_ncbc_encrypt(const unsigned char *input, unsigned char *output, 
+        long length, des_key_schedule schedule, des_cblock *ivec, 
+        int enc);
+ void des_cfb_encrypt(const unsigned char *in, unsigned char *out,
+        int numbits, long length, des_key_schedule schedule,
+        des_cblock *ivec, int enc);
+ void des_ofb_encrypt(const unsigned char *in, unsigned char *out,
+        int numbits, long length, des_key_schedule schedule,
+        des_cblock *ivec);
+ void des_pcbc_encrypt(const unsigned char *input, unsigned char *output, 
+        long length, des_key_schedule schedule, des_cblock *ivec, 
+        int enc);
+ void des_cfb64_encrypt(const unsigned char *in, unsigned char *out,
+        long length, des_key_schedule schedule, des_cblock *ivec,
+        int *num, int enc);
+ void des_ofb64_encrypt(const unsigned char *in, unsigned char *out,
+        long length, des_key_schedule schedule, des_cblock *ivec,
+        int *num);
+
+ void des_xcbc_encrypt(const unsigned char *input, unsigned char *output, 
+        long length, des_key_schedule schedule, des_cblock *ivec, 
+        const_des_cblock *inw, const_des_cblock *outw, int enc);
+
+ void des_ede2_cbc_encrypt(const unsigned char *input,
+        unsigned char *output, long length, des_key_schedule ks1,
+        des_key_schedule ks2, des_cblock *ivec, int enc);
+ void des_ede2_cfb64_encrypt(const unsigned char *in,
+        unsigned char *out, long length, des_key_schedule ks1,
+        des_key_schedule ks2, des_cblock *ivec, int *num, int enc);
+ void des_ede2_ofb64_encrypt(const unsigned char *in,
+        unsigned char *out, long length, des_key_schedule ks1,
+        des_key_schedule ks2, des_cblock *ivec, int *num);
+
+ void des_ede3_cbc_encrypt(const unsigned char *input,
+        unsigned char *output, long length, des_key_schedule ks1,
+        des_key_schedule ks2, des_key_schedule ks3, des_cblock *ivec,
+        int enc);
+ void des_ede3_cbcm_encrypt(const unsigned char *in, unsigned char *out, 
+        long length, des_key_schedule ks1, des_key_schedule ks2, 
+        des_key_schedule ks3, des_cblock *ivec1, des_cblock *ivec2, 
+        int enc);
+ void des_ede3_cfb64_encrypt(const unsigned char *in, unsigned char *out, 
+        long length, des_key_schedule ks1, des_key_schedule ks2,
+        des_key_schedule ks3, des_cblock *ivec, int *num, int enc);
+ void des_ede3_ofb64_encrypt(const unsigned char *in, unsigned char *out, 
+        long length, des_key_schedule ks1, 
+        des_key_schedule ks2, des_key_schedule ks3, 
+        des_cblock *ivec, int *num);
+
+ int des_read_password(des_cblock *key, const char *prompt, int verify);
+ int des_read_2passwords(des_cblock *key1, des_cblock *key2, 
+        const char *prompt, int verify);
+ int des_read_pw_string(char *buf, int length, const char *prompt,
+        int verify);
+
+ DES_LONG des_cbc_cksum(const unsigned char *input, des_cblock *output, 
+        long length, des_key_schedule schedule, 
+        const_des_cblock *ivec);
+ DES_LONG des_quad_cksum(const unsigned char *input, des_cblock output[], 
+        long length, int out_count, des_cblock *seed);
+ void des_string_to_key(const char *str, des_cblock *key);
+ void des_string_to_2keys(const char *str, des_cblock *key1,
+        des_cblock *key2);
+
+ char *des_fcrypt(const char *buf, const char *salt, char *ret);
+ char *des_crypt(const char *buf, const char *salt);
+ char *crypt(const char *buf, const char *salt);
+
+ int des_enc_read(int fd, void *buf, int len, des_key_schedule sched,
+        des_cblock *iv);
+ int des_enc_write(int fd, const void *buf, int len,
+        des_key_schedule sched, des_cblock *iv);
+
+=head1 DESCRIPTION
+
+This library contains a fast implementation of the DES encryption
+algorithm.
+
+There are two phases to the use of DES encryption.  The first is the
+generation of a I<des_key_schedule> from a key, the second is the
+actual encryption.  A DES key is of type I<des_cblock>. This type is
+consists of 8 bytes with odd parity.  The least significant bit in
+each byte is the parity bit.  The key schedule is an expanded form of
+the key; it is used to speed the encryption process.
+
+des_random_key() generates a random key.  The PRNG must be seeded
+prior to using this function (see L<rand(3)|rand(3)>; for backward
+compatibility the function des_random_seed() is available as well).
+If the PRNG could not generate a secure key, 0 is returned.  In
+earlier versions of the library, des_random_key() did not generate
+secure keys.
+
+Before a DES key can be used, it must be converted into the
+architecture dependant I<des_key_schedule> via the
+des_set_key_checked() or des_set_key_unchecked() function.
+
+des_set_key_checked() will check that the key passed is of odd parity
+and is not a week or semi-weak key.  If the parity is wrong, then -1
+is returned.  If the key is a weak key, then -2 is returned.  If an
+error is returned, the key schedule is not generated.
+
+des_set_key() (called des_key_sched() in the MIT library) works like
+des_set_key_checked() if the I<des_check_key> flag is non-zero,
+otherwise like des_set_key_unchecked().  These functions are available
+for compatibility; it is recommended to use a function that does not
+depend on a global variable.
+
+des_set_odd_parity() (called des_fixup_key_parity() in the MIT
+library) sets the parity of the passed I<key> to odd.
+
+des_is_weak_key() returns 1 is the passed key is a weak key, 0 if it
+is ok.  The probability that a randomly generated key is weak is
+1/2^52, so it is not really worth checking for them.
+
+The following routines mostly operate on an input and output stream of
+I<des_cblock>s.
+
+des_ecb_encrypt() is the basic DES encryption routine that encrypts or
+decrypts a single 8-byte I<des_cblock> in I<electronic code book>
+(ECB) mode.  It always transforms the input data, pointed to by
+I<input>, into the output data, pointed to by the I<output> argument.
+If the I<encrypt> argument is non-zero (DES_ENCRYPT), the I<input>
+(cleartext) is encrypted in to the I<output> (ciphertext) using the
+key_schedule specified by the I<schedule> argument, previously set via
+I<des_set_key>. If I<encrypt> is zero (DES_DECRYPT), the I<input> (now
+ciphertext) is decrypted into the I<output> (now cleartext).  Input
+and output may overlap.  des_ecb_encrypt() does not return a value.
+
+des_ecb3_encrypt() encrypts/decrypts the I<input> block by using
+three-key Triple-DES encryption in ECB mode.  This involves encrypting
+the input with I<ks1>, decrypting with the key schedule I<ks2>, and
+then encrypting with I<ks3>.  This routine greatly reduces the chances
+of brute force breaking of DES and has the advantage of if I<ks1>,
+I<ks2> and I<ks3> are the same, it is equivalent to just encryption
+using ECB mode and I<ks1> as the key.
+
+The macro des_ecb2_encrypt() is provided to perform two-key Triple-DES
+encryption by using I<ks1> for the final encryption.
+
+des_ncbc_encrypt() encrypts/decrypts using the I<cipher-block-chaining>
+(CBC) mode of DES.  If the I<encrypt> argument is non-zero, the
+routine cipher-block-chain encrypts the cleartext data pointed to by
+the I<input> argument into the ciphertext pointed to by the I<output>
+argument, using the key schedule provided by the I<schedule> argument,
+and initialization vector provided by the I<ivec> argument.  If the
+I<length> argument is not an integral multiple of eight bytes, the
+last block is copied to a temporary area and zero filled.  The output
+is always an integral multiple of eight bytes.
+
+des_xcbc_encrypt() is RSA's DESX mode of DES.  It uses I<inw> and
+I<outw> to 'whiten' the encryption.  I<inw> and I<outw> are secret
+(unlike the iv) and are as such, part of the key.  So the key is sort
+of 24 bytes.  This is much better than CBC DES.
+
+des_ede3_cbc_encrypt() implements outer triple CBC DES encryption with
+three keys. This means that each DES operation inside the CBC mode is
+really an C<C=E(ks3,D(ks2,E(ks1,M)))>.  This mode is used by SSL.
+
+The des_ede2_cbc_encrypt() macro implements two-key Triple-DES by
+reusing I<ks1> for the final encryption.  C<C=E(ks1,D(ks2,E(ks1,M)))>.
+This form of Triple-DES is used by the RSAREF library.
+
+des_pcbc_encrypt() encrypt/decrypts using the propagating cipher block
+chaing mode used by Kerberos v4. Its parameters are the same as
+des_ncbc_encrypt().
+
+des_cfb_encrypt() encrypt/decrypts using cipher feedback mode.  This
+method takes an array of characters as input and outputs and array of
+characters.  It does not require any padding to 8 character groups.
+Note: the I<ivec> variable is changed and the new changed value needs to
+be passed to the next call to this function.  Since this function runs
+a complete DES ECB encryption per I<numbits>, this function is only
+suggested for use when sending small numbers of characters.
+
+des_cfb64_encrypt()
+implements CFB mode of DES with 64bit feedback.  Why is this
+useful you ask?  Because this routine will allow you to encrypt an
+arbitrary number of bytes, no 8 byte padding.  Each call to this
+routine will encrypt the input bytes to output and then update ivec
+and num.  num contains 'how far' we are though ivec.  If this does
+not make much sense, read more about cfb mode of DES :-).
+
+des_ede3_cfb64_encrypt() and des_ede2_cfb64_encrypt() is the same as
+des_cfb64_encrypt() except that Triple-DES is used.
+
+des_ofb_encrypt() encrypts using output feedback mode.  This method
+takes an array of characters as input and outputs and array of
+characters.  It does not require any padding to 8 character groups.
+Note: the I<ivec> variable is changed and the new changed value needs to
+be passed to the next call to this function.  Since this function runs
+a complete DES ECB encryption per numbits, this function is only
+suggested for use when sending small numbers of characters.
+
+des_ofb64_encrypt() is the same as des_cfb64_encrypt() using Output
+Feed Back mode.
+
+des_ede3_ofb64_encrypt() and des_ede2_ofb64_encrypt() is the same as
+des_ofb64_encrypt(), using Triple-DES.
+
+The following functions are included in the DES library for
+compatibility with the MIT Kerberos library. des_read_pw_string()
+is also available under the name EVP_read_pw_string().
+
+des_read_pw_string() writes the string specified by I<prompt> to
+standarf output, turns echo off and reads in input string from the
+terminal.  The string is returned in I<buf>, which must have space for
+at least I<length> bytes.  If I<verify> is set, the user is asked for
+the password twice and unless the two copies match, an error is
+returned.  A return code of -1 indicates a system error, 1 failure due
+to use interaction, and 0 is success.
+
+des_read_password() does the same and converts the password to a DES
+key by calling des_string_to_key(); des_read_2password() operates in
+the same way as des_read_password() except that it generates two keys
+by using the des_string_to_2key() function.  des_string_to_key() is
+available for backward compatibility with the MIT library.  New
+applications should use a cryptographic hash function.  The same
+applies for des_string_to_2key().
+
+des_cbc_cksum() produces an 8 byte checksum based on the input stream
+(via CBC encryption).  The last 4 bytes of the checksum are returned
+and the complete 8 bytes are placed in I<output>. This function is
+used by Kerberos v4.  Other applications should use
+L<EVP_DigestInit(3)|EVP_DigestInit(3)> etc. instead.
+
+des_quad_cksum() is a Kerberos v4 function.  It returns a 4 byte
+checksum from the input bytes.  The algorithm can be iterated over the
+input, depending on I<out_count>, 1, 2, 3 or 4 times.  If I<output> is
+non-NULL, the 8 bytes generated by each pass are written into
+I<output>.
+
+The following are DES-based tranformations:
+
+des_fcrypt() is a fast version of the unix crypt(3) function.  This
+version takes only a small amount of space relative to other fast
+crypt() implementations.  This is different to the normal crypt in
+that the third parameter is the buffer that the return value is
+written into.  It needs to be at least 14 bytes long.  This function
+is thread safe, unlike the normal crypt.
+
+des_crypt() is a faster replacement for the normal system crypt().
+This function calls des_fcrypt() with a static array passed as the
+third parameter.  This emulates the normal non-thread safe semantics
+of crypt(3).
+
+des_enc_write() writes I<len> bytes to file descriptor I<fd> from
+buffer I<buf>. The data is encrypted via I<pcbc_encrypt> (default)
+using I<sched> for the key and I<iv> as a starting vector.  The actual
+data send down I<fd> consists of 4 bytes (in network byte order)
+containing the length of the following encrypted data.  The encrypted
+data then follows, padded with random data out to a multiple of 8
+bytes.
+
+des_enc_read() is used to read I<len> bytes from file descriptor
+I<fd> into buffer I<buf>. The data being read from I<fd> is assumed to
+have come from des_enc_write() and is decrypted using I<sched> for
+the key schedule and I<iv> for the initial vector.
+
+B<Warning:> The data format used by des_enc_write() and des_enc_read()
+has a cryptographic weakness: When asked to write more than MAXWRITE
+bytes, des_enc_write() will split the data into several chunks that
+are all encrypted using the same IV.  So don't use these functions
+unless you are sure you know what you do (in which case you might not
+want to use them anyway).  They cannot handle non-blocking sockets.
+des_enc_read() uses an internal state and thus cannot be used on
+multiple files.
+
+I<des_rw_mode> is used to specify the encryption mode to use with
+des_enc_read() and des_end_write().  If set to I<DES_PCBC_MODE> (the
+default), des_pcbc_encrypt is used.  If set to I<DES_CBC_MODE>
+des_cbc_encrypt is used.
+
+=head1 NOTES
+
+Single-key DES is insecure due to its short key size.  ECB mode is
+not suitable for most applications; see L<des_modes(7)|des_modes(7)>.
+
+The L<evp(3)|evp(3)> library provides higher-level encryption functions.
+
+=head1 BUGS
+
+des_3cbc_encrypt() is flawed and must not be used in applications.
+
+des_cbc_encrypt() does not modify B<ivec>; use des_ncbc_encrypt()
+instead.
+
+des_cfb_encrypt() and des_ofb_encrypt() operates on input of 8 bits.
+What this means is that if you set numbits to 12, and length to 2, the
+first 12 bits will come from the 1st input byte and the low half of
+the second input byte.  The second 12 bits will have the low 8 bits
+taken from the 3rd input byte and the top 4 bits taken from the 4th
+input byte.  The same holds for output.  This function has been
+implemented this way because most people will be using a multiple of 8
+and because once you get into pulling bytes input bytes apart things
+get ugly!
+
+des_read_pw_string() is the most machine/OS dependent function and
+normally generates the most problems when porting this code.
+
+=head1 CONFORMING TO
+
+ANSI X3.106
+
+The B<des> library was written to be source code compatible with
+the MIT Kerberos library.
+
+=head1 SEE ALSO
+
+crypt(3), L<des_modes(3)|des_modes(3)>, L<evp(3)|evp(3)>, L<rand(3)|rand(3)>
+
+=head1 HISTORY
+
+des_cbc_cksum(), des_cbc_encrypt(), des_ecb_encrypt(),
+des_is_weak_key(), des_key_sched(), des_pcbc_encrypt(),
+des_quad_cksum(), des_random_key(), des_read_password() and
+des_string_to_key() are available in the MIT Kerberos library;
+des_check_key_parity(), des_fixup_key_parity() and des_is_weak_key()
+are available in newer versions of that library.
+
+des_set_key_checked() and des_set_key_unchecked() were added in
+OpenSSL 0.9.5.
+
+des_generate_random_block(), des_init_random_number_generator(),
+des_new_random_key(), des_set_random_generator_seed() and
+des_set_sequence_number() and des_rand_data() are used in newer
+versions of Kerberos but are not implemented here.
+
+des_random_key() generated cryptographically weak random data in
+SSLeay and in OpenSSL prior version 0.9.5, as well as in the original
+MIT library.
+
+=head1 AUTHOR
+
+Eric Young (eay@cryptsoft.com). Modified for the OpenSSL project
+(http://www.openssl.org).
+
+=cut
index d8148c8..1aa3ac7 100644 (file)
@@ -248,3 +248,6 @@ it to:
 
 L<blowfish(3)|blowfish(3)>, L<des(3)|des(3)>, L<idea(3)|idea(3)>,
 L<rc2(3)|rc2(3)>
+
+=cut
+
index 0486c04..eb8ba61 100644 (file)
@@ -86,8 +86,9 @@ contain public as well as private RSA keys:
 In public keys, the private exponent and the related secret values are
 B<NULL>.
 
-B<dmp1>, B<dmq1> and B<iqmp> may be B<NULL> in private keys, but the
-RSA operations are much faster when these values are available.
+B<p>, B<q>, B<dmp1>, B<dmq1> and B<iqmp> may be B<NULL> in private
+keys, but the RSA operations are much faster when these values are
+available.
 
 =head1 CONFORMING TO
 
diff --git a/lib/libssl/src/ms/mingw32.bat b/lib/libssl/src/ms/mingw32.bat
new file mode 100644 (file)
index 0000000..1726c55
--- /dev/null
@@ -0,0 +1,92 @@
+@rem OpenSSL with Mingw32+GNU as\r
+@rem ---------------------------\r
+\r
+perl Configure Mingw32 %1 %2 %3 %4 %5 %6 %7 %8\r
+\r
+@echo off\r
+\r
+perl -e "exit 1 if '%1' eq 'no-asm'"\r
+if errorlevel 1 goto noasm\r
+\r
+echo Generating x86 for GNU assember\r
+\r
+echo Bignum\r
+cd crypto\bn\asm\r
+perl x86.pl gaswin > bn-win32.s\r
+cd ..\..\..\r
+\r
+echo DES\r
+cd crypto\des\asm\r
+perl des-586.pl gaswin > d-win32.s\r
+cd ..\..\..\r
+\r
+echo crypt\r
+cd crypto\des\asm\r
+perl crypt586.pl gaswin > y-win32.s\r
+cd ..\..\..\r
+\r
+echo Blowfish\r
+cd crypto\bf\asm\r
+perl bf-586.pl gaswin > b-win32.s\r
+cd ..\..\..\r
+\r
+echo CAST5\r
+cd crypto\cast\asm\r
+perl cast-586.pl gaswin > c-win32.s\r
+cd ..\..\..\r
+\r
+echo RC4\r
+cd crypto\rc4\asm\r
+perl rc4-586.pl gaswin > r4-win32.s\r
+cd ..\..\..\r
+\r
+echo MD5\r
+cd crypto\md5\asm\r
+perl md5-586.pl gaswin > m5-win32.s\r
+cd ..\..\..\r
+\r
+echo SHA1\r
+cd crypto\sha\asm\r
+perl sha1-586.pl gaswin > s1-win32.s\r
+cd ..\..\..\r
+\r
+echo RIPEMD160\r
+cd crypto\ripemd\asm\r
+perl rmd-586.pl gaswin > rm-win32.s\r
+cd ..\..\..\r
+\r
+echo RC5\32\r
+cd crypto\rc5\asm\r
+perl rc5-586.pl gaswin > r5-win32.s\r
+cd ..\..\..\r
+\r
+:noasm\r
+\r
+echo Generating makefile\r
+perl util\mkfiles.pl >MINFO\r
+perl util\mk1mf.pl gaswin Mingw32 >ms\mingw32a.mak\r
+perl util\mk1mf.pl gaswin Mingw32-files >ms\mingw32f.mak\r
+echo Generating DLL definition files\r
+perl util\mkdef.pl 32 libeay >ms\libeay32.def\r
+if errorlevel 1 goto end\r
+perl util\mkdef.pl 32 ssleay >ms\ssleay32.def\r
+if errorlevel 1 goto end\r
+\r
+rem Create files -- this can be skipped if using the GNU file utilities\r
+make -f ms/mingw32f.mak\r
+echo You can ignore the error messages above\r
+\r
+echo Building the libraries\r
+make -f ms/mingw32a.mak\r
+if errorlevel 1 goto end\r
+\r
+echo Generating the DLLs and input libraries\r
+dllwrap --dllname libeay32.dll --output-lib out/libeay32.a --def ms/libeay32.def out/libcrypto.a -lwsock32 -lgdi32\r
+if errorlevel 1 goto end\r
+dllwrap --dllname libssl32.dll --output-lib out/libssl32.a --def ms/ssleay32.def out/libssl.a out/libeay32.a\r
+if errorlevel 1 goto end\r
+\r
+echo Done compiling OpenSSL\r
+\r
+:end\r
+\r
index 3506a64..ef37bea 100644 (file)
@@ -136,7 +136,7 @@ ssltest -bio_pair -ssl2
 if errorlevel 1 goto done\r
 \r
 echo test sslv2/sslv3 with 1024 bit DHE via BIO pair\r
-ssltest -bio_pair -dhe1024 -v\r
+ssltest -bio_pair -dhe1024dsa -v\r
 if errorlevel 1 goto done\r
 \r
 echo test sslv2 with server authentication via BIO pair\r
index d2eb3a2..5e7871f 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
diff --git a/lib/libssl/src/shlib/Makefile.hpux10-cc b/lib/libssl/src/shlib/Makefile.hpux10-cc
new file mode 100644 (file)
index 0000000..4dc62eb
--- /dev/null
@@ -0,0 +1,51 @@
+# Makefile.hpux-cc
+
+major=1
+
+slib=libssl
+sh_slib=$(slib).so.$(major)
+
+clib=libcrypto
+sh_clib=$(clib).so.$(major)
+
+all : $(clib).sl $(slib).sl
+
+
+$(clib)_pic.a : $(clib).a
+       echo "Copying $? to $@"
+       cp -p $? $@
+
+$(slib)_pic.a : $(slib).a
+       echo "Copying $? to $@"
+       cp -p $? $@
+
+$(sh_clib) : $(clib)_pic.a
+       echo "collecting all object files for $@"
+       find . -name \*.o -print > allobjs
+       for obj in `ar t $(clib)_pic.a`; \
+       do \
+               grep /$$obj allobjs; \
+       done >objlist
+       echo "linking $@"
+       ld -b -s -z +h $@ -o $@ `cat objlist` -lc 
+       rm allobjs objlist
+
+$(clib).sl : $(sh_clib)
+       rm -f $@
+       ln -s $? $@
+
+$(sh_slib) : $(slib)_pic.a $(clib).sl
+       echo "collecting all object files for $@"
+       find . -name \*.o -print > allobjs
+       for obj in `ar t $(slib)_pic.a`; \
+       do \
+               grep /$$obj allobjs; \
+       done >objlist
+       echo "linking $@"
+       ld -b -s -z +h $@ +b /usr/local/ssl/lib:/usr/lib -o $@ `cat objlist` \
+                       -L. -lcrypto -lc
+       rm -f allobjs objlist
+        
+$(slib).sl : $(sh_slib)
+       rm -f $@
+       ln -s $? $@
diff --git a/lib/libssl/src/shlib/hpux10-cc.sh b/lib/libssl/src/shlib/hpux10-cc.sh
new file mode 100644 (file)
index 0000000..903baaa
--- /dev/null
@@ -0,0 +1,90 @@
+#!/usr/bin/sh
+#
+# Run this script from the OpenSSL root directory:
+# sh shlib/hpux10-cc.sh
+# 
+# HP-UX (10.20) shared library installation:
+# Compile and install OpenSSL with best possible optimization:
+# - shared libraries are compiled and installed with +O4 optimization
+# - executable(s) are compiled and installed with +O4 optimization
+# - static libraries are compiled and installed with +O3 optimization,
+#   to avoid the time consuming +O4 link-time optimization when using
+#   these libraries. (The shared libs are already optimized during build
+#   at +O4.)
+#
+# This script must be run with appropriate privileges to install into
+# /usr/local/ssl. HP-UX prevents used executables and shared libraries
+# from being deleted or overwritten. Stop all processes using already
+# installed items of OpenSSL.
+#
+# WARNING: At high optimization levels, HP's ANSI-C compiler can chew up
+#          large amounts of memory and CPU time. Make sure to have at least
+#          128MB of RAM available and that your kernel is configured to allow
+#          at least 128MB data size (maxdsiz parameter).
+#          The installation process can take several hours, even on fast
+#          machines. +O4 optimization of the libcrypto.sl shared library may
+#          take 1 hour on a C200 (200MHz PA8200 CPU), +O3 compilation of
+#          fcrypt_b.c can take 20 minutes on this machine. Stay patient.
+#
+# SITEFLAGS: site specific flags. I do use +DAportable, since I have to
+# support older PA1.1-type CPUs. Your mileage may vary.
+# +w1 enables enhanced warnings, useful when working with snaphots.
+#
+SITEFLAGS="+DAportable +w1"
+#
+# Set the default additions to build with HP-UX.
+# -D_REENTRANT must/should be defined on HP-UX manually, since we do call
+# Configure directly.
+# +Oall increases the optimization done.
+#
+MYFLAGS="-D_REENTRANT +Oall $SITEFLAGS"
+
+# Configure for pic and build the static pic libraries
+perl5 Configure hpux-parisc-cc-o4 +z ${MYFLAGS}
+make clean
+make DIRS="crypto ssl"
+# Rename the static pic libs and build dynamic libraries from them
+# Be prepared to see a lot of warnings about shared libraries being built
+# with optimizations higher than +O2. When using these libraries, it is
+# not possible to replace internal library functions with functions from
+# the program to be linked.
+#
+make -f shlib/Makefile.hpux10-cc
+
+# Copy the libraries to /usr/local/ssl/lib (they have to be in their
+# final location when linking applications).
+# If the directories are still there, no problem.
+mkdir /usr/local
+mkdir /usr/local/ssl
+mkdir /usr/local/ssl/lib
+chmod 444 lib*_pic.a
+chmod 555 lib*.so.1
+cp -p lib*_pic.a lib*.so.1 /usr/local/ssl/lib
+(cd /usr/local/ssl/lib ; ln -sf libcrypto.so.1 libcrypto.sl ; ln -sf libssl.so.1 libssl.sl)
+
+# Reconfigure without pic to compile the executables. Unfortunately, while
+# performing this task we have to recompile the library components, even
+# though we use the already installed shared libs anyway.
+#
+perl5 Configure hpux-parisc-cc-o4 ${MYFLAGS}
+
+make clean
+
+# Hack the Makefiles to pick up the dynamic libraries during linking
+#
+sed 's/^PEX_LIBS=.*$/PEX_LIBS=-L\/usr\/local\/ssl\/lib -Wl,+b,\/usr\/local\/ssl\/lib:\/usr\/lib/' Makefile.ssl >xxx; mv xxx Makefile.ssl
+sed 's/-L\.\.//' apps/Makefile.ssl >xxx; mv xxx apps/Makefile.ssl
+sed 's/-L\.\.//' test/Makefile.ssl >xxx; mv xxx test/Makefile.ssl
+# Build the static libs and the executables in one make.
+make
+# Install everything
+make install
+
+# Finally build the static libs with +O3. This time we only need the libraries,
+# once created, they are simply copied into place.
+#
+perl5 Configure hpux-parisc-cc ${MYFLAGS}
+make clean
+make DIRS="crypto ssl"
+chmod 644 libcrypto.a libssl.a
+cp -p libcrypto.a libssl.a /usr/local/ssl/lib
index 279d2c0..0c8f551 100644 (file)
@@ -772,6 +772,8 @@ static int ssl3_get_server_certificate(SSL *s)
        s->session->sess_cert=sc;
 
        sc->cert_chain=sk;
+       /* Inconsistency alert: cert_chain does include the peer's
+        * certificate, which we don't include in s3_srvr.c */
        x=sk_X509_value(sk,0);
        sk=NULL;
 
index c4b49aa..7ada26c 100644 (file)
@@ -771,14 +771,16 @@ long ssl3_ctrl(SSL *s, int cmd, long larg, char *parg)
        case SSL_CTRL_SET_TMP_RSA:
                {
                        RSA *rsa = (RSA *)parg;
-                       if (rsa == NULL) {
+                       if (rsa == NULL)
+                               {
                                SSLerr(SSL_F_SSL3_CTRL, ERR_R_PASSED_NULL_PARAMETER);
                                return(ret);
-                       }
-                       if ((rsa = RSAPrivateKey_dup(rsa)) == NULL) {
+                               }
+                       if ((rsa = RSAPrivateKey_dup(rsa)) == NULL)
+                               {
                                SSLerr(SSL_F_SSL3_CTRL, ERR_R_RSA_LIB);
                                return(ret);
-                       }
+                               }
                        if (s->cert->rsa_tmp != NULL)
                                RSA_free(s->cert->rsa_tmp);
                        s->cert->rsa_tmp = rsa;
@@ -796,19 +798,25 @@ long ssl3_ctrl(SSL *s, int cmd, long larg, char *parg)
        case SSL_CTRL_SET_TMP_DH:
                {
                        DH *dh = (DH *)parg;
-                       if (dh == NULL) {
+                       if (dh == NULL)
+                               {
                                SSLerr(SSL_F_SSL3_CTRL, ERR_R_PASSED_NULL_PARAMETER);
                                return(ret);
-                       }
-                       if ((dh = DHparams_dup(dh)) == NULL) {
-                               SSLerr(SSL_F_SSL3_CTRL, ERR_R_DH_LIB);
-                               return(ret);
-                       }
-                       if (!DH_generate_key(dh)) {
-                               DH_free(dh);
+                               }
+                       if ((dh = DHparams_dup(dh)) == NULL)
+                               {
                                SSLerr(SSL_F_SSL3_CTRL, ERR_R_DH_LIB);
                                return(ret);
-                       }
+                               }
+                       if (!(s->options & SSL_OP_SINGLE_DH_USE))
+                               {
+                               if (!DH_generate_key(dh))
+                                       {
+                                       DH_free(dh);
+                                       SSLerr(SSL_F_SSL3_CTRL, ERR_R_DH_LIB);
+                                       return(ret);
+                                       }
+                               }
                        if (s->cert->dh_tmp != NULL)
                                DH_free(s->cert->dh_tmp);
                        s->cert->dh_tmp = dh;
@@ -843,8 +851,8 @@ long ssl3_callback_ctrl(SSL *s, int cmd, void (*fp)())
                0)
                {
                if (!ssl_cert_inst(&s->cert))
-                       {
-                       SSLerr(SSL_F_SSL3_CTRL, ERR_R_MALLOC_FAILURE);
+                       {
+                       SSLerr(SSL_F_SSL3_CALLBACK_CTRL, ERR_R_MALLOC_FAILURE);
                        return(0);
                        }
                }
@@ -929,23 +937,26 @@ long ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, char *parg)
        case SSL_CTRL_SET_TMP_DH:
                {
                DH *new=NULL,*dh;
-               int rret=0;
 
                dh=(DH *)parg;
-               if (    ((new=DHparams_dup(dh)) == NULL) ||
-                       (!DH_generate_key(new)))
+               if ((new=DHparams_dup(dh)) == NULL)
                        {
                        SSLerr(SSL_F_SSL3_CTX_CTRL,ERR_R_DH_LIB);
-                       if (new != NULL) DH_free(new);
+                       return 0;
                        }
-               else
+               if (!(ctx->options & SSL_OP_SINGLE_DH_USE))
                        {
-                       if (cert->dh_tmp != NULL)
-                               DH_free(cert->dh_tmp);
-                       cert->dh_tmp=new;
-                       rret=1;
+                       if (!DH_generate_key(new))
+                               {
+                               SSLerr(SSL_F_SSL3_CTX_CTRL,ERR_R_DH_LIB);
+                               DH_free(new);
+                               return 0;
+                               }
                        }
-               return(rret);
+               if (cert->dh_tmp != NULL)
+                       DH_free(cert->dh_tmp);
+               cert->dh_tmp=new;
+               return 1;
                }
                /*break; */
        case SSL_CTRL_SET_TMP_DH_CB:
index 90806e2..e23ca20 100644 (file)
@@ -1698,6 +1698,8 @@ static int ssl3_get_client_certificate(SSL *s)
        if (s->session->sess_cert->cert_chain != NULL)
                sk_X509_pop_free(s->session->sess_cert->cert_chain, X509_free);
        s->session->sess_cert->cert_chain=sk;
+       /* Inconsistency alert: cert_chain does *not* include the
+        * peer's own certificate, while we do include it in s3_clnt.c */
 
        sk=NULL;
 
index f29f775..bb846f4 100644 (file)
@@ -391,9 +391,8 @@ struct ssl_ctx_st
         * SSL_SESSION_free() when it has finished using it.  Otherwise,
         * on 0, it means the callback has finished with it.
         * If remove_session_cb is not null, it will be called when
-        * a session-id is removed from the cache.  Again, a return
-        * of 0 mens that SSLeay should not SSL_SESSION_free() since
-        * the application is doing something with it. */
+        * a session-id is removed from the cache.  After the call,
+        * OpenSSL will SSL_SESSION_free() it. */
        int (*new_session_cb)(struct ssl_st *ssl,SSL_SESSION *sess);
        void (*remove_session_cb)(struct ssl_ctx_st *ctx,SSL_SESSION *sess);
        SSL_SESSION *(*get_session_cb)(struct ssl_st *ssl,
@@ -1215,6 +1214,7 @@ int SSL_COMP_add_compression_method(int id,char *cm);
 #define SSL_F_SSL2_SET_CERTIFICATE                      126
 #define SSL_F_SSL2_WRITE                                127
 #define SSL_F_SSL3_ACCEPT                               128
+#define SSL_F_SSL3_CALLBACK_CTRL                        233
 #define SSL_F_SSL3_CHANGE_CIPHER_STATE                  129
 #define SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM             130
 #define SSL_F_SSL3_CLIENT_HELLO                                 131
index 48f247c..0596b7c 100644 (file)
@@ -191,16 +191,33 @@ CERT *ssl_cert_dup(CERT *cert)
 #ifndef NO_DH
        if (cert->dh_tmp != NULL)
                {
-               /* DH parameters don't have a reference count (and cannot
-                * reasonably be shared anyway, as the secret exponent may
-                * be created just when it is needed -- earlier library
-                * versions did not pay attention to this) */
+               /* DH parameters don't have a reference count */
                ret->dh_tmp = DHparams_dup(cert->dh_tmp);
                if (ret->dh_tmp == NULL)
                        {
-                       SSLerr(SSL_F_SSL_CERT_NEW, ERR_R_DH_LIB);
+                       SSLerr(SSL_F_SSL_CERT_DUP, ERR_R_DH_LIB);
                        goto err;
                        }
+               if (cert->dh_tmp->priv_key)
+                       {
+                       BIGNUM *b = BN_dup(cert->dh_tmp->priv_key);
+                       if (!b)
+                               {
+                               SSLerr(SSL_F_SSL_CERT_DUP, ERR_R_BN_LIB);
+                               goto err;
+                               }
+                       ret->dh_tmp->priv_key = b;
+                       }
+               if (cert->dh_tmp->pub_key)
+                       {
+                       BIGNUM *b = BN_dup(cert->dh_tmp->pub_key);
+                       if (!b)
+                               {
+                               SSLerr(SSL_F_SSL_CERT_DUP, ERR_R_BN_LIB);
+                               goto err;
+                               }
+                       ret->dh_tmp->pub_key = b;
+                       }
                }
        ret->dh_tmp_cb = cert->dh_tmp_cb;
 #endif
index 1cbc288..7436a50 100644 (file)
@@ -607,7 +607,7 @@ static int ssl_cipher_process_rulestr(const char *rule_str,
                        if (buflen == 0)
                                {
                                /*
-                                * We hit something, we cannot deal with,
+                                * We hit something we cannot deal with,
                                 * it is no command or separator nor
                                 * alphanumeric, so we call this an error.
                                 */
@@ -620,6 +620,7 @@ static int ssl_cipher_process_rulestr(const char *rule_str,
 
                        if (rule == CIPHER_SPECIAL)
                                {
+                               found = 0; /* unused -- avoid compiler warning */
                                break;  /* special treatment */
                                }
 
@@ -633,12 +634,12 @@ static int ssl_cipher_process_rulestr(const char *rule_str,
                                multi=0;
 
                        /*
-                        * Now search for the name in the ca_list. Be careful
+                        * Now search for the cipher alias in the ca_list. Be careful
                         * with the strncmp, because the "buflen" limitation
                         * will make the rule "ADH:SOME" and the cipher
                         * "ADH-MY-CIPHER" look like a match for buflen=3.
-                        * So additionally check, whether the cipher name found
-                        * has the correct length. We can save a strlen() call,
+                        * So additionally check whether the cipher name found
+                        * has the correct length. We can save a strlen() call:
                         * just checking for the '\0' at the right place is
                         * sufficient, we have to strncmp() anyway.
                         */
@@ -665,42 +666,42 @@ static int ssl_cipher_process_rulestr(const char *rule_str,
                        if (!multi) break;
                        }
 
+               /*
+                * Ok, we have the rule, now apply it
+                */
+               if (rule == CIPHER_SPECIAL)
+                       {       /* special command */
+                       ok = 0;
+                       if ((buflen == 8) &&
+                               !strncmp(buf, "STRENGTH", 8))
+                               ok = ssl_cipher_strength_sort(list,
+                                       head_p, tail_p);
+                       else
+                               SSLerr(SSL_F_SSL_CIPHER_PROCESS_RULESTR,
+                                       SSL_R_INVALID_COMMAND);
+                       if (ok == 0)
+                               retval = 0;
                        /*
-                        * Ok, we have the rule, now apply it
+                        * We do not support any "multi" options
+                        * together with "@", so throw away the
+                        * rest of the command, if any left, until
+                        * end or ':' is found.
                         */
-                       if (rule == CIPHER_SPECIAL)
-                               {       /* special command */
-                               ok = 0;
-                               if ((buflen == 8) &&
-                                       !strncmp(buf, "STRENGTH", 8))
-                                       ok = ssl_cipher_strength_sort(list,
-                                                       head_p, tail_p);
-                               else
-                                       SSLerr(SSL_F_SSL_CIPHER_PROCESS_RULESTR,
-                                               SSL_R_INVALID_COMMAND);
-                               if (ok == 0)
-                                       retval = 0;
-                               /*
-                                * We do not support any "multi" options
-                                * together with "@", so throw away the
-                                * rest of the command, if any left, until
-                                * end or ':' is found.
-                                */
-                               while ((*l != '\0') && ITEM_SEP(*l))
-                                       l++;
-                               }
-                       else if (found)
-                               {
-                               ssl_cipher_apply_rule(algorithms, mask,
-                                       algo_strength, mask_strength, rule, -1,
-                                       list, head_p, tail_p);
-                               }
-                       else
-                               {
-                               while ((*l != '\0') && ITEM_SEP(*l))
-                                       l++;
-                               }
-                       if (*l == '\0') break; /* done */
+                       while ((*l != '\0') && ITEM_SEP(*l))
+                               l++;
+                       }
+               else if (found)
+                       {
+                       ssl_cipher_apply_rule(algorithms, mask,
+                               algo_strength, mask_strength, rule, -1,
+                               list, head_p, tail_p);
+                       }
+               else
+                       {
+                       while ((*l != '\0') && ITEM_SEP(*l))
+                               l++;
+                       }
+               if (*l == '\0') break; /* done */
                }
 
        return(retval);
index 5618e34..642c3f9 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
@@ -94,6 +95,7 @@ static ERR_STRING_DATA SSL_str_functs[]=
 {ERR_PACK(0,SSL_F_SSL2_SET_CERTIFICATE,0),     "SSL2_SET_CERTIFICATE"},
 {ERR_PACK(0,SSL_F_SSL2_WRITE,0),       "SSL2_WRITE"},
 {ERR_PACK(0,SSL_F_SSL3_ACCEPT,0),      "SSL3_ACCEPT"},
+{ERR_PACK(0,SSL_F_SSL3_CALLBACK_CTRL,0),       "SSL3_CALLBACK_CTRL"},
 {ERR_PACK(0,SSL_F_SSL3_CHANGE_CIPHER_STATE,0), "SSL3_CHANGE_CIPHER_STATE"},
 {ERR_PACK(0,SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,0),    "SSL3_CHECK_CERT_AND_ALGORITHM"},
 {ERR_PACK(0,SSL_F_SSL3_CLIENT_HELLO,0),        "SSL3_CLIENT_HELLO"},
index 3109708..c515c41 100644 (file)
@@ -599,6 +599,9 @@ STACK_OF(X509) *SSL_get_peer_cert_chain(SSL *s)
        else
                r=s->session->sess_cert->cert_chain;
 
+       /* If we are a client, cert_chain includes the peer's own
+        * certificate; if we are a server, it does not. */
+       
        return(r);
        }
 
index 7e27857..c07d957 100644 (file)
@@ -164,7 +164,7 @@ int SSL_SESSION_print(BIO *bp, SSL_SESSION *x)
                }
        if (BIO_puts(bp,"\n") <= 0) goto err;
 
-       if (BIO_puts(bp, "    Verify return code ") <= 0) goto err;
+       if (BIO_puts(bp, "    Verify return code: ") <= 0) goto err;
        sprintf(str, "%ld (%s)\n", x->verify_result, 
                        X509_verify_cert_error_string(x->verify_result));
        if (BIO_puts(bp,str) <= 0) goto err;
index d655bbb..dde3579 100644 (file)
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <time.h>
 
 #include "openssl/e_os.h"
 
 #include <openssl/bio.h>
 #include <openssl/crypto.h>
+#include <openssl/evp.h>
 #include <openssl/x509.h>
 #include <openssl/ssl.h>
 #include <openssl/err.h>
@@ -89,9 +91,8 @@ static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export,int keylength);
 #endif
 #ifndef NO_DH
 static DH *get_dh512(void);
-#endif
-#ifndef NO_DSA
-static void MS_CALLBACK dsa_cb(int p, int n, void *arg);
+static DH *get_dh1024(void);
+static DH *get_dh1024dsa(void);
 #endif
 
 static BIO *bio_err=NULL;
@@ -109,7 +110,7 @@ static int s_nbio=0;
 
 static const char rnd_seed[] = "string to make the random number generator think it has entropy";
 
-int doit_biopair(SSL *s_ssl,SSL *c_ssl,long bytes);
+int doit_biopair(SSL *s_ssl,SSL *c_ssl,long bytes,clock_t *s_time,clock_t *c_time);
 int doit(SSL *s_ssl,SSL *c_ssl,long bytes);
 static void sv_usage(void)
        {
@@ -122,10 +123,9 @@ static void sv_usage(void)
        fprintf(stderr," -reuse        - use session-id reuse\n");
        fprintf(stderr," -num <val>    - number of connections to perform\n");
        fprintf(stderr," -bytes <val>  - number of bytes to swap between client/server\n");
-#if !defined NO_DH && !defined NO_DSA
-       fprintf(stderr," -dhe1024      - generate 1024 bit key for DHE\n");
-#endif
-#if !defined NO_DH
+#ifndef NO_DH
+       fprintf(stderr," -dhe1024      - use 1024 bit key (safe prime) for DHE\n");
+       fprintf(stderr," -dhe1024dsa   - use 1024 bit key (with 160-bit subprime) for DHE\n");
        fprintf(stderr," -no_dhe       - disable DHE\n");
 #endif
 #ifndef NO_SSL2
@@ -139,12 +139,58 @@ static void sv_usage(void)
 #endif
        fprintf(stderr," -CApath arg   - PEM format directory of CA's\n");
        fprintf(stderr," -CAfile arg   - PEM format file of CA's\n");
-       fprintf(stderr," -cert arg     - Certificate file\n");
-       fprintf(stderr," -s_cert arg   - Just the server certificate file\n");
-       fprintf(stderr," -c_cert arg   - Just the client certificate file\n");
+       fprintf(stderr," -cert arg     - Server certificate file\n");
+       fprintf(stderr," -key arg      - Server key file (default: same as -cert)\n");
+       fprintf(stderr," -c_cert arg   - Client certificate file\n");
+       fprintf(stderr," -c_key arg    - Client key file (default: same as -c_cert)\n");
        fprintf(stderr," -cipher arg   - The cipher list\n");
        fprintf(stderr," -bio_pair     - Use BIO pairs\n");
        fprintf(stderr," -f            - Test even cases that can't work\n");
+       fprintf(stderr," -time         - measure processor time used by client and server\n");
+       }
+
+static void print_details(SSL *c_ssl, const char *prefix)
+       {
+       SSL_CIPHER *ciph;
+       X509 *cert;
+               
+       ciph=SSL_get_current_cipher(c_ssl);
+       BIO_printf(bio_stdout,"%s%s, cipher %s %s",
+               prefix,
+               SSL_get_version(c_ssl),
+               SSL_CIPHER_get_version(ciph),
+               SSL_CIPHER_get_name(ciph));
+       cert=SSL_get_peer_certificate(c_ssl);
+       if (cert != NULL)
+               {
+               EVP_PKEY *pkey = X509_get_pubkey(cert);
+               if (pkey != NULL)
+                       {
+                       if (0) 
+                               ;
+#ifndef NO_RSA
+                       else if (pkey->type == EVP_PKEY_RSA && pkey->pkey.rsa != NULL
+                               && pkey->pkey.rsa->n != NULL)
+                               {
+                               BIO_printf(bio_stdout, ", %d bit RSA",
+                                       BN_num_bits(pkey->pkey.rsa->n));
+                               }
+#endif
+#ifndef NO_DSA
+                       else if (pkey->type == EVP_PKEY_DSA && pkey->pkey.dsa != NULL
+                               && pkey->pkey.dsa->p != NULL)
+                               {
+                               BIO_printf(bio_stdout, ", %d bit DSA",
+                                       BN_num_bits(pkey->pkey.dsa->p));
+                               }
+#endif
+                       EVP_PKEY_free(pkey);
+                       }
+               X509_free(cert);
+               }
+       /* The SSL API does not allow us to look at temporary RSA/DH keys,
+        * otherwise we should print their lengths too */
+       BIO_printf(bio_stdout,"\n");
        }
 
 int main(int argc, char *argv[])
@@ -157,18 +203,23 @@ int main(int argc, char *argv[])
        int client_auth=0;
        int server_auth=0,i;
        char *server_cert=TEST_SERVER_CERT;
+       char *server_key=NULL;
        char *client_cert=TEST_CLIENT_CERT;
+       char *client_key=NULL;
        SSL_CTX *s_ctx=NULL;
        SSL_CTX *c_ctx=NULL;
        SSL_METHOD *meth=NULL;
        SSL *c_ssl,*s_ssl;
        int number=1,reuse=0;
        long bytes=1L;
-       SSL_CIPHER *ciph;
-       int dhe1024 = 0, no_dhe = 0;
 #ifndef NO_DH
        DH *dh;
+       int dhe1024 = 0, dhe1024dsa = 0;
 #endif
+       int no_dhe = 0;
+       int print_time = 0;
+       clock_t s_time = 0, c_time = 0;
+
        verbose = 0;
        debug = 0;
        cipher = 0;
@@ -195,8 +246,12 @@ int main(int argc, char *argv[])
                        debug=1;
                else if (strcmp(*argv,"-reuse") == 0)
                        reuse=1;
+#ifndef NO_DH
                else if (strcmp(*argv,"-dhe1024") == 0)
                        dhe1024=1;
+               else if (strcmp(*argv,"-dhe1024dsa") == 0)
+                       dhe1024dsa=1;
+#endif
                else if (strcmp(*argv,"-no_dhe") == 0)
                        no_dhe=1;
                else if (strcmp(*argv,"-ssl2") == 0)
@@ -230,11 +285,26 @@ int main(int argc, char *argv[])
                        if (--argc < 1) goto bad;
                        server_cert= *(++argv);
                        }
+               else if (strcmp(*argv,"-key") == 0)
+                       {
+                       if (--argc < 1) goto bad;
+                       server_key= *(++argv);
+                       }
+               else if (strcmp(*argv,"-s_key") == 0)
+                       {
+                       if (--argc < 1) goto bad;
+                       server_key= *(++argv);
+                       }
                else if (strcmp(*argv,"-c_cert") == 0)
                        {
                        if (--argc < 1) goto bad;
                        client_cert= *(++argv);
                        }
+               else if (strcmp(*argv,"-c_key") == 0)
+                       {
+                       if (--argc < 1) goto bad;
+                       client_key= *(++argv);
+                       }
                else if (strcmp(*argv,"-cipher") == 0)
                        {
                        if (--argc < 1) goto bad;
@@ -258,6 +328,10 @@ int main(int argc, char *argv[])
                        {
                        force = 1;
                        }
+               else if (strcmp(*argv,"-time") == 0)
+                       {
+                       print_time = 1;
+                       }
                else
                        {
                        fprintf(stderr,"unknown option %s\n",*argv);
@@ -276,15 +350,24 @@ bad:
 
        if (!ssl2 && !ssl3 && !tls1 && number > 1 && !reuse && !force)
                {
-               fprintf(stderr, "This case cannot work.  Use -f switch to perform "
-                       "the test anyway\n"
-                       "(and -d to see what happens, "
-                       "and -bio_pair to really make it happen :-)\n"
-                       "or add one of -ssl2, -ssl3, -tls1, -reuse to "
-                       "avoid protocol mismatch.\n");
+               fprintf(stderr, "This case cannot work.  Use -f to perform "
+                       "the test anyway (and\n-d to see what happens), "
+                       "or add one of -ssl2, -ssl3, -tls1, -reuse\n"
+                       "to avoid protocol mismatch.\n");
                exit(1);
                }
 
+       if (print_time)
+               {
+               if (!bio_pair)
+                       {
+                       fprintf(stderr, "Using BIO pair (-bio_pair)\n");
+                       bio_pair = 1;
+                       }
+               if (number < 50 && !force)
+                       fprintf(stderr, "Warning: For accurate timings, use more connections (e.g. -num 1000)\n");
+               }
+
 /*     if (cipher == NULL) cipher=getenv("SSL_CIPHER"); */
 
        SSL_library_init();
@@ -326,34 +409,21 @@ bad:
 #ifndef NO_DH
        if (!no_dhe)
                {
-# ifndef NO_DSA
-               if (dhe1024) 
+               if (dhe1024dsa)
                        {
-                       DSA *dsa;
-                       unsigned char seed[20];
-                       
-                       if (verbose)
-                               {
-                               BIO_printf(bio_err, "Creating 1024 bit DHE parameters\n");
-                               BIO_flush(bio_err);
-                               }
-                       
-                       memcpy(seed, "Random String no. 12", 20);
-                       dsa = DSA_generate_parameters(1024, seed, 20, NULL, NULL, dsa_cb, bio_err);
-                       dh = DSA_dup_DH(dsa);   
-                       DSA_free(dsa);
-                       /* important: SSL_OP_SINGLE_DH_USE to avoid small subgroup attacks */
+                       /* use SSL_OP_SINGLE_DH_USE to avoid small subgroup attacks */
                        SSL_CTX_set_options(s_ctx, SSL_OP_SINGLE_DH_USE);
-                       
-                       if (verbose)
-                               fprintf(stdout, " done\n");
+                       dh=get_dh1024dsa();
                        }
+               else if (dhe1024)
+                       dh=get_dh1024();
                else
-# endif
                        dh=get_dh512();
                SSL_CTX_set_tmp_dh(s_ctx,dh);
                DH_free(dh);
                }
+#else
+       (void)no_dhe;
 #endif
 
 #ifndef NO_RSA
@@ -364,8 +434,8 @@ bad:
                {
                ERR_print_errors(bio_err);
                }
-       else if (!SSL_CTX_use_PrivateKey_file(s_ctx,server_cert,
-               SSL_FILETYPE_PEM))
+       else if (!SSL_CTX_use_PrivateKey_file(s_ctx,
+               (server_key?server_key:server_cert), SSL_FILETYPE_PEM))
                {
                ERR_print_errors(bio_err);
                goto end;
@@ -375,7 +445,8 @@ bad:
                {
                SSL_CTX_use_certificate_file(c_ctx,client_cert,
                        SSL_FILETYPE_PEM);
-               SSL_CTX_use_PrivateKey_file(c_ctx,client_cert,
+               SSL_CTX_use_PrivateKey_file(c_ctx,
+                       (client_key?client_key:client_cert),
                        SSL_FILETYPE_PEM);
                }
 
@@ -415,21 +486,38 @@ bad:
                {
                if (!reuse) SSL_set_session(c_ssl,NULL);
                if (bio_pair)
-                       ret=doit_biopair(s_ssl,c_ssl,bytes);
+                       ret=doit_biopair(s_ssl,c_ssl,bytes,&s_time,&c_time);
                else
                        ret=doit(s_ssl,c_ssl,bytes);
                }
 
        if (!verbose)
                {
-               ciph=SSL_get_current_cipher(c_ssl);
-               BIO_printf(bio_stdout,"Protocol %s, cipher %s, %s\n",
-                       SSL_get_version(c_ssl),
-                       SSL_CIPHER_get_version(ciph),
-                       SSL_CIPHER_get_name(ciph));
+               print_details(c_ssl, "");
                }
        if ((number > 1) || (bytes > 1L))
                BIO_printf(bio_stdout, "%d handshakes of %ld bytes done\n",number,bytes);
+       if (print_time)
+               {
+#ifdef CLOCKS_PER_SEC
+               /* "To determine the time in seconds, the value returned
+                * by the clock function should be divided by the value
+                * of the macro CLOCKS_PER_SEC."
+                *                                       -- ISO/IEC 9899 */
+               BIO_printf(bio_stdout, "Approximate total server time: %6.2f s\n"
+                       "Approximate total client time: %6.2f s\n",
+                       (double)s_time/CLOCKS_PER_SEC,
+                       (double)c_time/CLOCKS_PER_SEC);
+#else
+               /* "`CLOCKS_PER_SEC' undeclared (first use this function)"
+                *                            -- cc on NeXTstep/OpenStep */
+               BIO_printf(bio_stdout,
+                       "Approximate total server time: %6.2f units\n"
+                       "Approximate total client time: %6.2f units\n",
+                       (double)s_time,
+                       (double)c_time);
+#endif
+               }
 
        SSL_free(s_ssl);
        SSL_free(c_ssl);
@@ -448,12 +536,12 @@ end:
        EXIT(ret);
        }
 
-int doit_biopair(SSL *s_ssl, SSL *c_ssl, long count)
+int doit_biopair(SSL *s_ssl, SSL *c_ssl, long count,
+       clock_t *s_time, clock_t *c_time)
        {
        long cw_num = count, cr_num = count, sw_num = count, sr_num = count;
        BIO *s_ssl_bio = NULL, *c_ssl_bio = NULL;
        BIO *server = NULL, *server_io = NULL, *client = NULL, *client_io = NULL;
-       SSL_CIPHER *ciph;
        int ret = 1;
        
        size_t bufsiz = 256; /* small buffer for testing */
@@ -526,6 +614,7 @@ int doit_biopair(SSL *s_ssl, SSL *c_ssl, long count)
                
                        MS_STATIC char cbuf[1024*8];
                        int i, r;
+                       clock_t c_clock = clock();
 
                        if (debug)
                                if (SSL_in_init(c_ssl))
@@ -592,6 +681,16 @@ int doit_biopair(SSL *s_ssl, SSL *c_ssl, long count)
                                        cr_num -= r;
                                        }
                                }
+
+                       /* c_time and s_time increments will typically be very small
+                        * (depending on machine speed and clock tick intervals),
+                        * but sampling over a large number of connections should
+                        * result in fairly accurate figures.  We cannot guarantee
+                        * a lot, however -- if each connection lasts for exactly
+                        * one clock tick, it will be counted only for the client
+                        * or only for the server or even not at all.
+                        */
+                       *c_time += (clock() - c_clock);
                        }
 
                        {
@@ -599,6 +698,7 @@ int doit_biopair(SSL *s_ssl, SSL *c_ssl, long count)
                
                        MS_STATIC char sbuf[1024*8];
                        int i, r;
+                       clock_t s_clock = clock();
 
                        if (debug)
                                if (SSL_in_init(s_ssl))
@@ -662,6 +762,8 @@ int doit_biopair(SSL *s_ssl, SSL *c_ssl, long count)
                                        sr_num -= r;
                                        }
                                }
+
+                       *s_time += (clock() - s_clock);
                        }
                        
                        {
@@ -787,13 +889,9 @@ int doit_biopair(SSL *s_ssl, SSL *c_ssl, long count)
                }
        while (cw_num > 0 || cr_num > 0 || sw_num > 0 || sr_num > 0);
 
-       ciph = SSL_get_current_cipher(c_ssl);
        if (verbose)
-               fprintf(stdout,"DONE via BIO pair, protocol %s, cipher %s, %s\n",
-                       SSL_get_version(c_ssl),
-                       SSL_CIPHER_get_version(ciph),
-                       SSL_CIPHER_get_name(ciph));
- end:
+               print_details(c_ssl, "DONE via BIO pair: ");
+end:
        ret = 0;
 
  err:
@@ -837,7 +935,6 @@ int doit(SSL *s_ssl, SSL *c_ssl, long count)
        int done=0;
        int c_write,s_write;
        int do_server=0,do_client=0;
-       SSL_CIPHER *ciph;
 
        c_to_s=BIO_new(BIO_s_mem());
        s_to_c=BIO_new(BIO_s_mem());
@@ -1087,12 +1184,8 @@ int doit(SSL *s_ssl, SSL *c_ssl, long count)
                if ((done & S_DONE) && (done & C_DONE)) break;
                }
 
-       ciph=SSL_get_current_cipher(c_ssl);
        if (verbose)
-               fprintf(stdout,"DONE, protocol %s, cipher %s, %s\n",
-                       SSL_get_version(c_ssl),
-                       SSL_CIPHER_get_version(ciph),
-                       SSL_CIPHER_get_name(ciph));
+               print_details(c_ssl, "DONE: ");
        ret=0;
 err:
        /* We have to set the BIO's to NULL otherwise they will be
@@ -1148,32 +1241,6 @@ static int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx)
        return(ok);
        }
 
-#ifndef NO_DH
-static unsigned char dh512_p[]={
-       0xDA,0x58,0x3C,0x16,0xD9,0x85,0x22,0x89,0xD0,0xE4,0xAF,0x75,
-       0x6F,0x4C,0xCA,0x92,0xDD,0x4B,0xE5,0x33,0xB8,0x04,0xFB,0x0F,
-       0xED,0x94,0xEF,0x9C,0x8A,0x44,0x03,0xED,0x57,0x46,0x50,0xD3,
-       0x69,0x99,0xDB,0x29,0xD7,0x76,0x27,0x6B,0xA2,0xD3,0xD4,0x12,
-       0xE2,0x18,0xF4,0xDD,0x1E,0x08,0x4C,0xF6,0xD8,0x00,0x3E,0x7C,
-       0x47,0x74,0xE8,0x33,
-       };
-static unsigned char dh512_g[]={
-       0x02,
-       };
-
-static DH *get_dh512(void)
-       {
-       DH *dh=NULL;
-
-       if ((dh=DH_new()) == NULL) return(NULL);
-       dh->p=BN_bin2bn(dh512_p,sizeof(dh512_p),NULL);
-       dh->g=BN_bin2bn(dh512_g,sizeof(dh512_g),NULL);
-       if ((dh->p == NULL) || (dh->g == NULL))
-               return(NULL);
-       return(dh);
-       }
-#endif
-
 #ifndef NO_RSA
 static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export, int keylength)
        {
@@ -1191,23 +1258,100 @@ static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export, int keylength)
        }
 #endif
 
-#ifndef NO_DSA
-static void MS_CALLBACK dsa_cb(int p, int n, void *arg)
+#ifndef NO_DH
+/* These DH parameters have been generated as follows:
+ *    $ openssl dhparam -C -noout 512
+ *    $ openssl dhparam -C -noout 1024
+ *    $ openssl dhparam -C -noout -dsaparam 1024
+ * (The third function has been renamed to avoid name conflicts.)
+ */
+DH *get_dh512()
        {
-       char c='*';
-       static int ok=0,num=0;
+       static unsigned char dh512_p[]={
+               0xCB,0xC8,0xE1,0x86,0xD0,0x1F,0x94,0x17,0xA6,0x99,0xF0,0xC6,
+               0x1F,0x0D,0xAC,0xB6,0x25,0x3E,0x06,0x39,0xCA,0x72,0x04,0xB0,
+               0x6E,0xDA,0xC0,0x61,0xE6,0x7A,0x77,0x25,0xE8,0x3B,0xB9,0x5F,
+               0x9A,0xB6,0xB5,0xFE,0x99,0x0B,0xA1,0x93,0x4E,0x35,0x33,0xB8,
+               0xE1,0xF1,0x13,0x4F,0x59,0x1A,0xD2,0x57,0xC0,0x26,0x21,0x33,
+               0x02,0xC5,0xAE,0x23,
+               };
+       static unsigned char dh512_g[]={
+               0x02,
+               };
+       DH *dh;
 
-       if (p == 0) { c='.'; num++; };
-       if (p == 1) c='+';
-       if (p == 2) { c='*'; ok++; }
-       if (p == 3) c='\n';
-       BIO_write(arg,&c,1);
-       (void)BIO_flush(arg);
+       if ((dh=DH_new()) == NULL) return(NULL);
+       dh->p=BN_bin2bn(dh512_p,sizeof(dh512_p),NULL);
+       dh->g=BN_bin2bn(dh512_g,sizeof(dh512_g),NULL);
+       if ((dh->p == NULL) || (dh->g == NULL))
+               { DH_free(dh); return(NULL); }
+       return(dh);
+       }
 
-       if (!ok && (p == 0) && (num > 1))
-               {
-               BIO_printf((BIO *)arg,"error in dsatest\n");
-               exit(1);
-               }
+DH *get_dh1024()
+       {
+       static unsigned char dh1024_p[]={
+               0xF8,0x81,0x89,0x7D,0x14,0x24,0xC5,0xD1,0xE6,0xF7,0xBF,0x3A,
+               0xE4,0x90,0xF4,0xFC,0x73,0xFB,0x34,0xB5,0xFA,0x4C,0x56,0xA2,
+               0xEA,0xA7,0xE9,0xC0,0xC0,0xCE,0x89,0xE1,0xFA,0x63,0x3F,0xB0,
+               0x6B,0x32,0x66,0xF1,0xD1,0x7B,0xB0,0x00,0x8F,0xCA,0x87,0xC2,
+               0xAE,0x98,0x89,0x26,0x17,0xC2,0x05,0xD2,0xEC,0x08,0xD0,0x8C,
+               0xFF,0x17,0x52,0x8C,0xC5,0x07,0x93,0x03,0xB1,0xF6,0x2F,0xB8,
+               0x1C,0x52,0x47,0x27,0x1B,0xDB,0xD1,0x8D,0x9D,0x69,0x1D,0x52,
+               0x4B,0x32,0x81,0xAA,0x7F,0x00,0xC8,0xDC,0xE6,0xD9,0xCC,0xC1,
+               0x11,0x2D,0x37,0x34,0x6C,0xEA,0x02,0x97,0x4B,0x0E,0xBB,0xB1,
+               0x71,0x33,0x09,0x15,0xFD,0xDD,0x23,0x87,0x07,0x5E,0x89,0xAB,
+               0x6B,0x7C,0x5F,0xEC,0xA6,0x24,0xDC,0x53,
+               };
+       static unsigned char dh1024_g[]={
+               0x02,
+               };
+       DH *dh;
+
+       if ((dh=DH_new()) == NULL) return(NULL);
+       dh->p=BN_bin2bn(dh1024_p,sizeof(dh1024_p),NULL);
+       dh->g=BN_bin2bn(dh1024_g,sizeof(dh1024_g),NULL);
+       if ((dh->p == NULL) || (dh->g == NULL))
+               { DH_free(dh); return(NULL); }
+       return(dh);
+       }
+
+DH *get_dh1024dsa()
+       {
+       static unsigned char dh1024_p[]={
+               0xC8,0x00,0xF7,0x08,0x07,0x89,0x4D,0x90,0x53,0xF3,0xD5,0x00,
+               0x21,0x1B,0xF7,0x31,0xA6,0xA2,0xDA,0x23,0x9A,0xC7,0x87,0x19,
+               0x3B,0x47,0xB6,0x8C,0x04,0x6F,0xFF,0xC6,0x9B,0xB8,0x65,0xD2,
+               0xC2,0x5F,0x31,0x83,0x4A,0xA7,0x5F,0x2F,0x88,0x38,0xB6,0x55,
+               0xCF,0xD9,0x87,0x6D,0x6F,0x9F,0xDA,0xAC,0xA6,0x48,0xAF,0xFC,
+               0x33,0x84,0x37,0x5B,0x82,0x4A,0x31,0x5D,0xE7,0xBD,0x52,0x97,
+               0xA1,0x77,0xBF,0x10,0x9E,0x37,0xEA,0x64,0xFA,0xCA,0x28,0x8D,
+               0x9D,0x3B,0xD2,0x6E,0x09,0x5C,0x68,0xC7,0x45,0x90,0xFD,0xBB,
+               0x70,0xC9,0x3A,0xBB,0xDF,0xD4,0x21,0x0F,0xC4,0x6A,0x3C,0xF6,
+               0x61,0xCF,0x3F,0xD6,0x13,0xF1,0x5F,0xBC,0xCF,0xBC,0x26,0x9E,
+               0xBC,0x0B,0xBD,0xAB,0x5D,0xC9,0x54,0x39,
+               };
+       static unsigned char dh1024_g[]={
+               0x3B,0x40,0x86,0xE7,0xF3,0x6C,0xDE,0x67,0x1C,0xCC,0x80,0x05,
+               0x5A,0xDF,0xFE,0xBD,0x20,0x27,0x74,0x6C,0x24,0xC9,0x03,0xF3,
+               0xE1,0x8D,0xC3,0x7D,0x98,0x27,0x40,0x08,0xB8,0x8C,0x6A,0xE9,
+               0xBB,0x1A,0x3A,0xD6,0x86,0x83,0x5E,0x72,0x41,0xCE,0x85,0x3C,
+               0xD2,0xB3,0xFC,0x13,0xCE,0x37,0x81,0x9E,0x4C,0x1C,0x7B,0x65,
+               0xD3,0xE6,0xA6,0x00,0xF5,0x5A,0x95,0x43,0x5E,0x81,0xCF,0x60,
+               0xA2,0x23,0xFC,0x36,0xA7,0x5D,0x7A,0x4C,0x06,0x91,0x6E,0xF6,
+               0x57,0xEE,0x36,0xCB,0x06,0xEA,0xF5,0x3D,0x95,0x49,0xCB,0xA7,
+               0xDD,0x81,0xDF,0x80,0x09,0x4A,0x97,0x4D,0xA8,0x22,0x72,0xA1,
+               0x7F,0xC4,0x70,0x56,0x70,0xE8,0x20,0x10,0x18,0x8F,0x2E,0x60,
+               0x07,0xE7,0x68,0x1A,0x82,0x5D,0x32,0xA2,
+               };
+       DH *dh;
+
+       if ((dh=DH_new()) == NULL) return(NULL);
+       dh->p=BN_bin2bn(dh1024_p,sizeof(dh1024_p),NULL);
+       dh->g=BN_bin2bn(dh1024_g,sizeof(dh1024_g),NULL);
+       if ((dh->p == NULL) || (dh->g == NULL))
+               { DH_free(dh); return(NULL); }
+       dh->length = 160;
+       return(dh);
        }
 #endif
index e3818ef..f611d6b 100644 (file)
@@ -2227,3 +2227,6 @@ BIO_callback_ctrl                       2252
 RAND_egd                                2253
 RAND_status                             2254
 bn_dump1                                2255
+des_check_key_parity                    2256
+lh_num_items                            2257
+RAND_event                              2258
index 6fbf3ce..100d76f 100644 (file)
@@ -8,6 +8,7 @@
 $INSTALLTOP="/usr/local/ssl";
 $OPTIONS="";
 $ssl_version="";
+$banner="\t\@echo Building OpenSSL";
 
 open(IN,"<Makefile.ssl") || die "unable to open Makefile.ssl!\n";
 while(<IN>) {
@@ -59,6 +60,7 @@ and [options] can be one of
        just-ssl                                - remove all non-ssl keys/digest
        no-asm                                  - No x86 asm
        nasm                                    - Use NASM for x86 asm
+       gaswin                                  - Use GNU as with Mingw32
        no-socks                                - No socket code
        no-err                                  - No error strings
        dll/shlib                               - Build shared libraries (MS)
@@ -850,6 +852,7 @@ sub read_options
        elsif (/^no-hmac$/)     { $no_hmac=1; }
        elsif (/^no-asm$/)      { $no_asm=1; }
        elsif (/^nasm$/)        { $nasm=1; }
+       elsif (/^gaswin$/)      { $gaswin=1; }
        elsif (/^no-ssl2$/)     { $no_ssl2=1; }
        elsif (/^no-ssl3$/)     { $no_ssl3=1; }
        elsif (/^no-err$/)      { $no_err=1; }
index ebc059e..8e18f3c 100644 (file)
@@ -284,6 +284,17 @@ EOF
 
        # Rewrite the C source file containing the error details.
 
+       # First, read any existing reason string definitions:
+       my %err_reason_strings;
+       if (open(IN,"<$cfile")) {
+               while (<IN>) {
+                       if (/\b(${lib}_R_\w*)\b.*\"(.*)\"/) {
+                               $err_reason_strings{$1} = $2;
+                       }
+               }
+               close(IN);
+       }
+
        my $hincf;
        if($static) {
                $hfile =~ /([^\/]+)$/;
@@ -352,7 +363,8 @@ EOF
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
@@ -385,9 +397,13 @@ EOF
        foreach $i (@reasons) {
                my $rn;
                my $nspc = 0;
-               $i =~ /^${lib}_R_(\S+)$/;
-               $rn = $1;
-               $rn =~ tr/_[A-Z]/ [a-z]/;
+               if (exists $err_reason_strings{$i}) {
+                       $rn = $err_reason_strings{$i};
+               } else {
+                       $i =~ /^${lib}_R_(\S+)$/;
+                       $rn = $1;
+                       $rn =~ tr/_[A-Z]/ [a-z]/;
+               }
                $nspc = 40 - length($i) unless length($i) > 40;
                $nspc = " " x $nspc;
                print OUT "{${i}${nspc},\"$rn\"},\n";
@@ -465,7 +481,7 @@ EOF
 }
 
        close OUT;
-
+       undef %err_reason_strings;
 }
 
 if($debug && defined(%notrans)) {
index df6e2c7..7f57809 100644 (file)
@@ -109,7 +109,7 @@ sub do_lib_rule
                {
                #               $ret.="\t\$(RM) \$(O_$Name)\n";
                $ret.="\techo LIB $<\n";    
-               $ret.="\t\$(MKLIB) $lfile$target  \$(addprefix +, $objs)\n";
+                $ret.="\t&\$(MKLIB) $lfile$target -+\$**\n";
                }
        else
                {
index 585cacd..c687d9b 100644 (file)
@@ -21,6 +21,30 @@ if ($debug)
 else
        { $cflags="-DL_ENDIAN -fomit-frame-pointer -O3 -m486 -Wall"; }
 
+if ($gaswin and !$no_asm)
+       {
+        $bn_asm_obj='$(OBJ_D)/bn-win32.o';
+        $bn_asm_src='crypto/bn/asm/bn-win32.s';
+        $des_enc_obj='$(OBJ_D)/d-win32.o $(OBJ_D)/y-win32.o';
+        $des_enc_src='crypto/des/asm/d-win32.s crypto/des/asm/y-win32.s';
+        $bf_enc_obj='$(OBJ_D)/b-win32.o';
+        $bf_enc_src='crypto/bf/asm/b-win32.s';
+#       $cast_enc_obj='$(OBJ_D)/c-win32.o';
+#       $cast_enc_src='crypto/cast/asm/c-win32.s';
+        $rc4_enc_obj='$(OBJ_D)/r4-win32.o';
+        $rc4_enc_src='crypto/rc4/asm/r4-win32.s';
+        $rc5_enc_obj='$(OBJ_D)/r5-win32.o';
+        $rc5_enc_src='crypto/rc5/asm/r5-win32.s';
+        $md5_asm_obj='$(OBJ_D)/m5-win32.o';
+        $md5_asm_src='crypto/md5/asm/m5-win32.s';
+        $rmd160_asm_obj='$(OBJ_D)/rm-win32.o';
+        $rmd160_asm_src='crypto/ripemd/asm/rm-win32.s';
+        $sha1_asm_obj='$(OBJ_D)/s1-win32.o';
+        $sha1_asm_src='crypto/sha/asm/s1-win32.s';
+       $cflags.=" -DBN_ASM -DMD5_ASM -DSHA1_ASM";
+       }
+
+
 $obj='.o';
 $ofile='-o ';
 
@@ -76,4 +100,3 @@ sub do_link_rule
        return($ret);
        }
 1;
-
index 91e962a..04b4425 100644 (file)
@@ -25,7 +25,7 @@ open(OUT,">$report") or die;
 print OUT "OpenSSL self-test report:\n\n";
 
 $uname=`uname -a`;
-$uname="??" if $uname eq "";
+$uname="??\n" if $uname eq "";
 
 $c=`sh config -t`;
 foreach $_ (split("\n",$c)) {
@@ -83,6 +83,11 @@ if (open(TEST,">cctest.c")) {
        print OUT "Compiler doesn't work.\n";
        goto err;
     }
+    system("ar r cctest.a /dev/null");
+    if (not -f "cctest.a") {
+       print OUT "Check your archive tool (ar).\n";
+       goto err;
+    }
 } else {
     print OUT "Can't create cctest.c\n";
 }
@@ -129,14 +134,14 @@ if (/no-/)
 }
 
 print "Running make test...\n";
-if (system("make test 2>&1 | tee make.log") > 255)
+if (system("make test 2>&1 | tee maketest.log") > 255)
  {
     print OUT "make test failed!\n";
 } else {
     $ok=1;
 }
 
-if ($ok and open(IN,"<make.log")) {
+if ($ok and open(IN,"<maketest.log")) {
     while (<IN>) {
        $ok=2 if /^platform: $platform/;
     }
@@ -155,6 +160,15 @@ if ($ok != 2) {
     } else {
        print OUT "make.log not found!\n";
     }
+    if (open(IN,"<maketest.log")) {
+       while (<IN>) {
+           print OUT;
+       }
+       close(IN);
+       print OUT $sep;
+    } else {
+       print OUT "maketest.log not found!\n";
+    }
 } else {
     print OUT "Test passed.\n";
 }
index 34c2c9f..e69de29 100644 (file)
@@ -1,34 +0,0 @@
-#!/bin/sh
-
-cwd=`pwd`
-/bin/rm -fr tmp/*
-
-cd crypto/des
-make -f Makefile.uni tar
-make -f Makefile.uni tar_lit
-/bin/mv libdes.tgz $cwd/tmp
-/bin/mv libdes-l.tgz $cwd/tmp
-cd $cwd
-
-for name in md5 sha cast bf idea rc4 rc2
-do
-       echo doing $name
-       (cd crypto; tar cfh - $name)|(cd tmp; tar xf -)
-       cd tmp/$name
-       /bin/rm -f Makefile
-       /bin/rm -f Makefile.ssl
-       /bin/rm -f Makefile.ssl.orig
-       /bin/rm -f *.old
-       /bin/mv Makefile.uni Makefile
-
-       if [ -d asm ]; then
-               mkdir asm/perlasm
-               cp $cwd/crypto/perlasm/*.pl asm/perlasm
-       fi
-       cd ..
-       tar cf - $name|gzip >$name.tgz
-#      /bin/rm -fr $name
-       cd $cwd
-done
-
-
index f29f775..bb846f4 100644 (file)
@@ -391,9 +391,8 @@ struct ssl_ctx_st
         * SSL_SESSION_free() when it has finished using it.  Otherwise,
         * on 0, it means the callback has finished with it.
         * If remove_session_cb is not null, it will be called when
-        * a session-id is removed from the cache.  Again, a return
-        * of 0 mens that SSLeay should not SSL_SESSION_free() since
-        * the application is doing something with it. */
+        * a session-id is removed from the cache.  After the call,
+        * OpenSSL will SSL_SESSION_free() it. */
        int (*new_session_cb)(struct ssl_st *ssl,SSL_SESSION *sess);
        void (*remove_session_cb)(struct ssl_ctx_st *ctx,SSL_SESSION *sess);
        SSL_SESSION *(*get_session_cb)(struct ssl_st *ssl,
@@ -1215,6 +1214,7 @@ int SSL_COMP_add_compression_method(int id,char *cm);
 #define SSL_F_SSL2_SET_CERTIFICATE                      126
 #define SSL_F_SSL2_WRITE                                127
 #define SSL_F_SSL3_ACCEPT                               128
+#define SSL_F_SSL3_CALLBACK_CTRL                        233
 #define SSL_F_SSL3_CHANGE_CIPHER_STATE                  129
 #define SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM             130
 #define SSL_F_SSL3_CLIENT_HELLO                                 131
index 48f247c..0596b7c 100644 (file)
@@ -191,16 +191,33 @@ CERT *ssl_cert_dup(CERT *cert)
 #ifndef NO_DH
        if (cert->dh_tmp != NULL)
                {
-               /* DH parameters don't have a reference count (and cannot
-                * reasonably be shared anyway, as the secret exponent may
-                * be created just when it is needed -- earlier library
-                * versions did not pay attention to this) */
+               /* DH parameters don't have a reference count */
                ret->dh_tmp = DHparams_dup(cert->dh_tmp);
                if (ret->dh_tmp == NULL)
                        {
-                       SSLerr(SSL_F_SSL_CERT_NEW, ERR_R_DH_LIB);
+                       SSLerr(SSL_F_SSL_CERT_DUP, ERR_R_DH_LIB);
                        goto err;
                        }
+               if (cert->dh_tmp->priv_key)
+                       {
+                       BIGNUM *b = BN_dup(cert->dh_tmp->priv_key);
+                       if (!b)
+                               {
+                               SSLerr(SSL_F_SSL_CERT_DUP, ERR_R_BN_LIB);
+                               goto err;
+                               }
+                       ret->dh_tmp->priv_key = b;
+                       }
+               if (cert->dh_tmp->pub_key)
+                       {
+                       BIGNUM *b = BN_dup(cert->dh_tmp->pub_key);
+                       if (!b)
+                               {
+                               SSLerr(SSL_F_SSL_CERT_DUP, ERR_R_BN_LIB);
+                               goto err;
+                               }
+                       ret->dh_tmp->pub_key = b;
+                       }
                }
        ret->dh_tmp_cb = cert->dh_tmp_cb;
 #endif
index 1cbc288..7436a50 100644 (file)
@@ -607,7 +607,7 @@ static int ssl_cipher_process_rulestr(const char *rule_str,
                        if (buflen == 0)
                                {
                                /*
-                                * We hit something, we cannot deal with,
+                                * We hit something we cannot deal with,
                                 * it is no command or separator nor
                                 * alphanumeric, so we call this an error.
                                 */
@@ -620,6 +620,7 @@ static int ssl_cipher_process_rulestr(const char *rule_str,
 
                        if (rule == CIPHER_SPECIAL)
                                {
+                               found = 0; /* unused -- avoid compiler warning */
                                break;  /* special treatment */
                                }
 
@@ -633,12 +634,12 @@ static int ssl_cipher_process_rulestr(const char *rule_str,
                                multi=0;
 
                        /*
-                        * Now search for the name in the ca_list. Be careful
+                        * Now search for the cipher alias in the ca_list. Be careful
                         * with the strncmp, because the "buflen" limitation
                         * will make the rule "ADH:SOME" and the cipher
                         * "ADH-MY-CIPHER" look like a match for buflen=3.
-                        * So additionally check, whether the cipher name found
-                        * has the correct length. We can save a strlen() call,
+                        * So additionally check whether the cipher name found
+                        * has the correct length. We can save a strlen() call:
                         * just checking for the '\0' at the right place is
                         * sufficient, we have to strncmp() anyway.
                         */
@@ -665,42 +666,42 @@ static int ssl_cipher_process_rulestr(const char *rule_str,
                        if (!multi) break;
                        }
 
+               /*
+                * Ok, we have the rule, now apply it
+                */
+               if (rule == CIPHER_SPECIAL)
+                       {       /* special command */
+                       ok = 0;
+                       if ((buflen == 8) &&
+                               !strncmp(buf, "STRENGTH", 8))
+                               ok = ssl_cipher_strength_sort(list,
+                                       head_p, tail_p);
+                       else
+                               SSLerr(SSL_F_SSL_CIPHER_PROCESS_RULESTR,
+                                       SSL_R_INVALID_COMMAND);
+                       if (ok == 0)
+                               retval = 0;
                        /*
-                        * Ok, we have the rule, now apply it
+                        * We do not support any "multi" options
+                        * together with "@", so throw away the
+                        * rest of the command, if any left, until
+                        * end or ':' is found.
                         */
-                       if (rule == CIPHER_SPECIAL)
-                               {       /* special command */
-                               ok = 0;
-                               if ((buflen == 8) &&
-                                       !strncmp(buf, "STRENGTH", 8))
-                                       ok = ssl_cipher_strength_sort(list,
-                                                       head_p, tail_p);
-                               else
-                                       SSLerr(SSL_F_SSL_CIPHER_PROCESS_RULESTR,
-                                               SSL_R_INVALID_COMMAND);
-                               if (ok == 0)
-                                       retval = 0;
-                               /*
-                                * We do not support any "multi" options
-                                * together with "@", so throw away the
-                                * rest of the command, if any left, until
-                                * end or ':' is found.
-                                */
-                               while ((*l != '\0') && ITEM_SEP(*l))
-                                       l++;
-                               }
-                       else if (found)
-                               {
-                               ssl_cipher_apply_rule(algorithms, mask,
-                                       algo_strength, mask_strength, rule, -1,
-                                       list, head_p, tail_p);
-                               }
-                       else
-                               {
-                               while ((*l != '\0') && ITEM_SEP(*l))
-                                       l++;
-                               }
-                       if (*l == '\0') break; /* done */
+                       while ((*l != '\0') && ITEM_SEP(*l))
+                               l++;
+                       }
+               else if (found)
+                       {
+                       ssl_cipher_apply_rule(algorithms, mask,
+                               algo_strength, mask_strength, rule, -1,
+                               list, head_p, tail_p);
+                       }
+               else
+                       {
+                       while ((*l != '\0') && ITEM_SEP(*l))
+                               l++;
+                       }
+               if (*l == '\0') break; /* done */
                }
 
        return(retval);
index 5618e34..642c3f9 100644 (file)
@@ -54,7 +54,8 @@
  */
 
 /* NOTE: this file was auto generated by the mkerr.pl script: any changes
- * made to it will be overwritten when the script next updates this file.
+ * made to it will be overwritten when the script next updates this file,
+ * only reason strings will be preserved.
  */
 
 #include <stdio.h>
@@ -94,6 +95,7 @@ static ERR_STRING_DATA SSL_str_functs[]=
 {ERR_PACK(0,SSL_F_SSL2_SET_CERTIFICATE,0),     "SSL2_SET_CERTIFICATE"},
 {ERR_PACK(0,SSL_F_SSL2_WRITE,0),       "SSL2_WRITE"},
 {ERR_PACK(0,SSL_F_SSL3_ACCEPT,0),      "SSL3_ACCEPT"},
+{ERR_PACK(0,SSL_F_SSL3_CALLBACK_CTRL,0),       "SSL3_CALLBACK_CTRL"},
 {ERR_PACK(0,SSL_F_SSL3_CHANGE_CIPHER_STATE,0), "SSL3_CHANGE_CIPHER_STATE"},
 {ERR_PACK(0,SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,0),    "SSL3_CHECK_CERT_AND_ALGORITHM"},
 {ERR_PACK(0,SSL_F_SSL3_CLIENT_HELLO,0),        "SSL3_CLIENT_HELLO"},
index 3109708..c515c41 100644 (file)
@@ -599,6 +599,9 @@ STACK_OF(X509) *SSL_get_peer_cert_chain(SSL *s)
        else
                r=s->session->sess_cert->cert_chain;
 
+       /* If we are a client, cert_chain includes the peer's own
+        * certificate; if we are a server, it does not. */
+       
        return(r);
        }
 
index 7e27857..c07d957 100644 (file)
@@ -164,7 +164,7 @@ int SSL_SESSION_print(BIO *bp, SSL_SESSION *x)
                }
        if (BIO_puts(bp,"\n") <= 0) goto err;
 
-       if (BIO_puts(bp, "    Verify return code ") <= 0) goto err;
+       if (BIO_puts(bp, "    Verify return code: ") <= 0) goto err;
        sprintf(str, "%ld (%s)\n", x->verify_result, 
                        X509_verify_cert_error_string(x->verify_result));
        if (BIO_puts(bp,str) <= 0) goto err;