From: beck Date: Sat, 15 Apr 2000 06:18:28 +0000 (+0000) Subject: OpenSSL 0.9.5a merge X-Git-Url: http://artulab.com/gitweb/?a=commitdiff_plain;h=f6e3f26248a24c86023ecf5715f4f93988bb2af0;p=openbsd OpenSSL 0.9.5a merge --- diff --git a/lib/libcrypto/Makefile b/lib/libcrypto/Makefile index 24b7f32fdda..b980f54dba1 100644 --- a/lib/libcrypto/Makefile +++ b/lib/libcrypto/Makefile @@ -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) diff --git a/lib/libcrypto/Makefile.ssl b/lib/libcrypto/Makefile.ssl index cab75d9f802..f9b33586be3 100644 --- a/lib/libcrypto/Makefile.ssl +++ b/lib/libcrypto/Makefile.ssl @@ -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) diff --git a/lib/libcrypto/asn1/asn1_err.c b/lib/libcrypto/asn1/asn1_err.c index b1838142423..cecd555c882 100644 --- a/lib/libcrypto/asn1/asn1_err.c +++ b/lib/libcrypto/asn1/asn1_err.c @@ -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 diff --git a/lib/libcrypto/asn1/p5_pbe.c b/lib/libcrypto/asn1/p5_pbe.c index 64e90237cc1..a147ac32953 100644 --- a/lib/libcrypto/asn1/p5_pbe.c +++ b/lib/libcrypto/asn1/p5_pbe.c @@ -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())) { diff --git a/lib/libcrypto/asn1/p5_pbev2.c b/lib/libcrypto/asn1/p5_pbev2.c index 4ce06a94ab9..1bbdb10c716 100644 --- a/lib/libcrypto/asn1/p5_pbev2.c +++ b/lib/libcrypto/asn1/p5_pbev2.c @@ -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; diff --git a/lib/libcrypto/asn1/t_req.c b/lib/libcrypto/asn1/t_req.c index 81dd6355a88..ea1af092db3 100644 --- a/lib/libcrypto/asn1/t_req.c +++ b/lib/libcrypto/asn1/t_req.c @@ -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",""); diff --git a/lib/libcrypto/asn1/x_pubkey.c b/lib/libcrypto/asn1/x_pubkey.c index 81e9815222a..7a05d575c99 100644 --- a/lib/libcrypto/asn1/x_pubkey.c +++ b/lib/libcrypto/asn1/x_pubkey.c @@ -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); diff --git a/lib/libcrypto/bf/Makefile.ssl b/lib/libcrypto/bf/Makefile.ssl index 15f6a639878..cf2f7dd48e2 100644 --- a/lib/libcrypto/bf/Makefile.ssl +++ b/lib/libcrypto/bf/Makefile.ssl @@ -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: diff --git a/lib/libcrypto/bf/Makefile.uni b/lib/libcrypto/bf/Makefile.uni index f67e5ca23bc..e69de29bb2d 100644 --- a/lib/libcrypto/bf/Makefile.uni +++ b/lib/libcrypto/bf/Makefile.uni @@ -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. diff --git a/lib/libcrypto/bf/asm/b-win32.asm b/lib/libcrypto/bf/asm/b-win32.asm index 138c99d0aaf..e69de29bb2d 100644 --- a/lib/libcrypto/bf/asm/b-win32.asm +++ b/lib/libcrypto/bf/asm/b-win32.asm @@ -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 - ; - 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 diff --git a/lib/libcrypto/bio/Makefile.ssl b/lib/libcrypto/bio/Makefile.ssl index 2e7480ead9d..755f255fe4b 100644 --- a/lib/libcrypto/bio/Makefile.ssl +++ b/lib/libcrypto/bio/Makefile.ssl @@ -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 diff --git a/lib/libcrypto/bio/b_print.c b/lib/libcrypto/bio/b_print.c index 2a5e8b58c9c..b11b501512b 100644 --- a/lib/libcrypto/bio/b_print.c +++ b/lib/libcrypto/bio/b_print.c @@ -64,6 +64,8 @@ #include #include #include +#include +#include #include "cryptlib.h" #ifndef NO_SYS_TYPES_H #include @@ -72,12 +74,16 @@ #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 diff --git a/lib/libcrypto/bio/bio.h b/lib/libcrypto/bio/bio.h index bc08401eebf..ebdb18170ba 100644 --- a/lib/libcrypto/bio/bio.h +++ b/lib/libcrypto/bio/bio.h @@ -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)()); diff --git a/lib/libcrypto/bio/bio_err.c b/lib/libcrypto/bio/bio_err.c index b5f07de5a05..f38e7b91786 100644 --- a/lib/libcrypto/bio/bio_err.c +++ b/lib/libcrypto/bio/bio_err.c @@ -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 diff --git a/lib/libcrypto/bio/bio_lib.c b/lib/libcrypto/bio/bio_lib.c index cf8e6150fd5..e88dcc80f3d 100644 --- a/lib/libcrypto/bio/bio_lib.c +++ b/lib/libcrypto/bio/bio_lib.c @@ -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)(); diff --git a/lib/libcrypto/bio/bss_bio.c b/lib/libcrypto/bio/bss_bio.c index 0d0f9356f7d..1e2d7491f2c 100644 --- a/lib/libcrypto/bio/bss_bio.c +++ b/lib/libcrypto/bio/bss_bio.c @@ -19,8 +19,14 @@ #include #include +#include #include +#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); diff --git a/lib/libcrypto/bio/bss_log.c b/lib/libcrypto/bio/bss_log.c index 4308b196633..497eb1af72b 100644 --- a/lib/libcrypto/bio/bss_log.c +++ b/lib/libcrypto/bio/bss_log.c @@ -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). */ @@ -66,29 +66,58 @@ #include #include -#ifndef WIN32 -#ifdef __ultrix -#include -#else -#include -#endif -#else -#include +#if defined(WIN32) +# include +#elif defined(VMS) || defined(__VMS) +# include +# include +# include +# include +#elif defined(__ultrix) +# include +#elif !defined(MSDOS) /* Unix */ +# include #endif #include "cryptlib.h" #include #include + #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 */ diff --git a/lib/libcrypto/bn/Makefile.ssl b/lib/libcrypto/bn/Makefile.ssl index fa23a43fa0c..beb9c1b5231 100644 --- a/lib/libcrypto/bn/Makefile.ssl +++ b/lib/libcrypto/bn/Makefile.ssl @@ -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 diff --git a/lib/libcrypto/bn/asm/bn-win32.asm b/lib/libcrypto/bn/asm/bn-win32.asm index 871bd88d77f..e69de29bb2d 100644 --- a/lib/libcrypto/bn/asm/bn-win32.asm +++ b/lib/libcrypto/bn/asm/bn-win32.asm @@ -1,2122 +0,0 @@ - ; 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 - ; - 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 diff --git a/lib/libcrypto/bn/asm/x86w16.asm b/lib/libcrypto/bn/asm/x86w16.asm index 80a9ed6eef1..e69de29bb2d 100644 --- a/lib/libcrypto/bn/asm/x86w16.asm +++ b/lib/libcrypto/bn/asm/x86w16.asm @@ -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 diff --git a/lib/libcrypto/bn/asm/x86w32.asm b/lib/libcrypto/bn/asm/x86w32.asm index 957d71e3b18..e69de29bb2d 100644 --- a/lib/libcrypto/bn/asm/x86w32.asm +++ b/lib/libcrypto/bn/asm/x86w32.asm @@ -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 diff --git a/lib/libcrypto/bn/bn.h b/lib/libcrypto/bn/bn.h index d8822610dfa..009b0eb6856 100644 --- a/lib/libcrypto/bn/bn.h +++ b/lib/libcrypto/bn/bn.h @@ -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 diff --git a/lib/libcrypto/bn/bn_err.c b/lib/libcrypto/bn/bn_err.c index f3b9497dca0..988270bcf4f 100644 --- a/lib/libcrypto/bn/bn_err.c +++ b/lib/libcrypto/bn/bn_err.c @@ -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 diff --git a/lib/libcrypto/bn/bn_mont.c b/lib/libcrypto/bn/bn_mont.c index 7bb0b91223c..598fecbf0c8 100644 --- a/lib/libcrypto/bn/bn_mont.c +++ b/lib/libcrypto/bn/bn_mont.c @@ -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, diff --git a/lib/libcrypto/bn/bn_mul.c b/lib/libcrypto/bn/bn_mul.c index eb007e19e9a..3e8baaad9a0 100644 --- a/lib/libcrypto/bn/bn_mul.c +++ b/lib/libcrypto/bn/bn_mul.c @@ -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. diff --git a/lib/libcrypto/bn/bntest.c b/lib/libcrypto/bn/bntest.c index 41c22f5954d..0a97af69c58 100644 --- a/lib/libcrypto/bn/bntest.c +++ b/lib/libcrypto/bn/bntest.c @@ -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); diff --git a/lib/libcrypto/buffer/buf_err.c b/lib/libcrypto/buffer/buf_err.c index 7f9fd1f6c36..2f971a5f38b 100644 --- a/lib/libcrypto/buffer/buf_err.c +++ b/lib/libcrypto/buffer/buf_err.c @@ -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 diff --git a/lib/libcrypto/cast/Makefile.ssl b/lib/libcrypto/cast/Makefile.ssl index 763148e3146..4c70d1e3e8b 100644 --- a/lib/libcrypto/cast/Makefile.ssl +++ b/lib/libcrypto/cast/Makefile.ssl @@ -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: diff --git a/lib/libcrypto/cast/Makefile.uni b/lib/libcrypto/cast/Makefile.uni index a5870897cfa..e69de29bb2d 100644 --- a/lib/libcrypto/cast/Makefile.uni +++ b/lib/libcrypto/cast/Makefile.uni @@ -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. diff --git a/lib/libcrypto/cast/asm/c-win32.asm b/lib/libcrypto/cast/asm/c-win32.asm index ba78a3c69c5..e69de29bb2d 100644 --- a/lib/libcrypto/cast/asm/c-win32.asm +++ b/lib/libcrypto/cast/asm/c-win32.asm @@ -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 - ; - 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 diff --git a/lib/libcrypto/cast/cast_lcl.h b/lib/libcrypto/cast/cast_lcl.h index cfe3842e91f..5fab8a43f6b 100644 --- a/lib/libcrypto/cast/cast_lcl.h +++ b/lib/libcrypto/cast/cast_lcl.h @@ -151,7 +151,7 @@ *((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)))) diff --git a/lib/libcrypto/comp/comp_err.c b/lib/libcrypto/comp/comp_err.c index 77a3f7070c5..c10282a73c9 100644 --- a/lib/libcrypto/comp/comp_err.c +++ b/lib/libcrypto/comp/comp_err.c @@ -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 diff --git a/lib/libcrypto/conf/conf_err.c b/lib/libcrypto/conf/conf_err.c index eb4b3cfc708..5c1ca59090f 100644 --- a/lib/libcrypto/conf/conf_err.c +++ b/lib/libcrypto/conf/conf_err.c @@ -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 diff --git a/lib/libcrypto/cpt_err.c b/lib/libcrypto/cpt_err.c index c2a2dd4af62..dadd8d8d928 100644 --- a/lib/libcrypto/cpt_err.c +++ b/lib/libcrypto/cpt_err.c @@ -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 diff --git a/lib/libcrypto/crypto-lib.com b/lib/libcrypto/crypto-lib.com index 79d86771e83..8ddeafbc06e 100644 --- a/lib/libcrypto/crypto-lib.com +++ b/lib/libcrypto/crypto-lib.com @@ -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... diff --git a/lib/libcrypto/des/DES.pod b/lib/libcrypto/des/DES.pod index 8a739e7ca0d..e69de29bb2d 100644 --- a/lib/libcrypto/des/DES.pod +++ b/lib/libcrypto/des/DES.pod @@ -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) - diff --git a/lib/libcrypto/des/MODES.DES b/lib/libcrypto/des/MODES.DES index 0cbc44f51d2..e69de29bb2d 100644 --- a/lib/libcrypto/des/MODES.DES +++ b/lib/libcrypto/des/MODES.DES @@ -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. diff --git a/lib/libcrypto/des/Makefile.PL b/lib/libcrypto/des/Makefile.PL index b54a24387cb..e69de29bb2d 100644 --- a/lib/libcrypto/des/Makefile.PL +++ b/lib/libcrypto/des/Makefile.PL @@ -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', - ); diff --git a/lib/libcrypto/des/Makefile.lit b/lib/libcrypto/des/Makefile.lit index c09f6969da6..e69de29bb2d 100644 --- a/lib/libcrypto/des/Makefile.lit +++ b/lib/libcrypto/des/Makefile.lit @@ -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. diff --git a/lib/libcrypto/des/Makefile.ssl b/lib/libcrypto/des/Makefile.ssl index 41976655e9e..3eb0738b7b7 100644 --- a/lib/libcrypto/des/Makefile.ssl +++ b/lib/libcrypto/des/Makefile.ssl @@ -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 diff --git a/lib/libcrypto/des/Makefile.uni b/lib/libcrypto/des/Makefile.uni index ec19d75b81f..e69de29bb2d 100644 --- a/lib/libcrypto/des/Makefile.uni +++ b/lib/libcrypto/des/Makefile.uni @@ -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. diff --git a/lib/libcrypto/des/PC1 b/lib/libcrypto/des/PC1 index efb8348b72d..e69de29bb2d 100644 --- a/lib/libcrypto/des/PC1 +++ b/lib/libcrypto/des/PC1 @@ -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); - } - diff --git a/lib/libcrypto/des/PC2 b/lib/libcrypto/des/PC2 index 2d560270ecd..e69de29bb2d 100644 --- a/lib/libcrypto/des/PC2 +++ b/lib/libcrypto/des/PC2 @@ -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; - } diff --git a/lib/libcrypto/des/asm/d-win32.asm b/lib/libcrypto/des/asm/d-win32.asm index 9e3dc9cd87b..e69de29bb2d 100644 --- a/lib/libcrypto/des/asm/d-win32.asm +++ b/lib/libcrypto/des/asm/d-win32.asm @@ -1,3132 +0,0 @@ - ; 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 - ; - 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 diff --git a/lib/libcrypto/des/asm/y-win32.asm b/lib/libcrypto/des/asm/y-win32.asm index af5c102422a..e69de29bb2d 100644 --- a/lib/libcrypto/des/asm/y-win32.asm +++ b/lib/libcrypto/des/asm/y-win32.asm @@ -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 - ; - 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 diff --git a/lib/libcrypto/des/des.c b/lib/libcrypto/des/des.c index 91d7153b346..0197489c9ed 100644 --- a/lib/libcrypto/des/des.c +++ b/lib/libcrypto/des/des.c @@ -58,6 +58,7 @@ #include #include +#include #ifndef MSDOS #ifndef VMS #include @@ -69,7 +70,7 @@ #include #endif /* __DECC */ #endif /* VMS */ -#else +#else /* MSDOS */ #include #endif @@ -88,10 +89,6 @@ #include #include -#if defined(__STDC__) || defined(VMS) || defined(M_XENIX) || defined(MSDOS) -#include -#endif - void usage(void); void doencryption(void); int uufwrite(unsigned char *data, int size, unsigned int num, FILE *fp); diff --git a/lib/libcrypto/des/des.h b/lib/libcrypto/des/des.h index 98a9c4127c8..ead67986d9e 100644 --- a/lib/libcrypto/des/des.h +++ b/lib/libcrypto/des/des.h @@ -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 */ -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 } diff --git a/lib/libcrypto/des/des.man b/lib/libcrypto/des/des.man index 7e06a1851a0..e69de29bb2d 100644 --- a/lib/libcrypto/des/des.man +++ b/lib/libcrypto/des/des.man @@ -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 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) diff --git a/lib/libcrypto/des/des.pl b/lib/libcrypto/des/des.pl index 8a3f7e3ed63..e69de29bb2d 100644 --- a/lib/libcrypto/des/des.pl +++ b/lib/libcrypto/des/des.pl @@ -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 index 00000000000..bf479e83d26 --- /dev/null +++ b/lib/libcrypto/des/des.pod @@ -0,0 +1,217 @@ +=pod + +=head1 NAME + +des - encrypt or decrypt data using Data Encryption Standard + +=head1 SYNOPSIS + +B +( +B<-e> +| +B<-E> +) | ( +B<-d> +| +B<-D> +) | ( +B<->[B][B] +) | +[ +B<-b3hfs> +] [ +B<-k> +I +] +] [ +B<-u>[I] +[ +I +[ +I +] ] + +=head1 NOTE + +This page describes the B stand-alone program, not the B +command. + +=head1 DESCRIPTION + +B +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. + +Two standard encryption modes are supported by the +B +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 +option is given. +If the key is an argument to the +B +command, it is potentially visible to users executing +ps(1) +or a derivative. To minimise this possibility, +B +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 +command reads from standard input unless +I +is specified and writes to standard output unless +I +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 + +Use the encryption +I +specified. + +=item B<-h> + +The +I +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 + +=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 I 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 diff --git a/lib/libcrypto/des/des_crypt.man b/lib/libcrypto/des/des_crypt.man index 0ecc416877f..e69de29bb2d 100644 --- a/lib/libcrypto/des/des_crypt.man +++ b/lib/libcrypto/des/des_crypt.man @@ -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 -.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) diff --git a/lib/libcrypto/des/des_locl.h b/lib/libcrypto/des/des_locl.h index 4dfed199a71..1ace8f5930b 100644 --- a/lib/libcrypto/des/des_locl.h +++ b/lib/libcrypto/des/des_locl.h @@ -155,7 +155,7 @@ } \ } -#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)))) diff --git a/lib/libcrypto/des/destest.c b/lib/libcrypto/des/destest.c index 9ad4ecb0728..df0d615d6b7 100644 --- a/lib/libcrypto/des/destest.c +++ b/lib/libcrypto/des/destest.c @@ -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"); diff --git a/lib/libcrypto/des/doIP b/lib/libcrypto/des/doIP index 18cf2313036..e69de29bb2d 100644 --- a/lib/libcrypto/des/doIP +++ b/lib/libcrypto/des/doIP @@ -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); diff --git a/lib/libcrypto/des/doPC1 b/lib/libcrypto/des/doPC1 index 096afd8c461..e69de29bb2d 100644 --- a/lib/libcrypto/des/doPC1 +++ b/lib/libcrypto/des/doPC1 @@ -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); - diff --git a/lib/libcrypto/des/doPC2 b/lib/libcrypto/des/doPC2 index fa5cf74cf71..e69de29bb2d 100644 --- a/lib/libcrypto/des/doPC2 +++ b/lib/libcrypto/des/doPC2 @@ -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); - } - } diff --git a/lib/libcrypto/des/fcrypt.c b/lib/libcrypto/des/fcrypt.c index fa1b8aa34ad..9b21f81cc2a 100644 --- a/lib/libcrypto/des/fcrypt.c +++ b/lib/libcrypto/des/fcrypt.c @@ -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) */ diff --git a/lib/libcrypto/des/fcrypt_b.c b/lib/libcrypto/des/fcrypt_b.c index 83c94054e3c..22c87f59836 100644 --- a/lib/libcrypto/des/fcrypt_b.c +++ b/lib/libcrypto/des/fcrypt_b.c @@ -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) diff --git a/lib/libcrypto/des/ncbc_enc.c b/lib/libcrypto/des/ncbc_enc.c index e0e67a417d5..3b681691a9b 100644 --- a/lib/libcrypto/des/ncbc_enc.c +++ b/lib/libcrypto/des/ncbc_enc.c @@ -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. * diff --git a/lib/libcrypto/des/podd.h b/lib/libcrypto/des/podd.h index 1b2bfe08432..e69de29bb2d 100644 --- a/lib/libcrypto/des/podd.h +++ b/lib/libcrypto/des/podd.h @@ -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}; diff --git a/lib/libcrypto/des/qud_cksm.c b/lib/libcrypto/des/qud_cksm.c index 6ce8c61b426..5f0ec5387fa 100644 --- a/lib/libcrypto/des/qud_cksm.c +++ b/lib/libcrypto/des/qud_cksm.c @@ -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 *)<mp; - - 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); diff --git a/lib/libcrypto/des/rand_key.c b/lib/libcrypto/des/rand_key.c index 7816a8f25c1..ee1a6c274e9 100644 --- a/lib/libcrypto/des/rand_key.c +++ b/lib/libcrypto/des/rand_key.c @@ -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); } diff --git a/lib/libcrypto/des/set_key.c b/lib/libcrypto/des/set_key.c index bbdc71ba6bd..09afd4fc032 100644 --- a/lib/libcrypto/des/set_key.c +++ b/lib/libcrypto/des/set_key.c @@ -64,12 +64,27 @@ * 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); + } diff --git a/lib/libcrypto/des/shifts.pl b/lib/libcrypto/des/shifts.pl index ba686d8ef51..e69de29bb2d 100644 --- a/lib/libcrypto/des/shifts.pl +++ b/lib/libcrypto/des/shifts.pl @@ -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; diff --git a/lib/libcrypto/des/sk.h b/lib/libcrypto/des/sk.h index f2ade88c7ca..e69de29bb2d 100644 --- a/lib/libcrypto/des/sk.h +++ b/lib/libcrypto/des/sk.h @@ -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, -}}; diff --git a/lib/libcrypto/des/testdes.pl b/lib/libcrypto/des/testdes.pl index 01a165a963d..e69de29bb2d 100644 --- a/lib/libcrypto/des/testdes.pl +++ b/lib/libcrypto/des/testdes.pl @@ -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"; - } diff --git a/lib/libcrypto/dh/dh_err.c b/lib/libcrypto/dh/dh_err.c index 0348bd24a2e..ff2d1684c21 100644 --- a/lib/libcrypto/dh/dh_err.c +++ b/lib/libcrypto/dh/dh_err.c @@ -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 diff --git a/lib/libcrypto/doc/DH_set_method.pod b/lib/libcrypto/doc/DH_set_method.pod index dca41d8dbc8..a8f75bdd9d0 100644 --- a/lib/libcrypto/doc/DH_set_method.pod +++ b/lib/libcrypto/doc/DH_set_method.pod @@ -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); diff --git a/lib/libcrypto/doc/DSA_set_method.pod b/lib/libcrypto/doc/DSA_set_method.pod index 0b13ec9237c..edec46413d6 100644 --- a/lib/libcrypto/doc/DSA_set_method.pod +++ b/lib/libcrypto/doc/DSA_set_method.pod @@ -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 index 00000000000..9707a4b3997 --- /dev/null +++ b/lib/libcrypto/doc/EVP_OpenInit.pod @@ -0,0 +1,51 @@ +=pod + +=head1 NAME + +EVP_OpenInit, EVP_OpenUpdate, EVP_OpenFinal - EVP envelope decryption + +=head1 SYNOPSIS + + #include + + 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 for decryption +with cipher B. It decrypts the encrypted symmetric key of length +B bytes passed in the B parameter using the private key B. +The IV is supplied in the B parameter. + +EVP_OpenUpdate() and EVP_OpenFinal() have exactly the same properties +as the EVP_DecryptUpdate() and EVP_DecryptFinal() routines, as +documented on the L 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,L +L, +L + +=head1 HISTORY + +=cut diff --git a/lib/libcrypto/doc/EVP_SealInit.pod b/lib/libcrypto/doc/EVP_SealInit.pod new file mode 100644 index 00000000000..1579d110fa2 --- /dev/null +++ b/lib/libcrypto/doc/EVP_SealInit.pod @@ -0,0 +1,70 @@ +=pod + +=head1 NAME + +EVP_SealInit, EVP_SealUpdate, EVP_SealFinal - EVP envelope encryption + +=head1 SYNOPSIS + + #include + + 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 for encryption +with cipher B using a random secret key and IV supplied in +the B parameter. B 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 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 must have room for B bytes. The actual +size of each encrypted secret key is written to the array B. B is +an array of B 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 manual +page. + +=head1 RETURN VALUES + +EVP_SealInit() returns -1 on error or B 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,L +L, +L + +=head1 HISTORY + +=cut diff --git a/lib/libcrypto/doc/EVP_SignInit.pod b/lib/libcrypto/doc/EVP_SignInit.pod new file mode 100644 index 00000000000..bbc9203c9ca --- /dev/null +++ b/lib/libcrypto/doc/EVP_SignInit.pod @@ -0,0 +1,85 @@ +=pod + +=head1 NAME + +EVP_SignInit, EVP_SignUpdate, EVP_SignFinal - EVP signing functions + +=head1 SYNOPSIS + + #include + + 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 to using digest +B: this will typically be supplied by a function such as +EVP_sha1(). + +EVP_SignUpdate() hashes B bytes of data at B into the +signature context B. This funtion can be called several times on the +same B to include additional data. + +EVP_SignFinal() signs the data in B using the private key B +and places the signature in B. If the B 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, 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. + +=head1 NOTES + +The B 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. + +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, +L, L, +L, L, L, +L, L, L, +L, L + +=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 index 00000000000..3b5e07f4ade --- /dev/null +++ b/lib/libcrypto/doc/EVP_VerifyInit.pod @@ -0,0 +1,71 @@ +=pod + +=head1 NAME + +EVP_VerifyInit, EVP_VerifyUpdate, EVP_VerifyFinal - EVP signature verification functions + +=head1 SYNOPSIS + + #include + + 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 to using digest +B: this will typically be supplied by a function such as EVP_sha1(). + +EVP_VerifyUpdate() hashes B bytes of data at B into the +verification context B. This funtion can be called several times on the +same B to include additional data. + +EVP_VerifyFinal() verifies the data in B using the public key B +and against the B bytes at B. 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. + +=head1 NOTES + +The B 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. + +=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, +L, L, +L, L, L, +L, L, L, +L, L + +=head1 HISTORY + +EVP_VerifyInit(), EVP_VerifyUpdate() and EVP_VerifyFinal() are +available in all versions of SSLeay and OpenSSL. + +=cut diff --git a/lib/libcrypto/doc/RAND_add.pod b/lib/libcrypto/doc/RAND_add.pod index 0a13ec2a92b..67c66f3e0c9 100644 --- a/lib/libcrypto/doc/RAND_add.pod +++ b/lib/libcrypto/doc/RAND_add.pod @@ -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_seed() is equivalent to RAND_add() when B. +RAND_event() collects the entropy from Windows events such as mouse +movements and other user interaction. It should be called with the +B, B and B arguments of I 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 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, L 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 diff --git a/lib/libcrypto/doc/RAND_set_rand_method.pod b/lib/libcrypto/doc/RAND_set_rand_method.pod index 466e9b8767b..464eba416d4 100644 --- a/lib/libcrypto/doc/RAND_set_rand_method.pod +++ b/lib/libcrypto/doc/RAND_set_rand_method.pod @@ -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 diff --git a/lib/libcrypto/doc/RSA_set_method.pod b/lib/libcrypto/doc/RSA_set_method.pod index deb1183a235..14b0b4cf359 100644 --- a/lib/libcrypto/doc/RSA_set_method.pod +++ b/lib/libcrypto/doc/RSA_set_method.pod @@ -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); diff --git a/lib/libcrypto/doc/rsa.pod b/lib/libcrypto/doc/rsa.pod index 0486c044a68..eb8ba612c48 100644 --- a/lib/libcrypto/doc/rsa.pod +++ b/lib/libcrypto/doc/rsa.pod @@ -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. -B, B and B may be B in private keys, but the -RSA operations are much faster when these values are available. +B

, B, B, B and B may be B in private +keys, but the RSA operations are much faster when these values are +available. =head1 CONFORMING TO diff --git a/lib/libcrypto/dsa/dsa_err.c b/lib/libcrypto/dsa/dsa_err.c index 38e4af968cb..2b3ab3a9ad8 100644 --- a/lib/libcrypto/dsa/dsa_err.c +++ b/lib/libcrypto/dsa/dsa_err.c @@ -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 diff --git a/lib/libcrypto/dsa/dsa_key.c b/lib/libcrypto/dsa/dsa_key.c index ab7f38fc7c6..5aef2d5fcff 100644 --- a/lib/libcrypto/dsa/dsa_key.c +++ b/lib/libcrypto/dsa/dsa_key.c @@ -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; diff --git a/lib/libcrypto/err/err.c b/lib/libcrypto/err/err.c index 93c64cbc4f2..eb8c76aa0be 100644 --- a/lib/libcrypto/err/err.c +++ b/lib/libcrypto/err/err.c @@ -55,9 +55,63 @@ * 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 #include +#include #include #include #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; } } diff --git a/lib/libcrypto/evp/evp_err.c b/lib/libcrypto/evp/evp_err.c index 97953a0fc18..fc149cbb1ad 100644 --- a/lib/libcrypto/evp/evp_err.c +++ b/lib/libcrypto/evp/evp_err.c @@ -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 diff --git a/lib/libcrypto/evp/evp_pkey.c b/lib/libcrypto/evp/evp_pkey.c index d5e6f5880ff..4ab091fa564 100644 --- a/lib/libcrypto/evp/evp_pkey.c +++ b/lib/libcrypto/evp/evp_pkey.c @@ -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); diff --git a/lib/libcrypto/evp/names.c b/lib/libcrypto/evp/names.c index 3e8f4603285..620f43feaad 100644 --- a/lib/libcrypto/evp/names.c +++ b/lib/libcrypto/evp/names.c @@ -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(); } diff --git a/lib/libcrypto/hmac/hmac.c b/lib/libcrypto/hmac/hmac.c index 23b7c98f8fa..e1ec79e0933 100644 --- a/lib/libcrypto/hmac/hmac.c +++ b/lib/libcrypto/hmac/hmac.c @@ -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) diff --git a/lib/libcrypto/lhash/lhash.c b/lib/libcrypto/lhash/lhash.c index 6a340a24038..7eb92a18bca 100644 --- a/lib/libcrypto/lhash/lhash.c +++ b/lib/libcrypto/lhash/lhash.c @@ -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; inum_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>16)^ret); } +unsigned long lh_num_items(LHASH *lh) + { + return lh ? lh->num_items : 0; + } diff --git a/lib/libcrypto/lhash/lhash.h b/lib/libcrypto/lhash/lhash.h index 6f6eeb2698a..d315fd9c6d7 100644 --- a/lib/libcrypto/lhash/lhash.h +++ b/lib/libcrypto/lhash/lhash.h @@ -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); diff --git a/lib/libcrypto/md5/Makefile.ssl b/lib/libcrypto/md5/Makefile.ssl index d50f967be77..45fbd042398 100644 --- a/lib/libcrypto/md5/Makefile.ssl +++ b/lib/libcrypto/md5/Makefile.ssl @@ -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 diff --git a/lib/libcrypto/md5/Makefile.uni b/lib/libcrypto/md5/Makefile.uni index d21c72f3ea0..e69de29bb2d 100644 --- a/lib/libcrypto/md5/Makefile.uni +++ b/lib/libcrypto/md5/Makefile.uni @@ -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. diff --git a/lib/libcrypto/md5/asm/m5-win32.asm b/lib/libcrypto/md5/asm/m5-win32.asm index 51f5f17ca32..e69de29bb2d 100644 --- a/lib/libcrypto/md5/asm/m5-win32.asm +++ b/lib/libcrypto/md5/asm/m5-win32.asm @@ -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 - ; - 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 diff --git a/lib/libcrypto/md5/md5_locl.h b/lib/libcrypto/md5/md5_locl.h index 06af6332286..c9124841228 100644 --- a/lib/libcrypto/md5/md5_locl.h +++ b/lib/libcrypto/md5/md5_locl.h @@ -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))) diff --git a/lib/libcrypto/mem_dbg.c b/lib/libcrypto/mem_dbg.c index 14770c07337..a3994853004 100644 --- a/lib/libcrypto/mem_dbg.c +++ b/lib/libcrypto/mem_dbg.c @@ -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); diff --git a/lib/libcrypto/objects/o_names.c b/lib/libcrypto/objects/o_names.c index d654eb220ea..d9389a5e5a3 100644 --- a/lib/libcrypto/objects/o_names.c +++ b/lib/libcrypto/objects/o_names.c @@ -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); diff --git a/lib/libcrypto/objects/obj_err.c b/lib/libcrypto/objects/obj_err.c index cef401db277..7aec0ed47a6 100644 --- a/lib/libcrypto/objects/obj_err.c +++ b/lib/libcrypto/objects/obj_err.c @@ -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 diff --git a/lib/libcrypto/objects/objects.h b/lib/libcrypto/objects/objects.h index d1a5ad25029..95c8a21568e 100644 --- a/lib/libcrypto/objects/objects.h +++ b/lib/libcrypto/objects/objects.h @@ -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 diff --git a/lib/libcrypto/opensslv.h b/lib/libcrypto/opensslv.h index 55d5d06cf53..55ec97389f6 100644 --- a/lib/libcrypto/opensslv.h +++ b/lib/libcrypto/opensslv.h @@ -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 */ diff --git a/lib/libcrypto/pem/pem_err.c b/lib/libcrypto/pem/pem_err.c index 642129da204..8b1789b11c9 100644 --- a/lib/libcrypto/pem/pem_err.c +++ b/lib/libcrypto/pem/pem_err.c @@ -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 diff --git a/lib/libcrypto/pem/pem_lib.c b/lib/libcrypto/pem/pem_lib.c index 072211ba0fe..b5e0a650f8d 100644 --- a/lib/libcrypto/pem/pem_lib.c +++ b/lib/libcrypto/pem/pem_lib.c @@ -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 */ diff --git a/lib/libcrypto/perlasm/x86asm.pl b/lib/libcrypto/perlasm/x86asm.pl index 44e330eb8d1..81c6e64e871 100644 --- a/lib/libcrypto/perlasm/x86asm.pl +++ b/lib/libcrypto/perlasm/x86asm.pl @@ -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 "); &comment(""); diff --git a/lib/libcrypto/perlasm/x86ms.pl b/lib/libcrypto/perlasm/x86ms.pl index 252a57bdb51..206452341d1 100644 --- a/lib/libcrypto/perlasm/x86ms.pl +++ b/lib/libcrypto/perlasm/x86ms.pl @@ -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"); } diff --git a/lib/libcrypto/perlasm/x86unix.pl b/lib/libcrypto/perlasm/x86unix.pl index 60d75f5ce4b..309060ea001 100644 --- a/lib/libcrypto/perlasm/x86unix.pl +++ b/lib/libcrypto/perlasm/x86unix.pl @@ -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; diff --git a/lib/libcrypto/pkcs12/p12_crt.c b/lib/libcrypto/pkcs12/p12_crt.c index 56d88b07596..ee8aed54c77 100644 --- a/lib/libcrypto/pkcs12/p12_crt.c +++ b/lib/libcrypto/pkcs12/p12_crt.c @@ -61,7 +61,7 @@ #include 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); diff --git a/lib/libcrypto/pkcs12/p12_key.c b/lib/libcrypto/pkcs12/p12_key.c index 02fdd20e2fc..b364671ed22 100644 --- a/lib/libcrypto/pkcs12/p12_key.c +++ b/lib/libcrypto/pkcs12/p12_key.c @@ -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); diff --git a/lib/libcrypto/pkcs12/p12_kiss.c b/lib/libcrypto/pkcs12/p12_kiss.c index 08a60556e09..ee257ffbadd 100644 --- a/lib/libcrypto/pkcs12/p12_kiss.c +++ b/lib/libcrypto/pkcs12/p12_kiss.c @@ -62,9 +62,17 @@ /* 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: diff --git a/lib/libcrypto/pkcs12/p12_mutl.c b/lib/libcrypto/pkcs12/p12_mutl.c index f1094b3840e..369257ed4c1 100644 --- a/lib/libcrypto/pkcs12/p12_mutl.c +++ b/lib/libcrypto/pkcs12/p12_mutl.c @@ -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); diff --git a/lib/libcrypto/pkcs12/pk12err.c b/lib/libcrypto/pkcs12/pk12err.c index 9d8de10e1e6..12db54f49ef 100644 --- a/lib/libcrypto/pkcs12/pk12err.c +++ b/lib/libcrypto/pkcs12/pk12err.c @@ -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 diff --git a/lib/libcrypto/pkcs12/pkcs12.h b/lib/libcrypto/pkcs12/pkcs12.h index 254000fa121..dad356c00f6 100644 --- a/lib/libcrypto/pkcs12/pkcs12.h +++ b/lib/libcrypto/pkcs12/pkcs12.h @@ -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); diff --git a/lib/libcrypto/pkcs7/README b/lib/libcrypto/pkcs7/README index 27001c69707..e69de29bb2d 100644 --- a/lib/libcrypto/pkcs7/README +++ b/lib/libcrypto/pkcs7/README @@ -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 diff --git a/lib/libcrypto/pkcs7/pk7_doit.c b/lib/libcrypto/pkcs7/pk7_doit.c index 80ac5e34b4c..4ab24a86f51 100644 --- a/lib/libcrypto/pkcs7/pk7_doit.c +++ b/lib/libcrypto/pkcs7/pk7_doit.c @@ -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); diff --git a/lib/libcrypto/pkcs7/pkcs7err.c b/lib/libcrypto/pkcs7/pkcs7err.c index 813a8af9edc..8ded8913dbf 100644 --- a/lib/libcrypto/pkcs7/pkcs7err.c +++ b/lib/libcrypto/pkcs7/pkcs7err.c @@ -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 diff --git a/lib/libcrypto/rand/md_rand.c b/lib/libcrypto/rand/md_rand.c index 6b158f03495..da4258c479c 100644 --- a/lib/libcrypto/rand/md_rand.c +++ b/lib/libcrypto/rand/md_rand.c @@ -55,6 +55,59 @@ * 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 */ @@ -130,6 +183,10 @@ #include +#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= ENTROPY_NEEDED); + ret = entropy >= ENTROPY_NEEDED; + + CRYPTO_w_unlock(CRYPTO_LOCK_RAND); + + return ret; } #ifdef WINDOWS #include #include +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. diff --git a/lib/libcrypto/rand/rand.h b/lib/libcrypto/rand/rand.h index 28f45ec0526..2973ee90e44 100644 --- a/lib/libcrypto/rand/rand.h +++ b/lib/libcrypto/rand/rand.h @@ -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 void RAND_screen(void); +int RAND_event(UINT, WPARAM, LPARAM); #endif void ERR_load_RAND_strings(void); diff --git a/lib/libcrypto/rand/rand_egd.c b/lib/libcrypto/rand/rand_egd.c index d834408bd4e..380c7828c30 100644 --- a/lib/libcrypto/rand/rand_egd.c +++ b/lib/libcrypto/rand/rand_egd.c @@ -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); diff --git a/lib/libcrypto/rand/rand_err.c b/lib/libcrypto/rand/rand_err.c index d1263edf80f..1af0aa0b8ac 100644 --- a/lib/libcrypto/rand/rand_err.c +++ b/lib/libcrypto/rand/rand_err.c @@ -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 @@ -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} }; diff --git a/lib/libcrypto/rand/rand_lib.c b/lib/libcrypto/rand/rand_lib.c index b09a300c46e..7da74aab0ef 100644 --- a/lib/libcrypto/rand/rand_lib.c +++ b/lib/libcrypto/rand/rand_lib.c @@ -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; + } diff --git a/lib/libcrypto/rand/randfile.c b/lib/libcrypto/rand/randfile.c index 658a8d6b65f..9ff3974cc7d 100644 --- a/lib/libcrypto/rand/randfile.c +++ b/lib/libcrypto/rand/randfile.c @@ -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); diff --git a/lib/libcrypto/rc2/Makefile.uni b/lib/libcrypto/rc2/Makefile.uni index 4dc20c6fcfd..e69de29bb2d 100644 --- a/lib/libcrypto/rc2/Makefile.uni +++ b/lib/libcrypto/rc2/Makefile.uni @@ -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. diff --git a/lib/libcrypto/rc4/Makefile.ssl b/lib/libcrypto/rc4/Makefile.ssl index 2ea95f0298d..8d2a795c22a 100644 --- a/lib/libcrypto/rc4/Makefile.ssl +++ b/lib/libcrypto/rc4/Makefile.ssl @@ -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: diff --git a/lib/libcrypto/rc4/Makefile.uni b/lib/libcrypto/rc4/Makefile.uni index 855d9e50f37..e69de29bb2d 100644 --- a/lib/libcrypto/rc4/Makefile.uni +++ b/lib/libcrypto/rc4/Makefile.uni @@ -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. diff --git a/lib/libcrypto/rc4/asm/r4-win32.asm b/lib/libcrypto/rc4/asm/r4-win32.asm index 70b0f7484cd..e69de29bb2d 100644 --- a/lib/libcrypto/rc4/asm/r4-win32.asm +++ b/lib/libcrypto/rc4/asm/r4-win32.asm @@ -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 - ; - 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 diff --git a/lib/libcrypto/rc5/Makefile.ssl b/lib/libcrypto/rc5/Makefile.ssl index 35abb9d0d18..5a54a162bae 100644 --- a/lib/libcrypto/rc5/Makefile.ssl +++ b/lib/libcrypto/rc5/Makefile.ssl @@ -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: diff --git a/lib/libcrypto/rc5/Makefile.uni b/lib/libcrypto/rc5/Makefile.uni index 4dc20c6fcfd..e69de29bb2d 100644 --- a/lib/libcrypto/rc5/Makefile.uni +++ b/lib/libcrypto/rc5/Makefile.uni @@ -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. diff --git a/lib/libcrypto/rc5/asm/r5-win32.asm b/lib/libcrypto/rc5/asm/r5-win32.asm index f43d3711f04..e69de29bb2d 100644 --- a/lib/libcrypto/rc5/asm/r5-win32.asm +++ b/lib/libcrypto/rc5/asm/r5-win32.asm @@ -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 - ; - 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 diff --git a/lib/libcrypto/ripemd/Makefile.ssl b/lib/libcrypto/ripemd/Makefile.ssl index c6153d43615..6ada9f067bf 100644 --- a/lib/libcrypto/ripemd/Makefile.ssl +++ b/lib/libcrypto/ripemd/Makefile.ssl @@ -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: diff --git a/lib/libcrypto/ripemd/Makefile.uni b/lib/libcrypto/ripemd/Makefile.uni index 5310020eb11..e69de29bb2d 100644 --- a/lib/libcrypto/ripemd/Makefile.uni +++ b/lib/libcrypto/ripemd/Makefile.uni @@ -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. diff --git a/lib/libcrypto/ripemd/asm/rm-win32.asm b/lib/libcrypto/ripemd/asm/rm-win32.asm index f07d517857b..e69de29bb2d 100644 --- a/lib/libcrypto/ripemd/asm/rm-win32.asm +++ b/lib/libcrypto/ripemd/asm/rm-win32.asm @@ -1,1973 +0,0 @@ - ; 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 - ; - 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 diff --git a/lib/libcrypto/ripemd/rmd_locl.h b/lib/libcrypto/ripemd/rmd_locl.h index 145cf316b90..f537b888675 100644 --- a/lib/libcrypto/ripemd/rmd_locl.h +++ b/lib/libcrypto/ripemd/rmd_locl.h @@ -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)) diff --git a/lib/libcrypto/rsa/rsa_err.c b/lib/libcrypto/rsa/rsa_err.c index 5cfbea2b033..1cde7c0da46 100644 --- a/lib/libcrypto/rsa/rsa_err.c +++ b/lib/libcrypto/rsa/rsa_err.c @@ -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 diff --git a/lib/libcrypto/sha/Makefile.ssl b/lib/libcrypto/sha/Makefile.ssl index 79ef43aa349..72acd8f0462 100644 --- a/lib/libcrypto/sha/Makefile.ssl +++ b/lib/libcrypto/sha/Makefile.ssl @@ -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: diff --git a/lib/libcrypto/sha/Makefile.uni b/lib/libcrypto/sha/Makefile.uni index b7ec5caa4e5..e69de29bb2d 100644 --- a/lib/libcrypto/sha/Makefile.uni +++ b/lib/libcrypto/sha/Makefile.uni @@ -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. diff --git a/lib/libcrypto/sha/asm/s1-win32.asm b/lib/libcrypto/sha/asm/s1-win32.asm index 699afdb0223..e69de29bb2d 100644 --- a/lib/libcrypto/sha/asm/s1-win32.asm +++ b/lib/libcrypto/sha/asm/s1-win32.asm @@ -1,1716 +0,0 @@ - ; 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 - ; - 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 diff --git a/lib/libcrypto/sha/asm/sha1-586.pl b/lib/libcrypto/sha/asm/sha1-586.pl index 48d9192a4e6..09df993ecd4 100644 --- a/lib/libcrypto/sha/asm/sha1-586.pl +++ b/lib/libcrypto/sha/asm/sha1-586.pl @@ -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"); diff --git a/lib/libcrypto/sha/sha_locl.h b/lib/libcrypto/sha/sha_locl.h index 3e6f489b876..2f8aef83f38 100644 --- a/lib/libcrypto/sha/sha_locl.h +++ b/lib/libcrypto/sha/sha_locl.h @@ -130,11 +130,7 @@ # 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 diff --git a/lib/libcrypto/util/libeay.num b/lib/libcrypto/util/libeay.num index e3818ef6e4b..f611d6b2836 100644 --- a/lib/libcrypto/util/libeay.num +++ b/lib/libcrypto/util/libeay.num @@ -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 diff --git a/lib/libcrypto/util/mk1mf.pl b/lib/libcrypto/util/mk1mf.pl index 6fbf3ceca6a..100d76f2793 100644 --- a/lib/libcrypto/util/mk1mf.pl +++ b/lib/libcrypto/util/mk1mf.pl @@ -8,6 +8,7 @@ $INSTALLTOP="/usr/local/ssl"; $OPTIONS=""; $ssl_version=""; +$banner="\t\@echo Building OpenSSL"; open(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; } diff --git a/lib/libcrypto/util/mkerr.pl b/lib/libcrypto/util/mkerr.pl index ebc059ef228..8e18f3c2dff 100644 --- a/lib/libcrypto/util/mkerr.pl +++ b/lib/libcrypto/util/mkerr.pl @@ -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 () { + 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 @@ -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)) { diff --git a/lib/libcrypto/util/pl/BC-32.pl b/lib/libcrypto/util/pl/BC-32.pl index df6e2c742e4..7f57809a165 100644 --- a/lib/libcrypto/util/pl/BC-32.pl +++ b/lib/libcrypto/util/pl/BC-32.pl @@ -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 { diff --git a/lib/libcrypto/util/pl/Mingw32.pl b/lib/libcrypto/util/pl/Mingw32.pl index 585cacd8203..c687d9b1185 100644 --- a/lib/libcrypto/util/pl/Mingw32.pl +++ b/lib/libcrypto/util/pl/Mingw32.pl @@ -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; - diff --git a/lib/libcrypto/util/selftest.pl b/lib/libcrypto/util/selftest.pl index 91e962a312c..04b4425d7ef 100644 --- a/lib/libcrypto/util/selftest.pl +++ b/lib/libcrypto/util/selftest.pl @@ -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,") { $ok=2 if /^platform: $platform/; } @@ -155,6 +160,15 @@ if ($ok != 2) { } else { print OUT "make.log not found!\n"; } + if (open(IN,") { + print OUT; + } + close(IN); + print OUT $sep; + } else { + print OUT "maketest.log not found!\n"; + } } else { print OUT "Test passed.\n"; } diff --git a/lib/libcrypto/util/sep_lib.sh b/lib/libcrypto/util/sep_lib.sh index 34c2c9f8ba9..e69de29bb2d 100644 --- a/lib/libcrypto/util/sep_lib.sh +++ b/lib/libcrypto/util/sep_lib.sh @@ -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 - - diff --git a/lib/libcrypto/x509/x509.h b/lib/libcrypto/x509/x509.h index d3336d9cebb..0192272e7c1 100644 --- a/lib/libcrypto/x509/x509.h +++ b/lib/libcrypto/x509/x509.h @@ -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 diff --git a/lib/libcrypto/x509/x509_err.c b/lib/libcrypto/x509/x509_err.c index fdedbdac344..848add56e9b 100644 --- a/lib/libcrypto/x509/x509_err.c +++ b/lib/libcrypto/x509/x509_err.c @@ -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 diff --git a/lib/libcrypto/x509/x509_trs.c b/lib/libcrypto/x509/x509_trs.c index 9f7d67952db..c779aaf94d6 100644 --- a/lib/libcrypto/x509/x509_trs.c +++ b/lib/libcrypto/x509/x509_trs.c @@ -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; -} diff --git a/lib/libcrypto/x509/x509_vfy.c b/lib/libcrypto/x509/x509_vfy.c index 4fdff54124c..3ddb2303d38 100644 --- a/lib/libcrypto/x509/x509_vfy.c +++ b/lib/libcrypto/x509/x509_vfy.c @@ -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); diff --git a/lib/libcrypto/x509/x509name.c b/lib/libcrypto/x509/x509name.c index cf2382d42c0..4c20e03eced 100644 --- a/lib/libcrypto/x509/x509name.c +++ b/lib/libcrypto/x509/x509name.c @@ -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; diff --git a/lib/libcrypto/x509v3/v3_purp.c b/lib/libcrypto/x509v3/v3_purp.c index b7494ebcd56..5594a1d64f9 100644 --- a/lib/libcrypto/x509v3/v3_purp.c +++ b/lib/libcrypto/x509v3/v3_purp.c @@ -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; +} diff --git a/lib/libcrypto/x509v3/v3err.c b/lib/libcrypto/x509v3/v3err.c index b7d4e350c43..aa4a605dc48 100644 --- a/lib/libcrypto/x509v3/v3err.c +++ b/lib/libcrypto/x509v3/v3err.c @@ -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 diff --git a/lib/libcrypto/x509v3/x509v3.h b/lib/libcrypto/x509v3/x509v3.h index fe01755797b..96ceb7c4fb7 100644 --- a/lib/libcrypto/x509v3/x509v3.h +++ b/lib/libcrypto/x509v3/x509v3.h @@ -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) diff --git a/lib/libssl/s3_clnt.c b/lib/libssl/s3_clnt.c index 279d2c01983..0c8f551f736 100644 --- a/lib/libssl/s3_clnt.c +++ b/lib/libssl/s3_clnt.c @@ -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; diff --git a/lib/libssl/s3_lib.c b/lib/libssl/s3_lib.c index c4b49aaedf4..7ada26cbb69 100644 --- a/lib/libssl/s3_lib.c +++ b/lib/libssl/s3_lib.c @@ -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: diff --git a/lib/libssl/s3_srvr.c b/lib/libssl/s3_srvr.c index 90806e2d99b..e23ca20bd31 100644 --- a/lib/libssl/s3_srvr.c +++ b/lib/libssl/s3_srvr.c @@ -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; diff --git a/lib/libssl/src/MacOS/GetHTTPS.src/GetHTTPS.cpp b/lib/libssl/src/MacOS/GetHTTPS.src/GetHTTPS.cpp index ed8e1cc962f..d62dc50473a 100644 --- a/lib/libssl/src/MacOS/GetHTTPS.src/GetHTTPS.cpp +++ b/lib/libssl/src/MacOS/GetHTTPS.src/GetHTTPS.cpp @@ -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 @@ -26,14 +27,13 @@ #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 #include -#include #include @@ -48,10 +48,6 @@ 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 (µTickCount); - RAND_add (µTickCount, 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); diff --git a/lib/libssl/src/MacOS/OpenSSL.mcp.hqx b/lib/libssl/src/MacOS/OpenSSL.mcp.hqx index 2efa49ac014..c357ea5af9a 100644 --- a/lib/libssl/src/MacOS/OpenSSL.mcp.hqx +++ b/lib/libssl/src/MacOS/OpenSSL.mcp.hqx @@ -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 index 00000000000..cceb6bde44f --- /dev/null +++ b/lib/libssl/src/MacOS/Randomizer.cpp @@ -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 +#include +#include +#include +#include +#include +#include + +// Standard C library +#include +#include + +/*---------------------- 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 index 00000000000..565537b15df --- /dev/null +++ b/lib/libssl/src/MacOS/Randomizer.h @@ -0,0 +1,43 @@ + +// Gathers unpredictable system data to be used for generating +// random bits + +#include + +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; +}; diff --git a/lib/libssl/src/apps/CA.pl b/lib/libssl/src/apps/CA.pl index beebee7ffe7..4eef57e6e39 100644 --- a/lib/libssl/src/apps/CA.pl +++ b/lib/libssl/src/apps/CA.pl @@ -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 diff --git a/lib/libssl/src/apps/Makefile.ssl b/lib/libssl/src/apps/Makefile.ssl index f97154ba032..c7373f74def 100644 --- a/lib/libssl/src/apps/Makefile.ssl +++ b/lib/libssl/src/apps/Makefile.ssl @@ -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 diff --git a/lib/libssl/src/apps/app_rand.c b/lib/libssl/src/apps/app_rand.c index f7f133831d2..1146f9f7f38 100644 --- a/lib/libssl/src/apps/app_rand.c +++ b/lib/libssl/src/apps/app_rand.c @@ -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 @@ -109,7 +109,9 @@ * */ +#define NON_MAIN #include "apps.h" +#undef NON_MAIN #include #include @@ -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) diff --git a/lib/libssl/src/apps/ca.c b/lib/libssl/src/apps/ca.c index e22beda0972..73df13fe8e2 100644 --- a/lib/libssl/src/apps/ca.c +++ b/lib/libssl/src/apps/ca.c @@ -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; } } diff --git a/lib/libssl/src/apps/dh.c b/lib/libssl/src/apps/dh.c index b3c20e2b5c1..674963f81a9 100644 --- a/lib/libssl/src/apps/dh.c +++ b/lib/libssl/src/apps/dh.c @@ -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) diff --git a/lib/libssl/src/apps/dhparam.c b/lib/libssl/src/apps/dhparam.c index 293a400d0c5..709547ff5e6 100644 --- a/lib/libssl/src/apps/dhparam.c +++ b/lib/libssl/src/apps/dhparam.c @@ -55,6 +55,59 @@ * 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 @@ -69,6 +122,10 @@ #include #include +#ifndef NO_DSA +#include +#endif + #undef PROG #define PROG dhparam_main @@ -78,6 +135,7 @@ * -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 \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; ig,data); - printf("static unsigned char dh%d_g[]={",bits); + printf("\tstatic unsigned char dh%d_g[]={",bits); for (i=0; ip=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='*'; diff --git a/lib/libssl/src/apps/eay.c b/lib/libssl/src/apps/eay.c index a84aa382bde..e69de29bb2d 100644 --- a/lib/libssl/src/apps/eay.c +++ b/lib/libssl/src/apps/eay.c @@ -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 -#include -#include - -#define MONOLITH -#define USE_SOCKETS - -#include "openssl/e_os.h" - -#include -#include -#include - -#include - -#include - -#include - -#include -#include -#include - -#include - -#include -#include -#include -#include -#include - -#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 - diff --git a/lib/libssl/src/apps/gendh.c b/lib/libssl/src/apps/gendh.c index 1f6be965996..caf5e8d736b 100644 --- a/lib/libssl/src/apps/gendh.c +++ b/lib/libssl/src/apps/gendh.c @@ -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); diff --git a/lib/libssl/src/apps/gendsa.c b/lib/libssl/src/apps/gendsa.c index d69a93da451..b1a1c4fcfae 100644 --- a/lib/libssl/src/apps/gendsa.c +++ b/lib/libssl/src/apps/gendsa.c @@ -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"); diff --git a/lib/libssl/src/apps/genrsa.c b/lib/libssl/src/apps/genrsa.c index dc63ff02bd8..6fe578d69fe 100644 --- a/lib/libssl/src/apps/genrsa.c +++ b/lib/libssl/src/apps/genrsa.c @@ -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; diff --git a/lib/libssl/src/apps/makeapps.com b/lib/libssl/src/apps/makeapps.com index 5ef6a8904ee..94acbf82199 100644 --- a/lib/libssl/src/apps/makeapps.com +++ b/lib/libssl/src/apps/makeapps.com @@ -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," diff --git a/lib/libssl/src/apps/openssl.c b/lib/libssl/src/apps/openssl.c index 748c6ce71a1..a2a263062df 100644 --- a/lib/libssl/src/apps/openssl.c +++ b/lib/libssl/src/apps/openssl.c @@ -56,13 +56,10 @@ * [including the GNU Public Licence.] */ -#ifndef DEBUG -#undef DEBUG -#endif - #include #include #include +#define OPENSSL_C /* tells apps.h to use complete apps_startup() */ #include #include #include @@ -71,18 +68,11 @@ #include #include #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 -/* -#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) || diff --git a/lib/libssl/src/apps/pkcs12.c b/lib/libssl/src/apps/pkcs12.c index d535a71335b..bf768647137 100644 --- a/lib/libssl/src/apps/pkcs12.c +++ b/lib/libssl/src/apps/pkcs12.c @@ -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; diff --git a/lib/libssl/src/apps/progs.h b/lib/libssl/src/apps/progs.h index ffb21bd64fd..7d2238493a4 100644 --- a/lib/libssl/src/apps/progs.h +++ b/lib/libssl/src/apps/progs.h @@ -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 index 00000000000..cfbba307558 --- /dev/null +++ b/lib/libssl/src/apps/rand.c @@ -0,0 +1,140 @@ +/* apps/rand.c */ + +#include "apps.h" + +#include +#include +#include + +#include +#include +#include + +#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); + } diff --git a/lib/libssl/src/apps/req.c b/lib/libssl/src/apps/req.c index 97bb0d0ed87..eb338eeb1b2 100644 --- a/lib/libssl/src/apps/req.c +++ b/lib/libssl/src/apps/req.c @@ -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); diff --git a/lib/libssl/src/apps/rsa.c b/lib/libssl/src/apps/rsa.c index 53d234ca350..9d4c2e65640 100644 --- a/lib/libssl/src/apps/rsa.c +++ b/lib/libssl/src/apps/rsa.c @@ -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"); diff --git a/lib/libssl/src/apps/rsa/01.pem b/lib/libssl/src/apps/rsa/01.pem index 36ec57598ef..e69de29bb2d 100644 --- a/lib/libssl/src/apps/rsa/01.pem +++ b/lib/libssl/src/apps/rsa/01.pem @@ -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----- diff --git a/lib/libssl/src/apps/rsa/1.txt b/lib/libssl/src/apps/rsa/1.txt index 95a862e150e..e69de29bb2d 100644 --- a/lib/libssl/src/apps/rsa/1.txt +++ b/lib/libssl/src/apps/rsa/1.txt @@ -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----- diff --git a/lib/libssl/src/apps/rsa/SecureServer.pem b/lib/libssl/src/apps/rsa/SecureServer.pem index 7c8ffb2cd85..e69de29bb2d 100644 --- a/lib/libssl/src/apps/rsa/SecureServer.pem +++ b/lib/libssl/src/apps/rsa/SecureServer.pem @@ -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----- diff --git a/lib/libssl/src/apps/rsa/s.txt b/lib/libssl/src/apps/rsa/s.txt index 7de7e0764fa..e69de29bb2d 100644 --- a/lib/libssl/src/apps/rsa/s.txt +++ b/lib/libssl/src/apps/rsa/s.txt @@ -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----- diff --git a/lib/libssl/src/apps/s_apps.h b/lib/libssl/src/apps/s_apps.h index 1a0e9f9f92f..57af7c0f8cf 100644 --- a/lib/libssl/src/apps/s_apps.h +++ b/lib/libssl/src/apps/s_apps.h @@ -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); diff --git a/lib/libssl/src/apps/s_cb.c b/lib/libssl/src/apps/s_cb.c index fdb11a1d11d..fd622597d62 100644 --- a/lib/libssl/src/apps/s_cb.c +++ b/lib/libssl/src/apps/s_cb.c @@ -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. * diff --git a/lib/libssl/src/apps/s_client.c b/lib/libssl/src/apps/s_client.c index c4c3b0e94a5..e629f8e7f13 100644 --- a/lib/libssl/src/apps/s_client.c +++ b/lib/libssl/src/apps/s_client.c @@ -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); diff --git a/lib/libssl/src/apps/s_socket.c b/lib/libssl/src/apps/s_socket.c index 888b66df18e..081b1a57d17 100644 --- a/lib/libssl/src/apps/s_socket.c +++ b/lib/libssl/src/apps/s_socket.c @@ -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 -#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 /* 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 diff --git a/lib/libssl/src/apps/smime.c b/lib/libssl/src/apps/smime.c index 77633cfb600..7dc66d6ecd5 100644 --- a/lib/libssl/src/apps/smime.c +++ b/lib/libssl/src/apps/smime.c @@ -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; diff --git a/lib/libssl/src/apps/speed.c b/lib/libssl/src/apps/speed.c index b3130def8b9..f7a8e00a8bc 100644 --- a/lib/libssl/src/apps/speed.c +++ b/lib/libssl/src/apps/speed.c @@ -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 #include "apps.h" #include +#include #include #include +#include #include #include diff --git a/lib/libssl/src/apps/testdsa.h b/lib/libssl/src/apps/testdsa.h index a322978f8c2..f0bfbb1ffa2 100644 --- a/lib/libssl/src/apps/testdsa.h +++ b/lib/libssl/src/apps/testdsa.h @@ -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; diff --git a/lib/libssl/src/apps/testrsa.h b/lib/libssl/src/apps/testrsa.h index 9a0e811c73f..3007d792b0d 100644 --- a/lib/libssl/src/apps/testrsa.h +++ b/lib/libssl/src/apps/testrsa.h @@ -1,4 +1,5 @@ /* apps/testrsa.h */ +/* used by apps/speed.c */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * diff --git a/lib/libssl/src/apps/tkca b/lib/libssl/src/apps/tkca index bdaf21606af..e69de29bb2d 100644 --- a/lib/libssl/src/apps/tkca +++ b/lib/libssl/src/apps/tkca @@ -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 () - { - 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 index 00000000000..d042258b504 --- /dev/null +++ b/lib/libssl/src/apps/winrand.c @@ -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 +#include +#include + +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); + } diff --git a/lib/libssl/src/apps/x509.c b/lib/libssl/src/apps/x509.c index d5c0d0404e5..2d6384184c9 100644 --- a/lib/libssl/src/apps/x509.c +++ b/lib/libssl/src/apps/x509.c @@ -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 */ diff --git a/lib/libssl/src/crypto/Makefile b/lib/libssl/src/crypto/Makefile index 24b7f32fdda..b980f54dba1 100644 --- a/lib/libssl/src/crypto/Makefile +++ b/lib/libssl/src/crypto/Makefile @@ -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) diff --git a/lib/libssl/src/crypto/Makefile.ssl b/lib/libssl/src/crypto/Makefile.ssl index cab75d9f802..f9b33586be3 100644 --- a/lib/libssl/src/crypto/Makefile.ssl +++ b/lib/libssl/src/crypto/Makefile.ssl @@ -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) diff --git a/lib/libssl/src/crypto/asn1/asn1_err.c b/lib/libssl/src/crypto/asn1/asn1_err.c index b1838142423..cecd555c882 100644 --- a/lib/libssl/src/crypto/asn1/asn1_err.c +++ b/lib/libssl/src/crypto/asn1/asn1_err.c @@ -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 diff --git a/lib/libssl/src/crypto/asn1/p5_pbe.c b/lib/libssl/src/crypto/asn1/p5_pbe.c index 64e90237cc1..a147ac32953 100644 --- a/lib/libssl/src/crypto/asn1/p5_pbe.c +++ b/lib/libssl/src/crypto/asn1/p5_pbe.c @@ -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())) { diff --git a/lib/libssl/src/crypto/asn1/p5_pbev2.c b/lib/libssl/src/crypto/asn1/p5_pbev2.c index 4ce06a94ab9..1bbdb10c716 100644 --- a/lib/libssl/src/crypto/asn1/p5_pbev2.c +++ b/lib/libssl/src/crypto/asn1/p5_pbev2.c @@ -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; diff --git a/lib/libssl/src/crypto/asn1/t_req.c b/lib/libssl/src/crypto/asn1/t_req.c index 81dd6355a88..ea1af092db3 100644 --- a/lib/libssl/src/crypto/asn1/t_req.c +++ b/lib/libssl/src/crypto/asn1/t_req.c @@ -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",""); diff --git a/lib/libssl/src/crypto/asn1/x_pubkey.c b/lib/libssl/src/crypto/asn1/x_pubkey.c index 81e9815222a..7a05d575c99 100644 --- a/lib/libssl/src/crypto/asn1/x_pubkey.c +++ b/lib/libssl/src/crypto/asn1/x_pubkey.c @@ -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); diff --git a/lib/libssl/src/crypto/bf/Makefile.ssl b/lib/libssl/src/crypto/bf/Makefile.ssl index 15f6a639878..cf2f7dd48e2 100644 --- a/lib/libssl/src/crypto/bf/Makefile.ssl +++ b/lib/libssl/src/crypto/bf/Makefile.ssl @@ -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: diff --git a/lib/libssl/src/crypto/bf/Makefile.uni b/lib/libssl/src/crypto/bf/Makefile.uni index f67e5ca23bc..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/bf/Makefile.uni +++ b/lib/libssl/src/crypto/bf/Makefile.uni @@ -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. diff --git a/lib/libssl/src/crypto/bf/asm/b-win32.asm b/lib/libssl/src/crypto/bf/asm/b-win32.asm index 138c99d0aaf..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/bf/asm/b-win32.asm +++ b/lib/libssl/src/crypto/bf/asm/b-win32.asm @@ -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 - ; - 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 diff --git a/lib/libssl/src/crypto/bio/Makefile.ssl b/lib/libssl/src/crypto/bio/Makefile.ssl index 2e7480ead9d..755f255fe4b 100644 --- a/lib/libssl/src/crypto/bio/Makefile.ssl +++ b/lib/libssl/src/crypto/bio/Makefile.ssl @@ -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 diff --git a/lib/libssl/src/crypto/bio/b_print.c b/lib/libssl/src/crypto/bio/b_print.c index 2a5e8b58c9c..b11b501512b 100644 --- a/lib/libssl/src/crypto/bio/b_print.c +++ b/lib/libssl/src/crypto/bio/b_print.c @@ -64,6 +64,8 @@ #include #include #include +#include +#include #include "cryptlib.h" #ifndef NO_SYS_TYPES_H #include @@ -72,12 +74,16 @@ #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 diff --git a/lib/libssl/src/crypto/bio/bio.h b/lib/libssl/src/crypto/bio/bio.h index bc08401eebf..ebdb18170ba 100644 --- a/lib/libssl/src/crypto/bio/bio.h +++ b/lib/libssl/src/crypto/bio/bio.h @@ -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)()); diff --git a/lib/libssl/src/crypto/bio/bio_err.c b/lib/libssl/src/crypto/bio/bio_err.c index b5f07de5a05..f38e7b91786 100644 --- a/lib/libssl/src/crypto/bio/bio_err.c +++ b/lib/libssl/src/crypto/bio/bio_err.c @@ -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 diff --git a/lib/libssl/src/crypto/bio/bio_lib.c b/lib/libssl/src/crypto/bio/bio_lib.c index cf8e6150fd5..e88dcc80f3d 100644 --- a/lib/libssl/src/crypto/bio/bio_lib.c +++ b/lib/libssl/src/crypto/bio/bio_lib.c @@ -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)(); diff --git a/lib/libssl/src/crypto/bio/bss_bio.c b/lib/libssl/src/crypto/bio/bss_bio.c index 0d0f9356f7d..1e2d7491f2c 100644 --- a/lib/libssl/src/crypto/bio/bss_bio.c +++ b/lib/libssl/src/crypto/bio/bss_bio.c @@ -19,8 +19,14 @@ #include #include +#include #include +#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); diff --git a/lib/libssl/src/crypto/bio/bss_log.c b/lib/libssl/src/crypto/bio/bss_log.c index 4308b196633..497eb1af72b 100644 --- a/lib/libssl/src/crypto/bio/bss_log.c +++ b/lib/libssl/src/crypto/bio/bss_log.c @@ -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). */ @@ -66,29 +66,58 @@ #include #include -#ifndef WIN32 -#ifdef __ultrix -#include -#else -#include -#endif -#else -#include +#if defined(WIN32) +# include +#elif defined(VMS) || defined(__VMS) +# include +# include +# include +# include +#elif defined(__ultrix) +# include +#elif !defined(MSDOS) /* Unix */ +# include #endif #include "cryptlib.h" #include #include + #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 */ diff --git a/lib/libssl/src/crypto/bn/Makefile.ssl b/lib/libssl/src/crypto/bn/Makefile.ssl index fa23a43fa0c..beb9c1b5231 100644 --- a/lib/libssl/src/crypto/bn/Makefile.ssl +++ b/lib/libssl/src/crypto/bn/Makefile.ssl @@ -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 diff --git a/lib/libssl/src/crypto/bn/asm/bn-win32.asm b/lib/libssl/src/crypto/bn/asm/bn-win32.asm index 871bd88d77f..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/bn/asm/bn-win32.asm +++ b/lib/libssl/src/crypto/bn/asm/bn-win32.asm @@ -1,2122 +0,0 @@ - ; 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 - ; - 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 diff --git a/lib/libssl/src/crypto/bn/asm/x86w16.asm b/lib/libssl/src/crypto/bn/asm/x86w16.asm index 80a9ed6eef1..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/bn/asm/x86w16.asm +++ b/lib/libssl/src/crypto/bn/asm/x86w16.asm @@ -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 diff --git a/lib/libssl/src/crypto/bn/asm/x86w32.asm b/lib/libssl/src/crypto/bn/asm/x86w32.asm index 957d71e3b18..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/bn/asm/x86w32.asm +++ b/lib/libssl/src/crypto/bn/asm/x86w32.asm @@ -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 diff --git a/lib/libssl/src/crypto/bn/bn.h b/lib/libssl/src/crypto/bn/bn.h index d8822610dfa..009b0eb6856 100644 --- a/lib/libssl/src/crypto/bn/bn.h +++ b/lib/libssl/src/crypto/bn/bn.h @@ -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 diff --git a/lib/libssl/src/crypto/bn/bn_err.c b/lib/libssl/src/crypto/bn/bn_err.c index f3b9497dca0..988270bcf4f 100644 --- a/lib/libssl/src/crypto/bn/bn_err.c +++ b/lib/libssl/src/crypto/bn/bn_err.c @@ -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 diff --git a/lib/libssl/src/crypto/bn/bn_mont.c b/lib/libssl/src/crypto/bn/bn_mont.c index 7bb0b91223c..598fecbf0c8 100644 --- a/lib/libssl/src/crypto/bn/bn_mont.c +++ b/lib/libssl/src/crypto/bn/bn_mont.c @@ -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, diff --git a/lib/libssl/src/crypto/bn/bn_mul.c b/lib/libssl/src/crypto/bn/bn_mul.c index eb007e19e9a..3e8baaad9a0 100644 --- a/lib/libssl/src/crypto/bn/bn_mul.c +++ b/lib/libssl/src/crypto/bn/bn_mul.c @@ -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. diff --git a/lib/libssl/src/crypto/bn/bntest.c b/lib/libssl/src/crypto/bn/bntest.c index 41c22f5954d..0a97af69c58 100644 --- a/lib/libssl/src/crypto/bn/bntest.c +++ b/lib/libssl/src/crypto/bn/bntest.c @@ -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); diff --git a/lib/libssl/src/crypto/buffer/buf_err.c b/lib/libssl/src/crypto/buffer/buf_err.c index 7f9fd1f6c36..2f971a5f38b 100644 --- a/lib/libssl/src/crypto/buffer/buf_err.c +++ b/lib/libssl/src/crypto/buffer/buf_err.c @@ -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 diff --git a/lib/libssl/src/crypto/cast/Makefile.ssl b/lib/libssl/src/crypto/cast/Makefile.ssl index 763148e3146..4c70d1e3e8b 100644 --- a/lib/libssl/src/crypto/cast/Makefile.ssl +++ b/lib/libssl/src/crypto/cast/Makefile.ssl @@ -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: diff --git a/lib/libssl/src/crypto/cast/Makefile.uni b/lib/libssl/src/crypto/cast/Makefile.uni index a5870897cfa..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/cast/Makefile.uni +++ b/lib/libssl/src/crypto/cast/Makefile.uni @@ -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. diff --git a/lib/libssl/src/crypto/cast/asm/c-win32.asm b/lib/libssl/src/crypto/cast/asm/c-win32.asm index ba78a3c69c5..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/cast/asm/c-win32.asm +++ b/lib/libssl/src/crypto/cast/asm/c-win32.asm @@ -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 - ; - 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 diff --git a/lib/libssl/src/crypto/cast/cast_lcl.h b/lib/libssl/src/crypto/cast/cast_lcl.h index cfe3842e91f..5fab8a43f6b 100644 --- a/lib/libssl/src/crypto/cast/cast_lcl.h +++ b/lib/libssl/src/crypto/cast/cast_lcl.h @@ -151,7 +151,7 @@ *((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)))) diff --git a/lib/libssl/src/crypto/comp/comp_err.c b/lib/libssl/src/crypto/comp/comp_err.c index 77a3f7070c5..c10282a73c9 100644 --- a/lib/libssl/src/crypto/comp/comp_err.c +++ b/lib/libssl/src/crypto/comp/comp_err.c @@ -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 diff --git a/lib/libssl/src/crypto/conf/conf_err.c b/lib/libssl/src/crypto/conf/conf_err.c index eb4b3cfc708..5c1ca59090f 100644 --- a/lib/libssl/src/crypto/conf/conf_err.c +++ b/lib/libssl/src/crypto/conf/conf_err.c @@ -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 diff --git a/lib/libssl/src/crypto/cpt_err.c b/lib/libssl/src/crypto/cpt_err.c index c2a2dd4af62..dadd8d8d928 100644 --- a/lib/libssl/src/crypto/cpt_err.c +++ b/lib/libssl/src/crypto/cpt_err.c @@ -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 diff --git a/lib/libssl/src/crypto/crypto-lib.com b/lib/libssl/src/crypto/crypto-lib.com index 79d86771e83..8ddeafbc06e 100644 --- a/lib/libssl/src/crypto/crypto-lib.com +++ b/lib/libssl/src/crypto/crypto-lib.com @@ -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... diff --git a/lib/libssl/src/crypto/des/DES.pod b/lib/libssl/src/crypto/des/DES.pod index 8a739e7ca0d..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/des/DES.pod +++ b/lib/libssl/src/crypto/des/DES.pod @@ -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) - diff --git a/lib/libssl/src/crypto/des/MODES.DES b/lib/libssl/src/crypto/des/MODES.DES index 0cbc44f51d2..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/des/MODES.DES +++ b/lib/libssl/src/crypto/des/MODES.DES @@ -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. diff --git a/lib/libssl/src/crypto/des/Makefile.PL b/lib/libssl/src/crypto/des/Makefile.PL index b54a24387cb..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/des/Makefile.PL +++ b/lib/libssl/src/crypto/des/Makefile.PL @@ -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', - ); diff --git a/lib/libssl/src/crypto/des/Makefile.lit b/lib/libssl/src/crypto/des/Makefile.lit index c09f6969da6..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/des/Makefile.lit +++ b/lib/libssl/src/crypto/des/Makefile.lit @@ -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. diff --git a/lib/libssl/src/crypto/des/Makefile.ssl b/lib/libssl/src/crypto/des/Makefile.ssl index 41976655e9e..3eb0738b7b7 100644 --- a/lib/libssl/src/crypto/des/Makefile.ssl +++ b/lib/libssl/src/crypto/des/Makefile.ssl @@ -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 diff --git a/lib/libssl/src/crypto/des/Makefile.uni b/lib/libssl/src/crypto/des/Makefile.uni index ec19d75b81f..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/des/Makefile.uni +++ b/lib/libssl/src/crypto/des/Makefile.uni @@ -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. diff --git a/lib/libssl/src/crypto/des/PC1 b/lib/libssl/src/crypto/des/PC1 index efb8348b72d..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/des/PC1 +++ b/lib/libssl/src/crypto/des/PC1 @@ -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); - } - diff --git a/lib/libssl/src/crypto/des/PC2 b/lib/libssl/src/crypto/des/PC2 index 2d560270ecd..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/des/PC2 +++ b/lib/libssl/src/crypto/des/PC2 @@ -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; - } diff --git a/lib/libssl/src/crypto/des/asm/d-win32.asm b/lib/libssl/src/crypto/des/asm/d-win32.asm index 9e3dc9cd87b..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/des/asm/d-win32.asm +++ b/lib/libssl/src/crypto/des/asm/d-win32.asm @@ -1,3132 +0,0 @@ - ; 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 - ; - 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 diff --git a/lib/libssl/src/crypto/des/asm/y-win32.asm b/lib/libssl/src/crypto/des/asm/y-win32.asm index af5c102422a..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/des/asm/y-win32.asm +++ b/lib/libssl/src/crypto/des/asm/y-win32.asm @@ -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 - ; - 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 diff --git a/lib/libssl/src/crypto/des/des.c b/lib/libssl/src/crypto/des/des.c index 91d7153b346..0197489c9ed 100644 --- a/lib/libssl/src/crypto/des/des.c +++ b/lib/libssl/src/crypto/des/des.c @@ -58,6 +58,7 @@ #include #include +#include #ifndef MSDOS #ifndef VMS #include @@ -69,7 +70,7 @@ #include #endif /* __DECC */ #endif /* VMS */ -#else +#else /* MSDOS */ #include #endif @@ -88,10 +89,6 @@ #include #include -#if defined(__STDC__) || defined(VMS) || defined(M_XENIX) || defined(MSDOS) -#include -#endif - void usage(void); void doencryption(void); int uufwrite(unsigned char *data, int size, unsigned int num, FILE *fp); diff --git a/lib/libssl/src/crypto/des/des.h b/lib/libssl/src/crypto/des/des.h index 98a9c4127c8..ead67986d9e 100644 --- a/lib/libssl/src/crypto/des/des.h +++ b/lib/libssl/src/crypto/des/des.h @@ -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 */ -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 } diff --git a/lib/libssl/src/crypto/des/des.man b/lib/libssl/src/crypto/des/des.man index 7e06a1851a0..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/des/des.man +++ b/lib/libssl/src/crypto/des/des.man @@ -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 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) diff --git a/lib/libssl/src/crypto/des/des.pl b/lib/libssl/src/crypto/des/des.pl index 8a3f7e3ed63..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/des/des.pl +++ b/lib/libssl/src/crypto/des/des.pl @@ -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 index 00000000000..bf479e83d26 --- /dev/null +++ b/lib/libssl/src/crypto/des/des.pod @@ -0,0 +1,217 @@ +=pod + +=head1 NAME + +des - encrypt or decrypt data using Data Encryption Standard + +=head1 SYNOPSIS + +B +( +B<-e> +| +B<-E> +) | ( +B<-d> +| +B<-D> +) | ( +B<->[B][B] +) | +[ +B<-b3hfs> +] [ +B<-k> +I +] +] [ +B<-u>[I] +[ +I +[ +I +] ] + +=head1 NOTE + +This page describes the B stand-alone program, not the B +command. + +=head1 DESCRIPTION + +B +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. + +Two standard encryption modes are supported by the +B +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 +option is given. +If the key is an argument to the +B +command, it is potentially visible to users executing +ps(1) +or a derivative. To minimise this possibility, +B +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 +command reads from standard input unless +I +is specified and writes to standard output unless +I +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 + +Use the encryption +I +specified. + +=item B<-h> + +The +I +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 + +=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 I 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 diff --git a/lib/libssl/src/crypto/des/des_crypt.man b/lib/libssl/src/crypto/des/des_crypt.man index 0ecc416877f..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/des/des_crypt.man +++ b/lib/libssl/src/crypto/des/des_crypt.man @@ -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 -.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) diff --git a/lib/libssl/src/crypto/des/des_locl.h b/lib/libssl/src/crypto/des/des_locl.h index 4dfed199a71..1ace8f5930b 100644 --- a/lib/libssl/src/crypto/des/des_locl.h +++ b/lib/libssl/src/crypto/des/des_locl.h @@ -155,7 +155,7 @@ } \ } -#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)))) diff --git a/lib/libssl/src/crypto/des/destest.c b/lib/libssl/src/crypto/des/destest.c index 9ad4ecb0728..df0d615d6b7 100644 --- a/lib/libssl/src/crypto/des/destest.c +++ b/lib/libssl/src/crypto/des/destest.c @@ -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"); diff --git a/lib/libssl/src/crypto/des/doIP b/lib/libssl/src/crypto/des/doIP index 18cf2313036..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/des/doIP +++ b/lib/libssl/src/crypto/des/doIP @@ -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); diff --git a/lib/libssl/src/crypto/des/doPC1 b/lib/libssl/src/crypto/des/doPC1 index 096afd8c461..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/des/doPC1 +++ b/lib/libssl/src/crypto/des/doPC1 @@ -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); - diff --git a/lib/libssl/src/crypto/des/doPC2 b/lib/libssl/src/crypto/des/doPC2 index fa5cf74cf71..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/des/doPC2 +++ b/lib/libssl/src/crypto/des/doPC2 @@ -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); - } - } diff --git a/lib/libssl/src/crypto/des/fcrypt.c b/lib/libssl/src/crypto/des/fcrypt.c index fa1b8aa34ad..9b21f81cc2a 100644 --- a/lib/libssl/src/crypto/des/fcrypt.c +++ b/lib/libssl/src/crypto/des/fcrypt.c @@ -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) */ diff --git a/lib/libssl/src/crypto/des/fcrypt_b.c b/lib/libssl/src/crypto/des/fcrypt_b.c index 83c94054e3c..22c87f59836 100644 --- a/lib/libssl/src/crypto/des/fcrypt_b.c +++ b/lib/libssl/src/crypto/des/fcrypt_b.c @@ -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) diff --git a/lib/libssl/src/crypto/des/ncbc_enc.c b/lib/libssl/src/crypto/des/ncbc_enc.c index e0e67a417d5..3b681691a9b 100644 --- a/lib/libssl/src/crypto/des/ncbc_enc.c +++ b/lib/libssl/src/crypto/des/ncbc_enc.c @@ -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. * diff --git a/lib/libssl/src/crypto/des/podd.h b/lib/libssl/src/crypto/des/podd.h index 1b2bfe08432..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/des/podd.h +++ b/lib/libssl/src/crypto/des/podd.h @@ -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}; diff --git a/lib/libssl/src/crypto/des/qud_cksm.c b/lib/libssl/src/crypto/des/qud_cksm.c index 6ce8c61b426..5f0ec5387fa 100644 --- a/lib/libssl/src/crypto/des/qud_cksm.c +++ b/lib/libssl/src/crypto/des/qud_cksm.c @@ -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 *)<mp; - - 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); diff --git a/lib/libssl/src/crypto/des/rand_key.c b/lib/libssl/src/crypto/des/rand_key.c index 7816a8f25c1..ee1a6c274e9 100644 --- a/lib/libssl/src/crypto/des/rand_key.c +++ b/lib/libssl/src/crypto/des/rand_key.c @@ -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); } diff --git a/lib/libssl/src/crypto/des/set_key.c b/lib/libssl/src/crypto/des/set_key.c index bbdc71ba6bd..09afd4fc032 100644 --- a/lib/libssl/src/crypto/des/set_key.c +++ b/lib/libssl/src/crypto/des/set_key.c @@ -64,12 +64,27 @@ * 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); + } diff --git a/lib/libssl/src/crypto/des/shifts.pl b/lib/libssl/src/crypto/des/shifts.pl index ba686d8ef51..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/des/shifts.pl +++ b/lib/libssl/src/crypto/des/shifts.pl @@ -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; diff --git a/lib/libssl/src/crypto/des/sk.h b/lib/libssl/src/crypto/des/sk.h index f2ade88c7ca..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/des/sk.h +++ b/lib/libssl/src/crypto/des/sk.h @@ -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, -}}; diff --git a/lib/libssl/src/crypto/des/testdes.pl b/lib/libssl/src/crypto/des/testdes.pl index 01a165a963d..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/des/testdes.pl +++ b/lib/libssl/src/crypto/des/testdes.pl @@ -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"; - } diff --git a/lib/libssl/src/crypto/dh/dh_err.c b/lib/libssl/src/crypto/dh/dh_err.c index 0348bd24a2e..ff2d1684c21 100644 --- a/lib/libssl/src/crypto/dh/dh_err.c +++ b/lib/libssl/src/crypto/dh/dh_err.c @@ -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 diff --git a/lib/libssl/src/crypto/dsa/dsa_err.c b/lib/libssl/src/crypto/dsa/dsa_err.c index 38e4af968cb..2b3ab3a9ad8 100644 --- a/lib/libssl/src/crypto/dsa/dsa_err.c +++ b/lib/libssl/src/crypto/dsa/dsa_err.c @@ -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 diff --git a/lib/libssl/src/crypto/dsa/dsa_key.c b/lib/libssl/src/crypto/dsa/dsa_key.c index ab7f38fc7c6..5aef2d5fcff 100644 --- a/lib/libssl/src/crypto/dsa/dsa_key.c +++ b/lib/libssl/src/crypto/dsa/dsa_key.c @@ -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; diff --git a/lib/libssl/src/crypto/err/err.c b/lib/libssl/src/crypto/err/err.c index 93c64cbc4f2..eb8c76aa0be 100644 --- a/lib/libssl/src/crypto/err/err.c +++ b/lib/libssl/src/crypto/err/err.c @@ -55,9 +55,63 @@ * 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 #include +#include #include #include #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; } } diff --git a/lib/libssl/src/crypto/evp/evp_err.c b/lib/libssl/src/crypto/evp/evp_err.c index 97953a0fc18..fc149cbb1ad 100644 --- a/lib/libssl/src/crypto/evp/evp_err.c +++ b/lib/libssl/src/crypto/evp/evp_err.c @@ -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 diff --git a/lib/libssl/src/crypto/evp/evp_pkey.c b/lib/libssl/src/crypto/evp/evp_pkey.c index d5e6f5880ff..4ab091fa564 100644 --- a/lib/libssl/src/crypto/evp/evp_pkey.c +++ b/lib/libssl/src/crypto/evp/evp_pkey.c @@ -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); diff --git a/lib/libssl/src/crypto/evp/names.c b/lib/libssl/src/crypto/evp/names.c index 3e8f4603285..620f43feaad 100644 --- a/lib/libssl/src/crypto/evp/names.c +++ b/lib/libssl/src/crypto/evp/names.c @@ -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(); } diff --git a/lib/libssl/src/crypto/hmac/hmac.c b/lib/libssl/src/crypto/hmac/hmac.c index 23b7c98f8fa..e1ec79e0933 100644 --- a/lib/libssl/src/crypto/hmac/hmac.c +++ b/lib/libssl/src/crypto/hmac/hmac.c @@ -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) diff --git a/lib/libssl/src/crypto/lhash/lhash.c b/lib/libssl/src/crypto/lhash/lhash.c index 6a340a24038..7eb92a18bca 100644 --- a/lib/libssl/src/crypto/lhash/lhash.c +++ b/lib/libssl/src/crypto/lhash/lhash.c @@ -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; inum_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>16)^ret); } +unsigned long lh_num_items(LHASH *lh) + { + return lh ? lh->num_items : 0; + } diff --git a/lib/libssl/src/crypto/lhash/lhash.h b/lib/libssl/src/crypto/lhash/lhash.h index 6f6eeb2698a..d315fd9c6d7 100644 --- a/lib/libssl/src/crypto/lhash/lhash.h +++ b/lib/libssl/src/crypto/lhash/lhash.h @@ -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); diff --git a/lib/libssl/src/crypto/md5/Makefile.ssl b/lib/libssl/src/crypto/md5/Makefile.ssl index d50f967be77..45fbd042398 100644 --- a/lib/libssl/src/crypto/md5/Makefile.ssl +++ b/lib/libssl/src/crypto/md5/Makefile.ssl @@ -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 diff --git a/lib/libssl/src/crypto/md5/Makefile.uni b/lib/libssl/src/crypto/md5/Makefile.uni index d21c72f3ea0..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/md5/Makefile.uni +++ b/lib/libssl/src/crypto/md5/Makefile.uni @@ -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. diff --git a/lib/libssl/src/crypto/md5/asm/m5-win32.asm b/lib/libssl/src/crypto/md5/asm/m5-win32.asm index 51f5f17ca32..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/md5/asm/m5-win32.asm +++ b/lib/libssl/src/crypto/md5/asm/m5-win32.asm @@ -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 - ; - 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 diff --git a/lib/libssl/src/crypto/md5/md5_locl.h b/lib/libssl/src/crypto/md5/md5_locl.h index 06af6332286..c9124841228 100644 --- a/lib/libssl/src/crypto/md5/md5_locl.h +++ b/lib/libssl/src/crypto/md5/md5_locl.h @@ -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))) diff --git a/lib/libssl/src/crypto/mem_dbg.c b/lib/libssl/src/crypto/mem_dbg.c index 14770c07337..a3994853004 100644 --- a/lib/libssl/src/crypto/mem_dbg.c +++ b/lib/libssl/src/crypto/mem_dbg.c @@ -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); diff --git a/lib/libssl/src/crypto/objects/o_names.c b/lib/libssl/src/crypto/objects/o_names.c index d654eb220ea..d9389a5e5a3 100644 --- a/lib/libssl/src/crypto/objects/o_names.c +++ b/lib/libssl/src/crypto/objects/o_names.c @@ -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); diff --git a/lib/libssl/src/crypto/objects/obj_err.c b/lib/libssl/src/crypto/objects/obj_err.c index cef401db277..7aec0ed47a6 100644 --- a/lib/libssl/src/crypto/objects/obj_err.c +++ b/lib/libssl/src/crypto/objects/obj_err.c @@ -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 diff --git a/lib/libssl/src/crypto/objects/objects.h b/lib/libssl/src/crypto/objects/objects.h index d1a5ad25029..95c8a21568e 100644 --- a/lib/libssl/src/crypto/objects/objects.h +++ b/lib/libssl/src/crypto/objects/objects.h @@ -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 diff --git a/lib/libssl/src/crypto/opensslv.h b/lib/libssl/src/crypto/opensslv.h index 55d5d06cf53..55ec97389f6 100644 --- a/lib/libssl/src/crypto/opensslv.h +++ b/lib/libssl/src/crypto/opensslv.h @@ -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 */ diff --git a/lib/libssl/src/crypto/pem/pem_err.c b/lib/libssl/src/crypto/pem/pem_err.c index 642129da204..8b1789b11c9 100644 --- a/lib/libssl/src/crypto/pem/pem_err.c +++ b/lib/libssl/src/crypto/pem/pem_err.c @@ -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 diff --git a/lib/libssl/src/crypto/pem/pem_lib.c b/lib/libssl/src/crypto/pem/pem_lib.c index 072211ba0fe..b5e0a650f8d 100644 --- a/lib/libssl/src/crypto/pem/pem_lib.c +++ b/lib/libssl/src/crypto/pem/pem_lib.c @@ -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 */ diff --git a/lib/libssl/src/crypto/perlasm/x86asm.pl b/lib/libssl/src/crypto/perlasm/x86asm.pl index 44e330eb8d1..81c6e64e871 100644 --- a/lib/libssl/src/crypto/perlasm/x86asm.pl +++ b/lib/libssl/src/crypto/perlasm/x86asm.pl @@ -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 "); &comment(""); diff --git a/lib/libssl/src/crypto/perlasm/x86ms.pl b/lib/libssl/src/crypto/perlasm/x86ms.pl index 252a57bdb51..206452341d1 100644 --- a/lib/libssl/src/crypto/perlasm/x86ms.pl +++ b/lib/libssl/src/crypto/perlasm/x86ms.pl @@ -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"); } diff --git a/lib/libssl/src/crypto/perlasm/x86unix.pl b/lib/libssl/src/crypto/perlasm/x86unix.pl index 60d75f5ce4b..309060ea001 100644 --- a/lib/libssl/src/crypto/perlasm/x86unix.pl +++ b/lib/libssl/src/crypto/perlasm/x86unix.pl @@ -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; diff --git a/lib/libssl/src/crypto/pkcs12/p12_crt.c b/lib/libssl/src/crypto/pkcs12/p12_crt.c index 56d88b07596..ee8aed54c77 100644 --- a/lib/libssl/src/crypto/pkcs12/p12_crt.c +++ b/lib/libssl/src/crypto/pkcs12/p12_crt.c @@ -61,7 +61,7 @@ #include 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); diff --git a/lib/libssl/src/crypto/pkcs12/p12_key.c b/lib/libssl/src/crypto/pkcs12/p12_key.c index 02fdd20e2fc..b364671ed22 100644 --- a/lib/libssl/src/crypto/pkcs12/p12_key.c +++ b/lib/libssl/src/crypto/pkcs12/p12_key.c @@ -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); diff --git a/lib/libssl/src/crypto/pkcs12/p12_kiss.c b/lib/libssl/src/crypto/pkcs12/p12_kiss.c index 08a60556e09..ee257ffbadd 100644 --- a/lib/libssl/src/crypto/pkcs12/p12_kiss.c +++ b/lib/libssl/src/crypto/pkcs12/p12_kiss.c @@ -62,9 +62,17 @@ /* 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: diff --git a/lib/libssl/src/crypto/pkcs12/p12_mutl.c b/lib/libssl/src/crypto/pkcs12/p12_mutl.c index f1094b3840e..369257ed4c1 100644 --- a/lib/libssl/src/crypto/pkcs12/p12_mutl.c +++ b/lib/libssl/src/crypto/pkcs12/p12_mutl.c @@ -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); diff --git a/lib/libssl/src/crypto/pkcs12/pk12err.c b/lib/libssl/src/crypto/pkcs12/pk12err.c index 9d8de10e1e6..12db54f49ef 100644 --- a/lib/libssl/src/crypto/pkcs12/pk12err.c +++ b/lib/libssl/src/crypto/pkcs12/pk12err.c @@ -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 diff --git a/lib/libssl/src/crypto/pkcs12/pkcs12.h b/lib/libssl/src/crypto/pkcs12/pkcs12.h index 254000fa121..dad356c00f6 100644 --- a/lib/libssl/src/crypto/pkcs12/pkcs12.h +++ b/lib/libssl/src/crypto/pkcs12/pkcs12.h @@ -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); diff --git a/lib/libssl/src/crypto/pkcs7/README b/lib/libssl/src/crypto/pkcs7/README index 27001c69707..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/pkcs7/README +++ b/lib/libssl/src/crypto/pkcs7/README @@ -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 diff --git a/lib/libssl/src/crypto/pkcs7/pk7_doit.c b/lib/libssl/src/crypto/pkcs7/pk7_doit.c index 80ac5e34b4c..4ab24a86f51 100644 --- a/lib/libssl/src/crypto/pkcs7/pk7_doit.c +++ b/lib/libssl/src/crypto/pkcs7/pk7_doit.c @@ -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); diff --git a/lib/libssl/src/crypto/pkcs7/pkcs7err.c b/lib/libssl/src/crypto/pkcs7/pkcs7err.c index 813a8af9edc..8ded8913dbf 100644 --- a/lib/libssl/src/crypto/pkcs7/pkcs7err.c +++ b/lib/libssl/src/crypto/pkcs7/pkcs7err.c @@ -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 diff --git a/lib/libssl/src/crypto/rand/md_rand.c b/lib/libssl/src/crypto/rand/md_rand.c index 6b158f03495..da4258c479c 100644 --- a/lib/libssl/src/crypto/rand/md_rand.c +++ b/lib/libssl/src/crypto/rand/md_rand.c @@ -55,6 +55,59 @@ * 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 */ @@ -130,6 +183,10 @@ #include +#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= ENTROPY_NEEDED); + ret = entropy >= ENTROPY_NEEDED; + + CRYPTO_w_unlock(CRYPTO_LOCK_RAND); + + return ret; } #ifdef WINDOWS #include #include +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. diff --git a/lib/libssl/src/crypto/rand/rand.h b/lib/libssl/src/crypto/rand/rand.h index 28f45ec0526..2973ee90e44 100644 --- a/lib/libssl/src/crypto/rand/rand.h +++ b/lib/libssl/src/crypto/rand/rand.h @@ -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 void RAND_screen(void); +int RAND_event(UINT, WPARAM, LPARAM); #endif void ERR_load_RAND_strings(void); diff --git a/lib/libssl/src/crypto/rand/rand_egd.c b/lib/libssl/src/crypto/rand/rand_egd.c index d834408bd4e..380c7828c30 100644 --- a/lib/libssl/src/crypto/rand/rand_egd.c +++ b/lib/libssl/src/crypto/rand/rand_egd.c @@ -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); diff --git a/lib/libssl/src/crypto/rand/rand_err.c b/lib/libssl/src/crypto/rand/rand_err.c index d1263edf80f..1af0aa0b8ac 100644 --- a/lib/libssl/src/crypto/rand/rand_err.c +++ b/lib/libssl/src/crypto/rand/rand_err.c @@ -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 @@ -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} }; diff --git a/lib/libssl/src/crypto/rand/rand_lib.c b/lib/libssl/src/crypto/rand/rand_lib.c index b09a300c46e..7da74aab0ef 100644 --- a/lib/libssl/src/crypto/rand/rand_lib.c +++ b/lib/libssl/src/crypto/rand/rand_lib.c @@ -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; + } diff --git a/lib/libssl/src/crypto/rand/randfile.c b/lib/libssl/src/crypto/rand/randfile.c index 658a8d6b65f..9ff3974cc7d 100644 --- a/lib/libssl/src/crypto/rand/randfile.c +++ b/lib/libssl/src/crypto/rand/randfile.c @@ -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); diff --git a/lib/libssl/src/crypto/rc2/Makefile.uni b/lib/libssl/src/crypto/rc2/Makefile.uni index 4dc20c6fcfd..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/rc2/Makefile.uni +++ b/lib/libssl/src/crypto/rc2/Makefile.uni @@ -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. diff --git a/lib/libssl/src/crypto/rc4/Makefile.ssl b/lib/libssl/src/crypto/rc4/Makefile.ssl index 2ea95f0298d..8d2a795c22a 100644 --- a/lib/libssl/src/crypto/rc4/Makefile.ssl +++ b/lib/libssl/src/crypto/rc4/Makefile.ssl @@ -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: diff --git a/lib/libssl/src/crypto/rc4/Makefile.uni b/lib/libssl/src/crypto/rc4/Makefile.uni index 855d9e50f37..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/rc4/Makefile.uni +++ b/lib/libssl/src/crypto/rc4/Makefile.uni @@ -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. diff --git a/lib/libssl/src/crypto/rc4/asm/r4-win32.asm b/lib/libssl/src/crypto/rc4/asm/r4-win32.asm index 70b0f7484cd..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/rc4/asm/r4-win32.asm +++ b/lib/libssl/src/crypto/rc4/asm/r4-win32.asm @@ -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 - ; - 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 diff --git a/lib/libssl/src/crypto/rc5/Makefile.ssl b/lib/libssl/src/crypto/rc5/Makefile.ssl index 35abb9d0d18..5a54a162bae 100644 --- a/lib/libssl/src/crypto/rc5/Makefile.ssl +++ b/lib/libssl/src/crypto/rc5/Makefile.ssl @@ -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: diff --git a/lib/libssl/src/crypto/rc5/Makefile.uni b/lib/libssl/src/crypto/rc5/Makefile.uni index 4dc20c6fcfd..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/rc5/Makefile.uni +++ b/lib/libssl/src/crypto/rc5/Makefile.uni @@ -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. diff --git a/lib/libssl/src/crypto/rc5/asm/r5-win32.asm b/lib/libssl/src/crypto/rc5/asm/r5-win32.asm index f43d3711f04..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/rc5/asm/r5-win32.asm +++ b/lib/libssl/src/crypto/rc5/asm/r5-win32.asm @@ -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 - ; - 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 diff --git a/lib/libssl/src/crypto/ripemd/Makefile.ssl b/lib/libssl/src/crypto/ripemd/Makefile.ssl index c6153d43615..6ada9f067bf 100644 --- a/lib/libssl/src/crypto/ripemd/Makefile.ssl +++ b/lib/libssl/src/crypto/ripemd/Makefile.ssl @@ -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: diff --git a/lib/libssl/src/crypto/ripemd/Makefile.uni b/lib/libssl/src/crypto/ripemd/Makefile.uni index 5310020eb11..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/ripemd/Makefile.uni +++ b/lib/libssl/src/crypto/ripemd/Makefile.uni @@ -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. diff --git a/lib/libssl/src/crypto/ripemd/asm/rm-win32.asm b/lib/libssl/src/crypto/ripemd/asm/rm-win32.asm index f07d517857b..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/ripemd/asm/rm-win32.asm +++ b/lib/libssl/src/crypto/ripemd/asm/rm-win32.asm @@ -1,1973 +0,0 @@ - ; 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 - ; - 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 diff --git a/lib/libssl/src/crypto/ripemd/rmd_locl.h b/lib/libssl/src/crypto/ripemd/rmd_locl.h index 145cf316b90..f537b888675 100644 --- a/lib/libssl/src/crypto/ripemd/rmd_locl.h +++ b/lib/libssl/src/crypto/ripemd/rmd_locl.h @@ -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)) diff --git a/lib/libssl/src/crypto/rsa/rsa_err.c b/lib/libssl/src/crypto/rsa/rsa_err.c index 5cfbea2b033..1cde7c0da46 100644 --- a/lib/libssl/src/crypto/rsa/rsa_err.c +++ b/lib/libssl/src/crypto/rsa/rsa_err.c @@ -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 diff --git a/lib/libssl/src/crypto/sha/Makefile.ssl b/lib/libssl/src/crypto/sha/Makefile.ssl index 79ef43aa349..72acd8f0462 100644 --- a/lib/libssl/src/crypto/sha/Makefile.ssl +++ b/lib/libssl/src/crypto/sha/Makefile.ssl @@ -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: diff --git a/lib/libssl/src/crypto/sha/Makefile.uni b/lib/libssl/src/crypto/sha/Makefile.uni index b7ec5caa4e5..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/sha/Makefile.uni +++ b/lib/libssl/src/crypto/sha/Makefile.uni @@ -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. diff --git a/lib/libssl/src/crypto/sha/asm/s1-win32.asm b/lib/libssl/src/crypto/sha/asm/s1-win32.asm index 699afdb0223..e69de29bb2d 100644 --- a/lib/libssl/src/crypto/sha/asm/s1-win32.asm +++ b/lib/libssl/src/crypto/sha/asm/s1-win32.asm @@ -1,1716 +0,0 @@ - ; 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 - ; - 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 diff --git a/lib/libssl/src/crypto/sha/asm/sha1-586.pl b/lib/libssl/src/crypto/sha/asm/sha1-586.pl index 48d9192a4e6..09df993ecd4 100644 --- a/lib/libssl/src/crypto/sha/asm/sha1-586.pl +++ b/lib/libssl/src/crypto/sha/asm/sha1-586.pl @@ -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"); diff --git a/lib/libssl/src/crypto/sha/sha_locl.h b/lib/libssl/src/crypto/sha/sha_locl.h index 3e6f489b876..2f8aef83f38 100644 --- a/lib/libssl/src/crypto/sha/sha_locl.h +++ b/lib/libssl/src/crypto/sha/sha_locl.h @@ -130,11 +130,7 @@ # 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 diff --git a/lib/libssl/src/crypto/x509/x509.h b/lib/libssl/src/crypto/x509/x509.h index d3336d9cebb..0192272e7c1 100644 --- a/lib/libssl/src/crypto/x509/x509.h +++ b/lib/libssl/src/crypto/x509/x509.h @@ -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 diff --git a/lib/libssl/src/crypto/x509/x509_err.c b/lib/libssl/src/crypto/x509/x509_err.c index fdedbdac344..848add56e9b 100644 --- a/lib/libssl/src/crypto/x509/x509_err.c +++ b/lib/libssl/src/crypto/x509/x509_err.c @@ -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 diff --git a/lib/libssl/src/crypto/x509/x509_trs.c b/lib/libssl/src/crypto/x509/x509_trs.c index 9f7d67952db..c779aaf94d6 100644 --- a/lib/libssl/src/crypto/x509/x509_trs.c +++ b/lib/libssl/src/crypto/x509/x509_trs.c @@ -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; -} diff --git a/lib/libssl/src/crypto/x509/x509_vfy.c b/lib/libssl/src/crypto/x509/x509_vfy.c index 4fdff54124c..3ddb2303d38 100644 --- a/lib/libssl/src/crypto/x509/x509_vfy.c +++ b/lib/libssl/src/crypto/x509/x509_vfy.c @@ -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); diff --git a/lib/libssl/src/crypto/x509/x509name.c b/lib/libssl/src/crypto/x509/x509name.c index cf2382d42c0..4c20e03eced 100644 --- a/lib/libssl/src/crypto/x509/x509name.c +++ b/lib/libssl/src/crypto/x509/x509name.c @@ -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; diff --git a/lib/libssl/src/crypto/x509v3/v3_purp.c b/lib/libssl/src/crypto/x509v3/v3_purp.c index b7494ebcd56..5594a1d64f9 100644 --- a/lib/libssl/src/crypto/x509v3/v3_purp.c +++ b/lib/libssl/src/crypto/x509v3/v3_purp.c @@ -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; +} diff --git a/lib/libssl/src/crypto/x509v3/v3err.c b/lib/libssl/src/crypto/x509v3/v3err.c index b7d4e350c43..aa4a605dc48 100644 --- a/lib/libssl/src/crypto/x509v3/v3err.c +++ b/lib/libssl/src/crypto/x509v3/v3err.c @@ -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 diff --git a/lib/libssl/src/crypto/x509v3/x509v3.h b/lib/libssl/src/crypto/x509v3/x509v3.h index fe01755797b..96ceb7c4fb7 100644 --- a/lib/libssl/src/crypto/x509v3/x509v3.h +++ b/lib/libssl/src/crypto/x509v3/x509v3.h @@ -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) diff --git a/lib/libssl/src/doc/apps/CA.pl.pod b/lib/libssl/src/doc/apps/CA.pl.pod index 83e4c0af810..9d287f0c4d5 100644 --- a/lib/libssl/src/doc/apps/CA.pl.pod +++ b/lib/libssl/src/doc/apps/CA.pl.pod @@ -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 creates RSA CAs and requests it is still possible to +use it with DSA certificates and requests using the L 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 script. diff --git a/lib/libssl/src/doc/apps/dgst.pod b/lib/libssl/src/doc/apps/dgst.pod index cbf2cc529aa..fcfd3ecf23f 100644 --- a/lib/libssl/src/doc/apps/dgst.pod +++ b/lib/libssl/src/doc/apps/dgst.pod @@ -6,7 +6,7 @@ dgst, md5, md2, sha1, sha, mdc2, ripemd160 - message digests =head1 SYNOPSIS -[B] +B B [B<-md5|-md2|-sha1|-sha|mdc2|-ripemd160>] [B<-c>] [B<-d>] diff --git a/lib/libssl/src/doc/apps/dhparam.pod b/lib/libssl/src/doc/apps/dhparam.pod index 6b237ec05a9..15aabf4ac8a 100644 --- a/lib/libssl/src/doc/apps/dhparam.pod +++ b/lib/libssl/src/doc/apps/dhparam.pod @@ -6,18 +6,19 @@ dhparam - DH parameter manipulation and generation =head1 SYNOPSIS -B +B [B<-inform DER|PEM>] [B<-outform DER|PEM>] -[B<-in filename>] -[B<-out filename>] +[B<-in> I] +[B<-out> I] +[B<-dsaparam>] [B<-noout>] [B<-text>] [B<-C>] [B<-2>] [B<-5>] -[B<-rand file(s)>] -[numbits] +[B<-rand> I] +[I] =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 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 This specifies the output filename parameters to. Standard output is used if this option is not present. The output filename should B 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 a file or files containing random data used to seed the random number generator, or an EGD socket (see L). @@ -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 +=item I this option specifies that a parameter set should be generated of size -B. It must be the last option. If not present then a value of 512 +I. 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 function. +be loaded by calling the BIB<()> function. =back @@ -112,4 +125,9 @@ There should be a way to generate and manipulate DH keys. L +=head1 HISTORY + +The B command was added in OpenSSL 0.9.5. +The B<-dsaparam> option was added in OpenSSL 0.9.6. + =cut diff --git a/lib/libssl/src/doc/apps/genrsa.pod b/lib/libssl/src/doc/apps/genrsa.pod index a2d878410b0..70d35fef0ab 100644 --- a/lib/libssl/src/doc/apps/genrsa.pod +++ b/lib/libssl/src/doc/apps/genrsa.pod @@ -83,3 +83,6 @@ be much larger (typically 1024 bits). =head1 SEE ALSO L + +=cut + diff --git a/lib/libssl/src/doc/apps/openssl.pod b/lib/libssl/src/doc/apps/openssl.pod index 9b1320606ba..2fc61b6c217 100644 --- a/lib/libssl/src/doc/apps/openssl.pod +++ b/lib/libssl/src/doc/apps/openssl.pod @@ -12,6 +12,10 @@ I [ I ] [ I ] +B [ B | B | B ] + +B BI [ I ] + =head1 DESCRIPTION OpenSSL is a cryptography toolkit implementing the Secure Sockets Layer (SSL @@ -35,6 +39,22 @@ The B program provides a rich variety of commands (I in the SYNOPSIS above), each of which often has a wealth of options and arguments (I and I in the SYNOPSIS). +The pseudo-commands B, B, +and B 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 utility. + +The pseudo-command BI tests whether a command of the +specified name is available. If no command named I exists, it +returns 0 (success) and prints BI; otherwise it returns 1 +and prints I. In both cases, the output goes to B and +nothing is printed to B. 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 program. (BI is +not able to detect pseudo-commands such as B, +BI<...>B<-commands>, or BI itself.) + =head2 STANDARD COMMANDS =over 10 @@ -103,6 +123,10 @@ Generation of hashed passwords. PKCS#7 Data Management. +=item L|rand(1)> + +Generate pseudo-random bytes. + =item L|req(1)> X.509 Certificate Signing Request (CSR) Management. @@ -285,14 +309,17 @@ L, L, L, L, L, L, L, L, L, -L, L, L, +L, L, L, L, L, L, L, L, L, L, L, L =head1 HISTORY -The openssl(1) document appeared in OpenSSL 0.9.2 +The openssl(1) document appeared in OpenSSL 0.9.2. +The BIB<-commands> pseudo-commands were added in OpenSSL 0.9.3; +the BI 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 index 00000000000..f81eab0457f --- /dev/null +++ b/lib/libssl/src/doc/apps/rand.pod @@ -0,0 +1,50 @@ +=pod + +=head1 NAME + +rand - generate pseudo-random bytes + +=head1 SYNOPSIS + +B +[B<-out> I] +[B<-rand> I] +[B<-base64>] +I + +=head1 DESCRIPTION + +The B command outputs I pseudo-random bytes after seeding +the random number generater once. As in other B 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 + +Write to I instead of standard output. + +=item B<-rand> I + +Use specified file or files or EGD socket (see L) +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 + +=cut diff --git a/lib/libssl/src/doc/apps/s_client.pod b/lib/libssl/src/doc/apps/s_client.pod index 3ede134164c..2f803753199 100644 --- a/lib/libssl/src/doc/apps/s_client.pod +++ b/lib/libssl/src/doc/apps/s_client.pod @@ -22,6 +22,7 @@ B B [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 then the session will be -renegotiated. If the line begins with a B 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, and if the line begins with a B or if end of file is reached, the +connection will be closed down. =head1 NOTES diff --git a/lib/libssl/src/doc/apps/x509.pod b/lib/libssl/src/doc/apps/x509.pod index b127182bbbf..e4ae5468da3 100644 --- a/lib/libssl/src/doc/apps/x509.pod +++ b/lib/libssl/src/doc/apps/x509.pod @@ -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 (any purpose), B (SSL client use), B -(SSL server use) B (S/MIME email) and B (Object signing). +adds a trusted certificate use. Any object name can be used here +but currently only B (SSL client use), B +(SSL server use) and B (S/MIME email) are used. +Other OpenSSL applications may define additional uses. =item B<-addreject arg> diff --git a/lib/libssl/src/doc/crypto/DH_set_method.pod b/lib/libssl/src/doc/crypto/DH_set_method.pod index dca41d8dbc8..a8f75bdd9d0 100644 --- a/lib/libssl/src/doc/crypto/DH_set_method.pod +++ b/lib/libssl/src/doc/crypto/DH_set_method.pod @@ -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); diff --git a/lib/libssl/src/doc/crypto/DSA_set_method.pod b/lib/libssl/src/doc/crypto/DSA_set_method.pod index 0b13ec9237c..edec46413d6 100644 --- a/lib/libssl/src/doc/crypto/DSA_set_method.pod +++ b/lib/libssl/src/doc/crypto/DSA_set_method.pod @@ -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 index 00000000000..9707a4b3997 --- /dev/null +++ b/lib/libssl/src/doc/crypto/EVP_OpenInit.pod @@ -0,0 +1,51 @@ +=pod + +=head1 NAME + +EVP_OpenInit, EVP_OpenUpdate, EVP_OpenFinal - EVP envelope decryption + +=head1 SYNOPSIS + + #include + + 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 for decryption +with cipher B. It decrypts the encrypted symmetric key of length +B bytes passed in the B parameter using the private key B. +The IV is supplied in the B parameter. + +EVP_OpenUpdate() and EVP_OpenFinal() have exactly the same properties +as the EVP_DecryptUpdate() and EVP_DecryptFinal() routines, as +documented on the L 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,L +L, +L + +=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 index 00000000000..1579d110fa2 --- /dev/null +++ b/lib/libssl/src/doc/crypto/EVP_SealInit.pod @@ -0,0 +1,70 @@ +=pod + +=head1 NAME + +EVP_SealInit, EVP_SealUpdate, EVP_SealFinal - EVP envelope encryption + +=head1 SYNOPSIS + + #include + + 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 for encryption +with cipher B using a random secret key and IV supplied in +the B parameter. B 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 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 must have room for B bytes. The actual +size of each encrypted secret key is written to the array B. B is +an array of B 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 manual +page. + +=head1 RETURN VALUES + +EVP_SealInit() returns -1 on error or B 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,L +L, +L + +=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 index 00000000000..bbc9203c9ca --- /dev/null +++ b/lib/libssl/src/doc/crypto/EVP_SignInit.pod @@ -0,0 +1,85 @@ +=pod + +=head1 NAME + +EVP_SignInit, EVP_SignUpdate, EVP_SignFinal - EVP signing functions + +=head1 SYNOPSIS + + #include + + 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 to using digest +B: this will typically be supplied by a function such as +EVP_sha1(). + +EVP_SignUpdate() hashes B bytes of data at B into the +signature context B. This funtion can be called several times on the +same B to include additional data. + +EVP_SignFinal() signs the data in B using the private key B +and places the signature in B. If the B 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, 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. + +=head1 NOTES + +The B 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. + +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, +L, L, +L, L, L, +L, L, L, +L, L + +=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 index 00000000000..3b5e07f4ade --- /dev/null +++ b/lib/libssl/src/doc/crypto/EVP_VerifyInit.pod @@ -0,0 +1,71 @@ +=pod + +=head1 NAME + +EVP_VerifyInit, EVP_VerifyUpdate, EVP_VerifyFinal - EVP signature verification functions + +=head1 SYNOPSIS + + #include + + 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 to using digest +B: this will typically be supplied by a function such as EVP_sha1(). + +EVP_VerifyUpdate() hashes B bytes of data at B into the +verification context B. This funtion can be called several times on the +same B to include additional data. + +EVP_VerifyFinal() verifies the data in B using the public key B +and against the B bytes at B. 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. + +=head1 NOTES + +The B 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. + +=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, +L, L, +L, L, L, +L, L, L, +L, L + +=head1 HISTORY + +EVP_VerifyInit(), EVP_VerifyUpdate() and EVP_VerifyFinal() are +available in all versions of SSLeay and OpenSSL. + +=cut diff --git a/lib/libssl/src/doc/crypto/RAND_add.pod b/lib/libssl/src/doc/crypto/RAND_add.pod index 0a13ec2a92b..67c66f3e0c9 100644 --- a/lib/libssl/src/doc/crypto/RAND_add.pod +++ b/lib/libssl/src/doc/crypto/RAND_add.pod @@ -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_seed() is equivalent to RAND_add() when B. +RAND_event() collects the entropy from Windows events such as mouse +movements and other user interaction. It should be called with the +B, B and B arguments of I 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 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, L 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 diff --git a/lib/libssl/src/doc/crypto/RAND_set_rand_method.pod b/lib/libssl/src/doc/crypto/RAND_set_rand_method.pod index 466e9b8767b..464eba416d4 100644 --- a/lib/libssl/src/doc/crypto/RAND_set_rand_method.pod +++ b/lib/libssl/src/doc/crypto/RAND_set_rand_method.pod @@ -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 diff --git a/lib/libssl/src/doc/crypto/RSA_set_method.pod b/lib/libssl/src/doc/crypto/RSA_set_method.pod index deb1183a235..14b0b4cf359 100644 --- a/lib/libssl/src/doc/crypto/RSA_set_method.pod +++ b/lib/libssl/src/doc/crypto/RSA_set_method.pod @@ -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); diff --git a/lib/libssl/src/doc/crypto/blowfish.pod b/lib/libssl/src/doc/crypto/blowfish.pod index e8c7114311b..e0b777418fa 100644 --- a/lib/libssl/src/doc/crypto/blowfish.pod +++ b/lib/libssl/src/doc/crypto/blowfish.pod @@ -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 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 which needs to be passed along into the next call of the same function +for the same message. B 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 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, which is a pointer to an integer where the current offset in B is stored between calls. This integer must be initialised -to zero when B is filled with zeros. +to zero when B is initialised. BF_cbc_encrypt() is the Cipher Block Chaining function for Blowfish. It encrypts or decrypts the 64 bits chunks of B using the key B, putting the result in B. B decides if encryption (BF_ENCRYPT) or decryption (BF_DECRYPT) shall be performed. B 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 using the key B, putting the result in B. B decides if encryption (B) or decryption (B) shall be performed. B must point at an -8 byte long initialisation vector, which must be initially filled with zeros. -B must point at an integer which must be initially zero. +8 byte long initialisation vector. B 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 index 00000000000..c553210ef28 --- /dev/null +++ b/lib/libssl/src/doc/crypto/des.pod @@ -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 + + 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 from a key, the second is the +actual encryption. A DES key is of type I. 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; 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 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 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 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 +Is. + +des_ecb_encrypt() is the basic DES encryption routine that encrypts or +decrypts a single 8-byte I in I +(ECB) mode. It always transforms the input data, pointed to by +I, into the output data, pointed to by the I argument. +If the I argument is non-zero (DES_ENCRYPT), the I +(cleartext) is encrypted in to the I (ciphertext) using the +key_schedule specified by the I argument, previously set via +I. If I is zero (DES_DECRYPT), the I (now +ciphertext) is decrypted into the I (now cleartext). Input +and output may overlap. des_ecb_encrypt() does not return a value. + +des_ecb3_encrypt() encrypts/decrypts the I block by using +three-key Triple-DES encryption in ECB mode. This involves encrypting +the input with I, decrypting with the key schedule I, and +then encrypting with I. This routine greatly reduces the chances +of brute force breaking of DES and has the advantage of if I, +I and I are the same, it is equivalent to just encryption +using ECB mode and I as the key. + +The macro des_ecb2_encrypt() is provided to perform two-key Triple-DES +encryption by using I for the final encryption. + +des_ncbc_encrypt() encrypts/decrypts using the I +(CBC) mode of DES. If the I argument is non-zero, the +routine cipher-block-chain encrypts the cleartext data pointed to by +the I argument into the ciphertext pointed to by the I +argument, using the key schedule provided by the I argument, +and initialization vector provided by the I argument. If the +I 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 and +I to 'whiten' the encryption. I and I 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. This mode is used by SSL. + +The des_ede2_cbc_encrypt() macro implements two-key Triple-DES by +reusing I for the final encryption. C. +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 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, 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 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 to +standarf output, turns echo off and reads in input string from the +terminal. The string is returned in I, which must have space for +at least I bytes. If I 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. This function is +used by Kerberos v4. Other applications should use +L 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, 1, 2, 3 or 4 times. If I is +non-NULL, the 8 bytes generated by each pass are written into +I. + +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 bytes to file descriptor I from +buffer I. The data is encrypted via I (default) +using I for the key and I as a starting vector. The actual +data send down I 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 bytes from file descriptor +I into buffer I. The data being read from I is assumed to +have come from des_enc_write() and is decrypted using I for +the key schedule and I for the initial vector. + +B 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 is used to specify the encryption mode to use with +des_enc_read() and des_end_write(). If set to I (the +default), des_pcbc_encrypt is used. If set to I +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. + +The L 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; 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 library was written to be source code compatible with +the MIT Kerberos library. + +=head1 SEE ALSO + +crypt(3), L, L, L + +=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 diff --git a/lib/libssl/src/doc/crypto/des_modes.pod b/lib/libssl/src/doc/crypto/des_modes.pod index d8148c86fc8..1aa3ac763b9 100644 --- a/lib/libssl/src/doc/crypto/des_modes.pod +++ b/lib/libssl/src/doc/crypto/des_modes.pod @@ -248,3 +248,6 @@ it to: L, L, L, L + +=cut + diff --git a/lib/libssl/src/doc/crypto/rsa.pod b/lib/libssl/src/doc/crypto/rsa.pod index 0486c044a68..eb8ba612c48 100644 --- a/lib/libssl/src/doc/crypto/rsa.pod +++ b/lib/libssl/src/doc/crypto/rsa.pod @@ -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. -B, B and B may be B in private keys, but the -RSA operations are much faster when these values are available. +B

, B, B, B and B may be B 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 index 00000000000..1726c55bcda --- /dev/null +++ b/lib/libssl/src/ms/mingw32.bat @@ -0,0 +1,92 @@ +@rem OpenSSL with Mingw32+GNU as +@rem --------------------------- + +perl Configure Mingw32 %1 %2 %3 %4 %5 %6 %7 %8 + +@echo off + +perl -e "exit 1 if '%1' eq 'no-asm'" +if errorlevel 1 goto noasm + +echo Generating x86 for GNU assember + +echo Bignum +cd crypto\bn\asm +perl x86.pl gaswin > bn-win32.s +cd ..\..\.. + +echo DES +cd crypto\des\asm +perl des-586.pl gaswin > d-win32.s +cd ..\..\.. + +echo crypt +cd crypto\des\asm +perl crypt586.pl gaswin > y-win32.s +cd ..\..\.. + +echo Blowfish +cd crypto\bf\asm +perl bf-586.pl gaswin > b-win32.s +cd ..\..\.. + +echo CAST5 +cd crypto\cast\asm +perl cast-586.pl gaswin > c-win32.s +cd ..\..\.. + +echo RC4 +cd crypto\rc4\asm +perl rc4-586.pl gaswin > r4-win32.s +cd ..\..\.. + +echo MD5 +cd crypto\md5\asm +perl md5-586.pl gaswin > m5-win32.s +cd ..\..\.. + +echo SHA1 +cd crypto\sha\asm +perl sha1-586.pl gaswin > s1-win32.s +cd ..\..\.. + +echo RIPEMD160 +cd crypto\ripemd\asm +perl rmd-586.pl gaswin > rm-win32.s +cd ..\..\.. + +echo RC5\32 +cd crypto\rc5\asm +perl rc5-586.pl gaswin > r5-win32.s +cd ..\..\.. + +:noasm + +echo Generating makefile +perl util\mkfiles.pl >MINFO +perl util\mk1mf.pl gaswin Mingw32 >ms\mingw32a.mak +perl util\mk1mf.pl gaswin Mingw32-files >ms\mingw32f.mak +echo Generating DLL definition files +perl util\mkdef.pl 32 libeay >ms\libeay32.def +if errorlevel 1 goto end +perl util\mkdef.pl 32 ssleay >ms\ssleay32.def +if errorlevel 1 goto end + +rem Create files -- this can be skipped if using the GNU file utilities +make -f ms/mingw32f.mak +echo You can ignore the error messages above + +echo Building the libraries +make -f ms/mingw32a.mak +if errorlevel 1 goto end + +echo Generating the DLLs and input libraries +dllwrap --dllname libeay32.dll --output-lib out/libeay32.a --def ms/libeay32.def out/libcrypto.a -lwsock32 -lgdi32 +if errorlevel 1 goto end +dllwrap --dllname libssl32.dll --output-lib out/libssl32.a --def ms/ssleay32.def out/libssl.a out/libeay32.a +if errorlevel 1 goto end + +echo Done compiling OpenSSL + +:end + diff --git a/lib/libssl/src/ms/test.bat b/lib/libssl/src/ms/test.bat index 3506a644f59..ef37beaa223 100644 --- a/lib/libssl/src/ms/test.bat +++ b/lib/libssl/src/ms/test.bat @@ -136,7 +136,7 @@ ssltest -bio_pair -ssl2 if errorlevel 1 goto done echo test sslv2/sslv3 with 1024 bit DHE via BIO pair -ssltest -bio_pair -dhe1024 -v +ssltest -bio_pair -dhe1024dsa -v if errorlevel 1 goto done echo test sslv2 with server authentication via BIO pair diff --git a/lib/libssl/src/rsaref/rsar_err.c b/lib/libssl/src/rsaref/rsar_err.c index d2eb3a2b018..5e7871f8032 100644 --- a/lib/libssl/src/rsaref/rsar_err.c +++ b/lib/libssl/src/rsaref/rsar_err.c @@ -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 diff --git a/lib/libssl/src/shlib/Makefile.hpux10-cc b/lib/libssl/src/shlib/Makefile.hpux10-cc new file mode 100644 index 00000000000..4dc62ebd9eb --- /dev/null +++ b/lib/libssl/src/shlib/Makefile.hpux10-cc @@ -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 index 00000000000..903baaa4e7e --- /dev/null +++ b/lib/libssl/src/shlib/hpux10-cc.sh @@ -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 diff --git a/lib/libssl/src/ssl/s3_clnt.c b/lib/libssl/src/ssl/s3_clnt.c index 279d2c01983..0c8f551f736 100644 --- a/lib/libssl/src/ssl/s3_clnt.c +++ b/lib/libssl/src/ssl/s3_clnt.c @@ -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; diff --git a/lib/libssl/src/ssl/s3_lib.c b/lib/libssl/src/ssl/s3_lib.c index c4b49aaedf4..7ada26cbb69 100644 --- a/lib/libssl/src/ssl/s3_lib.c +++ b/lib/libssl/src/ssl/s3_lib.c @@ -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: diff --git a/lib/libssl/src/ssl/s3_srvr.c b/lib/libssl/src/ssl/s3_srvr.c index 90806e2d99b..e23ca20bd31 100644 --- a/lib/libssl/src/ssl/s3_srvr.c +++ b/lib/libssl/src/ssl/s3_srvr.c @@ -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; diff --git a/lib/libssl/src/ssl/ssl.h b/lib/libssl/src/ssl/ssl.h index f29f7753474..bb846f491c4 100644 --- a/lib/libssl/src/ssl/ssl.h +++ b/lib/libssl/src/ssl/ssl.h @@ -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 diff --git a/lib/libssl/src/ssl/ssl_cert.c b/lib/libssl/src/ssl/ssl_cert.c index 48f247ceaca..0596b7c5b86 100644 --- a/lib/libssl/src/ssl/ssl_cert.c +++ b/lib/libssl/src/ssl/ssl_cert.c @@ -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 diff --git a/lib/libssl/src/ssl/ssl_ciph.c b/lib/libssl/src/ssl/ssl_ciph.c index 1cbc2886e92..7436a50ad14 100644 --- a/lib/libssl/src/ssl/ssl_ciph.c +++ b/lib/libssl/src/ssl/ssl_ciph.c @@ -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); diff --git a/lib/libssl/src/ssl/ssl_err.c b/lib/libssl/src/ssl/ssl_err.c index 5618e34a308..642c3f93e7b 100644 --- a/lib/libssl/src/ssl/ssl_err.c +++ b/lib/libssl/src/ssl/ssl_err.c @@ -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 @@ -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"}, diff --git a/lib/libssl/src/ssl/ssl_lib.c b/lib/libssl/src/ssl/ssl_lib.c index 3109708480b..c515c41b4e7 100644 --- a/lib/libssl/src/ssl/ssl_lib.c +++ b/lib/libssl/src/ssl/ssl_lib.c @@ -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); } diff --git a/lib/libssl/src/ssl/ssl_txt.c b/lib/libssl/src/ssl/ssl_txt.c index 7e27857bcfc..c07d9575767 100644 --- a/lib/libssl/src/ssl/ssl_txt.c +++ b/lib/libssl/src/ssl/ssl_txt.c @@ -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; diff --git a/lib/libssl/src/ssl/ssltest.c b/lib/libssl/src/ssl/ssltest.c index d655bbbd841..dde35794f54 100644 --- a/lib/libssl/src/ssl/ssltest.c +++ b/lib/libssl/src/ssl/ssltest.c @@ -62,11 +62,13 @@ #include #include #include +#include #include "openssl/e_os.h" #include #include +#include #include #include #include @@ -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 - number of connections to perform\n"); fprintf(stderr," -bytes - 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 diff --git a/lib/libssl/src/util/libeay.num b/lib/libssl/src/util/libeay.num index e3818ef6e4b..f611d6b2836 100644 --- a/lib/libssl/src/util/libeay.num +++ b/lib/libssl/src/util/libeay.num @@ -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 diff --git a/lib/libssl/src/util/mk1mf.pl b/lib/libssl/src/util/mk1mf.pl index 6fbf3ceca6a..100d76f2793 100644 --- a/lib/libssl/src/util/mk1mf.pl +++ b/lib/libssl/src/util/mk1mf.pl @@ -8,6 +8,7 @@ $INSTALLTOP="/usr/local/ssl"; $OPTIONS=""; $ssl_version=""; +$banner="\t\@echo Building OpenSSL"; open(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; } diff --git a/lib/libssl/src/util/mkerr.pl b/lib/libssl/src/util/mkerr.pl index ebc059ef228..8e18f3c2dff 100644 --- a/lib/libssl/src/util/mkerr.pl +++ b/lib/libssl/src/util/mkerr.pl @@ -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 () { + 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 @@ -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)) { diff --git a/lib/libssl/src/util/pl/BC-32.pl b/lib/libssl/src/util/pl/BC-32.pl index df6e2c742e4..7f57809a165 100644 --- a/lib/libssl/src/util/pl/BC-32.pl +++ b/lib/libssl/src/util/pl/BC-32.pl @@ -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 { diff --git a/lib/libssl/src/util/pl/Mingw32.pl b/lib/libssl/src/util/pl/Mingw32.pl index 585cacd8203..c687d9b1185 100644 --- a/lib/libssl/src/util/pl/Mingw32.pl +++ b/lib/libssl/src/util/pl/Mingw32.pl @@ -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; - diff --git a/lib/libssl/src/util/selftest.pl b/lib/libssl/src/util/selftest.pl index 91e962a312c..04b4425d7ef 100644 --- a/lib/libssl/src/util/selftest.pl +++ b/lib/libssl/src/util/selftest.pl @@ -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,") { $ok=2 if /^platform: $platform/; } @@ -155,6 +160,15 @@ if ($ok != 2) { } else { print OUT "make.log not found!\n"; } + if (open(IN,") { + print OUT; + } + close(IN); + print OUT $sep; + } else { + print OUT "maketest.log not found!\n"; + } } else { print OUT "Test passed.\n"; } diff --git a/lib/libssl/src/util/sep_lib.sh b/lib/libssl/src/util/sep_lib.sh index 34c2c9f8ba9..e69de29bb2d 100644 --- a/lib/libssl/src/util/sep_lib.sh +++ b/lib/libssl/src/util/sep_lib.sh @@ -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 - - diff --git a/lib/libssl/ssl.h b/lib/libssl/ssl.h index f29f7753474..bb846f491c4 100644 --- a/lib/libssl/ssl.h +++ b/lib/libssl/ssl.h @@ -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 diff --git a/lib/libssl/ssl_cert.c b/lib/libssl/ssl_cert.c index 48f247ceaca..0596b7c5b86 100644 --- a/lib/libssl/ssl_cert.c +++ b/lib/libssl/ssl_cert.c @@ -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 diff --git a/lib/libssl/ssl_ciph.c b/lib/libssl/ssl_ciph.c index 1cbc2886e92..7436a50ad14 100644 --- a/lib/libssl/ssl_ciph.c +++ b/lib/libssl/ssl_ciph.c @@ -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); diff --git a/lib/libssl/ssl_err.c b/lib/libssl/ssl_err.c index 5618e34a308..642c3f93e7b 100644 --- a/lib/libssl/ssl_err.c +++ b/lib/libssl/ssl_err.c @@ -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 @@ -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"}, diff --git a/lib/libssl/ssl_lib.c b/lib/libssl/ssl_lib.c index 3109708480b..c515c41b4e7 100644 --- a/lib/libssl/ssl_lib.c +++ b/lib/libssl/ssl_lib.c @@ -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); } diff --git a/lib/libssl/ssl_txt.c b/lib/libssl/ssl_txt.c index 7e27857bcfc..c07d9575767 100644 --- a/lib/libssl/ssl_txt.c +++ b/lib/libssl/ssl_txt.c @@ -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;