diff options
| author | Mark Murray <markm@FreeBSD.org> | 1999-09-01 19:59:25 +0000 | 
|---|---|---|
| committer | Mark Murray <markm@FreeBSD.org> | 1999-09-01 19:59:25 +0000 | 
| commit | 21424c1a5cdcb35274621961fd9c1541e3fc77fa (patch) | |
| tree | e9884e65d49b681471b6abea9516fed73d97951f /crypto | |
Diffstat (limited to 'crypto')
101 files changed, 24795 insertions, 0 deletions
diff --git a/crypto/libdes/COPYRIGHT b/crypto/libdes/COPYRIGHT new file mode 100644 index 000000000000..db46855817a7 --- /dev/null +++ b/crypto/libdes/COPYRIGHT @@ -0,0 +1,50 @@ +Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) +All rights reserved. + +This package is an DES implementation written by Eric Young (eay@mincom.oz.au). +The implementation was written so as to conform with MIT's libdes. + +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. + +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 that the SSL library.  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 software developed by Eric Young (eay@mincom.oz.au) + +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 license 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 distrubution license +[including the GNU Public License.] + +The reason behind this being stated in this direct manner is past +experience in code simply being copied and the attribution removed +from it and then being distributed as part of other packages. This +implementation was a non-trivial and unpaid effort. diff --git a/crypto/libdes/ChangeLog b/crypto/libdes/ChangeLog new file mode 100644 index 000000000000..95d515736084 --- /dev/null +++ b/crypto/libdes/ChangeLog @@ -0,0 +1,66 @@ +1999-07-26  Johan Danielsson  <joda@pdc.kth.se> + +	* Makefile.am: bump version number (changes to md*, sha) + +1999-06-15  Assar Westerlund  <assar@sics.se> + +	* sha.c (swap_u_int32_t): add _CRAY + +Sat Apr 10 23:02:30 1999  Johan Danielsson  <joda@hella.pdc.kth.se> + +	* destest.c: fixes for crays + +Thu Apr  1 11:26:38 1999  Johan Danielsson  <joda@hella.pdc.kth.se> + +	* Makefile.am: noinst_PROGRAMS -> check_PROGRAMS; add TESTS; don't + 	build rpw, and speed + +Mon Mar 22 20:16:26 1999  Johan Danielsson  <joda@hella.pdc.kth.se> + +	* Makefile.am: hash.h + +	* sha.c: use hash.h; fixes for crays + +	* md5.c: use hash.h; fixes for crays + +	* md4.c: use hash.h; fixes for crays + +	* hash.h: common stuff from md4, md5, and sha1 + +Sat Mar 20 00:16:53 1999  Assar Westerlund  <assar@sics.se> + +	* rnd_keys.c (des_rand_data): move declaration to get rid of + 	warning + +Thu Mar 18 11:22:28 1999  Johan Danielsson  <joda@hella.pdc.kth.se> + +	* Makefile.am: include Makefile.am.common + +Mon Mar 15 17:36:41 1999  Johan Danielsson  <joda@hella.pdc.kth.se> + +	* rnd_keys.c (des_rand_data): if not using setitimer, block + 	SIGCHLD around fork(), also make sure we get the status of the + 	child process +	(fake_signal): emulate signal using sigaction + +Tue Jan 12 05:06:54 1999  Assar Westerlund  <assar@sics.se> + +	* des.h: sparcv9 is also 64 bits, use `unsigned int' instead of + 	`unsigned long' + +Sun Nov 22 10:40:09 1998  Assar Westerlund  <assar@sics.se> + +	* Makefile.in (WFLAGS): set + +Mon May 25 05:24:56 1998  Assar Westerlund  <assar@sics.se> + +	* Makefile.in (clean): try to remove shared library debris + +Sun Apr 19 09:50:53 1998  Assar Westerlund  <assar@sics.se> + +	* Makefile.in: add symlink magic for linux + +Sun Nov  9 07:14:45 1997  Assar Westerlund  <assar@sics.se> + +	* mdtest.c: print out old and new string + diff --git a/crypto/libdes/DES.pm b/crypto/libdes/DES.pm new file mode 100644 index 000000000000..6a175b6ca4b0 --- /dev/null +++ b/crypto/libdes/DES.pm @@ -0,0 +1,19 @@ +package DES; + +require Exporter; +require DynaLoader; +@ISA = qw(Exporter DynaLoader); +# Items to export into callers namespace by default +# (move infrequently used names to @EXPORT_OK below) +@EXPORT = qw( +); +# Other items we are prepared to export if requested +@EXPORT_OK = qw( +crypt +); + +# Preloaded methods go here.  Autoload methods go after __END__, and are +# processed by the autosplit program. +bootstrap DES; +1; +__END__ diff --git a/crypto/libdes/DES.pod b/crypto/libdes/DES.pod new file mode 100644 index 000000000000..8a739e7ca0d0 --- /dev/null +++ b/crypto/libdes/DES.pod @@ -0,0 +1,16 @@ +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/crypto/libdes/DES.xs b/crypto/libdes/DES.xs new file mode 100644 index 000000000000..def220b36b1d --- /dev/null +++ b/crypto/libdes/DES.xs @@ -0,0 +1,268 @@ +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" +#include "des.h" + +#define deschar	char +static STRLEN len; + +static int +not_here(s) +char *s; +{ +    croak("%s not implemented on this architecture", s); +    return -1; +} + +MODULE = DES	PACKAGE = DES	PREFIX = des_ + +char * +des_crypt(buf,salt) +	char *	buf +	char *	salt + +void +des_set_odd_parity(key) +	des_cblock *	key +PPCODE: +	{ +	SV *s; + +	s=sv_newmortal(); +	sv_setpvn(s,(char *)key,8); +	des_set_odd_parity((des_cblock *)SvPV(s,na)); +	PUSHs(s); +	} + +int +des_is_weak_key(key) +	des_cblock *	key + +des_key_schedule +des_set_key(key) +	des_cblock *	key +CODE: +	des_set_key(key,RETVAL); +OUTPUT: +RETVAL + +des_cblock +des_ecb_encrypt(input,ks,encrypt) +	des_cblock *	input +	des_key_schedule *	ks +	int	encrypt +CODE: +	des_ecb_encrypt(input,&RETVAL,*ks,encrypt); +OUTPUT: +RETVAL + +void +des_cbc_encrypt(input,ks,ivec,encrypt) +	char *	input +	des_key_schedule *	ks +	des_cblock *	ivec +	int	encrypt +PPCODE: +	{ +	SV *s; +	STRLEN len,l; +	char *c; + +	l=SvCUR(ST(0)); +	len=((((unsigned long)l)+7)/8)*8; +	s=sv_newmortal(); +	sv_setpvn(s,"",0); +	SvGROW(s,len); +	SvCUR_set(s,len); +	c=(char *)SvPV(s,na); +	des_cbc_encrypt((des_cblock *)input,(des_cblock *)c, +		l,*ks,ivec,encrypt); +	sv_setpvn(ST(2),(char *)c[len-8],8); +	PUSHs(s); +	} + +void +des_cbc3_encrypt(input,ks1,ks2,ivec1,ivec2,encrypt) +	char *	input +	des_key_schedule *	ks1 +	des_key_schedule *	ks2 +	des_cblock *	ivec1 +	des_cblock *	ivec2 +	int	encrypt +PPCODE: +	{ +	SV *s; +	STRLEN len,l; + +	l=SvCUR(ST(0)); +	len=((((unsigned long)l)+7)/8)*8; +	s=sv_newmortal(); +	sv_setpvn(s,"",0); +	SvGROW(s,len); +	SvCUR_set(s,len); +	des_3cbc_encrypt((des_cblock *)input,(des_cblock *)SvPV(s,na), +		l,*ks1,*ks2,ivec1,ivec2,encrypt); +	sv_setpvn(ST(3),(char *)ivec1,8); +	sv_setpvn(ST(4),(char *)ivec2,8); +	PUSHs(s); +	} + +void +des_cbc_cksum(input,ks,ivec) +	char *	input +	des_key_schedule *	ks +	des_cblock *	ivec +PPCODE: +	{ +	SV *s1,*s2; +	STRLEN len,l; +	des_cblock c; +	unsigned long i1,i2; + +	s1=sv_newmortal(); +	s2=sv_newmortal(); +	l=SvCUR(ST(0)); +	des_cbc_cksum((des_cblock *)input,(des_cblock *)c, +		l,*ks,ivec); +	i1=c[4]|(c[5]<<8)|(c[6]<<16)|(c[7]<<24); +	i2=c[0]|(c[1]<<8)|(c[2]<<16)|(c[3]<<24); +	sv_setiv(s1,i1); +	sv_setiv(s2,i2); +	sv_setpvn(ST(2),(char *)c,8); +	PUSHs(s1); +	PUSHs(s2); +	} + +void +des_cfb_encrypt(input,numbits,ks,ivec,encrypt) +	char *	input +	int	numbits +	des_key_schedule *	ks +	des_cblock *	ivec +	int	encrypt +PPCODE: +	{ +	SV *s; +	STRLEN len; +	char *c; + +	len=SvCUR(ST(0)); +	s=sv_newmortal(); +	sv_setpvn(s,"",0); +	SvGROW(s,len); +	SvCUR_set(s,len); +	c=(char *)SvPV(s,na); +	des_cfb_encrypt((unsigned char *)input,(unsigned char *)c, +		(int)numbits,(long)len,*ks,ivec,encrypt); +	sv_setpvn(ST(3),(char *)ivec,8); +	PUSHs(s); +	} + +des_cblock * +des_ecb3_encrypt(input,ks1,ks2,encrypt) +	des_cblock *	input +	des_key_schedule *	ks1 +	des_key_schedule *	ks2 +	int	encrypt +CODE: +	{ +	des_cblock c; + +	des_3ecb_encrypt((des_cblock *)input,(des_cblock *)&c, +		*ks1,*ks2,encrypt); +	RETVAL= &c; +	} +OUTPUT: +RETVAL + +void +des_ofb_encrypt(input,numbits,ks,ivec) +	unsigned char *	input +	int	numbits +	des_key_schedule *	ks +	des_cblock *	ivec +PPCODE: +	{ +	SV *s; +	STRLEN len,l; +	unsigned char *c; + +	len=SvCUR(ST(0)); +	s=sv_newmortal(); +	sv_setpvn(s,"",0); +	SvGROW(s,len); +	SvCUR_set(s,len); +	c=(unsigned char *)SvPV(s,na); +	des_ofb_encrypt((unsigned char *)input,(unsigned char *)c, +		numbits,len,*ks,ivec); +	sv_setpvn(ST(3),(char *)ivec,8); +	PUSHs(s); +	} + +void +des_pcbc_encrypt(input,ks,ivec,encrypt) +	char *	input +	des_key_schedule *	ks +	des_cblock *	ivec +	int	encrypt +PPCODE: +	{ +	SV *s; +	STRLEN len,l; +	char *c; + +	l=SvCUR(ST(0)); +	len=((((unsigned long)l)+7)/8)*8; +	s=sv_newmortal(); +	sv_setpvn(s,"",0); +	SvGROW(s,len); +	SvCUR_set(s,len); +	c=(char *)SvPV(s,na); +	des_pcbc_encrypt((des_cblock *)input,(des_cblock *)c, +		l,*ks,ivec,encrypt); +	sv_setpvn(ST(2),(char *)c[len-8],8); +	PUSHs(s); +	} + +des_cblock * +des_random_key() +CODE: +	{ +	des_cblock c; + +	des_random_key(c); +	RETVAL=&c; +	} +OUTPUT: +RETVAL + +des_cblock * +des_string_to_key(str) +char *	str +CODE: +	{ +	des_cblock c; + +	des_string_to_key(str,&c); +	RETVAL=&c; +	} +OUTPUT: +RETVAL + +void +des_string_to_2keys(str) +char *	str +PPCODE: +	{ +	des_cblock c1,c2; +	SV *s1,*s2; + +	des_string_to_2keys(str,&c1,&c2); +	EXTEND(sp,2); +	s1=sv_newmortal(); +	sv_setpvn(s1,(char *)c1,8); +	s2=sv_newmortal(); +	sv_setpvn(s2,(char *)c2,8); +	PUSHs(s1); +	PUSHs(s2); +	} diff --git a/crypto/libdes/FILES b/crypto/libdes/FILES new file mode 100644 index 000000000000..4c7ea2de7a06 --- /dev/null +++ b/crypto/libdes/FILES @@ -0,0 +1,96 @@ +/* General stuff */ +COPYRIGHT	- Copyright info. +MODES.DES	- A description of the features of the different modes of DES. +FILES		- This file. +INSTALL		- How to make things compile. +Imakefile	- For use with kerberos. +README		- What this package is. +VERSION		- Which version this is and what was changed. +KERBEROS	- Kerberos version 4 notes. +Makefile.PL	- An old makefile to build with perl5, not current. +Makefile.ssl	- The SSLeay makefile +Makefile.uni	- The normal unix makefile. +GNUmakefile	- The makefile for use with glibc. +makefile.bc	- A Borland C makefile +times		- Some outputs from 'speed' on some machines. +vms.com		- For use when compiling under VMS + +/* My SunOS des(1) replacement */ +des.c		- des(1) source code. +des.man		- des(1) manual. + +/* Testing and timing programs. */ +destest.c	- Source for libdes.a test program. +speed.c		- Source for libdes.a timing program. +rpw.c		- Source for libdes.a testing password reading routines. + +/* libdes.a source code */ +des_crypt.man	- libdes.a manual page. +des.h		- Public libdes.a header file. +ecb_enc.c	- des_ecb_encrypt() source, this contains the basic DES code. +ecb3_enc.c	- des_ecb3_encrypt() source. +cbc_ckm.c	- des_cbc_cksum() source. +cbc_enc.c	- des_cbc_encrypt() source. +ncbc_enc.c	- des_cbc_encrypt() that is 'normal' in that it copies +		  the new iv values back in the passed iv vector. +ede_enc.c	- des_ede3_cbc_encrypt() cbc mode des using triple DES. +cbc3_enc.c	- des_3cbc_encrypt() source, don't use this function. +cfb_enc.c	- des_cfb_encrypt() source. +cfb64enc.c	- des_cfb64_encrypt() cfb in 64 bit mode but setup to be +		  used as a stream cipher. +cfb64ede.c	- des_ede3_cfb64_encrypt() cfb in 64 bit mode but setup to be +		  used as a stream cipher and using triple DES. +ofb_enc.c	- des_cfb_encrypt() source. +ofb64_enc.c	- des_ofb_encrypt() ofb in 64 bit mode but setup to be +		  used as a stream cipher. +ofb64ede.c	- des_ede3_ofb64_encrypt() ofb in 64 bit mode but setup to be +		  used as a stream cipher and using triple DES. +enc_read.c	- des_enc_read() source. +enc_writ.c	- des_enc_write() source. +pcbc_enc.c	- des_pcbc_encrypt() source. +qud_cksm.c	- quad_cksum() source. +rand_key.c	- des_random_key() source. +read_pwd.c	- Source for des_read_password() plus related functions. +set_key.c	- Source for des_set_key(). +str2key.c	- Covert a string of any length into a key. +fcrypt.c	- A small, fast version of crypt(3). +des_locl.h	- Internal libdes.a header file. +podd.h		- Odd parity tables - used in des_set_key(). +sk.h		- Lookup tables used in des_set_key(). +spr.h		- What is left of the S tables - used in ecb_encrypt(). +des_ver.h	- header file for the external definition of the +		  version string. +des.doc		- SSLeay documentation for the library. + +/* The perl scripts - you can ignore these files they are only + * included for the curious */ +des.pl		- des in perl anyone? des_set_key and des_ecb_encrypt +		  both done in a perl library. +testdes.pl	- Testing program for des.pl +doIP		- Perl script used to develop IP xor/shift code. +doPC1		- Perl script used to develop PC1 xor/shift code. +doPC2		- Generates sk.h. +PC1		- Output of doPC1 should be the same as output from PC1. +PC2		- used in development of doPC2. +shifts.pl	- Perl library used by my perl scripts. + +/* I started making a perl5 dynamic library for libdes + * but did not fully finish, these files are part of that effort. */ +DES.pm +DES.pod +DES.xs +t +typemap + +/* The following are for use with sun RPC implementaions. */ +rpc_des.h +rpc_enc.c + +/* The following are contibuted by Mark Murray <mark@grondar.za>.  They + * are not normally built into libdes due to machine specific routines + * contained in them.  They are for use in the most recent incarnation of + * export kerberos v 4 (eBones). */ +supp.c +new_rkey.c + + diff --git a/crypto/libdes/INSTALL b/crypto/libdes/INSTALL new file mode 100644 index 000000000000..3b8dae6b5f8c --- /dev/null +++ b/crypto/libdes/INSTALL @@ -0,0 +1,69 @@ +Check the CC and CFLAGS lines in the makefile + +If your C library does not support the times(3) function, change the +#define TIMES to +#undef TIMES in speed.c +If it does, check the HZ value for the times(3) function. +If your system does not define CLK_TCK it will be assumed to +be 100.0. + +If possible use gcc v 2.7.? +Turn on the maximum optimising (normally '-O3 -fomit-frame-pointer' for gcc) +In recent times, some system compilers give better performace. + +type 'make' + +run './destest' to check things are ok. +run './rpw' to check the tty code for reading passwords works. +run './speed' to see how fast those optimisations make the library run :-) +run './des_opts' to determin the best compile time options. + +The output from des_opts should be put in the makefile options and des_enc.c +should be rebuilt.  For 64 bit computers, do not use the DES_PTR option. +For the DEC Alpha, edit des.h and change DES_LONG to 'unsigned int' +and then you can use the 'DES_PTR' option. + +The file options.txt has the options listed for best speed on quite a +few systems.  Look and the options (UNROLL, PTR, RISC2 etc) and then +turn on the relevent option in the Makefile + +There are some special Makefile targets that make life easier. +make cc		- standard cc build +make gcc	- standard gcc build +make x86-elf	- x86 assember (elf), linux-elf. +make x86-out	- x86 assember (a.out), FreeBSD +make x86-solaris- x86 assember +make x86-bsdi	- x86 assember (a.out with primative assember). + +If at all possible use the assember (for Windows NT/95, use +asm/win32.obj to link with).  The x86 assember is very very fast. + +A make install will by default install +libdes.a      in /usr/local/lib/libdes.a +des           in /usr/local/bin/des +des_crypt.man in /usr/local/man/man3/des_crypt.3 +des.man       in /usr/local/man/man1/des.1 +des.h         in /usr/include/des.h + +des(1) should be compatible with sunOS's but I have been unable to +test it. + +These routines should compile on MSDOS, most 32bit and 64bit version +of Unix (BSD and SYSV) and VMS, without modification. +The only problems should be #include files that are in the wrong places. + +These routines can be compiled under MSDOS. +I have successfully encrypted files using des(1) under MSDOS and then +decrypted the files on a SparcStation. +I have been able to compile and test the routines with +Microsoft C v 5.1 and Turbo C v 2.0. +The code in this library is in no way optimised for the 16bit +operation of MSDOS. + +When building for glibc, ignore all of the above and just unpack into +glibc-1.??/des and then gmake as per normal. + +As a final note on performace.  Certain CPUs like sparcs and Alpha often give +a %10 speed difference depending on the link order.  It is rather anoying +when one program reports 'x' DES encrypts a second and another reports +'x*0.9' the speed. diff --git a/crypto/libdes/Imakefile b/crypto/libdes/Imakefile new file mode 100644 index 000000000000..1b9b5629e15d --- /dev/null +++ b/crypto/libdes/Imakefile @@ -0,0 +1,35 @@ +# This Imakefile has not been tested for a while but it should still +# work when placed in the correct directory in the kerberos v 4 distribution + +SRCS=   cbc_cksm.c cbc_enc.c ecb_enc.c pcbc_enc.c \ +        qud_cksm.c rand_key.c read_pwd.c set_key.c str2key.c \ +        enc_read.c enc_writ.c fcrypt.c cfb_enc.c \ +	ecb3_enc.c ofb_enc.c ofb64enc.c + +OBJS=   cbc_cksm.o cbc_enc.o ecb_enc.o pcbc_enc.o \ +	qud_cksm.o rand_key.o read_pwd.o set_key.o str2key.o \ +	enc_read.o enc_writ.o fcrypt.o cfb_enc.o \ +	ecb3_enc.o ofb_enc.o ofb64enc.o + +GENERAL=COPYRIGHT FILES INSTALL Imakefile README VERSION makefile times \ +	vms.com KERBEROS +DES=    des.c des.man +TESTING=destest.c speed.c rpw.c +LIBDES= des_crypt.man des.h des_locl.h podd.h sk.h spr.h + +PERL=   des.pl testdes.pl doIP doPC1 doPC2 PC1 PC2 shifts.pl + +CODE=    $(GENERAL) $(DES) $(TESTING) $(SRCS) $(LIBDES) $(PERL) + +SRCDIR=$(SRCTOP)/lib/des + +DBG= -O +INCLUDE= -I$(SRCDIR) +CC= cc + +library_obj_rule() + +install_library_target(des,$(OBJS),$(SRCS),) + +test(destest,libdes.a,) +test(rpw,libdes.a,) diff --git a/crypto/libdes/KERBEROS b/crypto/libdes/KERBEROS new file mode 100644 index 000000000000..f401b10014ff --- /dev/null +++ b/crypto/libdes/KERBEROS @@ -0,0 +1,41 @@ + [ This is an old file, I don't know if it is true anymore +   but I will leave the file here - eay 21/11/95 ] + +To use this library with Bones (kerberos without DES): +1) Get my modified Bones - eBones.  It can be found on +   gondwana.ecr.mu.oz.au (128.250.1.63) /pub/athena/eBones-p9.tar.Z +   and +   nic.funet.fi (128.214.6.100) /pub/unix/security/Kerberos/eBones-p9.tar.Z + +2) Unpack this library in src/lib/des, makeing sure it is version +   3.00 or greater (libdes.tar.93-10-07.Z).  This versions differences +   from the version in comp.sources.misc volume 29 patchlevel2. +   The primarily difference is that it should compile under kerberos :-). +   It can be found at. +   ftp.psy.uq.oz.au (130.102.32.1) /pub/DES/libdes.tar.93-10-07.Z + +Now do a normal kerberos build and things should work. + +One problem I found when I was build on my local sun. +--- +For sunOS 4.1.1 apply the following patch to src/util/ss/make_commands.c + +*** make_commands.c.orig	Fri Jul  3 04:18:35 1987 +--- make_commands.c	Wed May 20 08:47:42 1992 +*************** +*** 98,104 **** +       if (!rename(o_file, z_file)) { +  	  if (!vfork()) { +  	       chdir("/tmp"); +! 	       execl("/bin/ld", "ld", "-o", o_file+5, "-s", "-r", "-n", +  		     z_file+5, 0); +  	       perror("/bin/ld"); +  	       _exit(1); +--- 98,104 ---- +       if (!rename(o_file, z_file)) { +  	  if (!vfork()) { +  	       chdir("/tmp"); +! 	       execl("/bin/ld", "ld", "-o", o_file+5, "-s", "-r", +  		     z_file+5, 0); +  	       perror("/bin/ld"); +  	       _exit(1); diff --git a/crypto/libdes/MODES.DES b/crypto/libdes/MODES.DES new file mode 100644 index 000000000000..18934b56c335 --- /dev/null +++ b/crypto/libdes/MODES.DES @@ -0,0 +1,84 @@ +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_3ecb_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/crypto/libdes/Makefile.PL b/crypto/libdes/Makefile.PL new file mode 100644 index 000000000000..b54a24387cbc --- /dev/null +++ b/crypto/libdes/Makefile.PL @@ -0,0 +1,14 @@ +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/crypto/libdes/Makefile.am b/crypto/libdes/Makefile.am new file mode 100644 index 000000000000..915482b7366e --- /dev/null +++ b/crypto/libdes/Makefile.am @@ -0,0 +1,112 @@ +# $Id: Makefile.am,v 1.16 1999/07/26 12:38:01 joda Exp $ + +include $(top_srcdir)/Makefile.am.common + +lib_LTLIBRARIES = libdes.la +libdes_la_LDFLAGS = -version-info 0:1:0 + +include_HEADERS = des.h md4.h md5.h sha.h + +build_HEADERZ = $(include_HEADERS) + +check_PROGRAMS = destest mdtest + +TESTS = destest mdtest +CHECK_LOCAL =  +bin_PROGRAMS = des #rpw speed + +des_SOURCES = des.c des_ver.h + +LDADD = $(lib_LTLIBRARIES) + +libdes_la_SOURCES =	\ +	cbc3_enc.c	\ +	cbc_cksm.c	\ +	cbc_enc.c	\ +	cfb64ede.c	\ +	cfb64enc.c	\ +	cfb_enc.c	\ +	des_enc.c	\ +	des_locl.h	\ +	ecb3_enc.c	\ +	ecb_enc.c	\ +	ede_enc.c	\ +	enc_read.c	\ +	enc_writ.c	\ +	fcrypt.c	\ +	hash.h		\ +	key_par.c	\ +	md4.c		\ +	md5.c		\ +	ncbc_enc.c	\ +	ofb64ede.c	\ +	ofb64enc.c	\ +	ofb_enc.c	\ +	pcbc_enc.c	\ +	podd.h		\ +	qud_cksm.c	\ +	read_pwd.c	\ +	rnd_keys.c	\ +	set_key.c	\ +	sha.c		\ +	sk.h		\ +	spr.h		\ +	str2key.c	\ +	xcbc_enc.c + +EXTRA_libdes_la_SOURCES = dllmain.c passwd_dialog.aps passwd_dialog.clw \ +	passwd_dialog.rc passwd_dialog.res passwd_dlg.c passwd_dlg.h resource.h + +## this is an awful lot of junk, but it's just as well to include everything +EXTRA_DIST =		\ +	COPYRIGHT	\ +	DES.pm		\ +	DES.pod		\ +	DES.xs		\ +	FILES		\ +	Imakefile	\ +	KERBEROS	\ +	MODES.DES	\ +	Makefile.PL	\ +	Makefile.ssl	\ +	Makefile.uni	\ +	PC1		\ +	PC2		\ +	VERSION		\ +	des.def		\ +	des.dsp		\ +	des.doc		\ +	des.mak		\ +	des.man		\ +	des.org		\ +	des.pl		\ +	des_crypt.man	\ +	des_locl.org	\ +	des_opts.c	\ +	doIP		\ +	doPC1		\ +	doPC2		\ +	makefile.bc	\ +	rand_key.c	\ +	rpc_des.h	\ +	rpc_enc.c	\ +	shifts.pl	\ +	supp.c		\ +	testdes.pl	\ +	times		\ +	typemap		\ +	version.h	\ +	vms.com + +asm_files = des-som2.pl des-som3.pl des586.pl des686.pl desboth.pl \ +	dx86-cpp.s dx86unix.cpp readme win32.asm win32.obj win32.uu x86ms.pl \ +	x86unix.pl + +dist-hook: +	$(mkinstalldirs) $(distdir)/t +	$(INSTALL_DATA) $(srcdir)/t/perl $(distdir)/t +	$(INSTALL_DATA) $(srcdir)/t/test $(distdir)/t +	$(mkinstalldirs) $(distdir)/asm +	(cd $(srcdir)/asm && tar cf - $(asm_files)) \ +		| (cd $(distdir)/asm; tar xf -) + diff --git a/crypto/libdes/Makefile.in b/crypto/libdes/Makefile.in new file mode 100644 index 000000000000..a03def5c5ca9 --- /dev/null +++ b/crypto/libdes/Makefile.in @@ -0,0 +1,777 @@ +# Makefile.in generated automatically by automake 1.4 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +# $Id: Makefile.am,v 1.16 1999/07/26 12:38:01 joda Exp $ + + +# $Id: Makefile.am.common,v 1.3 1999/04/01 14:58:43 joda Exp $ + + +# $Id: Makefile.am.common,v 1.12 1999/07/28 00:54:29 assar Exp $ + + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = ../.. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ +AFS_EXTRA_LD = @AFS_EXTRA_LD@ +AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ +AWK = @AWK@ +CANONICAL_HOST = @CANONICAL_HOST@ +CATMAN = @CATMAN@ +CATMANEXT = @CATMANEXT@ +CC = @CC@ +DBLIB = @DBLIB@ +EXEEXT = @EXEEXT@ +EXTRA_LIB45 = @EXTRA_LIB45@ +GROFF = @GROFF@ +INCLUDE_ = @INCLUDE_@ +LD = @LD@ +LEX = @LEX@ +LIBOBJS = @LIBOBJS@ +LIBTOOL = @LIBTOOL@ +LIB_ = @LIB_@ +LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ +LIB_kdb = @LIB_kdb@ +LIB_otp = @LIB_otp@ +LIB_roken = @LIB_roken@ +LIB_security = @LIB_security@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MAKE_X_PROGS_BIN_PROGS = @MAKE_X_PROGS_BIN_PROGS@ +MAKE_X_PROGS_BIN_SCRPTS = @MAKE_X_PROGS_BIN_SCRPTS@ +MAKE_X_PROGS_LIBEXEC_PROGS = @MAKE_X_PROGS_LIBEXEC_PROGS@ +NEED_WRITEAUTH_FALSE = @NEED_WRITEAUTH_FALSE@ +NEED_WRITEAUTH_TRUE = @NEED_WRITEAUTH_TRUE@ +NM = @NM@ +NROFF = @NROFF@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +RANLIB = @RANLIB@ +VERSION = @VERSION@ +VOID_RETSIGTYPE = @VOID_RETSIGTYPE@ +WFLAGS = @WFLAGS@ +WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ +WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ +YACC = @YACC@ + +AUTOMAKE_OPTIONS = foreign no-dependencies + +SUFFIXES = .et .h .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .x + +INCLUDES = -I$(top_builddir)/include + +AM_CFLAGS =  $(WFLAGS) + +COMPILE_ET = $(top_builddir)/lib/com_err/compile_et + +buildinclude = $(top_builddir)/include + +LIB_XauReadAuth = @LIB_XauReadAuth@ +LIB_crypt = @LIB_crypt@ +LIB_dbm_firstkey = @LIB_dbm_firstkey@ +LIB_dbopen = @LIB_dbopen@ +LIB_dlopen = @LIB_dlopen@ +LIB_dn_expand = @LIB_dn_expand@ +LIB_el_init = @LIB_el_init@ +LIB_getattr = @LIB_getattr@ +LIB_gethostbyname = @LIB_gethostbyname@ +LIB_getpwent_r = @LIB_getpwent_r@ +LIB_getpwnam_r = @LIB_getpwnam_r@ +LIB_getsockopt = @LIB_getsockopt@ +LIB_logout = @LIB_logout@ +LIB_logwtmp = @LIB_logwtmp@ +LIB_odm_initialize = @LIB_odm_initialize@ +LIB_readline = @LIB_readline@ +LIB_res_search = @LIB_res_search@ +LIB_setpcred = @LIB_setpcred@ +LIB_setsockopt = @LIB_setsockopt@ +LIB_socket = @LIB_socket@ +LIB_syslog = @LIB_syslog@ +LIB_tgetent = @LIB_tgetent@ + +HESIODLIB = @HESIODLIB@ +HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_hesiod = @INCLUDE_hesiod@ +LIB_hesiod = @LIB_hesiod@ + +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ + +INCLUDE_readline = @INCLUDE_readline@ + +LEXLIB = @LEXLIB@ + +cat1dir = $(mandir)/cat1 +cat3dir = $(mandir)/cat3 +cat5dir = $(mandir)/cat5 +cat8dir = $(mandir)/cat8 + +MANRX = \(.*\)\.\([0-9]\) +CATSUFFIX = @CATSUFFIX@ + +NROFF_MAN = groff -mandoc -Tascii + +@KRB4_TRUE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) + +@KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la 	$(top_builddir)/lib/asn1/libasn1.la +@KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la +CHECK_LOCAL =  + +lib_LTLIBRARIES = libdes.la +libdes_la_LDFLAGS = -version-info 0:1:0 + +include_HEADERS = des.h md4.h md5.h sha.h + +build_HEADERZ = $(include_HEADERS) + +check_PROGRAMS = destest mdtest + +TESTS = destest mdtest +bin_PROGRAMS = des #rpw speed + +des_SOURCES = des.c des_ver.h + +LDADD = $(lib_LTLIBRARIES) + +libdes_la_SOURCES =  	cbc3_enc.c		cbc_cksm.c		cbc_enc.c		cfb64ede.c		cfb64enc.c		cfb_enc.c		des_enc.c		des_locl.h		ecb3_enc.c		ecb_enc.c		ede_enc.c		enc_read.c		enc_writ.c		fcrypt.c		hash.h			key_par.c		md4.c			md5.c			ncbc_enc.c		ofb64ede.c		ofb64enc.c		ofb_enc.c		pcbc_enc.c		podd.h			qud_cksm.c		read_pwd.c		rnd_keys.c		set_key.c		sha.c			sk.h			spr.h			str2key.c		xcbc_enc.c + + +EXTRA_libdes_la_SOURCES = dllmain.c passwd_dialog.aps passwd_dialog.clw 	passwd_dialog.rc passwd_dialog.res passwd_dlg.c passwd_dlg.h resource.h + + +EXTRA_DIST =  	COPYRIGHT		DES.pm			DES.pod			DES.xs			FILES			Imakefile		KERBEROS		MODES.DES		Makefile.PL		Makefile.ssl		Makefile.uni		PC1			PC2			VERSION			des.def			des.dsp			des.doc			des.mak			des.man			des.org			des.pl			des_crypt.man		des_locl.org		des_opts.c		doIP			doPC1			doPC2			makefile.bc		rand_key.c		rpc_des.h		rpc_enc.c		shifts.pl		supp.c			testdes.pl		times			typemap			version.h		vms.com + + +asm_files = des-som2.pl des-som3.pl des586.pl des686.pl desboth.pl 	dx86-cpp.s dx86unix.cpp readme win32.asm win32.obj win32.uu x86ms.pl 	x86unix.pl + +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = ../../include/config.h +CONFIG_CLEAN_FILES =  +LTLIBRARIES =  $(lib_LTLIBRARIES) + + +DEFS = @DEFS@ -I. -I$(srcdir) -I../../include +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_LIBS = @X_LIBS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +libdes_la_LIBADD =  +libdes_la_OBJECTS =  cbc3_enc.lo cbc_cksm.lo cbc_enc.lo cfb64ede.lo \ +cfb64enc.lo cfb_enc.lo des_enc.lo ecb3_enc.lo ecb_enc.lo ede_enc.lo \ +enc_read.lo enc_writ.lo fcrypt.lo key_par.lo md4.lo md5.lo ncbc_enc.lo \ +ofb64ede.lo ofb64enc.lo ofb_enc.lo pcbc_enc.lo qud_cksm.lo read_pwd.lo \ +rnd_keys.lo set_key.lo sha.lo str2key.lo xcbc_enc.lo +bin_PROGRAMS =  des$(EXEEXT) +check_PROGRAMS =  destest$(EXEEXT) mdtest$(EXEEXT) +PROGRAMS =  $(bin_PROGRAMS) + +des_OBJECTS =  des.$(OBJEXT) +des_LDADD = $(LDADD) +des_DEPENDENCIES =  libdes.la +des_LDFLAGS =  +destest_SOURCES = destest.c +destest_OBJECTS =  destest.$(OBJEXT) +destest_LDADD = $(LDADD) +destest_DEPENDENCIES =  libdes.la +destest_LDFLAGS =  +mdtest_SOURCES = mdtest.c +mdtest_OBJECTS =  mdtest.$(OBJEXT) +mdtest_LDADD = $(LDADD) +mdtest_DEPENDENCIES =  libdes.la +mdtest_LDFLAGS =  +CFLAGS = @CFLAGS@ +COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ +HEADERS =  $(include_HEADERS) + +DIST_COMMON =  README ChangeLog INSTALL Makefile.am Makefile.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = tar +GZIP_ENV = --best +SOURCES = $(libdes_la_SOURCES) $(EXTRA_libdes_la_SOURCES) $(des_SOURCES) destest.c mdtest.c +OBJECTS = $(libdes_la_OBJECTS) $(des_OBJECTS) destest.$(OBJEXT) mdtest.$(OBJEXT) + +all: all-redirect +.SUFFIXES: +.SUFFIXES: .1 .3 .5 .8 .S .c .cat1 .cat3 .cat5 .cat8 .et .h .lo .o .obj .s .x +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common +	cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/des/Makefile + +Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status +	cd $(top_builddir) \ +	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + + +mostlyclean-libLTLIBRARIES: + +clean-libLTLIBRARIES: +	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + +distclean-libLTLIBRARIES: + +maintainer-clean-libLTLIBRARIES: + +install-libLTLIBRARIES: $(lib_LTLIBRARIES) +	@$(NORMAL_INSTALL) +	$(mkinstalldirs) $(DESTDIR)$(libdir) +	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \ +	  if test -f $$p; then \ +	    echo "$(LIBTOOL)  --mode=install $(INSTALL) $$p $(DESTDIR)$(libdir)/$$p"; \ +	    $(LIBTOOL)  --mode=install $(INSTALL) $$p $(DESTDIR)$(libdir)/$$p; \ +	  else :; fi; \ +	done + +uninstall-libLTLIBRARIES: +	@$(NORMAL_UNINSTALL) +	list='$(lib_LTLIBRARIES)'; for p in $$list; do \ +	  $(LIBTOOL)  --mode=uninstall rm -f $(DESTDIR)$(libdir)/$$p; \ +	done + +.c.o: +	$(COMPILE) -c $< + +# FIXME: We should only use cygpath when building on Windows, +# and only if it is available. +.c.obj: +	$(COMPILE) -c `cygpath -w $<` + +.s.o: +	$(COMPILE) -c $< + +.S.o: +	$(COMPILE) -c $< + +mostlyclean-compile: +	-rm -f *.o core *.core +	-rm -f *.$(OBJEXT) + +clean-compile: + +distclean-compile: +	-rm -f *.tab.c + +maintainer-clean-compile: + +.c.lo: +	$(LIBTOOL) --mode=compile $(COMPILE) -c $< + +.s.lo: +	$(LIBTOOL) --mode=compile $(COMPILE) -c $< + +.S.lo: +	$(LIBTOOL) --mode=compile $(COMPILE) -c $< + +mostlyclean-libtool: +	-rm -f *.lo + +clean-libtool: +	-rm -rf .libs _libs + +distclean-libtool: + +maintainer-clean-libtool: + +libdes.la: $(libdes_la_OBJECTS) $(libdes_la_DEPENDENCIES) +	$(LINK) -rpath $(libdir) $(libdes_la_LDFLAGS) $(libdes_la_OBJECTS) $(libdes_la_LIBADD) $(LIBS) + +mostlyclean-binPROGRAMS: + +clean-binPROGRAMS: +	-test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) + +distclean-binPROGRAMS: + +maintainer-clean-binPROGRAMS: + +install-binPROGRAMS: $(bin_PROGRAMS) +	@$(NORMAL_INSTALL) +	$(mkinstalldirs) $(DESTDIR)$(bindir) +	@list='$(bin_PROGRAMS)'; for p in $$list; do \ +	  if test -f $$p; then \ +	    echo " $(LIBTOOL)  --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \ +	    $(LIBTOOL)  --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ +	  else :; fi; \ +	done + +uninstall-binPROGRAMS: +	@$(NORMAL_UNINSTALL) +	list='$(bin_PROGRAMS)'; for p in $$list; do \ +	  rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ +	done + +mostlyclean-checkPROGRAMS: + +clean-checkPROGRAMS: +	-test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS) + +distclean-checkPROGRAMS: + +maintainer-clean-checkPROGRAMS: + +des$(EXEEXT): $(des_OBJECTS) $(des_DEPENDENCIES) +	@rm -f des$(EXEEXT) +	$(LINK) $(des_LDFLAGS) $(des_OBJECTS) $(des_LDADD) $(LIBS) + +destest$(EXEEXT): $(destest_OBJECTS) $(destest_DEPENDENCIES) +	@rm -f destest$(EXEEXT) +	$(LINK) $(destest_LDFLAGS) $(destest_OBJECTS) $(destest_LDADD) $(LIBS) + +mdtest$(EXEEXT): $(mdtest_OBJECTS) $(mdtest_DEPENDENCIES) +	@rm -f mdtest$(EXEEXT) +	$(LINK) $(mdtest_LDFLAGS) $(mdtest_OBJECTS) $(mdtest_LDADD) $(LIBS) + +install-includeHEADERS: $(include_HEADERS) +	@$(NORMAL_INSTALL) +	$(mkinstalldirs) $(DESTDIR)$(includedir) +	@list='$(include_HEADERS)'; for p in $$list; do \ +	  if test -f "$$p"; then d= ; else d="$(srcdir)/"; fi; \ +	  echo " $(INSTALL_DATA) $$d$$p $(DESTDIR)$(includedir)/$$p"; \ +	  $(INSTALL_DATA) $$d$$p $(DESTDIR)$(includedir)/$$p; \ +	done + +uninstall-includeHEADERS: +	@$(NORMAL_UNINSTALL) +	list='$(include_HEADERS)'; for p in $$list; do \ +	  rm -f $(DESTDIR)$(includedir)/$$p; \ +	done + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) +	list='$(SOURCES) $(HEADERS)'; \ +	unique=`for i in $$list; do echo $$i; done | \ +	  awk '    { files[$$0] = 1; } \ +	       END { for (i in files) print i; }'`; \ +	here=`pwd` && cd $(srcdir) \ +	  && mkid -f$$here/ID $$unique $(LISP) + +TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) $(LISP) +	tags=; \ +	here=`pwd`; \ +	list='$(SOURCES) $(HEADERS)'; \ +	unique=`for i in $$list; do echo $$i; done | \ +	  awk '    { files[$$0] = 1; } \ +	       END { for (i in files) print i; }'`; \ +	test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ +	  || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags  $$unique $(LISP) -o $$here/TAGS) + +mostlyclean-tags: + +clean-tags: + +distclean-tags: +	-rm -f TAGS ID + +maintainer-clean-tags: + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + +subdir = lib/des + +distdir: $(DISTFILES) +	@for file in $(DISTFILES); do \ +	  d=$(srcdir); \ +	  if test -d $$d/$$file; then \ +	    cp -pr $$/$$file $(distdir)/$$file; \ +	  else \ +	    test -f $(distdir)/$$file \ +	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ +	    || cp -p $$d/$$file $(distdir)/$$file || :; \ +	  fi; \ +	done +	$(MAKE) $(AM_MAKEFLAGS) top_distdir="$(top_distdir)" distdir="$(distdir)" dist-hook +check-TESTS: $(TESTS) +	@failed=0; all=0; \ +	srcdir=$(srcdir); export srcdir; \ +	for tst in $(TESTS); do \ +	  if test -f $$tst; then dir=.; \ +	  else dir="$(srcdir)"; fi; \ +	  if $(TESTS_ENVIRONMENT) $$dir/$$tst; then \ +	    all=`expr $$all + 1`; \ +	    echo "PASS: $$tst"; \ +	  elif test $$? -ne 77; then \ +	    all=`expr $$all + 1`; \ +	    failed=`expr $$failed + 1`; \ +	    echo "FAIL: $$tst"; \ +	  fi; \ +	done; \ +	if test "$$failed" -eq 0; then \ +	  banner="All $$all tests passed"; \ +	else \ +	  banner="$$failed of $$all tests failed"; \ +	fi; \ +	dashes=`echo "$$banner" | sed s/./=/g`; \ +	echo "$$dashes"; \ +	echo "$$banner"; \ +	echo "$$dashes"; \ +	test "$$failed" -eq 0 +info-am: +info: info-am +dvi-am: +dvi: dvi-am +check-am: all-am +	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) +	$(MAKE) $(AM_MAKEFLAGS) check-TESTS check-local +check: check-am +installcheck-am: +installcheck: installcheck-am +install-exec-am: install-libLTLIBRARIES install-binPROGRAMS +	@$(NORMAL_INSTALL) +	$(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-exec: install-exec-am + +install-data-am: install-includeHEADERS install-data-local +install-data: install-data-am + +install-am: all-am +	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-am +uninstall-am: uninstall-libLTLIBRARIES uninstall-binPROGRAMS \ +		uninstall-includeHEADERS +uninstall: uninstall-am +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS) all-local +all-redirect: all-am +install-strip: +	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: +	$(mkinstalldirs)  $(DESTDIR)$(libdir) $(DESTDIR)$(bindir) \ +		$(DESTDIR)$(includedir) + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: +	-rm -f Makefile $(CONFIG_CLEAN_FILES) +	-rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: +mostlyclean-am:  mostlyclean-libLTLIBRARIES mostlyclean-compile \ +		mostlyclean-libtool mostlyclean-binPROGRAMS \ +		mostlyclean-checkPROGRAMS mostlyclean-tags \ +		mostlyclean-generic + +mostlyclean: mostlyclean-am + +clean-am:  clean-libLTLIBRARIES clean-compile clean-libtool \ +		clean-binPROGRAMS clean-checkPROGRAMS clean-tags \ +		clean-generic mostlyclean-am + +clean: clean-am + +distclean-am:  distclean-libLTLIBRARIES distclean-compile \ +		distclean-libtool distclean-binPROGRAMS \ +		distclean-checkPROGRAMS distclean-tags \ +		distclean-generic clean-am +	-rm -f libtool + +distclean: distclean-am + +maintainer-clean-am:  maintainer-clean-libLTLIBRARIES \ +		maintainer-clean-compile maintainer-clean-libtool \ +		maintainer-clean-binPROGRAMS \ +		maintainer-clean-checkPROGRAMS maintainer-clean-tags \ +		maintainer-clean-generic distclean-am +	@echo "This command is intended for maintainers to use;" +	@echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-am + +.PHONY: mostlyclean-libLTLIBRARIES distclean-libLTLIBRARIES \ +clean-libLTLIBRARIES maintainer-clean-libLTLIBRARIES \ +uninstall-libLTLIBRARIES install-libLTLIBRARIES mostlyclean-compile \ +distclean-compile clean-compile maintainer-clean-compile \ +mostlyclean-libtool distclean-libtool clean-libtool \ +maintainer-clean-libtool mostlyclean-binPROGRAMS distclean-binPROGRAMS \ +clean-binPROGRAMS maintainer-clean-binPROGRAMS uninstall-binPROGRAMS \ +install-binPROGRAMS mostlyclean-checkPROGRAMS distclean-checkPROGRAMS \ +clean-checkPROGRAMS maintainer-clean-checkPROGRAMS \ +uninstall-includeHEADERS install-includeHEADERS tags mostlyclean-tags \ +distclean-tags clean-tags maintainer-clean-tags distdir check-TESTS \ +info-am info dvi-am dvi check-local check check-am installcheck-am \ +installcheck install-exec-am install-exec install-data-local \ +install-data-am install-data install-am install uninstall-am uninstall \ +all-local all-redirect all-am all installdirs mostlyclean-generic \ +distclean-generic clean-generic maintainer-clean-generic clean \ +mostlyclean distclean maintainer-clean + + +install-suid-programs: +	@foo='$(bin_SUIDS)'; \ +	for file in $$foo; do \ +	x=$(DESTDIR)$(bindir)/$$file; \ +	if chown 0:0 $$x && chmod u+s $$x; then :; else \ +	chmod 0 $$x; fi; done + +install-exec-hook: install-suid-programs + +install-build-headers:: $(include_HEADERS) $(build_HEADERZ) +	@foo='$(include_HEADERS) $(build_HEADERZ)'; \ +	for f in $$foo; do \ +		f=`basename $$f`; \ +		if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ +		else file="$$f"; fi; \ +		if cmp -s  $$file $(buildinclude)/$$f 2> /dev/null ; then \ +		: ; else \ +			echo " $(INSTALL_DATA) $$file $(buildinclude)/$$f"; \ +			$(INSTALL_DATA) $$file $(buildinclude)/$$f; \ +		fi ; \ +	done + +all-local: install-build-headers +#NROFF_MAN = nroff -man +.1.cat1: +	$(NROFF_MAN) $< > $@ +.3.cat3: +	$(NROFF_MAN) $< > $@ +.5.cat5: +	$(NROFF_MAN) $< > $@ +.8.cat8: +	$(NROFF_MAN) $< > $@ + +dist-cat1-mans: +	@foo='$(man1_MANS)'; \ +	bar='$(man_MANS)'; \ +	for i in $$bar; do \ +	case $$i in \ +	*.1) foo="$$foo $$i";; \ +	esac; done ;\ +	for i in $$foo; do \ +		x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ +		echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ +		$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ +	done + +dist-cat3-mans: +	@foo='$(man3_MANS)'; \ +	bar='$(man_MANS)'; \ +	for i in $$bar; do \ +	case $$i in \ +	*.3) foo="$$foo $$i";; \ +	esac; done ;\ +	for i in $$foo; do \ +		x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ +		echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ +		$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ +	done + +dist-cat5-mans: +	@foo='$(man5_MANS)'; \ +	bar='$(man_MANS)'; \ +	for i in $$bar; do \ +	case $$i in \ +	*.5) foo="$$foo $$i";; \ +	esac; done ;\ +	for i in $$foo; do \ +		x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ +		echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ +		$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ +	done + +dist-cat8-mans: +	@foo='$(man8_MANS)'; \ +	bar='$(man_MANS)'; \ +	for i in $$bar; do \ +	case $$i in \ +	*.8) foo="$$foo $$i";; \ +	esac; done ;\ +	for i in $$foo; do \ +		x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ +		echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ +		$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ +	done + +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans + +install-cat1-mans: +	@ext=1;\ +	foo='$(man1_MANS)'; \ +	bar='$(man_MANS)'; \ +	for i in $$bar; do \ +	case $$i in \ +	*.1) foo="$$foo $$i";; \ +	esac; done; \ +	if test "$$foo"; then \ +		$(mkinstalldirs) $(DESTDIR)$(cat1dir); \ +		for x in $$foo; do \ +			f=`echo $$x | sed 's/\.[^.]*$$/.cat1/'`; \ +			if test -f "$(srcdir)/$$f"; then \ +				b=`echo $$x | sed 's!$(MANRX)!\1!'`; \ +				echo "$(INSTALL_DATA) $(srcdir)/$$f $(DESTDIR)$(cat1dir)/$$b.$(CATSUFFIX)";\ +				$(INSTALL_DATA) $(srcdir)/$$g $(DESTDIR)$(cat1dir)/$$b.$(CATSUFFIX);\ +			 fi; \ +		done ;\ +	fi + +install-cat3-mans: +	@ext=3;\ +	foo='$(man3_MANS)'; \ +	bar='$(man_MANS)'; \ +	for i in $$bar; do \ +	case $$i in \ +	*.3) foo="$$foo $$i";; \ +	esac; done; \ +	if test "$$foo"; then \ +		$(mkinstalldirs) $(DESTDIR)$(cat3dir); \ +		for x in $$foo; do \ +			f=`echo $$x | sed 's/\.[^.]*$$/.cat3/'`; \ +			if test -f "$(srcdir)/$$f"; then \ +				b=`echo $$x | sed 's!$(MANRX)!\1!'`; \ +				echo "$(INSTALL_DATA) $(srcdir)/$$f $(DESTDIR)$(cat3dir)/$$b.$(CATSUFFIX)";\ +				$(INSTALL_DATA) $(srcdir)/$$g $(DESTDIR)$(cat3dir)/$$b.$(CATSUFFIX);\ +			 fi; \ +		done ;\ +	fi + +install-cat5-mans: +	@ext=5;\ +	foo='$(man5_MANS)'; \ +	bar='$(man_MANS)'; \ +	for i in $$bar; do \ +	case $$i in \ +	*.5) foo="$$foo $$i";; \ +	esac; done; \ +	if test "$$foo"; then \ +		$(mkinstalldirs) $(DESTDIR)$(cat5dir); \ +		for x in $$foo; do \ +			f=`echo $$x | sed 's/\.[^.]*$$/.cat5/'`; \ +			if test -f "$(srcdir)/$$f"; then \ +				b=`echo $$x | sed 's!$(MANRX)!\1!'`; \ +				echo "$(INSTALL_DATA) $(srcdir)/$$f $(DESTDIR)$(cat5dir)/$$b.$(CATSUFFIX)";\ +				$(INSTALL_DATA) $(srcdir)/$$g $(DESTDIR)$(cat5dir)/$$b.$(CATSUFFIX);\ +			 fi; \ +		done ;\ +	fi + +install-cat8-mans: +	@ext=8;\ +	foo='$(man8_MANS)'; \ +	bar='$(man_MANS)'; \ +	for i in $$bar; do \ +	case $$i in \ +	*.8) foo="$$foo $$i";; \ +	esac; done; \ +	if test "$$foo"; then \ +		$(mkinstalldirs) $(DESTDIR)$(cat8dir); \ +		for x in $$foo; do \ +			f=`echo $$x | sed 's/\.[^.]*$$/.cat8/'`; \ +			if test -f "$(srcdir)/$$f"; then \ +				b=`echo $$x | sed 's!$(MANRX)!\1!'`; \ +				echo "$(INSTALL_DATA) $(srcdir)/$$f $(DESTDIR)$(cat8dir)/$$b.$(CATSUFFIX)";\ +				$(INSTALL_DATA) $(srcdir)/$$g $(DESTDIR)$(cat8dir)/$$b.$(CATSUFFIX);\ +			 fi; \ +		done ;\ +	fi + +install-cat-mans: install-cat1-mans install-cat3-mans install-cat5-mans install-cat8-mans + +install-data-local: install-cat-mans + +.et.h: +	$(COMPILE_ET) $< +.et.c: +	$(COMPILE_ET) $< + +.x.c: +	@cmp -s $< $@ 2> /dev/null || cp $< $@ + +check-local:: +	@foo='$(CHECK_LOCAL)'; \ +	  if test "$$foo"; then \ +	  failed=0; all=0; \ +	  for i in $$foo; do \ +	    all=`expr $$all + 1`; \ +	    if ./$$i --version > /dev/null 2>&1; then \ +	      echo "PASS: $$i"; \ +	    else \ +	      echo "FAIL: $$i"; \ +	      failed=`expr $$failed + 1`; \ +	    fi; \ +	  done; \ +	  if test "$$failed" -eq 0; then \ +	    banner="All $$all tests passed"; \ +	  else \ +	    banner="$$failed of $$all tests failed"; \ +	  fi; \ +	  dashes=`echo "$$banner" | sed s/./=/g`; \ +	  echo "$$dashes"; \ +	  echo "$$banner"; \ +	  echo "$$dashes"; \ +	  test "$$failed" -eq 0; \ +	fi + +dist-hook: +	$(mkinstalldirs) $(distdir)/t +	$(INSTALL_DATA) $(srcdir)/t/perl $(distdir)/t +	$(INSTALL_DATA) $(srcdir)/t/test $(distdir)/t +	$(mkinstalldirs) $(distdir)/asm +	(cd $(srcdir)/asm && tar cf - $(asm_files)) \ +		| (cd $(distdir)/asm; tar xf -) + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/crypto/libdes/Makefile.ssl b/crypto/libdes/Makefile.ssl new file mode 100644 index 000000000000..c415d393c74e --- /dev/null +++ b/crypto/libdes/Makefile.ssl @@ -0,0 +1,108 @@ +# +# SSLeay/crypto/des/Makefile +# + +DIR=	des +TOP=	../.. +CC=	cc +CPP=	cc -E +INCLUDES= +CFLAG=-g +INSTALLTOP=/usr/local/ssl +MAKE=		make -f Makefile.ssl +MAKEDEPEND=	makedepend -fMakefile.ssl +MAKEFILE=	Makefile.ssl +DES_ENC=	des_enc.o + +CFLAGS= $(INCLUDES) $(CFLAG) + +GENERAL=Makefile des.org des_locl.org +TEST=destest.c +APPS= + +LIB=$(TOP)/libcrypto.a +LIBSRC=	cbc3_enc.c cbc_cksm.c cbc_enc.c  cfb64enc.c cfb_enc.c  \ +	ecb3_enc.c ecb_enc.c  ede_enc.c  enc_read.c enc_writ.c \ +	fcrypt.c   ncbc_enc.c ofb64enc.c ofb_enc.c  pcbc_enc.c \ +	qud_cksm.c rand_key.c read_pwd.c rpc_enc.c  set_key.c  \ +	xcbc_enc.c des_enc.c \ +	str2key.c  cfb64ede.c ofb64ede.c supp.c + +LIBOBJ= set_key.o  ecb_enc.o  ede_enc.o  cbc_enc.o  cbc3_enc.o \ +	ecb3_enc.o cfb64enc.o cfb64ede.o cfb_enc.o  ofb64ede.o \ +	enc_read.o enc_writ.o fcrypt.o   ncbc_enc.o ofb64enc.o \ +	ofb_enc.o  str2key.o  pcbc_enc.o qud_cksm.o rand_key.o \ +	xcbc_enc.o ${DES_ENC} \ +	read_pwd.o rpc_enc.o  cbc_cksm.o supp.o + +SRC= $(LIBSRC) + +EXHEADER= des.h +HEADER=	des_locl.h rpc_des.h podd.h sk.h spr.h des_ver.h $(EXHEADER) + +ALL=    $(GENERAL) $(SRC) $(HEADER) + +top: +	(cd ../..; $(MAKE) DIRS=crypto SDIRS=$(DIR) sub_all) + +all:	lib + +lib:	$(LIBOBJ) +	ar r $(LIB) $(LIBOBJ) +	sh $(TOP)/util/ranlib.sh $(LIB) +	@touch lib + +asm/dx86-elf.o: asm/dx86-cpp.s asm/dx86unix.cpp +	$(CPP) -DELF asm/dx86unix.cpp | as -o asm/dx86-elf.o + +asm/dx86-sol.o: asm/dx86-cpp.s asm/dx86unix.cpp +	$(CPP) -DSOL asm/dx86unix.cpp | as -o asm/dx86-sol.o + +asm/dx86-out.o: asm/dx86-cpp.s asm/dx86unix.cpp +	$(CPP) -DOUT asm/dx86unix.cpp | as -o asm/dx86-out.o + +asm/dx86bsdi.o: asm/dx86-cpp.s asm/dx86unix.cpp +	$(CPP) -DBSDI asm/dx86unix.cpp | as -o asm/dx86bsdi.o + +files: +	perl $(TOP)/util/files.pl Makefile.ssl >> $(TOP)/MINFO + +links: +	/bin/rm -f Makefile +	$(TOP)/util/point.sh Makefile.ssl Makefile ; +	/bin/rm -f des.doc +	$(TOP)/util/point.sh ../../doc/des.doc des.doc ; +	$(TOP)/util/mklink.sh ../../include $(EXHEADER) +	$(TOP)/util/mklink.sh ../../test $(TEST) +	$(TOP)/util/mklink.sh ../../apps $(APPS) + +install: installs + +installs: +	@for i in $(EXHEADER) ; \ +	do  \ +	(cp $$i $(INSTALLTOP)/include/$$i; \ +	chmod 644 $(INSTALLTOP)/include/$$i ) \ +	done; + +tags: +	ctags $(SRC) + +tests: + +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 *.o asm/*.o *.obj lib tags core .pure .nfs* *.old *.bak fluff + +errors: + +# DO NOT DELETE THIS LINE -- make depend depends on it. diff --git a/crypto/libdes/Makefile.uni b/crypto/libdes/Makefile.uni new file mode 100644 index 000000000000..f78ea14c9551 --- /dev/null +++ b/crypto/libdes/Makefile.uni @@ -0,0 +1,207 @@ +# 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. + +# 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) + +CC=cc +CFLAGS= -D_HPUX_SOURCE -Aa +O2 $(OPTS) $(CFLAG) + +#CC=gcc +#CFLAGS= -O3 -fomit-frame-pointer $(OPTS) $(CFLAG) + +CPP=$(CC) -E + +DES_ENC=des_enc.o	# normal C version +#DES_ENC=asm/dx86-elf.o	# elf format x86 +#DES_ENC=asm/dx86-out.o	# a.out format x86 +#DES_ENC=asm/dx86-sol.o	# solaris format x86  +#DES_ENC=asm/dx86bsdi.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 +OBJS=	cbc3_enc.o cbc_cksm.o cbc_enc.o ncbc_enc.o pcbc_enc.o qud_cksm.o \ +	cfb64ede.o cfb64enc.o cfb_enc.o ecb3_enc.o ecb_enc.o  ede_enc.o  \ +	enc_read.o enc_writ.o fcrypt.o  ofb64ede.o ofb64enc.o ofb_enc.o  \ +	rand_key.o read_pwd.o set_key.o rpc_enc.o  str2key.o supp.o \ +	$(DES_ENC) xcbc_enc.o + +GENERAL=$(GENERAL_LIT) FILES Imakefile times vms.com KERBEROS MODES.DES \ +	GNUmakefile des.man DES.pm DES.pod DES.xs Makefile.PL \ +	Makefile.uni typemap t Makefile.ssl makefile.bc Makefile.lit \ +	des.org des_locl.org +DES=	des.c +TESTING=rpw.c $(TESTING_LIT) +HEADERS= $(HEADERS_LIT) rpc_des.h +LIBDES= cbc_cksm.c pcbc_enc.c qud_cksm.c \ +	cfb64ede.c cfb64enc.c cfb_enc.c ecb3_enc.c  cbc3_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 + +TESTING_LIT=destest.c speed.c des_opts.c +GENERAL_LIT=COPYRIGHT INSTALL README VERSION Makefile des_crypt.man \ +	des.doc options.txt asm +HEADERS_LIT=des_ver.h des.h des_locl.h podd.h sk.h spr.h +LIBDES_LIT=ede_enc.c cbc_enc.c ncbc_enc.c ecb_enc.c fcrypt.c set_key.c des_enc.c + +PERL=	des.pl testdes.pl doIP doIP2 doPC1 doPC2 PC1 PC2 shifts.pl + +ALL=	$(GENERAL) $(DES) $(TESTING) $(LIBDES) $(PERL) $(HEADERS) + +DLIB=	libdes.a + +all: $(DLIB) destest rpw des speed des_opts + +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 CC=gcc CFLAGS="-DELF -O3 -fomit-frame-pointer $(OPTS) $(CFLAG)" all + +x86-out: +	make DES_ENC=asm/dx86-out.o CC=gcc CFLAGS="-DOUT -O3 -fomit-frame-pointer $(OPTS) $(CFLAG)" all + +x86-solaris: +	make DES_ENC=asm/dx86-sol.o CFLAGS="-DSOL -O  $(OPTS) $(CFLAG)" all + +x86-bsdi: +	make DES_ENC=asm/dx86bsdi.o CC=gcc CFLAGS="-DBSDI -O3 -fomit-frame-pointer $(OPTS) $(CFLAG)" all + +asm/dx86-elf.o: asm/dx86-cpp.s asm/dx86unix.cpp +	$(CPP) -DELF asm/dx86unix.cpp | as -o asm/dx86-elf.o + +asm/dx86-sol.o: asm/dx86-cpp.s asm/dx86unix.cpp +	$(CPP) -DSOL asm/dx86unix.cpp | as -o asm/dx86-sol.o + +asm/dx86-out.o: asm/dx86-cpp.s asm/dx86unix.cpp +	$(CPP) -DOUT asm/dx86unix.cpp | as -o asm/dx86-out.o + +asm/dx86bsdi.o: asm/dx86-cpp.s asm/dx86unix.cpp +	$(CPP) -DBSDI asm/dx86unix.cpp | as -o asm/dx86bsdi.o + +test:	all +	./destest + +$(DLIB): $(OBJS) +	/bin/rm -f $(DLIB) +	ar cr $(DLIB) $(OBJS) +	-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 libdes.a +	$(CC) $(CFLAGS) -o des_opts des_opts.o libdes.a + +destest: destest.o libdes.a +	$(CC) $(CFLAGS) -o destest destest.o libdes.a + +rpw: rpw.o libdes.a +	$(CC) $(CFLAGS) -o rpw rpw.o libdes.a + +speed: speed.o libdes.a +	$(CC) $(CFLAGS) -o speed speed.o libdes.a + +des: des.o libdes.a +	$(CC) $(CFLAGS) -o des des.o libdes.a + +tags: +	ctags $(DES) $(TESTING) $(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_LIT) +	/bin/rm -f Makefile +	/bin/mv Makefile.tmp Makefile + +tar: +	tar chf libdes.tar $(ALL) + +shar: +	shar $(ALL) >libdes.shar + +depend: +	makedepend $(LIBDES) $(DES) $(TESTING) + +clean: +	/bin/rm -f *.o tags core rpw destest des speed $(DLIB) .nfs* *.old \ +	*.bak destest rpw des_opts 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: $(DLIB) des +	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; \ +	    cp des $(INSTALLTOP)/bin; \ +	    chmod 755 $(INSTALLTOP)/bin/des; \ +	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 $(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/crypto/libdes/PC1 b/crypto/libdes/PC1 new file mode 100755 index 000000000000..efb8348b72d7 --- /dev/null +++ b/crypto/libdes/PC1 @@ -0,0 +1,28 @@ +#!/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/crypto/libdes/PC2 b/crypto/libdes/PC2 new file mode 100755 index 000000000000..2d560270ecd8 --- /dev/null +++ b/crypto/libdes/PC2 @@ -0,0 +1,57 @@ +#!/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/crypto/libdes/README b/crypto/libdes/README new file mode 100644 index 000000000000..58280c26e927 --- /dev/null +++ b/crypto/libdes/README @@ -0,0 +1,54 @@ + +		libdes, Version 4.01 13-Jan-97 + +		Copyright (c) 1997, Eric Young +			  All rights reserved. + +    This program is free software; you can redistribute it and/or modify +    it under the terms specified in COPYRIGHT. +     +-- +The primary ftp site for this library is +ftp://ftp.psy.uq.oz.au/pub/Crypto/DES/libdes-x.xx.tar.gz +libdes is now also shipped with SSLeay.  Primary ftp site of +ftp://ftp.psy.uq.oz.au/pub/Crypto/SSL/SSLeay-x.x.x.tar.gz + +The best way to build this library is to build it as part of SSLeay. + +This kit builds a DES encryption library and a DES encryption program. +It supports ecb, cbc, ofb, cfb, triple ecb, triple cbc, triple ofb, +triple cfb, desx, and MIT's pcbc encryption modes and also has a fast +implementation of crypt(3). +It contains support routines to read keys from a terminal, +generate a random key, generate a key from an arbitrary length string, +read/write encrypted data from/to a file descriptor. + +The implementation was written so as to conform with the manual entry +for the des_crypt(3) library routines from MIT's project Athena. + +destest should be run after compilation to test the des routines. +rpw should be run after compilation to test the read password routines. +The des program is a replacement for the sun des command.  I believe it +conforms to the sun version. + +The Imakefile is setup for use in the kerberos distribution. + +These routines are best compiled with gcc or any other good +optimising compiler. +Just turn you optimiser up to the highest settings and run destest +after the build to make sure everything works. + +I believe these routines are close to the fastest and most portable DES +routines that use small lookup tables (4.5k) that are publicly available. +The fcrypt routine is faster than ufc's fcrypt (when compiling with +gcc2 -O2) on the sparc 2 (1410 vs 1270) but is not so good on other machines +(on a sun3/260 168 vs 336).  It is a function of CPU on chip cache size. +[ 10-Jan-97 and a function of an incorrect speed testing program in +  ufc which gave much better test figures that reality ]. + +It is worth noting that on sparc and Alpha CPUs, performance of the DES +library can vary by upto %10 due to the positioning of files after application +linkage. + +Eric Young (eay@mincom.oz.au) + diff --git a/crypto/libdes/VERSION b/crypto/libdes/VERSION new file mode 100644 index 000000000000..bb00c3eb12ae --- /dev/null +++ b/crypto/libdes/VERSION @@ -0,0 +1,382 @@ +Version 4.01 14/01/97 +	Even faster inner loop in the DES assember for x86 and a modification +	for IP/FP which is faster on x86.  Both of these changes are +	from Svend Olaf Mikkelsen <svolaf@inet.uni-c.dk>.  His +	changes make the assember run %40 faster on a pentium.  This is just +	a case of getting the instruction sequence 'just right'. +	All credit to 'Svend' :-) +	Quite a few special x86 'make' targets. +	A libdes-l (lite) distribution. + +Version 4.00 +	After a bit of a pause, I'll up the major version number since this +	is mostly a performace release.  I've added x86 assember and +	added more options for performance.  A %28 speedup for gcc  +	on a pentium and the assember is a %50 speedup. +	MIPS CPU's, sparc and Alpha are the main CPU's with speedups. +	Run des_opts to work out which options should be used. +	DES_RISC1/DES_RISC2 use alternative inner loops which use +	more registers but should give speedups on any CPU that does +	dual issue (pentium).  DES_UNROLL unrolls the inner loop, +	which costs in code size. + +Version 3.26 +	I've finally removed one of the shifts in D_ENCRYPT.  This +	meant I've changed the des_SPtrans table (spr.h), the set_key() +	function and some things in des_enc.c.  This has definitly +	made things faster :-).  I've known about this one for some +	time but I've been too lazy to follow it up :-). +	Noticed that in the D_ENCRYPT() macro, we can just do L^=(..)^(..)^.. +	instead of L^=((..)|(..)|(..)..  This should save a register at +	least. +	Assember for x86.  The file to replace is des_enc.c, which is replaced +	by one of the assember files found in asm.  Look at des/asm/readme +	for more info. + +	/* Modification to fcrypt so it can be compiled to support +	HPUX 10.x's long password format, define -DLONGCRYPT to use this. +	Thanks to Jens Kupferschmidt <bt1cu@hpboot.rz.uni-leipzig.de>. */ + +	SIGWINCH case put in des_read_passwd() so the function does not +	'exit' if this function is recieved. + +Version 3.25 17/07/96 +	Modified read_pwd.c so that stdin can be read if not a tty. +	Thanks to Jeff Barber <jeffb@issl.atl.hp.com> for the patches. +	des_init_random_number_generator() shortened due to VMS linker +	limits. +	Added RSA's DESX cbc mode.  It is a form of cbc encryption, with 2 +	8 byte quantites xored before and after encryption. +	des_xcbc_encryption() - the name is funny to preserve the des_ +	prefix on all functions. + +Version 3.24 20/04/96 +	The DES_PTR macro option checked and used by SSLeay configuration + +Version 3.23 11/04/96 +	Added DES_LONG.  If defined to 'unsigned int' on the DEC Alpha, +	it gives a %20 speedup :-) +	Fixed the problem with des.pl under perl5.  The patches were +	sent by Ed Kubaitis (ejk@uiuc.edu). +	if fcrypt.c, changed values to handle illegal salt values the way +	normal crypt() implementations do.  Some programs apparently use +	them :-(. The patch was sent by Bjorn Gronvall <bg@sics.se> + +Version 3.22 29/11/95 +	Bug in des(1), an error with the uuencoding stuff when the +	'data' is small, thanks to Geoff Keating <keagchon@mehta.anu.edu.au> +	for the patch. + +Version 3.21 22/11/95 +	After some emailing back and forth with  +	Colin Plumb <colin@nyx10.cs.du.edu>, I've tweaked a few things +	and in a future version I will probably put in some of the +	optimisation he suggested for use with the DES_USE_PTR option. +	Extra routines from Mark Murray <mark@grondar.za> for use in +	freeBSD.  They mostly involve random number generation for use +	with kerberos.  They involve evil machine specific system calls +	etc so I would normally suggest pushing this stuff into the +	application and/or using RAND_seed()/RAND_bytes() if you are +	using this DES library as part of SSLeay. +	Redone the read_pw() function so that it is cleaner and +	supports termios, thanks to Sameer Parekh <sameer@c2.org> +	for the initial patches for this. +	Renamed 3ecb_encrypt() to ecb3_encrypt().  This has been +	 done just to make things more consistent. +	I have also now added triple DES versions of cfb and ofb. + +Version 3.20 +	Damn, Damn, Damn, as pointed out by Mike_Spreitzer.PARC@xerox.com, +	my des_random_seed() function was only copying 4 bytes of the +	passed seed into the init structure.  It is now fixed to copy 8. +	My own suggestion is to used something like MD5 :-) + +Version 3.19  +	While looking at my code one day, I though, why do I keep on +	calling des_encrypt(in,out,ks,enc) when every function that +	calls it has in and out the same.  So I dropped the 'out' +	parameter, people should not be using this function. + +Version 3.18 30/08/95 +	Fixed a few bit with the distribution and the filenames. +	3.17 had been munged via a move to DOS and back again. +	NO CODE CHANGES + +Version 3.17 14/07/95 +	Fixed ede3 cbc which I had broken in 3.16.  I have also +	removed some unneeded variables in 7-8 of the routines. + +Version 3.16 26/06/95 +	Added des_encrypt2() which does not use IP/FP, used by triple +	des routines.  Tweaked things a bit elsewhere. %13 speedup on +	sparc and %6 on a R4400 for ede3 cbc mode. + +Version 3.15 06/06/95 +	Added des_ncbc_encrypt(), it is des_cbc mode except that it is +	'normal' and copies the new iv value back over the top of the +	passed parameter. +	CHANGED des_ede3_cbc_encrypt() so that it too now overwrites +	the iv.  THIS WILL BREAK EXISTING CODE, but since this function +	only new, I feel I can change it, not so with des_cbc_encrypt :-(. +	I need to update the documentation. + +Version 3.14 31/05/95 +	New release upon the world, as part of my SSL implementation. +	New copyright and usage stuff.  Basically free for all to use +	as long as you say it came from me :-) + +Version 3.13 31/05/95 +	A fix in speed.c, if HZ is not defined, I set it to 100.0 +	which is reasonable for most unixes except SunOS 4.x. +	I now have a #ifdef sun but timing for SunOS 4.x looked very +	good :-(.  At my last job where I used SunOS 4.x, it was +	defined to be 60.0 (look at the old INSTALL documentation), at +	the last release had it changed to 100.0 since I now work with +	Solaris2 and SVR4 boxes. +	Thanks to  Rory Chisholm <rchishol@math.ethz.ch> for pointing this +	one out. + +Version 3.12 08/05/95 +	As pointed out by The Crypt Keeper <tck@bend.UCSD.EDU>, +	my D_ENCRYPT macro in crypt() had an un-necessary variable. +	It has been removed. + +Version 3.11 03/05/95 +	Added des_ede3_cbc_encrypt() which is cbc mode des with 3 keys +	and one iv.  It is a standard and I needed it for my SSL code. +	It makes more sense to use this for triple DES than +	3cbc_encrypt().  I have also added (or should I say tested :-) +	cfb64_encrypt() which is cfb64 but it will encrypt a partial +	number of bytes - 3 bytes in 3 bytes out.  Again this is for +	my SSL library, as a form of encryption to use with SSL +	telnet. + +Version 3.10 22/03/95 +	Fixed a bug in 3cbc_encrypt() :-(.  When making repeated calls +	to cbc3_encrypt, the 2 iv values that were being returned to +	be used in the next call were reversed :-(. +	Many thanks to Bill Wade <wade@Stoner.COM> for pointing out +	this error. + +Version 3.09 01/02/95 +	Fixed des_random_key to far more random, it was rather feeble +	with regards to picking the initial seed.  The problem was +	pointed out by Olaf Kirch <okir@monad.swb.de>. + +Version 3.08 14/12/94 +	Added Makefile.PL so libdes can be built into perl5. +	Changed des_locl.h so RAND is always defined. + +Version 3.07 05/12/94 +	Added GNUmake and stuff so the library can be build with +	glibc. + +Version 3.06 30/08/94 +	Added rpc_enc.c which contains _des_crypt.  This is for use in +	secure_rpc v 4.0 +	Finally fixed the cfb_enc problems. +	Fixed a few parameter parsing bugs in des (-3 and -b), thanks +	to Rob McMillan <R.McMillan@its.gu.edu.au> + +Version 3.05 21/04/94 +	for unsigned long l; gcc does not produce ((l>>34) == 0) +	This causes bugs in cfb_enc. +	Thanks to Hadmut Danisch <danisch@ira.uka.de> + +Version 3.04 20/04/94 +	Added a version number to des.c and libdes.a + +Version 3.03 12/01/94 +	Fixed a bug in non zero iv in 3cbc_enc. + +Version 3.02 29/10/93 +	I now work in a place where there are 6+ architectures and 14+ +	OS versions :-). +	Fixed TERMIO definition so the most sys V boxes will work :-) + +Release upon comp.sources.misc +Version 3.01 08/10/93 +	Added des_3cbc_encrypt() + +Version 3.00 07/10/93 +	Fixed up documentation. +	quad_cksum definitely compatible with MIT's now. + +Version 2.30 24/08/93 +	Triple DES now defaults to triple cbc but can do triple ecb +	 with the -b flag. +	Fixed some MSDOS uuen/uudecoding problems, thanks to +	Added prototypes. +	 +Version 2.22 29/06/93 +	Fixed a bug in des_is_weak_key() which stopped it working :-( +	thanks to engineering@MorningStar.Com. + +Version 2.21 03/06/93 +	des(1) with no arguments gives quite a bit of help. +	Added -c (generate ckecksum) flag to des(1). +	Added -3 (triple DES) flag to des(1). +	Added cfb and ofb routines to the library. + +Version 2.20 11/03/93 +	Added -u (uuencode) flag to des(1). +	I have been playing with byte order in quad_cksum to make it +	 compatible with MIT's version.  All I can say is avid this +	 function if possible since MIT's output is endian dependent. + +Version 2.12 14/10/92 +	Added MSDOS specific macro in ecb_encrypt which gives a %70 +	 speed up when the code is compiled with turbo C. + +Version 2.11 12/10/92 +	Speedup in set_key (recoding of PC-1) +	 I now do it in 47 simple operations, down from 60. +	 Thanks to John Fletcher (john_fletcher@lccmail.ocf.llnl.gov) +	 for motivating me to look for a faster system :-) +	 The speedup is probably less that 1% but it is still 13 +	 instructions less :-). + +Version 2.10 06/10/92 +	The code now works on the 64bit ETA10 and CRAY without modifications or +	 #defines.  I believe the code should work on any machine that +	 defines long, int or short to be 8 bytes long. +	Thanks to Shabbir J. Safdar (shabby@mentor.cc.purdue.edu) +	 for helping me fix the code to run on 64bit machines (he had +	 access to an ETA10). +	Thanks also to John Fletcher <john_fletcher@lccmail.ocf.llnl.gov> +	 for testing the routines on a CRAY. +	read_password.c has been renamed to read_passwd.c +	string_to_key.c has been renamed to string2key.c + +Version 2.00 14/09/92 +	Made mods so that the library should work on 64bit CPU's. +	Removed all my uchar and ulong defs.  To many different +	 versions of unix define them in their header files in too many +	 different combinations :-) +	IRIX - Sillicon Graphics mods (mostly in read_password.c). +	 Thanks to Andrew Daviel (advax@erich.triumf.ca) + +Version 1.99 26/08/92 +	Fixed a bug or 2 in enc_read.c +	Fixed a bug in enc_write.c +	Fixed a pseudo bug in fcrypt.c (very obscure). + +Version 1.98 31/07/92 +	Support for the ETA10.  This is a strange machine that defines +	longs and ints as 8 bytes and shorts as 4 bytes. +	Since I do evil things with long * that assume that they are 4 +	bytes.  Look in the Makefile for the option to compile for +	this machine.  quad_cksum appears to have problems but I +	will don't have the time to fix it right now, and this is not +	a function that uses DES and so will not effect the main uses +	of the library. + +Version 1.97 20/05/92 eay +	Fixed the Imakefile and made some changes to des.h to fix some +	problems when building this package with Kerberos v 4. + +Version 1.96 18/05/92 eay +	Fixed a small bug in string_to_key() where problems could +	occur if des_check_key was set to true and the string +	generated a weak key. + +Patch2 posted to comp.sources.misc +Version 1.95 13/05/92 eay +	Added an alternative version of the D_ENCRYPT macro in +	ecb_encrypt and fcrypt.  Depending on the compiler, one version or the +	other will be faster.  This was inspired by  +	Dana How <how@isl.stanford.edu>, and her pointers about doing the +	*(ulong *)((uchar *)ptr+(value&0xfc)) +	vs +	ptr[value&0x3f] +	to stop the C compiler doing a <<2 to convert the long array index. + +Version 1.94 05/05/92 eay +	Fixed an incompatibility between my string_to_key and the MIT +	 version.  When the key is longer than 8 chars, I was wrapping +	 with a different method.  To use the old version, define +	 OLD_STR_TO_KEY in the makefile.  Thanks to +	 viktor@newsu.shearson.com (Viktor Dukhovni). + +Version 1.93 28/04/92 eay +	Fixed the VMS mods so that echo is now turned off in +	 read_password.  Thanks again to brennan@coco.cchs.su.oz.AU. +	MSDOS support added.  The routines can be compiled with +	 Turbo C (v2.0) and MSC (v5.1).  Make sure MSDOS is defined. + +Patch1 posted to comp.sources.misc +Version 1.92 13/04/92 eay +	Changed D_ENCRYPT so that the rotation of R occurs outside of +	 the loop.  This required rotating all the longs in sp.h (now +	 called spr.h). Thanks to Richard Outerbridge <71755.204@CompuServe.COM> +	speed.c has been changed so it will work without SIGALRM.  If +	 times(3) is not present it will try to use ftime() instead. + +Version 1.91 08/04/92 eay +	Added -E/-D options to des(1) so it can use string_to_key. +	Added SVR4 mods suggested by witr@rwwa.COM +	Added VMS mods suggested by brennan@coco.cchs.su.oz.AU.  If +	anyone knows how to turn of tty echo in VMS please tell me or +	implement it yourself :-). +	Changed FILE *IN/*OUT to *DES_IN/*DES_OUT since it appears VMS +	does not like IN/OUT being used. + +Libdes posted to comp.sources.misc +Version 1.9 24/03/92 eay +	Now contains a fast small crypt replacement. +	Added des(1) command. +	Added des_rw_mode so people can use cbc encryption with +	enc_read and enc_write. + +Version 1.8 15/10/91 eay +	Bug in cbc_cksum. +	Many thanks to Keith Reynolds (keithr@sco.COM) for pointing this +	one out. + +Version 1.7 24/09/91 eay +	Fixed set_key :-) +	set_key is 4 times faster and takes less space. +	There are a few minor changes that could be made. + +Version 1.6 19/09/1991 eay +	Finally go IP and FP finished. +	Now I need to fix set_key. +	This version is quite a bit faster that 1.51 + +Version 1.52 15/06/1991 eay +	20% speedup in ecb_encrypt by changing the E bit selection +	to use 2 32bit words.  This also required modification of the +	sp table.  There is still a way to speedup the IP and IP-1 +	(hints from outer@sq.com) still working on this one :-(. + +Version 1.51 07/06/1991 eay +	Faster des_encrypt by loop unrolling +	Fixed bug in quad_cksum.c (thanks to hughes@logos.ucs.indiana.edu) + +Version 1.50 28/05/1991 eay +	Optimised the code a bit more for the sparc.  I have improved the +	speed of the inner des_encrypt by speeding up the initial and +	final permutations. + +Version 1.40 23/10/1990 eay +	Fixed des_random_key, it did not produce a random key :-( + +Version 1.30  2/10/1990 eay +	Have made des_quad_cksum the same as MIT's, the full package +	should be compatible with MIT's +	Have tested on a DECstation 3100 +	Still need to fix des_set_key (make it faster). +	Does des_cbc_encrypts at 70.5k/sec on a 3100. + +Version 1.20 18/09/1990 eay +	Fixed byte order dependencies. +	Fixed (I hope) all the word alignment problems. +	Speedup in des_ecb_encrypt. + +Version 1.10 11/09/1990 eay +	Added des_enc_read and des_enc_write. +	Still need to fix des_quad_cksum. +	Still need to document des_enc_read and des_enc_write. + +Version 1.00 27/08/1990 eay + diff --git a/crypto/libdes/asm/des-som2.pl b/crypto/libdes/asm/des-som2.pl new file mode 100644 index 000000000000..911d985e8472 --- /dev/null +++ b/crypto/libdes/asm/des-som2.pl @@ -0,0 +1,308 @@ +#!/usr/local/bin/perl +# +# The inner loop instruction sequence and the IP/FP modifications are from +# Svend Olaf Mikkelsen <svolaf@inet.uni-c.dk> +# + +$prog="des-som2.pl"; + +# base code is in microsft +# op dest, source +# format. +# + +require "desboth.pl"; + +if (	($ARGV[0] eq "elf")) +	{ require "x86unix.pl"; } +elsif (	($ARGV[0] eq "a.out")) +	{ $aout=1; require "x86unix.pl"; } +elsif (	($ARGV[0] eq "sol")) +	{ $sol=1; require "x86unix.pl"; } +elsif (	($ARGV[0] eq "cpp")) +	{ $cpp=1; require "x86unix.pl"; } +elsif (	($ARGV[0] eq "win32")) +	{ require "x86ms.pl"; } +else +	{ +	print STDERR <<"EOF"; +Pick one target type from +	elf	- linux, FreeBSD etc +	a.out	- old linux +	sol	- x86 solaris +	cpp	- format so x86unix.cpp can be used +	win32	- Windows 95/Windows NT +EOF +	exit(1); +	} + +&comment("Don't even think of reading this code"); +&comment("It was automatically generated by $prog"); +&comment("Which is a perl program used to generate the x86 assember for"); +&comment("any of elf, a.out, Win32, or Solaris"); +&comment("It can be found in SSLeay 0.6.5+ or in libdes 3.26+"); +&comment("eric <eay\@mincom.oz.au>"); +&comment("The inner loop instruction sequence and the IP/FP modifications"); +&comment("are from Svend Olaf Mikkelsen <svolaf\@inet.uni-c.dk>"); + +&comment(""); + +&file("dx86xxxx"); + +$L="edi"; +$R="esi"; + +&des_encrypt("des_encrypt",1); +&des_encrypt("des_encrypt2",0); + +&des_encrypt3("des_encrypt3",1); +&des_encrypt3("des_decrypt3",0); + +&file_end(); + +sub des_encrypt +	{ +	local($name,$do_ip)=@_; + +	&function_begin($name,3); + +	&comment(""); +	&comment("Load the 2 words"); +	&mov("eax",&wparam(0)); +	&mov($R,&DWP(0,"eax","",0)); +	&mov($L,&DWP(4,"eax","",0)); + +	if ($do_ip) +		{ +		&comment(""); +		&comment("IP"); +		&IP_new($R,$L,"eax",3); +#		&comment(""); +#		&comment("fixup rotate"); +#		&rotl($R,3); +#		&rotl($L,3); +		} +	else +		{ +		&comment(""); +		&comment("fixup rotate"); +		&rotl($R,3); +		&rotl($L,3); +		} + +	&comment(""); +	&comment("load counter, key_schedule and enc flag"); + +	# encrypting part + +	$ks="ebp"; +#	&xor(	"ebx",		"ebx"		); +	&mov("eax",&wparam(2));	# get encrypt flag +	&xor(	"ecx",		"ecx"		); +	&cmp("eax","0"); +	&mov(	$ks,		&wparam(1)	); +	&je(&label("start_decrypt")); + +	for ($i=0; $i<16; $i+=2) +		{ +		&comment(""); +		&comment("Round $i"); +		&D_ENCRYPT($i,$L,$R,$i*2,$ks,"des_SPtrans","eax","ebx","ecx","edx"); + +		&comment(""); +		&comment("Round ".sprintf("%d",$i+1)); +		&D_ENCRYPT($i+1,$R,$L,($i+1)*2,$ks,"des_SPtrans","eax","ebx","ecx","edx"); +		} +	&jmp(&label("end")); + +	&set_label("start_decrypt"); + +	for ($i=15; $i>0; $i-=2) +		{ +		&comment(""); +		&comment("Round $i"); +		&D_ENCRYPT(15-$i,$L,$R,$i*2,$ks,"des_SPtrans","eax","ebx","ecx","edx"); +		&comment(""); +		&comment("Round ".sprintf("%d",$i-1)); +		&D_ENCRYPT(15-$i+1,$R,$L,($i-1)*2,$ks,"des_SPtrans","eax","ebx","ecx","edx"); +		} + +	&set_label("end"); + +	if ($do_ip) +		{ +#		&comment(""); +#		&comment("Fixup"); +#		&rotr($L,3);		# r +#		&rotr($R,3);		# l +		&comment(""); +		&comment("FP"); +		&FP_new($R,$L,"eax",3); +		} +	else +		{ +		&comment(""); +		&comment("Fixup"); +		&rotr($L,3);		# r +		&rotr($R,3);		# l +		} + +	&mov("eax",&wparam(0)); +	&mov(&DWP(0,"eax","",0),$L); +	&mov(&DWP(4,"eax","",0),$R); + +	&function_end($name); +	} + +sub D_ENCRYPT +	{ +	local($r,$L,$R,$S,$ks,$desSP,$u,$tmp1,$tmp2,$t)=@_; + +	&mov(	$u,		&DWP(&n2a($S*4),$ks,"",0)); +	&xor(	$tmp1,		$tmp1); +	&mov(	$t,		&DWP(&n2a(($S+1)*4),$ks,"",0)); +	&xor(	$u,		$R); +	&xor(	$t,		$R); +	&and(	$u,		"0xfcfcfcfc"	); +	&and(	$t,		"0xcfcfcfcf"	); +	&movb(	&LB($tmp1),	&LB($u)	); +	&movb(	&LB($tmp2),	&HB($u)	); +	&rotr(	$t,		4		); +	&mov(	$ks,		&DWP("      $desSP",$tmp1,"",0)); +	&movb(	&LB($tmp1),	&LB($t)	); +	&xor(	$L,		$ks); +	&mov(	$ks,		&DWP("0x200+$desSP",$tmp2,"",0)); +	&xor(	$L,		$ks); ###### +	&movb(	&LB($tmp2),	&HB($t)	); +	&shr(	$u,		16); +	&mov(	$ks,		&DWP("0x100+$desSP",$tmp1,"",0)); +	&xor(	$L,		$ks); ###### +	&movb(	&LB($tmp1),	&HB($u)	); +	&shr(	$t,		16); +	&mov(	$ks,		&DWP("0x300+$desSP",$tmp2,"",0)); +	&xor(	$L,		$ks); +	&mov(	$ks,		&DWP(24,"esp","",0)); #### +	&movb(	&LB($tmp2),	&HB($t)	); +	&and(	$u,		"0xff"	); +	&and(	$t,		"0xff"	); +	&mov(	$tmp1,		&DWP("0x600+$desSP",$tmp1,"",0)); +	&xor(	$L,		$tmp1); +	&mov(	$tmp1,		&DWP("0x700+$desSP",$tmp2,"",0)); +	&xor(	$L,		$tmp1); +	&mov(	$tmp1,		&DWP("0x400+$desSP",$u,"",0)); +	&xor(	$L,		$tmp1); +	&mov(	$tmp1,		&DWP("0x500+$desSP",$t,"",0)); +	&xor(	$L,		$tmp1); +	} + +sub PERM_OP +	{ +	local($a,$b,$tt,$shift,$mask)=@_; + +	&mov(	$tt,		$a		); +	&shr(	$tt,		$shift		); +	&xor(	$tt,		$b		); +	&and(	$tt,		$mask		); +	&xor(	$b,		$tt		); +	&shl(	$tt,		$shift		); +	&xor(	$a,		$tt		); +	} + +sub IP +	{ +	local($l,$r,$tt)=@_; + +	&PERM_OP($r,$l,$tt, 4,"0x0f0f0f0f"); +	&PERM_OP($l,$r,$tt,16,"0x0000ffff"); +	&PERM_OP($r,$l,$tt, 2,"0x33333333"); +	&PERM_OP($l,$r,$tt, 8,"0x00ff00ff"); +	&PERM_OP($r,$l,$tt, 1,"0x55555555"); +	} + +sub FP +	{ +	local($l,$r,$tt)=@_; + +	&PERM_OP($l,$r,$tt, 1,"0x55555555"); +        &PERM_OP($r,$l,$tt, 8,"0x00ff00ff"); +        &PERM_OP($l,$r,$tt, 2,"0x33333333"); +        &PERM_OP($r,$l,$tt,16,"0x0000ffff"); +        &PERM_OP($l,$r,$tt, 4,"0x0f0f0f0f"); +	} + +sub n2a +	{ +	sprintf("%d",$_[0]); +	} + +# now has a side affect of rotating $a by $shift +sub R_PERM_OP +	{ +	local($a,$b,$tt,$shift,$mask,$last)=@_; + +	&rotl(	$a,		$shift		) if ($shift != 0); +	&mov(	$tt,		$b		); +	&xor(	$tt,		$a		); +	&and(	$tt,		$mask		); +	if ($last eq $b) +		{ +		&xor(	$a,		$tt		); +		&xor(	$b,		$tt		); +		} +	else +		{ +		&xor(	$b,		$tt		); +		&xor(	$a,		$tt		); +		} +	&comment(""); +	} + +sub IP_new +	{ +	local($l,$r,$tt,$lr)=@_; + +	&R_PERM_OP($l,$r,$tt, 4,"0xf0f0f0f0",$l); +	&R_PERM_OP($r,$l,$tt,20,"0xfff0000f",$l); +	&R_PERM_OP($r,$l,$tt,14,"0x33333333",$r); +	&R_PERM_OP($l,$r,$tt,22,"0x03fc03fc",$r); +	&R_PERM_OP($l,$r,$tt, 9,"0xaaaaaaaa",$r); +	 +	if ($lr != 3) +		{ +		if (($lr-3) < 0) +			{ &rotr($l,	3-$lr); } +		else	{ &rotl($l,	$lr-3); } +		} +	if ($lr != 2) +		{ +		if (($lr-2) < 0) +			{ &rotr($r,	2-$lr); } +		else	{ &rotl($r,	$lr-2); } +		} +	} + +sub FP_new +	{ +	local($r,$l,$tt,$lr)=@_; + +	if ($lr != 2) +		{ +		if (($lr-2) < 0) +			{ &rotl($r,	2-$lr); } +		else	{ &rotr($r,	$lr-2); } +		} +	if ($lr != 3) +		{ +		if (($lr-3) < 0) +			{ &rotl($l,	3-$lr); } +		else	{ &rotr($l,	$lr-3); } +		} + +	&R_PERM_OP($l,$r,$tt, 0,"0xaaaaaaaa",$r); +	&R_PERM_OP($l,$r,$tt,23,"0x03fc03fc",$r); +	&R_PERM_OP($l,$r,$tt,10,"0x33333333",$l); +	&R_PERM_OP($r,$l,$tt,18,"0xfff0000f",$l); +	&R_PERM_OP($r,$l,$tt,12,"0xf0f0f0f0",$r); +	&rotr($l	, 4); +	} + diff --git a/crypto/libdes/asm/des-som3.pl b/crypto/libdes/asm/des-som3.pl new file mode 100644 index 000000000000..e1ba3bc2b430 --- /dev/null +++ b/crypto/libdes/asm/des-som3.pl @@ -0,0 +1,266 @@ +#!/usr/local/bin/perl +# +# The inner loop instruction sequence and the IP/FP modifications are from +# Svend Olaf Mikkelsen <svolaf@inet.uni-c.dk> +# + +$prog="des-som3.pl"; + +# base code is in microsft +# op dest, source +# format. +# + +require "desboth.pl"; + +if (	($ARGV[0] eq "elf")) +	{ require "x86unix.pl"; } +elsif (	($ARGV[0] eq "a.out")) +	{ $aout=1; require "x86unix.pl"; } +elsif (	($ARGV[0] eq "sol")) +	{ $sol=1; require "x86unix.pl"; } +elsif (	($ARGV[0] eq "cpp")) +	{ $cpp=1; require "x86unix.pl"; } +elsif (	($ARGV[0] eq "win32")) +	{ require "x86ms.pl"; } +else +	{ +	print STDERR <<"EOF"; +Pick one target type from +	elf	- linux, FreeBSD etc +	a.out	- old linux +	sol	- x86 solaris +	cpp	- format so x86unix.cpp can be used +	win32	- Windows 95/Windows NT +EOF +	exit(1); +	} + +&comment("Don't even think of reading this code"); +&comment("It was automatically generated by $prog"); +&comment("Which is a perl program used to generate the x86 assember for"); +&comment("any of elf, a.out, Win32, or Solaris"); +&comment("It can be found in SSLeay 0.6.5+ or in libdes 3.26+"); +&comment("eric <eay\@mincom.oz.au>"); +&comment("The inner loop instruction sequence and the IP/FP modifications"); +&comment("are from Svend Olaf Mikkelsen <svolaf\@inet.uni-c.dk>"); + +&comment(""); + +&file("dx86xxxx"); + +$L="edi"; +$R="esi"; + +&des_encrypt("des_encrypt",1); +&des_encrypt("des_encrypt2",0); + +&des_encrypt3("des_encrypt3",1); +&des_encrypt3("des_decrypt3",0); + +&file_end(); + +sub des_encrypt +	{ +	local($name,$do_ip)=@_; + +	&function_begin($name,3); + +	&comment(""); +	&comment("Load the 2 words"); +	$ks="ebp"; + +	if ($do_ip) +		{ +		&mov($R,&wparam(0)); +		 &xor(	"ecx",		"ecx"		); +		&mov("eax",&DWP(0,$R,"",0)); +		 &mov("ebx",&wparam(2));	# get encrypt flag +		&mov($L,&DWP(4,$R,"",0)); +		&comment(""); +		&comment("IP"); +		&IP_new("eax",$L,$R,3); +		} +	else +		{ +		&mov("eax",&wparam(0)); +		 &xor(	"ecx",		"ecx"		); +		&mov($R,&DWP(0,"eax","",0)); +		 &mov("ebx",&wparam(2));	# get encrypt flag +		&rotl($R,3); +		&mov($L,&DWP(4,"eax","",0)); +		&rotl($L,3); +		} + +	&cmp("ebx","0"); +	&mov(	$ks,		&wparam(1)	); +	&je(&label("start_decrypt")); + +	for ($i=0; $i<16; $i+=2) +		{ +		&comment(""); +		&comment("Round $i"); +		&D_ENCRYPT($i,$L,$R,$i*2,$ks,"des_SPtrans","eax","ebx","ecx","edx"); + +		&comment(""); +		&comment("Round ".sprintf("%d",$i+1)); +		&D_ENCRYPT($i+1,$R,$L,($i+1)*2,$ks,"des_SPtrans","eax","ebx","ecx","edx"); +		} +	&jmp(&label("end")); + +	&set_label("start_decrypt"); + +	for ($i=15; $i>0; $i-=2) +		{ +		&comment(""); +		&comment("Round $i"); +		&D_ENCRYPT(15-$i,$L,$R,$i*2,$ks,"des_SPtrans","eax","ebx","ecx","edx"); +		&comment(""); +		&comment("Round ".sprintf("%d",$i-1)); +		&D_ENCRYPT(15-$i+1,$R,$L,($i-1)*2,$ks,"des_SPtrans","eax","ebx","ecx","edx"); +		} + +	&set_label("end"); + +	if ($do_ip) +		{ +		&comment(""); +		&comment("FP"); +		&mov("edx",&wparam(0)); +		&FP_new($L,$R,"eax",3); + +		&mov(&DWP(0,"edx","",0),"eax"); +		&mov(&DWP(4,"edx","",0),$R); +		} +	else +		{ +		&comment(""); +		&comment("Fixup"); +		&rotr($L,3);		# r +		 &mov("eax",&wparam(0)); +		&rotr($R,3);		# l +		 &mov(&DWP(0,"eax","",0),$L); +		 &mov(&DWP(4,"eax","",0),$R); +		} + + +	&function_end($name); +	} + +sub D_ENCRYPT +	{ +	local($r,$L,$R,$S,$ks,$desSP,$u,$tmp1,$tmp2,$t)=@_; + +	&mov(	$u,		&DWP(&n2a($S*4),$ks,"",0)); +	&xor(	$tmp1,		$tmp1); +	&mov(	$t,		&DWP(&n2a(($S+1)*4),$ks,"",0)); +	&xor(	$u,		$R); +	&xor(	$t,		$R); +	&and(	$u,		"0xfcfcfcfc"	); +	&and(	$t,		"0xcfcfcfcf"	); +	&movb(	&LB($tmp1),	&LB($u)	); +	&movb(	&LB($tmp2),	&HB($u)	); +	&rotr(	$t,		4		); +	&mov(	$ks,		&DWP("      $desSP",$tmp1,"",0)); +	&movb(	&LB($tmp1),	&LB($t)	); +	&xor(	$L,		$ks); +	&mov(	$ks,		&DWP("0x200+$desSP",$tmp2,"",0)); +	&xor(	$L,		$ks); ###### +	&movb(	&LB($tmp2),	&HB($t)	); +	&shr(	$u,		16); +	&mov(	$ks,		&DWP("0x100+$desSP",$tmp1,"",0)); +	&xor(	$L,		$ks); ###### +	&movb(	&LB($tmp1),	&HB($u)	); +	&shr(	$t,		16); +	&mov(	$ks,		&DWP("0x300+$desSP",$tmp2,"",0)); +	&xor(	$L,		$ks); +	&mov(	$ks,		&DWP(24,"esp","",0)); #### +	&movb(	&LB($tmp2),	&HB($t)	); +	&and(	$u,		"0xff"	); +	&and(	$t,		"0xff"	); +	&mov(	$tmp1,		&DWP("0x600+$desSP",$tmp1,"",0)); +	&xor(	$L,		$tmp1); +	&mov(	$tmp1,		&DWP("0x700+$desSP",$tmp2,"",0)); +	&xor(	$L,		$tmp1); +	&mov(	$tmp1,		&DWP("0x400+$desSP",$u,"",0)); +	&xor(	$L,		$tmp1); +	&mov(	$tmp1,		&DWP("0x500+$desSP",$t,"",0)); +	&xor(	$L,		$tmp1); +	} + +sub n2a +	{ +	sprintf("%d",$_[0]); +	} + +# now has a side affect of rotating $a by $shift +sub R_PERM_OP +	{ +	local($a,$b,$tt,$shift,$mask,$last)=@_; + +	&rotl(	$a,		$shift		) if ($shift != 0); +	&mov(	$tt,		$a		); +	&xor(	$a,		$b		); +	&and(	$a,		$mask		); +	if ($notlast eq $b) +		{ +		&xor(	$b,		$a		); +		&xor(	$tt,		$a		); +		} +	else +		{ +		&xor(	$tt,		$a		); +		&xor(	$b,		$a		); +		} +	&comment(""); +	} + +sub IP_new +	{ +	local($l,$r,$tt,$lr)=@_; + +	&R_PERM_OP($l,$r,$tt, 4,"0xf0f0f0f0",$l); +	&R_PERM_OP($r,$tt,$l,20,"0xfff0000f",$l); +	&R_PERM_OP($l,$tt,$r,14,"0x33333333",$r); +	&R_PERM_OP($tt,$r,$l,22,"0x03fc03fc",$r); +	&R_PERM_OP($l,$r,$tt, 9,"0xaaaaaaaa",$r); +	 +	if ($lr != 3) +		{ +		if (($lr-3) < 0) +			{ &rotr($tt,	3-$lr); } +		else	{ &rotl($tt,	$lr-3); } +		} +	if ($lr != 2) +		{ +		if (($lr-2) < 0) +			{ &rotr($r,	2-$lr); } +		else	{ &rotl($r,	$lr-2); } +		} +	} + +sub FP_new +	{ +	local($l,$r,$tt,$lr)=@_; + +	if ($lr != 2) +		{ +		if (($lr-2) < 0) +			{ &rotl($r,	2-$lr); } +		else	{ &rotr($r,	$lr-2); } +		} +	if ($lr != 3) +		{ +		if (($lr-3) < 0) +			{ &rotl($l,	3-$lr); } +		else	{ &rotr($l,	$lr-3); } +		} + +	&R_PERM_OP($l,$r,$tt, 0,"0xaaaaaaaa",$r); +	&R_PERM_OP($tt,$r,$l,23,"0x03fc03fc",$r); +	&R_PERM_OP($l,$r,$tt,10,"0x33333333",$l); +	&R_PERM_OP($r,$tt,$l,18,"0xfff0000f",$l); +	&R_PERM_OP($l,$tt,$r,12,"0xf0f0f0f0",$r); +	&rotr($tt	, 4); +	} + diff --git a/crypto/libdes/asm/des586.pl b/crypto/libdes/asm/des586.pl new file mode 100644 index 000000000000..c2bee84b70c9 --- /dev/null +++ b/crypto/libdes/asm/des586.pl @@ -0,0 +1,210 @@ +#!/usr/local/bin/perl + +$prog="des586.pl"; + +# base code is in microsft +# op dest, source +# format. +# + +# WILL NOT WORK ANYMORE WITH desboth.pl +require "desboth.pl"; + +if (	($ARGV[0] eq "elf")) +	{ require "x86unix.pl"; } +elsif (	($ARGV[0] eq "a.out")) +	{ $aout=1; require "x86unix.pl"; } +elsif (	($ARGV[0] eq "sol")) +	{ $sol=1; require "x86unix.pl"; } +elsif (	($ARGV[0] eq "cpp")) +	{ $cpp=1; require "x86unix.pl"; } +elsif (	($ARGV[0] eq "win32")) +	{ require "x86ms.pl"; } +else +	{ +	print STDERR <<"EOF"; +Pick one target type from +	elf	- linux, FreeBSD etc +	a.out	- old linux +	sol	- x86 solaris +	cpp	- format so x86unix.cpp can be used +	win32	- Windows 95/Windows NT +EOF +	exit(1); +	} + +&comment("Don't even think of reading this code"); +&comment("It was automatically generated by $prog"); +&comment("Which is a perl program used to generate the x86 assember for"); +&comment("any of elf, a.out, Win32, or Solaris"); +&comment("It can be found in SSLeay 0.6.5+ or in libdes 3.26+"); +&comment("eric <eay\@mincom.oz.au>"); +&comment(""); + +&file("dx86xxxx"); + +$L="edi"; +$R="esi"; + +&des_encrypt("des_encrypt",1); +&des_encrypt("des_encrypt2",0); + +&des_encrypt3("des_encrypt3",1); +&des_encrypt3("des_decrypt3",0); + +&file_end(); + +sub des_encrypt +	{ +	local($name,$do_ip)=@_; + +	&function_begin($name,3); + +	&comment(""); +	&comment("Load the 2 words"); +	&mov("eax",&wparam(0)); +	&mov($R,&DWP(0,"eax","",0)); +	&mov($L,&DWP(4,"eax","",0)); + +	if ($do_ip) +		{ +		&comment(""); +		&comment("IP"); +		&IP($R,$L,"eax"); +		} + +	&comment(""); +	&comment("fixup rotate"); +	&rotl($R,3); +	&rotl($L,3); + +	&comment(""); +	&comment("load counter, key_schedule and enc flag"); + +	# encrypting part + +	$ks="ebp"; +	&xor(	"ebx",		"ebx"		); +	&mov("eax",&wparam(2));	# get encrypt flag +	&xor(	"ecx",		"ecx"		); +	&cmp("eax","0"); +	&mov(	$ks,		&wparam(1)	); +	&je(&label("start_decrypt")); + +	for ($i=0; $i<16; $i+=2) +		{ +		&comment(""); +		&comment("Round $i"); +		&D_ENCRYPT($i,$L,$R,$i*2,$ks,"des_SPtrans","eax","ebx","ecx","edx"); + +		&comment(""); +		&comment("Round ".sprintf("%d",$i+1)); +		&D_ENCRYPT($i+1,$R,$L,($i+1)*2,$ks,"des_SPtrans","eax","ebx","ecx","edx"); +		} +	&jmp(&label("end")); + +	&set_label("start_decrypt"); + +	for ($i=15; $i>0; $i-=2) +		{ +		&comment(""); +		&comment("Round $i"); +		&D_ENCRYPT(15-$i,$L,$R,$i*2,$ks,"des_SPtrans","eax","ebx","ecx","edx"); +		&comment(""); +		&comment("Round ".sprintf("%d",$i-1)); +		&D_ENCRYPT(15-$i+1,$R,$L,($i-1)*2,$ks,"des_SPtrans","eax","ebx","ecx","edx"); +		} + +	&set_label("end"); + +	&comment(""); +	&comment("Fixup"); +	&rotr($L,3);		# r +	&rotr($R,3);		# l + +	if ($do_ip) +		{ +		&comment(""); +		&comment("FP"); +		&FP($R,$L,"eax"); +		} + +	&mov("eax",&wparam(0)); +	&mov(&DWP(0,"eax","",0),$L); +	&mov(&DWP(4,"eax","",0),$R); + +	&function_end($name); +	} + +sub D_ENCRYPT +	{ +	local($r,$L,$R,$S,$ks,$desSP,$u,$tmp1,$tmp2,$t)=@_; + +	 &mov(	$t,		&DWP(&n2a(($S+1)*4),$ks,"",0)); +	&mov(	$u,		&DWP(&n2a($S*4),$ks,"",0)); +	 &xor(	$t,		$R); +	&xor(	$u,		$R); +	 &rotr(	$t,		4		); +	&and(	$u,		"0xfcfcfcfc"	); +	 &and(	$t,		"0xfcfcfcfc"	); +	&movb(	&LB($tmp1),	&LB($u)	); +	&movb(	&LB($tmp2),	&HB($u)	); +	&xor(	$L,		&DWP("      $desSP",$tmp1,"",0)); +	&shr(	$u,		16); +	&xor(	$L,		&DWP("0x200+$desSP",$tmp2,"",0)); +	&movb(	&LB($tmp1),	&LB($u)	); +	&movb(	&LB($tmp2),	&HB($u)	); +	&xor(	$L,		&DWP("0x400+$desSP",$tmp1,"",0)); +	&mov(	$u,		&DWP("0x600+$desSP",$tmp2,"",0)); + +	 &movb(	&LB($tmp1),	&LB($t)	); +	 &movb(	&LB($tmp2),	&HB($t)	); +	 &xor(	$L,		&DWP("0x100+$desSP",$tmp1,"",0)); +	 &shr(	$t,		16); +	 &xor(	$u,		&DWP("0x300+$desSP",$tmp2,"",0)); +	 &movb(	&LB($tmp1),	&LB($t)	); +	 &movb(	&LB($tmp2),	&HB($t)	); +	 &xor(	$L,		&DWP("0x500+$desSP",$tmp1,"",0)); +	 &xor(	$u,		&DWP("0x700+$desSP",$tmp2,"",0)); +	 &xor(  $L,	$u); +	} + +sub PERM_OP +	{ +	local($a,$b,$tt,$shift,$mask)=@_; + +	&mov(	$tt,		$a		); +	&shr(	$tt,		$shift		); +	&xor(	$tt,		$b		); +	&and(	$tt,		$mask		); +	&xor(	$b,		$tt		); +	&shl(	$tt,		$shift		); +	&xor(	$a,		$tt		); +	} + +sub IP +	{ +	local($l,$r,$tt)=@_; + +	&PERM_OP($r,$l,$tt, 4,"0x0f0f0f0f"); +	&PERM_OP($l,$r,$tt,16,"0x0000ffff"); +	&PERM_OP($r,$l,$tt, 2,"0x33333333"); +	&PERM_OP($l,$r,$tt, 8,"0x00ff00ff"); +	&PERM_OP($r,$l,$tt, 1,"0x55555555"); +	} + +sub FP +	{ +	local($l,$r,$tt)=@_; + +	&PERM_OP($l,$r,$tt, 1,"0x55555555"); +        &PERM_OP($r,$l,$tt, 8,"0x00ff00ff"); +        &PERM_OP($l,$r,$tt, 2,"0x33333333"); +        &PERM_OP($r,$l,$tt,16,"0x0000ffff"); +        &PERM_OP($l,$r,$tt, 4,"0x0f0f0f0f"); +	} + +sub n2a +	{ +	sprintf("%d",$_[0]); +	} diff --git a/crypto/libdes/asm/des686.pl b/crypto/libdes/asm/des686.pl new file mode 100644 index 000000000000..eda500312bdb --- /dev/null +++ b/crypto/libdes/asm/des686.pl @@ -0,0 +1,230 @@ +#!/usr/local/bin/perl + +$prog="des686.pl"; + +# base code is in microsft +# op dest, source +# format. +# + +# WILL NOT WORK ANYMORE WITH desboth.pl +require "desboth.pl"; + +if (	($ARGV[0] eq "elf")) +	{ require "x86unix.pl"; } +elsif (	($ARGV[0] eq "a.out")) +	{ $aout=1; require "x86unix.pl"; } +elsif (	($ARGV[0] eq "sol")) +	{ $sol=1; require "x86unix.pl"; } +elsif ( ($ARGV[0] eq "cpp")) +	{ $cpp=1; require "x86unix.pl"; } +elsif (	($ARGV[0] eq "win32")) +	{ require "x86ms.pl"; } +else +	{ +	print STDERR <<"EOF"; +Pick one target type from +	elf	- linux, FreeBSD etc +	a.out	- old linux +	sol	- x86 solaris +	cpp	- format so x86unix.cpp can be used +	win32	- Windows 95/Windows NT +EOF +	exit(1); +	} + +&comment("Don't even think of reading this code"); +&comment("It was automatically generated by $prog"); +&comment("Which is a perl program used to generate the x86 assember for"); +&comment("any of elf, a.out, Win32, or Solaris"); +&comment("It can be found in SSLeay 0.6.5+ or in libdes 3.26+"); +&comment("eric <eay\@mincom.oz.au>"); +&comment(""); + +&file("dx86xxxx"); + +$L="edi"; +$R="esi"; + +&des_encrypt("des_encrypt",1); +&des_encrypt("des_encrypt2",0); + +&des_encrypt3("des_encrypt3",1); +&des_encrypt3("des_decrypt3",0); + +&file_end(); + +sub des_encrypt +	{ +	local($name,$do_ip)=@_; + +	&function_begin($name,3); + +	&comment(""); +	&comment("Load the 2 words"); +	&mov("eax",&wparam(0)); +	&mov($L,&DWP(0,"eax","",0)); +	&mov($R,&DWP(4,"eax","",0)); + +	$ksp=&wparam(1); + +	if ($do_ip) +		{ +		&comment(""); +		&comment("IP"); +		&IP($L,$R,"eax"); +		} + +	&comment(""); +	&comment("fixup rotate"); +	&rotl($R,3); +	&rotl($L,3); +	&exch($L,$R); + +	&comment(""); +	&comment("load counter, key_schedule and enc flag"); +	&mov("eax",&wparam(2));	# get encrypt flag +	&mov("ebp",&wparam(1));	# get ks +	&cmp("eax","0"); +	&je(&label("start_decrypt")); + +	# encrypting part + +	for ($i=0; $i<16; $i+=2) +		{ +		&comment(""); +		&comment("Round $i"); +		&D_ENCRYPT($L,$R,$i*2,"ebp","des_SPtrans","ecx","edx","eax","ebx"); + +		&comment(""); +		&comment("Round ".sprintf("%d",$i+1)); +		&D_ENCRYPT($R,$L,($i+1)*2,"ebp","des_SPtrans","ecx","edx","eax","ebx"); +		} +	&jmp(&label("end")); + +	&set_label("start_decrypt"); + +	for ($i=15; $i>0; $i-=2) +		{ +		&comment(""); +		&comment("Round $i"); +		&D_ENCRYPT($L,$R,$i*2,"ebp","des_SPtrans","ecx","edx","eax","ebx"); +		&comment(""); +		&comment("Round ".sprintf("%d",$i-1)); +		&D_ENCRYPT($R,$L,($i-1)*2,"ebp","des_SPtrans","ecx","edx","eax","ebx"); +		} + +	&set_label("end"); + +	&comment(""); +	&comment("Fixup"); +	&rotr($L,3);		# r +	&rotr($R,3);		# l + +	if ($do_ip) +		{ +		&comment(""); +		&comment("FP"); +		&FP($R,$L,"eax"); +		} + +	&mov("eax",&wparam(0)); +	&mov(&DWP(0,"eax","",0),$L); +	&mov(&DWP(4,"eax","",0),$R); + +	&function_end($name); +	} + + +# The logic is to load R into 2 registers and operate on both at the same time. +# We also load the 2 R's into 2 more registers so we can do the 'move word down a byte' +# while also masking the other copy and doing a lookup.  We then also accumulate the +# L value in 2 registers then combine them at the end. +sub D_ENCRYPT +	{ +	local($L,$R,$S,$ks,$desSP,$u,$t,$tmp1,$tmp2,$tmp3)=@_; + +	&mov(	$u,		&DWP(&n2a($S*4),$ks,"",0)); +	&mov(	$t,		&DWP(&n2a(($S+1)*4),$ks,"",0)); +	&xor(	$u,		$R		); +	&xor(	$t,		$R		); +	&rotr(	$t,		4		); + +	# the numbers at the end of the line are origional instruction order +	&mov(	$tmp2,		$u		);			# 1 2 +	&mov(	$tmp1,		$t		);			# 1 1 +	&and(	$tmp2,		"0xfc"		);			# 1 4 +	&and(	$tmp1,		"0xfc"		);			# 1 3 +	&shr(	$t,		8		);			# 1 5 +	&xor(	$L,		&DWP("0x100+$desSP",$tmp1,"",0));	# 1 7 +	&shr(	$u,		8		);			# 1 6 +	&mov(	$tmp1,		&DWP("      $desSP",$tmp2,"",0));	# 1 8 + +	&mov(	$tmp2,		$u		);			# 2 2 +	&xor(	$L,		$tmp1		);			# 1 9 +	&and(	$tmp2,		"0xfc"		);			# 2 4 +	&mov(	$tmp1,		$t		);			# 2 1 +	&and(	$tmp1,		"0xfc"		);			# 2 3 +	&shr(	$t,		8		);			# 2 5 +	&xor(	$L,		&DWP("0x300+$desSP",$tmp1,"",0));	# 2 7 +	&shr(	$u,		8		);			# 2 6 +	&mov(	$tmp1,		&DWP("0x200+$desSP",$tmp2,"",0));	# 2 8 +	&mov(	$tmp2,		$u		);			# 3 2 + +	&xor(	$L,		$tmp1		);			# 2 9 +	&and(	$tmp2,		"0xfc"		);			# 3 4 + +	&mov(	$tmp1,		$t		);			# 3 1  +	&shr(	$u,		8		);			# 3 6 +	&and(	$tmp1,		"0xfc"		);			# 3 3 +	&shr(	$t,		8		);			# 3 5 +	&xor(	$L,		&DWP("0x500+$desSP",$tmp1,"",0));	# 3 7 +	&mov(	$tmp1,		&DWP("0x400+$desSP",$tmp2,"",0));	# 3 8 + +	&and(	$t,		"0xfc"		);			# 4 1 +	&xor(	$L,		$tmp1		);			# 3 9 + +	&and(	$u,		"0xfc"		);			# 4 2 +	&xor(	$L,		&DWP("0x700+$desSP",$t,"",0));		# 4 3 +	&xor(	$L,		&DWP("0x600+$desSP",$u,"",0));		# 4 4 +	} + +sub PERM_OP +	{ +	local($a,$b,$tt,$shift,$mask)=@_; + +	&mov(	$tt,		$a		); +	&shr(	$tt,		$shift		); +	&xor(	$tt,		$b		); +	&and(	$tt,		$mask		); +	&xor(	$b,		$tt		); +	&shl(	$tt,		$shift		); +	&xor(	$a,		$tt		); +	} + +sub IP +	{ +	local($l,$r,$tt)=@_; + +	&PERM_OP($r,$l,$tt, 4,"0x0f0f0f0f"); +	&PERM_OP($l,$r,$tt,16,"0x0000ffff"); +	&PERM_OP($r,$l,$tt, 2,"0x33333333"); +	&PERM_OP($l,$r,$tt, 8,"0x00ff00ff"); +	&PERM_OP($r,$l,$tt, 1,"0x55555555"); +	} + +sub FP +	{ +	local($l,$r,$tt)=@_; + +	&PERM_OP($l,$r,$tt, 1,"0x55555555"); +        &PERM_OP($r,$l,$tt, 8,"0x00ff00ff"); +        &PERM_OP($l,$r,$tt, 2,"0x33333333"); +        &PERM_OP($r,$l,$tt,16,"0x0000ffff"); +        &PERM_OP($l,$r,$tt, 4,"0x0f0f0f0f"); +	} + +sub n2a +	{ +	sprintf("%d",$_[0]); +	} diff --git a/crypto/libdes/asm/desboth.pl b/crypto/libdes/asm/desboth.pl new file mode 100644 index 000000000000..125aec8f33b4 --- /dev/null +++ b/crypto/libdes/asm/desboth.pl @@ -0,0 +1,67 @@ +#!/usr/local/bin/perl + +$L="edi"; +$R="esi"; + +sub des_encrypt3 +	{ +	local($name,$enc)=@_; + +	&function_begin($name,4); + +	&comment(""); +	&comment("Load the data words"); +	&mov("ebx",&wparam(0)); +	&mov($L,&DWP(0,"ebx","",0)); +	&mov($R,&DWP(4,"ebx","",0)); + +	&comment(""); +	&comment("IP"); +	&IP_new($L,$R,"edx",0); + +	# put them back +	 +	if ($enc) +		{ +		&mov(&DWP(4,"ebx","",0),$R); +		 &mov("eax",&wparam(1)); +		&mov(&DWP(0,"ebx","",0),"edx"); +		 &mov("edi",&wparam(2)); +		 &mov("esi",&wparam(3)); +		} +	else +		{ +		&mov(&DWP(4,"ebx","",0),$R); +		 &mov("esi",&wparam(1)); +		&mov(&DWP(0,"ebx","",0),"edx"); +		 &mov("edi",&wparam(2)); +		 &mov("eax",&wparam(3)); +		} +	&push(($enc)?"1":"0"); +	&push("eax"); +	&push("ebx"); +	&call("des_encrypt2"); +	&push(($enc)?"0":"1"); +	&push("edi"); +	&push("ebx"); +	&call("des_encrypt2"); +	&push(($enc)?"1":"0"); +	&push("esi"); +	&push("ebx"); +	&call("des_encrypt2"); + +	&mov($L,&DWP(0,"ebx","",0)); +	&add("esp",36); +	&mov($R,&DWP(4,"ebx","",0)); + +	&comment(""); +	&comment("FP"); +	&FP_new($L,$R,"eax",0); + +	&mov(&DWP(0,"ebx","",0),"eax"); +	&mov(&DWP(4,"ebx","",0),$R); + +	&function_end($name); +	} + + diff --git a/crypto/libdes/asm/dx86-cpp.s b/crypto/libdes/asm/dx86-cpp.s new file mode 100644 index 000000000000..27d6ceea2762 --- /dev/null +++ b/crypto/libdes/asm/dx86-cpp.s @@ -0,0 +1,2780 @@ +	/* Don't even think of reading this code */ +	/* It was automatically generated by des-som2.pl */ +	/* Which is a perl program used to generate the x86 assember for */ +	/* any of elf, a.out, Win32, or Solaris */ +	/* It can be found in SSLeay 0.6.5+ or in libdes 3.26+ */ +	/* eric <eay@mincom.oz.au> */ +	/* The inner loop instruction sequence and the IP/FP modifications */ +	/* are from Svend Olaf Mikkelsen <svolaf@inet.uni-c.dk> */ + +	.file	"dx86xxxx.s" +	.version	"01.01" +gcc2_compiled.: +.text +	.align ALIGN +.globl des_encrypt +	TYPE(des_encrypt,@function) +des_encrypt: +	pushl	%ebp +	pushl	%ebx +	pushl	%esi +	pushl	%edi + + +	/* Load the 2 words */ +	movl	20(%esp),	%esi +	xorl	%ecx,		%ecx +	movl	(%esi),		%eax +	movl	28(%esp),	%ebx +	movl	4(%esi),	%edi + +	/* IP */ +	roll	$4,		%eax +	movl	%eax,		%esi +	xorl	%edi,		%eax +	andl	$0xf0f0f0f0,	%eax +	xorl	%eax,		%esi +	xorl	%eax,		%edi + +	roll	$20,		%edi +	movl	%edi,		%eax +	xorl	%esi,		%edi +	andl	$0xfff0000f,	%edi +	xorl	%edi,		%eax +	xorl	%edi,		%esi + +	roll	$14,		%eax +	movl	%eax,		%edi +	xorl	%esi,		%eax +	andl	$0x33333333,	%eax +	xorl	%eax,		%edi +	xorl	%eax,		%esi + +	roll	$22,		%esi +	movl	%esi,		%eax +	xorl	%edi,		%esi +	andl	$0x03fc03fc,	%esi +	xorl	%esi,		%eax +	xorl	%esi,		%edi + +	roll	$9,		%eax +	movl	%eax,		%esi +	xorl	%edi,		%eax +	andl	$0xaaaaaaaa,	%eax +	xorl	%eax,		%esi +	xorl	%eax,		%edi + +	roll	$1,		%edi +	cmpl	$0,		%ebx +	movl	24(%esp),	%ebp +	je	.L000start_decrypt + +	/* Round 0 */ +	movl	(%ebp),		%eax +	xorl	%ebx,		%ebx +	movl	4(%ebp),	%edx +	xorl	%esi,		%eax +	xorl	%esi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%edi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%edi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%edi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%edi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%edi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%edi + +	/* Round 1 */ +	movl	8(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	12(%ebp),	%edx +	xorl	%edi,		%eax +	xorl	%edi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%esi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%esi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%esi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%esi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%esi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%esi + +	/* Round 2 */ +	movl	16(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	20(%ebp),	%edx +	xorl	%esi,		%eax +	xorl	%esi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%edi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%edi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%edi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%edi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%edi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%edi + +	/* Round 3 */ +	movl	24(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	28(%ebp),	%edx +	xorl	%edi,		%eax +	xorl	%edi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%esi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%esi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%esi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%esi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%esi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%esi + +	/* Round 4 */ +	movl	32(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	36(%ebp),	%edx +	xorl	%esi,		%eax +	xorl	%esi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%edi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%edi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%edi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%edi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%edi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%edi + +	/* Round 5 */ +	movl	40(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	44(%ebp),	%edx +	xorl	%edi,		%eax +	xorl	%edi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%esi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%esi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%esi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%esi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%esi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%esi + +	/* Round 6 */ +	movl	48(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	52(%ebp),	%edx +	xorl	%esi,		%eax +	xorl	%esi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%edi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%edi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%edi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%edi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%edi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%edi + +	/* Round 7 */ +	movl	56(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	60(%ebp),	%edx +	xorl	%edi,		%eax +	xorl	%edi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%esi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%esi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%esi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%esi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%esi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%esi + +	/* Round 8 */ +	movl	64(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	68(%ebp),	%edx +	xorl	%esi,		%eax +	xorl	%esi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%edi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%edi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%edi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%edi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%edi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%edi + +	/* Round 9 */ +	movl	72(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	76(%ebp),	%edx +	xorl	%edi,		%eax +	xorl	%edi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%esi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%esi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%esi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%esi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%esi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%esi + +	/* Round 10 */ +	movl	80(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	84(%ebp),	%edx +	xorl	%esi,		%eax +	xorl	%esi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%edi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%edi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%edi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%edi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%edi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%edi + +	/* Round 11 */ +	movl	88(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	92(%ebp),	%edx +	xorl	%edi,		%eax +	xorl	%edi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%esi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%esi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%esi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%esi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%esi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%esi + +	/* Round 12 */ +	movl	96(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	100(%ebp),	%edx +	xorl	%esi,		%eax +	xorl	%esi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%edi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%edi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%edi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%edi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%edi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%edi + +	/* Round 13 */ +	movl	104(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	108(%ebp),	%edx +	xorl	%edi,		%eax +	xorl	%edi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%esi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%esi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%esi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%esi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%esi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%esi + +	/* Round 14 */ +	movl	112(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	116(%ebp),	%edx +	xorl	%esi,		%eax +	xorl	%esi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%edi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%edi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%edi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%edi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%edi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%edi + +	/* Round 15 */ +	movl	120(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	124(%ebp),	%edx +	xorl	%edi,		%eax +	xorl	%edi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%esi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%esi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%esi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%esi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%esi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%esi +	jmp	.L001end +.align ALIGN +.L000start_decrypt: + +	/* Round 15 */ +	movl	120(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	124(%ebp),	%edx +	xorl	%esi,		%eax +	xorl	%esi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%edi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%edi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%edi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%edi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%edi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%edi + +	/* Round 14 */ +	movl	112(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	116(%ebp),	%edx +	xorl	%edi,		%eax +	xorl	%edi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%esi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%esi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%esi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%esi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%esi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%esi + +	/* Round 13 */ +	movl	104(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	108(%ebp),	%edx +	xorl	%esi,		%eax +	xorl	%esi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%edi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%edi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%edi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%edi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%edi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%edi + +	/* Round 12 */ +	movl	96(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	100(%ebp),	%edx +	xorl	%edi,		%eax +	xorl	%edi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%esi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%esi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%esi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%esi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%esi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%esi + +	/* Round 11 */ +	movl	88(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	92(%ebp),	%edx +	xorl	%esi,		%eax +	xorl	%esi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%edi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%edi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%edi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%edi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%edi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%edi + +	/* Round 10 */ +	movl	80(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	84(%ebp),	%edx +	xorl	%edi,		%eax +	xorl	%edi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%esi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%esi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%esi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%esi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%esi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%esi + +	/* Round 9 */ +	movl	72(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	76(%ebp),	%edx +	xorl	%esi,		%eax +	xorl	%esi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%edi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%edi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%edi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%edi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%edi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%edi + +	/* Round 8 */ +	movl	64(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	68(%ebp),	%edx +	xorl	%edi,		%eax +	xorl	%edi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%esi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%esi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%esi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%esi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%esi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%esi + +	/* Round 7 */ +	movl	56(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	60(%ebp),	%edx +	xorl	%esi,		%eax +	xorl	%esi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%edi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%edi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%edi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%edi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%edi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%edi + +	/* Round 6 */ +	movl	48(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	52(%ebp),	%edx +	xorl	%edi,		%eax +	xorl	%edi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%esi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%esi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%esi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%esi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%esi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%esi + +	/* Round 5 */ +	movl	40(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	44(%ebp),	%edx +	xorl	%esi,		%eax +	xorl	%esi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%edi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%edi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%edi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%edi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%edi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%edi + +	/* Round 4 */ +	movl	32(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	36(%ebp),	%edx +	xorl	%edi,		%eax +	xorl	%edi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%esi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%esi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%esi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%esi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%esi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%esi + +	/* Round 3 */ +	movl	24(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	28(%ebp),	%edx +	xorl	%esi,		%eax +	xorl	%esi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%edi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%edi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%edi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%edi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%edi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%edi + +	/* Round 2 */ +	movl	16(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	20(%ebp),	%edx +	xorl	%edi,		%eax +	xorl	%edi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%esi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%esi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%esi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%esi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%esi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%esi + +	/* Round 1 */ +	movl	8(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	12(%ebp),	%edx +	xorl	%esi,		%eax +	xorl	%esi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%edi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%edi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%edi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%edi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%edi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%edi + +	/* Round 0 */ +	movl	(%ebp),		%eax +	xorl	%ebx,		%ebx +	movl	4(%ebp),	%edx +	xorl	%edi,		%eax +	xorl	%edi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%esi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%esi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%esi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%esi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%esi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%esi +.align ALIGN +.L001end: + +	/* FP */ +	movl	20(%esp),	%edx +	rorl	$1,		%esi +	movl	%edi,		%eax +	xorl	%esi,		%edi +	andl	$0xaaaaaaaa,	%edi +	xorl	%edi,		%eax +	xorl	%edi,		%esi + +	roll	$23,		%eax +	movl	%eax,		%edi +	xorl	%esi,		%eax +	andl	$0x03fc03fc,	%eax +	xorl	%eax,		%edi +	xorl	%eax,		%esi + +	roll	$10,		%edi +	movl	%edi,		%eax +	xorl	%esi,		%edi +	andl	$0x33333333,	%edi +	xorl	%edi,		%eax +	xorl	%edi,		%esi + +	roll	$18,		%esi +	movl	%esi,		%edi +	xorl	%eax,		%esi +	andl	$0xfff0000f,	%esi +	xorl	%esi,		%edi +	xorl	%esi,		%eax + +	roll	$12,		%edi +	movl	%edi,		%esi +	xorl	%eax,		%edi +	andl	$0xf0f0f0f0,	%edi +	xorl	%edi,		%esi +	xorl	%edi,		%eax + +	rorl	$4,		%eax +	movl	%eax,		(%edx) +	movl	%esi,		4(%edx) +	popl	%edi +	popl	%esi +	popl	%ebx +	popl	%ebp +	ret +.des_encrypt_end: +	SIZE(des_encrypt,.des_encrypt_end-des_encrypt) +.ident	"desasm.pl" +.text +	.align ALIGN +.globl des_encrypt2 +	TYPE(des_encrypt2,@function) +des_encrypt2: +	pushl	%ebp +	pushl	%ebx +	pushl	%esi +	pushl	%edi + + +	/* Load the 2 words */ +	movl	20(%esp),	%eax +	xorl	%ecx,		%ecx +	movl	(%eax),		%esi +	movl	28(%esp),	%ebx +	roll	$3,		%esi +	movl	4(%eax),	%edi +	roll	$3,		%edi +	cmpl	$0,		%ebx +	movl	24(%esp),	%ebp +	je	.L002start_decrypt + +	/* Round 0 */ +	movl	(%ebp),		%eax +	xorl	%ebx,		%ebx +	movl	4(%ebp),	%edx +	xorl	%esi,		%eax +	xorl	%esi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%edi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%edi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%edi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%edi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%edi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%edi + +	/* Round 1 */ +	movl	8(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	12(%ebp),	%edx +	xorl	%edi,		%eax +	xorl	%edi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%esi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%esi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%esi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%esi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%esi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%esi + +	/* Round 2 */ +	movl	16(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	20(%ebp),	%edx +	xorl	%esi,		%eax +	xorl	%esi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%edi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%edi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%edi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%edi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%edi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%edi + +	/* Round 3 */ +	movl	24(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	28(%ebp),	%edx +	xorl	%edi,		%eax +	xorl	%edi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%esi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%esi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%esi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%esi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%esi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%esi + +	/* Round 4 */ +	movl	32(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	36(%ebp),	%edx +	xorl	%esi,		%eax +	xorl	%esi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%edi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%edi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%edi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%edi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%edi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%edi + +	/* Round 5 */ +	movl	40(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	44(%ebp),	%edx +	xorl	%edi,		%eax +	xorl	%edi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%esi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%esi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%esi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%esi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%esi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%esi + +	/* Round 6 */ +	movl	48(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	52(%ebp),	%edx +	xorl	%esi,		%eax +	xorl	%esi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%edi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%edi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%edi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%edi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%edi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%edi + +	/* Round 7 */ +	movl	56(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	60(%ebp),	%edx +	xorl	%edi,		%eax +	xorl	%edi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%esi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%esi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%esi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%esi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%esi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%esi + +	/* Round 8 */ +	movl	64(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	68(%ebp),	%edx +	xorl	%esi,		%eax +	xorl	%esi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%edi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%edi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%edi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%edi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%edi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%edi + +	/* Round 9 */ +	movl	72(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	76(%ebp),	%edx +	xorl	%edi,		%eax +	xorl	%edi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%esi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%esi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%esi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%esi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%esi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%esi + +	/* Round 10 */ +	movl	80(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	84(%ebp),	%edx +	xorl	%esi,		%eax +	xorl	%esi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%edi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%edi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%edi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%edi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%edi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%edi + +	/* Round 11 */ +	movl	88(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	92(%ebp),	%edx +	xorl	%edi,		%eax +	xorl	%edi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%esi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%esi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%esi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%esi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%esi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%esi + +	/* Round 12 */ +	movl	96(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	100(%ebp),	%edx +	xorl	%esi,		%eax +	xorl	%esi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%edi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%edi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%edi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%edi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%edi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%edi + +	/* Round 13 */ +	movl	104(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	108(%ebp),	%edx +	xorl	%edi,		%eax +	xorl	%edi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%esi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%esi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%esi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%esi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%esi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%esi + +	/* Round 14 */ +	movl	112(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	116(%ebp),	%edx +	xorl	%esi,		%eax +	xorl	%esi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%edi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%edi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%edi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%edi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%edi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%edi + +	/* Round 15 */ +	movl	120(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	124(%ebp),	%edx +	xorl	%edi,		%eax +	xorl	%edi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%esi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%esi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%esi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%esi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%esi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%esi +	jmp	.L003end +.align ALIGN +.L002start_decrypt: + +	/* Round 15 */ +	movl	120(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	124(%ebp),	%edx +	xorl	%esi,		%eax +	xorl	%esi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%edi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%edi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%edi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%edi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%edi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%edi + +	/* Round 14 */ +	movl	112(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	116(%ebp),	%edx +	xorl	%edi,		%eax +	xorl	%edi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%esi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%esi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%esi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%esi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%esi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%esi + +	/* Round 13 */ +	movl	104(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	108(%ebp),	%edx +	xorl	%esi,		%eax +	xorl	%esi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%edi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%edi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%edi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%edi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%edi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%edi + +	/* Round 12 */ +	movl	96(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	100(%ebp),	%edx +	xorl	%edi,		%eax +	xorl	%edi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%esi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%esi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%esi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%esi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%esi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%esi + +	/* Round 11 */ +	movl	88(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	92(%ebp),	%edx +	xorl	%esi,		%eax +	xorl	%esi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%edi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%edi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%edi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%edi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%edi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%edi + +	/* Round 10 */ +	movl	80(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	84(%ebp),	%edx +	xorl	%edi,		%eax +	xorl	%edi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%esi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%esi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%esi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%esi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%esi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%esi + +	/* Round 9 */ +	movl	72(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	76(%ebp),	%edx +	xorl	%esi,		%eax +	xorl	%esi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%edi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%edi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%edi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%edi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%edi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%edi + +	/* Round 8 */ +	movl	64(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	68(%ebp),	%edx +	xorl	%edi,		%eax +	xorl	%edi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%esi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%esi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%esi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%esi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%esi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%esi + +	/* Round 7 */ +	movl	56(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	60(%ebp),	%edx +	xorl	%esi,		%eax +	xorl	%esi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%edi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%edi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%edi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%edi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%edi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%edi + +	/* Round 6 */ +	movl	48(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	52(%ebp),	%edx +	xorl	%edi,		%eax +	xorl	%edi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%esi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%esi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%esi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%esi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%esi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%esi + +	/* Round 5 */ +	movl	40(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	44(%ebp),	%edx +	xorl	%esi,		%eax +	xorl	%esi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%edi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%edi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%edi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%edi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%edi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%edi + +	/* Round 4 */ +	movl	32(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	36(%ebp),	%edx +	xorl	%edi,		%eax +	xorl	%edi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%esi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%esi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%esi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%esi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%esi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%esi + +	/* Round 3 */ +	movl	24(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	28(%ebp),	%edx +	xorl	%esi,		%eax +	xorl	%esi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%edi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%edi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%edi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%edi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%edi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%edi + +	/* Round 2 */ +	movl	16(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	20(%ebp),	%edx +	xorl	%edi,		%eax +	xorl	%edi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%esi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%esi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%esi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%esi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%esi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%esi + +	/* Round 1 */ +	movl	8(%ebp),	%eax +	xorl	%ebx,		%ebx +	movl	12(%ebp),	%edx +	xorl	%esi,		%eax +	xorl	%esi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%edi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%edi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%edi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%edi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%edi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%edi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%edi + +	/* Round 0 */ +	movl	(%ebp),		%eax +	xorl	%ebx,		%ebx +	movl	4(%ebp),	%edx +	xorl	%edi,		%eax +	xorl	%edi,		%edx +	andl	$0xfcfcfcfc,	%eax +	andl	$0xcfcfcfcf,	%edx +	movb	%al,		%bl +	movb	%ah,		%cl +	rorl	$4,		%edx +	movl	      des_SPtrans(%ebx),%ebp +	movb	%dl,		%bl +	xorl	%ebp,		%esi +	movl	0x200+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movb	%dh,		%cl +	shrl	$16,		%eax +	movl	0x100+des_SPtrans(%ebx),%ebp +	xorl	%ebp,		%esi +	movb	%ah,		%bl +	shrl	$16,		%edx +	movl	0x300+des_SPtrans(%ecx),%ebp +	xorl	%ebp,		%esi +	movl	24(%esp),	%ebp +	movb	%dh,		%cl +	andl	$0xff,		%eax +	andl	$0xff,		%edx +	movl	0x600+des_SPtrans(%ebx),%ebx +	xorl	%ebx,		%esi +	movl	0x700+des_SPtrans(%ecx),%ebx +	xorl	%ebx,		%esi +	movl	0x400+des_SPtrans(%eax),%ebx +	xorl	%ebx,		%esi +	movl	0x500+des_SPtrans(%edx),%ebx +	xorl	%ebx,		%esi +.align ALIGN +.L003end: + +	/* Fixup */ +	rorl	$3,		%edi +	movl	20(%esp),	%eax +	rorl	$3,		%esi +	movl	%edi,		(%eax) +	movl	%esi,		4(%eax) +	popl	%edi +	popl	%esi +	popl	%ebx +	popl	%ebp +	ret +.des_encrypt2_end: +	SIZE(des_encrypt2,.des_encrypt2_end-des_encrypt2) +.ident	"desasm.pl" +.text +	.align ALIGN +.globl des_encrypt3 +	TYPE(des_encrypt3,@function) +des_encrypt3: +	pushl	%ebp +	pushl	%ebx +	pushl	%esi +	pushl	%edi + + +	/* Load the data words */ +	movl	20(%esp),	%ebx +	movl	(%ebx),		%edi +	movl	4(%ebx),	%esi + +	/* IP */ +	roll	$4,		%edi +	movl	%edi,		%edx +	xorl	%esi,		%edi +	andl	$0xf0f0f0f0,	%edi +	xorl	%edi,		%edx +	xorl	%edi,		%esi + +	roll	$20,		%esi +	movl	%esi,		%edi +	xorl	%edx,		%esi +	andl	$0xfff0000f,	%esi +	xorl	%esi,		%edi +	xorl	%esi,		%edx + +	roll	$14,		%edi +	movl	%edi,		%esi +	xorl	%edx,		%edi +	andl	$0x33333333,	%edi +	xorl	%edi,		%esi +	xorl	%edi,		%edx + +	roll	$22,		%edx +	movl	%edx,		%edi +	xorl	%esi,		%edx +	andl	$0x03fc03fc,	%edx +	xorl	%edx,		%edi +	xorl	%edx,		%esi + +	roll	$9,		%edi +	movl	%edi,		%edx +	xorl	%esi,		%edi +	andl	$0xaaaaaaaa,	%edi +	xorl	%edi,		%edx +	xorl	%edi,		%esi + +	rorl	$3,		%edx +	rorl	$2,		%esi +	movl	%esi,		4(%ebx) +	movl	24(%esp),	%eax +	movl	%edx,		(%ebx) +	movl	28(%esp),	%edi +	movl	32(%esp),	%esi +	pushl	$1 +	pushl	%eax +	pushl	%ebx +	call	des_encrypt2 +	pushl	$0 +	pushl	%edi +	pushl	%ebx +	call	des_encrypt2 +	pushl	$1 +	pushl	%esi +	pushl	%ebx +	call	des_encrypt2 +	movl	(%ebx),		%edi +	addl	$36,		%esp +	movl	4(%ebx),	%esi + +	/* FP */ +	roll	$2,		%esi +	roll	$3,		%edi +	movl	%edi,		%eax +	xorl	%esi,		%edi +	andl	$0xaaaaaaaa,	%edi +	xorl	%edi,		%eax +	xorl	%edi,		%esi + +	roll	$23,		%eax +	movl	%eax,		%edi +	xorl	%esi,		%eax +	andl	$0x03fc03fc,	%eax +	xorl	%eax,		%edi +	xorl	%eax,		%esi + +	roll	$10,		%edi +	movl	%edi,		%eax +	xorl	%esi,		%edi +	andl	$0x33333333,	%edi +	xorl	%edi,		%eax +	xorl	%edi,		%esi + +	roll	$18,		%esi +	movl	%esi,		%edi +	xorl	%eax,		%esi +	andl	$0xfff0000f,	%esi +	xorl	%esi,		%edi +	xorl	%esi,		%eax + +	roll	$12,		%edi +	movl	%edi,		%esi +	xorl	%eax,		%edi +	andl	$0xf0f0f0f0,	%edi +	xorl	%edi,		%esi +	xorl	%edi,		%eax + +	rorl	$4,		%eax +	movl	%eax,		(%ebx) +	movl	%esi,		4(%ebx) +	popl	%edi +	popl	%esi +	popl	%ebx +	popl	%ebp +	ret +.des_encrypt3_end: +	SIZE(des_encrypt3,.des_encrypt3_end-des_encrypt3) +.ident	"desasm.pl" +.text +	.align ALIGN +.globl des_decrypt3 +	TYPE(des_decrypt3,@function) +des_decrypt3: +	pushl	%ebp +	pushl	%ebx +	pushl	%esi +	pushl	%edi + + +	/* Load the data words */ +	movl	20(%esp),	%ebx +	movl	(%ebx),		%edi +	movl	4(%ebx),	%esi + +	/* IP */ +	roll	$4,		%edi +	movl	%edi,		%edx +	xorl	%esi,		%edi +	andl	$0xf0f0f0f0,	%edi +	xorl	%edi,		%edx +	xorl	%edi,		%esi + +	roll	$20,		%esi +	movl	%esi,		%edi +	xorl	%edx,		%esi +	andl	$0xfff0000f,	%esi +	xorl	%esi,		%edi +	xorl	%esi,		%edx + +	roll	$14,		%edi +	movl	%edi,		%esi +	xorl	%edx,		%edi +	andl	$0x33333333,	%edi +	xorl	%edi,		%esi +	xorl	%edi,		%edx + +	roll	$22,		%edx +	movl	%edx,		%edi +	xorl	%esi,		%edx +	andl	$0x03fc03fc,	%edx +	xorl	%edx,		%edi +	xorl	%edx,		%esi + +	roll	$9,		%edi +	movl	%edi,		%edx +	xorl	%esi,		%edi +	andl	$0xaaaaaaaa,	%edi +	xorl	%edi,		%edx +	xorl	%edi,		%esi + +	rorl	$3,		%edx +	rorl	$2,		%esi +	movl	%esi,		4(%ebx) +	movl	24(%esp),	%esi +	movl	%edx,		(%ebx) +	movl	28(%esp),	%edi +	movl	32(%esp),	%eax +	pushl	$0 +	pushl	%eax +	pushl	%ebx +	call	des_encrypt2 +	pushl	$1 +	pushl	%edi +	pushl	%ebx +	call	des_encrypt2 +	pushl	$0 +	pushl	%esi +	pushl	%ebx +	call	des_encrypt2 +	movl	(%ebx),		%edi +	addl	$36,		%esp +	movl	4(%ebx),	%esi + +	/* FP */ +	roll	$2,		%esi +	roll	$3,		%edi +	movl	%edi,		%eax +	xorl	%esi,		%edi +	andl	$0xaaaaaaaa,	%edi +	xorl	%edi,		%eax +	xorl	%edi,		%esi + +	roll	$23,		%eax +	movl	%eax,		%edi +	xorl	%esi,		%eax +	andl	$0x03fc03fc,	%eax +	xorl	%eax,		%edi +	xorl	%eax,		%esi + +	roll	$10,		%edi +	movl	%edi,		%eax +	xorl	%esi,		%edi +	andl	$0x33333333,	%edi +	xorl	%edi,		%eax +	xorl	%edi,		%esi + +	roll	$18,		%esi +	movl	%esi,		%edi +	xorl	%eax,		%esi +	andl	$0xfff0000f,	%esi +	xorl	%esi,		%edi +	xorl	%esi,		%eax + +	roll	$12,		%edi +	movl	%edi,		%esi +	xorl	%eax,		%edi +	andl	$0xf0f0f0f0,	%edi +	xorl	%edi,		%esi +	xorl	%edi,		%eax + +	rorl	$4,		%eax +	movl	%eax,		(%ebx) +	movl	%esi,		4(%ebx) +	popl	%edi +	popl	%esi +	popl	%ebx +	popl	%ebp +	ret +.des_decrypt3_end: +	SIZE(des_decrypt3,.des_decrypt3_end-des_decrypt3) +.ident	"desasm.pl" diff --git a/crypto/libdes/asm/dx86unix.cpp b/crypto/libdes/asm/dx86unix.cpp new file mode 100644 index 000000000000..b4eb397d586b --- /dev/null +++ b/crypto/libdes/asm/dx86unix.cpp @@ -0,0 +1,39 @@ + +#define TYPE(a,b)	.type	a,b +#define SIZE(a,b)	.size	a,b + +#ifdef OUT +#define OK		1 +#define des_SPtrans	_des_SPtrans +#define des_encrypt	_des_encrypt +#define des_encrypt2	_des_encrypt2 +#define des_encrypt3	_des_encrypt3 +#define ALIGN		4 +#endif + +#ifdef BSDI +#define OK		1 +#define des_SPtrans	_des_SPtrans +#define des_encrypt	_des_encrypt +#define des_encrypt2	_des_encrypt2 +#define des_encrypt3	_des_encrypt3 +#define ALIGN		4 +#undef SIZE +#undef TYPE +#endif + +#if defined(ELF) || defined(SOL) +#define OK		1 +#define ALIGN		16 +#endif + +#ifndef OK +You need to define one of +ELF - elf systems - linux-elf, NetBSD and DG-UX +OUT - a.out systems - linux-a.out and FreeBSD +SOL - solaris systems, which are elf with strange comment lines +BSDI - a.out with a very primative version of as. +#endif + +#include "dx86-cpp.s"  + diff --git a/crypto/libdes/asm/readme b/crypto/libdes/asm/readme new file mode 100644 index 000000000000..bb1a8e9956f2 --- /dev/null +++ b/crypto/libdes/asm/readme @@ -0,0 +1,130 @@ +First up, let me say I don't like writing in assembler.  It is not portable, +dependant on the particular CPU architecture release and is generally a pig +to debug and get right.  Having said that, the x86 architecture is probably +the most important for speed due to number of boxes and since +it appears to be the worst architecture to to get +good C compilers for.  So due to this, I have lowered myself to do +assembler for the inner DES routines in libdes :-). + +The file to implement in assembler is des_enc.c.  Replace the following +4 functions +des_encrypt(DES_LONG data[2],des_key_schedule ks, int encrypt); +des_encrypt2(DES_LONG data[2],des_key_schedule ks, int encrypt); +des_encrypt3(DES_LONG data[2],des_key_schedule ks1,ks2,ks3); +des_decrypt3(DES_LONG data[2],des_key_schedule ks1,ks2,ks3); + +They encrypt/decrypt the 64 bits held in 'data' using +the 'ks' key schedules.   The only difference between the 4 functions is that +des_encrypt2() does not perform IP() or FP() on the data (this is an +optimization for when doing triple DES and des_encrypt3() and des_decrypt3() +perform triple des.  The triple DES routines are in here because it does +make a big difference to have them located near the des_encrypt2 function +at link time.. + +Now as we all know, there are lots of different operating systems running on +x86 boxes, and unfortunately they normally try to make sure their assembler +formating is not the same as the other peoples. +The 4 main formats I know of are +Microsoft	Windows 95/Windows NT +Elf		Includes Linux and FreeBSD(?). +a.out		The older Linux. +Solaris		Same as Elf but different comments :-(. + +Now I was not overly keen to write 4 different copies of the same code, +so I wrote a few perl routines to output the correct assembler, given +a target assembler type.  This code is ugly and is just a hack. +The libraries are x86unix.pl and x86ms.pl. +des586.pl, des686.pl and des-som[23].pl are the programs to actually +generate the assembler. + +So to generate elf assembler +perl des-som3.pl elf >dx86-elf.s +For Windows 95/NT +perl des-som2.pl win32 >win32.asm + +[ update 4 Jan 1996 ] +I have added another way to do things. +perl des-som3.pl cpp >dx86-cpp.s +generates a file that will be included by dx86unix.cpp when it is compiled. +To build for elf, a.out, solaris, bsdi etc, +cc -E -DELF asm/dx86unix.cpp | as -o asm/dx86-elf.o +cc -E -DSOL asm/dx86unix.cpp | as -o asm/dx86-sol.o +cc -E -DOUT asm/dx86unix.cpp | as -o asm/dx86-out.o +cc -E -DBSDI asm/dx86unix.cpp | as -o asm/dx86bsdi.o +This was done to cut down the number of files in the distribution. + +Now the ugly part.  I acquired my copy of Intels +"Optimization's For Intel's 32-Bit Processors" and found a few interesting +things.  First, the aim of the exersize is to 'extract' one byte at a time +from a word and do an array lookup.  This involves getting the byte from +the 4 locations in the word and moving it to a new word and doing the lookup. +The most obvious way to do this is +xor	eax,	eax				# clear word +movb	al,	cl				# get low byte +xor	edi	DWORD PTR 0x100+des_SP[eax] 	# xor in word +movb	al,	ch				# get next byte +xor	edi	DWORD PTR 0x300+des_SP[eax] 	# xor in word +shr	ecx	16 +which seems ok.  For the pentium, this system appears to be the best. +One has to do instruction interleaving to keep both functional units +operating, but it is basically very efficient. + +Now the crunch.  When a full register is used after a partial write, eg. +mov	al,	cl +xor	edi,	DWORD PTR 0x100+des_SP[eax] +386	- 1 cycle stall +486	- 1 cycle stall +586	- 0 cycle stall +686	- at least 7 cycle stall (page 22 of the above mentioned document). + +So the technique that produces the best results on a pentium, according to +the documentation, will produce hideous results on a pentium pro. + +To get around this, des686.pl will generate code that is not as fast on +a pentium, should be very good on a pentium pro. +mov	eax,	ecx				# copy word  +shr	ecx,	8				# line up next byte +and	eax,	0fch				# mask byte +xor	edi	DWORD PTR 0x100+des_SP[eax] 	# xor in array lookup +mov	eax,	ecx				# get word +shr	ecx	8				# line up next byte +and	eax,	0fch				# mask byte +xor	edi	DWORD PTR 0x300+des_SP[eax] 	# xor in array lookup + +Due to the execution units in the pentium, this actually works quite well. +For a pentium pro it should be very good.  This is the type of output +Visual C++ generates. + +There is a third option.  instead of using +mov	al,	ch +which is bad on the pentium pro, one may be able to use +movzx	eax,	ch +which may not incur the partial write penalty.  On the pentium, +this instruction takes 4 cycles so is not worth using but on the +pentium pro it appears it may be worth while.  I need access to one to +experiment :-). + +eric (20 Oct 1996) + +22 Nov 1996 - I have asked people to run the 2 different version on pentium +pros and it appears that the intel documentation is wrong.  The +mov al,bh is still faster on a pentium pro, so just use the des586.pl +install des686.pl + +3 Dec 1996 - I added des_encrypt3/des_decrypt3 because I have moved these +functions into des_enc.c because it does make a massive performance +difference on some boxes to have the functions code located close to +the des_encrypt2() function. + +9 Jan 1996 - des-som2.pl is now the correct perl script to use for +pentiums.  It contains an inner loop from +Svend Olaf Mikkelsen <svolaf@inet.uni-c.dk> which does raw ecb DES calls at +273,000 per second.  He had a previous version at 250,000 and the best +I was able to get was 203,000.  The content has not changed, this is all +due to instruction sequencing (and actual instructions choice) which is able +to keep both functional units of the pentium going. +We may have lost the ugly register usage restrictions when x86 went 32 bit +but for the pentium it has been replaced by evil instruction ordering tricks. + +13 Jan 1996 - des-som3.pl, more optimizations from Svend Olaf. +raw DES at 281,000 per second on a pentium 100. diff --git a/crypto/libdes/asm/win32.asm b/crypto/libdes/asm/win32.asm new file mode 100644 index 000000000000..29c915f78f20 --- /dev/null +++ b/crypto/libdes/asm/win32.asm @@ -0,0 +1,2766 @@ +	; Don't even think of reading this code +	; It was automatically generated by des-som2.pl +	; Which is a perl program used to generate the x86 assember for +	; any of elf, a.out, Win32, or Solaris +	; It can be found in SSLeay 0.6.5+ or in libdes 3.26+ +	; eric <eay@mincom.oz.au> +	; The inner loop instruction sequence and the IP/FP modifications +	; are from Svend Olaf Mikkelsen <svolaf@inet.uni-c.dk> + +	;  +	TITLE	dx86xxxx.asm +        .386 +.model FLAT +_TEXT	SEGMENT +PUBLIC	_des_encrypt +EXTRN	_des_SPtrans:DWORD +_des_encrypt PROC NEAR +	push	ebp +	push	ebx +	push	esi +	push	edi +	;  +	; Load the 2 words +	mov	esi,		DWORD PTR 20[esp] +	xor	ecx,		ecx +	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 +	cmp	ebx,		0 +	mov	ebp,		DWORD PTR 24[esp] +	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	edi +	pop	esi +	pop	ebx +	pop	ebp +	ret +_des_encrypt ENDP +_TEXT	ENDS +_TEXT	SEGMENT +PUBLIC	_des_encrypt2 +EXTRN	_des_SPtrans:DWORD +_des_encrypt2 PROC NEAR +	push	ebp +	push	ebx +	push	esi +	push	edi +	;  +	; Load the 2 words +	mov	eax,		DWORD PTR 20[esp] +	xor	ecx,		ecx +	mov	esi,		DWORD PTR [eax] +	mov	ebx,		DWORD PTR 28[esp] +	rol	esi,		3 +	mov	edi,		DWORD PTR 4[eax] +	rol	edi,		3 +	cmp	ebx,		0 +	mov	ebp,		DWORD PTR 24[esp] +	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	edi +	pop	esi +	pop	ebx +	pop	ebp +	ret +_des_encrypt2 ENDP +_TEXT	ENDS +_TEXT	SEGMENT +PUBLIC	_des_encrypt3 +EXTRN	_des_SPtrans:DWORD +_des_encrypt3 PROC NEAR +	push	ebp +	push	ebx +	push	esi +	push	edi +	;  +	; Load the data words +	mov	ebx,		DWORD PTR 20[esp] +	mov	edi,		DWORD PTR [ebx] +	mov	esi,		DWORD PTR 4[ebx] +	;  +	; 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 24[esp] +	mov	DWORD PTR [ebx],edx +	mov	edi,		DWORD PTR 28[esp] +	mov	esi,		DWORD PTR 32[esp] +	push	1 +	push	eax +	push	ebx +	call	_des_encrypt2 +	push	0 +	push	edi +	push	ebx +	call	_des_encrypt2 +	push	1 +	push	esi +	push	ebx +	call	_des_encrypt2 +	mov	edi,		DWORD PTR [ebx] +	add	esp,		36 +	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	ebx +	pop	ebp +	ret +_des_encrypt3 ENDP +_TEXT	ENDS +_TEXT	SEGMENT +PUBLIC	_des_decrypt3 +EXTRN	_des_SPtrans:DWORD +_des_decrypt3 PROC NEAR +	push	ebp +	push	ebx +	push	esi +	push	edi +	;  +	; Load the data words +	mov	ebx,		DWORD PTR 20[esp] +	mov	edi,		DWORD PTR [ebx] +	mov	esi,		DWORD PTR 4[ebx] +	;  +	; 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 24[esp] +	mov	DWORD PTR [ebx],edx +	mov	edi,		DWORD PTR 28[esp] +	mov	eax,		DWORD PTR 32[esp] +	push	0 +	push	eax +	push	ebx +	call	_des_encrypt2 +	push	1 +	push	edi +	push	ebx +	call	_des_encrypt2 +	push	0 +	push	esi +	push	ebx +	call	_des_encrypt2 +	mov	edi,		DWORD PTR [ebx] +	add	esp,		36 +	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	ebx +	pop	ebp +	ret +_des_decrypt3 ENDP +_TEXT	ENDS +END diff --git a/crypto/libdes/asm/win32.uu b/crypto/libdes/asm/win32.uu new file mode 100644 index 000000000000..b8fc7702b844 --- /dev/null +++ b/crypto/libdes/asm/win32.uu @@ -0,0 +1,319 @@ +begin 644 win32.obj +M3`$"`&*'V3)`-@``#``````````N=&5X=```````````````W"$``&0```!` +M(@`````````"```@`#!@+F1A=&$```#<(0````````````!`-@`````````` +M````````0``PP%535E>+="04,\F+!HM<)!R+?@3!P`2+\#/')?#P\/`S\#/X +MP<<4B\<S_H'G#P#P_S/',_?!P`Z+^#/&)3,S,S,S^#/PP<86B\8S]X'F_`/\ +M`S/&,_[!P`F+\#/'):JJJJHS\#/XT<>#^P"+;"08#X2U!P``BT4`,]N+500S +MQC/6)?S\_/R!XL_/S\^*V(K,P<H$BZL`````BMHS_8NI``(``#/]BL[!Z!"+ +MJP`!```S_8K<P>H0BZD``P``,_V+;"08BLXE_P```('B_P```(N;``8``#/[ +MBYD`!P``,_N+F``$```S^XN:``4``#/[BT4(,]N+50PSQS/7)?S\_/R!XL_/ +MS\^*V(K,P<H$BZL`````BMHS]8NI``(``#/UBL[!Z!"+JP`!```S]8K<P>H0 +MBZD``P``,_6+;"08BLXE_P```('B_P```(N;``8``#/SBYD`!P``,_.+F``$ +M```S\XN:``4``#/SBT40,]N+510SQC/6)?S\_/R!XL_/S\^*V(K,P<H$BZL` +M````BMHS_8NI``(``#/]BL[!Z!"+JP`!```S_8K<P>H0BZD``P``,_V+;"08 +MBLXE_P```('B_P```(N;``8``#/[BYD`!P``,_N+F``$```S^XN:``4``#/[ +MBT48,]N+51PSQS/7)?S\_/R!XL_/S\^*V(K,P<H$BZL`````BMHS]8NI``(` +M`#/UBL[!Z!"+JP`!```S]8K<P>H0BZD``P``,_6+;"08BLXE_P```('B_P`` +M`(N;``8``#/SBYD`!P``,_.+F``$```S\XN:``4``#/SBT4@,]N+520SQC/6 +M)?S\_/R!XL_/S\^*V(K,P<H$BZL`````BMHS_8NI``(``#/]BL[!Z!"+JP`! +M```S_8K<P>H0BZD``P``,_V+;"08BLXE_P```('B_P```(N;``8``#/[BYD` +M!P``,_N+F``$```S^XN:``4``#/[BT4H,]N+52PSQS/7)?S\_/R!XL_/S\^* +MV(K,P<H$BZL`````BMHS]8NI``(``#/UBL[!Z!"+JP`!```S]8K<P>H0BZD` +M`P``,_6+;"08BLXE_P```('B_P```(N;``8``#/SBYD`!P``,_.+F``$```S +M\XN:``4``#/SBT4P,]N+530SQC/6)?S\_/R!XL_/S\^*V(K,P<H$BZL````` +MBMHS_8NI``(``#/]BL[!Z!"+JP`!```S_8K<P>H0BZD``P``,_V+;"08BLXE +M_P```('B_P```(N;``8``#/[BYD`!P``,_N+F``$```S^XN:``4``#/[BT4X +M,]N+53PSQS/7)?S\_/R!XL_/S\^*V(K,P<H$BZL`````BMHS]8NI``(``#/U +MBL[!Z!"+JP`!```S]8K<P>H0BZD``P``,_6+;"08BLXE_P```('B_P```(N; +M``8``#/SBYD`!P``,_.+F``$```S\XN:``4``#/SBT5`,]N+540SQC/6)?S\ +M_/R!XL_/S\^*V(K,P<H$BZL`````BMHS_8NI``(``#/]BL[!Z!"+JP`!```S +M_8K<P>H0BZD``P``,_V+;"08BLXE_P```('B_P```(N;``8``#/[BYD`!P`` +M,_N+F``$```S^XN:``4``#/[BT5(,]N+54PSQS/7)?S\_/R!XL_/S\^*V(K, +MP<H$BZL`````BMHS]8NI``(``#/UBL[!Z!"+JP`!```S]8K<P>H0BZD``P`` +M,_6+;"08BLXE_P```('B_P```(N;``8``#/SBYD`!P``,_.+F``$```S\XN: +M``4``#/SBT50,]N+550SQC/6)?S\_/R!XL_/S\^*V(K,P<H$BZL`````BMHS +M_8NI``(``#/]BL[!Z!"+JP`!```S_8K<P>H0BZD``P``,_V+;"08BLXE_P`` +M`('B_P```(N;``8``#/[BYD`!P``,_N+F``$```S^XN:``4``#/[BT58,]N+ +M55PSQS/7)?S\_/R!XL_/S\^*V(K,P<H$BZL`````BMHS]8NI``(``#/UBL[! +MZ!"+JP`!```S]8K<P>H0BZD``P``,_6+;"08BLXE_P```('B_P```(N;``8` +M`#/SBYD`!P``,_.+F``$```S\XN:``4``#/SBT5@,]N+560SQC/6)?S\_/R! +MXL_/S\^*V(K,P<H$BZL`````BMHS_8NI``(``#/]BL[!Z!"+JP`!```S_8K< +MP>H0BZD``P``,_V+;"08BLXE_P```('B_P```(N;``8``#/[BYD`!P``,_N+ +MF``$```S^XN:``4``#/[BT5H,]N+56PSQS/7)?S\_/R!XL_/S\^*V(K,P<H$ +MBZL`````BMHS]8NI``(``#/UBL[!Z!"+JP`!```S]8K<P>H0BZD``P``,_6+ +M;"08BLXE_P```('B_P```(N;``8``#/SBYD`!P``,_.+F``$```S\XN:``4` +M`#/SBT5P,]N+570SQC/6)?S\_/R!XL_/S\^*V(K,P<H$BZL`````BMHS_8NI +M``(``#/]BL[!Z!"+JP`!```S_8K<P>H0BZD``P``,_V+;"08BLXE_P```('B +M_P```(N;``8``#/[BYD`!P``,_N+F``$```S^XN:``4``#/[BT5X,]N+57PS +MQS/7)?S\_/R!XL_/S\^*V(K,P<H$BZL`````BMHS]8NI``(``#/UBL[!Z!"+ +MJP`!```S]8K<P>H0BZD``P``,_6+;"08BLXE_P```('B_P```(N;``8``#/S +MBYD`!P``,_.+F``$```S\XN:``4``#/SZ;`'``"+17@SVXM5?#/&,]8E_/S\ +M_('BS\_/SXK8BLS!R@2+JP````"*VC/]BZD``@``,_V*SL'H$(NK``$``#/] +MBMS!ZA"+J0`#```S_8ML)!B*SB7_````@>+_````BYL`!@``,_N+F0`'```S +M^XN8``0``#/[BYH`!0``,_N+17`SVXM5=#/',]<E_/S\_('BS\_/SXK8BLS! +MR@2+JP````"*VC/UBZD``@``,_6*SL'H$(NK``$``#/UBMS!ZA"+J0`#```S +M]8ML)!B*SB7_````@>+_````BYL`!@``,_.+F0`'```S\XN8``0``#/SBYH` +M!0``,_.+16@SVXM5;#/&,]8E_/S\_('BS\_/SXK8BLS!R@2+JP````"*VC/] +MBZD``@``,_V*SL'H$(NK``$``#/]BMS!ZA"+J0`#```S_8ML)!B*SB7_```` +M@>+_````BYL`!@``,_N+F0`'```S^XN8``0``#/[BYH`!0``,_N+16`SVXM5 +M9#/',]<E_/S\_('BS\_/SXK8BLS!R@2+JP````"*VC/UBZD``@``,_6*SL'H +M$(NK``$``#/UBMS!ZA"+J0`#```S]8ML)!B*SB7_````@>+_````BYL`!@`` +M,_.+F0`'```S\XN8``0``#/SBYH`!0``,_.+15@SVXM57#/&,]8E_/S\_('B +MS\_/SXK8BLS!R@2+JP````"*VC/]BZD``@``,_V*SL'H$(NK``$``#/]BMS! +MZA"+J0`#```S_8ML)!B*SB7_````@>+_````BYL`!@``,_N+F0`'```S^XN8 +M``0``#/[BYH`!0``,_N+15`SVXM55#/',]<E_/S\_('BS\_/SXK8BLS!R@2+ +MJP````"*VC/UBZD``@``,_6*SL'H$(NK``$``#/UBMS!ZA"+J0`#```S]8ML +M)!B*SB7_````@>+_````BYL`!@``,_.+F0`'```S\XN8``0``#/SBYH`!0`` +M,_.+14@SVXM53#/&,]8E_/S\_('BS\_/SXK8BLS!R@2+JP````"*VC/]BZD` +M`@``,_V*SL'H$(NK``$``#/]BMS!ZA"+J0`#```S_8ML)!B*SB7_````@>+_ +M````BYL`!@``,_N+F0`'```S^XN8``0``#/[BYH`!0``,_N+14`SVXM51#/' +M,]<E_/S\_('BS\_/SXK8BLS!R@2+JP````"*VC/UBZD``@``,_6*SL'H$(NK +M``$``#/UBMS!ZA"+J0`#```S]8ML)!B*SB7_````@>+_````BYL`!@``,_.+ +MF0`'```S\XN8``0``#/SBYH`!0``,_.+13@SVXM5/#/&,]8E_/S\_('BS\_/ +MSXK8BLS!R@2+JP````"*VC/]BZD``@``,_V*SL'H$(NK``$``#/]BMS!ZA"+ +MJ0`#```S_8ML)!B*SB7_````@>+_````BYL`!@``,_N+F0`'```S^XN8``0` +M`#/[BYH`!0``,_N+13`SVXM5-#/',]<E_/S\_('BS\_/SXK8BLS!R@2+JP`` +M``"*VC/UBZD``@``,_6*SL'H$(NK``$``#/UBMS!ZA"+J0`#```S]8ML)!B* +MSB7_````@>+_````BYL`!@``,_.+F0`'```S\XN8``0``#/SBYH`!0``,_.+ +M12@SVXM5+#/&,]8E_/S\_('BS\_/SXK8BLS!R@2+JP````"*VC/]BZD``@`` +M,_V*SL'H$(NK``$``#/]BMS!ZA"+J0`#```S_8ML)!B*SB7_````@>+_```` +MBYL`!@``,_N+F0`'```S^XN8``0``#/[BYH`!0``,_N+12`SVXM5)#/',]<E +M_/S\_('BS\_/SXK8BLS!R@2+JP````"*VC/UBZD``@``,_6*SL'H$(NK``$` +M`#/UBMS!ZA"+J0`#```S]8ML)!B*SB7_````@>+_````BYL`!@``,_.+F0`' +M```S\XN8``0``#/SBYH`!0``,_.+11@SVXM5'#/&,]8E_/S\_('BS\_/SXK8 +MBLS!R@2+JP````"*VC/]BZD``@``,_V*SL'H$(NK``$``#/]BMS!ZA"+J0`# +M```S_8ML)!B*SB7_````@>+_````BYL`!@``,_N+F0`'```S^XN8``0``#/[ +MBYH`!0``,_N+11`SVXM5%#/',]<E_/S\_('BS\_/SXK8BLS!R@2+JP````"* +MVC/UBZD``@``,_6*SL'H$(NK``$``#/UBMS!ZA"+J0`#```S]8ML)!B*SB7_ +M````@>+_````BYL`!@``,_.+F0`'```S\XN8``0``#/SBYH`!0``,_.+10@S +MVXM5##/&,]8E_/S\_('BS\_/SXK8BLS!R@2+JP````"*VC/]BZD``@``,_V* +MSL'H$(NK``$``#/]BMS!ZA"+J0`#```S_8ML)!B*SB7_````@>+_````BYL` +M!@``,_N+F0`'```S^XN8``0``#/[BYH`!0``,_N+10`SVXM5!#/',]<E_/S\ +M_('BS\_/SXK8BLS!R@2+JP````"*VC/UBZD``@``,_6*SL'H$(NK``$``#/U +MBMS!ZA"+J0`#```S]8ML)!B*SB7_````@>+_````BYL`!@``,_.+F0`'```S +M\XN8``0``#/SBYH`!0``,_.+5"04T<Z+QS/^@>>JJJJJ,\<S]\'`%XOX,\8E +M_`/\`S/X,_#!QPJ+QS/^@><S,S,S,\<S]\'&$HO^,_"!Y@\`\/\S_C/&P<<, +MB_<S^('G\/#P\#/W,\?!R`2)`HER!%]>6UW#55-65XM$)!0SR8LPBUPD','& +M`XMX!,''`X/[`(ML)!@/A+4'``"+10`SVXM5!#/&,]8E_/S\_('BS\_/SXK8 +MBLS!R@2+JP````"*VC/]BZD``@``,_V*SL'H$(NK``$``#/]BMS!ZA"+J0`# +M```S_8ML)!B*SB7_````@>+_````BYL`!@``,_N+F0`'```S^XN8``0``#/[ +MBYH`!0``,_N+10@SVXM5##/',]<E_/S\_('BS\_/SXK8BLS!R@2+JP````"* +MVC/UBZD``@``,_6*SL'H$(NK``$``#/UBMS!ZA"+J0`#```S]8ML)!B*SB7_ +M````@>+_````BYL`!@``,_.+F0`'```S\XN8``0``#/SBYH`!0``,_.+11`S +MVXM5%#/&,]8E_/S\_('BS\_/SXK8BLS!R@2+JP````"*VC/]BZD``@``,_V* +MSL'H$(NK``$``#/]BMS!ZA"+J0`#```S_8ML)!B*SB7_````@>+_````BYL` +M!@``,_N+F0`'```S^XN8``0``#/[BYH`!0``,_N+11@SVXM5'#/',]<E_/S\ +M_('BS\_/SXK8BLS!R@2+JP````"*VC/UBZD``@``,_6*SL'H$(NK``$``#/U +MBMS!ZA"+J0`#```S]8ML)!B*SB7_````@>+_````BYL`!@``,_.+F0`'```S +M\XN8``0``#/SBYH`!0``,_.+12`SVXM5)#/&,]8E_/S\_('BS\_/SXK8BLS! +MR@2+JP````"*VC/]BZD``@``,_V*SL'H$(NK``$``#/]BMS!ZA"+J0`#```S +M_8ML)!B*SB7_````@>+_````BYL`!@``,_N+F0`'```S^XN8``0``#/[BYH` +M!0``,_N+12@SVXM5+#/',]<E_/S\_('BS\_/SXK8BLS!R@2+JP````"*VC/U +MBZD``@``,_6*SL'H$(NK``$``#/UBMS!ZA"+J0`#```S]8ML)!B*SB7_```` +M@>+_````BYL`!@``,_.+F0`'```S\XN8``0``#/SBYH`!0``,_.+13`SVXM5 +M-#/&,]8E_/S\_('BS\_/SXK8BLS!R@2+JP````"*VC/]BZD``@``,_V*SL'H +M$(NK``$``#/]BMS!ZA"+J0`#```S_8ML)!B*SB7_````@>+_````BYL`!@`` +M,_N+F0`'```S^XN8``0``#/[BYH`!0``,_N+13@SVXM5/#/',]<E_/S\_('B +MS\_/SXK8BLS!R@2+JP````"*VC/UBZD``@``,_6*SL'H$(NK``$``#/UBMS! +MZA"+J0`#```S]8ML)!B*SB7_````@>+_````BYL`!@``,_.+F0`'```S\XN8 +M``0``#/SBYH`!0``,_.+14`SVXM51#/&,]8E_/S\_('BS\_/SXK8BLS!R@2+ +MJP````"*VC/]BZD``@``,_V*SL'H$(NK``$``#/]BMS!ZA"+J0`#```S_8ML +M)!B*SB7_````@>+_````BYL`!@``,_N+F0`'```S^XN8``0``#/[BYH`!0`` +M,_N+14@SVXM53#/',]<E_/S\_('BS\_/SXK8BLS!R@2+JP````"*VC/UBZD` +M`@``,_6*SL'H$(NK``$``#/UBMS!ZA"+J0`#```S]8ML)!B*SB7_````@>+_ +M````BYL`!@``,_.+F0`'```S\XN8``0``#/SBYH`!0``,_.+15`SVXM55#/& +M,]8E_/S\_('BS\_/SXK8BLS!R@2+JP````"*VC/]BZD``@``,_V*SL'H$(NK +M``$``#/]BMS!ZA"+J0`#```S_8ML)!B*SB7_````@>+_````BYL`!@``,_N+ +MF0`'```S^XN8``0``#/[BYH`!0``,_N+15@SVXM57#/',]<E_/S\_('BS\_/ +MSXK8BLS!R@2+JP````"*VC/UBZD``@``,_6*SL'H$(NK``$``#/UBMS!ZA"+ +MJ0`#```S]8ML)!B*SB7_````@>+_````BYL`!@``,_.+F0`'```S\XN8``0` +M`#/SBYH`!0``,_.+16`SVXM59#/&,]8E_/S\_('BS\_/SXK8BLS!R@2+JP`` +M``"*VC/]BZD``@``,_V*SL'H$(NK``$``#/]BMS!ZA"+J0`#```S_8ML)!B* +MSB7_````@>+_````BYL`!@``,_N+F0`'```S^XN8``0``#/[BYH`!0``,_N+ +M16@SVXM5;#/',]<E_/S\_('BS\_/SXK8BLS!R@2+JP````"*VC/UBZD``@`` +M,_6*SL'H$(NK``$``#/UBMS!ZA"+J0`#```S]8ML)!B*SB7_````@>+_```` +MBYL`!@``,_.+F0`'```S\XN8``0``#/SBYH`!0``,_.+17`SVXM5=#/&,]8E +M_/S\_('BS\_/SXK8BLS!R@2+JP````"*VC/]BZD``@``,_V*SL'H$(NK``$` +M`#/]BMS!ZA"+J0`#```S_8ML)!B*SB7_````@>+_````BYL`!@``,_N+F0`' +M```S^XN8``0``#/[BYH`!0``,_N+17@SVXM5?#/',]<E_/S\_('BS\_/SXK8 +MBLS!R@2+JP````"*VC/UBZD``@``,_6*SL'H$(NK``$``#/UBMS!ZA"+J0`# +M```S]8ML)!B*SB7_````@>+_````BYL`!@``,_.+F0`'```S\XN8``0``#/S +MBYH`!0``,_/IL`<``(M%>#/;BU5\,\8SUB7\_/S\@>+/S\_/BMB*S,'*!(NK +M`````(K:,_V+J0`"```S_8K.P>@0BZL``0``,_V*W,'J$(NI``,``#/]BVPD +M&(K.)?\```"!XO\```"+FP`&```S^XN9``<``#/[BY@`!```,_N+F@`%```S +M^XM%<#/;BU5T,\<SUR7\_/S\@>+/S\_/BMB*S,'*!(NK`````(K:,_6+J0`" +M```S]8K.P>@0BZL``0``,_6*W,'J$(NI``,``#/UBVPD&(K.)?\```"!XO\` +M``"+FP`&```S\XN9``<``#/SBY@`!```,_.+F@`%```S\XM%:#/;BU5L,\8S +MUB7\_/S\@>+/S\_/BMB*S,'*!(NK`````(K:,_V+J0`"```S_8K.P>@0BZL` +M`0``,_V*W,'J$(NI``,``#/]BVPD&(K.)?\```"!XO\```"+FP`&```S^XN9 +M``<``#/[BY@`!```,_N+F@`%```S^XM%8#/;BU5D,\<SUR7\_/S\@>+/S\_/ +MBMB*S,'*!(NK`````(K:,_6+J0`"```S]8K.P>@0BZL``0``,_6*W,'J$(NI +M``,``#/UBVPD&(K.)?\```"!XO\```"+FP`&```S\XN9``<``#/SBY@`!``` +M,_.+F@`%```S\XM%6#/;BU5<,\8SUB7\_/S\@>+/S\_/BMB*S,'*!(NK```` +M`(K:,_V+J0`"```S_8K.P>@0BZL``0``,_V*W,'J$(NI``,``#/]BVPD&(K. +M)?\```"!XO\```"+FP`&```S^XN9``<``#/[BY@`!```,_N+F@`%```S^XM% +M4#/;BU54,\<SUR7\_/S\@>+/S\_/BMB*S,'*!(NK`````(K:,_6+J0`"```S +M]8K.P>@0BZL``0``,_6*W,'J$(NI``,``#/UBVPD&(K.)?\```"!XO\```"+ +MFP`&```S\XN9``<``#/SBY@`!```,_.+F@`%```S\XM%2#/;BU5,,\8SUB7\ +M_/S\@>+/S\_/BMB*S,'*!(NK`````(K:,_V+J0`"```S_8K.P>@0BZL``0`` +M,_V*W,'J$(NI``,``#/]BVPD&(K.)?\```"!XO\```"+FP`&```S^XN9``<` +M`#/[BY@`!```,_N+F@`%```S^XM%0#/;BU5$,\<SUR7\_/S\@>+/S\_/BMB* +MS,'*!(NK`````(K:,_6+J0`"```S]8K.P>@0BZL``0``,_6*W,'J$(NI``,` +M`#/UBVPD&(K.)?\```"!XO\```"+FP`&```S\XN9``<``#/SBY@`!```,_.+ +MF@`%```S\XM%.#/;BU4\,\8SUB7\_/S\@>+/S\_/BMB*S,'*!(NK`````(K: +M,_V+J0`"```S_8K.P>@0BZL``0``,_V*W,'J$(NI``,``#/]BVPD&(K.)?\` +M``"!XO\```"+FP`&```S^XN9``<``#/[BY@`!```,_N+F@`%```S^XM%,#/; +MBU4T,\<SUR7\_/S\@>+/S\_/BMB*S,'*!(NK`````(K:,_6+J0`"```S]8K. +MP>@0BZL``0``,_6*W,'J$(NI``,``#/UBVPD&(K.)?\```"!XO\```"+FP`& +M```S\XN9``<``#/SBY@`!```,_.+F@`%```S\XM%*#/;BU4L,\8SUB7\_/S\ +M@>+/S\_/BMB*S,'*!(NK`````(K:,_V+J0`"```S_8K.P>@0BZL``0``,_V* +MW,'J$(NI``,``#/]BVPD&(K.)?\```"!XO\```"+FP`&```S^XN9``<``#/[ +MBY@`!```,_N+F@`%```S^XM%(#/;BU4D,\<SUR7\_/S\@>+/S\_/BMB*S,'* +M!(NK`````(K:,_6+J0`"```S]8K.P>@0BZL``0``,_6*W,'J$(NI``,``#/U +MBVPD&(K.)?\```"!XO\```"+FP`&```S\XN9``<``#/SBY@`!```,_.+F@`% +M```S\XM%&#/;BU4<,\8SUB7\_/S\@>+/S\_/BMB*S,'*!(NK`````(K:,_V+ +MJ0`"```S_8K.P>@0BZL``0``,_V*W,'J$(NI``,``#/]BVPD&(K.)?\```"! +MXO\```"+FP`&```S^XN9``<``#/[BY@`!```,_N+F@`%```S^XM%$#/;BU44 +M,\<SUR7\_/S\@>+/S\_/BMB*S,'*!(NK`````(K:,_6+J0`"```S]8K.P>@0 +MBZL``0``,_6*W,'J$(NI``,``#/UBVPD&(K.)?\```"!XO\```"+FP`&```S +M\XN9``<``#/SBY@`!```,_.+F@`%```S\XM%"#/;BU4,,\8SUB7\_/S\@>+/ +MS\_/BMB*S,'*!(NK`````(K:,_V+J0`"```S_8K.P>@0BZL``0``,_V*W,'J +M$(NI``,``#/]BVPD&(K.)?\```"!XO\```"+FP`&```S^XN9``<``#/[BY@` +M!```,_N+F@`%```S^XM%`#/;BU4$,\<SUR7\_/S\@>+/S\_/BMB*S,'*!(NK +M`````(K:,_6+J0`"```S]8K.P>@0BZL``0``,_6*W,'J$(NI``,``#/UBVPD +M&(K.)?\```"!XO\```"+FP`&```S\XN9``<``#/SBY@`!```,_.+F@`%```S +M\\'/`XM$)!3!S@.).(EP!%]>6UW#55-65XM<)!2+.XMS!,''!(O7,_Z!Y_#P +M\/`SUS/WP<84B_XS\H'F#P#P_S/^,];!QPZ+]S/Z@><S,S,S,_<SU\'"%HOZ +M,]:!XOP#_`,S^C/RP<<)B]<S_H'GJJJJJC/7,_?!R@/!S@*)<P2+1"08B1.+ +M?"0<BW0D(&H!4%/HW^___VH`5U/HUN___VH!5E/HS>___XL[@\0DBW,$P<8" +MP<<#B\<S_H'GJJJJJC/',_?!P!>+^#/&)?P#_`,S^#/PP<<*B\<S_H'G,S,S +M,S/',_?!QA*+_C/P@>8/`/#_,_XSQL''#(OW,_B!Y_#P\/`S]S/'P<@$B0.) +M<P1?7EM=PU535E>+7"04BSN+<P3!QP2+US/^@>?P\/#P,]<S]\'&%(O^,_*! +MY@\`\/\S_C/6P<<.B_<S^H'G,S,S,S/W,]?!PA:+^C/6@>+\`_P#,_HS\L'' +M"8O7,_Z!YZJJJJHSUS/WP<H#P<X"B7,$BW0D&(D3BWPD'(M$)"!J`%!3Z-_N +M__]J`5=3Z-;N__]J`%93Z,WN__^+.X/$)(MS!,'&`L''`XO',_Z!YZJJJJHS +MQS/WP<`7B_@SQB7\`_P#,_@S\,''"HO',_Z!YS,S,S,SQS/WP<82B_XS\('F +M#P#P_S/^,\;!QPR+]S/X@>?P\/#P,_<SQ\'(!(D#B7,$7UY;7<.4````!P`` +M``8`G@````<````&`*L````'````!@"X````!P````8`T0````<````&`-D` +M```'````!@#A````!P````8`Z0````<````&``\!```'````!@`9`0``!P`` +M``8`)@$```<````&`#,!```'````!@!,`0``!P````8`5`$```<````&`%P! +M```'````!@!D`0``!P````8`B@$```<````&`)0!```'````!@"A`0``!P`` +M``8`K@$```<````&`,<!```'````!@#/`0``!P````8`UP$```<````&`-\! +M```'````!@`%`@``!P````8`#P(```<````&`!P"```'````!@`I`@``!P`` +M``8`0@(```<````&`$H"```'````!@!2`@``!P````8`6@(```<````&`(`" +M```'````!@"*`@``!P````8`EP(```<````&`*0"```'````!@"]`@``!P`` +M``8`Q0(```<````&`,T"```'````!@#5`@``!P````8`^P(```<````&``4# +M```'````!@`2`P``!P````8`'P,```<````&`#@#```'````!@!``P``!P`` +M``8`2`,```<````&`%`#```'````!@!V`P``!P````8`@`,```<````&`(T# +M```'````!@":`P``!P````8`LP,```<````&`+L#```'````!@##`P``!P`` +M``8`RP,```<````&`/$#```'````!@#[`P``!P````8`"`0```<````&`!4$ +M```'````!@`N!```!P````8`-@0```<````&`#X$```'````!@!&!```!P`` +M``8`;`0```<````&`'8$```'````!@"#!```!P````8`D`0```<````&`*D$ +M```'````!@"Q!```!P````8`N00```<````&`,$$```'````!@#G!```!P`` +M``8`\00```<````&`/X$```'````!@`+!0``!P````8`)`4```<````&`"P% +M```'````!@`T!0``!P````8`/`4```<````&`&(%```'````!@!L!0``!P`` +M``8`>04```<````&`(8%```'````!@"?!0``!P````8`IP4```<````&`*\% +M```'````!@"W!0``!P````8`W04```<````&`.<%```'````!@#T!0``!P`` +M``8``08```<````&`!H&```'````!@`B!@``!P````8`*@8```<````&`#(& +M```'````!@!8!@``!P````8`8@8```<````&`&\&```'````!@!\!@``!P`` +M``8`E08```<````&`)T&```'````!@"E!@``!P````8`K08```<````&`-,& +M```'````!@#=!@``!P````8`Z@8```<````&`/<&```'````!@`0!P``!P`` +M``8`&`<```<````&`"`'```'````!@`H!P``!P````8`3@<```<````&`%@' +M```'````!@!E!P``!P````8`<@<```<````&`(L'```'````!@"3!P``!P`` +M``8`FP<```<````&`*,'```'````!@#)!P``!P````8`TP<```<````&`.`' +M```'````!@#M!P``!P````8`!@@```<````&``X(```'````!@`6"```!P`` +M``8`'@@```<````&`$D(```'````!@!3"```!P````8`8`@```<````&`&T( +M```'````!@"&"```!P````8`C@@```<````&`)8(```'````!@">"```!P`` +M``8`Q`@```<````&`,X(```'````!@#;"```!P````8`Z`@```<````&``$) +M```'````!@`)"0``!P````8`$0D```<````&`!D)```'````!@`_"0``!P`` +M``8`20D```<````&`%8)```'````!@!C"0``!P````8`?`D```<````&`(0) +M```'````!@","0``!P````8`E`D```<````&`+H)```'````!@#$"0``!P`` +M``8`T0D```<````&`-X)```'````!@#W"0``!P````8`_PD```<````&``<* +M```'````!@`/"@``!P````8`-0H```<````&`#\*```'````!@!,"@``!P`` +M``8`60H```<````&`'(*```'````!@!Z"@``!P````8`@@H```<````&`(H* +M```'````!@"P"@``!P````8`N@H```<````&`,<*```'````!@#4"@``!P`` +M``8`[0H```<````&`/4*```'````!@#]"@``!P````8`!0L```<````&`"L+ +M```'````!@`U"P``!P````8`0@L```<````&`$\+```'````!@!H"P``!P`` +M``8`<`L```<````&`'@+```'````!@"`"P``!P````8`I@L```<````&`+`+ +M```'````!@"]"P``!P````8`R@L```<````&`.,+```'````!@#K"P``!P`` +M``8`\PL```<````&`/L+```'````!@`A#```!P````8`*PP```<````&`#@, +M```'````!@!%#```!P````8`7@P```<````&`&8,```'````!@!N#```!P`` +M``8`=@P```<````&`)P,```'````!@"F#```!P````8`LPP```<````&`,`, +M```'````!@#9#```!P````8`X0P```<````&`.D,```'````!@#Q#```!P`` +M``8`%PT```<````&`"$-```'````!@`N#0``!P````8`.PT```<````&`%0- +M```'````!@!<#0``!P````8`9`T```<````&`&P-```'````!@"2#0``!P`` +M``8`G`T```<````&`*D-```'````!@"V#0``!P````8`SPT```<````&`-<- +M```'````!@#?#0``!P````8`YPT```<````&``T.```'````!@`7#@``!P`` +M``8`)`X```<````&`#$.```'````!@!*#@``!P````8`4@X```<````&`%H. +M```'````!@!B#@``!P````8`B`X```<````&`)(.```'````!@"?#@``!P`` +M``8`K`X```<````&`,4.```'````!@#-#@``!P````8`U0X```<````&`-T. +M```'````!@`##P``!P````8`#0\```<````&`!H/```'````!@`G#P``!P`` +M``8`0`\```<````&`$@/```'````!@!0#P``!P````8`6`\```<````&`'X/ +M```'````!@"(#P``!P````8`E0\```<````&`*(/```'````!@"[#P``!P`` +M``8`PP\```<````&`,L/```'````!@#3#P``!P````8`@Q````<````&`(T0 +M```'````!@":$```!P````8`IQ````<````&`,`0```'````!@#($```!P`` +M``8`T!````<````&`-@0```'````!@#^$```!P````8`"!$```<````&`!41 +M```'````!@`B$0``!P````8`.Q$```<````&`$,1```'````!@!+$0``!P`` +M``8`4Q$```<````&`'D1```'````!@"#$0``!P````8`D!$```<````&`)T1 +M```'````!@"V$0``!P````8`OA$```<````&`,81```'````!@#.$0``!P`` +M``8`]!$```<````&`/X1```'````!@`+$@``!P````8`&!(```<````&`#$2 +M```'````!@`Y$@``!P````8`01(```<````&`$D2```'````!@!O$@``!P`` +M``8`>1(```<````&`(82```'````!@"3$@``!P````8`K!(```<````&`+02 +M```'````!@"\$@``!P````8`Q!(```<````&`.H2```'````!@#T$@``!P`` +M``8``1,```<````&``X3```'````!@`G$P``!P````8`+Q,```<````&`#<3 +M```'````!@`_$P``!P````8`91,```<````&`&\3```'````!@!\$P``!P`` +M``8`B1,```<````&`*(3```'````!@"J$P``!P````8`LA,```<````&`+H3 +M```'````!@#@$P``!P````8`ZA,```<````&`/<3```'````!@`$%```!P`` +M``8`'10```<````&`"44```'````!@`M%```!P````8`-10```<````&`%L4 +M```'````!@!E%```!P````8`<A0```<````&`'\4```'````!@"8%```!P`` +M``8`H!0```<````&`*@4```'````!@"P%```!P````8`UA0```<````&`.`4 +M```'````!@#M%```!P````8`^A0```<````&`!,5```'````!@`;%0``!P`` +M``8`(Q4```<````&`"L5```'````!@!1%0``!P````8`6Q4```<````&`&@5 +M```'````!@!U%0``!P````8`CA4```<````&`)85```'````!@">%0``!P`` +M``8`IA4```<````&`,P5```'````!@#6%0``!P````8`XQ4```<````&`/`5 +M```'````!@`)%@``!P````8`$18```<````&`!D6```'````!@`A%@``!P`` +M``8`1Q8```<````&`%$6```'````!@!>%@``!P````8`:Q8```<````&`(06 +M```'````!@",%@``!P````8`E!8```<````&`)P6```'````!@#"%@``!P`` +M``8`S!8```<````&`-D6```'````!@#F%@``!P````8`_Q8```<````&``<7 +M```'````!@`/%P``!P````8`%Q<```<````&`#T7```'````!@!'%P``!P`` +M``8`5!<```<````&`&$7```'````!@!Z%P``!P````8`@A<```<````&`(H7 +M```'````!@"2%P``!P````8`N!<```<````&`,(7```'````!@#/%P``!P`` +M``8`W!<```<````&`/47```'````!@#]%P``!P````8`!1@```<````&``T8 +M```'````!@`X&```!P````8`0A@```<````&`$\8```'````!@!<&```!P`` +M``8`=1@```<````&`'T8```'````!@"%&```!P````8`C1@```<````&`+,8 +M```'````!@"]&```!P````8`RA@```<````&`-<8```'````!@#P&```!P`` +M``8`^!@```<````&```9```'````!@`(&0``!P````8`+AD```<````&`#@9 +M```'````!@!%&0``!P````8`4AD```<````&`&L9```'````!@!S&0``!P`` +M``8`>QD```<````&`(,9```'````!@"I&0``!P````8`LQD```<````&`,`9 +M```'````!@#-&0``!P````8`YAD```<````&`.X9```'````!@#V&0``!P`` +M``8`_AD```<````&`"0:```'````!@`N&@``!P````8`.QH```<````&`$@: +M```'````!@!A&@``!P````8`:1H```<````&`'$:```'````!@!Y&@``!P`` +M``8`GQH```<````&`*D:```'````!@"V&@``!P````8`PQH```<````&`-P: +M```'````!@#D&@``!P````8`[!H```<````&`/0:```'````!@`:&P``!P`` +M``8`)!L```<````&`#$;```'````!@`^&P``!P````8`5QL```<````&`%\; +M```'````!@!G&P``!P````8`;QL```<````&`)4;```'````!@"?&P``!P`` +M``8`K!L```<````&`+D;```'````!@#2&P``!P````8`VAL```<````&`.(; +M```'````!@#J&P``!P````8`$!P```<````&`!H<```'````!@`G'```!P`` +M``8`-!P```<````&`$T<```'````!@!5'```!P````8`71P```<````&`&4< +M```'````!@"+'```!P````8`E1P```<````&`*(<```'````!@"O'```!P`` +M``8`R!P```<````&`-`<```'````!@#8'```!P````8`X!P```<````&``8= +M```'````!@`0'0``!P````8`'1T```<````&`"H=```'````!@!#'0``!P`` +M``8`2QT```<````&`%,=```'````!@!;'0``!P````8`@1T```<````&`(L= +M```'````!@"8'0``!P````8`I1T```<````&`+X=```'````!@#&'0``!P`` +M``8`SAT```<````&`-8=```'````!@#\'0``!P````8`!AX```<````&`!,> +M```'````!@`@'@``!P````8`.1X```<````&`$$>```'````!@!)'@``!P`` +M``8`41X```<````&`'<>```'````!@"!'@``!P````8`CAX```<````&`)L> +M```'````!@"T'@``!P````8`O!X```<````&`,0>```'````!@#,'@``!P`` +M``8`\AX```<````&`/P>```'````!@`)'P``!P````8`%A\```<````&`"\? +M```'````!@`W'P``!P````8`/Q\```<````&`$<?```'````!@!M'P``!P`` +M``8`=Q\```<````&`(0?```'````!@"1'P``!P````8`JA\```<````&`+(? +M```'````!@"Z'P``!P````8`PA\```<````&`"YF:6QE`````````/[_``!G +M`BY<8W)Y<'1O7&1E<UQA<VU<=VEN,S(N87-M`````````````"YT97AT```` +M``````$````#`=PA`````@```````````````"YD871A``````````(````# +M`0`````````````````````````````$```````````````"```````1```` +M``````$`(``"```````>````/1````$`(``"```````L````W!\```$`(``" +M```````Z````W"````$`(``"`$@```!?9&5S7U-0=')A;G,`7V1E<U]E;F-R +M>7!T`%]D97-?96YC<GEP=#(`7V1E<U]E;F-R>7!T,P!?9&5S7V1E8W)Y<'0S +!```` +` +end diff --git a/crypto/libdes/asm/x86ms.pl b/crypto/libdes/asm/x86ms.pl new file mode 100644 index 000000000000..18b11864c1e2 --- /dev/null +++ b/crypto/libdes/asm/x86ms.pl @@ -0,0 +1,223 @@ +#!/usr/local/bin/perl + +package x86ms; + +$label="L000"; + +%lb=(	'eax',	'al', +	'ebx',	'bl', +	'ecx',	'cl', +	'edx',	'dl', +	'ax',	'al', +	'bx',	'bl', +	'cx',	'cl', +	'dx',	'dl', +	); + +%hb=(	'eax',	'ah', +	'ebx',	'bh', +	'ecx',	'ch', +	'edx',	'dh', +	'ax',	'ah', +	'bx',	'bh', +	'cx',	'ch', +	'dx',	'dh', +	); + +sub main'LB +	{ +	(defined($lb{$_[0]})) || die "$_[0] does not have a 'low byte'\n"; +	return($lb{$_[0]}); +	} + +sub main'HB +	{ +	(defined($hb{$_[0]})) || die "$_[0] does not have a 'high byte'\n"; +	return($hb{$_[0]}); +	} + +sub main'DWP +	{ +	local($addr,$reg1,$reg2,$idx)=@_; +	local($t); +	local($ret)="DWORD PTR "; + +	$addr =~ s/^\s+//; +	if ($addr =~ /^(.+)\+(.+)$/) +		{ +		$reg2=&conv($1); +		$addr="_$2"; +		} +	elsif ($addr =~ /^[_a-zA-Z]/) +		{ +		$addr="_$addr"; +		} + +	$reg1="$regs{$reg1}" if defined($regs{$reg1}); +	$reg2="$regs{$reg2}" if defined($regs{$reg2}); +	$ret.=$addr if ($addr ne "") && ($addr ne 0); +	if ($reg2 ne "") +		{ +		$t=""; +		$t="*$idx" if ($idx != 0); +		$ret.="[$reg2$t+$reg1]"; +		} +	else +		{ +		$ret.="[$reg1]" +		} +	return($ret); +	} + +sub main'mov	{ &out2("mov",@_); } +sub main'movb	{ &out2("mov",@_); } +sub main'and	{ &out2("and",@_); } +sub main'or	{ &out2("or",@_); } +sub main'shl	{ &out2("shl",@_); } +sub main'shr	{ &out2("shr",@_); } +sub main'xor	{ &out2("xor",@_); } +sub main'add	{ &out2("add",@_); } +sub main'sub	{ &out2("sub",@_); } +sub main'rotl	{ &out2("rol",@_); } +sub main'rotr	{ &out2("ror",@_); } +sub main'exch	{ &out2("xchg",@_); } +sub main'cmp	{ &out2("cmp",@_); } +sub main'dec	{ &out1("dec",@_); } +sub main'jmp	{ &out1("jmp",@_); } +sub main'je	{ &out1("je",@_); } +sub main'jz	{ &out1("jz",@_); } +sub main'push	{ &out1("push",@_); } +sub main'call	{ &out1("call",'_'.$_[0]); } + + +sub out2 +	{ +	local($name,$p1,$p2)=@_; +	local($l,$t); + +	print "\t$name\t"; +	$t=&conv($p1).","; +	$l=length($t); +	print $t; +	$l=4-($l+9)/8; +	print "\t" x $l; +	print &conv($p2); +	print "\n"; +	} + +sub out1 +	{ +	local($name,$p1)=@_; +	local($l,$t); + +	print "\t$name\t"; +	print &conv($p1); +	print "\n"; +	} + +sub conv +	{ +	local($p)=@_; + +	$p =~ s/0x([0-9A-Fa-f]+)/0$1h/; +	return $p; +	} + +sub main'file +	{ +	local($file)=@_; + +	print <<"EOF"; +	TITLE	$file.asm +        .386 +.model FLAT +EOF +	} + +sub main'function_begin +	{ +	local($func,$num)=@_; + +	$params=$num*4; + +	print <<"EOF"; +_TEXT	SEGMENT +PUBLIC	_$func +EXTRN	_des_SPtrans:DWORD +_$func PROC NEAR +	push	ebp +	push	ebx +	push	esi +	push	edi +EOF +	$stack=20; +	} + +sub main'function_end +	{ +	local($func)=@_; + +	print <<"EOF"; +	pop	edi +	pop	esi +	pop	ebx +	pop	ebp +	ret +_$func ENDP +_TEXT	ENDS +EOF +	$stack=0; +	%label=(); +	} + +sub main'file_end +	{ +	print "END\n" +	} + +sub main'wparam +	{ +	local($num)=@_; + +	return(&main'DWP($stack+$num*4,"esp","",0)); +	} + +sub main'wtmp +	{ +	local($num)=@_; + +	return(&main'DWP($stack+$params+$num*4,"esp","",0)); +	} + +sub main'comment +	{ +	foreach (@_) +		{ +		print "\t; $_\n"; +		} +	} + +sub main'label +	{ +	if (!defined($label{$_[0]})) +		{ +		$label{$_[0]}="\$${label}${_[0]}"; +		$label++; +		} +	return($label{$_[0]}); +	} + +sub main'set_label +	{ +	if (!defined($label{$_[0]})) +		{ +		$label{$_[0]}="${label}${_[0]}"; +		$label++; +		} +	print "$label{$_[0]}:\n"; +	} + +sub main'file_end +        { +	print "END\n"; +        } diff --git a/crypto/libdes/asm/x86unix.pl b/crypto/libdes/asm/x86unix.pl new file mode 100644 index 000000000000..2048a9cc3ade --- /dev/null +++ b/crypto/libdes/asm/x86unix.pl @@ -0,0 +1,253 @@ +#!/usr/local/bin/perl + +package x86ms; + +$label="L000"; + +$align=($main'aout)?"4":"16"; +$under=($main'aout)?"_":""; +$com_start=($main'sol)?"/":"#"; + +if ($main'cpp) +	{ +	$align="ALIGN"; +	$under=""; +	$com_start='/*'; +	$com_end='*/'; +	} + +%lb=(	'eax',	'%al', +	'ebx',	'%bl', +	'ecx',	'%cl', +	'edx',	'%dl', +	'ax',	'%al', +	'bx',	'%bl', +	'cx',	'%cl', +	'dx',	'%dl', +	); + +%hb=(	'eax',	'%ah', +	'ebx',	'%bh', +	'ecx',	'%ch', +	'edx',	'%dh', +	'ax',	'%ah', +	'bx',	'%bh', +	'cx',	'%ch', +	'dx',	'%dh', +	); + +%regs=(	'eax',	'%eax', +	'ebx',	'%ebx', +	'ecx',	'%ecx', +	'edx',	'%edx', +	'esi',	'%esi', +	'edi',	'%edi', +	'ebp',	'%ebp', +	'esp',	'%esp', +	); + +sub main'LB +	{ +	(defined($lb{$_[0]})) || die "$_[0] does not have a 'low byte'\n"; +	return($lb{$_[0]}); +	} + +sub main'HB +	{ +	(defined($hb{$_[0]})) || die "$_[0] does not have a 'high byte'\n"; +	return($hb{$_[0]}); +	} + +sub main'DWP +	{ +	local($addr,$reg1,$reg2,$idx)=@_; + + +	$ret=""; + +	$addr =~ s/(^|[+ \t])([A-Za-z_]+)($|[+ \t])/$1$under$2$3/; + +	$reg1="$regs{$reg1}" if defined($regs{$reg1}); +	$reg2="$regs{$reg2}" if defined($regs{$reg2}); +	$ret.=$addr if ($addr ne "") && ($addr ne 0); +	if ($reg2 ne "") +		{ +		$ret.="($reg1,$reg2,$idx)"; +		} +	else +		{ +		$ret.="($reg1)" +		} +	return($ret); +	} + +sub main'mov	{ &out2("movl",@_); } +sub main'movb	{ &out2("movb",@_); } +sub main'and	{ &out2("andl",@_); } +sub main'or	{ &out2("orl",@_); } +sub main'shl	{ &out2("shll",@_); } +sub main'shr	{ &out2("shrl",@_); } +sub main'xor	{ &out2("xorl",@_); } +sub main'add	{ &out2("addl",@_); } +sub main'sub	{ &out2("subl",@_); } +sub main'rotl	{ &out2("roll",@_); } +sub main'rotr	{ &out2("rorl",@_); } +sub main'exch	{ &out2("xchg",@_); } +sub main'cmp	{ &out2("cmpl",@_); } +sub main'jmp	{ &out1("jmp",@_); } +sub main'je	{ &out1("je",@_); } +sub main'jne	{ &out1("jne",@_); } +sub main'jnz	{ &out1("jnz",@_); } +sub main'dec	{ &out1("decl",@_); } +sub main'push	{ &out1("pushl",@_); } +sub main'call	{ &out1("call",$under.$_[0]); } + + +sub out2 +	{ +	local($name,$p1,$p2)=@_; +	local($l,$ll,$t); + +	print "\t$name\t"; +	$t=&conv($p2).","; +	$l=length($t); +	print $t; +	$ll=4-($l+9)/8; +	print "\t" x $ll; +	print &conv($p1); +	print "\n"; +	} + +sub out1 +	{ +	local($name,$p1)=@_; +	local($l,$t); + +	print "\t$name\t"; +	print &conv($p1); +	print "\n"; +	} + +sub conv +	{ +	local($p)=@_; + +#	$p =~ s/0x([0-9A-Fa-f]+)/0$1h/; + +	$p=$regs{$p} if (defined($regs{$p})); + +	$p =~ s/^([0-9A-Fa-f]+)$/\$$1/; +	$p =~ s/^(0x[0-9A-Fa-f]+)$/\$$1/; +	return $p; +	} + +sub main'file +	{ +	local($file)=@_; + +	print <<"EOF"; +	.file	"$file.s" +	.version	"01.01" +gcc2_compiled.: +EOF +	} + +sub main'function_begin +	{ +	local($func,$num)=@_; + +	$params=$num*4; + +	$func=$under.$func; + +	print <<"EOF"; +.text +	.align $align +.globl $func +EOF +	if ($main'cpp) +		{ printf("\tTYPE($func,\@function)\n"); } +	else	{ printf("\t.type	$func,\@function\n"); } +	print <<"EOF"; +$func: +	pushl	%ebp +	pushl	%ebx +	pushl	%esi +	pushl	%edi + +EOF +	$stack=20; +	} + +sub main'function_end +	{ +	local($func)=@_; + +	$func=$under.$func; + +	print <<"EOF"; +	popl	%edi +	popl	%esi +	popl	%ebx +	popl	%ebp +	ret +.${func}_end: +EOF +	if ($main'cpp) +		{ printf("\tSIZE($func,.${func}_end-$func)\n"); } +	else	{ printf("\t.size\t$func,.${func}_end-$func\n"); } +	print ".ident	\"desasm.pl\"\n"; +	$stack=0; +	%label=(); +	} + + +sub main'wparam +	{ +	local($num)=@_; + +	return(&main'DWP($stack+$num*4,"esp","",0)); +	} + +sub main'wtmp +	{ +	local($num)=@_; + +	return(&main'DWP(-($num+1)*4,"esp","",0)); +	} + +sub main'comment +	{ +	foreach (@_) +		{ +		if (/^\s*$/) +			{ print "\n"; } +		else +			{ print "\t$com_start $_ $com_end\n"; } +		} +	} + +sub main'label +	{ +	if (!defined($label{$_[0]})) +		{ +		$label{$_[0]}=".${label}${_[0]}"; +		$label++; +		} +	return($label{$_[0]}); +	} + +sub main'set_label +	{ +	if (!defined($label{$_[0]})) +		{ +		$label{$_[0]}=".${label}${_[0]}"; +		$label++; +		} +	print ".align $align\n"; +	print "$label{$_[0]}:\n"; +	} + +sub main'file_end +	{ +	} diff --git a/crypto/libdes/cbc3_enc.c b/crypto/libdes/cbc3_enc.c new file mode 100644 index 000000000000..3b3f2821d250 --- /dev/null +++ b/crypto/libdes/cbc3_enc.c @@ -0,0 +1,99 @@ +/* crypto/des/cbc3_enc.c */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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 "des_locl.h" + +/* HAS BUGS? DON'T USE */ +void des_3cbc_encrypt(input, output, length, ks1, ks2, iv1, iv2, encrypt) +des_cblock (*input); +des_cblock (*output); +long length; +des_key_schedule ks1; +des_key_schedule ks2; +des_cblock (*iv1); +des_cblock (*iv2); +int encrypt; +	{ +	int off=((int)length-1)/8; +	long l8=((length+7)/8)*8; +	des_cblock niv1,niv2; + +	if (encrypt == DES_ENCRYPT) +		{ +		des_cbc_encrypt(input,output,length,ks1,iv1,encrypt); +		if (length >= sizeof(des_cblock)) +			memcpy(niv1,output[off],sizeof(des_cblock)); +		des_cbc_encrypt(output,output,l8,ks2,iv1,!encrypt); +		des_cbc_encrypt(output,output,l8,ks1,iv2, encrypt); +		if (length >= sizeof(des_cblock)) +			memcpy(niv2,output[off],sizeof(des_cblock)); +		} +	else +		{ +		if (length >= sizeof(des_cblock)) +			memcpy(niv2,input[off],sizeof(des_cblock)); +		des_cbc_encrypt(input,output,l8,ks1,iv2,encrypt); +		des_cbc_encrypt(output,output,l8,ks2,iv1,!encrypt); +		if (length >= sizeof(des_cblock)) +			memcpy(niv1,output[off],sizeof(des_cblock)); +		des_cbc_encrypt(output,output,length,ks1,iv1, encrypt); +		} +	memcpy(*iv1,niv1,sizeof(des_cblock)); +	memcpy(*iv2,niv2,sizeof(des_cblock)); +	} + diff --git a/crypto/libdes/cbc_cksm.c b/crypto/libdes/cbc_cksm.c new file mode 100644 index 000000000000..5dfa9b8a613c --- /dev/null +++ b/crypto/libdes/cbc_cksm.c @@ -0,0 +1,103 @@ +/* crypto/des/cbc_cksm.c */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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 "des_locl.h" + +DES_LONG des_cbc_cksum(input, output, length, schedule, ivec) +des_cblock (*input); +des_cblock (*output); +long length; +des_key_schedule schedule; +des_cblock (*ivec); +	{ +	register DES_LONG tout0,tout1,tin0,tin1; +	register long l=length; +	DES_LONG tin[2]; +	unsigned char *in,*out,*iv; + +	in=(unsigned char *)input; +	out=(unsigned char *)output; +	iv=(unsigned char *)ivec; + +	c2l(iv,tout0); +	c2l(iv,tout1); +	for (; l>0; l-=8) +		{ +		if (l >= 8) +			{ +			c2l(in,tin0); +			c2l(in,tin1); +			} +		else +			c2ln(in,tin0,tin1,l); +			 +		tin0^=tout0; tin[0]=tin0; +		tin1^=tout1; tin[1]=tin1; +		des_encrypt((DES_LONG *)tin,schedule,DES_ENCRYPT); +		/* fix 15/10/91 eay - thanks to keithr@sco.COM */ +		tout0=tin[0]; +		tout1=tin[1]; +		} +	if (out != NULL) +		{ +		l2c(tout0,out); +		l2c(tout1,out); +		} +	tout0=tin0=tin1=tin[0]=tin[1]=0; +	return(tout1); +	} diff --git a/crypto/libdes/cbc_enc.c b/crypto/libdes/cbc_enc.c new file mode 100644 index 000000000000..e7a90ce98523 --- /dev/null +++ b/crypto/libdes/cbc_enc.c @@ -0,0 +1,135 @@ +/* crypto/des/cbc_enc.c */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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 "des_locl.h" + +void 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; +	{ +	register DES_LONG tin0,tin1; +	register DES_LONG tout0,tout1,xor0,xor1; +	register unsigned char *in,*out; +	register long l=length; +	DES_LONG tin[2]; +	unsigned char *iv; + +	in=(unsigned char *)input; +	out=(unsigned char *)output; +	iv=(unsigned char *)ivec; + +	if (encrypt) +		{ +		c2l(iv,tout0); +		c2l(iv,tout1); +		for (l-=8; l>=0; l-=8) +			{ +			c2l(in,tin0); +			c2l(in,tin1); +			tin0^=tout0; tin[0]=tin0; +			tin1^=tout1; tin[1]=tin1; +			des_encrypt((DES_LONG *)tin,schedule,DES_ENCRYPT); +			tout0=tin[0]; l2c(tout0,out); +			tout1=tin[1]; l2c(tout1,out); +			} +		if (l != -8) +			{ +			c2ln(in,tin0,tin1,l+8); +			tin0^=tout0; tin[0]=tin0; +			tin1^=tout1; tin[1]=tin1; +			des_encrypt((DES_LONG *)tin,schedule,DES_ENCRYPT); +			tout0=tin[0]; l2c(tout0,out); +			tout1=tin[1]; l2c(tout1,out); +			} +		} +	else +		{ +		c2l(iv,xor0); +		c2l(iv,xor1); +		for (l-=8; l>=0; l-=8) +			{ +			c2l(in,tin0); tin[0]=tin0; +			c2l(in,tin1); tin[1]=tin1; +			des_encrypt((DES_LONG *)tin,schedule,DES_DECRYPT); +			tout0=tin[0]^xor0; +			tout1=tin[1]^xor1; +			l2c(tout0,out); +			l2c(tout1,out); +			xor0=tin0; +			xor1=tin1; +			} +		if (l != -8) +			{ +			c2l(in,tin0); tin[0]=tin0; +			c2l(in,tin1); tin[1]=tin1; +			des_encrypt((DES_LONG *)tin,schedule,DES_DECRYPT); +			tout0=tin[0]^xor0; +			tout1=tin[1]^xor1; +			l2cn(tout0,tout1,out,l+8); +		/*	xor0=tin0; +			xor1=tin1; */ +			} +		} +	tin0=tin1=tout0=tout1=xor0=xor1=0; +	tin[0]=tin[1]=0; +	} + diff --git a/crypto/libdes/cfb64ede.c b/crypto/libdes/cfb64ede.c new file mode 100644 index 000000000000..b1e127a1e87a --- /dev/null +++ b/crypto/libdes/cfb64ede.c @@ -0,0 +1,151 @@ +/* crypto/des/cfb64ede.c */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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 "des_locl.h" + +/* The input and output encrypted as though 64bit cfb mode is being + * used.  The extra state information to record how much of the + * 64bit block we have used is contained in *num; + */ + +void des_ede3_cfb64_encrypt(in, out, length, ks1,ks2,ks3, ivec, num, encrypt) +unsigned char *in; +unsigned char *out; +long length; +des_key_schedule ks1,ks2,ks3; +des_cblock (*ivec); +int *num; +int encrypt; +	{ +	register DES_LONG v0,v1; +	register long l=length; +	register int n= *num; +	DES_LONG ti[2]; +	unsigned char *iv,c,cc; + +	iv=(unsigned char *)ivec; +	if (encrypt) +		{ +		while (l--) +			{ +			if (n == 0) +				{ +				c2l(iv,v0); +				c2l(iv,v1); + +				ti[0]=v0; +				ti[1]=v1; +				des_encrypt3((DES_LONG *)ti,ks1,ks2,ks3); +				v0=ti[0]; +				v1=ti[1]; + +				iv=(unsigned char *)ivec; +				l2c(v0,iv); +				l2c(v1,iv); +				iv=(unsigned char *)ivec; +				} +			c= *(in++)^iv[n]; +			*(out++)=c; +			iv[n]=c; +			n=(n+1)&0x07; +			} +		} +	else +		{ +		while (l--) +			{ +			if (n == 0) +				{ +				c2l(iv,v0); +				c2l(iv,v1); + +				ti[0]=v0; +				ti[1]=v1; +				des_encrypt3((DES_LONG *)ti,ks1,ks2,ks3); +				v0=ti[0]; +				v1=ti[1]; + +				iv=(unsigned char *)ivec; +				l2c(v0,iv); +				l2c(v1,iv); +				iv=(unsigned char *)ivec; +				} +			cc= *(in++); +			c=iv[n]; +			iv[n]=cc; +			*(out++)=c^cc; +			n=(n+1)&0x07; +			} +		} +	v0=v1=ti[0]=ti[1]=c=cc=0; +	*num=n; +	} + +#ifdef undef /* MACRO */ +void des_ede2_cfb64_encrypt(in, out, length, ks1,ks2, ivec, num, encrypt) +unsigned char *in; +unsigned char *out; +long length; +des_key_schedule ks1,ks2; +des_cblock (*ivec); +int *num; +int encrypt; +	{ +	des_ede3_cfb64_encrypt(in,out,length,ks1,ks2,ks1,ivec,num,encrypt); +	} +#endif diff --git a/crypto/libdes/cfb64enc.c b/crypto/libdes/cfb64enc.c new file mode 100644 index 000000000000..66c944a82d4d --- /dev/null +++ b/crypto/libdes/cfb64enc.c @@ -0,0 +1,128 @@ +/* crypto/des/cfb64enc.c */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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 "des_locl.h" + +/* The input and output encrypted as though 64bit cfb mode is being + * used.  The extra state information to record how much of the + * 64bit block we have used is contained in *num; + */ + +void des_cfb64_encrypt(in, out, length, schedule, ivec, num, encrypt) +unsigned char *in; +unsigned char *out; +long length; +des_key_schedule schedule; +des_cblock (*ivec); +int *num; +int encrypt; +	{ +	register DES_LONG v0,v1; +	register long l=length; +	register int n= *num; +	DES_LONG ti[2]; +	unsigned char *iv,c,cc; + +	iv=(unsigned char *)ivec; +	if (encrypt) +		{ +		while (l--) +			{ +			if (n == 0) +				{ +				c2l(iv,v0); ti[0]=v0; +				c2l(iv,v1); ti[1]=v1; +				des_encrypt((DES_LONG *)ti, +					schedule,DES_ENCRYPT); +				iv=(unsigned char *)ivec; +				v0=ti[0]; l2c(v0,iv); +				v0=ti[1]; l2c(v0,iv); +				iv=(unsigned char *)ivec; +				} +			c= *(in++)^iv[n]; +			*(out++)=c; +			iv[n]=c; +			n=(n+1)&0x07; +			} +		} +	else +		{ +		while (l--) +			{ +			if (n == 0) +				{ +				c2l(iv,v0); ti[0]=v0; +				c2l(iv,v1); ti[1]=v1; +				des_encrypt((DES_LONG *)ti, +					schedule,DES_ENCRYPT); +				iv=(unsigned char *)ivec; +				v0=ti[0]; l2c(v0,iv); +				v0=ti[1]; l2c(v0,iv); +				iv=(unsigned char *)ivec; +				} +			cc= *(in++); +			c=iv[n]; +			iv[n]=cc; +			*(out++)=c^cc; +			n=(n+1)&0x07; +			} +		} +	v0=v1=ti[0]=ti[1]=c=cc=0; +	*num=n; +	} + diff --git a/crypto/libdes/cfb_enc.c b/crypto/libdes/cfb_enc.c new file mode 100644 index 000000000000..52a360dcb3f8 --- /dev/null +++ b/crypto/libdes/cfb_enc.c @@ -0,0 +1,171 @@ +/* crypto/des/cfb_enc.c */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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 "des_locl.h" + +/* The input and output are loaded in multiples of 8 bits. + * What this means is that if you hame numbits=12 and length=2 + * the first 12 bits will be retrieved from the first byte and half + * the second.  The second 12 bits will come from the 3rd and half the 4th + * byte. + */ +void des_cfb_encrypt(in, out, numbits, length, schedule, ivec, encrypt) +unsigned char *in; +unsigned char *out; +int numbits; +long length; +des_key_schedule schedule; +des_cblock (*ivec); +int encrypt; +	{ +	register DES_LONG d0,d1,v0,v1,n=(numbits+7)/8; +	register DES_LONG mask0,mask1; +	register unsigned long l=length; +	register int num=numbits; +	DES_LONG ti[2]; +	unsigned char *iv; + +	if (num > 64) return; +	if (num > 32) +		{ +		mask0=0xffffffffL; +		if (num == 64) +			mask1=mask0; +		else	mask1=(1L<<(num-32))-1; +		} +	else +		{ +		if (num == 32) +			mask0=0xffffffffL; +		else	mask0=(1L<<num)-1; +		mask1=0x00000000; +		} + +	iv=(unsigned char *)ivec; +	c2l(iv,v0); +	c2l(iv,v1); +	if (encrypt) +		{ +		while (l >= n) +			{ +			l-=n; +			ti[0]=v0; +			ti[1]=v1; +			des_encrypt((DES_LONG *)ti,schedule,DES_ENCRYPT); +			c2ln(in,d0,d1,n); +			in+=n; +			d0=(d0^ti[0])&mask0; +			d1=(d1^ti[1])&mask1; +			l2cn(d0,d1,out,n); +			out+=n; +			/* 30-08-94 - eay - changed because l>>32 and +			 * l<<32 are bad under gcc :-( */ +			if (num == 32) +				{ v0=v1; v1=d0; } +			else if (num == 64) +				{ v0=d0; v1=d1; } +			else if (num > 32) /* && num != 64 */ +				{ +				v0=((v1>>(num-32))|(d0<<(64-num)))&0xffffffffL; +				v1=((d0>>(num-32))|(d1<<(64-num)))&0xffffffffL; +				} +			else /* num < 32 */ +				{ +				v0=((v0>>num)|(v1<<(32-num)))&0xffffffffL; +				v1=((v1>>num)|(d0<<(32-num)))&0xffffffffL; +				} +			} +		} +	else +		{ +		while (l >= n) +			{ +			l-=n; +			ti[0]=v0; +			ti[1]=v1; +			des_encrypt((DES_LONG *)ti,schedule,DES_ENCRYPT); +			c2ln(in,d0,d1,n); +			in+=n; +			/* 30-08-94 - eay - changed because l>>32 and +			 * l<<32 are bad under gcc :-( */ +			if (num == 32) +				{ v0=v1; v1=d0; } +			else if (num == 64) +				{ v0=d0; v1=d1; } +			else if (num > 32) /* && num != 64 */ +				{ +				v0=((v1>>(num-32))|(d0<<(64-num)))&0xffffffffL; +				v1=((d0>>(num-32))|(d1<<(64-num)))&0xffffffffL; +				} +			else /* num < 32 */ +				{ +				v0=((v0>>num)|(v1<<(32-num)))&0xffffffffL; +				v1=((v1>>num)|(d0<<(32-num)))&0xffffffffL; +				} +			d0=(d0^ti[0])&mask0; +			d1=(d1^ti[1])&mask1; +			l2cn(d0,d1,out,n); +			out+=n; +			} +		} +	iv=(unsigned char *)ivec; +	l2c(v0,iv); +	l2c(v1,iv); +	v0=v1=d0=d1=ti[0]=ti[1]=0; +	} + diff --git a/crypto/libdes/des.c b/crypto/libdes/des.c new file mode 100644 index 000000000000..a8d0bc5e2108 --- /dev/null +++ b/crypto/libdes/des.c @@ -0,0 +1,959 @@ +/* crypto/des/des.c */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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.] + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif +#ifdef HAVE_IO_H +#include <io.h> +#endif + +#include <time.h> +#include "des_ver.h" + +#ifdef VMS +#include <types.h> +#include <stat.h> +#endif +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_STAT_H +#include <sys/stat.h> +#endif +#include "des.h" + +#ifndef HAVE_RANDOM +#define random rand +#define srandom(s) srand(s) +#endif + +#ifndef NOPROTO +void usage(void); +void doencryption(void); +int uufwrite(unsigned char *data, int size, unsigned int num, FILE *fp); +void uufwriteEnd(FILE *fp); +int uufread(unsigned char *out,int size,unsigned int num,FILE *fp); +int uuencode(unsigned char *in,int num,unsigned char *out); +int uudecode(unsigned char *in,int num,unsigned char *out); +#else +void usage(); +void doencryption(); +int uufwrite(); +void uufwriteEnd(); +int uufread(); +int uuencode(); +int uudecode(); +#endif + +#ifdef VMS +#define EXIT(a) exit(a&0x10000000) +#else +#define EXIT(a) exit(a) +#endif + +#define BUFSIZE (8*1024) +#define VERIFY  1 +#define KEYSIZ	8 +#define KEYSIZB 1024 /* should hit tty line limit first :-) */ +char key[KEYSIZB+1]; +int do_encrypt,longk=0; +FILE *DES_IN,*DES_OUT,*CKSUM_OUT; +char uuname[200]; +unsigned char uubuf[50]; +int uubufnum=0; +#define INUUBUFN	(45*100) +#define OUTUUBUF	(65*100) +unsigned char b[OUTUUBUF]; +unsigned char bb[300]; +des_cblock cksum={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; +char cksumname[200]=""; + +int vflag,cflag,eflag,dflag,kflag,bflag,fflag,sflag,uflag,flag3,hflag,error; + +int main(argc, argv) +int argc; +char **argv; +	{ +	int i; +	struct stat ins,outs; +	char *p; +	char *in=NULL,*out=NULL; + +	vflag=cflag=eflag=dflag=kflag=hflag=bflag=fflag=sflag=uflag=flag3=0; +	error=0; +	memset(key,0,sizeof(key)); + +	for (i=1; i<argc; i++) +		{ +		p=argv[i]; +		if ((p[0] == '-') && (p[1] != '\0')) +			{ +			p++; +			while (*p) +				{ +				switch (*(p++)) +					{ +				case '3': +					flag3=1; +					longk=1; +					break; +				case 'c': +					cflag=1; +					strncpy(cksumname,p,200); +					p+=strlen(cksumname); +					break; +				case 'C': +					cflag=1; +					longk=1; +					strncpy(cksumname,p,200); +					p+=strlen(cksumname); +					break; +				case 'e': +					eflag=1; +					break; +				case 'v': +					vflag=1; +					break; +				case 'E': +					eflag=1; +					longk=1; +					break; +				case 'd': +					dflag=1; +					break; +				case 'D': +					dflag=1; +					longk=1; +					break; +				case 'b': +					bflag=1; +					break; +				case 'f': +					fflag=1; +					break; +				case 's': +					sflag=1; +					break; +				case 'u': +					uflag=1; +					strncpy(uuname,p,200); +					p+=strlen(uuname); +					break; +				case 'h': +					hflag=1; +					break; +				case 'k': +					kflag=1; +					if ((i+1) == argc) +						{ +						fputs("must have a key with the -k option\n",stderr); +						error=1; +						} +					else +						{ +						int j; + +						i++; +						strncpy(key,argv[i],KEYSIZB); +						for (j=strlen(argv[i])-1; j>=0; j--) +							argv[i][j]='\0'; +						} +					break; +				default: +					fprintf(stderr,"'%c' unknown flag\n",p[-1]); +					error=1; +					break; +					} +				} +			} +		else +			{ +			if (in == NULL) +				in=argv[i]; +			else if (out == NULL) +				out=argv[i]; +			else +				error=1; +			} +		} +	if (error) usage(); +	/* We either +	 * do checksum or +	 * do encrypt or +	 * do decrypt or +	 * do decrypt then ckecksum or +	 * do checksum then encrypt +	 */ +	if (((eflag+dflag) == 1) || cflag) +		{ +		if (eflag) do_encrypt=DES_ENCRYPT; +		if (dflag) do_encrypt=DES_DECRYPT; +		} +	else +		{ +		if (vflag)  +			{ +#ifndef _Windows			 +			fprintf(stderr,"des(1) built with %s\n",libdes_version); +#endif			 +			EXIT(1); +			} +		else usage(); +		} + +#ifndef _Windows			 +	if (vflag) fprintf(stderr,"des(1) built with %s\n",libdes_version); +#endif			 +	if (	(in != NULL) && +		(out != NULL) && +#ifndef MSDOS +		(stat(in,&ins) != -1) && +		(stat(out,&outs) != -1) && +		(ins.st_dev == outs.st_dev) && +		(ins.st_ino == outs.st_ino)) +#else /* MSDOS */ +		(strcmp(in,out) == 0)) +#endif +			{ +			fputs("input and output file are the same\n",stderr); +			EXIT(3); +			} + +	if (!kflag) +		if (des_read_pw_string(key,KEYSIZB+1,"Enter key:",eflag?VERIFY:0)) +			{ +			fputs("password error\n",stderr); +			EXIT(2); +			} + +	if (in == NULL) +		DES_IN=stdin; +	else if ((DES_IN=fopen(in,"r")) == NULL) +		{ +		perror("opening input file"); +		EXIT(4); +		} + +	CKSUM_OUT=stdout; +	if (out == NULL) +		{ +		DES_OUT=stdout; +		CKSUM_OUT=stderr; +		} +	else if ((DES_OUT=fopen(out,"w")) == NULL) +		{ +		perror("opening output file"); +		EXIT(5); +		} + +#ifdef MSDOS +	/* This should set the file to binary mode. */ +	{ +#include <fcntl.h> +	if (!(uflag && dflag)) +		setmode(fileno(DES_IN),O_BINARY); +	if (!(uflag && eflag)) +		setmode(fileno(DES_OUT),O_BINARY); +	} +#endif + +	doencryption(); +	fclose(DES_IN); +	fclose(DES_OUT); +	EXIT(0); +	} + +void usage() +	{ +	char **u; +	static const char *Usage[]={ +"des <options> [input-file [output-file]]", +"options:", +"-v         : des(1) version number", +"-e         : encrypt using sunOS compatible user key to DES key conversion.", +"-E         : encrypt ", +"-d         : decrypt using sunOS compatible user key to DES key conversion.", +"-D         : decrypt ", +"-c[ckname] : generate a cbc_cksum using sunOS compatible user key to", +"             DES key conversion and output to ckname (stdout default,", +"             stderr if data being output on stdout).  The checksum is", +"             generated before encryption and after decryption if used", +"             in conjunction with -[eEdD].", +"-C[ckname] : generate a cbc_cksum as for -c but compatible with -[ED].", +"-k key     : use key 'key'", +"-h         : the key that is entered will be a hexidecimal number", +"             that is used directly as the des key", +"-u[uuname] : input file is uudecoded if -[dD] or output uuencoded data if -[eE]", +"             (uuname is the filename to put in the uuencode header).", +"-b         : encrypt using DES in ecb encryption mode, the defaut is cbc mode.", +"-3         : encrypt using tripple DES encryption.  This uses 2 keys", +"             generated from the input key.  If the input key is less", +"             than 8 characters long, this is equivelent to normal", +"             encryption.  Default is tripple cbc, -b makes it tripple ecb.", +NULL +}; +	for (u=(char **)Usage; *u; u++) +		{ +		fputs(*u,stderr); +		fputc('\n',stderr); +		} + +	EXIT(1); +	} + +void doencryption() +	{ +#ifdef _LIBC +	extern int srandom(); +	extern int random(); +	extern unsigned long time(); +#endif + +	register int i; +	des_key_schedule ks,ks2; +	unsigned char iv[8],iv2[8]; +	char *p; +	int num=0,j,k,l,rem,ll,len,last,ex=0; +	des_cblock kk,k2; +	FILE *O; +	int Exit=0; +#ifndef MSDOS +	static unsigned char buf[BUFSIZE+8],obuf[BUFSIZE+8]; +#else +	static unsigned char *buf=NULL,*obuf=NULL; + +	if (buf == NULL) +		{ +		if (    (( buf=(unsigned char *)Malloc(BUFSIZE+8)) == NULL) || +			((obuf=(unsigned char *)Malloc(BUFSIZE+8)) == NULL)) +			{ +			fputs("Not enough memory\n",stderr); +			Exit=10; +			goto problems; +			} +		} +#endif + +	if (hflag) +		{ +		j=(flag3?16:8); +		p=key; +		for (i=0; i<j; i++) +			{ +			k=0; +			if ((*p <= '9') && (*p >= '0')) +				k=(*p-'0')<<4; +			else if ((*p <= 'f') && (*p >= 'a')) +				k=(*p-'a'+10)<<4; +			else if ((*p <= 'F') && (*p >= 'A')) +				k=(*p-'A'+10)<<4; +			else +				{ +				fputs("Bad hex key\n",stderr); +				Exit=9; +				goto problems; +				} +			p++; +			if ((*p <= '9') && (*p >= '0')) +				k|=(*p-'0'); +			else if ((*p <= 'f') && (*p >= 'a')) +				k|=(*p-'a'+10); +			else if ((*p <= 'F') && (*p >= 'A')) +				k|=(*p-'A'+10); +			else +				{ +				fputs("Bad hex key\n",stderr); +				Exit=9; +				goto problems; +				} +			p++; +			if (i < 8) +				kk[i]=k; +			else +				k2[i-8]=k; +			} +		des_set_key((C_Block *)k2,ks2); +		memset(k2,0,sizeof(k2)); +		} +	else if (longk || flag3) +		{ +		if (flag3) +			{ +			des_string_to_2keys(key,(C_Block *)kk,(C_Block *)k2); +			des_set_key((C_Block *)k2,ks2); +			memset(k2,0,sizeof(k2)); +			} +		else +			des_string_to_key(key,(C_Block *)kk); +		} +	else +		for (i=0; i<KEYSIZ; i++) +			{ +			l=0; +			k=key[i]; +			for (j=0; j<8; j++) +				{ +				if (k&1) l++; +				k>>=1; +				} +			if (l & 1) +				kk[i]=key[i]&0x7f; +			else +				kk[i]=key[i]|0x80; +			} + +	des_set_key((C_Block *)kk,ks); +	memset(key,0,sizeof(key)); +	memset(kk,0,sizeof(kk)); +	/* woops - A bug that does not showup under unix :-( */ +	memset(iv,0,sizeof(iv)); +	memset(iv2,0,sizeof(iv2)); + +	l=1; +	rem=0; +	/* first read */ +	if (eflag || (!dflag && cflag)) +		{ +		for (;;) +			{ +			num=l=fread(&(buf[rem]),1,BUFSIZE,DES_IN); +			l+=rem; +			num+=rem; +			if (l < 0) +				{ +				perror("read error"); +				Exit=6; +				goto problems; +				} + +			rem=l%8; +			len=l-rem; +			if (feof(DES_IN)) +				{ +				srandom((unsigned int)time(NULL)); +				for (i=7-rem; i>0; i--) +					buf[l++]=random()&0xff; +				buf[l++]=rem; +				ex=1; +				len+=rem; +				} +			else +				l-=rem; + +			if (cflag) +				{ +				des_cbc_cksum((C_Block *)buf,(C_Block *)cksum, +					(long)len,ks,(C_Block *)cksum); +				if (!eflag) +					{ +					if (feof(DES_IN)) break; +					else continue; +					} +				} + +			if (bflag && !flag3) +				for (i=0; i<l; i+=8) +					des_ecb_encrypt( +						(des_cblock *)&(buf[i]), +						(des_cblock *)&(obuf[i]), +						ks,do_encrypt); +			else if (flag3 && bflag) +				for (i=0; i<l; i+=8) +					des_ecb2_encrypt( +						(des_cblock *)&(buf[i]), +						(des_cblock *)&(obuf[i]), +						ks,ks2,do_encrypt); +			else if (flag3 && !bflag) +				{ +				char tmpbuf[8]; + +				if (rem) memcpy(tmpbuf,&(buf[l]), +					(unsigned int)rem); +				des_3cbc_encrypt( +					(des_cblock *)buf,(des_cblock *)obuf, +					(long)l,ks,ks2,(des_cblock *)iv, +					(des_cblock *)iv2,do_encrypt); +				if (rem) memcpy(&(buf[l]),tmpbuf, +					(unsigned int)rem); +				} +			else +				{ +				des_cbc_encrypt( +					(des_cblock *)buf,(des_cblock *)obuf, +					(long)l,ks,(des_cblock *)iv,do_encrypt); +				if (l >= 8) memcpy(iv,&(obuf[l-8]),8); +				} +			if (rem) memcpy(buf,&(buf[l]),(unsigned int)rem); + +			i=0; +			while (i < l) +				{ +				if (uflag) +					j=uufwrite(obuf,1,(unsigned int)l-i, +						DES_OUT); +				else +					j=fwrite(obuf,1,(unsigned int)l-i, +						DES_OUT); +				if (j == -1) +					{ +					perror("Write error"); +					Exit=7; +					goto problems; +					} +				i+=j; +				} +			if (feof(DES_IN)) +				{ +				if (uflag) uufwriteEnd(DES_OUT); +				break; +				} +			} +		} +	else /* decrypt */ +		{ +		ex=1; +		for (;;) +			{ +			if (ex) { +				if (uflag) +					l=uufread(buf,1,BUFSIZE,DES_IN); +				else +					l=fread(buf,1,BUFSIZE,DES_IN); +				ex=0; +				rem=l%8; +				l-=rem; +				} +			if (l < 0) +				{ +				perror("read error"); +				Exit=6; +				goto problems; +				} + +			if (bflag && !flag3) +				for (i=0; i<l; i+=8) +					des_ecb_encrypt( +						(des_cblock *)&(buf[i]), +						(des_cblock *)&(obuf[i]), +						ks,do_encrypt); +			else if (flag3 && bflag) +				for (i=0; i<l; i+=8) +					des_ecb2_encrypt( +						(des_cblock *)&(buf[i]), +						(des_cblock *)&(obuf[i]), +						ks,ks2,do_encrypt); +			else if (flag3 && !bflag) +				{ +				des_3cbc_encrypt( +					(des_cblock *)buf,(des_cblock *)obuf, +					(long)l,ks,ks2,(des_cblock *)iv, +					(des_cblock *)iv2,do_encrypt); +				} +			else +				{ +				des_cbc_encrypt( +					(des_cblock *)buf,(des_cblock *)obuf, +				 	(long)l,ks,(des_cblock *)iv,do_encrypt); +				if (l >= 8) memcpy(iv,&(buf[l-8]),8); +				} + +			if (uflag) +				ll=uufread(&(buf[rem]),1,BUFSIZE,DES_IN); +			else +				ll=fread(&(buf[rem]),1,BUFSIZE,DES_IN); +			ll+=rem; +			rem=ll%8; +			ll-=rem; +			if (feof(DES_IN) && (ll == 0)) +				{ +				last=obuf[l-1]; + +				if ((last > 7) || (last < 0)) +					{ +					fputs("The file was not decrypted correctly.\n", +						stderr); +					Exit=8; +					last=0; +					} +				l=l-8+last; +				} +			i=0; +			if (cflag) des_cbc_cksum((C_Block *)obuf, +				(C_Block *)cksum,(long)l/8*8,ks, +				(C_Block *)cksum); +			while (i != l) +				{ +				j=fwrite(obuf,1,(unsigned int)l-i,DES_OUT); +				if (j == -1) +					{ +					perror("Write error"); +					Exit=7; +					goto problems; +					} +				i+=j; +				} +			l=ll; +			if ((l == 0) && feof(DES_IN)) break; +			} +		} +	if (cflag) +		{ +		l=0; +		if (cksumname[0] != '\0') +			{ +			if ((O=fopen(cksumname,"w")) != NULL) +				{ +				CKSUM_OUT=O; +				l=1; +				} +			} +		for (i=0; i<8; i++) +			fprintf(CKSUM_OUT,"%02X",cksum[i]); +		fprintf(CKSUM_OUT,"\n"); +		if (l) fclose(CKSUM_OUT); +		} +problems: +	memset(buf,0,sizeof(buf)); +	memset(obuf,0,sizeof(obuf)); +	memset(ks,0,sizeof(ks)); +	memset(ks2,0,sizeof(ks2)); +	memset(iv,0,sizeof(iv)); +	memset(iv2,0,sizeof(iv2)); +	memset(kk,0,sizeof(kk)); +	memset(k2,0,sizeof(k2)); +	memset(uubuf,0,sizeof(uubuf)); +	memset(b,0,sizeof(b)); +	memset(bb,0,sizeof(bb)); +	memset(cksum,0,sizeof(cksum)); +	if (Exit) EXIT(Exit); +	} + +int uufwrite(data, size, num, fp) +unsigned char *data; +int size; +unsigned int num; +FILE *fp; +       +     /* We ignore this parameter but it should be > ~50 I believe */ +    +     +	{ +	int i,j,left,rem,ret=num; +	static int start=1; + +	if (start) +		{ +		fprintf(fp,"begin 600 %s\n", +			(uuname[0] == '\0')?"text.d":uuname); +		start=0; +		} + +	if (uubufnum) +		{ +		if (uubufnum+num < 45) +			{ +			memcpy(&(uubuf[uubufnum]),data,(unsigned int)num); +			uubufnum+=num; +			return(num); +			} +		else +			{ +			i=45-uubufnum; +			memcpy(&(uubuf[uubufnum]),data,(unsigned int)i); +			j=uuencode((unsigned char *)uubuf,45,b); +			fwrite(b,1,(unsigned int)j,fp); +			uubufnum=0; +			data+=i; +			num-=i; +			} +		} + +	for (i=0; i<(((int)num)-INUUBUFN); i+=INUUBUFN) +		{ +		j=uuencode(&(data[i]),INUUBUFN,b); +		fwrite(b,1,(unsigned int)j,fp); +		} +	rem=(num-i)%45; +	left=(num-i-rem); +	if (left) +		{ +		j=uuencode(&(data[i]),left,b); +		fwrite(b,1,(unsigned int)j,fp); +		i+=left; +		} +	if (i != num) +		{ +		memcpy(uubuf,&(data[i]),(unsigned int)rem); +		uubufnum=rem; +		} +	return(ret); +	} + +void uufwriteEnd(fp) +FILE *fp; +	{ +	int j; +	static const char *end=" \nend\n"; + +	if (uubufnum != 0) +		{ +		uubuf[uubufnum]='\0'; +		uubuf[uubufnum+1]='\0'; +		uubuf[uubufnum+2]='\0'; +		j=uuencode(uubuf,uubufnum,b); +		fwrite(b,1,(unsigned int)j,fp); +		} +	fwrite(end,1,strlen(end),fp); +	} + +int uufread(out, size, num, fp) +unsigned char *out; +int size; /* should always be > ~ 60; I actually ignore this parameter :-) */ +unsigned int num; +FILE *fp; +	{ +	int i,j,tot; +	static int done=0; +	static int valid=0; +	static int start=1; + +	if (start) +		{ +		for (;;) +			{ +			b[0]='\0'; +			fgets((char *)b,300,fp); +			if (b[0] == '\0') +				{ +				fprintf(stderr,"no 'begin' found in uuencoded input\n"); +				return(-1); +				} +			if (strncmp((char *)b,"begin ",6) == 0) break; +			} +		start=0; +		} +	if (done) return(0); +	tot=0; +	if (valid) +		{ +		memcpy(out,bb,(unsigned int)valid); +		tot=valid; +		valid=0; +		} +	for (;;) +		{ +		b[0]='\0'; +		fgets((char *)b,300,fp); +		if (b[0] == '\0') break; +		i=strlen((char *)b); +		if ((b[0] == 'e') && (b[1] == 'n') && (b[2] == 'd')) +			{ +			done=1; +			while (!feof(fp)) +				{ +				fgets((char *)b,300,fp); +				} +			break; +			} +		i=uudecode(b,i,bb); +		if (i < 0) break; +		if ((i+tot+8) > num) +			{ +			/* num to copy to make it a multiple of 8 */ +			j=(num/8*8)-tot-8; +			memcpy(&(out[tot]),bb,(unsigned int)j); +			tot+=j; +			memcpy(bb,&(bb[j]),(unsigned int)i-j); +			valid=i-j; +			break; +			} +		memcpy(&(out[tot]),bb,(unsigned int)i); +		tot+=i; +		} +	return(tot); +	} + +#define ccc2l(c,l)      (l =((DES_LONG)(*((c)++)))<<16, \ +			 l|=((DES_LONG)(*((c)++)))<< 8, \ +		 	 l|=((DES_LONG)(*((c)++)))) + +#define l2ccc(l,c)      (*((c)++)=(unsigned char)(((l)>>16)&0xff), \ +                    *((c)++)=(unsigned char)(((l)>> 8)&0xff), \ +                    *((c)++)=(unsigned char)(((l)    )&0xff)) + + +int uuencode(in, num, out) +unsigned char *in; +int num; +unsigned char *out; +	{ +	int j,i,n,tot=0; +	DES_LONG l; +	register unsigned char *p; +	p=out; + +	for (j=0; j<num; j+=45) +		{ +		if (j+45 > num) +			i=(num-j); +		else	i=45; +		*(p++)=i+' '; +		for (n=0; n<i; n+=3) +			{ +			ccc2l(in,l); +			*(p++)=((l>>18)&0x3f)+' '; +			*(p++)=((l>>12)&0x3f)+' '; +			*(p++)=((l>> 6)&0x3f)+' '; +			*(p++)=((l    )&0x3f)+' '; +			tot+=4; +			} +		*(p++)='\n'; +		tot+=2; +		} +	*p='\0'; +	l=0; +	return(tot); +	} + +int uudecode(in, num, out) +unsigned char *in; +int num; +unsigned char *out; +	{ +	int j,i,k; +	unsigned int n=0,space=0; +	DES_LONG l; +	DES_LONG w,x,y,z; +	unsigned int blank=(unsigned int)'\n'-' '; + +	for (j=0; j<num; ) +		{ +		n= *(in++)-' '; +		if (n == blank) +			{ +			n=0; +			in--; +			} +		if (n > 60) +			{ +			fprintf(stderr,"uuencoded line length too long\n"); +			return(-1); +			} +		j++; + +		for (i=0; i<n; j+=4,i+=3) +			{ +			/* the following is for cases where spaces are +			 * removed from lines. +			 */ +			if (space) +				{ +				w=x=y=z=0; +				} +			else +				{ +				w= *(in++)-' '; +				x= *(in++)-' '; +				y= *(in++)-' '; +				z= *(in++)-' '; +				} +			if ((w > 63) || (x > 63) || (y > 63) || (z > 63)) +				{ +				k=0; +				if (w == blank) k=1; +				if (x == blank) k=2; +				if (y == blank) k=3; +				if (z == blank) k=4; +				space=1; +				switch (k) { +				case 1:	w=0; in--; +				case 2: x=0; in--; +				case 3: y=0; in--; +				case 4: z=0; in--; +					break; +				case 0: +					space=0; +					fprintf(stderr,"bad uuencoded data values\n"); +					w=x=y=z=0; +					return(-1); +					break; +					} +				} +			l=(w<<18)|(x<<12)|(y<< 6)|(z    ); +			l2ccc(l,out); +			} +		if (*(in++) != '\n') +			{ +			fprintf(stderr,"missing nl in uuencoded line\n"); +			w=x=y=z=0; +			return(-1); +			} +		j++; +		} +	*out='\0'; +	w=x=y=z=0; +	return(n); +	} diff --git a/crypto/libdes/des.def b/crypto/libdes/des.def new file mode 100644 index 000000000000..24b1de2d3d92 --- /dev/null +++ b/crypto/libdes/des.def @@ -0,0 +1,37 @@ +LIBRARY	des BASE=0x06000000 +EXPORTS +	des_ecb3_encrypt +	des_cbc_cksum +	des_cbc_encrypt +	des_ncbc_encrypt +	des_3cbc_encrypt +	des_cfb_encrypt +	des_ede3_cfb64_encrypt +	des_ede3_ofb64_encrypt +	des_ecb_encrypt +	des_encrypt +	des_encrypt2 +	des_ede3_cbc_encrypt +	des_enc_read +	des_enc_write +	crypt +	des_ofb_encrypt +	des_pcbc_encrypt +	des_quad_cksum +	des_read_password +	des_read_2passwords +	des_read_pw_string +	des_set_odd_parity +	des_is_weak_key +	des_set_key +	des_key_sched +	des_string_to_key +	des_string_to_2keys +	des_cfb64_encrypt +	des_ofb64_encrypt +	des_cblock_print_file +	des_new_random_key +	des_init_random_number_generator +	des_set_random_generator_seed +	des_set_sequence_number +	des_generate_random_block diff --git a/crypto/libdes/des.doc b/crypto/libdes/des.doc new file mode 100644 index 000000000000..1e3015812962 --- /dev/null +++ b/crypto/libdes/des.doc @@ -0,0 +1,505 @@ +The DES library. + +Please note that this library was originally written to operate with +eBones, a version of Kerberos that had had encryption removed when it left +the USA and then put back in.  As such there are some routines that I will +advise not using but they are still in the library for historical reasons. +For all calls that have an 'input' and 'output' variables, they can be the +same. + +This library requires the inclusion of 'des.h'. + +All of the encryption functions take what is called a des_key_schedule as an  +argument.  A des_key_schedule is an expanded form of the des key. +A des_key is 8 bytes of odd parity, the type used to hold the key is a +des_cblock.  A des_cblock is an array of 8 bytes, often in this library +description I will refer to input bytes when the function specifies +des_cblock's as input or output, this just means that the variable should +be a multiple of 8 bytes. + +The define DES_ENCRYPT is passed to specify encryption, DES_DECRYPT to +specify decryption.  The functions and global variable are as follows: + +int des_check_key; +	DES keys are supposed to be odd parity.  If this variable is set to +	a non-zero value, des_set_key() will check that the key has odd +	parity and is not one of the known weak DES keys.  By default this +	variable is turned off; +	 +void des_set_odd_parity( +des_cblock *key ); +	This function takes a DES key (8 bytes) and sets the parity to odd. +	 +int des_is_weak_key( +des_cblock *key ); +	This function returns a non-zero value if the DES key passed is a +	weak, DES key.  If it is a weak key, don't use it, try a different +	one.  If you are using 'random' keys, the chances of hitting a weak +	key are 1/2^52 so it is probably not worth checking for them. +	 +int des_set_key( +des_cblock *key, +des_key_schedule schedule); +	Des_set_key converts an 8 byte DES key into a des_key_schedule. +	A des_key_schedule is an expanded form of the key which is used to +	perform actual encryption.  It can be regenerated from the DES key +	so it only needs to be kept when encryption or decryption is about +	to occur.  Don't save or pass around des_key_schedule's since they +	are CPU architecture dependent, DES keys are not.  If des_check_key +	is non zero, zero is returned if the key has the wrong parity or +	the key is a weak key, else 1 is returned. +	 +int des_key_sched( +des_cblock *key, +des_key_schedule schedule); +	An alternative name for des_set_key(). + +int des_rw_mode;		/* defaults to DES_PCBC_MODE */ +	This flag holds either DES_CBC_MODE or DES_PCBC_MODE (default). +	This specifies the function to use in the enc_read() and enc_write() +	functions. + +void des_encrypt( +unsigned long *data, +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', +	have a look at my source code for more details on how I use this +	function. +	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_encrypt2( +unsigned 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 my 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_ecb_encrypt( +des_cblock *input, +des_cblock *output, +des_key_schedule ks, +int enc); +	This is the basic Electronic Code Book form of DES, the most basic +	form.  Input is encrypted into output using the key represented by +	ks.  If enc is non zero (DES_ENCRYPT), encryption occurs, otherwise +	decryption occurs.  Input is 8 bytes long and output is 8 bytes. +	(the des_cblock structure is 8 chars). +	 +void des_ecb3_encrypt( +des_cblock *input, +des_cblock *output, +des_key_schedule ks1, +des_key_schedule ks2, +des_key_schedule ks3, +int enc); +	This is the 3 key EDE mode of ECB DES.  What this means is that  +	the 8 bytes of input is encrypted with ks1, decrypted with ks2 and +	then encrypted again with ks3, before being put into output; +	C=E(ks3,D(ks2,E(ks1,M))).  There is a macro, des_ecb2_encrypt() +	that only takes 2 des_key_schedules that implements, +	C=E(ks1,D(ks2,E(ks1,M))) in that the final encrypt is done with ks1. +	 +void des_cbc_encrypt( +des_cblock *input, +des_cblock *output, +long length, +des_key_schedule ks, +des_cblock *ivec, +int enc); +	This routine implements DES in Cipher Block Chaining mode. +	Input, which should be a multiple of 8 bytes is encrypted +	(or decrypted) to output which will also be a multiple of 8 bytes. +	The number of bytes is in length (and from what I've said above, +	should be a multiple of 8).  If length is not a multiple of 8, I'm +	not being held responsible :-).  ivec is the initialisation vector. +	This function does not modify this variable.  To correctly implement +	cbc mode, you need to do one of 2 things; copy the last 8 bytes of +	cipher text for use as the next ivec in your application, +	or use des_ncbc_encrypt().  +	Only this routine has this problem with updating the ivec, all +	other routines that are implementing cbc mode update ivec. +	 +void des_ncbc_encrypt( +des_cblock *input, +des_cblock *output, +long length, +des_key_schedule sk, +des_cblock *ivec, +int enc); +	For historical reasons, des_cbc_encrypt() did not update the +	ivec with the value requires so that subsequent calls to +	des_cbc_encrypt() would 'chain'.  This was needed so that the same +	'length' values would not need to be used when decrypting. +	des_ncbc_encrypt() does the right thing.  It is the same as +	des_cbc_encrypt accept that ivec is updates with the correct value +	to pass in subsequent calls to des_ncbc_encrypt().  I advise using +	des_ncbc_encrypt() instead of des_cbc_encrypt(); + +void des_xcbc_encrypt( +des_cblock *input, +des_cblock *output, +long length, +des_key_schedule sk, +des_cblock *ivec, +des_cblock *inw, +des_cblock *outw, +int enc); +	This is RSA's DESX mode of DES.  It uses inw and outw to +	'whiten' the encryption.  inw and outw are secret (unlike the iv) +	and are as such, part of the key.  So the key is sort of 24 bytes. +	This is much better than cbc des. +	 +void des_3cbc_encrypt( +des_cblock *input, +des_cblock *output, +long length, +des_key_schedule sk1, +des_key_schedule sk2, +des_cblock *ivec1, +des_cblock *ivec2, +int enc); +	This function is flawed, do not use it.  I have left it in the +	library because it is used in my des(1) program and will function +	correctly when used by des(1).  If I removed the function, people +	could end up unable to decrypt files. +	This routine implements outer triple cbc encryption using 2 ks and +	2 ivec's.  Use des_ede2_cbc_encrypt() instead. +	 +void des_ede3_cbc_encrypt( +des_cblock *input, +des_cblock *output,  +long length, +des_key_schedule ks1, +des_key_schedule ks2,  +des_key_schedule ks3,  +des_cblock *ivec, +int enc); +	This function implements inner triple CBC DES encryption with 3 +	keys.  What this means is that each 'DES' operation +	inside the cbc mode is really an C=E(ks3,D(ks2,E(ks1,M))). +	Again, this is cbc mode so an ivec is requires. +	This mode is used by SSL. +	There is also a des_ede2_cbc_encrypt() that only uses 2 +	des_key_schedule's, the first being reused for the final +	encryption.  C=E(ks1,D(ks2,E(ks1,M))).  This form of triple DES +	is used by the RSAref library. +	 +void des_pcbc_encrypt( +des_cblock *input, +des_cblock *output, +long length, +des_key_schedule ks, +des_cblock *ivec, +int enc); +	This is Propagating Cipher Block Chaining mode of DES.  It is used +	by Kerberos v4.  It's parameters are the same as des_ncbc_encrypt(). +	 +void des_cfb_encrypt( +unsigned char *in, +unsigned char *out, +int numbits, +long length, +des_key_schedule ks, +des_cblock *ivec, +int enc); +	Cipher Feedback Back mode of DES.  This implementation 'feeds back' +	in numbit blocks.  The input (and output) is in multiples of numbits +	bits.  numbits should to be a multiple of 8 bits.  Length is the +	number of bytes input.  If numbits is not a multiple of 8 bits, +	the extra bits in the bytes will be considered padding.  So if +	numbits is 12, for each 2 input bytes, the 4 high bits of the +	second byte will be ignored.  So to encode 72 bits when using +	a numbits of 12 take 12 bytes.  To encode 72 bits when using +	numbits of 9 will take 16 bytes.  To encode 80 bits when using +	numbits of 16 will take 10 bytes. etc, etc.  This padding will +	apply to both input and output. + +	 +void des_cfb64_encrypt( +unsigned char *in, +unsigned char *out, +long length, +des_key_schedule ks, +des_cblock *ivec, +int *num, +int enc); +	This is one of the more useful functions in this DES library, it +	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 :-). +	 +void des_ede3_cfb64_encrypt( +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); +	Same as des_cfb64_encrypt() accept that the DES operation is +	triple DES.  As usual, there is a macro for +	des_ede2_cfb64_encrypt() which reuses ks1. + +void des_ofb_encrypt( +unsigned char *in, +unsigned char *out, +int numbits, +long length, +des_key_schedule ks, +des_cblock *ivec); +	This is a implementation of Output Feed Back mode of DES.  It is +	the same as des_cfb_encrypt() in that numbits is the size of the +	units dealt with during input and output (in bits). +	 +void des_ofb64_encrypt( +unsigned char *in, +unsigned char *out, +long length, +des_key_schedule ks, +des_cblock *ivec, +int *num); +	The same as des_cfb64_encrypt() except that it is Output Feed Back +	mode. + +void des_ede3_ofb64_encrypt( +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); +	Same as des_ofb64_encrypt() accept that the DES operation is +	triple DES.  As usual, there is a macro for +	des_ede2_ofb64_encrypt() which reuses ks1. + +int des_read_pw_string( +char *buf, +int length, +char *prompt, +int verify); +	This routine is used to get a password from the terminal with echo +	turned off.  Buf is where the string will end up and length is the +	size of buf.  Prompt is a string presented to the 'user' and if +	verify is set, the key is asked for twice and unless the 2 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. + +unsigned long des_cbc_cksum( +des_cblock *input, +des_cblock *output, +long length, +des_key_schedule ks, +des_cblock *ivec); +	This function produces an 8 byte checksum from input that it puts in +	output and returns the last 4 bytes as a long.  The checksum is +	generated via cbc mode of DES in which only the last 8 byes are +	kept.  I would recommend not using this function but instead using +	the EVP_Digest routines, or at least using MD5 or SHA.  This +	function is used by Kerberos v4 so that is why it stays in the +	library. +	 +char *des_fcrypt( +const char *buf, +const char *salt +char *ret); +	This is my 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. + +char *crypt( +const char *buf, +const char *salt); +	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). + +void des_string_to_key( +char *str, +des_cblock *key); +	This function takes str and converts it into a DES key.  I would +	recommend using MD5 instead and use the first 8 bytes of output. +	When I wrote the first version of these routines back in 1990, MD5 +	did not exist but I feel these routines are still sound.  This +	routines is compatible with the one in MIT's libdes. +	 +void des_string_to_2keys( +char *str, +des_cblock *key1, +des_cblock *key2); +	This function takes str and converts it into 2 DES keys. +	I would recommend using MD5 and using the 16 bytes as the 2 keys. +	I have nothing against these 2 'string_to_key' routines, it's just +	that if you say that your encryption key is generated by using the +	16 bytes of an MD5 hash, every-one knows how you generated your +	keys. + +int des_read_password( +des_cblock *key, +char *prompt, +int verify); +	This routine combines des_read_pw_string() with des_string_to_key(). + +int des_read_2passwords( +des_cblock *key1, +des_cblock *key2, +char *prompt, +int verify); +	This routine combines des_read_pw_string() with des_string_to_2key(). + +void des_random_seed( +des_cblock key); +	This routine sets a starting point for des_random_key(). +	 +void des_random_key( +des_cblock ret); +	This function return a random key.  Make sure to 'seed' the random +	number generator (with des_random_seed()) before using this function. +	I personally now use a MD5 based random number system. + +int des_enc_read( +int fd, +char *buf, +int len, +des_key_schedule ks, +des_cblock *iv); +	This function will write to a file descriptor the encrypted data +	from buf.  This data will be preceded by a 4 byte 'byte count' and +	will be padded out to 8 bytes.  The encryption is either CBC of +	PCBC depending on the value of des_rw_mode.  If it is DES_PCBC_MODE, +	pcbc is used, if DES_CBC_MODE, cbc is used.  The default is to use +	DES_PCBC_MODE. + +int des_enc_write( +int fd, +char *buf, +int len, +des_key_schedule ks, +des_cblock *iv); +	This routines read stuff written by des_enc_read() and decrypts it. +	I have used these routines quite a lot but I don't believe they are +	suitable for non-blocking io.  If you are after a full +	authentication/encryption over networks, have a look at SSL instead. + +unsigned long des_quad_cksum( +des_cblock *input, +des_cblock *output, +long length, +int out_count, +des_cblock *seed); +	This is a function from Kerberos v4 that is not anything to do with +	DES but was needed.  It is a cksum that is quicker to generate than +	des_cbc_cksum();  I personally would use MD5 routines now. +===== +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 can 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 key3 again. +- As for ECB encryption but increases the key length to 168 bits. +  There are theoretic attacks that can be used that make the effective +  key length 112 bits, but this attack also requires 2^56 blocks of +  memory, not very likely, even for the NSA. +- If both keys are the same it is equivalent to encrypting once with +  just one key. +- If the first and last key are the same, the key length is 112 bits. +  There are attacks that could reduce the key space to 55 bit's but it +  requires 2^56 blocks of memory. +- If all 3 keys are the same, this is effectively the same as normal +  ecb mode. + +Triple CBC Mode (des_ede3_cbc_encrypt()) +- Encrypt with key1, decrypt with key2 and then encrypt with key3. +- As for CBC encryption but increases the key length to 168 bits with +  the same restrictions as for triple ecb mode. diff --git a/crypto/libdes/des.dsp b/crypto/libdes/des.dsp new file mode 100644 index 000000000000..628742bbd006 --- /dev/null +++ b/crypto/libdes/des.dsp @@ -0,0 +1,258 @@ +# Microsoft Developer Studio Project File - Name="des" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 5.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=des - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE  +!MESSAGE NMAKE /f "des.mak". +!MESSAGE  +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE  +!MESSAGE NMAKE /f "des.mak" CFG="des - Win32 Release" +!MESSAGE  +!MESSAGE Possible choices for configuration are: +!MESSAGE  +!MESSAGE "des - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "des - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE  + +# Begin Project +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF  "$(CFG)" == "des - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir ".\Release" +# PROP BASE Intermediate_Dir ".\Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir ".\Release" +# PROP Intermediate_Dir ".\Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c +# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\roken" /I "." /I "..\..\include" /I "..\..\include\win32" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "HAVE_CONFIG_H" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 +# ADD LINK32 ..\roken\Release\roken.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /dll /machine:I386 + +!ELSEIF  "$(CFG)" == "des - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir ".\Debug" +# PROP BASE Intermediate_Dir ".\Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir ".\Debug" +# PROP Intermediate_Dir ".\Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\roken" /I "." /I "..\..\include" /I "..\..\include\win32" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "HAVE_CONFIG_H" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 +# ADD LINK32 ..\roken\Debug\roken.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /dll /debug /machine:I386 + +!ENDIF  + +# Begin Target + +# Name "des - Win32 Release" +# Name "des - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90" +# Begin Source File + +SOURCE=.\cbc3_enc.c +# End Source File +# Begin Source File + +SOURCE=.\cbc_cksm.c +# End Source File +# Begin Source File + +SOURCE=.\cbc_enc.c +# End Source File +# Begin Source File + +SOURCE=.\cfb64ede.c +# End Source File +# Begin Source File + +SOURCE=.\cfb64enc.c +# End Source File +# Begin Source File + +SOURCE=.\cfb_enc.c +# End Source File +# Begin Source File + +SOURCE=.\des.def +# End Source File +# Begin Source File + +SOURCE=.\des_enc.c +# End Source File +# Begin Source File + +SOURCE=.\dllmain.c +# End Source File +# Begin Source File + +SOURCE=.\ecb3_enc.c +# End Source File +# Begin Source File + +SOURCE=.\ecb_enc.c +# End Source File +# Begin Source File + +SOURCE=.\ede_enc.c +# End Source File +# Begin Source File + +SOURCE=.\enc_read.c +# End Source File +# Begin Source File + +SOURCE=.\enc_writ.c +# End Source File +# Begin Source File + +SOURCE=.\fcrypt.c +# End Source File +# Begin Source File + +SOURCE=.\key_par.c +# End Source File +# Begin Source File + +SOURCE=.\ncbc_enc.c +# End Source File +# Begin Source File + +SOURCE=.\ofb64ede.c +# End Source File +# Begin Source File + +SOURCE=.\ofb64enc.c +# End Source File +# Begin Source File + +SOURCE=.\ofb_enc.c +# End Source File +# Begin Source File + +SOURCE=.\passwd_dlg.c +# End Source File +# Begin Source File + +SOURCE=.\pcbc_enc.c +# End Source File +# Begin Source File + +SOURCE=.\qud_cksm.c +# End Source File +# Begin Source File + +SOURCE=.\read_pwd.c +# End Source File +# Begin Source File + +SOURCE=.\rnd_keys.c +# End Source File +# Begin Source File + +SOURCE=.\rpc_enc.c +# End Source File +# Begin Source File + +SOURCE=.\set_key.c +# End Source File +# Begin Source File + +SOURCE=.\str2key.c +# End Source File +# Begin Source File + +SOURCE=.\supp.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd" +# Begin Source File + +SOURCE=.\des.h +# End Source File +# Begin Source File + +SOURCE=.\des_locl.h +# End Source File +# Begin Source File + +SOURCE=.\des_ver.h +# End Source File +# Begin Source File + +SOURCE=.\md5.h +# End Source File +# Begin Source File + +SOURCE=.\passwd_dlg.h +# End Source File +# Begin Source File + +SOURCE=.\podd.h +# End Source File +# Begin Source File + +SOURCE=.\rpc_des.h +# End Source File +# Begin Source File + +SOURCE=.\sk.h +# End Source File +# Begin Source File + +SOURCE=.\spr.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe" +# Begin Source File + +SOURCE=.\passwd_dialog.rc +# End Source File +# End Group +# End Target +# End Project diff --git a/crypto/libdes/des.h b/crypto/libdes/des.h new file mode 100644 index 000000000000..f5c19d829f68 --- /dev/null +++ b/crypto/libdes/des.h @@ -0,0 +1,309 @@ +/* crypto/des/des.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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.] + */ + +#ifndef HEADER_DES_H +#define HEADER_DES_H + +#ifdef  __cplusplus +extern "C" { +#endif + +#include <stdio.h> + +#ifndef DES_LIB_FUNCTION +#if defined(__BORLANDC__) +#define DES_LIB_FUNCTION /* not-ready-definition-yet */ +#elif defined(_MSC_VER) +#define DES_LIB_FUNCTION /* not-ready-definition-yet2 */ +#else +#define DES_LIB_FUNCTION +#endif +#endif + +/* If this is set to 'unsigned int' on a DEC Alpha, this gives about a + * %20 speed up (longs are 8 bytes, int's are 4). */ +#ifndef DES_LONG +#if defined(__alpha) || defined(__sparcv9) +#define DES_LONG unsigned int +#else /* Not a 64 bit machine */ +#define DES_LONG unsigned long +#endif +#endif + +typedef unsigned char des_cblock[8]; +typedef struct des_ks_struct +	{ +	union	{ +		des_cblock _; +		/* make sure things are correct size on machines with +		 * 8 byte longs */ +		DES_LONG pad[2]; +		} ks; +#undef _ +#define _	ks._ +	} des_key_schedule[16]; + +#define DES_KEY_SZ 	(sizeof(des_cblock)) +#define DES_SCHEDULE_SZ (sizeof(des_key_schedule)) + +#define DES_ENCRYPT	1 +#define DES_DECRYPT	0 + +#define DES_CBC_MODE	0 +#define DES_PCBC_MODE	1 + +#define des_ecb2_encrypt(i,o,k1,k2,e) \ +	des_ecb3_encrypt((i),(o),(k1),(k2),(k1),(e)) + +#define des_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) \ +	des_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e)) + +#define des_ede2_cfb64_encrypt(i,o,l,k1,k2,iv,n,e) \ +	des_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n),(e)) + +#define des_ede2_ofb64_encrypt(i,o,l,k1,k2,iv,n) \ +	des_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n)) + +#define C_Block des_cblock +#define Key_schedule des_key_schedule +#ifdef KERBEROS +#define ENCRYPT DES_ENCRYPT +#define DECRYPT DES_DECRYPT +#endif +#define KEY_SZ DES_KEY_SZ +#define string_to_key des_string_to_key +#define read_pw_string des_read_pw_string +#define random_key des_random_key +#define pcbc_encrypt des_pcbc_encrypt +#define set_key des_set_key +#define key_sched des_key_sched +#define ecb_encrypt des_ecb_encrypt +#define cbc_encrypt des_cbc_encrypt +#define ncbc_encrypt des_ncbc_encrypt +#define xcbc_encrypt des_xcbc_encrypt +#define cbc_cksum des_cbc_cksum +#define quad_cksum des_quad_cksum + +/* For compatibility with the MIT lib - eay 20/05/92 */ +typedef des_key_schedule bit_64; +#define des_fixup_key_parity des_set_odd_parity +#define des_check_key_parity check_parity + +extern int des_check_key;	/* defaults to false */ +extern int des_rw_mode;		/* defaults to DES_PCBC_MODE */ + +#ifdef cplusplus +extern "C" { +#endif + +/* The next line is used to disable full ANSI prototypes, if your + * compiler has problems with the prototypes, make sure this line always + * evaluates to true :-) */ +#if defined(MSDOS) || defined(__STDC__) +#undef NOPROTO +#endif +#ifndef NOPROTO +char *DES_LIB_FUNCTION des_options(void); +void DES_LIB_FUNCTION des_ecb3_encrypt(des_cblock *input,des_cblock *output, +	des_key_schedule ks1,des_key_schedule ks2, +	des_key_schedule ks3, int enc); +DES_LONG DES_LIB_FUNCTION des_cbc_cksum(des_cblock *input,des_cblock *output, +	long length,des_key_schedule schedule,des_cblock *ivec); +void DES_LIB_FUNCTION des_cbc_encrypt(des_cblock *input,des_cblock *output,long length, +	des_key_schedule schedule,des_cblock *ivec,int enc); +void DES_LIB_FUNCTION des_ncbc_encrypt(des_cblock *input,des_cblock *output,long length, +	des_key_schedule schedule,des_cblock *ivec,int enc); +void DES_LIB_FUNCTION des_xcbc_encrypt(des_cblock *input,des_cblock *output,long length, +	des_key_schedule schedule,des_cblock *ivec, +	des_cblock *inw,des_cblock *outw,int enc); +void DES_LIB_FUNCTION des_3cbc_encrypt(des_cblock *input,des_cblock *output,long length, +	des_key_schedule sk1,des_key_schedule sk2, +	des_cblock *ivec1,des_cblock *ivec2,int enc); +void DES_LIB_FUNCTION des_cfb_encrypt(unsigned char *in,unsigned char *out,int numbits, +	long length,des_key_schedule schedule,des_cblock *ivec,int enc); +void DES_LIB_FUNCTION des_ecb_encrypt(des_cblock *input,des_cblock *output, +	des_key_schedule ks,int enc); +void DES_LIB_FUNCTION des_encrypt(DES_LONG *data,des_key_schedule ks, int enc); +void DES_LIB_FUNCTION des_encrypt2(DES_LONG *data,des_key_schedule ks, int enc); +void DES_LIB_FUNCTION des_encrypt3(DES_LONG *data, des_key_schedule ks1, +	des_key_schedule ks2, des_key_schedule ks3); +void DES_LIB_FUNCTION des_decrypt3(DES_LONG *data, des_key_schedule ks1, +	des_key_schedule ks2, des_key_schedule ks3); +void DES_LIB_FUNCTION des_ede3_cbc_encrypt(des_cblock *input, des_cblock *output,  +	long length, des_key_schedule ks1, des_key_schedule ks2,  +	des_key_schedule ks3, des_cblock *ivec, int enc); +void DES_LIB_FUNCTION des_ede3_cfb64_encrypt(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 encrypt); +void DES_LIB_FUNCTION des_ede3_ofb64_encrypt(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_LIB_FUNCTION des_enc_read(int fd,char *buf,int len,des_key_schedule sched, +	des_cblock *iv); +int DES_LIB_FUNCTION des_enc_write(int fd,char *buf,int len,des_key_schedule sched, +	des_cblock *iv); +char *DES_LIB_FUNCTION des_fcrypt(const char *buf,const char *salt, char *ret); +#ifdef PERL5 +char *des_crypt(const char *buf,const char *salt); +#else +/* some stupid compilers complain because I have declared char instead + * of const char */ +#ifdef HEADER_DES_LOCL_H +char *DES_LIB_FUNCTION crypt(const char *buf,const char *salt); +#else +char *crypt(); +#endif +#endif +void DES_LIB_FUNCTION des_ofb_encrypt(unsigned char *in,unsigned char *out, +	int numbits,long length,des_key_schedule schedule,des_cblock *ivec); +void DES_LIB_FUNCTION des_pcbc_encrypt(des_cblock *input,des_cblock *output,long length, +	des_key_schedule schedule,des_cblock *ivec,int enc); +DES_LONG DES_LIB_FUNCTION des_quad_cksum(des_cblock *input,des_cblock *output, +	long length,int out_count,des_cblock *seed); +void DES_LIB_FUNCTION des_random_seed(des_cblock key); +void DES_LIB_FUNCTION des_random_key(des_cblock ret); +int DES_LIB_FUNCTION des_read_password(des_cblock *key,char *prompt,int verify); +int DES_LIB_FUNCTION des_read_2passwords(des_cblock *key1,des_cblock *key2, +	char *prompt,int verify); +int DES_LIB_FUNCTION des_read_pw_string(char *buf,int length,char *prompt,int verify); +void DES_LIB_FUNCTION des_set_odd_parity(des_cblock *key); +int DES_LIB_FUNCTION des_is_weak_key(des_cblock *key); +int DES_LIB_FUNCTION des_set_key(des_cblock *key,des_key_schedule schedule); +int DES_LIB_FUNCTION des_key_sched(des_cblock *key,des_key_schedule schedule); +void DES_LIB_FUNCTION des_string_to_key(char *str,des_cblock *key); +void DES_LIB_FUNCTION des_string_to_2keys(char *str,des_cblock *key1,des_cblock *key2); +void DES_LIB_FUNCTION des_cfb64_encrypt(unsigned char *in, unsigned char *out, long length, +	des_key_schedule schedule, des_cblock *ivec, int *num, int enc); +void DES_LIB_FUNCTION des_ofb64_encrypt(unsigned char *in, unsigned char *out, long length, +	des_key_schedule schedule, des_cblock *ivec, int *num); + +/* Extra functions from Mark Murray <mark@grondar.za> */ +void DES_LIB_FUNCTION des_cblock_print_file(des_cblock *cb, FILE *fp); +/* The following functions are not in the normal unix build or the + * SSLeay build.  When using the SSLeay build, use RAND_seed() + * and RAND_bytes() instead. */ +int DES_LIB_FUNCTION des_new_random_key(des_cblock *key); +void DES_LIB_FUNCTION des_init_random_number_generator(des_cblock *key); +void DES_LIB_FUNCTION des_set_random_generator_seed(des_cblock *key); +void DES_LIB_FUNCTION des_set_sequence_number(des_cblock new_sequence_number); +void DES_LIB_FUNCTION des_generate_random_block(des_cblock *block); +void DES_LIB_FUNCTION des_rand_data(unsigned char *data, int size); + +#else + +char *des_options(); +void des_ecb3_encrypt(); +DES_LONG des_cbc_cksum(); +void des_cbc_encrypt(); +void des_ncbc_encrypt(); +void des_xcbc_encrypt(); +void des_3cbc_encrypt(); +void des_cfb_encrypt(); +void des_ede3_cfb64_encrypt(); +void des_ede3_ofb64_encrypt(); +void des_ecb_encrypt(); +void des_encrypt(); +void des_encrypt2(); +void des_encrypt3(); +void des_decrypt3(); +void des_ede3_cbc_encrypt(); +int des_enc_read(); +int des_enc_write(); +char *des_fcrypt(); +#ifdef PERL5 +char *des_crypt(); +#else +char *crypt(); +#endif +void des_ofb_encrypt(); +void des_pcbc_encrypt(); +DES_LONG des_quad_cksum(); +void des_random_seed(); +void des_random_key(); +int des_read_password(); +int des_read_2passwords(); +int des_read_pw_string(); +void des_set_odd_parity(); +int des_is_weak_key(); +int des_set_key(); +int des_key_sched(); +void des_string_to_key(); +void des_string_to_2keys(); +void des_cfb64_encrypt(); +void des_ofb64_encrypt(); + +/* Extra functions from Mark Murray <mark@grondar.za> */ +void des_cblock_print_file(); +/* The following functions are not in the normal unix build or the + * SSLeay build.  When using the SSLeay build, use RAND_seed() + * and RAND_bytes() instead. */ +int des_new_random_key(); +void des_init_random_number_generator(); +void des_set_random_generator_seed(); +void des_set_sequence_number(); +void des_generate_random_block(); +void des_rand_data(); + +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/crypto/libdes/des.mak b/crypto/libdes/des.mak new file mode 100644 index 000000000000..c20052706576 --- /dev/null +++ b/crypto/libdes/des.mak @@ -0,0 +1,659 @@ +# Microsoft Developer Studio Generated NMAKE File, Based on des.dsp +!IF "$(CFG)" == "" +CFG=des - Win32 Release +!MESSAGE No configuration specified. Defaulting to des - Win32 Release. +!ENDIF  + +!IF "$(CFG)" != "des - Win32 Release" && "$(CFG)" != "des - Win32 Debug" +!MESSAGE Invalid configuration "$(CFG)" specified. +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line.  For example: +!MESSAGE  +!MESSAGE NMAKE /f "des.mak" CFG="des - Win32 Release" +!MESSAGE  +!MESSAGE Possible choices for configuration are: +!MESSAGE  +!MESSAGE "des - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "des - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE  +!ERROR An invalid configuration is specified. +!ENDIF  + +!IF "$(OS)" == "Windows_NT" +NULL= +!ELSE  +NULL=nul +!ENDIF  + +!IF  "$(CFG)" == "des - Win32 Release" + +OUTDIR=.\Release +INTDIR=.\Release +# Begin Custom Macros +OutDir=.\.\Release +# End Custom Macros + +!IF "$(RECURSE)" == "0"  + +ALL : "$(OUTDIR)\des.dll" + +!ELSE  + +ALL : "roken - Win32 Release" "$(OUTDIR)\des.dll" + +!ENDIF  + +!IF "$(RECURSE)" == "1"  +CLEAN :"roken - Win32 ReleaseCLEAN"  +!ELSE  +CLEAN :  +!ENDIF  +	-@erase "$(INTDIR)\cbc3_enc.obj" +	-@erase "$(INTDIR)\cbc_cksm.obj" +	-@erase "$(INTDIR)\cbc_enc.obj" +	-@erase "$(INTDIR)\cfb64ede.obj" +	-@erase "$(INTDIR)\cfb64enc.obj" +	-@erase "$(INTDIR)\cfb_enc.obj" +	-@erase "$(INTDIR)\des_enc.obj" +	-@erase "$(INTDIR)\dllmain.obj" +	-@erase "$(INTDIR)\ecb3_enc.obj" +	-@erase "$(INTDIR)\ecb_enc.obj" +	-@erase "$(INTDIR)\ede_enc.obj" +	-@erase "$(INTDIR)\enc_read.obj" +	-@erase "$(INTDIR)\enc_writ.obj" +	-@erase "$(INTDIR)\fcrypt.obj" +	-@erase "$(INTDIR)\key_par.obj" +	-@erase "$(INTDIR)\ncbc_enc.obj" +	-@erase "$(INTDIR)\ofb64ede.obj" +	-@erase "$(INTDIR)\ofb64enc.obj" +	-@erase "$(INTDIR)\ofb_enc.obj" +	-@erase "$(INTDIR)\passwd_dialog.res" +	-@erase "$(INTDIR)\passwd_dlg.obj" +	-@erase "$(INTDIR)\pcbc_enc.obj" +	-@erase "$(INTDIR)\qud_cksm.obj" +	-@erase "$(INTDIR)\read_pwd.obj" +	-@erase "$(INTDIR)\rnd_keys.obj" +	-@erase "$(INTDIR)\rpc_enc.obj" +	-@erase "$(INTDIR)\set_key.obj" +	-@erase "$(INTDIR)\str2key.obj" +	-@erase "$(INTDIR)\supp.obj" +	-@erase "$(INTDIR)\vc50.idb" +	-@erase "$(OUTDIR)\des.dll" +	-@erase "$(OUTDIR)\des.exp" +	-@erase "$(OUTDIR)\des.lib" + +"$(OUTDIR)" : +    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" + +CPP=cl.exe +CPP_PROJ=/nologo /MT /W3 /GX /O2 /I "..\roken" /I "." /I "..\..\include" /I\ + "..\..\include\win32" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "HAVE_CONFIG_H"\ + /Fp"$(INTDIR)\des.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c  +CPP_OBJS=.\Release/ +CPP_SBRS=. + +.c{$(CPP_OBJS)}.obj:: +   $(CPP) @<< +   $(CPP_PROJ) $<  +<< + +.cpp{$(CPP_OBJS)}.obj:: +   $(CPP) @<< +   $(CPP_PROJ) $<  +<< + +.cxx{$(CPP_OBJS)}.obj:: +   $(CPP) @<< +   $(CPP_PROJ) $<  +<< + +.c{$(CPP_SBRS)}.sbr:: +   $(CPP) @<< +   $(CPP_PROJ) $<  +<< + +.cpp{$(CPP_SBRS)}.sbr:: +   $(CPP) @<< +   $(CPP_PROJ) $<  +<< + +.cxx{$(CPP_SBRS)}.sbr:: +   $(CPP) @<< +   $(CPP_PROJ) $<  +<< + +MTL=midl.exe +MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /win32  +RSC=rc.exe +RSC_PROJ=/l 0x409 /fo"$(INTDIR)\passwd_dialog.res" /d "NDEBUG"  +BSC32=bscmake.exe +BSC32_FLAGS=/nologo /o"$(OUTDIR)\des.bsc"  +BSC32_SBRS= \ +	 +LINK32=link.exe +LINK32_FLAGS=..\roken\Release\roken.lib kernel32.lib user32.lib gdi32.lib\ + winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib\ + uuid.lib /nologo /subsystem:windows /dll /incremental:no\ + /pdb:"$(OUTDIR)\des.pdb" /machine:I386 /def:".\des.def"\ + /out:"$(OUTDIR)\des.dll" /implib:"$(OUTDIR)\des.lib"  +DEF_FILE= \ +	".\des.def" +LINK32_OBJS= \ +	"$(INTDIR)\cbc3_enc.obj" \ +	"$(INTDIR)\cbc_cksm.obj" \ +	"$(INTDIR)\cbc_enc.obj" \ +	"$(INTDIR)\cfb64ede.obj" \ +	"$(INTDIR)\cfb64enc.obj" \ +	"$(INTDIR)\cfb_enc.obj" \ +	"$(INTDIR)\des_enc.obj" \ +	"$(INTDIR)\dllmain.obj" \ +	"$(INTDIR)\ecb3_enc.obj" \ +	"$(INTDIR)\ecb_enc.obj" \ +	"$(INTDIR)\ede_enc.obj" \ +	"$(INTDIR)\enc_read.obj" \ +	"$(INTDIR)\enc_writ.obj" \ +	"$(INTDIR)\fcrypt.obj" \ +	"$(INTDIR)\key_par.obj" \ +	"$(INTDIR)\ncbc_enc.obj" \ +	"$(INTDIR)\ofb64ede.obj" \ +	"$(INTDIR)\ofb64enc.obj" \ +	"$(INTDIR)\ofb_enc.obj" \ +	"$(INTDIR)\passwd_dialog.res" \ +	"$(INTDIR)\passwd_dlg.obj" \ +	"$(INTDIR)\pcbc_enc.obj" \ +	"$(INTDIR)\qud_cksm.obj" \ +	"$(INTDIR)\read_pwd.obj" \ +	"$(INTDIR)\rnd_keys.obj" \ +	"$(INTDIR)\rpc_enc.obj" \ +	"$(INTDIR)\set_key.obj" \ +	"$(INTDIR)\str2key.obj" \ +	"$(INTDIR)\supp.obj" \ +	"..\roken\Release\roken.lib" + +"$(OUTDIR)\des.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) +    $(LINK32) @<< +  $(LINK32_FLAGS) $(LINK32_OBJS) +<< + +!ELSEIF  "$(CFG)" == "des - Win32 Debug" + +OUTDIR=.\Debug +INTDIR=.\Debug +# Begin Custom Macros +OutDir=.\.\Debug +# End Custom Macros + +!IF "$(RECURSE)" == "0"  + +ALL : "$(OUTDIR)\des.dll" + +!ELSE  + +ALL : "roken - Win32 Debug" "$(OUTDIR)\des.dll" + +!ENDIF  + +!IF "$(RECURSE)" == "1"  +CLEAN :"roken - Win32 DebugCLEAN"  +!ELSE  +CLEAN :  +!ENDIF  +	-@erase "$(INTDIR)\cbc3_enc.obj" +	-@erase "$(INTDIR)\cbc_cksm.obj" +	-@erase "$(INTDIR)\cbc_enc.obj" +	-@erase "$(INTDIR)\cfb64ede.obj" +	-@erase "$(INTDIR)\cfb64enc.obj" +	-@erase "$(INTDIR)\cfb_enc.obj" +	-@erase "$(INTDIR)\des_enc.obj" +	-@erase "$(INTDIR)\dllmain.obj" +	-@erase "$(INTDIR)\ecb3_enc.obj" +	-@erase "$(INTDIR)\ecb_enc.obj" +	-@erase "$(INTDIR)\ede_enc.obj" +	-@erase "$(INTDIR)\enc_read.obj" +	-@erase "$(INTDIR)\enc_writ.obj" +	-@erase "$(INTDIR)\fcrypt.obj" +	-@erase "$(INTDIR)\key_par.obj" +	-@erase "$(INTDIR)\ncbc_enc.obj" +	-@erase "$(INTDIR)\ofb64ede.obj" +	-@erase "$(INTDIR)\ofb64enc.obj" +	-@erase "$(INTDIR)\ofb_enc.obj" +	-@erase "$(INTDIR)\passwd_dialog.res" +	-@erase "$(INTDIR)\passwd_dlg.obj" +	-@erase "$(INTDIR)\pcbc_enc.obj" +	-@erase "$(INTDIR)\qud_cksm.obj" +	-@erase "$(INTDIR)\read_pwd.obj" +	-@erase "$(INTDIR)\rnd_keys.obj" +	-@erase "$(INTDIR)\rpc_enc.obj" +	-@erase "$(INTDIR)\set_key.obj" +	-@erase "$(INTDIR)\str2key.obj" +	-@erase "$(INTDIR)\supp.obj" +	-@erase "$(INTDIR)\vc50.idb" +	-@erase "$(INTDIR)\vc50.pdb" +	-@erase "$(OUTDIR)\des.dll" +	-@erase "$(OUTDIR)\des.exp" +	-@erase "$(OUTDIR)\des.ilk" +	-@erase "$(OUTDIR)\des.lib" +	-@erase "$(OUTDIR)\des.pdb" + +"$(OUTDIR)" : +    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" + +CPP=cl.exe +CPP_PROJ=/nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\roken" /I "." /I\ + "..\..\include" /I "..\..\include\win32" /D "WIN32" /D "_DEBUG" /D "_WINDOWS"\ + /D "HAVE_CONFIG_H" /Fp"$(INTDIR)\des.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\"\ + /FD /c  +CPP_OBJS=.\Debug/ +CPP_SBRS=. + +.c{$(CPP_OBJS)}.obj:: +   $(CPP) @<< +   $(CPP_PROJ) $<  +<< + +.cpp{$(CPP_OBJS)}.obj:: +   $(CPP) @<< +   $(CPP_PROJ) $<  +<< + +.cxx{$(CPP_OBJS)}.obj:: +   $(CPP) @<< +   $(CPP_PROJ) $<  +<< + +.c{$(CPP_SBRS)}.sbr:: +   $(CPP) @<< +   $(CPP_PROJ) $<  +<< + +.cpp{$(CPP_SBRS)}.sbr:: +   $(CPP) @<< +   $(CPP_PROJ) $<  +<< + +.cxx{$(CPP_SBRS)}.sbr:: +   $(CPP) @<< +   $(CPP_PROJ) $<  +<< + +MTL=midl.exe +MTL_PROJ=/nologo /D "_DEBUG" /mktyplib203 /win32  +RSC=rc.exe +RSC_PROJ=/l 0x409 /fo"$(INTDIR)\passwd_dialog.res" /d "_DEBUG"  +BSC32=bscmake.exe +BSC32_FLAGS=/nologo /o"$(OUTDIR)\des.bsc"  +BSC32_SBRS= \ +	 +LINK32=link.exe +LINK32_FLAGS=..\roken\Debug\roken.lib kernel32.lib user32.lib gdi32.lib\ + winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib\ + uuid.lib /nologo /subsystem:windows /dll /incremental:yes\ + /pdb:"$(OUTDIR)\des.pdb" /debug /machine:I386 /def:".\des.def"\ + /out:"$(OUTDIR)\des.dll" /implib:"$(OUTDIR)\des.lib"  +DEF_FILE= \ +	".\des.def" +LINK32_OBJS= \ +	"$(INTDIR)\cbc3_enc.obj" \ +	"$(INTDIR)\cbc_cksm.obj" \ +	"$(INTDIR)\cbc_enc.obj" \ +	"$(INTDIR)\cfb64ede.obj" \ +	"$(INTDIR)\cfb64enc.obj" \ +	"$(INTDIR)\cfb_enc.obj" \ +	"$(INTDIR)\des_enc.obj" \ +	"$(INTDIR)\dllmain.obj" \ +	"$(INTDIR)\ecb3_enc.obj" \ +	"$(INTDIR)\ecb_enc.obj" \ +	"$(INTDIR)\ede_enc.obj" \ +	"$(INTDIR)\enc_read.obj" \ +	"$(INTDIR)\enc_writ.obj" \ +	"$(INTDIR)\fcrypt.obj" \ +	"$(INTDIR)\key_par.obj" \ +	"$(INTDIR)\ncbc_enc.obj" \ +	"$(INTDIR)\ofb64ede.obj" \ +	"$(INTDIR)\ofb64enc.obj" \ +	"$(INTDIR)\ofb_enc.obj" \ +	"$(INTDIR)\passwd_dialog.res" \ +	"$(INTDIR)\passwd_dlg.obj" \ +	"$(INTDIR)\pcbc_enc.obj" \ +	"$(INTDIR)\qud_cksm.obj" \ +	"$(INTDIR)\read_pwd.obj" \ +	"$(INTDIR)\rnd_keys.obj" \ +	"$(INTDIR)\rpc_enc.obj" \ +	"$(INTDIR)\set_key.obj" \ +	"$(INTDIR)\str2key.obj" \ +	"$(INTDIR)\supp.obj" \ +	"..\roken\Debug\roken.lib" + +"$(OUTDIR)\des.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) +    $(LINK32) @<< +  $(LINK32_FLAGS) $(LINK32_OBJS) +<< + +!ENDIF  + + +!IF "$(CFG)" == "des - Win32 Release" || "$(CFG)" == "des - Win32 Debug" +SOURCE=.\cbc3_enc.c +DEP_CPP_CBC3_=\ +	"..\..\include\win32\config.h"\ +	".\des.h"\ +	".\des_locl.h"\ + + +"$(INTDIR)\cbc3_enc.obj" : $(SOURCE) $(DEP_CPP_CBC3_) "$(INTDIR)" + + +SOURCE=.\cbc_cksm.c +DEP_CPP_CBC_C=\ +	"..\..\include\win32\config.h"\ +	".\des.h"\ +	".\des_locl.h"\ +	 + +"$(INTDIR)\cbc_cksm.obj" : $(SOURCE) $(DEP_CPP_CBC_C) "$(INTDIR)" + + +SOURCE=.\cbc_enc.c +DEP_CPP_CBC_E=\ +	"..\..\include\win32\config.h"\ +	".\des.h"\ +	".\des_locl.h"\ +	 + +"$(INTDIR)\cbc_enc.obj" : $(SOURCE) $(DEP_CPP_CBC_E) "$(INTDIR)" + + +SOURCE=.\cfb64ede.c +DEP_CPP_CFB64=\ +	"..\..\include\win32\config.h"\ +	".\des.h"\ +	".\des_locl.h"\ +	 + +"$(INTDIR)\cfb64ede.obj" : $(SOURCE) $(DEP_CPP_CFB64) "$(INTDIR)" + + +SOURCE=.\cfb64enc.c +DEP_CPP_CFB64E=\ +	"..\..\include\win32\config.h"\ +	".\des.h"\ +	".\des_locl.h"\ +	 + +"$(INTDIR)\cfb64enc.obj" : $(SOURCE) $(DEP_CPP_CFB64E) "$(INTDIR)" + + +SOURCE=.\cfb_enc.c +DEP_CPP_CFB_E=\ +	"..\..\include\win32\config.h"\ +	".\des.h"\ +	".\des_locl.h"\ +	 + +"$(INTDIR)\cfb_enc.obj" : $(SOURCE) $(DEP_CPP_CFB_E) "$(INTDIR)" + + +SOURCE=.\des_enc.c +DEP_CPP_DES_E=\ +	"..\..\include\win32\config.h"\ +	".\des.h"\ +	".\des_locl.h"\ +	 + +"$(INTDIR)\des_enc.obj" : $(SOURCE) $(DEP_CPP_DES_E) "$(INTDIR)" + + +SOURCE=.\dllmain.c +DEP_CPP_DLLMA=\ +	"..\..\include\win32\config.h"\ +	 + +"$(INTDIR)\dllmain.obj" : $(SOURCE) $(DEP_CPP_DLLMA) "$(INTDIR)" + + +SOURCE=.\ecb3_enc.c +DEP_CPP_ECB3_=\ +	"..\..\include\win32\config.h"\ +	".\des.h"\ +	".\des_locl.h"\ + + +"$(INTDIR)\ecb3_enc.obj" : $(SOURCE) $(DEP_CPP_ECB3_) "$(INTDIR)" + + +SOURCE=.\ecb_enc.c +DEP_CPP_ECB_E=\ +	"..\..\include\win32\config.h"\ +	".\des.h"\ +	".\des_locl.h"\ +	".\spr.h"\ +	 + +"$(INTDIR)\ecb_enc.obj" : $(SOURCE) $(DEP_CPP_ECB_E) "$(INTDIR)" + + +SOURCE=.\ede_enc.c +DEP_CPP_EDE_E=\ +	"..\..\include\win32\config.h"\ +	".\des.h"\ +	".\des_locl.h"\ +	 + +"$(INTDIR)\ede_enc.obj" : $(SOURCE) $(DEP_CPP_EDE_E) "$(INTDIR)" + + +SOURCE=.\enc_read.c +DEP_CPP_ENC_R=\ +	"..\..\include\win32\config.h"\ +	".\des.h"\ +	".\des_locl.h"\ +	 + +"$(INTDIR)\enc_read.obj" : $(SOURCE) $(DEP_CPP_ENC_R) "$(INTDIR)" + + +SOURCE=.\enc_writ.c +DEP_CPP_ENC_W=\ +	"..\..\include\win32\config.h"\ +	".\des.h"\ +	".\des_locl.h"\ +	 + +"$(INTDIR)\enc_writ.obj" : $(SOURCE) $(DEP_CPP_ENC_W) "$(INTDIR)" + + +SOURCE=.\fcrypt.c +DEP_CPP_FCRYP=\ +	"..\..\include\win32\config.h"\ +	"..\..\include\win32\ktypes.h"\ +	".\des.h"\ +	".\des_locl.h"\ +	".\md5.h"\ +	{$(INCLUDE)}"sys\types.h"\ +	 + +"$(INTDIR)\fcrypt.obj" : $(SOURCE) $(DEP_CPP_FCRYP) "$(INTDIR)" + + +SOURCE=.\key_par.c +DEP_CPP_KEY_P=\ +	"..\..\include\win32\config.h"\ +	".\des.h"\ +	".\des_locl.h"\ +	 + +"$(INTDIR)\key_par.obj" : $(SOURCE) $(DEP_CPP_KEY_P) "$(INTDIR)" + + +SOURCE=.\ncbc_enc.c +DEP_CPP_NCBC_=\ +	"..\..\include\win32\config.h"\ +	".\des.h"\ +	".\des_locl.h"\ +	 + +"$(INTDIR)\ncbc_enc.obj" : $(SOURCE) $(DEP_CPP_NCBC_) "$(INTDIR)" + + +SOURCE=.\ofb64ede.c +DEP_CPP_OFB64=\ +	"..\..\include\win32\config.h"\ +	".\des.h"\ +	".\des_locl.h"\ +	 + +"$(INTDIR)\ofb64ede.obj" : $(SOURCE) $(DEP_CPP_OFB64) "$(INTDIR)" + + +SOURCE=.\ofb64enc.c +DEP_CPP_OFB64E=\ +	"..\..\include\win32\config.h"\ +	".\des.h"\ +	".\des_locl.h"\ +	 + +"$(INTDIR)\ofb64enc.obj" : $(SOURCE) $(DEP_CPP_OFB64E) "$(INTDIR)" + + +SOURCE=.\ofb_enc.c +DEP_CPP_OFB_E=\ +	"..\..\include\win32\config.h"\ +	".\des.h"\ +	".\des_locl.h"\ +	 + +"$(INTDIR)\ofb_enc.obj" : $(SOURCE) $(DEP_CPP_OFB_E) "$(INTDIR)" + + +SOURCE=.\passwd_dlg.c +DEP_CPP_PASSW=\ +	"..\..\include\win32\config.h"\ +	".\passwd_dlg.h"\ +	 + +"$(INTDIR)\passwd_dlg.obj" : $(SOURCE) $(DEP_CPP_PASSW) "$(INTDIR)" + + +SOURCE=.\pcbc_enc.c +DEP_CPP_PCBC_=\ +	"..\..\include\win32\config.h"\ +	".\des.h"\ +	".\des_locl.h"\ +	 + +"$(INTDIR)\pcbc_enc.obj" : $(SOURCE) $(DEP_CPP_PCBC_) "$(INTDIR)" + + +SOURCE=.\qud_cksm.c +DEP_CPP_QUD_C=\ +	"..\..\include\win32\config.h"\ +	".\des.h"\ +	".\des_locl.h"\ +	 + +"$(INTDIR)\qud_cksm.obj" : $(SOURCE) $(DEP_CPP_QUD_C) "$(INTDIR)" + + +SOURCE=.\read_pwd.c +DEP_CPP_READ_=\ +	"..\..\include\win32\config.h"\ +	".\des.h"\ +	".\des_locl.h"\ +	 + +"$(INTDIR)\read_pwd.obj" : $(SOURCE) $(DEP_CPP_READ_) "$(INTDIR)" + + +SOURCE=.\rnd_keys.c +DEP_CPP_RND_K=\ +	"..\..\include\win32\config.h"\ +	"..\..\include\win32\ktypes.h"\ +	".\des.h"\ +	".\des_locl.h"\ +	{$(INCLUDE)}"sys\types.h"\ +	 + +"$(INTDIR)\rnd_keys.obj" : $(SOURCE) $(DEP_CPP_RND_K) "$(INTDIR)" + + +SOURCE=.\rpc_enc.c +DEP_CPP_RPC_E=\ +	"..\..\include\win32\config.h"\ +	".\des.h"\ +	".\des_locl.h"\ +	".\des_ver.h"\ +	".\rpc_des.h"\ +	 + +"$(INTDIR)\rpc_enc.obj" : $(SOURCE) $(DEP_CPP_RPC_E) "$(INTDIR)" + + +SOURCE=.\set_key.c +DEP_CPP_SET_K=\ +	"..\..\include\win32\config.h"\ +	".\des.h"\ +	".\des_locl.h"\ +	".\podd.h"\ +	".\sk.h"\ +	 + +"$(INTDIR)\set_key.obj" : $(SOURCE) $(DEP_CPP_SET_K) "$(INTDIR)" + + +SOURCE=.\str2key.c +DEP_CPP_STR2K=\ +	"..\..\include\win32\config.h"\ +	".\des.h"\ +	".\des_locl.h"\ +	 + +"$(INTDIR)\str2key.obj" : $(SOURCE) $(DEP_CPP_STR2K) "$(INTDIR)" + + +SOURCE=.\supp.c +DEP_CPP_SUPP_=\ +	"..\..\include\win32\config.h"\ +	".\des.h"\ +	".\des_locl.h"\ +	 + +"$(INTDIR)\supp.obj" : $(SOURCE) $(DEP_CPP_SUPP_) "$(INTDIR)" + + +SOURCE=.\passwd_dialog.rc + +"$(INTDIR)\passwd_dialog.res" : $(SOURCE) "$(INTDIR)" +	$(RSC) $(RSC_PROJ) $(SOURCE) +	 + +!IF  "$(CFG)" == "des - Win32 Release" + +"roken - Win32 Release" :  +   cd "\tmp\wirus-krb\krb4-pre-0.9.9\lib\roken" +   $(MAKE) /$(MAKEFLAGS) /F ".\roken.mak" CFG="roken - Win32 Release"  +   cd "..\des" + +"roken - Win32 ReleaseCLEAN" :  +   cd "\tmp\wirus-krb\krb4-pre-0.9.9\lib\roken" +   $(MAKE) /$(MAKEFLAGS) CLEAN /F ".\roken.mak" CFG="roken - Win32 Release"\ + RECURSE=1  +   cd "..\des" + +!ELSEIF  "$(CFG)" == "des - Win32 Debug" + +"roken - Win32 Debug" :  +   cd "\tmp\wirus-krb\krb4-pre-0.9.9\lib\roken" +   $(MAKE) /$(MAKEFLAGS) /F ".\roken.mak" CFG="roken - Win32 Debug"  +   cd "..\des" + +"roken - Win32 DebugCLEAN" :  +   cd "\tmp\wirus-krb\krb4-pre-0.9.9\lib\roken" +   $(MAKE) /$(MAKEFLAGS) CLEAN /F ".\roken.mak" CFG="roken - Win32 Debug"\ + RECURSE=1  +   cd "..\des" + +!ENDIF  + + +!ENDIF  + diff --git a/crypto/libdes/des.man b/crypto/libdes/des.man new file mode 100644 index 000000000000..734119906b8f --- /dev/null +++ b/crypto/libdes/des.man @@ -0,0 +1,186 @@ +.TH DES 1  +.SH NAME +des - encrypt or decrypt data using Data Encryption Standard +.SH SYNOPSIS +.B des +( +.B \-e +| +.B \-E +) | ( +.B \-d +| +.B \-D +) | ( +.B \-\fR[\fPcC\fR][\fPckname\fR]\fP +) | +[ +.B \-b3hfs +] [ +.B \-k +.I key +] +] [ +.B \-u\fR[\fIuuname\fR] +[ +.I input-file +[ +.I output-file +] ] +.SH DESCRIPTION +.B des +encrypts and decrypts data using the +Data Encryption Standard algorithm. +One of +.B \-e, \-E +(for encrypt) or +.B \-d, \-D +(for decrypt) must be specified. +It is also possible to use +.B \-c +or +.B \-C +in conjunction or instead of the a encrypt/decrypt option to generate +a 16 character hexadecimal checksum, generated via the +.I des_cbc_cksum. +.LP +Two standard encryption modes are supported by the +.B des +program, Cipher Block Chaining (the default) and Electronic Code Book +(specified with +.B \-b +). +.LP +The key used for the DES +algorithm is obtained by prompting the user unless the +.B `\-k +.I key' +option is given. +If the key is an argument to the +.B des +command, it is potentially visible to users executing +.BR ps (1) +or a derivative.  To minimise this possibility, +.B des +takes care to destroy the key argument immediately upon entry. +If your shell keeps a history file be careful to make sure it is not +world readable. +.LP +Since this program attempts to maintain compatability with sunOS's +des(1) command, there are 2 different methods used to convert the user +supplied key to a des key. +Whenever and one or more of +.B \-E, \-D, \-C +or +.B \-3 +options are used, the key conversion procedure will not be compatible +with the sunOS des(1) version but will use all the user supplied +character to generate the des key. +.B des +command reads from standard input unless +.I input-file +is specified and writes to standard output unless +.I output-file +is given. +.SH OPTIONS +.TP +.B \-b +Select ECB +(eight bytes at a time) encryption mode. +.TP +.B \-3 +Encrypt using triple encryption. +By default triple cbc encryption is used but if the +.B \-b +option is used then triple ecb encryption is performed. +If the key is less than 8 characters long, the flag has no effect. +.TP +.B \-e +Encrypt data using an 8 byte key in a manner compatible with sunOS +des(1). +.TP +.B \-E +Encrypt data using a key of nearly unlimited length (1024 bytes). +This will product a more secure encryption. +.TP +.B \-d +Decrypt data that was encrypted with the \-e option. +.TP +.B \-D +Decrypt data that was encrypted with the \-E option. +.TP +.B \-c +Generate a 16 character hexadecimal cbc checksum and output this to +stderr. +If a filename was specified after the +.B \-c +option, the checksum is output to that file. +The checksum is generated using a key generated in a sunOS compatible +manner. +.TP +.B \-C +A cbc checksum is generated in the same manner as described for the +.B \-c +option but the DES key is generated in the same manner as used for the +.B \-E +and +.B \-D +options +.TP +.B \-f +Does nothing - allowed for compatibility with sunOS des(1) command. +.TP +.B \-s +Does nothing - allowed for compatibility with sunOS des(1) command. +.TP +.B "\-k \fIkey\fP" +Use the encryption  +.I key +specified. +.TP +.B "\-h" +The +.I key +is assumed to be a 16 character hexadecimal number. +If the +.B "\-3" +option is used the key is assumed to be a 32 character hexadecimal +number. +.TP +.B \-u +This flag is used to read and write uuencoded files.  If decrypting, +the input file is assumed to contain uuencoded, DES encrypted data. +If encrypting, the characters following the -u are used as the name of +the uuencoded file to embed in the begin line of the uuencoded +output.  If there is no name specified after the -u, the name text.des +will be embedded in the header. +.SH SEE ALSO +.B ps (1) +.B des_crypt(3) +.SH BUGS +.LP +The problem with using the +.B -e +option is the short key length. +It would be better to use a real 56-bit key rather than an +ASCII-based 56-bit pattern.  Knowing that the key was derived from ASCII +radically reduces the time necessary for a brute-force cryptographic attack. +My attempt to remove this problem is to add an alternative text-key to +DES-key function.  This alternative function (accessed via +.B -E, -D, -S +and +.B -3 +) +uses DES to help generate the key. +.LP +Be carefully when using the -u option.  Doing des -ud <filename> will +not decrypt filename (the -u option will gobble the d option). +.LP +The VMS operating system operates in a world where files are always a +multiple of 512 bytes.  This causes problems when encrypted data is +send from unix to VMS since a 88 byte file will suddenly be padded +with 424 null bytes.  To get around this problem, use the -u option +to uuencode the data before it is send to the VMS system. +.SH AUTHOR +.LP +Eric Young (eay@mincom.oz.au or eay@psych.psy.uq.oz.au) diff --git a/crypto/libdes/des.org b/crypto/libdes/des.org new file mode 100644 index 000000000000..c1eef51bfe7e --- /dev/null +++ b/crypto/libdes/des.org @@ -0,0 +1,291 @@ +/* crypto/des/des.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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.] + */ + +#ifndef HEADER_DES_H +#define HEADER_DES_H + +#ifdef  __cplusplus +extern "C" { +#endif + +#include <stdio.h> + +/* If this is set to 'unsigned int' on a DEC Alpha, this gives about a + * %20 speed up (longs are 8 bytes, int's are 4). */ +#ifndef DES_LONG +#define DES_LONG unsigned long +#endif + +typedef unsigned char des_cblock[8]; +typedef struct des_ks_struct +	{ +	union	{ +		des_cblock _; +		/* make sure things are correct size on machines with +		 * 8 byte longs */ +		DES_LONG pad[2]; +		} ks; +#undef _ +#define _	ks._ +	} des_key_schedule[16]; + +#define DES_KEY_SZ 	(sizeof(des_cblock)) +#define DES_SCHEDULE_SZ (sizeof(des_key_schedule)) + +#define DES_ENCRYPT	1 +#define DES_DECRYPT	0 + +#define DES_CBC_MODE	0 +#define DES_PCBC_MODE	1 + +#define des_ecb2_encrypt(i,o,k1,k2,e) \ +	des_ecb3_encrypt((i),(o),(k1),(k2),(k1),(e)) + +#define des_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) \ +	des_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e)) + +#define des_ede2_cfb64_encrypt(i,o,l,k1,k2,iv,n,e) \ +	des_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n),(e)) + +#define des_ede2_ofb64_encrypt(i,o,l,k1,k2,iv,n) \ +	des_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n)) + +#define C_Block des_cblock +#define Key_schedule des_key_schedule +#ifdef KERBEROS +#define ENCRYPT DES_ENCRYPT +#define DECRYPT DES_DECRYPT +#endif +#define KEY_SZ DES_KEY_SZ +#define string_to_key des_string_to_key +#define read_pw_string des_read_pw_string +#define random_key des_random_key +#define pcbc_encrypt des_pcbc_encrypt +#define set_key des_set_key +#define key_sched des_key_sched +#define ecb_encrypt des_ecb_encrypt +#define cbc_encrypt des_cbc_encrypt +#define ncbc_encrypt des_ncbc_encrypt +#define xcbc_encrypt des_xcbc_encrypt +#define cbc_cksum des_cbc_cksum +#define quad_cksum des_quad_cksum + +/* For compatibility with the MIT lib - eay 20/05/92 */ +typedef des_key_schedule bit_64; +#define des_fixup_key_parity des_set_odd_parity +#define des_check_key_parity check_parity + +extern int des_check_key;	/* defaults to false */ +extern int des_rw_mode;		/* defaults to DES_PCBC_MODE */ + +/* The next line is used to disable full ANSI prototypes, if your + * compiler has problems with the prototypes, make sure this line always + * evaluates to true :-) */ +#if defined(MSDOS) || defined(__STDC__) +#undef NOPROTO +#endif +#ifndef NOPROTO +char *des_options(void); +void des_ecb3_encrypt(des_cblock *input,des_cblock *output, +	des_key_schedule ks1,des_key_schedule ks2, +	des_key_schedule ks3, int enc); +DES_LONG des_cbc_cksum(des_cblock *input,des_cblock *output, +	long length,des_key_schedule schedule,des_cblock *ivec); +void des_cbc_encrypt(des_cblock *input,des_cblock *output,long length, +	des_key_schedule schedule,des_cblock *ivec,int enc); +void des_ncbc_encrypt(des_cblock *input,des_cblock *output,long length, +	des_key_schedule schedule,des_cblock *ivec,int enc); +void des_xcbc_encrypt(des_cblock *input,des_cblock *output,long length, +	des_key_schedule schedule,des_cblock *ivec, +	des_cblock *inw,des_cblock *outw,int enc); +void des_3cbc_encrypt(des_cblock *input,des_cblock *output,long length, +	des_key_schedule sk1,des_key_schedule sk2, +	des_cblock *ivec1,des_cblock *ivec2,int enc); +void des_cfb_encrypt(unsigned char *in,unsigned char *out,int numbits, +	long length,des_key_schedule schedule,des_cblock *ivec,int enc); +void des_ecb_encrypt(des_cblock *input,des_cblock *output, +	des_key_schedule ks,int enc); +void des_encrypt(DES_LONG *data,des_key_schedule ks, int enc); +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, +	des_key_schedule ks2, des_key_schedule ks3); +void des_ede3_cbc_encrypt(des_cblock *input, des_cblock *output,  +	long length, des_key_schedule ks1, des_key_schedule ks2,  +	des_key_schedule ks3, des_cblock *ivec, int enc); +void des_ede3_cfb64_encrypt(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 encrypt); +void des_ede3_ofb64_encrypt(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_enc_read(int fd,char *buf,int len,des_key_schedule sched, +	des_cblock *iv); +int des_enc_write(int fd,char *buf,int len,des_key_schedule sched, +	des_cblock *iv); +char *des_fcrypt(const char *buf,const char *salt, char *ret); +#ifdef PERL5 +char *des_crypt(const char *buf,const char *salt); +#else +/* some stupid compilers complain because I have declared char instead + * of const char */ +#ifdef HEADER_DES_LOCL_H +char *crypt(const char *buf,const char *salt); +#else +char *crypt(); +#endif +#endif +void des_ofb_encrypt(unsigned char *in,unsigned char *out, +	int numbits,long length,des_key_schedule schedule,des_cblock *ivec); +void des_pcbc_encrypt(des_cblock *input,des_cblock *output,long length, +	des_key_schedule schedule,des_cblock *ivec,int enc); +DES_LONG des_quad_cksum(des_cblock *input,des_cblock *output, +	long length,int out_count,des_cblock *seed); +void des_random_seed(des_cblock key); +void des_random_key(des_cblock ret); +int des_read_password(des_cblock *key,char *prompt,int verify); +int des_read_2passwords(des_cblock *key1,des_cblock *key2, +	char *prompt,int verify); +int des_read_pw_string(char *buf,int length,char *prompt,int verify); +void des_set_odd_parity(des_cblock *key); +int des_is_weak_key(des_cblock *key); +int des_set_key(des_cblock *key,des_key_schedule schedule); +int des_key_sched(des_cblock *key,des_key_schedule schedule); +void des_string_to_key(char *str,des_cblock *key); +void des_string_to_2keys(char *str,des_cblock *key1,des_cblock *key2); +void des_cfb64_encrypt(unsigned char *in, unsigned char *out, long length, +	des_key_schedule schedule, des_cblock *ivec, int *num, int enc); +void des_ofb64_encrypt(unsigned char *in, unsigned char *out, long length, +	des_key_schedule schedule, des_cblock *ivec, int *num); + +/* Extra functions from Mark Murray <mark@grondar.za> */ +void des_cblock_print_file(des_cblock *cb, FILE *fp); +/* The following functions are not in the normal unix build or the + * SSLeay build.  When using the SSLeay build, use RAND_seed() + * and RAND_bytes() instead. */ +int des_new_random_key(des_cblock *key); +void des_init_random_number_generator(des_cblock *key); +void des_set_random_generator_seed(des_cblock *key); +void des_set_sequence_number(des_cblock new_sequence_number); +void des_generate_random_block(des_cblock *block); + +#else + +char *des_options(); +void des_ecb3_encrypt(); +DES_LONG des_cbc_cksum(); +void des_cbc_encrypt(); +void des_ncbc_encrypt(); +void des_xcbc_encrypt(); +void des_3cbc_encrypt(); +void des_cfb_encrypt(); +void des_ede3_cfb64_encrypt(); +void des_ede3_ofb64_encrypt(); +void des_ecb_encrypt(); +void des_encrypt(); +void des_encrypt2(); +void des_encrypt3(); +void des_decrypt3(); +void des_ede3_cbc_encrypt(); +int des_enc_read(); +int des_enc_write(); +char *des_fcrypt(); +#ifdef PERL5 +char *des_crypt(); +#else +char *crypt(); +#endif +void des_ofb_encrypt(); +void des_pcbc_encrypt(); +DES_LONG des_quad_cksum(); +void des_random_seed(); +void des_random_key(); +int des_read_password(); +int des_read_2passwords(); +int des_read_pw_string(); +void des_set_odd_parity(); +int des_is_weak_key(); +int des_set_key(); +int des_key_sched(); +void des_string_to_key(); +void des_string_to_2keys(); +void des_cfb64_encrypt(); +void des_ofb64_encrypt(); + +/* Extra functions from Mark Murray <mark@grondar.za> */ +void des_cblock_print_file(); +/* The following functions are not in the normal unix build or the + * SSLeay build.  When using the SSLeay build, use RAND_seed() + * and RAND_bytes() instead. */ +#ifdef FreeBSD +int des_new_random_key(); +void des_init_random_number_generator(); +void des_set_random_generator_seed(); +void des_set_sequence_number(); +void des_generate_random_block(); +#endif + +#endif + +#ifdef  __cplusplus +} +#endif + +#endif diff --git a/crypto/libdes/des.pl b/crypto/libdes/des.pl new file mode 100644 index 000000000000..449c78253480 --- /dev/null +++ b/crypto/libdes/des.pl @@ -0,0 +1,552 @@ +#!/usr/local/bin/perl +# des.pl - eric young 22/11/1991 eay@mincom.oz.au or eay@psych.psy.uq.oz.au +# +# 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("usr 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/crypto/libdes/des_crypt.man b/crypto/libdes/des_crypt.man new file mode 100644 index 000000000000..9feb447129eb --- /dev/null +++ b/crypto/libdes/des_crypt.man @@ -0,0 +1,508 @@ +.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_3ecb_encrypt, des_cbc_encrypt, +des_3cbc_encrypt, +des_pcbc_encrypt, des_cfb_encrypt, des_ofb_encrypt, +des_cbc_cksum, des_quad_cksum, +des_enc_read, des_enc_write, des_set_odd_parity, +des_is_weak_key, crypt \- (non USA) DES encryption +.SH SYNOPSIS +.nf +.nj +.ft B +#include <des.h> +.PP +.B int des_read_password(key,prompt,verify) +des_cblock *key; +char *prompt; +int verify; +.PP +.B int des_read_2password(key1,key2,prompt,verify) +des_cblock *key1,*key2; +char *prompt; +int verify; +.PP +.B int des_string_to_key(str,key) +char *str; +des_cblock *key; +.PP +.B int des_string_to_2keys(str,key1,key2) +char *str; +des_cblock *key1,*key2; +.PP +.B int des_read_pw_string(buf,length,prompt,verify) +char *buf; +int length; +char *prompt; +int verify; +.PP +.B int des_random_key(key) +des_cblock *key; +.PP +.B int des_set_key(key,schedule) +des_cblock *key; +des_key_schedule schedule; +.PP +.B int des_key_sched(key,schedule) +des_cblock *key; +des_key_schedule schedule; +.PP +.B int des_ecb_encrypt(input,output,schedule,encrypt) +des_cblock *input; +des_cblock *output; +des_key_schedule schedule; +int encrypt; +.PP +.B int des_3ecb_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_3ecb_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_3ecb_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@mincom.oz.au or eay@psych.psy.uq.oz.au) diff --git a/crypto/libdes/des_enc.c b/crypto/libdes/des_enc.c new file mode 100644 index 000000000000..d08fe65013a6 --- /dev/null +++ b/crypto/libdes/des_enc.c @@ -0,0 +1,301 @@ +/* crypto/des/des_enc.c */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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 "des_locl.h" + +void des_encrypt(data, ks, encrypt) +DES_LONG *data; +des_key_schedule ks; +int encrypt; +	{ +	register DES_LONG l,r,t,u; +#ifdef DES_PTR +	register unsigned char *des_SP=(unsigned char *)des_SPtrans; +#endif +#ifndef DES_UNROLL +	register int i; +#endif +	register DES_LONG *s; + +	r=data[0]; +	l=data[1]; + +	IP(r,l); +	/* Things have been modified so that the initial rotate is +	 * done outside the loop.  This required the +	 * des_SPtrans values in sp.h to be rotated 1 bit to the right. +	 * One perl script later and things have a 5% speed up on a sparc2. +	 * Thanks to Richard Outerbridge <71755.204@CompuServe.COM> +	 * for pointing this out. */ +	/* clear the top bits on machines with 8byte longs */ +	/* shift left by 2 */ +	r=ROTATE(r,29)&0xffffffffL; +	l=ROTATE(l,29)&0xffffffffL; + +	s=(DES_LONG *)ks; +	/* I don't know if it is worth the effort of loop unrolling the +	 * inner loop */ +	if (encrypt) +		{ +#ifdef DES_UNROLL +		D_ENCRYPT(l,r, 0); /*  1 */ +		D_ENCRYPT(r,l, 2); /*  2 */ +		D_ENCRYPT(l,r, 4); /*  3 */ +		D_ENCRYPT(r,l, 6); /*  4 */ +		D_ENCRYPT(l,r, 8); /*  5 */ +		D_ENCRYPT(r,l,10); /*  6 */ +		D_ENCRYPT(l,r,12); /*  7 */ +		D_ENCRYPT(r,l,14); /*  8 */ +		D_ENCRYPT(l,r,16); /*  9 */ +		D_ENCRYPT(r,l,18); /*  10 */ +		D_ENCRYPT(l,r,20); /*  11 */ +		D_ENCRYPT(r,l,22); /*  12 */ +		D_ENCRYPT(l,r,24); /*  13 */ +		D_ENCRYPT(r,l,26); /*  14 */ +		D_ENCRYPT(l,r,28); /*  15 */ +		D_ENCRYPT(r,l,30); /*  16 */ +#else +		for (i=0; i<32; i+=8) +			{ +			D_ENCRYPT(l,r,i+0); /*  1 */ +			D_ENCRYPT(r,l,i+2); /*  2 */ +			D_ENCRYPT(l,r,i+4); /*  3 */ +			D_ENCRYPT(r,l,i+6); /*  4 */ +			} +#endif +		} +	else +		{ +#ifdef DES_UNROLL +		D_ENCRYPT(l,r,30); /* 16 */ +		D_ENCRYPT(r,l,28); /* 15 */ +		D_ENCRYPT(l,r,26); /* 14 */ +		D_ENCRYPT(r,l,24); /* 13 */ +		D_ENCRYPT(l,r,22); /* 12 */ +		D_ENCRYPT(r,l,20); /* 11 */ +		D_ENCRYPT(l,r,18); /* 10 */ +		D_ENCRYPT(r,l,16); /*  9 */ +		D_ENCRYPT(l,r,14); /*  8 */ +		D_ENCRYPT(r,l,12); /*  7 */ +		D_ENCRYPT(l,r,10); /*  6 */ +		D_ENCRYPT(r,l, 8); /*  5 */ +		D_ENCRYPT(l,r, 6); /*  4 */ +		D_ENCRYPT(r,l, 4); /*  3 */ +		D_ENCRYPT(l,r, 2); /*  2 */ +		D_ENCRYPT(r,l, 0); /*  1 */ +#else +		for (i=30; i>0; i-=8) +			{ +			D_ENCRYPT(l,r,i-0); /* 16 */ +			D_ENCRYPT(r,l,i-2); /* 15 */ +			D_ENCRYPT(l,r,i-4); /* 14 */ +			D_ENCRYPT(r,l,i-6); /* 13 */ +			} +#endif +		} + +	/* rotate and clear the top bits on machines with 8byte longs */ +	l=ROTATE(l,3)&0xffffffffL; +	r=ROTATE(r,3)&0xffffffffL; + +	FP(r,l); +	data[0]=l; +	data[1]=r; +	l=r=t=u=0; +	} + +void des_encrypt2(data, ks, encrypt) +DES_LONG *data; +des_key_schedule ks; +int encrypt; +	{ +	register DES_LONG l,r,t,u; +#ifdef DES_PTR +	register unsigned char *des_SP=(unsigned char *)des_SPtrans; +#endif +#ifndef DES_UNROLL +	register int i; +#endif +	register DES_LONG *s; + +	r=data[0]; +	l=data[1]; + +	/* Things have been modified so that the initial rotate is +	 * done outside the loop.  This required the +	 * des_SPtrans values in sp.h to be rotated 1 bit to the right. +	 * One perl script later and things have a 5% speed up on a sparc2. +	 * Thanks to Richard Outerbridge <71755.204@CompuServe.COM> +	 * for pointing this out. */ +	/* clear the top bits on machines with 8byte longs */ +	r=ROTATE(r,29)&0xffffffff; +	l=ROTATE(l,29)&0xffffffff; + +	s=(DES_LONG *)ks; +	/* I don't know if it is worth the effort of loop unrolling the +	 * inner loop */ +	if (encrypt) +		{ +#ifdef DES_UNROLL +		D_ENCRYPT(l,r, 0); /*  1 */ +		D_ENCRYPT(r,l, 2); /*  2 */ +		D_ENCRYPT(l,r, 4); /*  3 */ +		D_ENCRYPT(r,l, 6); /*  4 */ +		D_ENCRYPT(l,r, 8); /*  5 */ +		D_ENCRYPT(r,l,10); /*  6 */ +		D_ENCRYPT(l,r,12); /*  7 */ +		D_ENCRYPT(r,l,14); /*  8 */ +		D_ENCRYPT(l,r,16); /*  9 */ +		D_ENCRYPT(r,l,18); /*  10 */ +		D_ENCRYPT(l,r,20); /*  11 */ +		D_ENCRYPT(r,l,22); /*  12 */ +		D_ENCRYPT(l,r,24); /*  13 */ +		D_ENCRYPT(r,l,26); /*  14 */ +		D_ENCRYPT(l,r,28); /*  15 */ +		D_ENCRYPT(r,l,30); /*  16 */ +#else +		for (i=0; i<32; i+=8) +			{ +			D_ENCRYPT(l,r,i+0); /*  1 */ +			D_ENCRYPT(r,l,i+2); /*  2 */ +			D_ENCRYPT(l,r,i+4); /*  3 */ +			D_ENCRYPT(r,l,i+6); /*  4 */ +			} +#endif +		} +	else +		{ +#ifdef DES_UNROLL +		D_ENCRYPT(l,r,30); /* 16 */ +		D_ENCRYPT(r,l,28); /* 15 */ +		D_ENCRYPT(l,r,26); /* 14 */ +		D_ENCRYPT(r,l,24); /* 13 */ +		D_ENCRYPT(l,r,22); /* 12 */ +		D_ENCRYPT(r,l,20); /* 11 */ +		D_ENCRYPT(l,r,18); /* 10 */ +		D_ENCRYPT(r,l,16); /*  9 */ +		D_ENCRYPT(l,r,14); /*  8 */ +		D_ENCRYPT(r,l,12); /*  7 */ +		D_ENCRYPT(l,r,10); /*  6 */ +		D_ENCRYPT(r,l, 8); /*  5 */ +		D_ENCRYPT(l,r, 6); /*  4 */ +		D_ENCRYPT(r,l, 4); /*  3 */ +		D_ENCRYPT(l,r, 2); /*  2 */ +		D_ENCRYPT(r,l, 0); /*  1 */ +#else +		for (i=30; i>0; i-=8) +			{ +			D_ENCRYPT(l,r,i-0); /* 16 */ +			D_ENCRYPT(r,l,i-2); /* 15 */ +			D_ENCRYPT(l,r,i-4); /* 14 */ +			D_ENCRYPT(r,l,i-6); /* 13 */ +			} +#endif +		} +	/* rotate and clear the top bits on machines with 8byte longs */ +	data[0]=ROTATE(l,3)&0xffffffff; +	data[1]=ROTATE(r,3)&0xffffffff; +	l=r=t=u=0; +	} + +void des_encrypt3(data,ks1,ks2,ks3) +DES_LONG *data; +des_key_schedule ks1; +des_key_schedule ks2; +des_key_schedule ks3; +	{ +	register DES_LONG l,r; + +	l=data[0]; +	r=data[1]; +	IP(l,r); +	data[0]=l; +	data[1]=r; +	des_encrypt2((DES_LONG *)data,ks1,DES_ENCRYPT); +	des_encrypt2((DES_LONG *)data,ks2,DES_DECRYPT); +	des_encrypt2((DES_LONG *)data,ks3,DES_ENCRYPT); +	l=data[0]; +	r=data[1]; +	FP(r,l); +	data[0]=l; +	data[1]=r; +	} + +void des_decrypt3(data,ks1,ks2,ks3) +DES_LONG *data; +des_key_schedule ks1; +des_key_schedule ks2; +des_key_schedule ks3; +	{ +	register DES_LONG l,r; + +	l=data[0]; +	r=data[1]; +	IP(l,r); +	data[0]=l; +	data[1]=r; +	des_encrypt2((DES_LONG *)data,ks3,DES_DECRYPT); +	des_encrypt2((DES_LONG *)data,ks2,DES_ENCRYPT); +	des_encrypt2((DES_LONG *)data,ks1,DES_DECRYPT); +	l=data[0]; +	r=data[1]; +	FP(r,l); +	data[0]=l; +	data[1]=r; +	} + diff --git a/crypto/libdes/des_locl.h b/crypto/libdes/des_locl.h new file mode 100644 index 000000000000..09fcf354545c --- /dev/null +++ b/crypto/libdes/des_locl.h @@ -0,0 +1,535 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" + +/* +  if (we have termios.h) +    define TERMIOS +  else if (we have termio.h) +    define TERMIO +*/ +#ifdef HAVE_TERMIOS_H + +#define TERMIOS + +#else /* !HAVE_TERMIOS_H */ + +#ifdef HAVE_TERMIO_H +#define TERMIO +#endif + +#endif /* !HAVE_TERMIOS_H */ + +#endif /* HAVE_CONFIG_H */ + +/* crypto/des/des_locl.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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.] + */ + +/* WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING + * + * Always modify des_locl.org since des_locl.h is automatically generated from + * it during SSLeay configuration. + * + * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING + */ + +#ifndef HEADER_DES_LOCL_H +#define HEADER_DES_LOCL_H + +#if defined(WIN32) || defined(WIN16) +#ifndef MSDOS +#define MSDOS +#endif +#endif + +#include <stdio.h> +#include <stdlib.h> +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif +#ifdef HAVE_IO_H +#include <io.h> +#endif +#include "des.h" + +#ifndef DES_DEFAULT_OPTIONS +/* the following is tweaked from a config script, that is why it is a + * protected undef/define */ +#ifndef DES_PTR +#undef DES_PTR +#endif + +/* This helps C compiler generate the correct code for multiple functional + * units.  It reduces register dependancies at the expense of 2 more + * registers */ +#ifndef DES_RISC1 +#undef DES_RISC1 +#endif + +#ifndef DES_RISC2 +#undef DES_RISC2 +#endif + +#if defined(DES_RISC1) && defined(DES_RISC2) +YOU SHOULD NOT HAVE BOTH DES_RISC1 AND DES_RISC2 DEFINED!!!!! +#endif + +/* Unroll the inner loop, this sometimes helps, sometimes hinders. + * Very mucy CPU dependant */ +#ifndef DES_UNROLL +#undef DES_UNROLL +#endif + +/* These default values were supplied by + * Peter Gutman <pgut001@cs.auckland.ac.nz> + * They are only used if nothing else has been defined */ +#if !defined(DES_PTR) && !defined(DES_RISC1) && !defined(DES_RISC2) && !defined(DES_UNROLL) +/* Special defines which change the way the code is built depending on the +   CPU and OS.  For SGI machines you can use _MIPS_SZLONG (32 or 64) to find +   even newer MIPS CPU's, but at the moment one size fits all for +   optimization options.  Older Sparc's work better with only UNROLL, but +   there's no way to tell at compile time what it is you're running on */ +  +#if defined( sun )		/* Newer Sparc's */ +  #define DES_PTR +  #define DES_RISC1 +  #define DES_UNROLL +#elif defined( __ultrix )	/* Older MIPS */ +  #define DES_PTR +  #define DES_RISC2 +  #define DES_UNROLL +#elif defined( __osf1__ )	/* Alpha */ +  #define DES_PTR +  #define DES_RISC2 +#elif defined ( _AIX )		/* RS6000 */ +  /* Unknown */ +#elif defined( __hpux )		/* HP-PA */ +  #define DES_UNROLL +#elif defined( __aux )		/* 68K */ +  /* Unknown */ +#elif defined( __dgux )		/* 88K (but P6 in latest boxes) */ +  #define DES_UNROLL +#elif defined( __sgi )		/* Newer MIPS */ +  #define DES_PTR +  #define DES_RISC2 +  #define DES_UNROLL +#elif defined( i386 )		/* x86 boxes, should be gcc */ +  #define DES_PTR +  #define DES_RISC1 +  #define DES_UNROLL +#endif /* Systems-specific speed defines */ +#endif + +#endif /* DES_DEFAULT_OPTIONS */ + +#ifdef MSDOS		/* Visual C++ 2.1 (Windows NT/95) */ +#include <stdlib.h> +#include <errno.h> +#include <time.h> +#include <io.h> +#ifndef RAND +#define RAND +#endif +#undef NOPROTO +#endif + +#if defined(__STDC__) || defined(VMS) || defined(M_XENIX) || defined(MSDOS) || defined(WIN32) +#include <string.h> +#endif + +#ifndef RAND +#define RAND +#endif + +#ifdef linux +#undef RAND +#endif + +#ifdef MSDOS +#define getpid() 2 +#define RAND +#undef NOPROTO +#endif + +#if defined(NOCONST) +#define const +#endif + +#ifdef __STDC__ +#undef NOPROTO +#endif + +#ifdef RAND +#define srandom(s) srand(s) +#define random rand +#endif + +#define ITERATIONS 16 +#define HALF_ITERATIONS 8 + +/* used in des_read and des_write */ +#define MAXWRITE	(1024*16) +#define BSIZE		(MAXWRITE+4) + +#define c2l(c,l)	(l =((DES_LONG)(*((c)++)))    , \ +			 l|=((DES_LONG)(*((c)++)))<< 8L, \ +			 l|=((DES_LONG)(*((c)++)))<<16L, \ +			 l|=((DES_LONG)(*((c)++)))<<24L) + +/* NOTE - c is not incremented as per c2l */ +#define c2ln(c,l1,l2,n)	{ \ +			c+=n; \ +			l1=l2=0; \ +			switch (n) { \ +			case 8: l2 =((DES_LONG)(*(--(c))))<<24L; \ +			case 7: l2|=((DES_LONG)(*(--(c))))<<16L; \ +			case 6: l2|=((DES_LONG)(*(--(c))))<< 8L; \ +			case 5: l2|=((DES_LONG)(*(--(c))));     \ +			case 4: l1 =((DES_LONG)(*(--(c))))<<24L; \ +			case 3: l1|=((DES_LONG)(*(--(c))))<<16L; \ +			case 2: l1|=((DES_LONG)(*(--(c))))<< 8L; \ +			case 1: l1|=((DES_LONG)(*(--(c))));     \ +				} \ +			} + +#define l2c(l,c)	(*((c)++)=(unsigned char)(((l)     )&0xff), \ +			 *((c)++)=(unsigned char)(((l)>> 8L)&0xff), \ +			 *((c)++)=(unsigned char)(((l)>>16L)&0xff), \ +			 *((c)++)=(unsigned char)(((l)>>24L)&0xff)) + +/* replacements for htonl and ntohl since I have no idea what to do + * when faced with machines with 8 byte longs. */ +#define HDRSIZE 4 + +#define n2l(c,l)	(l =((DES_LONG)(*((c)++)))<<24L, \ +			 l|=((DES_LONG)(*((c)++)))<<16L, \ +			 l|=((DES_LONG)(*((c)++)))<< 8L, \ +			 l|=((DES_LONG)(*((c)++)))) + +#define l2n(l,c)	(*((c)++)=(unsigned char)(((l)>>24L)&0xff), \ +			 *((c)++)=(unsigned char)(((l)>>16L)&0xff), \ +			 *((c)++)=(unsigned char)(((l)>> 8L)&0xff), \ +			 *((c)++)=(unsigned char)(((l)     )&0xff)) + +/* NOTE - c is not incremented as per l2c */ +#define l2cn(l1,l2,c,n)	{ \ +			c+=n; \ +			switch (n) { \ +			case 8: *(--(c))=(unsigned char)(((l2)>>24L)&0xff); \ +			case 7: *(--(c))=(unsigned char)(((l2)>>16L)&0xff); \ +			case 6: *(--(c))=(unsigned char)(((l2)>> 8L)&0xff); \ +			case 5: *(--(c))=(unsigned char)(((l2)     )&0xff); \ +			case 4: *(--(c))=(unsigned char)(((l1)>>24L)&0xff); \ +			case 3: *(--(c))=(unsigned char)(((l1)>>16L)&0xff); \ +			case 2: *(--(c))=(unsigned char)(((l1)>> 8L)&0xff); \ +			case 1: *(--(c))=(unsigned char)(((l1)     )&0xff); \ +				} \ +			} + +#if defined(WIN32) +#define	ROTATE(a,n)	(_lrotr(a,n)) +#else +#define	ROTATE(a,n)	(((a)>>(n))+((a)<<(32-(n)))) +#endif + +/* Don't worry about the LOAD_DATA() stuff, that is used by + * fcrypt() to add it's little bit to the front */ + +#ifdef DES_FCRYPT + +#define LOAD_DATA_tmp(R,S,u,t,E0,E1) \ +	{ DES_LONG tmp; LOAD_DATA(R,S,u,t,E0,E1,tmp); } + +#define LOAD_DATA(R,S,u,t,E0,E1,tmp) \ +	t=R^(R>>16L); \ +	u=t&E0; t&=E1; \ +	tmp=(u<<16); u^=R^s[S  ]; u^=tmp; \ +	tmp=(t<<16); t^=R^s[S+1]; t^=tmp +#else +#define LOAD_DATA_tmp(a,b,c,d,e,f) LOAD_DATA(a,b,c,d,e,f,g) +#define LOAD_DATA(R,S,u,t,E0,E1,tmp) \ +	u=R^s[S  ]; \ +	t=R^s[S+1] +#endif + +/* The changes to this macro may help or hinder, depending on the + * compiler and the achitecture.  gcc2 always seems to do well :-). + * Inspired by Dana How <how@isl.stanford.edu> + * DO NOT use the alternative version on machines with 8 byte longs. + * It does not seem to work on the Alpha, even when DES_LONG is 4 + * bytes, probably an issue of accessing non-word aligned objects :-( */ +#ifdef DES_PTR + +/* It recently occured to me that 0^0^0^0^0^0^0 == 0, so there + * is no reason to not xor all the sub items together.  This potentially + * saves a register since things can be xored directly into L */ + +#if defined(DES_RISC1) || defined(DES_RISC2) +#ifdef DES_RISC1 +#define D_ENCRYPT(LL,R,S) { \ +	unsigned int u1,u2,u3; \ +	LOAD_DATA(R,S,u,t,E0,E1,u1); \ +	u2=(int)u>>8L; \ +	u1=(int)u&0xfc; \ +	u2&=0xfc; \ +	t=ROTATE(t,4); \ +	u>>=16L; \ +	LL^= *(DES_LONG *)((unsigned char *)des_SP      +u1); \ +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x200+u2); \ +	u3=(int)(u>>8L); \ +	u1=(int)u&0xfc; \ +	u3&=0xfc; \ +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x400+u1); \ +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x600+u3); \ +	u2=(int)t>>8L; \ +	u1=(int)t&0xfc; \ +	u2&=0xfc; \ +	t>>=16L; \ +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x100+u1); \ +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x300+u2); \ +	u3=(int)t>>8L; \ +	u1=(int)t&0xfc; \ +	u3&=0xfc; \ +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x500+u1); \ +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x700+u3); } +#endif +#ifdef DES_RISC2 +#define D_ENCRYPT(LL,R,S) { \ +	unsigned int u1,u2,s1,s2; \ +	LOAD_DATA(R,S,u,t,E0,E1,u1); \ +	u2=(int)u>>8L; \ +	u1=(int)u&0xfc; \ +	u2&=0xfc; \ +	t=ROTATE(t,4); \ +	LL^= *(DES_LONG *)((unsigned char *)des_SP      +u1); \ +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x200+u2); \ +	s1=(int)(u>>16L); \ +	s2=(int)(u>>24L); \ +	s1&=0xfc; \ +	s2&=0xfc; \ +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x400+s1); \ +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x600+s2); \ +	u2=(int)t>>8L; \ +	u1=(int)t&0xfc; \ +	u2&=0xfc; \ +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x100+u1); \ +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x300+u2); \ +	s1=(int)(t>>16L); \ +	s2=(int)(t>>24L); \ +	s1&=0xfc; \ +	s2&=0xfc; \ +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x500+s1); \ +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x700+s2); } +#endif +#else +#define D_ENCRYPT(LL,R,S) { \ +	LOAD_DATA_tmp(R,S,u,t,E0,E1); \ +	t=ROTATE(t,4); \ +	LL^= \ +	*(DES_LONG *)((unsigned char *)des_SP      +((u     )&0xfc))^ \ +	*(DES_LONG *)((unsigned char *)des_SP+0x200+((u>> 8L)&0xfc))^ \ +	*(DES_LONG *)((unsigned char *)des_SP+0x400+((u>>16L)&0xfc))^ \ +	*(DES_LONG *)((unsigned char *)des_SP+0x600+((u>>24L)&0xfc))^ \ +	*(DES_LONG *)((unsigned char *)des_SP+0x100+((t     )&0xfc))^ \ +	*(DES_LONG *)((unsigned char *)des_SP+0x300+((t>> 8L)&0xfc))^ \ +	*(DES_LONG *)((unsigned char *)des_SP+0x500+((t>>16L)&0xfc))^ \ +	*(DES_LONG *)((unsigned char *)des_SP+0x700+((t>>24L)&0xfc)); } +#endif + +#else /* original version */ + +#if defined(DES_RISC1) || defined(DES_RISC2) +#ifdef DES_RISC1 +#define D_ENCRYPT(LL,R,S) {\ +	unsigned int u1,u2,u3; \ +	LOAD_DATA(R,S,u,t,E0,E1,u1); \ +	u>>=2L; \ +	t=ROTATE(t,6); \ +	u2=(int)u>>8L; \ +	u1=(int)u&0x3f; \ +	u2&=0x3f; \ +	u>>=16L; \ +	LL^=des_SPtrans[0][u1]; \ +	LL^=des_SPtrans[2][u2]; \ +	u3=(int)u>>8L; \ +	u1=(int)u&0x3f; \ +	u3&=0x3f; \ +	LL^=des_SPtrans[4][u1]; \ +	LL^=des_SPtrans[6][u3]; \ +	u2=(int)t>>8L; \ +	u1=(int)t&0x3f; \ +	u2&=0x3f; \ +	t>>=16L; \ +	LL^=des_SPtrans[1][u1]; \ +	LL^=des_SPtrans[3][u2]; \ +	u3=(int)t>>8L; \ +	u1=(int)t&0x3f; \ +	u3&=0x3f; \ +	LL^=des_SPtrans[5][u1]; \ +	LL^=des_SPtrans[7][u3]; } +#endif +#ifdef DES_RISC2 +#define D_ENCRYPT(LL,R,S) {\ +	unsigned int u1,u2,s1,s2; \ +	LOAD_DATA(R,S,u,t,E0,E1,u1); \ +	u>>=2L; \ +	t=ROTATE(t,6); \ +	u2=(int)u>>8L; \ +	u1=(int)u&0x3f; \ +	u2&=0x3f; \ +	LL^=des_SPtrans[0][u1]; \ +	LL^=des_SPtrans[2][u2]; \ +	s1=(int)u>>16L; \ +	s2=(int)u>>24L; \ +	s1&=0x3f; \ +	s2&=0x3f; \ +	LL^=des_SPtrans[4][s1]; \ +	LL^=des_SPtrans[6][s2]; \ +	u2=(int)t>>8L; \ +	u1=(int)t&0x3f; \ +	u2&=0x3f; \ +	LL^=des_SPtrans[1][u1]; \ +	LL^=des_SPtrans[3][u2]; \ +	s1=(int)t>>16; \ +	s2=(int)t>>24L; \ +	s1&=0x3f; \ +	s2&=0x3f; \ +	LL^=des_SPtrans[5][s1]; \ +	LL^=des_SPtrans[7][s2]; } +#endif + +#else + +#define D_ENCRYPT(LL,R,S) {\ +	LOAD_DATA_tmp(R,S,u,t,E0,E1); \ +	t=ROTATE(t,4); \ +	LL^=\ +		des_SPtrans[0][(u>> 2L)&0x3f]^ \ +		des_SPtrans[2][(u>>10L)&0x3f]^ \ +		des_SPtrans[4][(u>>18L)&0x3f]^ \ +		des_SPtrans[6][(u>>26L)&0x3f]^ \ +		des_SPtrans[1][(t>> 2L)&0x3f]^ \ +		des_SPtrans[3][(t>>10L)&0x3f]^ \ +		des_SPtrans[5][(t>>18L)&0x3f]^ \ +		des_SPtrans[7][(t>>26L)&0x3f]; } +#endif +#endif + +	/* IP and FP +	 * The problem is more of a geometric problem that random bit fiddling. +	 0  1  2  3  4  5  6  7      62 54 46 38 30 22 14  6 +	 8  9 10 11 12 13 14 15      60 52 44 36 28 20 12  4 +	16 17 18 19 20 21 22 23      58 50 42 34 26 18 10  2 +	24 25 26 27 28 29 30 31  to  56 48 40 32 24 16  8  0 + +	32 33 34 35 36 37 38 39      63 55 47 39 31 23 15  7 +	40 41 42 43 44 45 46 47      61 53 45 37 29 21 13  5 +	48 49 50 51 52 53 54 55      59 51 43 35 27 19 11  3 +	56 57 58 59 60 61 62 63      57 49 41 33 25 17  9  1 + +	The output has been subject to swaps of the form +	0 1 -> 3 1 but the odd and even bits have been put into +	2 3    2 0 +	different words.  The main trick is to remember that +	t=((l>>size)^r)&(mask); +	r^=t; +	l^=(t<<size); +	can be used to swap and move bits between words. + +	So l =  0  1  2  3  r = 16 17 18 19 +	        4  5  6  7      20 21 22 23 +	        8  9 10 11      24 25 26 27 +	       12 13 14 15      28 29 30 31 +	becomes (for size == 2 and mask == 0x3333) +	   t =   2^16  3^17 -- --   l =  0  1 16 17  r =  2  3 18 19 +		 6^20  7^21 -- --        4  5 20 21       6  7 22 23 +		10^24 11^25 -- --        8  9 24 25      10 11 24 25 +		14^28 15^29 -- --       12 13 28 29      14 15 28 29 + +	Thanks for hints from Richard Outerbridge - he told me IP&FP +	could be done in 15 xor, 10 shifts and 5 ands. +	When I finally started to think of the problem in 2D +	I first got ~42 operations without xors.  When I remembered +	how to use xors :-) I got it to its final state. +	*/ +#define PERM_OP(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),\ +	(b)^=(t),\ +	(a)^=((t)<<(n))) + +#define IP(l,r) \ +	{ \ +	register DES_LONG tt; \ +	PERM_OP(r,l,tt, 4,0x0f0f0f0fL); \ +	PERM_OP(l,r,tt,16,0x0000ffffL); \ +	PERM_OP(r,l,tt, 2,0x33333333L); \ +	PERM_OP(l,r,tt, 8,0x00ff00ffL); \ +	PERM_OP(r,l,tt, 1,0x55555555L); \ +	} + +#define FP(l,r) \ +	{ \ +	register DES_LONG tt; \ +	PERM_OP(l,r,tt, 1,0x55555555L); \ +	PERM_OP(r,l,tt, 8,0x00ff00ffL); \ +	PERM_OP(l,r,tt, 2,0x33333333L); \ +	PERM_OP(r,l,tt,16,0x0000ffffL); \ +	PERM_OP(l,r,tt, 4,0x0f0f0f0fL); \ +	} + +extern const DES_LONG des_SPtrans[8][64]; + +#endif diff --git a/crypto/libdes/des_locl.org b/crypto/libdes/des_locl.org new file mode 100644 index 000000000000..3853ddc83462 --- /dev/null +++ b/crypto/libdes/des_locl.org @@ -0,0 +1,509 @@ +/* crypto/des/des_locl.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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.] + */ + +/* WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING + * + * Always modify des_locl.org since des_locl.h is automatically generated from + * it during SSLeay configuration. + * + * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING + */ + +#ifndef HEADER_DES_LOCL_H +#define HEADER_DES_LOCL_H + +#if defined(WIN32) || defined(WIN16) +#ifndef MSDOS +#define MSDOS +#endif +#endif + +#include <stdio.h> +#include <stdlib.h> +#ifndef MSDOS +#include <unistd.h> +#endif +#include "des.h" + +#ifndef DES_DEFAULT_OPTIONS +/* the following is tweaked from a config script, that is why it is a + * protected undef/define */ +#ifndef DES_PTR +#undef DES_PTR +#endif + +/* This helps C compiler generate the correct code for multiple functional + * units.  It reduces register dependancies at the expense of 2 more + * registers */ +#ifndef DES_RISC1 +#undef DES_RISC1 +#endif + +#ifndef DES_RISC2 +#undef DES_RISC2 +#endif + +#if defined(DES_RISC1) && defined(DES_RISC2) +YOU SHOULD NOT HAVE BOTH DES_RISC1 AND DES_RISC2 DEFINED!!!!! +#endif + +/* Unroll the inner loop, this sometimes helps, sometimes hinders. + * Very mucy CPU dependant */ +#ifndef DES_UNROLL +#undef DES_UNROLL +#endif + +/* These default values were supplied by + * Peter Gutman <pgut001@cs.auckland.ac.nz> + * They are only used if nothing else has been defined */ +#if !defined(DES_PTR) && !defined(DES_RISC1) && !defined(DES_RISC2) && !defined(DES_UNROLL) +/* Special defines which change the way the code is built depending on the +   CPU and OS.  For SGI machines you can use _MIPS_SZLONG (32 or 64) to find +   even newer MIPS CPU's, but at the moment one size fits all for +   optimization options.  Older Sparc's work better with only UNROLL, but +   there's no way to tell at compile time what it is you're running on */ +  +#if defined( sun )		/* Newer Sparc's */ +  #define DES_PTR +  #define DES_RISC1 +  #define DES_UNROLL +#elif defined( __ultrix )	/* Older MIPS */ +  #define DES_PTR +  #define DES_RISC2 +  #define DES_UNROLL +#elif defined( __osf1__ )	/* Alpha */ +  #define DES_PTR +  #define DES_RISC2 +#elif defined ( _AIX )		/* RS6000 */ +  /* Unknown */ +#elif defined( __hpux )		/* HP-PA */ +  /* Unknown */ +#elif defined( __aux )		/* 68K */ +  /* Unknown */ +#elif defined( __dgux )		/* 88K (but P6 in latest boxes) */ +  #define DES_UNROLL +#elif defined( __sgi )		/* Newer MIPS */ +  #define DES_PTR +  #define DES_RISC2 +  #define DES_UNROLL +#elif defined( i386 )		/* x86 boxes, should be gcc */ +  #define DES_PTR +  #define DES_RISC1 +  #define DES_UNROLL +#endif /* Systems-specific speed defines */ +#endif + +#endif /* DES_DEFAULT_OPTIONS */ + +#ifdef MSDOS		/* Visual C++ 2.1 (Windows NT/95) */ +#include <stdlib.h> +#include <errno.h> +#include <time.h> +#include <io.h> +#ifndef RAND +#define RAND +#endif +#undef NOPROTO +#endif + +#if defined(__STDC__) || defined(VMS) || defined(M_XENIX) || defined(MSDOS) +#include <string.h> +#endif + +#ifndef RAND +#define RAND +#endif + +#ifdef linux +#undef RAND +#endif + +#ifdef MSDOS +#define getpid() 2 +#define RAND +#undef NOPROTO +#endif + +#if defined(NOCONST) +#define const +#endif + +#ifdef __STDC__ +#undef NOPROTO +#endif + +#ifdef RAND +#define srandom(s) srand(s) +#define random rand +#endif + +#define ITERATIONS 16 +#define HALF_ITERATIONS 8 + +/* used in des_read and des_write */ +#define MAXWRITE	(1024*16) +#define BSIZE		(MAXWRITE+4) + +#define c2l(c,l)	(l =((DES_LONG)(*((c)++)))    , \ +			 l|=((DES_LONG)(*((c)++)))<< 8L, \ +			 l|=((DES_LONG)(*((c)++)))<<16L, \ +			 l|=((DES_LONG)(*((c)++)))<<24L) + +/* NOTE - c is not incremented as per c2l */ +#define c2ln(c,l1,l2,n)	{ \ +			c+=n; \ +			l1=l2=0; \ +			switch (n) { \ +			case 8: l2 =((DES_LONG)(*(--(c))))<<24L; \ +			case 7: l2|=((DES_LONG)(*(--(c))))<<16L; \ +			case 6: l2|=((DES_LONG)(*(--(c))))<< 8L; \ +			case 5: l2|=((DES_LONG)(*(--(c))));     \ +			case 4: l1 =((DES_LONG)(*(--(c))))<<24L; \ +			case 3: l1|=((DES_LONG)(*(--(c))))<<16L; \ +			case 2: l1|=((DES_LONG)(*(--(c))))<< 8L; \ +			case 1: l1|=((DES_LONG)(*(--(c))));     \ +				} \ +			} + +#define l2c(l,c)	(*((c)++)=(unsigned char)(((l)     )&0xff), \ +			 *((c)++)=(unsigned char)(((l)>> 8L)&0xff), \ +			 *((c)++)=(unsigned char)(((l)>>16L)&0xff), \ +			 *((c)++)=(unsigned char)(((l)>>24L)&0xff)) + +/* replacements for htonl and ntohl since I have no idea what to do + * when faced with machines with 8 byte longs. */ +#define HDRSIZE 4 + +#define n2l(c,l)	(l =((DES_LONG)(*((c)++)))<<24L, \ +			 l|=((DES_LONG)(*((c)++)))<<16L, \ +			 l|=((DES_LONG)(*((c)++)))<< 8L, \ +			 l|=((DES_LONG)(*((c)++)))) + +#define l2n(l,c)	(*((c)++)=(unsigned char)(((l)>>24L)&0xff), \ +			 *((c)++)=(unsigned char)(((l)>>16L)&0xff), \ +			 *((c)++)=(unsigned char)(((l)>> 8L)&0xff), \ +			 *((c)++)=(unsigned char)(((l)     )&0xff)) + +/* NOTE - c is not incremented as per l2c */ +#define l2cn(l1,l2,c,n)	{ \ +			c+=n; \ +			switch (n) { \ +			case 8: *(--(c))=(unsigned char)(((l2)>>24L)&0xff); \ +			case 7: *(--(c))=(unsigned char)(((l2)>>16L)&0xff); \ +			case 6: *(--(c))=(unsigned char)(((l2)>> 8L)&0xff); \ +			case 5: *(--(c))=(unsigned char)(((l2)     )&0xff); \ +			case 4: *(--(c))=(unsigned char)(((l1)>>24L)&0xff); \ +			case 3: *(--(c))=(unsigned char)(((l1)>>16L)&0xff); \ +			case 2: *(--(c))=(unsigned char)(((l1)>> 8L)&0xff); \ +			case 1: *(--(c))=(unsigned char)(((l1)     )&0xff); \ +				} \ +			} + +#if defined(WIN32) +#define	ROTATE(a,n)	(_lrotr(a,n)) +#else +#define	ROTATE(a,n)	(((a)>>(n))+((a)<<(32-(n)))) +#endif + +/* Don't worry about the LOAD_DATA() stuff, that is used by + * fcrypt() to add it's little bit to the front */ + +#ifdef DES_FCRYPT + +#define LOAD_DATA_tmp(R,S,u,t,E0,E1) \ +	{ DES_LONG tmp; LOAD_DATA(R,S,u,t,E0,E1,tmp); } + +#define LOAD_DATA(R,S,u,t,E0,E1,tmp) \ +	t=R^(R>>16L); \ +	u=t&E0; t&=E1; \ +	tmp=(u<<16); u^=R^s[S  ]; u^=tmp; \ +	tmp=(t<<16); t^=R^s[S+1]; t^=tmp +#else +#define LOAD_DATA_tmp(a,b,c,d,e,f) LOAD_DATA(a,b,c,d,e,f,g) +#define LOAD_DATA(R,S,u,t,E0,E1,tmp) \ +	u=R^s[S  ]; \ +	t=R^s[S+1] +#endif + +/* The changes to this macro may help or hinder, depending on the + * compiler and the achitecture.  gcc2 always seems to do well :-). + * Inspired by Dana How <how@isl.stanford.edu> + * DO NOT use the alternative version on machines with 8 byte longs. + * It does not seem to work on the Alpha, even when DES_LONG is 4 + * bytes, probably an issue of accessing non-word aligned objects :-( */ +#ifdef DES_PTR + +/* It recently occured to me that 0^0^0^0^0^0^0 == 0, so there + * is no reason to not xor all the sub items together.  This potentially + * saves a register since things can be xored directly into L */ + +#if defined(DES_RISC1) || defined(DES_RISC2) +#ifdef DES_RISC1 +#define D_ENCRYPT(LL,R,S) { \ +	unsigned int u1,u2,u3; \ +	LOAD_DATA(R,S,u,t,E0,E1,u1); \ +	u2=(int)u>>8L; \ +	u1=(int)u&0xfc; \ +	u2&=0xfc; \ +	t=ROTATE(t,4); \ +	u>>=16L; \ +	LL^= *(DES_LONG *)((unsigned char *)des_SP      +u1); \ +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x200+u2); \ +	u3=(int)(u>>8L); \ +	u1=(int)u&0xfc; \ +	u3&=0xfc; \ +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x400+u1); \ +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x600+u3); \ +	u2=(int)t>>8L; \ +	u1=(int)t&0xfc; \ +	u2&=0xfc; \ +	t>>=16L; \ +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x100+u1); \ +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x300+u2); \ +	u3=(int)t>>8L; \ +	u1=(int)t&0xfc; \ +	u3&=0xfc; \ +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x500+u1); \ +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x700+u3); } +#endif +#ifdef DES_RISC2 +#define D_ENCRYPT(LL,R,S) { \ +	unsigned int u1,u2,s1,s2; \ +	LOAD_DATA(R,S,u,t,E0,E1,u1); \ +	u2=(int)u>>8L; \ +	u1=(int)u&0xfc; \ +	u2&=0xfc; \ +	t=ROTATE(t,4); \ +	LL^= *(DES_LONG *)((unsigned char *)des_SP      +u1); \ +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x200+u2); \ +	s1=(int)(u>>16L); \ +	s2=(int)(u>>24L); \ +	s1&=0xfc; \ +	s2&=0xfc; \ +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x400+s1); \ +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x600+s2); \ +	u2=(int)t>>8L; \ +	u1=(int)t&0xfc; \ +	u2&=0xfc; \ +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x100+u1); \ +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x300+u2); \ +	s1=(int)(t>>16L); \ +	s2=(int)(t>>24L); \ +	s1&=0xfc; \ +	s2&=0xfc; \ +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x500+s1); \ +	LL^= *(DES_LONG *)((unsigned char *)des_SP+0x700+s2); } +#endif +#else +#define D_ENCRYPT(LL,R,S) { \ +	LOAD_DATA_tmp(R,S,u,t,E0,E1); \ +	t=ROTATE(t,4); \ +	LL^= \ +	*(DES_LONG *)((unsigned char *)des_SP      +((u     )&0xfc))^ \ +	*(DES_LONG *)((unsigned char *)des_SP+0x200+((u>> 8L)&0xfc))^ \ +	*(DES_LONG *)((unsigned char *)des_SP+0x400+((u>>16L)&0xfc))^ \ +	*(DES_LONG *)((unsigned char *)des_SP+0x600+((u>>24L)&0xfc))^ \ +	*(DES_LONG *)((unsigned char *)des_SP+0x100+((t     )&0xfc))^ \ +	*(DES_LONG *)((unsigned char *)des_SP+0x300+((t>> 8L)&0xfc))^ \ +	*(DES_LONG *)((unsigned char *)des_SP+0x500+((t>>16L)&0xfc))^ \ +	*(DES_LONG *)((unsigned char *)des_SP+0x700+((t>>24L)&0xfc)); } +#endif + +#else /* original version */ + +#if defined(DES_RISC1) || defined(DES_RISC2) +#ifdef DES_RISC1 +#define D_ENCRYPT(LL,R,S) {\ +	unsigned int u1,u2,u3; \ +	LOAD_DATA(R,S,u,t,E0,E1,u1); \ +	u>>=2L; \ +	t=ROTATE(t,6); \ +	u2=(int)u>>8L; \ +	u1=(int)u&0x3f; \ +	u2&=0x3f; \ +	u>>=16L; \ +	LL^=des_SPtrans[0][u1]; \ +	LL^=des_SPtrans[2][u2]; \ +	u3=(int)u>>8L; \ +	u1=(int)u&0x3f; \ +	u3&=0x3f; \ +	LL^=des_SPtrans[4][u1]; \ +	LL^=des_SPtrans[6][u3]; \ +	u2=(int)t>>8L; \ +	u1=(int)t&0x3f; \ +	u2&=0x3f; \ +	t>>=16L; \ +	LL^=des_SPtrans[1][u1]; \ +	LL^=des_SPtrans[3][u2]; \ +	u3=(int)t>>8L; \ +	u1=(int)t&0x3f; \ +	u3&=0x3f; \ +	LL^=des_SPtrans[5][u1]; \ +	LL^=des_SPtrans[7][u3]; } +#endif +#ifdef DES_RISC2 +#define D_ENCRYPT(LL,R,S) {\ +	unsigned int u1,u2,s1,s2; \ +	LOAD_DATA(R,S,u,t,E0,E1,u1); \ +	u>>=2L; \ +	t=ROTATE(t,6); \ +	u2=(int)u>>8L; \ +	u1=(int)u&0x3f; \ +	u2&=0x3f; \ +	LL^=des_SPtrans[0][u1]; \ +	LL^=des_SPtrans[2][u2]; \ +	s1=(int)u>>16L; \ +	s2=(int)u>>24L; \ +	s1&=0x3f; \ +	s2&=0x3f; \ +	LL^=des_SPtrans[4][s1]; \ +	LL^=des_SPtrans[6][s2]; \ +	u2=(int)t>>8L; \ +	u1=(int)t&0x3f; \ +	u2&=0x3f; \ +	LL^=des_SPtrans[1][u1]; \ +	LL^=des_SPtrans[3][u2]; \ +	s1=(int)t>>16; \ +	s2=(int)t>>24L; \ +	s1&=0x3f; \ +	s2&=0x3f; \ +	LL^=des_SPtrans[5][s1]; \ +	LL^=des_SPtrans[7][s2]; } +#endif + +#else + +#define D_ENCRYPT(LL,R,S) {\ +	LOAD_DATA_tmp(R,S,u,t,E0,E1); \ +	t=ROTATE(t,4); \ +	LL^=\ +		des_SPtrans[0][(u>> 2L)&0x3f]^ \ +		des_SPtrans[2][(u>>10L)&0x3f]^ \ +		des_SPtrans[4][(u>>18L)&0x3f]^ \ +		des_SPtrans[6][(u>>26L)&0x3f]^ \ +		des_SPtrans[1][(t>> 2L)&0x3f]^ \ +		des_SPtrans[3][(t>>10L)&0x3f]^ \ +		des_SPtrans[5][(t>>18L)&0x3f]^ \ +		des_SPtrans[7][(t>>26L)&0x3f]; } +#endif +#endif + +	/* IP and FP +	 * The problem is more of a geometric problem that random bit fiddling. +	 0  1  2  3  4  5  6  7      62 54 46 38 30 22 14  6 +	 8  9 10 11 12 13 14 15      60 52 44 36 28 20 12  4 +	16 17 18 19 20 21 22 23      58 50 42 34 26 18 10  2 +	24 25 26 27 28 29 30 31  to  56 48 40 32 24 16  8  0 + +	32 33 34 35 36 37 38 39      63 55 47 39 31 23 15  7 +	40 41 42 43 44 45 46 47      61 53 45 37 29 21 13  5 +	48 49 50 51 52 53 54 55      59 51 43 35 27 19 11  3 +	56 57 58 59 60 61 62 63      57 49 41 33 25 17  9  1 + +	The output has been subject to swaps of the form +	0 1 -> 3 1 but the odd and even bits have been put into +	2 3    2 0 +	different words.  The main trick is to remember that +	t=((l>>size)^r)&(mask); +	r^=t; +	l^=(t<<size); +	can be used to swap and move bits between words. + +	So l =  0  1  2  3  r = 16 17 18 19 +	        4  5  6  7      20 21 22 23 +	        8  9 10 11      24 25 26 27 +	       12 13 14 15      28 29 30 31 +	becomes (for size == 2 and mask == 0x3333) +	   t =   2^16  3^17 -- --   l =  0  1 16 17  r =  2  3 18 19 +		 6^20  7^21 -- --        4  5 20 21       6  7 22 23 +		10^24 11^25 -- --        8  9 24 25      10 11 24 25 +		14^28 15^29 -- --       12 13 28 29      14 15 28 29 + +	Thanks for hints from Richard Outerbridge - he told me IP&FP +	could be done in 15 xor, 10 shifts and 5 ands. +	When I finally started to think of the problem in 2D +	I first got ~42 operations without xors.  When I remembered +	how to use xors :-) I got it to its final state. +	*/ +#define PERM_OP(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),\ +	(b)^=(t),\ +	(a)^=((t)<<(n))) + +#define IP(l,r) \ +	{ \ +	register DES_LONG tt; \ +	PERM_OP(r,l,tt, 4,0x0f0f0f0fL); \ +	PERM_OP(l,r,tt,16,0x0000ffffL); \ +	PERM_OP(r,l,tt, 2,0x33333333L); \ +	PERM_OP(l,r,tt, 8,0x00ff00ffL); \ +	PERM_OP(r,l,tt, 1,0x55555555L); \ +	} + +#define FP(l,r) \ +	{ \ +	register DES_LONG tt; \ +	PERM_OP(l,r,tt, 1,0x55555555L); \ +	PERM_OP(r,l,tt, 8,0x00ff00ffL); \ +	PERM_OP(l,r,tt, 2,0x33333333L); \ +	PERM_OP(r,l,tt,16,0x0000ffffL); \ +	PERM_OP(l,r,tt, 4,0x0f0f0f0fL); \ +	} + +extern const DES_LONG des_SPtrans[8][64]; + +#endif diff --git a/crypto/libdes/des_opts.c b/crypto/libdes/des_opts.c new file mode 100644 index 000000000000..90b035baef27 --- /dev/null +++ b/crypto/libdes/des_opts.c @@ -0,0 +1,616 @@ +/* crypto/des/des_opts.c */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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.] + */ + +/* define PART1, PART2, PART3 or PART4 to build only with a few of the options. + * This is for machines with 64k code segment size restrictions. */ + +#ifndef MSDOS +#define TIMES +#endif + +#include <stdio.h> +#ifndef MSDOS +#include <unistd.h> +#else +#include <io.h> +extern void exit(); +#endif +#include <signal.h> +#ifndef VMS +#ifndef _IRIX +#include <time.h> +#endif +#ifdef TIMES +#include <sys/types.h> +#include <sys/times.h> +#endif +#else /* VMS */ +#include <types.h> +struct tms { +	time_t tms_utime; +	time_t tms_stime; +	time_t tms_uchild;	/* I dunno...  */ +	time_t tms_uchildsys;	/* so these names are a guess :-) */ +	} +#endif +#ifndef TIMES +#include <sys/timeb.h> +#endif + +#ifdef sun +#include <limits.h> +#include <sys/param.h> +#endif + +#include "des.h" +#include "spr.h" + +#define DES_DEFAULT_OPTIONS + +#if !defined(PART1) && !defined(PART2) && !defined(PART3) && !defined(PART4) +#define PART1 +#define PART2 +#define PART3 +#define PART4 +#endif + +#ifdef PART1 + +#undef DES_UNROLL +#undef DES_RISC1 +#undef DES_RISC2 +#undef DES_PTR +#undef D_ENCRYPT +#define des_encrypt  des_encrypt_u4_cisc_idx +#define des_encrypt2 des_encrypt2_u4_cisc_idx +#define des_encrypt3 des_encrypt3_u4_cisc_idx +#define des_decrypt3 des_decrypt3_u4_cisc_idx +#undef HEADER_DES_LOCL_H +#include "des_enc.c" + +#define DES_UNROLL +#undef DES_RISC1 +#undef DES_RISC2 +#undef DES_PTR +#undef D_ENCRYPT +#undef des_encrypt +#undef des_encrypt2 +#undef des_encrypt3 +#undef des_decrypt3 +#define des_encrypt  des_encrypt_u16_cisc_idx +#define des_encrypt2 des_encrypt2_u16_cisc_idx +#define des_encrypt3 des_encrypt3_u16_cisc_idx +#define des_decrypt3 des_decrypt3_u16_cisc_idx +#undef HEADER_DES_LOCL_H +#include "des_enc.c" + +#undef DES_UNROLL +#define DES_RISC1 +#undef DES_RISC2 +#undef DES_PTR +#undef D_ENCRYPT +#undef des_encrypt +#undef des_encrypt2 +#undef des_encrypt3 +#undef des_decrypt3 +#define des_encrypt  des_encrypt_u4_risc1_idx +#define des_encrypt2 des_encrypt2_u4_risc1_idx +#define des_encrypt3 des_encrypt3_u4_risc1_idx +#define des_decrypt3 des_decrypt3_u4_risc1_idx +#undef HEADER_DES_LOCL_H +#include "des_enc.c" + +#endif + +#ifdef PART2 + +#undef DES_UNROLL +#undef DES_RISC1 +#define DES_RISC2 +#undef DES_PTR +#undef D_ENCRYPT +#undef des_encrypt +#undef des_encrypt2 +#undef des_encrypt3 +#undef des_decrypt3 +#define des_encrypt  des_encrypt_u4_risc2_idx +#define des_encrypt2 des_encrypt2_u4_risc2_idx +#define des_encrypt3 des_encrypt3_u4_risc2_idx +#define des_decrypt3 des_decrypt3_u4_risc2_idx +#undef HEADER_DES_LOCL_H +#include "des_enc.c" + +#define DES_UNROLL +#define DES_RISC1 +#undef DES_RISC2 +#undef DES_PTR +#undef D_ENCRYPT +#undef des_encrypt +#undef des_encrypt2 +#undef des_encrypt3 +#undef des_decrypt3 +#define des_encrypt  des_encrypt_u16_risc1_idx +#define des_encrypt2 des_encrypt2_u16_risc1_idx +#define des_encrypt3 des_encrypt3_u16_risc1_idx +#define des_decrypt3 des_decrypt3_u16_risc1_idx +#undef HEADER_DES_LOCL_H +#include "des_enc.c" + +#define DES_UNROLL +#undef DES_RISC1 +#define DES_RISC2 +#undef DES_PTR +#undef D_ENCRYPT +#undef des_encrypt +#undef des_encrypt2 +#undef des_encrypt3 +#undef des_decrypt3 +#define des_encrypt  des_encrypt_u16_risc2_idx +#define des_encrypt2 des_encrypt2_u16_risc2_idx +#define des_encrypt3 des_encrypt3_u16_risc2_idx +#define des_decrypt3 des_decrypt3_u16_risc2_idx +#undef HEADER_DES_LOCL_H +#include "des_enc.c" + +#endif + +#ifdef PART3 + +#undef DES_UNROLL +#undef DES_RISC1 +#undef DES_RISC2 +#define DES_PTR +#undef D_ENCRYPT +#undef des_encrypt +#undef des_encrypt2 +#undef des_encrypt3 +#undef des_decrypt3 +#define des_encrypt  des_encrypt_u4_cisc_ptr +#define des_encrypt2 des_encrypt2_u4_cisc_ptr +#define des_encrypt3 des_encrypt3_u4_cisc_ptr +#define des_decrypt3 des_decrypt3_u4_cisc_ptr +#undef HEADER_DES_LOCL_H +#include "des_enc.c" + +#define DES_UNROLL +#undef DES_RISC1 +#undef DES_RISC2 +#define DES_PTR +#undef D_ENCRYPT +#undef des_encrypt +#undef des_encrypt2 +#undef des_encrypt3 +#undef des_decrypt3 +#define des_encrypt  des_encrypt_u16_cisc_ptr +#define des_encrypt2 des_encrypt2_u16_cisc_ptr +#define des_encrypt3 des_encrypt3_u16_cisc_ptr +#define des_decrypt3 des_decrypt3_u16_cisc_ptr +#undef HEADER_DES_LOCL_H +#include "des_enc.c" + +#undef DES_UNROLL +#define DES_RISC1 +#undef DES_RISC2 +#define DES_PTR +#undef D_ENCRYPT +#undef des_encrypt +#undef des_encrypt2 +#undef des_encrypt3 +#undef des_decrypt3 +#define des_encrypt  des_encrypt_u4_risc1_ptr +#define des_encrypt2 des_encrypt2_u4_risc1_ptr +#define des_encrypt3 des_encrypt3_u4_risc1_ptr +#define des_decrypt3 des_decrypt3_u4_risc1_ptr +#undef HEADER_DES_LOCL_H +#include "des_enc.c" + +#endif + +#ifdef PART4 + +#undef DES_UNROLL +#undef DES_RISC1 +#define DES_RISC2 +#define DES_PTR +#undef D_ENCRYPT +#undef des_encrypt +#undef des_encrypt2 +#undef des_encrypt3 +#undef des_decrypt3 +#define des_encrypt  des_encrypt_u4_risc2_ptr +#define des_encrypt2 des_encrypt2_u4_risc2_ptr +#define des_encrypt3 des_encrypt3_u4_risc2_ptr +#define des_decrypt3 des_decrypt3_u4_risc2_ptr +#undef HEADER_DES_LOCL_H +#include "des_enc.c" + +#define DES_UNROLL +#define DES_RISC1 +#undef DES_RISC2 +#define DES_PTR +#undef D_ENCRYPT +#undef des_encrypt +#undef des_encrypt2 +#undef des_encrypt3 +#undef des_decrypt3 +#define des_encrypt  des_encrypt_u16_risc1_ptr +#define des_encrypt2 des_encrypt2_u16_risc1_ptr +#define des_encrypt3 des_encrypt3_u16_risc1_ptr +#define des_decrypt3 des_decrypt3_u16_risc1_ptr +#undef HEADER_DES_LOCL_H +#include "des_enc.c" + +#define DES_UNROLL +#undef DES_RISC1 +#define DES_RISC2 +#define DES_PTR +#undef D_ENCRYPT +#undef des_encrypt +#undef des_encrypt2 +#undef des_encrypt3 +#undef des_decrypt3 +#define des_encrypt  des_encrypt_u16_risc2_ptr +#define des_encrypt2 des_encrypt2_u16_risc2_ptr +#define des_encrypt3 des_encrypt3_u16_risc2_ptr +#define des_decrypt3 des_decrypt3_u16_risc2_ptr +#undef HEADER_DES_LOCL_H +#include "des_enc.c" + +#endif + +/* The following if from times(3) man page.  It may need to be changed */ +#ifndef HZ +#ifndef CLK_TCK +#ifndef VMS +#define HZ	100.0 +#else /* VMS */ +#define HZ	100.0 +#endif +#else /* CLK_TCK */ +#define HZ ((double)CLK_TCK) +#endif +#endif + +#define BUFSIZE	((long)1024) +long run=0; + +#ifndef NOPROTO +double Time_F(int s); +#else +double Time_F(); +#endif + +#ifdef SIGALRM +#if defined(__STDC__) || defined(sgi) +#define SIGRETTYPE void +#else +#define SIGRETTYPE int +#endif + +#ifndef NOPROTO +SIGRETTYPE sig_done(int sig); +#else +SIGRETTYPE sig_done(); +#endif + +SIGRETTYPE sig_done(sig) +int sig; +	{ +	signal(SIGALRM,sig_done); +	run=0; +#ifdef LINT +	sig=sig; +#endif +	} +#endif + +#define START	0 +#define STOP	1 + +double Time_F(s) +int s; +	{ +	double ret; +#ifdef TIMES +	static struct tms tstart,tend; + +	if (s == START) +		{ +		times(&tstart); +		return(0); +		} +	else +		{ +		times(&tend); +		ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ; +		return((ret == 0.0)?1e-6:ret); +		} +#else /* !times() */ +	static struct timeb tstart,tend; +	long i; + +	if (s == START) +		{ +		ftime(&tstart); +		return(0); +		} +	else +		{ +		ftime(&tend); +		i=(long)tend.millitm-(long)tstart.millitm; +		ret=((double)(tend.time-tstart.time))+((double)i)/1000.0; +		return((ret == 0.0)?1e-6:ret); +		} +#endif +	} + +#ifdef SIGALRM +#define print_name(name) fprintf(stderr,"Doing %s's for 10 seconds\n",name); alarm(10); +#else +#define print_name(name) fprintf(stderr,"Doing %s %ld times\n",name,cb); +#endif +	 +#define time_it(func,name,index) \ +	print_name(name); \ +	Time_F(START); \ +	for (count=0,run=1; COND(cb); count++) \ +		{ \ +		unsigned long d[2]; \ +		func(d,&(sch[0]),DES_ENCRYPT); \ +		} \ +	tm[index]=Time_F(STOP); \ +	fprintf(stderr,"%ld %s's in %.2f second\n",count,name,tm[index]); \ +	tm[index]=((double)COUNT(cb))/tm[index]; + +#define print_it(name,index) \ +	fprintf(stderr,"%s bytes per sec = %12.2f (%5.1fuS)\n",name, \ +		tm[index]*8,1.0e6/tm[index]); + +int main(argc,argv) +int argc; +char **argv; +	{ +	long count; +	static unsigned char buf[BUFSIZE]; +	static des_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0}; +	static des_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12}; +	static des_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34}; +	des_key_schedule sch,sch2,sch3; +	double d,tm[16],max=0; +	int rank[16]; +	char *str[16]; +	int max_idx=0,i,num=0,j; +#ifndef SIGALARM +	long ca,cb,cc,cd,ce; +#endif + +	for (i=0; i<12; i++) +		{ +		tm[i]=0.0; +		rank[i]=0; +		} + +#ifndef TIMES +	fprintf(stderr,"To get the most acurate results, try to run this\n"); +	fprintf(stderr,"program when this computer is idle.\n"); +#endif + +	des_set_key((C_Block *)key,sch); +	des_set_key((C_Block *)key2,sch2); +	des_set_key((C_Block *)key3,sch3); + +#ifndef SIGALRM +	fprintf(stderr,"First we calculate the approximate speed ...\n"); +	des_set_key((C_Block *)key,sch); +	count=10; +	do	{ +		long i; +		unsigned long data[2]; + +		count*=2; +		Time_F(START); +		for (i=count; i; i--) +			des_encrypt(data,&(sch[0]),DES_ENCRYPT); +		d=Time_F(STOP); +		} while (d < 3.0); +	ca=count; +	cb=count*3; +	cc=count*3*8/BUFSIZE+1; +	cd=count*8/BUFSIZE+1; + +	ce=count/20+1; +#define COND(d) (count != (d)) +#define COUNT(d) (d) +#else +#define COND(c) (run) +#define COUNT(d) (count) +        signal(SIGALRM,sig_done); +        alarm(10); +#endif + +#ifdef PART1 +	time_it(des_encrypt_u4_cisc_idx,  "des_encrypt_u4_cisc_idx  ", 0); +	time_it(des_encrypt_u16_cisc_idx, "des_encrypt_u16_cisc_idx ", 1); +	time_it(des_encrypt_u4_risc1_idx, "des_encrypt_u4_risc1_idx ", 2); +	num+=3; +#endif +#ifdef PART2 +	time_it(des_encrypt_u16_risc1_idx,"des_encrypt_u16_risc1_idx", 3); +	time_it(des_encrypt_u4_risc2_idx, "des_encrypt_u4_risc2_idx ", 4); +	time_it(des_encrypt_u16_risc2_idx,"des_encrypt_u16_risc2_idx", 5); +	num+=3; +#endif +#ifdef PART3 +	time_it(des_encrypt_u4_cisc_ptr,  "des_encrypt_u4_cisc_ptr  ", 6); +	time_it(des_encrypt_u16_cisc_ptr, "des_encrypt_u16_cisc_ptr ", 7); +	time_it(des_encrypt_u4_risc1_ptr, "des_encrypt_u4_risc1_ptr ", 8); +	num+=3; +#endif +#ifdef PART4 +	time_it(des_encrypt_u16_risc1_ptr,"des_encrypt_u16_risc1_ptr", 9); +	time_it(des_encrypt_u4_risc2_ptr, "des_encrypt_u4_risc2_ptr ",10); +	time_it(des_encrypt_u16_risc2_ptr,"des_encrypt_u16_risc2_ptr",11); +	num+=3; +#endif + +#ifdef PART1 +	str[0]=" 4  c i"; +	print_it("des_encrypt_u4_cisc_idx  ",0); +	max=tm[0]; +	max_idx=0; +	str[1]="16  c i"; +	print_it("des_encrypt_u16_cisc_idx ",1); +	if (max < tm[1]) { max=tm[1]; max_idx=1; } +	str[2]=" 4 r1 i"; +	print_it("des_encrypt_u4_risc1_idx ",2); +	if (max < tm[2]) { max=tm[2]; max_idx=2; } +#endif +#ifdef PART2 +	str[3]="16 r1 i"; +	print_it("des_encrypt_u16_risc1_idx",3); +	if (max < tm[3]) { max=tm[3]; max_idx=3; } +	str[4]=" 4 r2 i"; +	print_it("des_encrypt_u4_risc2_idx ",4); +	if (max < tm[4]) { max=tm[4]; max_idx=4; } +	str[5]="16 r2 i"; +	print_it("des_encrypt_u16_risc2_idx",5); +	if (max < tm[5]) { max=tm[5]; max_idx=5; } +#endif +#ifdef PART3 +	str[6]=" 4  c p"; +	print_it("des_encrypt_u4_cisc_ptr  ",6); +	if (max < tm[6]) { max=tm[6]; max_idx=6; } +	str[7]="16  c p"; +	print_it("des_encrypt_u16_cisc_ptr ",7); +	if (max < tm[7]) { max=tm[7]; max_idx=7; } +	str[8]=" 4 r1 p"; +	print_it("des_encrypt_u4_risc1_ptr ",8); +	if (max < tm[8]) { max=tm[8]; max_idx=8; } +#endif +#ifdef PART4 +	str[9]="16 r1 p"; +	print_it("des_encrypt_u16_risc1_ptr",9); +	if (max < tm[9]) { max=tm[9]; max_idx=9; } +	str[10]=" 4 r2 p"; +	print_it("des_encrypt_u4_risc2_ptr ",10); +	if (max < tm[10]) { max=tm[10]; max_idx=10; } +	str[11]="16 r2 p"; +	print_it("des_encrypt_u16_risc2_ptr",11); +	if (max < tm[11]) { max=tm[11]; max_idx=11; } +#endif +	printf("options    des ecb/s\n"); +	printf("%s %12.2f 100.0%%\n",str[max_idx],tm[max_idx]); +	d=tm[max_idx]; +	tm[max_idx]= -2.0; +	max= -1.0; +	for (;;) +		{ +		for (i=0; i<12; i++) +			{ +			if (max < tm[i]) { max=tm[i]; j=i; } +			} +		if (max < 0.0) break; +		printf("%s %12.2f  %4.1f%%\n",str[j],tm[j],tm[j]/d*100.0); +		tm[j]= -2.0; +		max= -1.0; +		} + +	switch (max_idx) +		{ +	case 0: +		printf("-DDES_DEFAULT_OPTIONS\n"); +		break; +	case 1: +		printf("-DDES_UNROLL\n"); +		break; +	case 2: +		printf("-DDES_RISC1\n"); +		break; +	case 3: +		printf("-DDES_UNROLL -DDES_RISC1\n"); +		break; +	case 4: +		printf("-DDES_RISC2\n"); +		break; +	case 5: +		printf("-DDES_UNROLL -DDES_RISC2\n"); +		break; +	case 6: +		printf("-DDES_PTR\n"); +		break; +	case 7: +		printf("-DDES_UNROLL -DDES_PTR\n"); +		break; +	case 8: +		printf("-DDES_RISC1 -DDES_PTR\n"); +		break; +	case 9: +		printf("-DDES_UNROLL -DDES_RISC1 -DDES_PTR\n"); +		break; +	case 10: +		printf("-DDES_RISC2 -DDES_PTR\n"); +		break; +	case 11: +		printf("-DDES_UNROLL -DDES_RISC2 -DDES_PTR\n"); +		break; +		} +	exit(0); +#if defined(LINT) || defined(MSDOS) +	return(0); +#endif +	} diff --git a/crypto/libdes/des_ver.h b/crypto/libdes/des_ver.h new file mode 100644 index 000000000000..5edda07db7c0 --- /dev/null +++ b/crypto/libdes/des_ver.h @@ -0,0 +1,60 @@ +/* crypto/des/des_ver.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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.] + */ + +extern char *DES_version;	/* SSLeay version string */ +extern char *libdes_version;	/* old libdes version string */ diff --git a/crypto/libdes/destest.c b/crypto/libdes/destest.c new file mode 100644 index 000000000000..e0d3ec7b444c --- /dev/null +++ b/crypto/libdes/destest.c @@ -0,0 +1,876 @@ +/* crypto/des/destest.c */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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.] + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#if defined(WIN32) || defined(WIN16) || defined(WINDOWS) +#ifndef MSDOS +#define MSDOS +#endif +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif +#ifdef HAVE_IO_H +#include <io.h> +#endif + +#include "des.h" + +/* tisk tisk - the test keys don't all have odd parity :-( */ +/* test data */ +#define NUM_TESTS 34 +static unsigned char key_data[NUM_TESTS][8]={ +	{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}}; + +static unsigned char plain_data[NUM_TESTS][8]={ +	{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}}; + +static unsigned char cipher_data[NUM_TESTS][8]={ +	{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}}; + +static unsigned char cipher_ecb2[NUM_TESTS-1][8]={ +	{0x92,0x95,0xB5,0x9B,0xB3,0x84,0x73,0x6E}, +	{0x19,0x9E,0x9D,0x6D,0xF3,0x9A,0xA8,0x16}, +	{0x2A,0x4B,0x4D,0x24,0x52,0x43,0x84,0x27}, +	{0x35,0x84,0x3C,0x01,0x9D,0x18,0xC5,0xB6}, +	{0x4A,0x5B,0x2F,0x42,0xAA,0x77,0x19,0x25}, +	{0xA0,0x6B,0xA9,0xB8,0xCA,0x5B,0x17,0x8A}, +	{0xAB,0x9D,0xB7,0xFB,0xED,0x95,0xF2,0x74}, +	{0x3D,0x25,0x6C,0x23,0xA7,0x25,0x2F,0xD6}, +	{0xB7,0x6F,0xAB,0x4F,0xBD,0xBD,0xB7,0x67}, +	{0x8F,0x68,0x27,0xD6,0x9C,0xF4,0x1A,0x10}, +	{0x82,0x57,0xA1,0xD6,0x50,0x5E,0x81,0x85}, +	{0xA2,0x0F,0x0A,0xCD,0x80,0x89,0x7D,0xFA}, +	{0xCD,0x2A,0x53,0x3A,0xDB,0x0D,0x7E,0xF3}, +	{0xD2,0xC2,0xBE,0x27,0xE8,0x1B,0x68,0xE3}, +	{0xE9,0x24,0xCF,0x4F,0x89,0x3C,0x5B,0x0A}, +	{0xA7,0x18,0xC3,0x9F,0xFA,0x9F,0xD7,0x69}, +	{0x77,0x2C,0x79,0xB1,0xD2,0x31,0x7E,0xB1}, +	{0x49,0xAB,0x92,0x7F,0xD0,0x22,0x00,0xB7}, +	{0xCE,0x1C,0x6C,0x7D,0x85,0xE3,0x4A,0x6F}, +	{0xBE,0x91,0xD6,0xE1,0x27,0xB2,0xE9,0x87}, +	{0x70,0x28,0xAE,0x8F,0xD1,0xF5,0x74,0x1A}, +	{0xAA,0x37,0x80,0xBB,0xF3,0x22,0x1D,0xDE}, +	{0xA6,0xC4,0xD2,0x5E,0x28,0x93,0xAC,0xB3}, +	{0x22,0x07,0x81,0x5A,0xE4,0xB7,0x1A,0xAD}, +	{0xDC,0xCE,0x05,0xE7,0x07,0xBD,0xF5,0x84}, +	{0x26,0x1D,0x39,0x2C,0xB3,0xBA,0xA5,0x85}, +	{0xB4,0xF7,0x0F,0x72,0xFB,0x04,0xF0,0xDC}, +	{0x95,0xBA,0xA9,0x4E,0x87,0x36,0xF2,0x89}, +	{0xD4,0x07,0x3A,0xF1,0x5A,0x17,0x82,0x0E}, +	{0xEF,0x6F,0xAF,0xA7,0x66,0x1A,0x7E,0x89}, +	{0xC1,0x97,0xF5,0x58,0x74,0x8A,0x20,0xE7}, +	{0x43,0x34,0xCF,0xDA,0x22,0xC4,0x86,0xC8}, +	{0x08,0xD7,0xB4,0xFB,0x62,0x9D,0x08,0x85}}; + +static unsigned char cbc_key [8]={0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef}; +static unsigned char cbc2_key[8]={0xf0,0xe1,0xd2,0xc3,0xb4,0xa5,0x96,0x87}; +static unsigned char cbc3_key[8]={0xfe,0xdc,0xba,0x98,0x76,0x54,0x32,0x10}; +static unsigned char cbc_iv  [8]={0xfe,0xdc,0xba,0x98,0x76,0x54,0x32,0x10}; +static char cbc_data[40]="7654321 Now is the time for "; + +static unsigned char cbc_ok[32]={ +	0xcc,0xd1,0x73,0xff,0xab,0x20,0x39,0xf4, +	0xac,0xd8,0xae,0xfd,0xdf,0xd8,0xa1,0xeb, +	0x46,0x8e,0x91,0x15,0x78,0x88,0xba,0x68, +	0x1d,0x26,0x93,0x97,0xf7,0xfe,0x62,0xb4}; + +static unsigned char xcbc_ok[32]={ +	0x86,0x74,0x81,0x0D,0x61,0xA4,0xA5,0x48, +	0xB9,0x93,0x03,0xE1,0xB8,0xBB,0xBD,0xBD, +	0x64,0x30,0x0B,0xB9,0x06,0x65,0x81,0x76, +	0x04,0x1D,0x77,0x62,0x17,0xCA,0x2B,0xD2, +	}; + +static unsigned char cbc3_ok[32]={ +	0x3F,0xE3,0x01,0xC9,0x62,0xAC,0x01,0xD0, +	0x22,0x13,0x76,0x3C,0x1C,0xBD,0x4C,0xDC, +	0x79,0x96,0x57,0xC0,0x64,0xEC,0xF5,0xD4, +	0x1C,0x67,0x38,0x12,0xCF,0xDE,0x96,0x75}; + +static unsigned char pcbc_ok[32]={ +	0xcc,0xd1,0x73,0xff,0xab,0x20,0x39,0xf4, +	0x6d,0xec,0xb4,0x70,0xa0,0xe5,0x6b,0x15, +	0xae,0xa6,0xbf,0x61,0xed,0x7d,0x9c,0x9f, +	0xf7,0x17,0x46,0x3b,0x8a,0xb3,0xcc,0x88}; + +static unsigned char cfb_key[8]={0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef}; +static unsigned char cfb_iv[8]={0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef}; +static unsigned char cfb_buf1[40],cfb_buf2[40],cfb_tmp[8]; +static unsigned char plain[24]= +	{ +	0x4e,0x6f,0x77,0x20,0x69,0x73, +	0x20,0x74,0x68,0x65,0x20,0x74, +	0x69,0x6d,0x65,0x20,0x66,0x6f, +	0x72,0x20,0x61,0x6c,0x6c,0x20 +	}; +static unsigned char cfb_cipher8[24]= { +	0xf3,0x1f,0xda,0x07,0x01,0x14, 0x62,0xee,0x18,0x7f,0x43,0xd8, +	0x0a,0x7c,0xd9,0xb5,0xb0,0xd2, 0x90,0xda,0x6e,0x5b,0x9a,0x87 }; +static unsigned char cfb_cipher16[24]={ +	0xF3,0x09,0x87,0x87,0x7F,0x57, 0xF7,0x3C,0x36,0xB6,0xDB,0x70, +	0xD8,0xD5,0x34,0x19,0xD3,0x86, 0xB2,0x23,0xB7,0xB2,0xAD,0x1B }; +static unsigned char cfb_cipher32[24]={ +	0xF3,0x09,0x62,0x49,0xA4,0xDF, 0xA4,0x9F,0x33,0xDC,0x7B,0xAD, +	0x4C,0xC8,0x9F,0x64,0xE4,0x53, 0xE5,0xEC,0x67,0x20,0xDA,0xB6 }; +static unsigned char cfb_cipher48[24]={ +	0xF3,0x09,0x62,0x49,0xC7,0xF4, 0x30,0xB5,0x15,0xEC,0xBB,0x85, +	0x97,0x5A,0x13,0x8C,0x68,0x60, 0xE2,0x38,0x34,0x3C,0xDC,0x1F }; +static unsigned char cfb_cipher64[24]={ +	0xF3,0x09,0x62,0x49,0xC7,0xF4, 0x6E,0x51,0xA6,0x9E,0x83,0x9B, +	0x1A,0x92,0xF7,0x84,0x03,0x46, 0x71,0x33,0x89,0x8E,0xA6,0x22 }; + +static unsigned char ofb_key[8]={0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef}; +static unsigned char ofb_iv[8]={0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef}; +static unsigned char ofb_buf1[24],ofb_buf2[24],ofb_tmp[8]; +static unsigned char ofb_cipher[24]= +	{ +	0xf3,0x09,0x62,0x49,0xc7,0xf4,0x6e,0x51, +	0x35,0xf2,0x4a,0x24,0x2e,0xeb,0x3d,0x3f, +	0x3d,0x6d,0x5b,0xe3,0x25,0x5a,0xf8,0xc3 +	}; + +DES_LONG cbc_cksum_ret=0xB462FEF7L; +unsigned char cbc_cksum_data[8]={0x1D,0x26,0x93,0x97,0xf7,0xfe,0x62,0xb4}; + +#ifndef NOPROTO +static char *pt(unsigned char *p); +static int cfb_test(int bits, unsigned char *cfb_cipher); +static int cfb64_test(unsigned char *cfb_cipher); +static int ede_cfb64_test(unsigned char *cfb_cipher); +#else +static char *pt(); +static int cfb_test(); +static int cfb64_test(); +static int ede_cfb64_test(); +#endif + +int main(argc,argv) +int argc; +char *argv[]; +	{ +	int i,j,err=0; +	des_cblock in,out,outin,iv3; +	des_key_schedule ks,ks2,ks3; +	unsigned char cbc_in[40]; +	unsigned char cbc_out[40]; +	DES_LONG cs; +	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; + +	printf("Doing ecb\n"); +	for (i=0; i<NUM_TESTS; i++) +		{ +		if ((j=des_key_sched((C_Block *)(key_data[i]),ks)) != 0) +			{ +			printf("Key error %2d:%d\n",i+1,j); +			err=1; +			} +		memcpy(in,plain_data[i],8); +		memset(out,0,8); +		memset(outin,0,8); +		des_ecb_encrypt((C_Block *)in,(C_Block *)out,ks,DES_ENCRYPT); +		des_ecb_encrypt((C_Block *)out,(C_Block *)outin,ks,DES_DECRYPT); + +		if (memcmp(out,cipher_data[i],8) != 0) +			{ +			printf("Encryption error %2d\nk=%s p=%s o=%s act=%s\n", +				i+1,pt(key_data[i]),pt(in),pt(cipher_data[i]), +				pt(out)); +			err=1; +			} +		if (memcmp(in,outin,8) != 0) +			{ +			printf("Decryption error %2d\nk=%s p=%s o=%s act=%s\n", +				i+1,pt(key_data[i]),pt(out),pt(in),pt(outin)); +			err=1; +			} +		} + +#ifndef LIBDES_LIT +	printf("Doing ede ecb\n"); +	for (i=0; i<(NUM_TESTS-1); i++) +		{ +		if ((j=des_key_sched((C_Block *)(key_data[i]),ks)) != 0) +			{ +			err=1; +			printf("Key error %2d:%d\n",i+1,j); +			} +		if ((j=des_key_sched((C_Block *)(key_data[i+1]),ks2)) != 0) +			{ +			printf("Key error %2d:%d\n",i+2,j); +			err=1; +			} +		if ((j=des_key_sched((C_Block *)(key_data[i+2]),ks3)) != 0) +			{ +			printf("Key error %2d:%d\n",i+3,j); +			err=1; +			} +		memcpy(in,plain_data[i],8); +		memset(out,0,8); +		memset(outin,0,8); +		des_ecb2_encrypt((C_Block *)in,(C_Block *)out,ks,ks2, +			DES_ENCRYPT); +		des_ecb2_encrypt((C_Block *)out,(C_Block *)outin,ks,ks2, +			DES_DECRYPT); + +		if (memcmp(out,cipher_ecb2[i],8) != 0) +			{ +			printf("Encryption error %2d\nk=%s p=%s o=%s act=%s\n", +				i+1,pt(key_data[i]),pt(in),pt(cipher_ecb2[i]), +				pt(out)); +			err=1; +			} +		if (memcmp(in,outin,8) != 0) +			{ +			printf("Decryption error %2d\nk=%s p=%s o=%s act=%s\n", +				i+1,pt(key_data[i]),pt(out),pt(in),pt(outin)); +			err=1; +			} +		} +#endif + +	printf("Doing cbc\n"); +	if ((j=des_key_sched((C_Block *)cbc_key,ks)) != 0) +		{ +		printf("Key error %d\n",j); +		err=1; +		} +	memset(cbc_out,0,40); +	memset(cbc_in,0,40); +	des_cbc_encrypt((C_Block *)cbc_data,(C_Block *)cbc_out, +		(long)strlen((char *)cbc_data)+1,ks, +		(C_Block *)cbc_iv,DES_ENCRYPT); +	if (memcmp(cbc_out,cbc_ok,32) != 0) +		printf("cbc_encrypt encrypt error\n"); +	des_cbc_encrypt((C_Block *)cbc_out,(C_Block *)cbc_in, +		(long)strlen((char *)cbc_data)+1,ks, +		(C_Block *)cbc_iv,DES_DECRYPT); +	if (memcmp(cbc_in,cbc_data,strlen((char *)cbc_data)) != 0) +		{ +		printf("cbc_encrypt decrypt error\n"); +		err=1; +		} + +#ifndef LIBDES_LIT +	printf("Doing desx cbc\n"); +	if ((j=des_key_sched((C_Block *)cbc_key,ks)) != 0) +		{ +		printf("Key error %d\n",j); +		err=1; +		} +	memset(cbc_out,0,40); +	memset(cbc_in,0,40); +	memcpy(iv3,cbc_iv,sizeof(cbc_iv)); +	des_xcbc_encrypt((C_Block *)cbc_data,(C_Block *)cbc_out, +		(long)strlen((char *)cbc_data)+1,ks, +		(C_Block *)iv3, +		(C_Block *)cbc2_key, (C_Block *)cbc3_key, DES_ENCRYPT); +	if (memcmp(cbc_out,xcbc_ok,32) != 0) +		{ +		printf("des_xcbc_encrypt encrypt error\n"); +		} +	memcpy(iv3,cbc_iv,sizeof(cbc_iv)); +	des_xcbc_encrypt((C_Block *)cbc_out,(C_Block *)cbc_in, +		(long)strlen((char *)cbc_data)+1,ks, +		(C_Block *)iv3, +		(C_Block *)cbc2_key, (C_Block *)cbc3_key, DES_DECRYPT); +	if (memcmp(cbc_in,cbc_data,32) != 0) +		{ +		printf("des_xcbc_encrypt decrypt error\n"); +		err=1; +		} +#endif + +	printf("Doing ede cbc\n"); +	if ((j=des_key_sched((C_Block *)cbc_key,ks)) != 0) +		{ +		printf("Key error %d\n",j); +		err=1; +		} +	if ((j=des_key_sched((C_Block *)cbc2_key,ks2)) != 0) +		{ +		printf("Key error %d\n",j); +		err=1; +		} +	if ((j=des_key_sched((C_Block *)cbc3_key,ks3)) != 0) +		{ +		printf("Key error %d\n",j); +		err=1; +		} +	memset(cbc_out,0,40); +	memset(cbc_in,0,40); +	i=strlen((char *)cbc_data)+1; +	i=((i+7)/8)*8; +	memcpy(iv3,cbc_iv,sizeof(cbc_iv)); + +	des_ede3_cbc_encrypt((C_Block *)cbc_data,(C_Block *)cbc_out, +		16L,ks,ks2,ks3,(C_Block *)iv3,DES_ENCRYPT); +	des_ede3_cbc_encrypt((C_Block *)&(cbc_data[16]), +		(C_Block *)&(cbc_out[16]), +		(long)i-16,ks,ks2,ks3,(C_Block *)iv3,DES_ENCRYPT); +	if (memcmp(cbc_out,cbc3_ok, +		(unsigned int)(strlen((char *)cbc_data)+1+7)/8*8) != 0) +		{ +		printf("des_ede3_cbc_encrypt encrypt error\n"); +		err=1; +		} + +	memcpy(iv3,cbc_iv,sizeof(cbc_iv)); +	des_ede3_cbc_encrypt((C_Block *)cbc_out,(C_Block *)cbc_in, +		(long)i,ks,ks2,ks3,(C_Block *)iv3,DES_DECRYPT); +	if (memcmp(cbc_in,cbc_data,strlen(cbc_data)+1) != 0) +		{ +		printf("des_ede3_cbc_encrypt decrypt error\n"); +		err=1; +		} + +#ifndef LIBDES_LIT +	printf("Doing pcbc\n"); +	if ((j=des_key_sched((C_Block *)cbc_key,ks)) != 0) +		{ +		printf("Key error %d\n",j); +		err=1; +		} +	memset(cbc_out,0,40); +	memset(cbc_in,0,40); +	des_pcbc_encrypt((C_Block *)cbc_data,(C_Block *)cbc_out, +		(long)strlen(cbc_data)+1,ks,(C_Block *)cbc_iv,DES_ENCRYPT); +	if (memcmp(cbc_out,pcbc_ok,32) != 0) +		{ +		printf("pcbc_encrypt encrypt error\n"); +		err=1; +		} +	des_pcbc_encrypt((C_Block *)cbc_out,(C_Block *)cbc_in, +		(long)strlen(cbc_data)+1,ks,(C_Block *)cbc_iv,DES_DECRYPT); +	if (memcmp(cbc_in,cbc_data,32) != 0) +		{ +		printf("pcbc_encrypt decrypt error\n"); +		err=1; +		} + +	printf("Doing "); +	printf("cfb8 "); +	err+=cfb_test(8,cfb_cipher8); +	printf("cfb16 "); +	err+=cfb_test(16,cfb_cipher16); +	printf("cfb32 "); +	err+=cfb_test(32,cfb_cipher32); +	printf("cfb48 "); +	err+=cfb_test(48,cfb_cipher48); +	printf("cfb64 "); +	err+=cfb_test(64,cfb_cipher64); + +	printf("cfb64() "); +	err+=cfb64_test(cfb_cipher64); + +	memcpy(cfb_tmp,cfb_iv,sizeof(cfb_iv)); +	for (i=0; i<sizeof(plain); i++) +		des_cfb_encrypt(&(plain[i]),&(cfb_buf1[i]), +			8,(long)1,ks,(C_Block *)cfb_tmp,DES_ENCRYPT); +	if (memcmp(cfb_cipher8,cfb_buf1,sizeof(plain)) != 0) +		{ +		printf("cfb_encrypt small encrypt error\n"); +		err=1; +		} + +	memcpy(cfb_tmp,cfb_iv,sizeof(cfb_iv)); +	for (i=0; i<sizeof(plain); i++) +		des_cfb_encrypt(&(cfb_buf1[i]),&(cfb_buf2[i]), +			8,(long)1,ks,(C_Block *)cfb_tmp,DES_DECRYPT); +	if (memcmp(plain,cfb_buf2,sizeof(plain)) != 0) +		{ +		printf("cfb_encrypt small decrypt error\n"); +		err=1; +		} + +	printf("ede_cfb64() "); +	err+=ede_cfb64_test(cfb_cipher64); + +	printf("done\n"); + +	printf("Doing ofb\n"); +	des_key_sched((C_Block *)ofb_key,ks); +	memcpy(ofb_tmp,ofb_iv,sizeof(ofb_iv)); +	des_ofb_encrypt(plain,ofb_buf1,64,(long)sizeof(plain)/8,ks, +		(C_Block *)ofb_tmp); +	if (memcmp(ofb_cipher,ofb_buf1,sizeof(ofb_buf1)) != 0) +		{ +		printf("ofb_encrypt encrypt error\n"); +		err=1; +		} +	memcpy(ofb_tmp,ofb_iv,sizeof(ofb_iv)); +	des_ofb_encrypt(ofb_buf1,ofb_buf2,64,(long)sizeof(ofb_buf1)/8,ks, +		(C_Block *)ofb_tmp); +	if (memcmp(plain,ofb_buf2,sizeof(ofb_buf2)) != 0) +		{ +		printf("ofb_encrypt decrypt error\n"); +		err=1; +		} + +	printf("Doing ofb64\n"); +	des_key_sched((C_Block *)ofb_key,ks); +	memcpy(ofb_tmp,ofb_iv,sizeof(ofb_iv)); +	memset(ofb_buf1,0,sizeof(ofb_buf1)); +	memset(ofb_buf2,0,sizeof(ofb_buf1)); +	num=0; +	for (i=0; i<sizeof(plain); i++) +		{ +		des_ofb64_encrypt(&(plain[i]),&(ofb_buf1[i]),1,ks, +			(C_Block *)ofb_tmp,&num); +		} +	if (memcmp(ofb_cipher,ofb_buf1,sizeof(ofb_buf1)) != 0) +		{ +		printf("ofb64_encrypt encrypt error\n"); +		err=1; +		} +	memcpy(ofb_tmp,ofb_iv,sizeof(ofb_iv)); +	num=0; +	des_ofb64_encrypt(ofb_buf1,ofb_buf2,(long)sizeof(ofb_buf1),ks, +		(C_Block *)ofb_tmp,&num); +	if (memcmp(plain,ofb_buf2,sizeof(ofb_buf2)) != 0) +		{ +		printf("ofb64_encrypt decrypt error\n"); +		err=1; +		} + +	printf("Doing ede_ofb64\n"); +	des_key_sched((C_Block *)ofb_key,ks); +	memcpy(ofb_tmp,ofb_iv,sizeof(ofb_iv)); +	memset(ofb_buf1,0,sizeof(ofb_buf1)); +	memset(ofb_buf2,0,sizeof(ofb_buf1)); +	num=0; +	for (i=0; i<sizeof(plain); i++) +		{ +		des_ede3_ofb64_encrypt(&(plain[i]),&(ofb_buf1[i]),1,ks,ks,ks, +			(C_Block *)ofb_tmp,&num); +		} +	if (memcmp(ofb_cipher,ofb_buf1,sizeof(ofb_buf1)) != 0) +		{ +		printf("ede_ofb64_encrypt encrypt error\n"); +		err=1; +		} +	memcpy(ofb_tmp,ofb_iv,sizeof(ofb_iv)); +	num=0; +	des_ede3_ofb64_encrypt(ofb_buf1,ofb_buf2,(long)sizeof(ofb_buf1),ks, +		ks,ks,(C_Block *)ofb_tmp,&num); +	if (memcmp(plain,ofb_buf2,sizeof(ofb_buf2)) != 0) +		{ +		printf("ede_ofb64_encrypt decrypt error\n"); +		err=1; +		} + +	printf("Doing cbc_cksum\n"); +	des_key_sched((C_Block *)cbc_key,ks); +	cs=des_cbc_cksum((C_Block *)cbc_data,(C_Block *)cret, +		(long)strlen(cbc_data),ks,(C_Block *)cbc_iv); +	if (cs != cbc_cksum_ret) +		{ +		printf("bad return value (%08lX), should be %08lX\n", +			(unsigned long)cs,(unsigned long)cbc_cksum_ret); +		err=1; +		} +	if (memcmp(cret,cbc_cksum_data,8) != 0) +		{ +		printf("bad cbc_cksum block returned\n"); +		err=1; +		} + +	printf("Doing quad_cksum\n"); +	cs=quad_cksum((C_Block *)cbc_data,(C_Block *)lqret, +		(long)strlen(cbc_data),2,(C_Block *)cbc_iv); +	if (cs != 0x70d7a63aL) +		{ +		printf("quad_cksum error, ret %08lx should be 70d7a63a\n", +			(unsigned long)cs); +		err=1; +		} +#ifdef _CRAY +	if (lqret[0].a != 0x327eba8dL) +		{ +		printf("quad_cksum error, out[0] %08lx is not %08lx\n", +			(unsigned long)lqret[0].a,0x327eba8dL); +		err=1; +		} +	if (lqret[0].b != 0x201a49ccL) +		{ +		printf("quad_cksum error, out[1] %08lx is not %08lx\n", +			(unsigned long)lqret[0].b,0x201a49ccL); +		err=1; +		} +	if (lqret[1].a != 0x70d7a63aL) +		{ +		printf("quad_cksum error, out[2] %08lx is not %08lx\n", +			(unsigned long)lqret[1].a,0x70d7a63aL); +		err=1; +		} +	if (lqret[1].b != 0x501c2c26L) +		{ +		printf("quad_cksum error, out[3] %08lx is not %08lx\n", +			(unsigned long)lqret[1].b,0x501c2c26L); +		err=1; +		} +#else +	if (lqret[0] != 0x327eba8dL) +		{ +		printf("quad_cksum error, out[0] %08lx is not %08lx\n", +			(unsigned long)lqret[0],0x327eba8dL); +		err=1; +		} +	if (lqret[1] != 0x201a49ccL) +		{ +		printf("quad_cksum error, out[1] %08lx is not %08lx\n", +			(unsigned long)lqret[1],0x201a49ccL); +		err=1; +		} +	if (lqret[2] != 0x70d7a63aL) +		{ +		printf("quad_cksum error, out[2] %08lx is not %08lx\n", +			(unsigned long)lqret[2],0x70d7a63aL); +		err=1; +		} +	if (lqret[3] != 0x501c2c26L) +		{ +		printf("quad_cksum error, out[3] %08lx is not %08lx\n", +			(unsigned long)lqret[3],0x501c2c26L); +		err=1; +		} +#endif +#endif + +	printf("input word alignment test"); +	for (i=0; i<4; i++) +		{ +		printf(" %d",i); +		des_cbc_encrypt((C_Block *)&(cbc_out[i]),(C_Block *)cbc_in, +			(long)strlen(cbc_data)+1,ks,(C_Block *)cbc_iv, +			DES_ENCRYPT); +		} +	printf("\noutput word alignment test"); +	for (i=0; i<4; i++) +		{ +		printf(" %d",i); +		des_cbc_encrypt((C_Block *)cbc_out,(C_Block *)&(cbc_in[i]), +			(long)strlen(cbc_data)+1,ks,(C_Block *)cbc_iv, +			DES_ENCRYPT); +		} +	printf("\n"); +	printf("fast crypt test "); +	str=crypt("testing","ef"); +	if (strcmp("efGnQx2725bI2",str) != 0) +		{ +		printf("fast crypt error, %s should be efGnQx2725bI2\n",str); +		err=1; +		} +	str=crypt("bca76;23","yA"); +	if (strcmp("yA1Rp/1hZXIJk",str) != 0) +		{ +		printf("fast crypt error, %s should be yA1Rp/1hZXIJk\n",str); +		err=1; +		} +	printf("\n"); +	exit(err); +	return(0); +	} + +static char *pt(p) +unsigned char *p; +	{ +	static char bufs[10][20]; +	static int bnum=0; +	char *ret; +	int i; +	static char *f="0123456789ABCDEF"; + +	ret= &(bufs[bnum++][0]); +	bnum%=10; +	for (i=0; i<8; i++) +		{ +		ret[i*2]=f[(p[i]>>4)&0xf]; +		ret[i*2+1]=f[p[i]&0xf]; +		} +	ret[16]='\0'; +	return(ret); +	} + +#ifndef LIBDES_LIT + +static int cfb_test(bits, cfb_cipher) +int bits; +unsigned char *cfb_cipher; +	{ +	des_key_schedule ks; +	int i,err=0; + +	des_key_sched((C_Block *)cfb_key,ks); +	memcpy(cfb_tmp,cfb_iv,sizeof(cfb_iv)); +	des_cfb_encrypt(plain,cfb_buf1,bits,(long)sizeof(plain),ks, +		(C_Block *)cfb_tmp,DES_ENCRYPT); +	if (memcmp(cfb_cipher,cfb_buf1,sizeof(plain)) != 0) +		{ +		err=1; +		printf("cfb_encrypt encrypt error\n"); +		for (i=0; i<24; i+=8) +			printf("%s\n",pt(&(cfb_buf1[i]))); +		} +	memcpy(cfb_tmp,cfb_iv,sizeof(cfb_iv)); +	des_cfb_encrypt(cfb_buf1,cfb_buf2,bits,(long)sizeof(plain),ks, +		(C_Block *)cfb_tmp,DES_DECRYPT); +	if (memcmp(plain,cfb_buf2,sizeof(plain)) != 0) +		{ +		err=1; +		printf("cfb_encrypt decrypt error\n"); +		for (i=0; i<24; i+=8) +			printf("%s\n",pt(&(cfb_buf1[i]))); +		} +	return(err); +	} + +static int cfb64_test(cfb_cipher) +unsigned char *cfb_cipher; +	{ +	des_key_schedule ks; +	int err=0,i,n; + +	des_key_sched((C_Block *)cfb_key,ks); +	memcpy(cfb_tmp,cfb_iv,sizeof(cfb_iv)); +	n=0; +	des_cfb64_encrypt(plain,cfb_buf1,(long)12,ks, +		(C_Block *)cfb_tmp,&n,DES_ENCRYPT); +	des_cfb64_encrypt(&(plain[12]),&(cfb_buf1[12]), +		(long)sizeof(plain)-12,ks, +		(C_Block *)cfb_tmp,&n,DES_ENCRYPT); +	if (memcmp(cfb_cipher,cfb_buf1,sizeof(plain)) != 0) +		{ +		err=1; +		printf("cfb_encrypt encrypt error\n"); +		for (i=0; i<24; i+=8) +			printf("%s\n",pt(&(cfb_buf1[i]))); +		} +	memcpy(cfb_tmp,cfb_iv,sizeof(cfb_iv)); +	n=0; +	des_cfb64_encrypt(cfb_buf1,cfb_buf2,(long)17,ks, +		(C_Block *)cfb_tmp,&n,DES_DECRYPT); +	des_cfb64_encrypt(&(cfb_buf1[17]),&(cfb_buf2[17]), +		(long)sizeof(plain)-17,ks, +		(C_Block *)cfb_tmp,&n,DES_DECRYPT); +	if (memcmp(plain,cfb_buf2,sizeof(plain)) != 0) +		{ +		err=1; +		printf("cfb_encrypt decrypt error\n"); +		for (i=0; i<24; i+=8) +			printf("%s\n",pt(&(cfb_buf2[i]))); +		} +	return(err); +	} + +static int ede_cfb64_test(cfb_cipher) +unsigned char *cfb_cipher; +	{ +	des_key_schedule ks; +	int err=0,i,n; + +	des_key_sched((C_Block *)cfb_key,ks); +	memcpy(cfb_tmp,cfb_iv,sizeof(cfb_iv)); +	n=0; +	des_ede3_cfb64_encrypt(plain,cfb_buf1,(long)12,ks,ks,ks, +		(C_Block *)cfb_tmp,&n,DES_ENCRYPT); +	des_ede3_cfb64_encrypt(&(plain[12]),&(cfb_buf1[12]), +		(long)sizeof(plain)-12,ks,ks,ks, +		(C_Block *)cfb_tmp,&n,DES_ENCRYPT); +	if (memcmp(cfb_cipher,cfb_buf1,sizeof(plain)) != 0) +		{ +		err=1; +		printf("ede_cfb_encrypt encrypt error\n"); +		for (i=0; i<24; i+=8) +			printf("%s\n",pt(&(cfb_buf1[i]))); +		} +	memcpy(cfb_tmp,cfb_iv,sizeof(cfb_iv)); +	n=0; +	des_ede3_cfb64_encrypt(cfb_buf1,cfb_buf2,(long)17,ks,ks,ks, +		(C_Block *)cfb_tmp,&n,DES_DECRYPT); +	des_ede3_cfb64_encrypt(&(cfb_buf1[17]),&(cfb_buf2[17]), +		(long)sizeof(plain)-17,ks,ks,ks, +		(C_Block *)cfb_tmp,&n,DES_DECRYPT); +	if (memcmp(plain,cfb_buf2,sizeof(plain)) != 0) +		{ +		err=1; +		printf("ede_cfb_encrypt decrypt error\n"); +		for (i=0; i<24; i+=8) +			printf("%s\n",pt(&(cfb_buf2[i]))); +		} +	return(err); +	} + +#endif + diff --git a/crypto/libdes/dllmain.c b/crypto/libdes/dllmain.c new file mode 100644 index 000000000000..4eed1f2e2657 --- /dev/null +++ b/crypto/libdes/dllmain.c @@ -0,0 +1,57 @@ +/* + * Copyright (c) 1995, 1996, 1997 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * 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 acknowledgement: + *      This product includes software developed by the Kungliga Tekniska + *      Högskolan and its contributors. + *  + * 4. Neither the name of the Institute nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + *  + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``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 INSTITUTE 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. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +RCSID("$Id: dllmain.c,v 1.5 1997/04/20 06:21:24 assar Exp $"); +#endif + +#include <Windows.h> + +BOOL WINAPI +DllMain (HANDLE hInst,  +	 ULONG reason, +	 LPVOID lpReserved) +{ +    switch(reason) { +    case DLL_PROCESS_ATTACH: +    case DLL_PROCESS_DETACH: +    default: +	return TRUE; +    } +} diff --git a/crypto/libdes/doIP b/crypto/libdes/doIP new file mode 100755 index 000000000000..18cf23130364 --- /dev/null +++ b/crypto/libdes/doIP @@ -0,0 +1,46 @@ +#!/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/crypto/libdes/doPC1 b/crypto/libdes/doPC1 new file mode 100755 index 000000000000..096afd8c4614 --- /dev/null +++ b/crypto/libdes/doPC1 @@ -0,0 +1,110 @@ +#!/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/crypto/libdes/doPC2 b/crypto/libdes/doPC2 new file mode 100755 index 000000000000..fa5cf74cf713 --- /dev/null +++ b/crypto/libdes/doPC2 @@ -0,0 +1,94 @@ +#!/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/crypto/libdes/ecb3_enc.c b/crypto/libdes/ecb3_enc.c new file mode 100644 index 000000000000..03d8f8777192 --- /dev/null +++ b/crypto/libdes/ecb3_enc.c @@ -0,0 +1,87 @@ +/* crypto/des/ecb3_enc.c */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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 "des_locl.h" + +void des_ecb3_encrypt(input, output, ks1, ks2, ks3, encrypt) +des_cblock (*input); +des_cblock (*output); +des_key_schedule ks1; +des_key_schedule ks2; +des_key_schedule ks3; +int encrypt; +	{ +	register DES_LONG l0,l1; +	register unsigned char *in,*out; +	DES_LONG ll[2]; + +	in=(unsigned char *)input; +	out=(unsigned char *)output; +	c2l(in,l0); +	c2l(in,l1); +	ll[0]=l0; +	ll[1]=l1; +	if (encrypt) +		des_encrypt3(ll,ks1,ks2,ks3); +	else +		des_decrypt3(ll,ks1,ks2,ks3); +	l0=ll[0]; +	l1=ll[1]; +	l2c(l0,out); +	l2c(l1,out); +	} diff --git a/crypto/libdes/ecb_enc.c b/crypto/libdes/ecb_enc.c new file mode 100644 index 000000000000..5fcaf1928985 --- /dev/null +++ b/crypto/libdes/ecb_enc.c @@ -0,0 +1,124 @@ +/* crypto/des/ecb_enc.c */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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 "des_locl.h" +#include "spr.h" + +char *libdes_version="libdes v 4.01 - 13-Jan-1997 - eay"; +char *DES_version="DES part of SSLeay 0.6.6 14-Jan-1997"; + +char *des_options() +	{ +	static int init=1; +	static char buf[32]; + +	if (init) +		{ +		char *ptr,*unroll,*risc,*size; + +		init=0; +#ifdef DES_PTR +		ptr="ptr"; +#else +		ptr="idx"; +#endif +#if defined(DES_RISC1) || defined(DES_RISC2) +#ifdef DES_RISC1 +		risc="risc1"; +#endif +#ifdef DES_RISC2 +		risc="risc2"; +#endif +#else +		risc="cisc"; +#endif +#ifdef DES_UNROLL +		unroll="16"; +#else +		unroll="4"; +#endif +		if (sizeof(DES_LONG) != sizeof(long)) +			size="int"; +		else +			size="long"; +		sprintf(buf,"des(%s,%s,%s,%s)",ptr,risc,unroll,size); +		} +	return(buf); +	} +		 + +void des_ecb_encrypt(input, output, ks, encrypt) +des_cblock (*input); +des_cblock (*output); +des_key_schedule ks; +int encrypt; +	{ +	register DES_LONG l; +	register unsigned char *in,*out; +	DES_LONG ll[2]; + +	in=(unsigned char *)input; +	out=(unsigned char *)output; +	c2l(in,l); ll[0]=l; +	c2l(in,l); ll[1]=l; +	des_encrypt(ll,ks,encrypt); +	l=ll[0]; l2c(l,out); +	l=ll[1]; l2c(l,out); +	l=ll[0]=ll[1]=0; +	} + diff --git a/crypto/libdes/ede_enc.c b/crypto/libdes/ede_enc.c new file mode 100644 index 000000000000..c62efac4e3cf --- /dev/null +++ b/crypto/libdes/ede_enc.c @@ -0,0 +1,189 @@ +/* crypto/des/ede_enc.c */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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 "des_locl.h" + +void des_ede3_cbc_encrypt(input, output, length, ks1, ks2, ks3, ivec, encrypt) +des_cblock (*input); +des_cblock (*output); +long length; +des_key_schedule ks1; +des_key_schedule ks2; +des_key_schedule ks3; +des_cblock (*ivec); +int encrypt; +	{ +	register DES_LONG tin0,tin1; +	register DES_LONG tout0,tout1,xor0,xor1; +	register unsigned char *in,*out; +	register long l=length; +	DES_LONG tin[2]; +	unsigned char *iv; + +	in=(unsigned char *)input; +	out=(unsigned char *)output; +	iv=(unsigned char *)ivec; + +	if (encrypt) +		{ +		c2l(iv,tout0); +		c2l(iv,tout1); +		for (l-=8; l>=0; l-=8) +			{ +			c2l(in,tin0); +			c2l(in,tin1); +			tin0^=tout0; +			tin1^=tout1; + +			tin[0]=tin0; +			tin[1]=tin1; +			des_encrypt3((DES_LONG *)tin,ks1,ks2,ks3); +			tout0=tin[0]; +			tout1=tin[1]; + +			l2c(tout0,out); +			l2c(tout1,out); +			} +		if (l != -8) +			{ +			c2ln(in,tin0,tin1,l+8); +			tin0^=tout0; +			tin1^=tout1; + +			tin[0]=tin0; +			tin[1]=tin1; +			des_encrypt3((DES_LONG *)tin,ks1,ks2,ks3); +			tout0=tin[0]; +			tout1=tin[1]; + +			l2c(tout0,out); +			l2c(tout1,out); +			} +		iv=(unsigned char *)ivec; +		l2c(tout0,iv); +		l2c(tout1,iv); +		} +	else +		{ +		register DES_LONG t0,t1; + +		c2l(iv,xor0); +		c2l(iv,xor1); +		for (l-=8; l>=0; l-=8) +			{ +			c2l(in,tin0); +			c2l(in,tin1); + +			t0=tin0; +			t1=tin1; + +			tin[0]=tin0; +			tin[1]=tin1; +			des_decrypt3((DES_LONG *)tin,ks1,ks2,ks3); +			tout0=tin[0]; +			tout1=tin[1]; + +			tout0^=xor0; +			tout1^=xor1; +			l2c(tout0,out); +			l2c(tout1,out); +			xor0=t0; +			xor1=t1; +			} +		if (l != -8) +			{ +			c2l(in,tin0); +			c2l(in,tin1); + +			t0=tin0; +			t1=tin1; + +			tin[0]=tin0; +			tin[1]=tin1; +			des_decrypt3((DES_LONG *)tin,ks1,ks2,ks3); +			tout0=tin[0]; +			tout1=tin[1]; + +			tout0^=xor0; +			tout1^=xor1; +			l2cn(tout0,tout1,out,l+8); +			xor0=t0; +			xor1=t1; +			} +		iv=(unsigned char *)ivec; +		l2c(xor0,iv); +		l2c(xor1,iv); +		} +	tin0=tin1=tout0=tout1=xor0=xor1=0; +	tin[0]=tin[1]=0; +	} + +#ifdef undef /* MACRO */ +void des_ede2_cbc_encrypt(input, output, length, ks1, ks2, ivec, enc) +des_cblock (*input); +des_cblock (*output); +long length; +des_key_schedule ks1; +des_key_schedule ks2; +des_cblock (*ivec); +int enc; +	{ +	des_ede3_cbc_encrypt(input,output,length,ks1,ks2,ks1,ivec,enc); +	} +#endif + diff --git a/crypto/libdes/enc_read.c b/crypto/libdes/enc_read.c new file mode 100644 index 000000000000..2d79d3119862 --- /dev/null +++ b/crypto/libdes/enc_read.c @@ -0,0 +1,214 @@ +/* crypto/des/enc_read.c */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + *  + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed.  i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#include <stdio.h> +#include <errno.h> +#include "des_locl.h" + +/* This has some uglies in it but it works - even over sockets. */ +/*extern int errno;*/ +int des_rw_mode=DES_PCBC_MODE; + +int des_enc_read(fd, buf, len, sched, iv) +int fd; +char *buf; +int len; +des_key_schedule sched; +des_cblock (*iv); +	{ +	/* data to be unencrypted */ +	int net_num=0; +	static unsigned char *net=NULL; +	/* extra unencrypted data  +	 * for when a block of 100 comes in but is des_read one byte at +	 * a time. */ +	static char *unnet=NULL; +	static int unnet_start=0; +	static int unnet_left=0; +	static char *tmpbuf=NULL; +	int i; +	long num=0,rnum; +	unsigned char *p; + +	if (tmpbuf == NULL) +		{ +		tmpbuf=(char *)malloc(BSIZE); +		if (tmpbuf == NULL) return(-1); +		} +	if (net == NULL) +		{ +		net=(unsigned char *)malloc(BSIZE); +		if (net == NULL) return(-1); +		} +	if (unnet == NULL) +		{ +		unnet=(char *)malloc(BSIZE); +		if (unnet == NULL) return(-1); +		} +	/* left over data from last decrypt */ +	if (unnet_left != 0) +		{ +		if (unnet_left < len) +			{ +			/* we still still need more data but will return +			 * with the number of bytes we have - should always +			 * check the return value */ +			memcpy(buf,&(unnet[unnet_start]), +				(unsigned int)unnet_left); +			/* eay 26/08/92 I had the next 2 lines +			 * reversed :-( */ +			i=unnet_left; +			unnet_start=unnet_left=0; +			} +		else +			{ +			memcpy(buf,&(unnet[unnet_start]),(unsigned int)len); +			unnet_start+=len; +			unnet_left-=len; +			i=len; +			} +		return(i); +		} + +	/* We need to get more data. */ +	if (len > MAXWRITE) len=MAXWRITE; + +	/* first - get the length */ +	while (net_num < HDRSIZE)  +		{ +		i=read(fd,&(net[net_num]),(unsigned int)HDRSIZE-net_num); +		if ((i == -1) && (errno == EINTR)) continue; +		if (i <= 0) return(0); +		net_num+=i; +		} + +	/* we now have at net_num bytes in net */ +	p=net; +	/* num=0;  */ +	n2l(p,num); +	/* num should be rounded up to the next group of eight +	 * we make sure that we have read a multiple of 8 bytes from the net. +	 */ +	if ((num > MAXWRITE) || (num < 0)) /* error */ +		return(-1); +	rnum=(num < 8)?8:((num+7)/8*8); + +	net_num=0; +	while (net_num < rnum) +		{ +		i=read(fd,&(net[net_num]),(unsigned int)rnum-net_num); +		if ((i == -1) && (errno == EINTR)) continue; +		if (i <= 0) return(0); +		net_num+=i; +		} + +	/* Check if there will be data left over. */ +	if (len < num) +		{ +		if (des_rw_mode & DES_PCBC_MODE) +			des_pcbc_encrypt((des_cblock *)net,(des_cblock *)unnet, +				num,sched,iv,DES_DECRYPT); +		else +			des_cbc_encrypt((des_cblock *)net,(des_cblock *)unnet, +				num,sched,iv,DES_DECRYPT); +		memcpy(buf,unnet,(unsigned int)len); +		unnet_start=len; +		unnet_left=(int)num-len; + +		/* The following line is done because we return num +		 * as the number of bytes read. */ +		num=len; +		} +	else +		{ +		/* >output is a multiple of 8 byes, if len < rnum +		 * >we must be careful.  The user must be aware that this +		 * >routine will write more bytes than he asked for. +		 * >The length of the buffer must be correct. +		 * FIXED - Should be ok now 18-9-90 - eay */ +		if (len < rnum) +			{ + +			if (des_rw_mode & DES_PCBC_MODE) +				des_pcbc_encrypt((des_cblock *)net, +					(des_cblock *)tmpbuf, +					num,sched,iv,DES_DECRYPT); +			else +				des_cbc_encrypt((des_cblock *)net, +					(des_cblock *)tmpbuf, +					num,sched,iv,DES_DECRYPT); + +			/* eay 26/08/92 fix a bug that returned more +			 * bytes than you asked for (returned len bytes :-( */ +			memcpy(buf,tmpbuf,(unsigned int)num); +			} +		else +			{ +			if (des_rw_mode & DES_PCBC_MODE) +				des_pcbc_encrypt((des_cblock *)net, +					(des_cblock *)buf,num,sched,iv, +					DES_DECRYPT); +			else +				des_cbc_encrypt((des_cblock *)net, +					(des_cblock *)buf,num,sched,iv, +					DES_DECRYPT); +			} +		} +	return((int)num); +	} + diff --git a/crypto/libdes/enc_writ.c b/crypto/libdes/enc_writ.c new file mode 100644 index 000000000000..cf6138271489 --- /dev/null +++ b/crypto/libdes/enc_writ.c @@ -0,0 +1,160 @@ +/* crypto/des/enc_writ.c */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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 <errno.h> +#include <time.h> +#include "des_locl.h" + +int des_enc_write(fd, buf, len, sched, iv) +int fd; +char *buf; +int len; +des_key_schedule sched; +des_cblock (*iv); +	{ +#ifdef _LIBC +	extern int srandom(); +	extern unsigned long time(); +	extern int random(); +	extern int write(); +#endif + +	long rnum; +	int i,j,k,outnum; +	char *outbuf=NULL; +	char shortbuf[8]; +	char *p; +	static int start=1; + +	if (outbuf == NULL) +		{ +		outbuf=(char *)malloc(BSIZE+HDRSIZE); +		if (outbuf == NULL) return(-1); +		} +	/* If we are sending less than 8 bytes, the same char will look +	 * the same if we don't pad it out with random bytes */ +	if (start) +		{ +		start=0; +		srandom((unsigned int)time(NULL)); +		} + +	/* lets recurse if we want to send the data in small chunks */ +	if (len > MAXWRITE) +		{ +		j=0; +		for (i=0; i<len; i+=k) +			{ +			k=des_enc_write(fd,&(buf[i]), +				((len-i) > MAXWRITE)?MAXWRITE:(len-i),sched,iv); +			if (k < 0) +				return(k); +			else +				j+=k; +			} +		return(j); +		} + +	/* write length first */ +	p=outbuf; +	l2n(len,p); + +	/* pad short strings */ +	if (len < 8) +		{ +		p=shortbuf; +		memcpy(shortbuf,buf,(unsigned int)len); +		for (i=len; i<8; i++) +			shortbuf[i]=random(); +		rnum=8; +		} +	else +		{ +		p=buf; +		rnum=((len+7)/8*8); /* round up to nearest eight */ +		} + +	if (des_rw_mode & DES_PCBC_MODE) +		des_pcbc_encrypt((des_cblock *)p, +			(des_cblock *)&(outbuf[HDRSIZE]), +			(long)((len<8)?8:len),sched,iv,DES_ENCRYPT);  +	else +		des_cbc_encrypt((des_cblock *)p, +			(des_cblock *)&(outbuf[HDRSIZE]), +			(long)((len<8)?8:len),sched,iv,DES_ENCRYPT);  + +	/* output */ +	outnum=(int)rnum+HDRSIZE; + +	for (j=0; j<outnum; j+=i) +		{ +		/* eay 26/08/92 I was not doing writing from where we +		 * got upto. */ +		i=write(fd,&(outbuf[j]),(unsigned int)(outnum-j)); +		if (i == -1) +			{ +			if (errno == EINTR) +				i=0; +			else 	/* This is really a bad error - very bad +				 * It will stuff-up both ends. */ +				return(-1); +			} +		} + +	return(len); +	} diff --git a/crypto/libdes/fcrypt.c b/crypto/libdes/fcrypt.c new file mode 100644 index 000000000000..cc390c3dc874 --- /dev/null +++ b/crypto/libdes/fcrypt.c @@ -0,0 +1,468 @@ +/* crypto/des/fcrypt.c */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + *  + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed.  i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#include <stdio.h> + +/* Eric Young. + * This version of crypt has been developed from my MIT compatable + * DES library. + * The library is available at pub/Crypto/DES at ftp.psy.uq.oz.au + * eay@mincom.oz.au or eay@psych.psy.uq.oz.au + */ + +/* Modification by Jens Kupferschmidt (Cu) + * I have included directive PARA for shared memory computers. + * I have included a directive LONGCRYPT to using this routine to cipher + * passwords with more then 8 bytes like HP-UX 10.x it used. The MAXPLEN + * definition is the maximum of lenght of password and can changed. I have + * defined 24. + */ + +#define FCRYPT_MOD(R,u,t,E0,E1,tmp) \ +	u=R>>16; \ +	t=R^u; \ +	u=t&E0; t=t&E1; \ +	tmp=(u<<16); u^=R^s[S  ]; u^=tmp; \ +	tmp=(t<<16); t^=R^s[S+1]; t^=tmp + +#define DES_FCRYPT +#include "des_locl.h" +#undef DES_FCRYPT + +#undef PERM_OP +#define PERM_OP(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),\ +	(b)^=(t),\ +	(a)^=((t)<<(n))) + +#undef HPERM_OP +#define HPERM_OP(a,t,n,m) ((t)=((((a)<<(16-(n)))^(a))&(m)),\ +	(a)=(a)^(t)^(t>>(16-(n))))\ + +#ifdef PARA +#define STATIC +#else +#define STATIC	static +#endif + +/* It is really only FreeBSD that still suffers from MD5 based crypts */ +#ifdef __FreeBSD__ +#define MD5_CRYPT_SUPPORT 1 +#endif +#if     MD5_CRYPT_SUPPORT +/* + * ---------------------------------------------------------------------------- + * "THE BEER-WARE LICENSE" (Revision 42): + * <phk@login.dknet.dk> wrote this file.  As long as you retain this notice you + * can do whatever you want with this stuff. If we meet some day, and you think + * this stuff is worth it, you can buy me a beer in return.   Poul-Henning Kamp + * ---------------------------------------------------------------------------- + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include <md5.h> + +static unsigned char itoa64[] =		/* 0 ... 63 => ascii - 64 */ +	"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + +static void +to64(s, v, n) +	char *s; +	unsigned long v; +	int n; +{ +	while (--n >= 0) { +		*s++ = itoa64[v&0x3f]; +		v >>= 6; +	} +} + +/* + * UNIX password + * + * Use MD5 for what it is best at... + */ + +static +char * +crypt_md5(pw, salt) +	register const char *pw; +	register const char *salt; +{ +	static char	*magic = "$1$";	/* +						 * This string is magic for +						 * this algorithm.  Having +						 * it this way, we can get +						 * get better later on +						 */ +	static char     passwd[120], *p; +	static const char *sp,*ep; +	unsigned char	final[16]; +	int sl,pl,i,j; +	MD5_CTX	ctx,ctx1; +	unsigned long l; + +	/* Refine the Salt first */ +	sp = salt; + +	/* If it starts with the magic string, then skip that */ +	if(!strncmp(sp,magic,strlen(magic))) +		sp += strlen(magic); + +	/* It stops at the first '$', max 8 chars */ +	for(ep=sp;*ep && *ep != '$' && ep < (sp+8);ep++) +		continue; + +	/* get the length of the true salt */ +	sl = ep - sp; + +	MD5Init(&ctx); + +	/* The password first, since that is what is most unknown */ +	MD5Update(&ctx,pw,strlen(pw)); + +	/* Then our magic string */ +	MD5Update(&ctx,magic,strlen(magic)); + +	/* Then the raw salt */ +	MD5Update(&ctx,sp,sl); + +	/* Then just as many characters of the MD5(pw,salt,pw) */ +	MD5Init(&ctx1); +	MD5Update(&ctx1,pw,strlen(pw)); +	MD5Update(&ctx1,sp,sl); +	MD5Update(&ctx1,pw,strlen(pw)); +	MD5Final(final,&ctx1); +	for(pl = strlen(pw); pl > 0; pl -= 16) +		MD5Update(&ctx,final,pl>16 ? 16 : pl); + +	/* Don't leave anything around in vm they could use. */ +	memset(final,0,sizeof final); + +	/* Then something really weird... */ +	for (j=0,i = strlen(pw); i ; i >>= 1) +		if(i&1) +		    MD5Update(&ctx, final+j, 1); +		else +		    MD5Update(&ctx, pw+j, 1); + +	/* Now make the output string */ +	snprintf (passwd, sizeof(passwd), +		  "%s%.*s$", magic, sl, sp); + +	MD5Final(final,&ctx); + +	/* +	 * and now, just to make sure things don't run too fast +	 * On a 60 Mhz Pentium this takes 34 msec, so you would +	 * need 30 seconds to build a 1000 entry dictionary... +	 */ +	for(i=0;i<1000;i++) { +		MD5Init(&ctx1); +		if(i & 1) +			MD5Update(&ctx1,pw,strlen(pw)); +		else +			MD5Update(&ctx1,final,16); + +		if(i % 3) +			MD5Update(&ctx1,sp,sl); + +		if(i % 7) +			MD5Update(&ctx1,pw,strlen(pw)); + +		if(i & 1) +			MD5Update(&ctx1,final,16); +		else +			MD5Update(&ctx1,pw,strlen(pw)); +		MD5Final(final,&ctx1); +	} + +	p = passwd + strlen(passwd); + +	l = (final[ 0]<<16) | (final[ 6]<<8) | final[12]; to64(p,l,4); p += 4; +	l = (final[ 1]<<16) | (final[ 7]<<8) | final[13]; to64(p,l,4); p += 4; +	l = (final[ 2]<<16) | (final[ 8]<<8) | final[14]; to64(p,l,4); p += 4; +	l = (final[ 3]<<16) | (final[ 9]<<8) | final[15]; to64(p,l,4); p += 4; +	l = (final[ 4]<<16) | (final[10]<<8) | final[ 5]; to64(p,l,4); p += 4; +	l =                    final[11]                ; to64(p,l,2); p += 2; +	*p = '\0'; + +	/* Don't leave anything around in vm they could use. */ +	memset(final,0,sizeof final); + +	return passwd; +} +#endif /* MD5_CRYPT_SUPPORT */ + +#ifndef NOPROTO + +STATIC int fcrypt_body(DES_LONG *out0, DES_LONG *out1, +	des_key_schedule ks, DES_LONG Eswap0, DES_LONG Eswap1); + +#else + +STATIC int fcrypt_body(); + +#endif + +/* Added more values to handle illegal salt values the way normal + * crypt() implementations do.  The patch was sent by  + * Bjorn Gronvall <bg@sics.se> + */ +static unsigned const char con_salt[128]={ +0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9, +0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1, +0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9, +0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1, +0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9, +0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x00,0x01, +0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, +0x0A,0x0B,0x05,0x06,0x07,0x08,0x09,0x0A, +0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12, +0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A, +0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22, +0x23,0x24,0x25,0x20,0x21,0x22,0x23,0x24, +0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C, +0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34, +0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C, +0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44, +}; + +static unsigned const char cov_2char[64]={ +0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35, +0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44, +0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C, +0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54, +0x55,0x56,0x57,0x58,0x59,0x5A,0x61,0x62, +0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A, +0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72, +0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A +}; + +#ifndef NOPROTO +#ifdef PERL5 +char *des_crypt(const char *buf,const char *salt); +#else +char *crypt(const char *buf,const char *salt); +#endif +#else +#ifdef PERL5 +char *des_crypt(); +#else +char *crypt(); +#endif +#endif + +#ifdef PERL5 +char *des_crypt(buf,salt) +#else +char *crypt(buf,salt) +#endif +const char *buf; +const char *salt; +	{ +	static char buff[14]; + +#if     MD5_CRYPT_SUPPORT +	if (!strncmp(salt, "$1$", 3)) +		return crypt_md5(buf, salt); +#endif + +	return(des_fcrypt(buf,salt,buff)); +	} + + +char *des_fcrypt(buf,salt,ret) +const char *buf; +const char *salt; +char *ret; +	{ +	unsigned int i,j,x,y; +	DES_LONG Eswap0,Eswap1; +	DES_LONG out[2],ll; +	des_cblock key; +	des_key_schedule ks; +	unsigned char bb[9]; +	unsigned char *b=bb; +	unsigned char c,u; + +	/* eay 25/08/92 +	 * If you call crypt("pwd","*") as often happens when you +	 * have * as the pwd field in /etc/passwd, the function +	 * returns *\0XXXXXXXXX +	 * The \0 makes the string look like * so the pwd "*" would +	 * crypt to "*".  This was found when replacing the crypt in +	 * our shared libraries.  People found that the disbled +	 * accounts effectivly had no passwd :-(. */ +	x=ret[0]=((salt[0] == '\0')?'A':salt[0]); +	Eswap0=con_salt[x]<<2; +	x=ret[1]=((salt[1] == '\0')?'A':salt[1]); +	Eswap1=con_salt[x]<<6; + +/* EAY +r=strlen(buf); +r=(r+7)/8; +*/ +	for (i=0; i<8; i++) +		{ +		c= *(buf++); +		if (!c) break; +		key[i]=(c<<1); +		} +	for (; i<8; i++) +		key[i]=0; + +	des_set_key((des_cblock *)(key),ks); +	fcrypt_body(&(out[0]),&(out[1]),ks,Eswap0,Eswap1); + +	ll=out[0]; l2c(ll,b); +	ll=out[1]; l2c(ll,b); +	y=0; +	u=0x80; +	bb[8]=0; +	for (i=2; i<13; i++) +		{ +		c=0; +		for (j=0; j<6; j++) +			{ +			c<<=1; +			if (bb[y] & u) c|=1; +			u>>=1; +			if (!u) +				{ +				y++; +				u=0x80; +				} +			} +		ret[i]=cov_2char[c]; +		} +	ret[13]='\0'; +	return(ret); +	} + +STATIC int fcrypt_body(out0, out1, ks, Eswap0, Eswap1) +DES_LONG *out0; +DES_LONG *out1; +des_key_schedule ks; +DES_LONG Eswap0; +DES_LONG Eswap1; +	{ +	register DES_LONG l,r,t,u; +#ifdef DES_PTR +	register unsigned char *des_SP=(unsigned char *)des_SPtrans; +#endif +	register DES_LONG *s; +	register int j; +	register DES_LONG E0,E1; + +	l=0; +	r=0; + +	s=(DES_LONG *)ks; +	E0=Eswap0; +	E1=Eswap1; + +	for (j=0; j<25; j++) +		{ +#ifdef DES_UNROLL +		register int i; + +		for (i=0; i<32; i+=8) +			{ +			D_ENCRYPT(l,r,i+0); /*  1 */ +			D_ENCRYPT(r,l,i+2); /*  2 */ +			D_ENCRYPT(l,r,i+4); /*  3 */ +			D_ENCRYPT(r,l,i+6); /*  4 */ +			} +#else +		D_ENCRYPT(l,r, 0); /*  1 */ +		D_ENCRYPT(r,l, 2); /*  2 */ +		D_ENCRYPT(l,r, 4); /*  3 */ +		D_ENCRYPT(r,l, 6); /*  4 */ +		D_ENCRYPT(l,r, 8); /*  5 */ +		D_ENCRYPT(r,l,10); /*  6 */ +		D_ENCRYPT(l,r,12); /*  7 */ +		D_ENCRYPT(r,l,14); /*  8 */ +		D_ENCRYPT(l,r,16); /*  9 */ +		D_ENCRYPT(r,l,18); /*  10 */ +		D_ENCRYPT(l,r,20); /*  11 */ +		D_ENCRYPT(r,l,22); /*  12 */ +		D_ENCRYPT(l,r,24); /*  13 */ +		D_ENCRYPT(r,l,26); /*  14 */ +		D_ENCRYPT(l,r,28); /*  15 */ +		D_ENCRYPT(r,l,30); /*  16 */ +#endif +		t=l; +		l=r; +		r=t; +		} +	l=ROTATE(l,3)&0xffffffffL; +	r=ROTATE(r,3)&0xffffffffL; + +	PERM_OP(l,r,t, 1,0x55555555L); +	PERM_OP(r,l,t, 8,0x00ff00ffL); +	PERM_OP(l,r,t, 2,0x33333333L); +	PERM_OP(r,l,t,16,0x0000ffffL); +	PERM_OP(l,r,t, 4,0x0f0f0f0fL); + +	*out0=r; +	*out1=l; +	return(0); +	} + diff --git a/crypto/libdes/hash.h b/crypto/libdes/hash.h new file mode 100644 index 000000000000..6761d7f43391 --- /dev/null +++ b/crypto/libdes/hash.h @@ -0,0 +1,67 @@ +/* + * Copyright (c) 1999 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden).  + * 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. Neither the name of KTH nor the names of its contributors may be + *    used to endorse or promote products derived from this software without + *    specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``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 KTH 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. */ + +/* $Id: hash.h,v 1.1 1999/03/22 19:16:25 joda Exp $ */ + +/* stuff in common between md4, md5, and sha1 */ + +#ifndef __hash_h__ +#define __hash_h__ + +#include <stdlib.h> +#include <string.h> + +#ifndef min +#define min(a,b) (((a)>(b))?(b):(a)) +#endif + +/* Vector Crays doesn't have a good 32-bit type, or more precisely, +   int32_t as defined by <bind/bitypes.h> isn't 32 bits, and we don't +   want to depend in being able to redefine this type.  To cope with +   this we have to clamp the result in some places to [0,2^32); no +   need to do this on other machines.  Did I say this was a mess? +   */ + +#ifdef _CRAY +#define CRAYFIX(X) ((X) & 0xffffffff) +#else +#define CRAYFIX(X) (X) +#endif + +static inline u_int32_t +cshift (u_int32_t x, unsigned int n) +{ +    x = CRAYFIX(x); +    return CRAYFIX((x << n) | (x >> (32 - n))); +} + +#endif /* __hash_h__ */ diff --git a/crypto/libdes/key_par.c b/crypto/libdes/key_par.c new file mode 100644 index 000000000000..e2e43c19e269 --- /dev/null +++ b/crypto/libdes/key_par.c @@ -0,0 +1,53 @@ +/* + * Copyright (c) 1995, 1996, 1997 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * 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 acknowledgement: + *      This product includes software developed by the Kungliga Tekniska + *      Högskolan and its contributors. + *  + * 4. Neither the name of the Institute nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + *  + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``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 INSTITUTE 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. + */ + +#include "des_locl.h" + +/* MIT Link and source compatibility */ + +#ifdef des_fixup_key_parity +#undef des_fixup_key_parity +#endif /* des_fixup_key_parity */ + +void des_fixup_key_parity(des_cblock *key); + +void +des_fixup_key_parity(des_cblock *key) +{ +  des_set_odd_parity(key); +} diff --git a/crypto/libdes/makefile.bc b/crypto/libdes/makefile.bc new file mode 100644 index 000000000000..1fe6d4915a91 --- /dev/null +++ b/crypto/libdes/makefile.bc @@ -0,0 +1,50 @@ +# +# Origional BC Makefile from Teun <Teun.Nijssen@kub.nl> +# +# +CC      = bcc +TLIB    = tlib /0 /C +# note: the -3 flag produces code for 386, 486, Pentium etc; omit it for 286s +OPTIMIZE= -3 -O2 +#WINDOWS= -W +CFLAGS  = -c -ml -d $(OPTIMIZE) $(WINDOWS) -DMSDOS +LFLAGS  = -ml $(WINDOWS) + +.c.obj: +	$(CC) $(CFLAGS) $*.c + +.obj.exe: +	$(CC) $(LFLAGS) -e$*.exe $*.obj libdes.lib   + +all: $(LIB) destest.exe rpw.exe des.exe speed.exe + +# "make clean": use a directory containing only libdes .exe and .obj files... +clean: +	del *.exe +	del *.obj +	del libdes.lib +	del libdes.rsp + +OBJS=   cbc_cksm.obj cbc_enc.obj  ecb_enc.obj  pcbc_enc.obj \ +	qud_cksm.obj rand_key.obj set_key.obj  str2key.obj \ +	enc_read.obj enc_writ.obj fcrypt.obj   cfb_enc.obj \ +	ecb3_enc.obj ofb_enc.obj  cbc3_enc.obj read_pwd.obj\ +	cfb64enc.obj ofb64enc.obj ede_enc.obj  cfb64ede.obj\ +	ofb64ede.obj supp.obj + +LIB=    libdes.lib + +$(LIB): $(OBJS) +	del $(LIB) +	makersp "+%s &\n" &&| +	$(OBJS) +|       >libdes.rsp +	$(TLIB) libdes.lib @libdes.rsp,nul +	del libdes.rsp + +destest.exe: destest.obj libdes.lib +rpw.exe:     rpw.obj libdes.lib +speed.exe:   speed.obj libdes.lib +des.exe:     des.obj libdes.lib + + diff --git a/crypto/libdes/mdtest.c b/crypto/libdes/mdtest.c new file mode 100644 index 000000000000..d3e54867b6dd --- /dev/null +++ b/crypto/libdes/mdtest.c @@ -0,0 +1,193 @@ +/* + * Copyright (c) 1995, 1996, 1997 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * 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 acknowledgement: + *      This product includes software developed by the Kungliga Tekniska + *      Högskolan and its contributors. + *  + * 4. Neither the name of the Institute nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + *  + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``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 INSTITUTE 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. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +RCSID("$Id: mdtest.c,v 1.11 1997/11/09 06:14:43 assar Exp $"); +#endif + +#include <stdio.h> +#include <string.h> +#include <md4.h> +#include <md5.h> +#include <sha.h> + +static +int +md4_tests (void) +{ +  struct test { +    char *str; +    unsigned char hash[16]; +  } tests[] = { +    {"",  +     {0x31, 0xd6, 0xcf, 0xe0, 0xd1, 0x6a, 0xe9, 0x31, 0xb7, 0x3c, 0x59,  +      0xd7, 0xe0, 0xc0, 0x89, 0xc0}}, +    {"a", +     {0xbd, 0xe5, 0x2c, 0xb3, 0x1d, 0xe3, 0x3e, 0x46, 0x24, 0x5e, 0x05, +      0xfb, 0xdb, 0xd6, 0xfb, 0x24}}, +    {"abc", +     {0xa4, 0x48, 0x01, 0x7a, 0xaf, 0x21, 0xd8, 0x52, 0x5f, 0xc1, 0x0a, 0xe8, 0x7a, 0xa6, 0x72, 0x9d}}, +    {"message digest", +     {0xd9, 0x13, 0x0a, 0x81, 0x64, 0x54, 0x9f, 0xe8, 0x18, 0x87, 0x48, 0x06, 0xe1, 0xc7, 0x01, 0x4b}}, +    {"abcdefghijklmnopqrstuvwxyz", {0xd7, 0x9e, 0x1c, 0x30, 0x8a, 0xa5, 0xbb, 0xcd, 0xee, 0xa8, 0xed, 0x63, 0xdf, 0x41, 0x2d, 0xa9, }}, +    {"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", +     {0x04, 0x3f, 0x85, 0x82, 0xf2, 0x41, 0xdb, 0x35, 0x1c, 0xe6, 0x27, 0xe1, 0x53, 0xe7, 0xf0, 0xe4}}, +    {"12345678901234567890123456789012345678901234567890123456789012345678901234567890", +     {0xe3, 0x3b, 0x4d, 0xdc, 0x9c, 0x38, 0xf2, 0x19, 0x9c, 0x3e, 0x7b, 0x16, 0x4f, 0xcc, 0x05, 0x36, }}, +    {NULL, { 0x0 }}}; +  struct test *t; + +  printf ("md4... "); +  for (t = tests; t->str; ++t) { +    struct md4 md4; +    char res[16]; +    int i; + +    md4_init (&md4); +    md4_update (&md4, (unsigned char *)t->str, strlen(t->str)); +    md4_finito (&md4, res); +    if (memcmp (res, t->hash, 16) != 0) { +      printf ("MD4(\"%s\") failed\n", t->str); +      printf("should be: "); +      for(i = 0; i < 16; ++i) +	  printf("%02x ", t->hash[i]); +      printf("\nresult was: "); +      for(i = 0; i < 16; ++i) +	  printf("%02x ", res[i]); +      printf("\n"); +      return 1; +    } +  } +  printf ("success\n"); +  return 0; +} + +static +int +md5_tests (void) +{ +  struct test { +    char *str; +    unsigned char hash[16]; +  } tests[] = { +    {"", {0xd4, 0x1d, 0x8c, 0xd9, 0x8f, 0x00, 0xb2, 0x04, 0xe9, 0x80, 0x09, 0x98, 0xec, 0xf8, 0x42, 0x7e}},  +    {"a", {0x0c, 0xc1, 0x75, 0xb9, 0xc0, 0xf1, 0xb6, 0xa8, 0x31, 0xc3, 0x99, 0xe2, 0x69, 0x77, 0x26, 0x61}},  +    {"abc", {0x90, 0x01, 0x50, 0x98, 0x3c, 0xd2, 0x4f, 0xb0, 0xd6, 0x96, 0x3f, 0x7d, 0x28, 0xe1, 0x7f, 0x72}},  +    {"message digest", {0xf9, 0x6b, 0x69, 0x7d, 0x7c, 0xb7, 0x93, 0x8d, 0x52, 0x5a, 0x2f, 0x31, 0xaa, 0xf1, 0x61, 0xd0}},  +    {"abcdefghijklmnopqrstuvwxyz", {0xc3, 0xfc, 0xd3, 0xd7, 0x61, 0x92, 0xe4, 0x00, 0x7d, 0xfb, 0x49, 0x6c, 0xca, 0x67, 0xe1, 0x3b}},  +    {"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", {0xd1, 0x74, 0xab, 0x98, 0xd2, 0x77, 0xd9, 0xf5, 0xa5, 0x61, 0x1c, 0x2c, 0x9f, 0x41, 0x9d, 0x9f}},  +    {"12345678901234567890123456789012345678901234567890123456789012345678901234567890", {0x57, 0xed, 0xf4, 0xa2, 0x2b, 0xe3, 0xc9, 0x55, 0xac, 0x49, 0xda, 0x2e, 0x21, 0x07, 0xb6, 0x7a}},  +    {NULL, { 0x0 }}}; +  struct test *t; + +  printf ("md5... "); +  for (t = tests; t->str; ++t) { +    struct md5 md5; +    char res[16]; + +    md5_init (&md5); +    md5_update (&md5, (unsigned char *)t->str, strlen(t->str)); +    md5_finito (&md5, res); +    if (memcmp (res, t->hash, 16) != 0) { +      int i; + +      printf ("MD5(\"%s\") failed\n", t->str); +      printf("should be: "); +      for(i = 0; i < 16; ++i) +	  printf("%02x ", t->hash[i]); +      printf("\nresult was: "); +      for(i = 0; i < 16; ++i) +	  printf("%02x ", res[i]); +      printf("\n"); +      return 1; +    } +  } +  printf ("success\n"); +  return 0; +} + +static +int +sha_tests (void) +{ +  struct test { +    char *str; +    unsigned char hash[20]; +  } tests[] = { +    {"abc", {0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, +	     0xBA, 0x3E, 0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C, +	     0x9C, 0xD0, 0xD8, 0x9D}}, +    {"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", +     {0x84, 0x98, 0x3E, 0x44, 0x1C, 0x3B, 0xD2, 0x6E, +      0xBA, 0xAE, 0x4A, 0xA1, 0xF9, 0x51, 0x29, 0xE5, +      0xE5, 0x46, 0x70, 0xF1}}, +    {NULL, { 0x0 }}}; +  struct test *t; + +  printf ("sha... "); +  for (t = tests; t->str; ++t) { +    struct sha sha; +    char res[20]; + +    sha_init (&sha); +    sha_update (&sha, (unsigned char *)t->str, strlen(t->str)); +    sha_finito (&sha, res); +    if (memcmp (res, t->hash, 20) != 0) { +      int i; + +      printf ("SHA(\"%s\") failed\n", t->str); +      printf("should be: "); +      for(i = 0; i < 20; ++i) +	  printf("%02x ", t->hash[i]); +      printf("\nresult was: "); +      for(i = 0; i < 20; ++i) +	  printf("%02x ", res[i]); +      printf("\n"); +      return 1; +    } +  } +  printf ("success\n"); +  return 0; +} + +int +main (void) +{ +  return md4_tests() + md5_tests() + sha_tests(); +} diff --git a/crypto/libdes/ncbc_enc.c b/crypto/libdes/ncbc_enc.c new file mode 100644 index 000000000000..4a972ac54606 --- /dev/null +++ b/crypto/libdes/ncbc_enc.c @@ -0,0 +1,141 @@ +/* crypto/des/ncbc_enc.c */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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 "des_locl.h" + +void des_ncbc_encrypt(input, output, length, schedule, ivec, encrypt) +des_cblock (*input); +des_cblock (*output); +long length; +des_key_schedule schedule; +des_cblock (*ivec); +int encrypt; +	{ +	register DES_LONG tin0,tin1; +	register DES_LONG tout0,tout1,xor0,xor1; +	register unsigned char *in,*out; +	register long l=length; +	DES_LONG tin[2]; +	unsigned char *iv; + +	in=(unsigned char *)input; +	out=(unsigned char *)output; +	iv=(unsigned char *)ivec; + +	if (encrypt) +		{ +		c2l(iv,tout0); +		c2l(iv,tout1); +		for (l-=8; l>=0; l-=8) +			{ +			c2l(in,tin0); +			c2l(in,tin1); +			tin0^=tout0; tin[0]=tin0; +			tin1^=tout1; tin[1]=tin1; +			des_encrypt((DES_LONG *)tin,schedule,DES_ENCRYPT); +			tout0=tin[0]; l2c(tout0,out); +			tout1=tin[1]; l2c(tout1,out); +			} +		if (l != -8) +			{ +			c2ln(in,tin0,tin1,l+8); +			tin0^=tout0; tin[0]=tin0; +			tin1^=tout1; tin[1]=tin1; +			des_encrypt((DES_LONG *)tin,schedule,DES_ENCRYPT); +			tout0=tin[0]; l2c(tout0,out); +			tout1=tin[1]; l2c(tout1,out); +			} +		iv=(unsigned char *)ivec; +		l2c(tout0,iv); +		l2c(tout1,iv); +		} +	else +		{ +		c2l(iv,xor0); +		c2l(iv,xor1); +		for (l-=8; l>=0; l-=8) +			{ +			c2l(in,tin0); tin[0]=tin0; +			c2l(in,tin1); tin[1]=tin1; +			des_encrypt((DES_LONG *)tin,schedule,DES_DECRYPT); +			tout0=tin[0]^xor0; +			tout1=tin[1]^xor1; +			l2c(tout0,out); +			l2c(tout1,out); +			xor0=tin0; +			xor1=tin1; +			} +		if (l != -8) +			{ +			c2l(in,tin0); tin[0]=tin0; +			c2l(in,tin1); tin[1]=tin1; +			des_encrypt((DES_LONG *)tin,schedule,DES_DECRYPT); +			tout0=tin[0]^xor0; +			tout1=tin[1]^xor1; +			l2cn(tout0,tout1,out,l+8); +			xor0=tin0; +			xor1=tin1; +			} +		iv=(unsigned char *)ivec; +		l2c(xor0,iv); +		l2c(xor1,iv); +		} +	tin0=tin1=tout0=tout1=xor0=xor1=0; +	tin[0]=tin[1]=0; +	} + diff --git a/crypto/libdes/ofb64ede.c b/crypto/libdes/ofb64ede.c new file mode 100644 index 000000000000..b33deef10e7c --- /dev/null +++ b/crypto/libdes/ofb64ede.c @@ -0,0 +1,131 @@ +/* crypto/des/ofb64ede.c */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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 "des_locl.h" + +/* The input and output encrypted as though 64bit ofb mode is being + * used.  The extra state information to record how much of the + * 64bit block we have used is contained in *num; + */ +void des_ede3_ofb64_encrypt(in, out, length, k1,k2,k3, ivec, num) +register unsigned char *in; +register unsigned char *out; +long length; +des_key_schedule k1,k2,k3; +des_cblock (*ivec); +int *num; +	{ +	register DES_LONG v0,v1; +	register int n= *num; +	register long l=length; +	des_cblock d; +	register char *dp; +	DES_LONG ti[2]; +	unsigned char *iv; +	int save=0; + +	iv=(unsigned char *)ivec; +	c2l(iv,v0); +	c2l(iv,v1); +	ti[0]=v0; +	ti[1]=v1; +	dp=(char *)d; +	l2c(v0,dp); +	l2c(v1,dp); +	while (l--) +		{ +		if (n == 0) +			{ +			ti[0]=v0; +			ti[1]=v1; +			des_encrypt3((DES_LONG *)ti,k1,k2,k3); +			v0=ti[0]; +			v1=ti[1]; + +			dp=(char *)d; +			l2c(v0,dp); +			l2c(v1,dp); +			save++; +			} +		*(out++)= *(in++)^d[n]; +		n=(n+1)&0x07; +		} +	if (save) +		{ +/*		v0=ti[0]; +		v1=ti[1];*/ +		iv=(unsigned char *)ivec; +		l2c(v0,iv); +		l2c(v1,iv); +		} +	v0=v1=ti[0]=ti[1]=0; +	*num=n; +	} + +#ifdef undef /* MACRO */ +void des_ede2_ofb64_encrypt(in, out, length, k1,k2, ivec, num) +register unsigned char *in; +register unsigned char *out; +long length; +des_key_schedule k1,k2; +des_cblock (*ivec); +int *num; +	{ +	des_ede3_ofb64_encrypt(in, out, length, k1,k2,k1, ivec, num); +	} +#endif diff --git a/crypto/libdes/ofb64enc.c b/crypto/libdes/ofb64enc.c new file mode 100644 index 000000000000..041f5b52b804 --- /dev/null +++ b/crypto/libdes/ofb64enc.c @@ -0,0 +1,114 @@ +/* crypto/des/ofb64enc.c */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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 "des_locl.h" + +/* The input and output encrypted as though 64bit ofb mode is being + * used.  The extra state information to record how much of the + * 64bit block we have used is contained in *num; + */ +void des_ofb64_encrypt(in, out, length, schedule, ivec, num) +register unsigned char *in; +register unsigned char *out; +long length; +des_key_schedule schedule; +des_cblock (*ivec); +int *num; +	{ +	register DES_LONG v0,v1,t; +	register int n= *num; +	register long l=length; +	des_cblock d; +	register char *dp; +	DES_LONG ti[2]; +	unsigned char *iv; +	int save=0; + +	iv=(unsigned char *)ivec; +	c2l(iv,v0); +	c2l(iv,v1); +	ti[0]=v0; +	ti[1]=v1; +	dp=(char *)d; +	l2c(v0,dp); +	l2c(v1,dp); +	while (l--) +		{ +		if (n == 0) +			{ +			des_encrypt((DES_LONG *)ti,schedule,DES_ENCRYPT); +			dp=(char *)d; +			t=ti[0]; l2c(t,dp); +			t=ti[1]; l2c(t,dp); +			save++; +			} +		*(out++)= *(in++)^d[n]; +		n=(n+1)&0x07; +		} +	if (save) +		{ +		v0=ti[0]; +		v1=ti[1]; +		iv=(unsigned char *)ivec; +		l2c(v0,iv); +		l2c(v1,iv); +		} +	t=v0=v1=ti[0]=ti[1]=0; +	*num=n; +	} + diff --git a/crypto/libdes/ofb_enc.c b/crypto/libdes/ofb_enc.c new file mode 100644 index 000000000000..d0506100d82f --- /dev/null +++ b/crypto/libdes/ofb_enc.c @@ -0,0 +1,122 @@ +/* crypto/des/ofb_enc.c */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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 "des_locl.h" + +/* The input and output are loaded in multiples of 8 bits. + * What this means is that if you hame numbits=12 and length=2 + * the first 12 bits will be retrieved from the first byte and half + * the second.  The second 12 bits will come from the 3rd and half the 4th + * byte. + */ +void des_ofb_encrypt(in, out, numbits, length, schedule, ivec) +unsigned char *in; +unsigned char *out; +int numbits; +long length; +des_key_schedule schedule; +des_cblock (*ivec); +	{ +	register DES_LONG d0,d1,v0,v1,n=(numbits+7)/8; +	register DES_LONG mask0,mask1; +	register long l=length; +	register int num=numbits; +	DES_LONG ti[2]; +	unsigned char *iv; + +	if (num > 64) return; +	if (num > 32) +		{ +		mask0=0xffffffffL; +		if (num >= 64) +			mask1=mask0; +		else +			mask1=(1L<<(num-32))-1; +		} +	else +		{ +		if (num == 32) +			mask0=0xffffffffL; +		else +			mask0=(1L<<num)-1; +		mask1=0x00000000; +		} + +	iv=(unsigned char *)ivec; +	c2l(iv,v0); +	c2l(iv,v1); +	ti[0]=v0; +	ti[1]=v1; +	while (l-- > 0) +		{ +		des_encrypt((DES_LONG *)ti,schedule,DES_ENCRYPT); +		c2ln(in,d0,d1,n); +		in+=n; +		d0=(d0^ti[0])&mask0; +		d1=(d1^ti[1])&mask1; +		l2cn(d0,d1,out,n); +		out+=n; +		} +	v0=ti[0]; +	v1=ti[1]; +	iv=(unsigned char *)ivec; +	l2c(v0,iv); +	l2c(v1,iv); +	v0=v1=d0=d1=ti[0]=ti[1]=0; +	} + diff --git a/crypto/libdes/passwd_dialog.aps b/crypto/libdes/passwd_dialog.aps Binary files differnew file mode 100644 index 000000000000..c90d03091846 --- /dev/null +++ b/crypto/libdes/passwd_dialog.aps diff --git a/crypto/libdes/passwd_dialog.clw b/crypto/libdes/passwd_dialog.clw new file mode 100644 index 000000000000..f3451af3fd93 --- /dev/null +++ b/crypto/libdes/passwd_dialog.clw @@ -0,0 +1,34 @@ +; CLW file contains information for the MFC ClassWizard + +[General Info] +Version=1 +LastClass= +LastTemplate=CDialog +NewFileInclude1=#include "stdafx.h" +NewFileInclude2=#include "passwd_dialog.h" +LastPage=0 + +ClassCount=0 + +ResourceCount=2 +Resource1=IDD_DIALOG1 +Resource2=IDD_PASSWD_DIALOG + +[DLG:IDD_DIALOG1] +Type=1 +ControlCount=6 +Control1=IDOK,button,1342242817 +Control2=IDCANCEL,button,1342242816 +Control3=IDC_STATIC,static,1342308352 +Control4=IDC_STATIC,static,1342308352 +Control5=IDC_EDIT1,edit,1350631552 +Control6=IDC_EDIT2,edit,1350631584 + +[DLG:IDD_PASSWD_DIALOG] +Type=1 +ControlCount=4 +Control1=IDC_PASSWD_EDIT,edit,1350631456 +Control2=IDOK,button,1342242817 +Control3=IDCANCEL,button,1342242816 +Control4=IDC_STATIC,static,1342177280 + diff --git a/crypto/libdes/passwd_dialog.rc b/crypto/libdes/passwd_dialog.rc new file mode 100644 index 000000000000..62079f2aee98 --- /dev/null +++ b/crypto/libdes/passwd_dialog.rc @@ -0,0 +1,143 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Swedish resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_SVE) +#ifdef _WIN32 +LANGUAGE LANG_SWEDISH, SUBLANG_DEFAULT +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_PASSWD_DIALOG DIALOG DISCARDABLE  0, 0, 186, 66 +STYLE DS_ABSALIGN | DS_MODALFRAME | DS_SETFOREGROUND | DS_CENTER | WS_POPUP |  +    WS_VISIBLE | WS_CAPTION +CAPTION "Password query" +FONT 8, "MS Sans Serif" +BEGIN +    EDITTEXT        IDC_PASSWD_EDIT,30,22,125,14,ES_PASSWORD +    DEFPUSHBUTTON   "OK",IDOK,30,45,50,14 +    PUSHBUTTON      "Cancel",IDCANCEL,105,45,50,14 +    LTEXT           "Please insert password:",IDC_STATIC,30,13,87,8,NOT  +                    WS_GROUP +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO DISCARDABLE  +BEGIN +    IDD_PASSWD_DIALOG, DIALOG +    BEGIN +        LEFTMARGIN, 7 +        RIGHTMARGIN, 179 +        TOPMARGIN, 7 +        BOTTOMMARGIN, 59 +    END +END +#endif    // APSTUDIO_INVOKED + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE  +BEGIN +    "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE  +BEGIN +    "#include ""afxres.h""\r\n" +    "\0" +END + +3 TEXTINCLUDE DISCARDABLE  +BEGIN +    "\r\n" +    "\0" +END + +#endif    // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,1 + PRODUCTVERSION 1,0,0,1 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN +    BLOCK "StringFileInfo" +    BEGIN +        BLOCK "040904b0" +        BEGIN +            VALUE "CompanyName", "Royal Institute of Technology (KTH)\0" +            VALUE "FileDescription", "des\0" +            VALUE "FileVersion", "4, 0, 9, 9\0" +            VALUE "InternalName", "des\0" +            VALUE "LegalCopyright", "Copyright © 1996 - 1998  Royal Institute of Technology (KTH)\0" +            VALUE "OriginalFilename", "des.dll\0" +            VALUE "ProductName", "KTH Kerberos\0" +            VALUE "ProductVersion", "4,0,9,9\0" +        END +    END +    BLOCK "VarFileInfo" +    BEGIN +        VALUE "Translation", 0x409, 1200 +    END +END + +#endif    // !_MAC + +#endif    // Swedish resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif    // not APSTUDIO_INVOKED + diff --git a/crypto/libdes/passwd_dialog.res b/crypto/libdes/passwd_dialog.res Binary files differnew file mode 100644 index 000000000000..bdb2868700d2 --- /dev/null +++ b/crypto/libdes/passwd_dialog.res diff --git a/crypto/libdes/passwd_dlg.c b/crypto/libdes/passwd_dlg.c new file mode 100644 index 000000000000..4f7946e9f85b --- /dev/null +++ b/crypto/libdes/passwd_dlg.c @@ -0,0 +1,97 @@ +/* + * Copyright (c) 1995, 1996, 1997, 1998 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * 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 acknowledgement: + *      This product includes software developed by the Kungliga Tekniska + *      Högskolan and its contributors. + *  + * 4. Neither the name of the Institute nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + *  + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``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 INSTITUTE 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. + */ + +/* passwd_dlg.c - Dialog boxes for Windows95/NT + * Author:	Jörgen Karlsson - d93-jka@nada.kth.se + * Date:	June 1996 + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +RCSID("$Id: passwd_dlg.c,v 1.6 1998/06/09 19:25:09 joda Exp $"); +#endif + +#ifdef WIN32	/* Visual C++ 4.0 (Windows95/NT) */ +#include <Windows.h> +#include "passwd_dlg.h" +#include "Resource.h" +#define passwdBufSZ 64 + +char passwd[passwdBufSZ]; + +BOOL CALLBACK +pwd_dialog_proc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ +    switch(uMsg) +    { +    case WM_COMMAND:  +	switch(wParam) +	{ +	case IDOK: +	    if(!GetDlgItemText(hwndDlg,IDC_PASSWD_EDIT, passwd, passwdBufSZ)) +		EndDialog(hwndDlg, IDCANCEL); +	case IDCANCEL: +	    EndDialog(hwndDlg, wParam); +	    return TRUE; +	} +    } +    return FALSE; +} + + +/* return 0 if ok, 1 otherwise */ +int +pwd_dialog(char *buf, int size) +{ +    int i; +    HWND wnd = GetActiveWindow(); +    HANDLE hInst = GetModuleHandle("des"); +    switch(DialogBox(hInst,MAKEINTRESOURCE(IDD_PASSWD_DIALOG),wnd,pwd_dialog_proc)) +    { +    case IDOK: +	strcpy_truncate(buf, passwd, size); +	memset (passwd, 0, sizeof(passwd)); +	return 0; +    case IDCANCEL: +    default: +	memset (passwd, 0, sizeof(passwd)); +	return 1; +    } +} + +#endif /* WIN32 */ diff --git a/crypto/libdes/passwd_dlg.h b/crypto/libdes/passwd_dlg.h new file mode 100644 index 000000000000..dbead494d374 --- /dev/null +++ b/crypto/libdes/passwd_dlg.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 1995, 1996, 1997 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * 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 acknowledgement: + *      This product includes software developed by the Kungliga Tekniska + *      Högskolan and its contributors. + *  + * 4. Neither the name of the Institute nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + *  + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``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 INSTITUTE 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. + */ + +/* passwd_dlg.h - Dialog boxes for Windows95/NT + * Author:	Jörgen Karlsson - d93-jka@nada.kth.se + * Date:	June 1996 + */ + +/* $Id: passwd_dlg.h,v 1.5 1997/04/20 06:31:50 assar Exp $ */ + +#ifndef PASSWD_DLG_H +#define PASSWD_DLG_H + +int pwd_dialog(char *buf, int size); + + +#endif /* PASSWD_DLG_H */ diff --git a/crypto/libdes/pcbc_enc.c b/crypto/libdes/pcbc_enc.c new file mode 100644 index 000000000000..cb2e785cfb5c --- /dev/null +++ b/crypto/libdes/pcbc_enc.c @@ -0,0 +1,126 @@ +/* crypto/des/pcbc_enc.c */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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 "des_locl.h" + +void 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; +	{ +	register DES_LONG sin0,sin1,xor0,xor1,tout0,tout1; +	DES_LONG tin[2]; +	unsigned char *in,*out,*iv; + +	in=(unsigned char *)input; +	out=(unsigned char *)output; +	iv=(unsigned char *)ivec; + +	if (encrypt) +		{ +		c2l(iv,xor0); +		c2l(iv,xor1); +		for (; length>0; length-=8) +			{ +			if (length >= 8) +				{ +				c2l(in,sin0); +				c2l(in,sin1); +				} +			else +				c2ln(in,sin0,sin1,length); +			tin[0]=sin0^xor0; +			tin[1]=sin1^xor1; +			des_encrypt((DES_LONG *)tin,schedule,DES_ENCRYPT); +			tout0=tin[0]; +			tout1=tin[1]; +			xor0=sin0^tout0; +			xor1=sin1^tout1; +			l2c(tout0,out); +			l2c(tout1,out); +			} +		} +	else +		{ +		c2l(iv,xor0); c2l(iv,xor1); +		for (; length>0; length-=8) +			{ +			c2l(in,sin0); +			c2l(in,sin1); +			tin[0]=sin0; +			tin[1]=sin1; +			des_encrypt((DES_LONG *)tin,schedule,DES_DECRYPT); +			tout0=tin[0]^xor0; +			tout1=tin[1]^xor1; +			if (length >= 8) +				{ +				l2c(tout0,out); +				l2c(tout1,out); +				} +			else +				l2cn(tout0,tout1,out,length); +			xor0=tout0^sin0; +			xor1=tout1^sin1; +			} +		} +	tin[0]=tin[1]=0; +	sin0=sin1=xor0=xor1=tout0=tout1=0; +	} diff --git a/crypto/libdes/podd.h b/crypto/libdes/podd.h new file mode 100644 index 000000000000..c984a3490d94 --- /dev/null +++ b/crypto/libdes/podd.h @@ -0,0 +1,75 @@ +/* crypto/des/podd.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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/crypto/libdes/qud_cksm.c b/crypto/libdes/qud_cksm.c new file mode 100644 index 000000000000..783274854fc2 --- /dev/null +++ b/crypto/libdes/qud_cksm.c @@ -0,0 +1,143 @@ +/* crypto/des/qud_cksm.c */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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.] + */ + +/* From "Message Authentication"  R.R. Jueneman, S.M. Matyas, C.H. Meyer + * IEEE Communications Magazine Sept 1985 Vol. 23 No. 9 p 29-40 + * This module in only based on the code in this paper and is + * almost definitely not the same as the MIT implementation. + */ +#include "des_locl.h" + +/* bug fix for dos - 7/6/91 - Larry hughes@logos.ucs.indiana.edu */ +#define Q_B0(a)	(((DES_LONG)(a))) +#define Q_B1(a)	(((DES_LONG)(a))<<8) +#define Q_B2(a)	(((DES_LONG)(a))<<16) +#define Q_B3(a)	(((DES_LONG)(a))<<24) + +/* used to scramble things a bit */ +/* Got the value MIT uses via brute force :-) 2/10/90 eay */ +#define NOISE	((DES_LONG)83653421L) + +DES_LONG des_quad_cksum(input, output, length, out_count, seed) +     des_cblock (*input); +     des_cblock (*output); +     long length; +     int out_count; +     des_cblock (*seed); +{ +    DES_LONG z0,z1,t0,t1; +    int i; +    long l; +#ifdef _CRAY +    typedef struct { +	unsigned int a:32; +	unsigned int b:32; +    } XXX; +#else +    typedef DES_LONG XXX; +#endif +    unsigned char *cp; +    XXX *lp; + +    if (out_count < 1) out_count=1; +    lp=(XXX*)output; + +    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]); + +    for (i=0; ((i<4)&&(i<out_count)); i++) +	{ +	    cp=(unsigned char *)input; +	    l=length; +	    while (l > 0) +		{ +		    if (l > 1) +			{ +			    t0= (DES_LONG)(*(cp++)); +			    t0|=(DES_LONG)Q_B1(*(cp++)); +			    l--; +			} +		    else +			t0= (DES_LONG)(*(cp++)); +		    l--; +		    /* add */ +		    t0+=z0; +		    t0&=0xffffffffL; +		    t1=z1; +		    /* square, well sort of square */ +		    z0=((((t0*t0)&0xffffffffL)+((t1*t1)&0xffffffffL)) +			&0xffffffffL)%0x7fffffffL;  +		    z1=((t0*((t1+NOISE)&0xffffffffL))&0xffffffffL)%0x7fffffffL; +		} +	    if (lp != NULL)  +		{ +		    /* The MIT library assumes that the checksum is +		     * composed of 2*out_count 32 bit ints */ +#ifdef _CRAY +		    lp->a = z0; +		    lp->b = z1; +		    lp++; +#else +		    *lp++ = (XXX)z0; +		    *lp++ = (XXX)z1; +#endif +		} +	} +    return(z0); +} + diff --git a/crypto/libdes/rand_key.c b/crypto/libdes/rand_key.c new file mode 100644 index 000000000000..fd4c5ef4d6f5 --- /dev/null +++ b/crypto/libdes/rand_key.c @@ -0,0 +1,121 @@ +/* crypto/des/rand_key.c */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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 "des_locl.h" +#include <time.h> + +static int seed=0; +static des_cblock init; + +void des_random_seed(key) +des_cblock key; +	{ +	memcpy(init,key,sizeof(des_cblock)); +	seed=1; +	} + +/* Old source */ +/* +void des_random_key(ret) +unsigned char *ret; +	{ +	des_key_schedule ks; +	static DES_LONG c=0; +	static unsigned short pid=0; +	static des_cblock data={0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef}; +	des_cblock key; +	unsigned char *p; +	DES_LONG t; +	int i; + +#if defined(MSDOS) || defined(WIN32) +	pid=1; +#else +	if (!pid) pid=getpid(); +#endif +	p=key; +	if (seed) +		{ +		for (i=0; i<8; i++) +			{ +			data[i] ^= init[i]; +			init[i]=0; +			} +		seed=0; +		} +	t=(DES_LONG)time(NULL); +	l2c(t,p); +	t=(DES_LONG)((pid)|((c++)<<16)); +	l2c(t,p); + +	des_set_odd_parity((des_cblock *)data); +	des_set_key((des_cblock *)data,ks); +	des_cbc_cksum((des_cblock *)key,(des_cblock *)key, +		(long)sizeof(key),ks,(des_cblock *)data); + +	des_set_odd_parity((des_cblock *)key); +	des_set_key((des_cblock *)key,ks); +	des_cbc_cksum((des_cblock *)key,(des_cblock *)data, +		(long)sizeof(key),ks,(des_cblock *)key); + +	memcpy(ret,data,sizeof(key)); +	memset(key,0,sizeof(key)); +	memset(ks,0,sizeof(ks)); +	t=0; +	} +*/ diff --git a/crypto/libdes/read_pwd.c b/crypto/libdes/read_pwd.c new file mode 100644 index 000000000000..2f4b9ee1954f --- /dev/null +++ b/crypto/libdes/read_pwd.c @@ -0,0 +1,450 @@ +/* crypto/des/read_pwd.c */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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.] + */ + +#ifdef WIN16TTY +#undef WIN16 +#undef _WINDOWS +#include <graph.h> +#endif + +/* 06-Apr-92 Luke Brennan    Support for VMS */ +#include "des_locl.h" +#include <signal.h> +#include <string.h> +#include <setjmp.h> +#include <errno.h> + +/* There are 5 types of terminal interface supported, + * TERMIO, TERMIOS, VMS, MSDOS and SGTTY + */ + +#if defined(__sgi) && !defined(TERMIOS) +#define TERMIOS +#undef TERMIO +#undef SGTTY +#endif + +#if defined(linux) && !defined(TERMIO) +#undef TERMIOS +#define TERMIO +#undef SGTTY +#endif + +#ifdef _LIBC +#define TERMIO +#endif + +#if !defined(TERMIO) && !defined(TERMIOS) && !defined(VMS) && !defined(MSDOS) +#define SGTTY +#endif + +#ifdef TERMIOS +#include <termios.h> +#define TTY_STRUCT		struct termios +#define TTY_FLAGS		c_lflag +#define	TTY_get(tty,data)	tcgetattr(tty,data) +#define TTY_set(tty,data)	tcsetattr(tty,TCSANOW,data) +#endif + +#ifdef TERMIO +#include <termio.h> +#define TTY_STRUCT		struct termio +#define TTY_FLAGS		c_lflag +#define TTY_get(tty,data)	ioctl(tty,TCGETA,data) +#define TTY_set(tty,data)	ioctl(tty,TCSETA,data) +#endif + +#ifdef SGTTY +#include <sgtty.h> +#define TTY_STRUCT		struct sgttyb +#define TTY_FLAGS		sg_flags +#define TTY_get(tty,data)	ioctl(tty,TIOCGETP,data) +#define TTY_set(tty,data)	ioctl(tty,TIOCSETP,data) +#endif + +#if !defined(_LIBC) && !defined(MSDOS) && !defined(VMS) +#include <sys/ioctl.h> +#endif + +#ifdef MSDOS +#include <conio.h> +#define fgets(a,b,c) noecho_fgets(a,b,c) +#endif + +#ifdef VMS +#include <ssdef.h> +#include <iodef.h> +#include <ttdef.h> +#include <descrip.h> +struct IOSB { +	short iosb$w_value; +	short iosb$w_count; +	long  iosb$l_info; +	}; +#endif + +#ifndef NX509_SIG +#define NX509_SIG 32 +#endif + +#ifndef NOPROTO +static void read_till_nl(FILE *); +static int read_pw(char *buf, char *buff, int size, char *prompt, int verify); +static void recsig(int); +static void pushsig(void); +static void popsig(void); +#if defined(MSDOS) && !defined(WIN16) +static int noecho_fgets(char *buf, int size, FILE *tty); +#endif +#else +static void read_till_nl(); +static int read_pw(); +static void recsig(); +static void pushsig(); +static void popsig(); +#if defined(MSDOS) && !defined(WIN16) +static int noecho_fgets(); +#endif +#endif + +#ifndef NOPROTO +static void (*savsig[NX509_SIG])(int ); +#else +static void (*savsig[NX509_SIG])(); +#endif +static jmp_buf save; + +int des_read_password(key, prompt, verify) +des_cblock (*key); +char *prompt; +int verify; +	{ +	int ok; +	char buf[BUFSIZ],buff[BUFSIZ]; + +	if ((ok=read_pw(buf,buff,BUFSIZ,prompt,verify)) == 0) +		des_string_to_key(buf,key); +	memset(buf,0,BUFSIZ); +	memset(buff,0,BUFSIZ); +	return(ok); +	} + +int des_read_2passwords(key1, key2, prompt, verify) +des_cblock (*key1); +des_cblock (*key2); +char *prompt; +int verify; +	{ +	int ok; +	char buf[BUFSIZ],buff[BUFSIZ]; + +	if ((ok=read_pw(buf,buff,BUFSIZ,prompt,verify)) == 0) +		des_string_to_2keys(buf,key1,key2); +	memset(buf,0,BUFSIZ); +	memset(buff,0,BUFSIZ); +	return(ok); +	} + +int des_read_pw_string(buf, length, prompt, verify) +char *buf; +int length; +char *prompt; +int verify; +	{ +	char buff[BUFSIZ]; +	int ret; + +	ret=read_pw(buf,buff,(length>BUFSIZ)?BUFSIZ:length,prompt,verify); +	memset(buff,0,BUFSIZ); +	return(ret); +	} + +#ifndef WIN16 + +static void read_till_nl(in) +FILE *in; +	{ +#define SIZE 4 +	char buf[SIZE+1]; + +	do	{ +		fgets(buf,SIZE,in); +		} while (strchr(buf,'\n') == NULL); +	} + + +/* return 0 if ok, 1 (or -1) otherwise */ +static int read_pw(buf, buff, size, prompt, verify) +char *buf; +char *buff; +int size; +char *prompt; +int verify; +	{ +#ifdef VMS +	struct IOSB iosb; +	$DESCRIPTOR(terminal,"TT"); +	long tty_orig[3], tty_new[3]; +	long status; +	unsigned short channel = 0; +#else +#ifndef MSDOS +	TTY_STRUCT tty_orig,tty_new; +#endif +#endif +	int number=5; +	int ok=0; +	int ps=0; +	int is_a_tty=1; + +	FILE *tty=NULL; +	char *p; + +#ifdef __CYGWIN32__ +	tty = stdin; +#elif !defined(MSDOS) +	if ((tty=fopen("/dev/tty","r")) == NULL) +		tty=stdin; +#else /* MSDOS */ +	if ((tty=fopen("con","r")) == NULL) +		tty=stdin; +#endif /* MSDOS */ + +#if defined(TTY_get) && !defined(VMS) +	if (TTY_get(fileno(tty),&tty_orig) == -1) +		{ +#ifdef ENOTTY +		if (errno == ENOTTY) +			is_a_tty=0; +		else +#endif +			return(-1); +		} +	memcpy(&(tty_new),&(tty_orig),sizeof(tty_orig)); +#endif +#ifdef VMS +	status = SYS$ASSIGN(&terminal,&channel,0,0); +	if (status != SS$_NORMAL) +		return(-1); +	status=SYS$QIOW(0,channel,IO$_SENSEMODE,&iosb,0,0,tty_orig,12,0,0,0,0); +	if ((status != SS$_NORMAL) || (iosb.iosb$w_value != SS$_NORMAL)) +		return(-1); +#endif + +	if (setjmp(save)) +		{ +		ok=0; +		goto error; +		} +	pushsig(); +	ps=1; + +#ifdef TTY_FLAGS +	tty_new.TTY_FLAGS &= ~ECHO; +#endif + +#if defined(TTY_set) && !defined(VMS) +	if (is_a_tty && (TTY_set(fileno(tty),&tty_new) == -1)) +		return(-1); +#endif +#ifdef VMS +	tty_new[0] = tty_orig[0]; +	tty_new[1] = tty_orig[1] | TT$M_NOECHO; +	tty_new[2] = tty_orig[2]; +	status = SYS$QIOW(0,channel,IO$_SETMODE,&iosb,0,0,tty_new,12,0,0,0,0); +	if ((status != SS$_NORMAL) || (iosb.iosb$w_value != SS$_NORMAL)) +		return(-1); +#endif +	ps=2; + +	while ((!ok) && (number--)) +		{ +		fputs(prompt,stderr); +		fflush(stderr); + +		buf[0]='\0'; +		fgets(buf,size,tty); +		if (feof(tty)) goto error; +		if (ferror(tty)) goto error; +		if ((p=(char *)strchr(buf,'\n')) != NULL) +			*p='\0'; +		else	read_till_nl(tty); +		if (verify) +			{ +			fprintf(stderr,"\nVerifying password - %s",prompt); +			fflush(stderr); +			buff[0]='\0'; +			fgets(buff,size,tty); +			if (feof(tty)) goto error; +			if ((p=(char *)strchr(buff,'\n')) != NULL) +				*p='\0'; +			else	read_till_nl(tty); +				 +			if (strcmp(buf,buff) != 0) +				{ +				fprintf(stderr,"\nVerify failure"); +				fflush(stderr); +				break; +				/* continue; */ +				} +			} +		ok=1; +		} + +error: +	fprintf(stderr,"\n"); +#ifdef DEBUG +	perror("fgets(tty)"); +#endif +	/* What can we do if there is an error? */ +#if defined(TTY_set) && !defined(VMS)  +	if (ps >= 2) TTY_set(fileno(tty),&tty_orig); +#endif +#ifdef VMS +	if (ps >= 2) +		status = SYS$QIOW(0,channel,IO$_SETMODE,&iosb,0,0 +			,tty_orig,12,0,0,0,0); +#endif +	 +	if (ps >= 1) popsig(); +	if (stdin != tty) fclose(tty); +#ifdef VMS +	status = SYS$DASSGN(channel); +#endif +	return(!ok); +	} + +#else /* WIN16 */ + +static int read_pw(buf, buff, size, prompt, verify) +char *buf; +char *buff; +int size; +char *prompt; +int verify; +	{  +	memset(buf,0,size); +	memset(buff,0,size); +	return(0); +	} + +#endif + +static void pushsig() +	{ +	int i; + +	for (i=1; i<NX509_SIG; i++) +		savsig[i]=signal(i,recsig); + +#ifdef SIGWINCH +	signal(SIGWINCH,SIG_DFL); +#endif +	} + +static void popsig() +	{ +	int i; + +	for (i=1; i<NX509_SIG; i++) +		signal(i,savsig[i]); +	} + +static void recsig(i) +int i; +	{ +	longjmp(save,1); +#ifdef LINT +	i=i; +#endif +	} + +#if defined(MSDOS) && !defined(WIN16) +static int noecho_fgets(buf,size,tty) +char *buf; +int size; +FILE *tty; +	{ +	int i; +	char *p; + +	p=buf; +	for (;;) +		{ +		if (size == 0) +			{ +			*p='\0'; +			break; +			} +		size--; +#ifdef WIN16TTY +		i=_inchar(); +#else +		i=getch(); +#endif +		if (i == '\r') i='\n'; +		*(p++)=i; +		if (i == '\n') +			{ +			*p='\0'; +			break; +			} +		} +	return(strlen(buf)); +	} +#endif diff --git a/crypto/libdes/resource.h b/crypto/libdes/resource.h new file mode 100644 index 000000000000..02c6a7c6d93a --- /dev/null +++ b/crypto/libdes/resource.h @@ -0,0 +1,18 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by passwd_dialog.rc +// +#define IDD_PASSWD_DIALOG               101 +#define IDC_EDIT1                       1000 +#define IDC_PASSWD_EDIT                 1001 + +// Next default values for new objects +//  +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE        102 +#define _APS_NEXT_COMMAND_VALUE         40001 +#define _APS_NEXT_CONTROL_VALUE         1002 +#define _APS_NEXT_SYMED_VALUE           101 +#endif +#endif diff --git a/crypto/libdes/rnd_keys.c b/crypto/libdes/rnd_keys.c new file mode 100644 index 000000000000..880006020e31 --- /dev/null +++ b/crypto/libdes/rnd_keys.c @@ -0,0 +1,505 @@ +/* + * Copyright (c) 1995, 1996, 1997, 1999 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * 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 acknowledgement: + *      This product includes software developed by the Kungliga Tekniska + *      Högskolan and its contributors. + *  + * 4. Neither the name of the Institute nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + *  + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``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 INSTITUTE 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" + +RCSID("$Id: rnd_keys.c,v 1.55 1999/03/19 23:17:13 assar Exp $"); +#endif + +#include <des.h> +#include <des_locl.h> +#ifdef KRB5 +#include <krb5-types.h> +#elif defined(KRB4) +#include <ktypes.h> +#endif + +#include <string.h> + +#ifdef TIME_WITH_SYS_TIME +#include <sys/time.h> +#include <time.h> +#elif defined(HAVE_SYS_TIME_H) +#include <sys/time.h> +#else +#include <time.h> +#endif + +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif + +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif +#ifdef HAVE_IO_H +#include <io.h> +#endif + +#ifdef HAVE_SIGNAL_H +#include <signal.h> +#endif +#ifdef HAVE_FCNTL_H +#include <fcntl.h> +#endif + +#ifdef HAVE_WINSOCK_H +#include <winsock.h> +#endif + +/* + * Generate "random" data by checksumming a file. + * + * Returns -1 if there were any problems with permissions or I/O + * errors. + */ +static +int +sumFile (const char *name, int len, void *res) +{ +  u_int32_t sum[2]; +  u_int32_t buf[1024*2]; +  int fd, i; + +  fd = open (name, 0); +  if (fd < 0) +    return -1; + +  while (len > 0) +    { +      int n = read(fd, buf, sizeof(buf)); +      if (n < 0) +	{ +	  close(fd); +	  return n; +	} +      for (i = 0; i < (n/sizeof(buf[0])); i++) +	{ +	  sum[0] += buf[i]; +	  i++; +	  sum[1] += buf[i]; +	} +      len -= n; +    } +  close (fd); +  memcpy (res, &sum, sizeof(sum)); +  return 0; +} + +#if 0 +static +int +md5sumFile (const char *name, int len, int32_t sum[4]) +{ +  int32_t buf[1024*2]; +  int fd, cnt; +  struct md5 md5; + +  fd = open (name, 0); +  if (fd < 0) +    return -1; + +  md5_init(&md5); +  while (len > 0) +    { +      int n = read(fd, buf, sizeof(buf)); +      if (n < 0) +	{ +	  close(fd); +	  return n; +	} +      md5_update(&md5, buf, n); +      len -= n; +    } +  md5_finito(&md5, (unsigned char *)sum); +  close (fd); +  return 0; +} +#endif + +/* + * Create a sequence of random 64 bit blocks. + * The sequence is indexed with a long long and  + * based on an initial des key used as a seed. + */ +static des_key_schedule sequence_seed; +static u_int32_t sequence_index[2]; + +/*  + * Random number generator based on ideas from truerand in cryptolib + * as described on page 424 in Applied Cryptography 2 ed. by Bruce + * Schneier. + */ + +static volatile int counter; +static volatile unsigned char *gdata; /* Global data */ +static volatile int igdata;	/* Index into global data */ +static int gsize; + +#if !defined(WIN32) && !defined(__EMX__) && !defined(__OS2__) && !defined(__CYGWIN32__) +/* Visual C++ 4.0 (Windows95/NT) */ + +static +RETSIGTYPE +sigALRM(int sig) +{ +    if (igdata < gsize) +	gdata[igdata++] ^= counter & 0xff; + +#ifndef HAVE_SIGACTION +    signal(SIGALRM, sigALRM); /* Reinstall SysV signal handler */ +#endif +    SIGRETURN(0); +} + +#endif + +#if !defined(HAVE_RANDOM) && defined(HAVE_RAND) +#ifndef srandom +#define srandom srand +#endif +#ifndef random +#define random rand +#endif +#endif + +static void +des_not_rand_data(unsigned char *data, int size) +{ +  int i; + +  srandom (time (NULL)); + +  for(i = 0; i < size; ++i) +    data[i] ^= random() % 0x100; +} + +#if !defined(WIN32) && !defined(__EMX__) && !defined(__OS2__) && !defined(__CYGWIN32__) + +#ifndef HAVE_SETITIMER +static void +pacemaker(struct timeval *tv) +{ +    fd_set fds; +    pid_t pid; +    pid = getppid(); +    while(1){ +	FD_ZERO(&fds); +	FD_SET(0, &fds); +	select(1, &fds, NULL, NULL, tv); +	kill(pid, SIGALRM); +    } +} +#endif + +#ifdef HAVE_SIGACTION +/* XXX ugly hack, should perhaps use function from roken */ +static RETSIGTYPE  +(*fake_signal(int sig, RETSIGTYPE (*f)(int)))(int) +{ +    struct sigaction sa, osa; +    sa.sa_handler = f; +    sa.sa_flags = 0; +    sigemptyset(&sa.sa_mask); +    sigaction(sig, &sa, &osa); +    return osa.sa_handler; +} +#define signal(S, F) fake_signal((S), (F)) +#endif + +/* + * Generate size bytes of "random" data using timed interrupts. + * It takes about 40ms/byte random data. + * It's not neccessary to be root to run it. + */ +void +des_rand_data(unsigned char *data, int size) +{ +    struct itimerval tv, otv; +    RETSIGTYPE (*osa)(int); +    int i, j; +#ifndef HAVE_SETITIMER  +    RETSIGTYPE (*ochld)(int); +    pid_t pid; +#endif +    char *rnd_devices[] = {"/dev/random", +			   "/dev/srandom", +			   "/dev/urandom", +			   NULL}; +    char **p; + +    for(p = rnd_devices; *p; p++) { +      int fd = open(*p, O_RDONLY | O_NDELAY); +       +      if(fd >= 0 && read(fd, data, size) == size) { +	close(fd); +	return; +      } +      close(fd); +    } + +    /* Paranoia? Initialize data from /dev/mem if we can read it. */ +    if (size >= 8) +      sumFile("/dev/mem", (1024*1024*2), data); + +    gdata = data; +    gsize = size; +    igdata = 0; + +    osa = signal(SIGALRM, sigALRM); +   +    /* Start timer */ +    tv.it_value.tv_sec = 0; +    tv.it_value.tv_usec = 10 * 1000; /* 10 ms */ +    tv.it_interval = tv.it_value; +#ifdef HAVE_SETITIMER +    setitimer(ITIMER_REAL, &tv, &otv); +#else +    ochld = signal(SIGCHLD, SIG_IGN); +    pid = fork(); +    if(pid == -1){ +	signal(SIGCHLD, ochld != SIG_ERR ? ochld : SIG_DFL); +	des_not_rand_data(data, size); +	return; +    } +    if(pid == 0) +	pacemaker(&tv.it_interval); +#endif + +    for(i = 0; i < 4; i++) { +	for (igdata = 0; igdata < size;) /* igdata++ in sigALRM */ +	    counter++; +	for (j = 0; j < size; j++) /* Only use 2 bits each lap */ +	    gdata[j] = (gdata[j]>>2) | (gdata[j]<<6); +    } +#ifdef HAVE_SETITIMER +    setitimer(ITIMER_REAL, &otv, 0); +#else +    kill(pid, SIGKILL); +    while(waitpid(pid, NULL, 0) != pid); +    signal(SIGCHLD, ochld != SIG_ERR ? ochld : SIG_DFL); +#endif +    signal(SIGALRM, osa != SIG_ERR ? osa : SIG_DFL); +} +#else +void +des_rand_data(unsigned char *p, int s) +{ +  des_not_rand_data (p, s); +} +#endif + +void +des_generate_random_block(des_cblock *block) +{ +  des_rand_data((unsigned char *)block, sizeof(*block)); +} + +/* + * Generate a "random" DES key. + */ +void +des_rand_data_key(des_cblock *key) +{ +    unsigned char data[8]; +    des_key_schedule sched; +    do { +	des_rand_data(data, sizeof(data)); +	des_rand_data((unsigned char*)key, sizeof(des_cblock)); +	des_set_odd_parity(key); +	des_key_sched(key, sched); +	des_ecb_encrypt(&data, key, sched, DES_ENCRYPT); +	memset(&data, 0, sizeof(data)); +	memset(&sched, 0, sizeof(sched)); +	des_set_odd_parity(key); +    } while(des_is_weak_key(key)); +} + +/* + * Generate "random" data by checksumming /dev/mem + * + * It's neccessary to be root to run it. Returns -1 if there were any + * problems with permissions. + */ +int +des_mem_rand8(unsigned char *data) +{ +  return 1; +} + +/* + * In case the generator does not get initialized use this as fallback. + */ +static int initialized; + +static void +do_initialize(void) +{ +    des_cblock default_seed; +    do { +	des_generate_random_block(&default_seed); +	des_set_odd_parity(&default_seed); +    } while (des_is_weak_key(&default_seed)); +    des_init_random_number_generator(&default_seed); +} + +#define zero_long_long(ll) do { ll[0] = ll[1] = 0; } while (0) + +#define incr_long_long(ll) do { if (++ll[0] == 0) ++ll[1]; } while (0) + +#define set_sequence_number(ll) \ +memcpy((char *)sequence_index, (ll), sizeof(sequence_index)); + +/* + * Set the sequnce number to this value (a long long). + */ +void +des_set_sequence_number(unsigned char *ll) +{ +    set_sequence_number(ll); +} + +/* + * Set the generator seed and reset the sequence number to 0. + */ +void +des_set_random_generator_seed(des_cblock *seed) +{ +    des_key_sched(seed, sequence_seed); +    zero_long_long(sequence_index); +    initialized = 1; +} + +/* + * Generate a sequence of random des keys + * using the random block sequence, fixup + * parity and skip weak keys. + */ +int +des_new_random_key(des_cblock *key) +{ +    if (!initialized) +	do_initialize(); + +    do { +	des_ecb_encrypt((des_cblock *) sequence_index, +			key, +			sequence_seed, +			DES_ENCRYPT); +	incr_long_long(sequence_index); +	/* random key must have odd parity and not be weak */ +	des_set_odd_parity(key); +    } while (des_is_weak_key(key)); +    return(0); +} + +/* + * des_init_random_number_generator: + * + * Initialize the sequence of random 64 bit blocks.  The input seed + * can be a secret key since it should be well hidden and is also not + * kept. + * + */ +void  +des_init_random_number_generator(des_cblock *seed) +{ +    struct timeval now; +    des_cblock uniq; +    des_cblock new_key; + +    gettimeofday(&now, (struct timezone *)0); +    des_generate_random_block(&uniq); + +    /* Pick a unique random key from the shared sequence. */ +    des_set_random_generator_seed(seed); +    set_sequence_number((unsigned char *)&uniq); +    des_new_random_key(&new_key); + +    /* Select a new nonshared sequence, */ +    des_set_random_generator_seed(&new_key); + +    /* and use the current time to pick a key for the new sequence. */ +    set_sequence_number((unsigned char *)&now); +    des_new_random_key(&new_key); +    des_set_random_generator_seed(&new_key); +} + +/* This is for backwards compatibility. */ +void +des_random_key(des_cblock ret) +{ +    des_new_random_key((des_cblock *)ret); +} + +#ifdef TESTRUN +int +main() +{ +    unsigned char data[8]; +    int i; + +    while (1) +        { +	    if (sumFile("/dev/mem", (1024*1024*8), data) != 0) +	      { perror("sumFile"); exit(1); } +            for (i = 0; i < 8; i++) +                printf("%02x", data[i]); +            printf("\n"); +        } +} +#endif + +#ifdef TESTRUN2 +int +main() +{ +    des_cblock data; +    int i; + +    while (1) +        { +	    do_initialize(); +            des_random_key(data); +            for (i = 0; i < 8; i++) +                printf("%02x", data[i]); +            printf("\n"); +        } +} +#endif diff --git a/crypto/libdes/rpc_des.h b/crypto/libdes/rpc_des.h new file mode 100644 index 000000000000..683b397f6ad9 --- /dev/null +++ b/crypto/libdes/rpc_des.h @@ -0,0 +1,131 @@ +/* crypto/des/rpc_des.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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.] + */ + +/*  @(#)des.h	2.2 88/08/10 4.0 RPCSRC; from 2.7 88/02/08 SMI  */ +/* + * Sun RPC is a product of Sun Microsystems, Inc. and is provided for + * unrestricted use provided that this legend is included on all tape + * media and as a part of the software program in whole or part.  Users + * may copy or modify Sun RPC without charge, but are not authorized + * to license or distribute it to anyone else except as part of a product or + * program developed by the user. + *  + * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE + * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR + * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. + *  + * Sun RPC is provided with no support and without any obligation on the + * part of Sun Microsystems, Inc. to assist in its use, correction, + * modification or enhancement. + *  + * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE + * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC + * OR ANY PART THEREOF. + *  + * In no event will Sun Microsystems, Inc. be liable for any lost revenue + * or profits or other special, indirect and consequential damages, even if + * Sun has been advised of the possibility of such damages. + *  + * Sun Microsystems, Inc. + * 2550 Garcia Avenue + * Mountain View, California  94043 + */ +/* + * Generic DES driver interface + * Keep this file hardware independent! + * Copyright (c) 1986 by Sun Microsystems, Inc. + */ + +#define DES_MAXLEN 	65536	/* maximum # of bytes to encrypt  */ +#define DES_QUICKLEN	16	/* maximum # of bytes to encrypt quickly */ + +#ifdef HEADER_DES_H +#undef ENCRYPT +#undef DECRYPT +#endif + +enum desdir { ENCRYPT, DECRYPT }; +enum desmode { CBC, ECB }; + +/* + * parameters to ioctl call + */ +struct desparams { +	unsigned char des_key[8];	/* key (with low bit parity) */ +	enum desdir des_dir;	/* direction */ +	enum desmode des_mode;	/* mode */ +	unsigned char des_ivec[8];	/* input vector */ +	unsigned des_len;	/* number of bytes to crypt */ +	union { +		unsigned char UDES_data[DES_QUICKLEN]; +		unsigned char *UDES_buf; +	} UDES; +#	define des_data UDES.UDES_data	/* direct data here if quick */ +#	define des_buf	UDES.UDES_buf	/* otherwise, pointer to data */ +}; + +/* + * Encrypt an arbitrary sized buffer + */ +#define	DESIOCBLOCK	_IOWR(d, 6, struct desparams) + +/*  + * Encrypt of small amount of data, quickly + */ +#define DESIOCQUICK	_IOWR(d, 7, struct desparams)  + diff --git a/crypto/libdes/rpc_enc.c b/crypto/libdes/rpc_enc.c new file mode 100644 index 000000000000..7a0fcf2a5888 --- /dev/null +++ b/crypto/libdes/rpc_enc.c @@ -0,0 +1,107 @@ +/* crypto/des/rpc_enc.c */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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 "rpc_des.h" +#include "des_locl.h" +#include "des_ver.h" + +#ifndef NOPROTO +int _des_crypt(char *buf,int len,struct desparams *desp); +#else +int _des_crypt(); +#endif + +int _des_crypt(buf, len, desp) +char *buf; +int len; +struct desparams *desp; +	{ +	des_key_schedule ks; +	int enc; + +	des_set_key((des_cblock *)desp->des_key,ks); +	enc=(desp->des_dir == ENCRYPT)?DES_ENCRYPT:DES_DECRYPT; + +	if (desp->des_mode == CBC) +		des_ecb_encrypt((des_cblock *)desp->UDES.UDES_buf, +				(des_cblock *)desp->UDES.UDES_buf,ks,enc); +	else +		{ +		des_ncbc_encrypt((des_cblock *)desp->UDES.UDES_buf, +				(des_cblock *)desp->UDES.UDES_buf, +				(long)len,ks, +				(des_cblock *)desp->des_ivec,enc); +#ifdef undef +		/* len will always be %8 if called from common_crypt +		 * in secure_rpc. +		 * Libdes's cbc encrypt does not copy back the iv, +		 * so we have to do it here. */ +		/* It does now :-) eay 20/09/95 */ + +		a=(char *)&(desp->UDES.UDES_buf[len-8]); +		b=(char *)&(desp->des_ivec[0]); + +		*(a++)= *(b++); *(a++)= *(b++); +		*(a++)= *(b++); *(a++)= *(b++); +		*(a++)= *(b++); *(a++)= *(b++); +		*(a++)= *(b++); *(a++)= *(b++); +#endif +		} +	return(1);	 +	} + diff --git a/crypto/libdes/rpw.c b/crypto/libdes/rpw.c new file mode 100644 index 000000000000..3ca4cec85688 --- /dev/null +++ b/crypto/libdes/rpw.c @@ -0,0 +1,104 @@ +/* crypto/des/rpw.c */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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.] + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include <stdio.h> +#include "des.h" + +int main(argc,argv) +int argc; +char *argv[]; +	{ +	des_cblock k,k1; +	int i; + +	printf("read passwd\n"); +	if ((i=des_read_password((C_Block *)k,"Enter password:",0)) == 0) +		{ +		printf("password = "); +		for (i=0; i<8; i++) +			printf("%02x ",k[i]); +		} +	else +		printf("error %d\n",i); +	printf("\n"); +	printf("read 2passwds and verify\n"); +	if ((i=des_read_2passwords((C_Block *)k,(C_Block *)k1, +		"Enter verified password:",1)) == 0) +		{ +		printf("password1 = "); +		for (i=0; i<8; i++) +			printf("%02x ",k[i]); +		printf("\n"); +		printf("password2 = "); +		for (i=0; i<8; i++) +			printf("%02x ",k1[i]); +		printf("\n"); +		exit(1); +		} +	else +		{ +		printf("error %d\n",i); +		exit(0); +		} +#ifdef LINT +	return(0); +#endif +	} diff --git a/crypto/libdes/set_key.c b/crypto/libdes/set_key.c new file mode 100644 index 000000000000..6714256da30e --- /dev/null +++ b/crypto/libdes/set_key.c @@ -0,0 +1,244 @@ +/* crypto/des/set_key.c */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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.] + */ + +/* set_key.c v 1.4 eay 24/9/91 + * 1.4 Speed up by 400% :-) + * 1.3 added register declarations. + * 1.2 unrolled make_key_sched a bit more + * 1.1 added norm_expand_bits + * 1.0 First working version + */ +#include "des_locl.h" +#include "podd.h" +#include "sk.h" + +#ifndef NOPROTO +static int check_parity(des_cblock (*key)); +#else +static int check_parity(); +#endif + +int des_check_key=0; + +void des_set_odd_parity(key) +des_cblock (*key); +	{ +	int i; + +	for (i=0; i<DES_KEY_SZ; i++) +		(*key)[i]=odd_parity[(*key)[i]]; +	} + +static int check_parity(key) +des_cblock (*key); +	{ +	int i; + +	for (i=0; i<DES_KEY_SZ; i++) +		{ +		if ((*key)[i] != odd_parity[(*key)[i]]) +			return(0); +		} +	return(1); +	} + +/* Weak and semi week keys as take from + * %A D.W. Davies + * %A W.L. Price + * %T Security for Computer Networks + * %I John Wiley & Sons + * %D 1984 + * Many thanks to smb@ulysses.att.com (Steven Bellovin) for the reference + * (and actual cblock values). + */ +#define NUM_WEAK_KEY	16 +static des_cblock weak_keys[NUM_WEAK_KEY]={ +	/* weak keys */ +	{0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01}, +	{0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE}, +	{0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F}, +	{0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0}, +	/* semi-weak keys */ +	{0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE}, +	{0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01}, +	{0x1F,0xE0,0x1F,0xE0,0x0E,0xF1,0x0E,0xF1}, +	{0xE0,0x1F,0xE0,0x1F,0xF1,0x0E,0xF1,0x0E}, +	{0x01,0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1}, +	{0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1,0x01}, +	{0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E,0xFE}, +	{0xFE,0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E}, +	{0x01,0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E}, +	{0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E,0x01}, +	{0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1,0xFE}, +	{0xFE,0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1}}; + +int des_is_weak_key(key) +des_cblock (*key); +	{ +	int i; + +	for (i=0; i<NUM_WEAK_KEY; i++) +		/* Added == 0 to comparision, I obviously don't run +		 * this section very often :-(, thanks to +		 * engineering@MorningStar.Com for the fix +		 * eay 93/06/29 */ +		if (memcmp(weak_keys[i],key,sizeof(key)) == 0) return(1); +	return(0); +	} + +/* NOW DEFINED IN des_local.h + * See ecb_encrypt.c for a pseudo description of these macros.  + * #define PERM_OP(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),\ + * 	(b)^=(t),\ + * 	(a)=((a)^((t)<<(n)))) + */ + +#define HPERM_OP(a,t,n,m) ((t)=((((a)<<(16-(n)))^(a))&(m)),\ +	(a)=(a)^(t)^(t>>(16-(n)))) + +/* return 0 if key parity is odd (correct), + * return -1 if key parity error, + * return -2 if illegal weak key. + */ +int des_set_key(key, schedule) +des_cblock (*key); +des_key_schedule schedule; +	{ +	static int shifts2[16]={0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0}; +	register DES_LONG c,d,t,s,t2; +	register unsigned char *in; +	register DES_LONG *k; +	register int i; + +	if (des_check_key) +		{ +		if (!check_parity(key)) +			return(-1); + +		if (des_is_weak_key(key)) +			return(-2); +		} + +	k=(DES_LONG *)schedule; +	in=(unsigned char *)key; + +	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 :-) +	 * Thanks to John Fletcher (john_fletcher@lccmail.ocf.llnl.gov) +	 * for the inspiration. :-) */ +	PERM_OP (d,c,t,4,0x0f0f0f0fL); +	HPERM_OP(c,t,-2,0xcccc0000L); +	HPERM_OP(d,t,-2,0xcccc0000L); +	PERM_OP (d,c,t,1,0x55555555L); +	PERM_OP (c,d,t,8,0x00ff00ffL); +	PERM_OP (d,c,t,1,0x55555555L); +	d=	(((d&0x000000ffL)<<16L)| (d&0x0000ff00L)     | +		 ((d&0x00ff0000L)>>16L)|((c&0xf0000000L)>>4L)); +	c&=0x0fffffffL; + +	for (i=0; i<ITERATIONS; i++) +		{ +		if (shifts2[i]) +			{ c=((c>>2L)|(c<<26L)); d=((d>>2L)|(d<<26L)); } +		else +			{ c=((c>>1L)|(c<<27L)); d=((d>>1L)|(d<<27L)); } +		c&=0x0fffffffL; +		d&=0x0fffffffL; +		/* 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) | +						  ((c>>22L)&0x38)]; +		t=	des_skb[4][ (d    )&0x3f                ]| +			des_skb[5][((d>> 7L)&0x03)|((d>> 8L)&0x3c)]| +			des_skb[6][ (d>>15L)&0x3f                ]| +			des_skb[7][((d>>21L)&0x0f)|((d>>22L)&0x30)]; + +		/* table contained 0213 4657 */ +		t2=((t<<16L)|(s&0x0000ffffL))&0xffffffffL; +		*(k++)=ROTATE(t2,30)&0xffffffffL; + +		t2=((s>>16L)|(t&0xffff0000L)); +		*(k++)=ROTATE(t2,26)&0xffffffffL; +		} +	return(0); +	} + +int des_key_sched(key, schedule) +des_cblock (*key); +des_key_schedule schedule; +	{ +	return(des_set_key(key,schedule)); +	} diff --git a/crypto/libdes/shifts.pl b/crypto/libdes/shifts.pl new file mode 100644 index 000000000000..94afde35b1af --- /dev/null +++ b/crypto/libdes/shifts.pl @@ -0,0 +1,198 @@ +#/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/crypto/libdes/sk.h b/crypto/libdes/sk.h new file mode 100644 index 000000000000..6fe99cf82568 --- /dev/null +++ b/crypto/libdes/sk.h @@ -0,0 +1,204 @@ +/* crypto/des/sk.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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/crypto/libdes/speed.c b/crypto/libdes/speed.c new file mode 100644 index 000000000000..61179941e7da --- /dev/null +++ b/crypto/libdes/speed.c @@ -0,0 +1,329 @@ +/* crypto/des/speed.c */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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.] + */ + +/* 11-Sep-92 Andrew Daviel   Support for Silicon Graphics IRIX added */ +/* 06-Apr-92 Luke Brennan    Support for VMS and add extra signal calls */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#if !defined(MSDOS) && !defined(WIN32) +#define TIMES +#endif + +#include <stdio.h> +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif +#include <signal.h> +#ifdef HAVE_TIME_H +#include <time.h> +#endif +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_TIMES_H +#include <sys/times.h> +#endif + +#ifdef VMS +#include <types.h> +struct tms { +	time_t tms_utime; +	time_t tms_stime; +	time_t tms_uchild;	/* I dunno...  */ +	time_t tms_uchildsys;	/* so these names are a guess :-) */ +	} +#endif + +#ifdef HAVE_SYS_TIMEB_H +#include <sys/timeb.h> +#endif + +#include <limits.h> +#ifdef HAVE_SYS_PARAM_H +#include <sys/param.h> +#endif + +#include "des.h" + +/* The following if from times(3) man page.  It may need to be changed */ +#ifndef HZ +#ifndef CLK_TCK +#ifndef VMS +#define HZ	100.0 +#else /* VMS */ +#define HZ	100.0 +#endif +#else /* CLK_TCK */ +#define HZ ((double)CLK_TCK) +#endif +#endif + +#define BUFSIZE	((long)1024) +long run=0; + +#ifndef NOPROTO +double Time_F(int s); +#else +double Time_F(); +#endif + +#ifdef SIGALRM +#if defined(__STDC__) || defined(sgi) +#define SIGRETTYPE void +#else +#define SIGRETTYPE int +#endif + +#ifndef NOPROTO +SIGRETTYPE sig_done(int sig); +#else +SIGRETTYPE sig_done(); +#endif + +SIGRETTYPE sig_done(sig) +int sig; +	{ +	signal(SIGALRM,sig_done); +	run=0; +#ifdef LINT +	sig=sig; +#endif +	} +#endif + +#define START	0 +#define STOP	1 + +double Time_F(s) +int s; +	{ +	double ret; +#ifdef TIMES +	static struct tms tstart,tend; + +	if (s == START) +		{ +		times(&tstart); +		return(0); +		} +	else +		{ +		times(&tend); +		ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ; +		return((ret == 0.0)?1e-6:ret); +		} +#else /* !times() */ +	static struct timeb tstart,tend; +	long i; + +	if (s == START) +		{ +		ftime(&tstart); +		return(0); +		} +	else +		{ +		ftime(&tend); +		i=(long)tend.millitm-(long)tstart.millitm; +		ret=((double)(tend.time-tstart.time))+((double)i)/1000.0; +		return((ret == 0.0)?1e-6:ret); +		} +#endif +	} + +int main(argc,argv) +int argc; +char **argv; +	{ +	long count; +	static unsigned char buf[BUFSIZE]; +	static des_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0}; +	static des_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12}; +	static des_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34}; +	des_key_schedule sch,sch2,sch3; +	double a,b,c,d,e; +#ifndef SIGALRM +	long ca,cb,cc,cd,ce; +#endif + +#ifndef TIMES +	printf("To get the most acurate results, try to run this\n"); +	printf("program when this computer is idle.\n"); +#endif + +	des_set_key((C_Block *)key2,sch2); +	des_set_key((C_Block *)key3,sch3); + +#ifndef SIGALRM +	printf("First we calculate the approximate speed ...\n"); +	des_set_key((C_Block *)key,sch); +	count=10; +	do	{ +		long i; +		DES_LONG data[2]; + +		count*=2; +		Time_F(START); +		for (i=count; i; i--) +			des_encrypt(data,&(sch[0]),DES_ENCRYPT); +		d=Time_F(STOP); +		} while (d < 3.0); +	ca=count; +	cb=count*3; +	cc=count*3*8/BUFSIZE+1; +	cd=count*8/BUFSIZE+1; +	ce=count/20+1; +	printf("Doing set_key %ld times\n",ca); +#define COND(d)	(count != (d)) +#define COUNT(d) (d) +#else +#define COND(c)	(run) +#define COUNT(d) (count) +	signal(SIGALRM,sig_done); +	printf("Doing set_key for 10 seconds\n"); +	alarm(10); +#endif + +	Time_F(START); +	for (count=0,run=1; COND(ca); count++) +		des_set_key((C_Block *)key,sch); +	d=Time_F(STOP); +	printf("%ld set_key's in %.2f seconds\n",count,d); +	a=((double)COUNT(ca))/d; + +#ifdef SIGALRM +	printf("Doing des_encrypt's for 10 seconds\n"); +	alarm(10); +#else +	printf("Doing des_encrypt %ld times\n",cb); +#endif +	Time_F(START); +	for (count=0,run=1; COND(cb); count++) +		{ +		DES_LONG data[2]; + +		des_encrypt(data,&(sch[0]),DES_ENCRYPT); +		} +	d=Time_F(STOP); +	printf("%ld des_encrypt's in %.2f second\n",count,d); +	b=((double)COUNT(cb)*8)/d; + +#ifdef SIGALRM +	printf("Doing des_cbc_encrypt on %ld byte blocks for 10 seconds\n", +		BUFSIZE); +	alarm(10); +#else +	printf("Doing des_cbc_encrypt %ld times on %ld byte blocks\n",cc, +		BUFSIZE); +#endif +	Time_F(START); +	for (count=0,run=1; COND(cc); count++) +		des_ncbc_encrypt((C_Block *)buf,(C_Block *)buf,BUFSIZE,&(sch[0]), +			(C_Block *)&(key[0]),DES_ENCRYPT); +	d=Time_F(STOP); +	printf("%ld des_cbc_encrypt's of %ld byte blocks in %.2f second\n", +		count,BUFSIZE,d); +	c=((double)COUNT(cc)*BUFSIZE)/d; + +#ifdef SIGALRM +	printf("Doing des_ede_cbc_encrypt on %ld byte blocks for 10 seconds\n", +		BUFSIZE); +	alarm(10); +#else +	printf("Doing des_ede_cbc_encrypt %ld times on %ld byte blocks\n",cd, +		BUFSIZE); +#endif +	Time_F(START); +	for (count=0,run=1; COND(cd); count++) +		des_ede3_cbc_encrypt((C_Block *)buf,(C_Block *)buf,BUFSIZE, +			&(sch[0]), +			&(sch2[0]), +			&(sch3[0]), +			(C_Block *)&(key[0]), +			DES_ENCRYPT); +	d=Time_F(STOP); +	printf("%ld des_ede_cbc_encrypt's of %ld byte blocks in %.2f second\n", +		count,BUFSIZE,d); +	d=((double)COUNT(cd)*BUFSIZE)/d; + +#ifdef SIGALRM +	printf("Doing crypt for 10 seconds\n"); +	alarm(10); +#else +	printf("Doing crypt %ld times\n",ce); +#endif +	Time_F(START); +	for (count=0,run=1; COND(ce); count++) +		crypt("testing1","ef"); +	e=Time_F(STOP); +	printf("%ld crypts in %.2f second\n",count,e); +	e=((double)COUNT(ce))/e; + +	printf("set_key            per sec = %12.2f (%5.1fuS)\n",a,1.0e6/a); +	printf("DES raw ecb bytes  per sec = %12.2f (%5.1fuS)\n",b,8.0e6/b); +	printf("DES cbc bytes      per sec = %12.2f (%5.1fuS)\n",c,8.0e6/c); +	printf("DES ede cbc bytes  per sec = %12.2f (%5.1fuS)\n",d,8.0e6/d); +	printf("crypt              per sec = %12.2f (%5.1fuS)\n",e,1.0e6/e); +	exit(0); +#if defined(LINT) || defined(MSDOS) +	return(0); +#endif +	} diff --git a/crypto/libdes/spr.h b/crypto/libdes/spr.h new file mode 100644 index 000000000000..3ac3e8db4181 --- /dev/null +++ b/crypto/libdes/spr.h @@ -0,0 +1,204 @@ +/* crypto/des/spr.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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.] + */ + +const DES_LONG des_SPtrans[8][64]={ +{ +/* nibble 0 */ +0x02080800L, 0x00080000L, 0x02000002L, 0x02080802L, +0x02000000L, 0x00080802L, 0x00080002L, 0x02000002L, +0x00080802L, 0x02080800L, 0x02080000L, 0x00000802L, +0x02000802L, 0x02000000L, 0x00000000L, 0x00080002L, +0x00080000L, 0x00000002L, 0x02000800L, 0x00080800L, +0x02080802L, 0x02080000L, 0x00000802L, 0x02000800L, +0x00000002L, 0x00000800L, 0x00080800L, 0x02080002L, +0x00000800L, 0x02000802L, 0x02080002L, 0x00000000L, +0x00000000L, 0x02080802L, 0x02000800L, 0x00080002L, +0x02080800L, 0x00080000L, 0x00000802L, 0x02000800L, +0x02080002L, 0x00000800L, 0x00080800L, 0x02000002L, +0x00080802L, 0x00000002L, 0x02000002L, 0x02080000L, +0x02080802L, 0x00080800L, 0x02080000L, 0x02000802L, +0x02000000L, 0x00000802L, 0x00080002L, 0x00000000L, +0x00080000L, 0x02000000L, 0x02000802L, 0x02080800L, +0x00000002L, 0x02080002L, 0x00000800L, 0x00080802L, +},{ +/* nibble 1 */ +0x40108010L, 0x00000000L, 0x00108000L, 0x40100000L, +0x40000010L, 0x00008010L, 0x40008000L, 0x00108000L, +0x00008000L, 0x40100010L, 0x00000010L, 0x40008000L, +0x00100010L, 0x40108000L, 0x40100000L, 0x00000010L, +0x00100000L, 0x40008010L, 0x40100010L, 0x00008000L, +0x00108010L, 0x40000000L, 0x00000000L, 0x00100010L, +0x40008010L, 0x00108010L, 0x40108000L, 0x40000010L, +0x40000000L, 0x00100000L, 0x00008010L, 0x40108010L, +0x00100010L, 0x40108000L, 0x40008000L, 0x00108010L, +0x40108010L, 0x00100010L, 0x40000010L, 0x00000000L, +0x40000000L, 0x00008010L, 0x00100000L, 0x40100010L, +0x00008000L, 0x40000000L, 0x00108010L, 0x40008010L, +0x40108000L, 0x00008000L, 0x00000000L, 0x40000010L, +0x00000010L, 0x40108010L, 0x00108000L, 0x40100000L, +0x40100010L, 0x00100000L, 0x00008010L, 0x40008000L, +0x40008010L, 0x00000010L, 0x40100000L, 0x00108000L, +},{ +/* nibble 2 */ +0x04000001L, 0x04040100L, 0x00000100L, 0x04000101L, +0x00040001L, 0x04000000L, 0x04000101L, 0x00040100L, +0x04000100L, 0x00040000L, 0x04040000L, 0x00000001L, +0x04040101L, 0x00000101L, 0x00000001L, 0x04040001L, +0x00000000L, 0x00040001L, 0x04040100L, 0x00000100L, +0x00000101L, 0x04040101L, 0x00040000L, 0x04000001L, +0x04040001L, 0x04000100L, 0x00040101L, 0x04040000L, +0x00040100L, 0x00000000L, 0x04000000L, 0x00040101L, +0x04040100L, 0x00000100L, 0x00000001L, 0x00040000L, +0x00000101L, 0x00040001L, 0x04040000L, 0x04000101L, +0x00000000L, 0x04040100L, 0x00040100L, 0x04040001L, +0x00040001L, 0x04000000L, 0x04040101L, 0x00000001L, +0x00040101L, 0x04000001L, 0x04000000L, 0x04040101L, +0x00040000L, 0x04000100L, 0x04000101L, 0x00040100L, +0x04000100L, 0x00000000L, 0x04040001L, 0x00000101L, +0x04000001L, 0x00040101L, 0x00000100L, 0x04040000L, +},{ +/* nibble 3 */ +0x00401008L, 0x10001000L, 0x00000008L, 0x10401008L, +0x00000000L, 0x10400000L, 0x10001008L, 0x00400008L, +0x10401000L, 0x10000008L, 0x10000000L, 0x00001008L, +0x10000008L, 0x00401008L, 0x00400000L, 0x10000000L, +0x10400008L, 0x00401000L, 0x00001000L, 0x00000008L, +0x00401000L, 0x10001008L, 0x10400000L, 0x00001000L, +0x00001008L, 0x00000000L, 0x00400008L, 0x10401000L, +0x10001000L, 0x10400008L, 0x10401008L, 0x00400000L, +0x10400008L, 0x00001008L, 0x00400000L, 0x10000008L, +0x00401000L, 0x10001000L, 0x00000008L, 0x10400000L, +0x10001008L, 0x00000000L, 0x00001000L, 0x00400008L, +0x00000000L, 0x10400008L, 0x10401000L, 0x00001000L, +0x10000000L, 0x10401008L, 0x00401008L, 0x00400000L, +0x10401008L, 0x00000008L, 0x10001000L, 0x00401008L, +0x00400008L, 0x00401000L, 0x10400000L, 0x10001008L, +0x00001008L, 0x10000000L, 0x10000008L, 0x10401000L, +},{ +/* nibble 4 */ +0x08000000L, 0x00010000L, 0x00000400L, 0x08010420L, +0x08010020L, 0x08000400L, 0x00010420L, 0x08010000L, +0x00010000L, 0x00000020L, 0x08000020L, 0x00010400L, +0x08000420L, 0x08010020L, 0x08010400L, 0x00000000L, +0x00010400L, 0x08000000L, 0x00010020L, 0x00000420L, +0x08000400L, 0x00010420L, 0x00000000L, 0x08000020L, +0x00000020L, 0x08000420L, 0x08010420L, 0x00010020L, +0x08010000L, 0x00000400L, 0x00000420L, 0x08010400L, +0x08010400L, 0x08000420L, 0x00010020L, 0x08010000L, +0x00010000L, 0x00000020L, 0x08000020L, 0x08000400L, +0x08000000L, 0x00010400L, 0x08010420L, 0x00000000L, +0x00010420L, 0x08000000L, 0x00000400L, 0x00010020L, +0x08000420L, 0x00000400L, 0x00000000L, 0x08010420L, +0x08010020L, 0x08010400L, 0x00000420L, 0x00010000L, +0x00010400L, 0x08010020L, 0x08000400L, 0x00000420L, +0x00000020L, 0x00010420L, 0x08010000L, 0x08000020L, +},{ +/* nibble 5 */ +0x80000040L, 0x00200040L, 0x00000000L, 0x80202000L, +0x00200040L, 0x00002000L, 0x80002040L, 0x00200000L, +0x00002040L, 0x80202040L, 0x00202000L, 0x80000000L, +0x80002000L, 0x80000040L, 0x80200000L, 0x00202040L, +0x00200000L, 0x80002040L, 0x80200040L, 0x00000000L, +0x00002000L, 0x00000040L, 0x80202000L, 0x80200040L, +0x80202040L, 0x80200000L, 0x80000000L, 0x00002040L, +0x00000040L, 0x00202000L, 0x00202040L, 0x80002000L, +0x00002040L, 0x80000000L, 0x80002000L, 0x00202040L, +0x80202000L, 0x00200040L, 0x00000000L, 0x80002000L, +0x80000000L, 0x00002000L, 0x80200040L, 0x00200000L, +0x00200040L, 0x80202040L, 0x00202000L, 0x00000040L, +0x80202040L, 0x00202000L, 0x00200000L, 0x80002040L, +0x80000040L, 0x80200000L, 0x00202040L, 0x00000000L, +0x00002000L, 0x80000040L, 0x80002040L, 0x80202000L, +0x80200000L, 0x00002040L, 0x00000040L, 0x80200040L, +},{ +/* nibble 6 */ +0x00004000L, 0x00000200L, 0x01000200L, 0x01000004L, +0x01004204L, 0x00004004L, 0x00004200L, 0x00000000L, +0x01000000L, 0x01000204L, 0x00000204L, 0x01004000L, +0x00000004L, 0x01004200L, 0x01004000L, 0x00000204L, +0x01000204L, 0x00004000L, 0x00004004L, 0x01004204L, +0x00000000L, 0x01000200L, 0x01000004L, 0x00004200L, +0x01004004L, 0x00004204L, 0x01004200L, 0x00000004L, +0x00004204L, 0x01004004L, 0x00000200L, 0x01000000L, +0x00004204L, 0x01004000L, 0x01004004L, 0x00000204L, +0x00004000L, 0x00000200L, 0x01000000L, 0x01004004L, +0x01000204L, 0x00004204L, 0x00004200L, 0x00000000L, +0x00000200L, 0x01000004L, 0x00000004L, 0x01000200L, +0x00000000L, 0x01000204L, 0x01000200L, 0x00004200L, +0x00000204L, 0x00004000L, 0x01004204L, 0x01000000L, +0x01004200L, 0x00000004L, 0x00004004L, 0x01004204L, +0x01000004L, 0x01004200L, 0x01004000L, 0x00004004L, +},{ +/* nibble 7 */ +0x20800080L, 0x20820000L, 0x00020080L, 0x00000000L, +0x20020000L, 0x00800080L, 0x20800000L, 0x20820080L, +0x00000080L, 0x20000000L, 0x00820000L, 0x00020080L, +0x00820080L, 0x20020080L, 0x20000080L, 0x20800000L, +0x00020000L, 0x00820080L, 0x00800080L, 0x20020000L, +0x20820080L, 0x20000080L, 0x00000000L, 0x00820000L, +0x20000000L, 0x00800000L, 0x20020080L, 0x20800080L, +0x00800000L, 0x00020000L, 0x20820000L, 0x00000080L, +0x00800000L, 0x00020000L, 0x20000080L, 0x20820080L, +0x00020080L, 0x20000000L, 0x00000000L, 0x00820000L, +0x20800080L, 0x20020080L, 0x20020000L, 0x00800080L, +0x20820000L, 0x00000080L, 0x00800080L, 0x20020000L, +0x20820080L, 0x00800000L, 0x20800000L, 0x20000080L, +0x00820000L, 0x00020080L, 0x20020080L, 0x20800000L, +0x00000080L, 0x20820000L, 0x00820080L, 0x00000000L, +0x20000000L, 0x20800080L, 0x00020000L, 0x00820080L, +}}; diff --git a/crypto/libdes/str2key.c b/crypto/libdes/str2key.c new file mode 100644 index 000000000000..e81f34817824 --- /dev/null +++ b/crypto/libdes/str2key.c @@ -0,0 +1,171 @@ +/* crypto/des/str2key.c */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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 "des_locl.h" + +extern int des_check_key; + +void des_string_to_key(str, key) +char *str; +des_cblock (*key); +	{ +	des_key_schedule ks; +	int i,length; +	register unsigned char j; + +	memset(key,0,8); +	length=strlen(str); +#ifdef OLD_STR_TO_KEY +	for (i=0; i<length; i++) +		(*key)[i%8]^=(str[i]<<1); +#else /* MIT COMPATIBLE */ +	for (i=0; i<length; i++) +		{ +		j=str[i]; +		if ((i%16) < 8) +			(*key)[i%8]^=(j<<1); +		else +			{ +			/* Reverse the bit order 05/05/92 eay */ +			j=((j<<4)&0xf0)|((j>>4)&0x0f); +			j=((j<<2)&0xcc)|((j>>2)&0x33); +			j=((j<<1)&0xaa)|((j>>1)&0x55); +			(*key)[7-(i%8)]^=j; +			} +		} +#endif +	des_set_odd_parity((des_cblock *)key); +	i=des_check_key; +	des_check_key=0; +	des_set_key((des_cblock *)key,ks); +	des_check_key=i; +	des_cbc_cksum((des_cblock *)str,(des_cblock *)key,(long)length,ks, +		(des_cblock *)key); +	memset(ks,0,sizeof(ks)); +	des_set_odd_parity((des_cblock *)key); +	} + +void des_string_to_2keys(str, key1, key2) +char *str; +des_cblock (*key1); +des_cblock (*key2); +	{ +	des_key_schedule ks; +	int i,length; +	register unsigned char j; + +	memset(key1,0,8); +	memset(key2,0,8); +	length=strlen(str); +#ifdef OLD_STR_TO_KEY +	if (length <= 8) +		{ +		for (i=0; i<length; i++) +			{ +			(*key2)[i]=(*key1)[i]=(str[i]<<1); +			} +		} +	else +		{ +		for (i=0; i<length; i++) +			{ +			if ((i/8)&1) +				(*key2)[i%8]^=(str[i]<<1); +			else +				(*key1)[i%8]^=(str[i]<<1); +			} +		} +#else /* MIT COMPATIBLE */ +	for (i=0; i<length; i++) +		{ +		j=str[i]; +		if ((i%32) < 16) +			{ +			if ((i%16) < 8) +				(*key1)[i%8]^=(j<<1); +			else +				(*key2)[i%8]^=(j<<1); +			} +		else +			{ +			j=((j<<4)&0xf0)|((j>>4)&0x0f); +			j=((j<<2)&0xcc)|((j>>2)&0x33); +			j=((j<<1)&0xaa)|((j>>1)&0x55); +			if ((i%16) < 8) +				(*key1)[7-(i%8)]^=j; +			else +				(*key2)[7-(i%8)]^=j; +			} +		} +	if (length <= 8) memcpy(key2,key1,8); +#endif +	des_set_odd_parity((des_cblock *)key1); +	des_set_odd_parity((des_cblock *)key2); +	i=des_check_key; +	des_check_key=0; +	des_set_key((des_cblock *)key1,ks); +	des_cbc_cksum((des_cblock *)str,(des_cblock *)key1,(long)length,ks, +		(des_cblock *)key1); +	des_set_key((des_cblock *)key2,ks); +	des_cbc_cksum((des_cblock *)str,(des_cblock *)key2,(long)length,ks, +		(des_cblock *)key2); +	des_check_key=i; +	memset(ks,0,sizeof(ks)); +	des_set_odd_parity(key1); +	des_set_odd_parity(key2); +	} diff --git a/crypto/libdes/supp.c b/crypto/libdes/supp.c new file mode 100644 index 000000000000..b8e8566b23e3 --- /dev/null +++ b/crypto/libdes/supp.c @@ -0,0 +1,109 @@ +/* crypto/des/supp.c */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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.] + */ + +/* + * Copyright (c) 1995 + *	Mark Murray.  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 acknowledgement: + *	This product includes software developed by Mark Murray + * 4. Neither the name of the author nor the names of any co-contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY MARK MURRAY AND CONTRIBUTORS ``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 REGENTS 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. + * + * $Id: supp.c,v 1.4 1997/06/22 10:14:07 bg Exp $ + */ + +#include <stdio.h> +#include "des_locl.h" + +void des_cblock_print_file(cb, fp) +	des_cblock *cb; +	FILE *fp; +{ +	int i; +	unsigned int *p = (unsigned int *)cb; + +	fprintf(fp, " 0x { "); +	for (i = 0; i < 8; i++) { +		fprintf(fp, "%x", p[i]); +		if (i != 7) fprintf(fp, ", "); +	} +	fprintf(fp, " }"); +} diff --git a/crypto/libdes/t/test b/crypto/libdes/t/test new file mode 100644 index 000000000000..97acd0552e43 --- /dev/null +++ b/crypto/libdes/t/test @@ -0,0 +1,27 @@ +#!./perl + +BEGIN { push(@INC, qw(../../../lib ../../lib ../lib lib)); } + +use DES; + +$key='00000000'; +$ks=DES::set_key($key); +@a=split(//,$ks); +foreach (@a) { printf "%02x-",ord($_); } +print "\n"; + + +$key=DES::random_key(); +print "($_)\n"; +@a=split(//,$key); +foreach (@a) { printf "%02x-",ord($_); } +print "\n"; +$str="this is and again into the breach"; +($k1,$k2)=DES::string_to_2keys($str); +@a=split(//,$k1); +foreach (@a) { printf "%02x-",ord($_); } +print "\n"; +@a=split(//,$k2); +foreach (@a) { printf "%02x-",ord($_); } +print "\n"; + diff --git a/crypto/libdes/testdes.pl b/crypto/libdes/testdes.pl new file mode 100755 index 000000000000..01a165a963d1 --- /dev/null +++ b/crypto/libdes/testdes.pl @@ -0,0 +1,167 @@ +#!/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/crypto/libdes/times b/crypto/libdes/times new file mode 100644 index 000000000000..f5080ef99c0f --- /dev/null +++ b/crypto/libdes/times @@ -0,0 +1,216 @@ +existing library on a DEC 3000/500 +set_key            per sec =    256294.06 (  3.9uS) +DES ecb bytes      per sec =   3553694.40 (  2.3uS) +DES cbc bytes      per sec =   3661004.80 (  2.2uS) +DES ede cbc bytes  per sec =   1353115.99 (  5.9uS) +crypt              per sec =     16829.40 ( 59.4uS) + +Intel P6/200 (NEXTSTEP) - cc -O3 (cc: gcc 2.5.8) +set_key            per sec =    219220.82 (  4.6uS) +DES ecb bytes      per sec =   2438014.04 (  3.3uS) +DES cbc bytes      per sec =   2467648.85 (  3.2uS) +DES ede cbc bytes  per sec =    942121.58 (  8.5uS) +crypt              per sec =     11398.73 ( 87.7uS) + +# DECstation Alpha 3000 Model 700 AXP / OSF1 V3.0 +# gcc 2.6.3 / Young libdes 3.21 +set_key            per sec =    149369.74 (  6.7uS) +DES ecb bytes      per sec =   2011976.68 (  4.0uS) +DES cbc bytes      per sec =   2002245.35 (  4.0uS) +DES ede cbc bytes  per sec =    793677.19 ( 10.1uS) +crypt              per sec =      9244.52 (108.2uS) + +# Sun Ultra I gcc 2.7.2 / Young libdes 3.21 +set_key            per sec =    147172.22 (  6.8uS) +DES ecb bytes      per sec =   1815054.70 (  4.4uS) +DES cbc bytes      per sec =   1829405.18 (  4.4uS) +DES ede cbc bytes  per sec =    714490.23 ( 11.2uS) +crypt              per sec =      8896.24 (112.4uS) + +SGI Challenge (MIPS R4400 200mhz) - gcc -O2 +set_key       per sec =    114141.13 (  8.8uS) +DES ecb bytes per sec =   1573472.84 (  5.1uS) +DES cbc bytes per sec =   1580418.20 (  5.1uS) +crypt         per sec =      7137.84 (140.1uS) + +DEC Alpha DEC  4000/710 AXP OSF/1 v 3.0 - gcc -O2 2.6.1 +set_key       per sec =    123138.49 (  8.1uS) +DES ecb bytes per sec =   1407546.76 (  5.7uS) +DES cbc bytes per sec =   1404103.21 (  5.7uS) +crypt         per sec =      7746.76 (129.1uS) + +DEC Alpha DEC  4000/710 AXP OSF/1 v 3.0 - cc -O4 'DEC Compiler Driver 3.11' +set_key       per sec =    135160.83 (  7.4uS) +DES ecb bytes per sec =   1267753.22 (  6.3uS) +DES cbc bytes per sec =   1260564.90 (  6.3uS) +crypt         per sec =      6479.37 (154.3uS) + +SGI Challenge (MIPS R4400 200mhz) - cc -O2 +set_key       per sec =    124000.10 (  8.1uS) +DES ecb bytes per sec =   1338138.45 (  6.0uS) +DES cbc bytes per sec =   1356515.84 (  5.9uS) +crypt         per sec =      6223.92 (160.7uS) + +Intel P5/133 (NEXTSTEP) - cc -O3 (cc: gcc 2.5.8) +set_key            per sec =     81923.10 ( 12.2uS) +DES ecb bytes      per sec =   1104711.61 (  7.2uS) +DES cbc bytes      per sec =   1091536.05 (  7.3uS) +DES ede cbc bytes  per sec =    410502.62 ( 19.5uS) +crypt              per sec =      4849.60 (206.2uS) + +Sun SPARC 20 (NEXTSTEP) - cc -O3 (cc: gcc 2.5.8) +set_key            per sec =     60973.05 ( 16.4uS) +DES ecb bytes      per sec =    806032.15 (  9.9uS) +DES cbc bytes      per sec =    801534.95 ( 10.0uS) +DES ede cbc bytes  per sec =    298799.73 ( 26.8uS) +crypt              per sec =      3678.42 (271.9uS) + +SGI Indy (MIPS R4600 133mhz) -cc -O2 +set_key       per sec =     88470.54 ( 11.3uS) +DES ecb bytes per sec =   1023040.33 (  7.8uS) +DES cbc bytes per sec =   1033610.01 (  7.7uS) +crypt         per sec =      4641.51 (215.4uS) + +HP-UX 9000/887 cc +O3 +set_key       per sec =     76824.30 ( 13.0uS) +DES ecb bytes per sec =   1048911.20 (  7.6uS) +DES cbc bytes per sec =   1072332.80 (  7.5uS) +crypt         per sec =      4968.64 (201.3uS) + +IRIX 5.2 IP22 (R4000) cc -O2 (galilo) +set_key       per sec =     60615.73 ( 16.5uS) +DES ecb bytes per sec =    584741.32 ( 13.7uS) +DES cbc bytes per sec =    584306.94 ( 13.7uS) +crypt         per sec =      3049.33 (327.9uS) + +HP-UX 9000/867 cc -O +set_key       per sec =     48600.00 ( 20.6uS) +DES ecb bytes per sec =    616235.14 ( 13.0uS) +DES cbc bytes per sec =    638669.44 ( 12.5uS) +crypt         per sec =      3016.68 (331.5uS) + +HP-UX 9000/867 gcc -O2 +set_key       per sec =     52120.50 ( 19.2uS) +DES ecb bytes per sec =    715156.55 ( 11.2uS) +DES cbc bytes per sec =    724424.28 ( 11.0uS) +crypt         per sec =      3295.87 (303.4uS) + +DGUX AViiON mc88110 gcc -O2 +set_key       per sec =     55604.91 ( 18.0uS) +DES ecb bytes per sec =    658513.25 ( 12.1uS) +DES cbc bytes per sec =    675552.71 ( 11.8uS) +crypt         per sec =      3438.10 (290.9uS) + +Sparc 10 cc -O2 (orb) +set_key       per sec =     53002.30 ( 18.9uS) +DES ecb bytes per sec =    705250.40 ( 11.3uS) +DES cbc bytes per sec =    714342.40 ( 11.2uS) +crypt         per sec =      2943.99 (339.7uS) + +Sparc 10 gcc -O2 (orb) +set_key       per sec =     58681.21 ( 17.0uS) +DES ecb bytes per sec =    772390.20 ( 10.4uS) +DES cbc bytes per sec =    774144.00 ( 10.3uS) +crypt         per sec =      3606.90 (277.2uS) + +DEC Alpha DEC  4000/610 AXP OSF/1 v 1.3 - gcc v 2.3.3 +set_key       per sec =    101840.19 (  9.8uS) +DES ecb bytes per sec =   1223712.35 (  6.5uS) +DES cbc bytes per sec =   1230542.98 (  6.5uS) +crypt         per sec =      6428.75 (155.6uS) + +DEC Alpha DEC 4000/610 APX OSF/1 v 1.3 - cc -O2 - OSF/1 AXP +set_key       per sec =    114198.91 (  8.8uS) +DES ecb bytes per sec =   1022710.93 (  7.8uS) +DES cbc bytes per sec =   1008821.93 (  7.9uS) +crypt         per sec =      5454.13 (183.3uS) + +DEC Alpha - DEC 3000/500 AXP OSF/1 - cc -O2 - 02/12/92 +set_key       per sec =     83587.04 ( 12.0uS) +DES ecb bytes per sec =    822620.82 (  9.7uS) +DES cbc bytes per sec =    832929.60 (  9.6uS) +crypt         per sec =      4807.62 (208.0uS) + +sun sparc 10/30 - gcc -O2 +set_key       per sec =     42005.24 ( 23.8uS) +DES ecb bytes per sec =    555949.47 ( 14.4uS) +DES cbc bytes per sec =    549440.28 ( 14.6uS) +crypt         per sec =      2580.25 (387.6uS) + +PA-RISC 1.1 HP 710 +set_key       per sec =     38916.86 +DES ecb bytes per sec =    505971.82 +DES cbc bytes per sec =    515381.13 +crypt         per sec =      2438.24 + +iris (spike) cc -O2 +set_key       per sec =     23128.83 ( 43.2uS) +DES ecb bytes per sec =    261577.94 ( 30.6uS) +DES cbc bytes per sec =    261746.41 ( 30.6uS) +crypt         per sec =      1231.76 (811.8uS) + +sun sparc 10/30 - cc -O4 +set_key       per sec =     38379.86 ( 26.1uS) +DES ecb bytes per sec =    460051.34 ( 17.4uS) +DES cbc bytes per sec =    464970.54 ( 17.2uS) +crypt         per sec =      2092.64 (477.9uS) + +sun sparc 2 - gcc2 -O2 +set_key       per sec =     21559.10 +DES ecb bytes per sec =    305566.92 +DES cbc bytes per sec =    303497.50 +crypt         per sec =      1410.48 + +RS/6000 model 320 +set_key       per sec =     14371.93 +DES ecb bytes per sec =    222231.26 +DES cbc bytes per sec =    223926.79 +crypt         per sec =       981.20 + +80486dx/66MHz Solaris 2.1 - gcc -O2 (gcc 2.6.3) +set_key       per sec =     26814.15 ( 37.3uS) +DES ecb bytes per sec =    345029.95 ( 23.2uS) +DES cbc bytes per sec =    344064.00 ( 23.3uS) +crypt         per sec =      1551.97 (644.3uS) + +80486dx/50MHz Solaris 2.1 - gcc -O2 (gcc 2.5.2) +set_key       per sec =     18558.29 ( 53.9uS) +DES ecb bytes per sec =    240873.90 ( 33.2uS) +DES cbc bytes per sec =    239993.37 ( 33.3uS) +crypt         per sec =      1073.67 (931.4uS) + +80486dx/50MHz Solaris 2.1 - cc -xO4 (cc: PC2.0.1 30 April 1993) +set_key       per sec =     18302.79 ( 54.6uS) +DES ecb bytes per sec =    242640.29 ( 33.0uS) +DES cbc bytes per sec =    239568.89 ( 33.4uS) +crypt         per sec =      1057.92 (945.2uS) + +68030 HP400 +set_key       per sec =      5251.28 +DES ecb bytes per sec =     56186.56 +DES cbc bytes per sec =     58681.53 +crypt         per sec =       276.15 + +80486sx/33MHz MSDOS Turbo C v 2.0 +set_key       per sec =      1883.22 (531.0uS) +DES ecb bytes per sec =     63393.31 (126.2uS) +DES cbc bytes per sec =     63416.83 (126.1uS) +crypt         per sec =       158.71 (6300.6uS) + +80486sx/33MHz MSDOS djgpp gcc 1.39 (32bit compiler) +set_key       per sec =     12603.08 (79.3) +DES ecb bytes per sec =    158875.15 (50.4) +DES cbc bytes per sec =    159893.85 (50.0) +crypt         per sec =       780.24 (1281.7) + +Version 1.99 26/08/92 +8MHz 68000 Atari-ST gcc 2.1 -O2 MiNT 0.94 +set_key       per sec =       325.68 (3070.5uS) +DES ecb bytes per sec =      4173.67 (1916.8uS) +DES cbc bytes per sec =      4249.89 (1882.4uS) +crypt         per sec =        20.19 (49521.6uS) + +8088/4.77mh MSDOS Turbo C v 2.0 +set_key       per sec =        35.09 +DES ecb bytes per sec =       563.63 +crypt         per sec =         2.69 diff --git a/crypto/libdes/typemap b/crypto/libdes/typemap new file mode 100644 index 000000000000..a524f53634e7 --- /dev/null +++ b/crypto/libdes/typemap @@ -0,0 +1,34 @@ +# +# DES SECTION +# +deschar *	T_DESCHARP +des_cblock *	T_CBLOCK +des_cblock	T_CBLOCK +des_key_schedule	T_SCHEDULE +des_key_schedule *	T_SCHEDULE + +INPUT +T_CBLOCK +	$var=(des_cblock *)SvPV($arg,len); +	if (len < DES_KEY_SZ) +		{ +		croak(\"$var needs to be at least %u bytes long\",DES_KEY_SZ); +		} + +T_SCHEDULE +	$var=(des_key_schedule *)SvPV($arg,len); +	if (len < DES_SCHEDULE_SZ) +		{ +		croak(\"$var needs to be at least %u bytes long\", +			DES_SCHEDULE_SZ); +		} + +OUTPUT +T_CBLOCK +	sv_setpvn($arg,(char *)$var,DES_KEY_SZ); + +T_SCHEDULE +	sv_setpvn($arg,(char *)$var,DES_SCHEDULE_SZ); + +T_DESCHARP +	sv_setpvn($arg,(char *)$var,len); diff --git a/crypto/libdes/version.h b/crypto/libdes/version.h new file mode 100644 index 000000000000..aee11903f308 --- /dev/null +++ b/crypto/libdes/version.h @@ -0,0 +1,48 @@ +/* lib/des/version.h */ +/* Copyright (C) 1995 Eric Young (eay@mincom.oz.au) + * All rights reserved. + *  + * This file is part of an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * The implementation was written so as to conform with Netscapes SSL + * specification.  This library and applications are + * FREE FOR COMMERCIAL AND NON-COMMERCIAL USE + * as long as the following conditions are aheared to. + *  + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed.  If this code is used in a product, + * Eric Young should be given attribution as the author of the parts 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 software developed by Eric Young (eay@mincom.oz.au) + *  + * 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.] + */ + +extern char *DES_version; diff --git a/crypto/libdes/vms.com b/crypto/libdes/vms.com new file mode 100644 index 000000000000..885ea8e36b50 --- /dev/null +++ b/crypto/libdes/vms.com @@ -0,0 +1,90 @@ +$! --- VMS.com --- +$! +$ GoSub defines +$ GoSub linker_options +$ If (P1 .nes. "") +$ Then  +$   GoSub 'P1' +$ Else +$   GoSub lib +$   GoSub destest +$   GoSub rpw +$   GoSub speed +$   GoSub des +$ EndIF +$! +$ Exit +$! +$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +$! +$DEFINES: +$ OPT_FILE := "VAX_LINKER_OPTIONS.OPT" +$! +$ CC_OPTS := "/NODebug/OPTimize/NOWarn" +$! +$ LINK_OPTS := "/NODebug/NOTraceback/Contiguous" +$! +$ OBJS  = "cbc_cksm.obj,cbc_enc.obj,ecb_enc.obj,pcbc_enc.obj," + - +          "qud_cksm.obj,rand_key.obj,read_pwd.obj,set_key.obj,"      + - +          "str2key.obj,enc_read.obj,enc_writ.obj,fcrypt.obj,"           + - +	  "cfb_enc.obj,3ecb_enc.obj,ofb_enc.obj" +	    +	    +$! +$ LIBDES = "cbc_cksm.c,cbc_enc.c,ecb_enc.c,enc_read.c,"           + - +           "enc_writ.c,pcbc_enc.c,qud_cksm.c,rand_key.c,"         + - +           "read_pwd.c,set_key.c,str2key.c,fcrypt.c,"                + - +	   "cfb_enc.c,3ecb_enc.c,ofb_enc.c" +$ Return +$! +$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +$! +$LINKER_OPTIONS: +$ If (f$search(OPT_FILE) .eqs. "") +$ Then +$   Create 'OPT_FILE' +$DECK +! Default system options file to link against the sharable C runtime library +! +Sys$Share:VAXcRTL.exe/Share +$EOD +$ EndIF +$ Return +$! +$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +$! +$LIB: +$ CC 'CC_OPTS' 'LIBDES' +$ If (f$search("LIBDES.OLB") .nes. "") +$ Then Library /Object /Replace libdes 'OBJS' +$ Else Library /Create /Object  libdes 'OBJS' +$ EndIF +$ Return +$! +$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +$! +$DESTEST: +$ CC 'CC_OPTS' destest +$ Link 'link_opts' /Exec=destest destest.obj,libdes/LIBRARY,'opt_file'/Option +$ Return +$! +$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +$! +$RPW: +$ CC 'CC_OPTS' rpw +$ Link 'link_opts' /Exec=rpw  rpw.obj,libdes/LIBRARY,'opt_file'/Option +$ Return +$! +$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +$! +$SPEED: +$ CC 'CC_OPTS' speed +$ Link 'link_opts' /Exec=speed speed.obj,libdes/LIBRARY,'opt_file'/Option +$ Return +$! +$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +$! +$DES: +$ CC 'CC_OPTS' des +$ Link 'link_opts' /Exec=des des.obj,libdes/LIBRARY,'opt_file'/Option +$ Return diff --git a/crypto/libdes/xcbc_enc.c b/crypto/libdes/xcbc_enc.c new file mode 100644 index 000000000000..6a8626171dfb --- /dev/null +++ b/crypto/libdes/xcbc_enc.c @@ -0,0 +1,206 @@ +/* crypto/des/xcbc_enc.c */ +/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@mincom.oz.au). + * 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@mincom.oz.au). + *  + * 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@mincom.oz.au)" + *    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@mincom.oz.au)" + *  + * 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 "des_locl.h" + +/* RSA's DESX */ + +static unsigned char desx_white_in2out[256]={ +0xBD,0x56,0xEA,0xF2,0xA2,0xF1,0xAC,0x2A,0xB0,0x93,0xD1,0x9C,0x1B,0x33,0xFD,0xD0, +0x30,0x04,0xB6,0xDC,0x7D,0xDF,0x32,0x4B,0xF7,0xCB,0x45,0x9B,0x31,0xBB,0x21,0x5A, +0x41,0x9F,0xE1,0xD9,0x4A,0x4D,0x9E,0xDA,0xA0,0x68,0x2C,0xC3,0x27,0x5F,0x80,0x36, +0x3E,0xEE,0xFB,0x95,0x1A,0xFE,0xCE,0xA8,0x34,0xA9,0x13,0xF0,0xA6,0x3F,0xD8,0x0C, +0x78,0x24,0xAF,0x23,0x52,0xC1,0x67,0x17,0xF5,0x66,0x90,0xE7,0xE8,0x07,0xB8,0x60, +0x48,0xE6,0x1E,0x53,0xF3,0x92,0xA4,0x72,0x8C,0x08,0x15,0x6E,0x86,0x00,0x84,0xFA, +0xF4,0x7F,0x8A,0x42,0x19,0xF6,0xDB,0xCD,0x14,0x8D,0x50,0x12,0xBA,0x3C,0x06,0x4E, +0xEC,0xB3,0x35,0x11,0xA1,0x88,0x8E,0x2B,0x94,0x99,0xB7,0x71,0x74,0xD3,0xE4,0xBF, +0x3A,0xDE,0x96,0x0E,0xBC,0x0A,0xED,0x77,0xFC,0x37,0x6B,0x03,0x79,0x89,0x62,0xC6, +0xD7,0xC0,0xD2,0x7C,0x6A,0x8B,0x22,0xA3,0x5B,0x05,0x5D,0x02,0x75,0xD5,0x61,0xE3, +0x18,0x8F,0x55,0x51,0xAD,0x1F,0x0B,0x5E,0x85,0xE5,0xC2,0x57,0x63,0xCA,0x3D,0x6C, +0xB4,0xC5,0xCC,0x70,0xB2,0x91,0x59,0x0D,0x47,0x20,0xC8,0x4F,0x58,0xE0,0x01,0xE2, +0x16,0x38,0xC4,0x6F,0x3B,0x0F,0x65,0x46,0xBE,0x7E,0x2D,0x7B,0x82,0xF9,0x40,0xB5, +0x1D,0x73,0xF8,0xEB,0x26,0xC7,0x87,0x97,0x25,0x54,0xB1,0x28,0xAA,0x98,0x9D,0xA5, +0x64,0x6D,0x7A,0xD4,0x10,0x81,0x44,0xEF,0x49,0xD6,0xAE,0x2E,0xDD,0x76,0x5C,0x2F, +0xA7,0x1C,0xC9,0x09,0x69,0x9A,0x83,0xCF,0x29,0x39,0xB9,0xE9,0x4C,0xFF,0x43,0xAB, +	}; + +void des_xwhite_in2out(des_key,in_white,out_white) +des_cblock (*des_key); +des_cblock (*in_white); +des_cblock (*out_white); +	{ +	unsigned char *key,*in,*out; +	int out0,out1; +	int i; + +	key=(unsigned char *)des_key; +	in=(unsigned char *)in_white; +	out=(unsigned char *)out_white; + +	out[0]=out[1]=out[2]=out[3]=out[4]=out[5]=out[6]=out[7]=0; +	out0=out1=0; +	for (i=0; i<8; i++) +		{ +		out[i]=key[i]^desx_white_in2out[out0^out1]; +		out0=out1; +		out1=(int)out[i&0x07]; +		} + +	out0=out[0]; +	out1=out[i]; +	for (i=0; i<8; i++) +		{ +		out[i]=in[i]^desx_white_in2out[out0^out1]; +		out0=out1; +		out1=(int)out[i&0x07]; +		} +	} + +void des_xcbc_encrypt(input, output, length, schedule, ivec, inw,outw,encrypt) +des_cblock (*input); +des_cblock (*output); +long length; +des_key_schedule schedule; +des_cblock (*ivec); +des_cblock (*inw); +des_cblock (*outw); +int encrypt; +	{ +	register DES_LONG tin0,tin1; +	register DES_LONG tout0,tout1,xor0,xor1; +	register DES_LONG inW0,inW1,outW0,outW1; +	register unsigned char *in,*out; +	register long l=length; +	DES_LONG tin[2]; +	unsigned char *iv; + +	in=(unsigned char *)inw; +	c2l(in,inW0); +	c2l(in,inW1); +	in=(unsigned char *)outw; +	c2l(in,outW0); +	c2l(in,outW1); + +	in=(unsigned char *)input; +	out=(unsigned char *)output; +	iv=(unsigned char *)ivec; + +	if (encrypt) +		{ +		c2l(iv,tout0); +		c2l(iv,tout1); +		for (l-=8; l>=0; l-=8) +			{ +			c2l(in,tin0); +			c2l(in,tin1); +			tin0^=tout0^inW0; tin[0]=tin0; +			tin1^=tout1^inW1; tin[1]=tin1; +			des_encrypt((DES_LONG *)tin,schedule,DES_ENCRYPT); +			tout0=tin[0]^outW0; l2c(tout0,out); +			tout1=tin[1]^outW1; l2c(tout1,out); +			} +		if (l != -8) +			{ +			c2ln(in,tin0,tin1,l+8); +			tin0^=tout0^inW0; tin[0]=tin0; +			tin1^=tout1^inW1; tin[1]=tin1; +			des_encrypt((DES_LONG *)tin,schedule,DES_ENCRYPT); +			tout0=tin[0]^outW0; l2c(tout0,out); +			tout1=tin[1]^outW1; l2c(tout1,out); +			} +		iv=(unsigned char *)ivec; +		l2c(tout0,iv); +		l2c(tout1,iv); +		} +	else +		{ +		c2l(iv,xor0); +		c2l(iv,xor1); +		for (l-=8; l>0; l-=8) +			{ +			c2l(in,tin0); tin[0]=tin0^outW0; +			c2l(in,tin1); tin[1]=tin1^outW1; +			des_encrypt((DES_LONG *)tin,schedule,DES_DECRYPT); +			tout0=tin[0]^xor0^inW0; +			tout1=tin[1]^xor1^inW1; +			l2c(tout0,out); +			l2c(tout1,out); +			xor0=tin0; +			xor1=tin1; +			} +		if (l != -8) +			{ +			c2l(in,tin0); tin[0]=tin0^outW0; +			c2l(in,tin1); tin[1]=tin1^outW1; +			des_encrypt((DES_LONG *)tin,schedule,DES_DECRYPT); +			tout0=tin[0]^xor0^inW0; +			tout1=tin[1]^xor1^inW1; +			l2cn(tout0,tout1,out,l+8); +			xor0=tin0; +			xor1=tin1; +			} + +		iv=(unsigned char *)ivec; +		l2c(xor0,iv); +		l2c(xor1,iv); +		} +	tin0=tin1=tout0=tout1=xor0=xor1=0; +	inW0=inW1=outW0=outW1=0; +	tin[0]=tin[1]=0; +	} +  | 
