Merged in libdes3.21-branch

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@473 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Assar Westerlund
1996-05-04 04:44:52 +00:00
parent d2aa6baa26
commit 6961a4a341
63 changed files with 8297 additions and 3326 deletions

50
lib/des/COPYRIGHT Normal file
View File

@@ -0,0 +1,50 @@
Copyright (C) 1995 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.

19
lib/des/DES.pm Normal file
View File

@@ -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__

16
lib/des/DES.pod Normal file
View File

@@ -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)

268
lib/des/DES.xs Normal file
View File

@@ -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);
}

View File

@@ -1,19 +1,21 @@
/* General stuff */ /* General stuff */
CHANGES - Changes since the last posting to comp.sources.misc. COPYRIGHT - Copyright info.
ARTISTIC - Copying info.
COPYING - Copying info.
MODES.DES - A description of the features of the different modes of DES. MODES.DES - A description of the features of the different modes of DES.
FILES - This file. FILES - This file.
INSTALL - How to make things compile. INSTALL - How to make things compile.
Imakefile - For use with kerberos. Imakefile - For use with kerberos.
README - What this package is. README - What this package is.
VERSION - Which version this is. VERSION - Which version this is and what was changed.
KERBEROS - Kerberos version 4 notes. KERBEROS - Kerberos version 4 notes.
makefile - The make file. Makefile.PL - An old makefile to build with perl5, not current.
times - Some outputs from 'speed' on my local machines. 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 vms.com - For use when compiling under VMS
/* My sunOS des(1) replacement */ /* My SunOS des(1) replacement */
des.c - des(1) source code. des.c - des(1) source code.
des.man - des(1) manual. des.man - des(1) manual.
@@ -26,12 +28,23 @@ rpw.c - Source for libdes.a testing password reading routines.
des_crypt.man - libdes.a manual page. des_crypt.man - libdes.a manual page.
des.h - Public libdes.a header file. des.h - Public libdes.a header file.
ecb_enc.c - des_ecb_encrypt() source, this contains the basic DES code. ecb_enc.c - des_ecb_encrypt() source, this contains the basic DES code.
3ecb_enc.c - des_3ecb_encrypt() source. ecb3_enc.c - des_ecb3_encrypt() source.
cbc_ckm.c - des_cbc_cksum() source. cbc_ckm.c - des_cbc_cksum() source.
cbc_enc.c - des_cbc_encrypt() source. cbc_enc.c - des_cbc_encrypt() source.
3cbc_enc.c - des_3cbc_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. 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. 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_read.c - des_enc_read() source.
enc_writ.c - des_enc_write() source. enc_writ.c - des_enc_write() source.
pcbc_enc.c - des_pcbc_encrypt() source. pcbc_enc.c - des_pcbc_encrypt() source.
@@ -45,6 +58,9 @@ des_locl.h - Internal libdes.a header file.
podd.h - Odd parity tables - used in des_set_key(). podd.h - Odd parity tables - used in des_set_key().
sk.h - Lookup 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(). spr.h - What is left of the S tables - used in ecb_encrypt().
version.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 /* The perl scripts - you can ignore these files they are only
* included for the curious */ * included for the curious */
@@ -58,3 +74,23 @@ PC1 - Output of doPC1 should be the same as output from PC1.
PC2 - used in development of doPC2. PC2 - used in development of doPC2.
shifts.pl - Perl library used by my perl scripts. 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

35
lib/des/GNUmakefile Normal file
View File

@@ -0,0 +1,35 @@
# This was GNUmakefile
# I have changed the library a bit since I was last able to test the
# build so this may require a little tweaking.
# have fun.
ifeq ($(wildcard ../Rules),)
# no glibc
include Makefile.uni
else
# We are part of glibc
default_cflags:= -O2
subdir := des
headers:= des.h rpc_des.h
routines:= $(destest)
cbc3_enc cbc_cksm cbc_enc cfb64enc cfb_enc \
ecb3_enc ecb_enc ede_enc enc_read enc_writ \
fcrypt ncbc_enc ofb64enc ofb_enc pcbc_enc \
qud_cksm rand_key read_pwd rpc_enc set_key \
str2key cfb64ede ofb64ede supp
distribute:= ARTISTIC COPYRIGHT FILES INSTALL Imakefile README VERSION \
GNUmakefile times vms.com KERBEROS MODES.DES \
des.man des_crypt.man \
version.h des_locl.h podd.h sk.h spr.h \
des.pl testdes.pl doIP doPC1 doPC2 PC1 PC2 shifts.pl \
des.doc makefile.bc
tests:= destest speed
override +gccwarn := -w
others:= des rpw
install:= des
include ../Rules
endif

View File

@@ -5,10 +5,10 @@ If your C library does not support the times(3) function, change the
#undef TIMES in speed.c #undef TIMES in speed.c
If it does, check the HZ value for the times(3) function. 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 If your system does not define CLK_TCK it will be assumed to
be 60. be 100.0.
If possible use gcc v 2.2.2 If possible use gcc v 2.7.?
Turn on the maximum optimising Turn on the maximum optimising (normally '-O3 -fomit-frame-pointer' for gcc)
type 'make' type 'make'
@@ -46,8 +46,12 @@ limitations of DOS compilers :-(.
For Turbo C v 2.0, make sure to define MSDOS, in the relevant menu. For Turbo C v 2.0, make sure to define MSDOS, in the relevant menu.
There is an alternative version of the D_ENCRYPT macro that can be There is an alternative version of the D_ENCRYPT macro that can be
enabled with the -DALT_ECB option in the makefile. This alternative enabled with the -DDES_USE_PTR option in the makefile. This alternative
macro can make a +-%20 speed difference to the DES encryption speed, macro can make a +-%20 speed difference to the DES encryption speed,
depending on the compiler/CPU combinations. depending on the compiler/CPU combinations.
It has its greatest effect on Sparc machines when using the sun compiler. It has its greatest effect on Sparc machines when using the sun compiler.
If in doubt, try enable/disable it and running speed. If in doubt, try enable/disable it and running speed. It does not
seem to affect gcc much.
When building for glibc, ignore all of the above and just unpack into
glibc-1.??/des and then gmake as per normal.

35
lib/des/Imakefile Normal file
View File

@@ -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 \
3ecb_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 \
3ecb_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,)

View File

@@ -1,3 +1,6 @@
[ 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): To use this library with Bones (kerberos without DES):
1) Get my modified Bones - eBones. It can be found on 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 gondwana.ecr.mu.oz.au (128.250.1.63) /pub/athena/eBones-p9.tar.Z

View File

@@ -69,7 +69,7 @@ Output Feedback Mode (OFB) (des_ofb_encrypt())
different from the start variable values used before with the same different from the start variable values used before with the same
key. The reason for this is that an identical bit stream would be key. The reason for this is that an identical bit stream would be
produced each time from the same parameters. This would be produced each time from the same parameters. This would be
susceptible to a ' known plaintext' attack. susceptible to a 'known plaintext' attack.
Triple ECB Mode (des_3ecb_encrypt()) Triple ECB Mode (des_3ecb_encrypt())
- Encrypt with key1, decrypt with key2 and encrypt with key1 again. - Encrypt with key1, decrypt with key2 and encrypt with key1 again.

149
lib/des/Makefile Normal file
View File

@@ -0,0 +1,149 @@
# 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.
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
# This #define specifies the use of an alternative D_ENCRYPT macro in
# ecb_encrypt. The choice of macro can make a %20 difference in the
# speed. Unfortunatly the choise of the best macro appears to be very
# dependant on the compiler and the machine in question.
# For the following combinations use the ALT_ECB option.
# Sparc 2 (cc -O4), sun 3/260 (cc -O4)
# For the following combinations do not use the ALT_ECB option.
# Sparc 2 (gcc2 -O2), sun 3/260 (cc -O2), mvax2 (cc -O), MSDOS (Turbo Cv2)
# For other machines, experiment with changing the option and run
# ./speed to see which is faster.
# DO NOT TURN THIS OPTION ON WHEN COMPILING THIS CODE ON A 64 BIT MACHINE
#OPTS2= -DDES_USE_PTR
OPTS= $(OPTS0) $(OPTS1) $(OPTS2)
#CC=cc
#CFLAGS= -O $(OPTS) $(CFLAG)
CC=gcc
CFLAGS= -O3 -fomit-frame-pointer $(OPTS) $(CFLAG)
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
GENERAL=COPYRIGHT FILES INSTALL Imakefile README VERSION Makefile \
times vms.com KERBEROS MODES.DES GNUmakefile des.man \
DES.pm DES.pod DES.xs Makefile.PL Makefile.uni typemap t \
des_crypt.man Makefile.ssl des.doc makefile.bc
DES= des.c
TESTING=destest.c speed.c rpw.c
HEADERS=version.h des.h des_locl.h podd.h sk.h spr.h rpc_des.h
LIBDES= cbc3_enc.c cbc_cksm.c cbc_enc.c ncbc_enc.c pcbc_enc.c qud_cksm.c \
cfb64ede.c cfb64enc.c cfb_enc.c ecb3_enc.c ecb_enc.c ede_enc.c \
enc_read.c enc_writ.c fcrypt.c ofb64ede.c ofb64enc.c ofb_enc.c \
rand_key.c read_pwd.c set_key.c rpc_enc.c str2key.c supp.c
PERL= des.pl testdes.pl doIP doPC1 doPC2 PC1 PC2 shifts.pl
ALL= $(GENERAL) $(DES) $(TESTING) $(LIBDES) $(PERL) $(HEADERS)
DLIB= libdes.a
all: $(DLIB) destest rpw des speed
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
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:
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 speed
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.

14
lib/des/Makefile.PL Normal file
View File

@@ -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',
);

View File

@@ -30,35 +30,13 @@ LIBEXT = @LIBEXT@
SHLIBEXT = @SHLIBEXT@ SHLIBEXT = @SHLIBEXT@
LIB = $(LIBNAME).$(LIBEXT) LIB = $(LIBNAME).$(LIBEXT)
SOURCES = cfb_enc.c \ # Generated with lorder *.o | tsort | xargs echo
cbc_enc.c \
fcrypt.c \
key_par.c \
ofb_enc.c \
pcbc_enc.c \
qud_cksm.c \
read_pwd.c \
rnd_keys.c \
str2key.c \
cbc_cksm.c \
ecb_enc.c \
set_key.c
OBJECTS = cfb_enc.o \ LIBSRC = cbc3_enc.c cbc_enc.c cfb64ede.c cfb64enc.c cfb_enc.c ecb3_enc.c ede_enc.c fcrypt.c key_par.c ncbc_enc.c ofb64ede.c ofb64enc.c ofb_enc.c pcbc_enc.c qud_cksm.c read_pwd.c rnd_keys.c str2key.c cbc_cksm.c ecb_enc.c set_key.c
cbc_enc.o \
fcrypt.o \
key_par.o \
ofb_enc.o \
pcbc_enc.o \
qud_cksm.o \
read_pwd.o \
rnd_keys.o \
str2key.o \
cbc_cksm.o \
ecb_enc.o \
set_key.o
all: $(LIB) LIBOBJ = cbc3_enc.o cbc_enc.o cfb64ede.o cfb64enc.o cfb_enc.o ecb3_enc.o ede_enc.o fcrypt.o key_par.o ncbc_enc.o ofb64ede.o ofb64enc.o ofb_enc.o pcbc_enc.o qud_cksm.o read_pwd.o rnd_keys.o str2key.o cbc_cksm.o ecb_enc.o set_key.o
all: $(LIB) destest
Wall: Wall:
make CFLAGS="-g -Wall -Wmissing-prototypes -Wmissing-declarations -D__USE_FIXED_PROTOTYPES__" make CFLAGS="-g -Wall -Wmissing-prototypes -Wmissing-declarations -D__USE_FIXED_PROTOTYPES__"
@@ -66,16 +44,20 @@ Wall:
.c.o: .c.o:
$(CC) -c $(CPPFLAGS) $(DEFS) -I../.. -I../../include -I$(srcdir) -I$(srcdir)/../../include $(CFLAGS) $(PICFLAGS) $< $(CC) -c $(CPPFLAGS) $(DEFS) -I../.. -I../../include -I$(srcdir) -I$(srcdir)/../../include $(CFLAGS) $(PICFLAGS) $<
destest.o: destest.c
$(CC) -c $(CPPFLAGS) $(DEFS) -I../.. -I../../include -I$(srcdir) -I$(srcdir)/../../include $(CFLAGS) $<
install: all install: all
$(MKDIRHIER) $(prefix)/lib $(MKDIRHIER) $(libdir)
$(INSTALL_DATA) $(LIB) $(libdir) $(INSTALL) -m 0555 $(LIB) $(libdir)
uninstall: uninstall:
TAGS: $(SOURCES) TAGS: $(LIBSRC)
etags $(SOURCES) etags $(LIBSRC)
check: check: ./destest
./destest
clean: clean:
rm -f $(LIB) *.o *.a rm -f $(LIB) *.o *.a
@@ -95,13 +77,16 @@ dist: $(DISTFILES)
|| cp -p $$file ../`cat ../.fname`/lib; \ || cp -p $$file ../`cat ../.fname`/lib; \
done done
$(LIBNAME).a: $(OBJECTS) $(LIBNAME).a: $(LIBOBJ)
rm -f $@ rm -f $@
$(AR) cr $@ $(OBJECTS) $(AR) cr $@ $(LIBOBJ)
-$(RANLIB) $@ -$(RANLIB) $@
$(LIBNAME).$(SHLIBEXT): $(OBJECTS) $(LIBNAME).$(SHLIBEXT): $(LIBOBJ)
rm -f $@ rm -f $@
$(CC) $(CFLAGS) $(PICFLAGS) -shared -o $@ $(OBJECTS) $(CC) $(CFLAGS) $(PICFLAGS) -shared -o $@ $(LIBOBJ)
$(OBJECTS): ../../config.h destest: destest.o
$(CC) $(CFLAGS) destest.o -o $@ -L. -ldes
$(LIBOBJ): ../../config.h

187
lib/des/Makefile.ssl Normal file
View File

@@ -0,0 +1,187 @@
#
# SSLeay/crypto/des/Makefile
#
DIR= des
TOP= ../..
CC= cc
INCLUDES=
CFLAG=-g
INSTALLTOP=/usr/local/ssl
MAKE= make -f Makefile.ssl
MAKEDEPEND= makedepend -fMakefile.ssl
MAKEFILE= Makefile.ssl
CFLAGS= $(INCLUDES) $(CFLAG)
GENERAL=Makefile
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 \
str2key.c cfb64ede.c ofb64ede.c supp.c
LIBOBJ= cbc3_enc.o cbc_cksm.o cbc_enc.o cfb64enc.o cfb_enc.o \
ecb3_enc.o ecb_enc.o ede_enc.o enc_read.o enc_writ.o \
fcrypt.o ncbc_enc.o ofb64enc.o ofb_enc.o pcbc_enc.o \
qud_cksm.o rand_key.o read_pwd.o rpc_enc.o set_key.o \
str2key.o cfb64ede.o ofb64ede.o supp.o
SRC= $(LIBSRC)
EXHEADER= des.h
HEADER= des_locl.h rpc_des.h podd.h sk.h spr.h version.h $(EXHEADER)
ALL= $(GENERAL) $(SRC) $(HEADER)
top:
(cd ../..; $(MAKE) DIRS=crypto SDIRS=$(DIR) sub_all)
all: lib
lib: $(LIBOBJ)
ar r $(LIB) $(LIBOBJ)
$(TOP)/util/ranlib.sh $(LIB)
@touch lib
links:
/bin/rm -f Makefile
ln -s Makefile.ssl Makefile
/bin/rm -f des.doc
ln -s ../../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 -DPROTO $(INCLUDES) $(SRC)>fluff
depend:
$(MAKEDEPEND) $(INCLUDES) $(PROGS) $(LIBSRC)
dclean:
sed -e '/^# DO NOT DELETE THIS LINE/ q' $(MAKEFILE) >Makefile.new
mv -f Makefile.new $(MAKEFILE)
clean:
/bin/rm -f *.o *.obj lib tags core .nfs* *.old *.bak fluff
errors:
# DO NOT DELETE THIS LINE -- make depend depends on it.
cbc3_enc.o: des_locl.h /usr/include/stdio.h /usr/include/sys/feature_tests.h
cbc3_enc.o: /usr/include/stdlib.h /usr/include/unistd.h
cbc3_enc.o: /usr/include/sys/types.h /usr/include/sys/machtypes.h
cbc3_enc.o: /usr/include/sys/unistd.h des.h
cbc_cksm.o: des_locl.h /usr/include/stdio.h /usr/include/sys/feature_tests.h
cbc_cksm.o: /usr/include/stdlib.h /usr/include/unistd.h
cbc_cksm.o: /usr/include/sys/types.h /usr/include/sys/machtypes.h
cbc_cksm.o: /usr/include/sys/unistd.h des.h
cbc_enc.o: des_locl.h /usr/include/stdio.h /usr/include/sys/feature_tests.h
cbc_enc.o: /usr/include/stdlib.h /usr/include/unistd.h
cbc_enc.o: /usr/include/sys/types.h /usr/include/sys/machtypes.h
cbc_enc.o: /usr/include/sys/unistd.h des.h
cfb64enc.o: des_locl.h /usr/include/stdio.h /usr/include/sys/feature_tests.h
cfb64enc.o: /usr/include/stdlib.h /usr/include/unistd.h
cfb64enc.o: /usr/include/sys/types.h /usr/include/sys/machtypes.h
cfb64enc.o: /usr/include/sys/unistd.h des.h
cfb_enc.o: des_locl.h /usr/include/stdio.h /usr/include/sys/feature_tests.h
cfb_enc.o: /usr/include/stdlib.h /usr/include/unistd.h
cfb_enc.o: /usr/include/sys/types.h /usr/include/sys/machtypes.h
cfb_enc.o: /usr/include/sys/unistd.h des.h
ecb3_enc.o: des_locl.h /usr/include/stdio.h /usr/include/sys/feature_tests.h
ecb3_enc.o: /usr/include/stdlib.h /usr/include/unistd.h
ecb3_enc.o: /usr/include/sys/types.h /usr/include/sys/machtypes.h
ecb3_enc.o: /usr/include/sys/unistd.h des.h
ecb_enc.o: des_locl.h /usr/include/stdio.h /usr/include/sys/feature_tests.h
ecb_enc.o: /usr/include/stdlib.h /usr/include/unistd.h
ecb_enc.o: /usr/include/sys/types.h /usr/include/sys/machtypes.h
ecb_enc.o: /usr/include/sys/unistd.h des.h spr.h
ede_enc.o: des_locl.h /usr/include/stdio.h /usr/include/sys/feature_tests.h
ede_enc.o: /usr/include/stdlib.h /usr/include/unistd.h
ede_enc.o: /usr/include/sys/types.h /usr/include/sys/machtypes.h
ede_enc.o: /usr/include/sys/unistd.h des.h
enc_read.o: /usr/include/stdio.h /usr/include/sys/feature_tests.h
enc_read.o: /usr/include/errno.h /usr/include/sys/errno.h des_locl.h
enc_read.o: /usr/include/stdlib.h /usr/include/unistd.h
enc_read.o: /usr/include/sys/types.h /usr/include/sys/machtypes.h
enc_read.o: /usr/include/sys/unistd.h des.h
enc_writ.o: /usr/include/errno.h /usr/include/sys/errno.h /usr/include/time.h
enc_writ.o: /usr/include/sys/feature_tests.h des_locl.h /usr/include/stdio.h
enc_writ.o: /usr/include/stdlib.h /usr/include/unistd.h
enc_writ.o: /usr/include/sys/types.h /usr/include/sys/machtypes.h
enc_writ.o: /usr/include/sys/unistd.h des.h
fcrypt.o: /usr/include/stdio.h /usr/include/sys/feature_tests.h
ncbc_enc.o: des_locl.h /usr/include/stdio.h /usr/include/sys/feature_tests.h
ncbc_enc.o: /usr/include/stdlib.h /usr/include/unistd.h
ncbc_enc.o: /usr/include/sys/types.h /usr/include/sys/machtypes.h
ncbc_enc.o: /usr/include/sys/unistd.h des.h
ofb64enc.o: des_locl.h /usr/include/stdio.h /usr/include/sys/feature_tests.h
ofb64enc.o: /usr/include/stdlib.h /usr/include/unistd.h
ofb64enc.o: /usr/include/sys/types.h /usr/include/sys/machtypes.h
ofb64enc.o: /usr/include/sys/unistd.h des.h
ofb_enc.o: des_locl.h /usr/include/stdio.h /usr/include/sys/feature_tests.h
ofb_enc.o: /usr/include/stdlib.h /usr/include/unistd.h
ofb_enc.o: /usr/include/sys/types.h /usr/include/sys/machtypes.h
ofb_enc.o: /usr/include/sys/unistd.h des.h
pcbc_enc.o: des_locl.h /usr/include/stdio.h /usr/include/sys/feature_tests.h
pcbc_enc.o: /usr/include/stdlib.h /usr/include/unistd.h
pcbc_enc.o: /usr/include/sys/types.h /usr/include/sys/machtypes.h
pcbc_enc.o: /usr/include/sys/unistd.h des.h
qud_cksm.o: des_locl.h /usr/include/stdio.h /usr/include/sys/feature_tests.h
qud_cksm.o: /usr/include/stdlib.h /usr/include/unistd.h
qud_cksm.o: /usr/include/sys/types.h /usr/include/sys/machtypes.h
qud_cksm.o: /usr/include/sys/unistd.h des.h
rand_key.o: des_locl.h /usr/include/stdio.h /usr/include/sys/feature_tests.h
rand_key.o: /usr/include/stdlib.h /usr/include/unistd.h
rand_key.o: /usr/include/sys/types.h /usr/include/sys/machtypes.h
rand_key.o: /usr/include/sys/unistd.h des.h /usr/include/time.h
read_pwd.o: des_locl.h /usr/include/stdio.h /usr/include/sys/feature_tests.h
read_pwd.o: /usr/include/stdlib.h /usr/include/unistd.h
read_pwd.o: /usr/include/sys/types.h /usr/include/sys/machtypes.h
read_pwd.o: /usr/include/sys/unistd.h des.h /usr/include/signal.h
read_pwd.o: /usr/include/sys/signal.h /usr/include/string.h
read_pwd.o: /usr/include/setjmp.h /usr/include/sys/ioctl.h
rpc_enc.o: rpc_des.h des_locl.h /usr/include/stdio.h
rpc_enc.o: /usr/include/sys/feature_tests.h /usr/include/stdlib.h
rpc_enc.o: /usr/include/unistd.h /usr/include/sys/types.h
rpc_enc.o: /usr/include/sys/machtypes.h /usr/include/sys/unistd.h des.h
rpc_enc.o: version.h
set_key.o: des_locl.h /usr/include/stdio.h /usr/include/sys/feature_tests.h
set_key.o: /usr/include/stdlib.h /usr/include/unistd.h
set_key.o: /usr/include/sys/types.h /usr/include/sys/machtypes.h
set_key.o: /usr/include/sys/unistd.h des.h podd.h sk.h
str2key.o: des_locl.h /usr/include/stdio.h /usr/include/sys/feature_tests.h
str2key.o: /usr/include/stdlib.h /usr/include/unistd.h
str2key.o: /usr/include/sys/types.h /usr/include/sys/machtypes.h
str2key.o: /usr/include/sys/unistd.h des.h
cfb64ede.o: des_locl.h /usr/include/stdio.h /usr/include/sys/feature_tests.h
cfb64ede.o: /usr/include/stdlib.h /usr/include/unistd.h
cfb64ede.o: /usr/include/sys/types.h /usr/include/sys/machtypes.h
cfb64ede.o: /usr/include/sys/unistd.h des.h
ofb64ede.o: des_locl.h /usr/include/stdio.h /usr/include/sys/feature_tests.h
ofb64ede.o: /usr/include/stdlib.h /usr/include/unistd.h
ofb64ede.o: /usr/include/sys/types.h /usr/include/sys/machtypes.h
ofb64ede.o: /usr/include/sys/unistd.h des.h
supp.o: /usr/include/stdio.h /usr/include/sys/feature_tests.h des_locl.h
supp.o: /usr/include/stdlib.h /usr/include/unistd.h /usr/include/sys/types.h
supp.o: /usr/include/sys/machtypes.h /usr/include/sys/unistd.h des.h

149
lib/des/Makefile.uni Normal file
View File

@@ -0,0 +1,149 @@
# 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.
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
# This #define specifies the use of an alternative D_ENCRYPT macro in
# ecb_encrypt. The choice of macro can make a %20 difference in the
# speed. Unfortunatly the choise of the best macro appears to be very
# dependant on the compiler and the machine in question.
# For the following combinations use the ALT_ECB option.
# Sparc 2 (cc -O4), sun 3/260 (cc -O4)
# For the following combinations do not use the ALT_ECB option.
# Sparc 2 (gcc2 -O2), sun 3/260 (cc -O2), mvax2 (cc -O), MSDOS (Turbo Cv2)
# For other machines, experiment with changing the option and run
# ./speed to see which is faster.
# DO NOT TURN THIS OPTION ON WHEN COMPILING THIS CODE ON A 64 BIT MACHINE
#OPTS2= -DDES_USE_PTR
OPTS= $(OPTS0) $(OPTS1) $(OPTS2)
#CC=cc
#CFLAGS= -O $(OPTS) $(CFLAG)
CC=gcc
CFLAGS= -O3 -fomit-frame-pointer $(OPTS) $(CFLAG)
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
GENERAL=COPYRIGHT FILES INSTALL Imakefile README VERSION Makefile \
times vms.com KERBEROS MODES.DES GNUmakefile des.man \
DES.pm DES.pod DES.xs Makefile.PL Makefile.uni typemap t \
des_crypt.man Makefile.ssl des.doc makefile.bc
DES= des.c
TESTING=destest.c speed.c rpw.c
HEADERS=version.h des.h des_locl.h podd.h sk.h spr.h rpc_des.h
LIBDES= cbc3_enc.c cbc_cksm.c cbc_enc.c ncbc_enc.c pcbc_enc.c qud_cksm.c \
cfb64ede.c cfb64enc.c cfb_enc.c ecb3_enc.c ecb_enc.c ede_enc.c \
enc_read.c enc_writ.c fcrypt.c ofb64ede.c ofb64enc.c ofb_enc.c \
rand_key.c read_pwd.c set_key.c rpc_enc.c str2key.c supp.c
PERL= des.pl testdes.pl doIP doPC1 doPC2 PC1 PC2 shifts.pl
ALL= $(GENERAL) $(DES) $(TESTING) $(LIBDES) $(PERL) $(HEADERS)
DLIB= libdes.a
all: $(DLIB) destest rpw des speed
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
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:
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 speed
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.

View File

@@ -1,35 +1,26 @@
libdes, Version 3.00 93/10/07 libdes, Version 3.21 21/11/95
Copyright (c) 1993, Eric Young Copyright (c) 1995, Eric Young
All rights reserved. All rights reserved.
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of either: it under the terms specified in COPYRIGHT.
a) the GNU General Public License as published by the Free --
Software Foundation; either version 1, or (at your option) any The primary ftp site for this library is
later version, or 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.xx.tar.gz
b) the "Artistic License" which comes with this Kit. The best way to build this library is to build it as part of SSLeay.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See either
the GNU General Public License or the Artistic License for more details.
You should have received a copy of the Artistic License with this
Kit, in the file named "Artistic". If not, I'll be glad to provide one.
You should also have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
---
This kit builds a DES encryption library and a DES encryption program. This kit builds a DES encryption library and a DES encryption program.
It suports ecb, cbc, ofb, cfb, triple ecb, triple cbc and MIT's pcbc It supports ecb, cbc, ofb, cfb, triple ecb, triple cbc, triple ofb,
encryption modes and also has a fast implementation of crypt(3). triple cfb, 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, It contains support routines to read keys from a terminal,
generate a random key, generate a key from an arbitary length string, generate a random key, generate a key from an arbitrary length string,
read/write encrypted data from/to a file descriptor. read/write encrypted data from/to a file descriptor.
The implementation was written so as to conform with the manual entry The implementation was written so as to conform with the manual entry
@@ -51,6 +42,6 @@ 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. routines that use small lookup tables (4.5k) that are publicly available.
The fcrypt routine is faster than ufc's fcrypt (when compiling with 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 gcc2 -O2) on the sparc 2 (1410 vs 1270) but is not so good on other machines
(on a sun3/260 168 vs 336). (on a sun3/260 168 vs 336). It is a function of CPU on chip cache size.
Eric Young (eay@psych.psy.uq.oz.au) Eric Young (eay@mincom.oz.au or eay@psych.psy.uq.oz.au)

View File

@@ -1,13 +1,140 @@
Release apon comp.sources.misc 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 Version 3.01 08/10/93
Added des_3cbc_encrypt() Added des_3cbc_encrypt()
Version 3.00 07/10/93 Version 3.00 07/10/93
Fixed up documentation. Fixed up documentation.
quad_cksum definitly compatable with MIT's now. quad_cksum definitely compatible with MIT's now.
Version 2.30 24/08/93 Version 2.30 24/08/93
Tripple DES now defaults to tripple cbc but can do tripple ecb Triple DES now defaults to triple cbc but can do triple ecb
with the -b flag. with the -b flag.
Fixed some MSDOS uuen/uudecoding problems, thanks to Fixed some MSDOS uuen/uudecoding problems, thanks to
Added prototypes. Added prototypes.
@@ -19,13 +146,13 @@ Version 2.22 29/06/93
Version 2.21 03/06/93 Version 2.21 03/06/93
des(1) with no arguments gives quite a bit of help. des(1) with no arguments gives quite a bit of help.
Added -c (generate ckecksum) flag to des(1). Added -c (generate ckecksum) flag to des(1).
Added -3 (tripple DES) flag to des(1). Added -3 (triple DES) flag to des(1).
Added cfb and ofb routines to the library. Added cfb and ofb routines to the library.
Version 2.20 11/03/93 Version 2.20 11/03/93
Added -u (uuencode) flag to des(1). Added -u (uuencode) flag to des(1).
I have been playing with byte order in quad_cksum to make it I have been playing with byte order in quad_cksum to make it
compatible with MIT's version. All I can say is aviod this compatible with MIT's version. All I can say is avid this
function if possible since MIT's output is endian dependent. function if possible since MIT's output is endian dependent.
Version 2.12 14/10/92 Version 2.12 14/10/92
@@ -158,7 +285,7 @@ Version 1.51 07/06/1991 eay
Fixed bug in quad_cksum.c (thanks to hughes@logos.ucs.indiana.edu) Fixed bug in quad_cksum.c (thanks to hughes@logos.ucs.indiana.edu)
Version 1.50 28/05/1991 eay Version 1.50 28/05/1991 eay
Optimized the code a bit more for the sparc. I have improved the 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 speed of the inner des_encrypt by speeding up the initial and
final permutations. final permutations.

88
lib/des/cbc3_enc.c Normal file
View File

@@ -0,0 +1,88 @@
/* lib/des/cbc3_enc.c */
/* 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.]
*/
#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=(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));
}

View File

@@ -1,45 +1,92 @@
/* cbc_cksm.c */ /* lib/des/cbc_cksm.c */
/* Copyright (C) 1993 Eric Young - see README for more details */ /* 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.]
*/
#include "des_locl.h" #include "des_locl.h"
u_int32_t des_cbc_cksum(des_cblock (*input), des_cblock (*output), long int length, struct des_ks_struct *schedule, des_cblock (*ivec)) unsigned long des_cbc_cksum(input, output, length, schedule, ivec)
{ des_cblock (*input);
register u_int32_t tout0,tout1,tin0,tin1; des_cblock (*output);
register long l=length; long length;
u_int32_t tin[2],tout[2]; des_key_schedule schedule;
unsigned char *in,*out,*iv; des_cblock (*ivec);
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); register unsigned long tout0,tout1,tin0,tin1;
c2l(in,tin1); register long l=length;
} unsigned long tin[2];
else unsigned char *in,*out,*iv;
c2ln(in,tin0,tin1,l);
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; tin0^=tout0; tin[0]=tin0;
tin1^=tout1; tin1^=tout1; tin[1]=tin1;
tin[0]=tin0; des_encrypt((unsigned long *)tin,schedule,DES_ENCRYPT);
tin[1]=tin1; /* fix 15/10/91 eay - thanks to keithr@sco.COM */
des_encrypt(tin,tout, tout0=tin[0];
schedule,DES_ENCRYPT); tout1=tin[1];
/* fix 15/10/91 eay - thanks to keithr@sco.COM */ }
tout0=tout[0]; if (out != NULL)
tout1=tout[1]; {
} l2c(tout0,out);
if (out != NULL) l2c(tout1,out);
{ }
l2c(tout0,out); tout0=tin0=tin1=tin[0]=tin[1]=0;
l2c(tout1,out); return(tout1);
} }
tout0=tin0=tin1=tin[0]=tin[1]=tout[0]=tout[1]=0;
return(tout1);
}

View File

@@ -1,72 +1,114 @@
/* cbc_enc.c */ /* lib/des/cbc_enc.c */
/* Copyright (C) 1993 Eric Young - see README for more details */ /* 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.]
*/
#include "des_locl.h" #include "des_locl.h"
int des_cbc_encrypt(des_cblock (*input), des_cblock (*output), long int length, struct des_ks_struct *schedule, des_cblock (*ivec), int encrypt) void des_cbc_encrypt(input, output, length, schedule, ivec, encrypt)
{ des_cblock (*input);
register u_int32_t tin0,tin1; des_cblock (*output);
register u_int32_t tout0,tout1,xor0,xor1; long length;
register unsigned char *in,*out; des_key_schedule schedule;
register long l=length; des_cblock (*ivec);
u_int32_t tout[2],tin[2]; int encrypt;
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>0; l-=8)
{ {
if (l >= 8) register unsigned long tin0,tin1;
{ register unsigned long tout0,tout1,xor0,xor1;
c2l(in,tin0); register unsigned char *in,*out;
c2l(in,tin1); register long l=length;
} unsigned long tin[2];
else unsigned char *iv;
c2ln(in,tin0,tin1,l);
tin0^=tout0; in=(unsigned char *)input;
tin1^=tout1; out=(unsigned char *)output;
tin[0]=tin0; iv=(unsigned char *)ivec;
tin[1]=tin1;
des_encrypt(tin,tout, if (encrypt)
schedule,encrypt); {
tout0=tout[0]; c2l(iv,tout0);
tout1=tout[1]; c2l(iv,tout1);
l2c(tout0,out); for (; l>0; l-=8)
l2c(tout1,out); {
} if (l >= 8)
} {
else c2l(in,tin0);
{ c2l(in,tin1);
c2l(iv,xor0); }
c2l(iv,xor1); else
for (; l>0; l-=8) c2ln(in,tin0,tin1,l);
{ tin0^=tout0; tin[0]=tin0;
c2l(in,tin0); tin1^=tout1; tin[1]=tin1;
c2l(in,tin1); des_encrypt((unsigned long *)tin,schedule,DES_ENCRYPT);
tin[0]=tin0; tout0=tin[0]; l2c(tout0,out);
tin[1]=tin1; tout1=tin[1]; l2c(tout1,out);
des_encrypt(tin,tout, }
schedule,encrypt); }
tout0=tout[0]^xor0; else
tout1=tout[1]^xor1; {
if (l >= 8) c2l(iv,xor0);
{ c2l(iv,xor1);
l2c(tout0,out); for (; l>0; l-=8)
l2c(tout1,out); {
} c2l(in,tin0); tin[0]=tin0;
else c2l(in,tin1); tin[1]=tin1;
l2cn(tout0,tout1,out,l); des_encrypt((unsigned long *)tin,schedule,DES_DECRYPT);
xor0=tin0; tout0=tin[0]^xor0;
xor1=tin1; tout1=tin[1]^xor1;
} if (l >= 8)
} {
tin0=tin1=tout0=tout1=xor0=xor1=0; l2c(tout0,out);
tin[0]=tin[1]=tout[0]=tout[1]=0; l2c(tout1,out);
return(0); }
} else
l2cn(tout0,tout1,out,l);
xor0=tin0;
xor1=tin1;
}
}
tin0=tin1=tout0=tout1=xor0=xor1=0;
tin[0]=tin[1]=0;
}

152
lib/des/cfb64ede.c Normal file
View File

@@ -0,0 +1,152 @@
/* lib/des/cfb64enc.c */
/* 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.]
*/
#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 unsigned long v0,v1;
register long l=length,n=*num;
unsigned 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);
IP(v0,v1);
ti[0]=v0;
ti[1]=v1;
des_encrypt2((unsigned long *)ti,ks1,DES_ENCRYPT);
des_encrypt2((unsigned long *)ti,ks2,DES_DECRYPT);
des_encrypt2((unsigned long *)ti,ks3,DES_ENCRYPT);
v0=ti[0];
v1=ti[1];
FP(v1,v0);
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);
IP(v0,v1);
ti[0]=v0;
ti[1]=v1;
des_encrypt2((unsigned long *)ti,ks1,DES_ENCRYPT);
des_encrypt2((unsigned long *)ti,ks2,DES_DECRYPT);
des_encrypt2((unsigned long *)ti,ks3,DES_ENCRYPT);
v0=ti[0];
v1=ti[1];
FP(v1,v0);
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

116
lib/des/cfb64enc.c Normal file
View File

@@ -0,0 +1,116 @@
/* lib/des/cfb64enc.c */
/* 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.]
*/
#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 unsigned long v0,v1;
register long l=length,n=*num;
unsigned 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((unsigned 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((unsigned 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;
}

View File

@@ -1,5 +1,50 @@
/* cfb_enc.c */ /* lib/des/cfb_enc.c */
/* Copyright (C) 1993 Eric Young - see README for more details */ /* 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.]
*/
#include "des_locl.h" #include "des_locl.h"
/* The input and output are loaded in multiples of 8 bits. /* The input and output are loaded in multiples of 8 bits.
@@ -8,92 +53,108 @@
* the second. The second 12 bits will come from the 3rd and half the 4th * the second. The second 12 bits will come from the 3rd and half the 4th
* byte. * byte.
*/ */
int des_cfb_encrypt(unsigned char *in, unsigned char *out, int numbits, long int length, struct des_ks_struct *schedule, des_cblock (*ivec), int encrypt) void des_cfb_encrypt(in, out, numbits, length, schedule, ivec, encrypt)
{ unsigned char *in;
register u_int32_t d0,d1,v0,v1,n=(numbits+7)/8; unsigned char *out;
register u_int32_t mask0,mask1; int numbits;
register long l=length; long length;
register int num=numbits; des_key_schedule schedule;
u_int32_t ti[2],to[2]; des_cblock (*ivec);
unsigned char *iv; int encrypt;
if (num > 64) return(0);
if (num > 32)
{
mask0=0xffffffff;
if (num == 64)
mask1=mask0;
else
mask1=(1L<<(num-32))-1;
}
else
{
if (num == 32)
mask0=0xffffffff;
else
mask0=(1L<<num)-1;
mask1=0x00000000;
}
iv=(unsigned char *)ivec;
c2l(iv,v0);
c2l(iv,v1);
if (encrypt)
{
while (l-- > 0)
{ {
ti[0]=v0; register unsigned long d0,d1,v0,v1,n=(numbits+7)/8;
ti[1]=v1; register unsigned long mask0,mask1;
des_encrypt(ti,to, register unsigned long l=length;
schedule,DES_ENCRYPT); register int num=numbits;
c2ln(in,d0,d1,n); unsigned long ti[2];
in+=n; unsigned char *iv;
d0=(d0^to[0])&mask0;
d1=(d1^to[1])&mask1; if (num > 64) return;
l2cn(d0,d1,out,n); if (num > 32)
out+=n; {
if (num > 32) mask0=0xffffffffL;
{ if (num == 64)
v0=((v1>>(num-32))|(d0<<(64-num)))&0xffffffff; mask1=mask0;
v1=((d0>>(num-32))|(d1<<(64-num)))&0xffffffff; else mask1=(1L<<(num-32))-1;
} }
else else
{ {
v0=((v0>>num)|(v1<<(32-num)))&0xffffffff; if (num == 32)
v1=((v1>>num)|(d0<<(32-num)))&0xffffffff; mask0=0xffffffffL;
} else mask0=(1L<<num)-1;
} mask1=0x00000000;
} }
else
{ iv=(unsigned char *)ivec;
while (l-- > 0) c2l(iv,v0);
{ c2l(iv,v1);
ti[0]=v0; if (encrypt)
ti[1]=v1; {
des_encrypt(ti,to, while (l >= n)
schedule,DES_ENCRYPT); {
c2ln(in,d0,d1,n); l-=n;
in+=n; ti[0]=v0;
if (num > 32) ti[1]=v1;
{ des_encrypt((unsigned long *)ti,schedule,DES_ENCRYPT);
v0=((v1>>(num-32))|(d0<<(64-num)))&0xffffffff; c2ln(in,d0,d1,n);
v1=((d0>>(num-32))|(d1<<(64-num)))&0xffffffff; in+=n;
} d0=(d0^ti[0])&mask0;
else d1=(d1^ti[1])&mask1;
{ l2cn(d0,d1,out,n);
v0=((v0>>num)|(v1<<(32-num)))&0xffffffff; out+=n;
v1=((v1>>num)|(d0<<(32-num)))&0xffffffff; /* 30-08-94 - eay - changed because l>>32 and
} * l<<32 are bad under gcc :-( */
d0=(d0^to[0])&mask0; if (num == 32)
d1=(d1^to[1])&mask1; { v0=v1; v1=d0; }
l2cn(d0,d1,out,n); else if (num == 64)
out+=n; { v0=d0; v1=d1; }
} else if (num > 32) /* && num != 64 */
} {
iv=(unsigned char *)ivec; v0=((v1>>(num-32))|(d0<<(64-num)))&0xffffffffL;
l2c(v0,iv); v1=((d0>>(num-32))|(d1<<(64-num)))&0xffffffffL;
l2c(v1,iv); }
v0=v1=d0=d1=ti[0]=ti[1]=to[0]=to[1]=0; else /* num < 32 */
return(0); {
} 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((unsigned 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;
}

File diff suppressed because it is too large Load Diff

472
lib/des/des.doc Normal file
View File

@@ -0,0 +1,472 @@
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_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 needs to be a multiple of 8 bits. Length is the
number of bytes input.
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 *crypt(
const char *buf,
const char *salt);
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.
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.

View File

@@ -1,10 +1,54 @@
/* des.h */ /* lib/des/des.h */
/* Copyright (C) 1993 Eric Young - see README for more details */ /* Copyright (C) 1995 Eric Young (eay@mincom.oz.au)
#ifndef DES_DEFS * All rights reserved.
#define DES_DEFS *
* 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.]
*/
#include <sys/bitypes.h> #ifndef HEADER_DES_H
#include <sys/cdefs.h> #define HEADER_DES_H
#include <stdio.h>
typedef unsigned char des_cblock[8]; typedef unsigned char des_cblock[8];
typedef struct des_ks_struct typedef struct des_ks_struct
@@ -13,19 +57,33 @@ typedef struct des_ks_struct
des_cblock _; des_cblock _;
/* make sure things are correct size on machines with /* make sure things are correct size on machines with
* 8 byte longs */ * 8 byte longs */
u_int32_t pad[2]; unsigned long pad[2];
} ks; } ks;
#undef _
#define _ ks._ #define _ ks._
} des_key_schedule[16]; } des_key_schedule[16];
#define DES_KEY_SZ (sizeof(des_cblock)) #define DES_KEY_SZ (sizeof(des_cblock))
#define DES_SCHEDULE_SZ (sizeof(des_key_schedule))
#define DES_ENCRYPT 1 #define DES_ENCRYPT 1
#define DES_DECRYPT 0 #define DES_DECRYPT 0
#define DES_CBC_MODE 0 #define DES_CBC_MODE 0
#define DES_PCBC_MODE 1 #define DES_PCBC_MODE 1
#if !defined(NCOMPAT) #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 C_Block des_cblock
#define Key_schedule des_key_schedule #define Key_schedule des_key_schedule
#define ENCRYPT DES_ENCRYPT #define ENCRYPT DES_ENCRYPT
@@ -39,51 +97,151 @@ typedef struct des_ks_struct
#define key_sched des_key_sched #define key_sched des_key_sched
#define ecb_encrypt des_ecb_encrypt #define ecb_encrypt des_ecb_encrypt
#define cbc_encrypt des_cbc_encrypt #define cbc_encrypt des_cbc_encrypt
#define ncbc_encrypt des_ncbc_encrypt
#define cbc_cksum des_cbc_cksum #define cbc_cksum des_cbc_cksum
#define quad_cksum des_quad_cksum #define quad_cksum des_quad_cksum
/* For compatibility with the MIT lib - eay 20/05/92 */ /* For compatibility with the MIT lib - eay 20/05/92 */
typedef struct des_ks_struct bit_64; typedef struct des_key_schedule bit_64;
#endif #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_check_key; /* defaults to false */
extern int des_rw_mode; /* defaults to DES_PCBC_MODE */ extern int des_rw_mode; /* defaults to DES_PCBC_MODE */
int des_3ecb_encrypt __P((des_cblock *input,des_cblock *output,des_key_schedule ks1,des_key_schedule ks2,int encrypt)); /* The next line is used to disable full ANSI prototypes, if your
int des_3cbc_encrypt __P((des_cblock *input,des_cblock *output,long length,des_key_schedule sk1,des_key_schedule sk2,des_cblock *ivec1,des_cblock *ivec2,int encrypt)); * compiler has problems with the prototypes, make sure this line always
u_int32_t des_cbc_cksum __P((des_cblock *input,des_cblock *output,long length,des_key_schedule schedule,des_cblock *ivec)); * evaluates to true :-) */
int des_cbc_encrypt __P((des_cblock *input,des_cblock *output,long length,des_key_schedule schedule,des_cblock *ivec,int encrypt)); #if defined(MSDOS) || defined(__STDC__)
int des_cfb_encrypt __P((unsigned char *in,unsigned char *out,int numbits,long length,des_key_schedule schedule,des_cblock *ivec,int encrypt)); #undef PROTO
int des_ecb_encrypt __P((des_cblock *input,des_cblock *output,des_key_schedule ks,int encrypt)); #define PROTO
int des_encrypt __P((u_int32_t *input,u_int32_t *output,des_key_schedule ks, int encrypt)); #endif
int des_enc_read __P((int fd,char *buf,int len,des_key_schedule sched,des_cblock *iv)); #ifdef PROTO
int des_enc_write __P((int fd,char *buf,int len,des_key_schedule sched,des_cblock *iv)); void des_ecb3_encrypt(des_cblock *input,des_cblock *output,
int des_ofb_encrypt __P((unsigned char *in,unsigned char *out,int numbits,long length,des_key_schedule schedule,des_cblock *ivec)); des_key_schedule ks1,des_key_schedule ks2,
int des_pcbc_encrypt __P((des_cblock *input,des_cblock *output,long length,des_key_schedule schedule,des_cblock *ivec,int encrypt)); des_key_schedule ks3, int enc);
unsigned 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_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(unsigned long *data,des_key_schedule ks, int enc);
void des_encrypt2(unsigned long *data,des_key_schedule ks, int enc);
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);
void des_set_odd_parity __P((des_cblock *key)); int des_enc_read(int fd,char *buf,int len,des_key_schedule sched,
int des_is_weak_key __P((des_cblock *key)); des_cblock *iv);
int des_set_key __P((des_cblock *key,des_key_schedule schedule)); int des_enc_write(int fd,char *buf,int len,des_key_schedule sched,
int des_key_sched __P((des_cblock *key,des_key_schedule schedule)); des_cblock *iv);
#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);
unsigned 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);
int des_string_to_key __P((char *str,des_cblock *key)); /* Extra functions from Mark Murray <mark@grondar.za> */
int des_string_to_2keys __P((char *str,des_cblock *key1,des_cblock *key2)); 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);
void des_rand_data __P((unsigned char *data, int size)); #else
void des_generate_random_block __P((des_cblock *block));
void des_set_random_generator_seed __P((des_cblock *seed));
int des_new_random_key __P((des_cblock *key));
void des_init_random_number_generator __P((des_cblock *seed));
void des_set_sequence_number __P((unsigned char *ll));
int des_random_key __P((des_cblock ret));
int des_read_password __P((des_cblock *key,char *prompt,int verify));
int des_read_2passwords __P((des_cblock *key1,des_cblock *key2,char *prompt,int verify));
int des_read_pw_string __P((char *buf,int length,char *prompt,int verify));
u_int32_t des_quad_cksum __P((des_cblock *input,des_cblock *output,long length,int out_count,des_cblock *seed)); void des_ecb3_encrypt();
unsigned long des_cbc_cksum();
void des_cbc_encrypt();
void des_ncbc_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_ede3_cbc_encrypt();
int des_enc_read();
int des_enc_write();
#ifdef PERL5
char *des_crypt();
#else
char *crypt();
#endif
void des_ofb_encrypt();
void des_pcbc_encrypt();
unsigned 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();
/* MIT Link and source compatibility */ /* Extra functions from Mark Murray <mark@grondar.za> */
void des_fixup_key_parity __P((des_cblock *key)); void des_cblock_print_file();
#define des_fixup_key_parity des_set_odd_parity /* 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();
#endif /* DES_DEFS */ #endif
#endif

View File

@@ -183,5 +183,4 @@ 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. to uuencode the data before it is send to the VMS system.
.SH AUTHOR .SH AUTHOR
.LP .LP
Eric Young (eay@psych.psy.uq.oz.au), Psychology Department, Eric Young (eay@mincom.oz.au or eay@psych.psy.uq.oz.au)
University of Queensland, Australia.

View File

@@ -1,6 +1,6 @@
#!/usr/local/bin/perl #!/usr/local/bin/perl
# Copyright (C) 1993 Eric Young # Copyright (C) 1993 Eric Young
# des.pl - eric young 22/11/1991 eay@psych.psy.uq.oz.au # des.pl - eric young 22/11/1991 eay@mincom.oz.au or eay@psych.psy.uq.oz.au
# eay - 92/08/31 - I think I have fixed all problems for 64bit # 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 :-). # versions of perl but I could be wrong since I have not tested it yet :-).
# #
@@ -452,7 +452,7 @@ sub doFP
sub main'des_ecb_encrypt sub main'des_ecb_encrypt
{ {
local(*ks,$encrypt,$in)=@_; local(*ks,$encrypt,$in)=@_;
local($l,$r,$inc,$start,$end,$i,$t,$u,@input); local($l,$r,$i,$t,$u,@input);
@input=unpack("C8",$in); @input=unpack("C8",$in);
# Get the bytes in the order we want. # Get the bytes in the order we want.

View File

@@ -496,7 +496,13 @@ of fun ways to implement one-way encryption of a text string.
.PP .PP
The routines are optimised for 32 bit machines and so are not efficient The routines are optimised for 32 bit machines and so are not efficient
on IBM PCs. 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 .SH AUTHOR
Eric Young (eay@psych.psy.uq.oz.au), Eric Young (eay@mincom.oz.au or eay@psych.psy.uq.oz.au)
Psychology Department,
University of Queensland, Australia.

View File

@@ -1,24 +1,127 @@
/* des_locl.h */ #ifdef HAVE_CONFIG_H
/* Copyright (C) 1993 Eric Young - see README for more details */
#ifndef __des_locl_h
#define __des_locl_h
#include "config.h" #include "config.h"
#include "protos.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 */
/* lib/des/des_locl.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.]
*/
#ifndef HEADER_DES_LOCL_H
#define HEADER_DES_LOCL_H
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <sys/types.h> #ifndef MSDOS
#include <memory.h>
#include <unistd.h> #include <unistd.h>
#include <sys/stat.h> #endif
#include <fcntl.h>
#include <time.h>
#include "des.h" #include "des.h"
/* the following is tweaked from a config script, that is why it is a
* protected undef/define */
#ifndef DES_USE_PTR
#undef DES_USE_PTR
#endif
#ifdef MSDOS /* Visual C++ 2.1 (Windows NT/95) */
#include <stdlib.h>
#include <time.h>
#include <io.h>
#define RAND
#undef PROTO
#define PROTO
#endif
#if defined(__STDC__) || defined(VMS) || defined(M_XENIX) || defined(MSDOS)
#include <string.h>
#endif
#ifndef RAND
#define RAND
#endif
#ifdef MSDOS
#define getpid() 2
extern int errno;
#define RAND
#undef PROTO
#define PROTO
#endif
#if defined(NOCONST)
#define const
#endif
#ifdef __STDC__
#undef PROTO
#define PROTO
#endif
#ifdef RAND
#define srandom(s) srand(s)
#define random rand
#endif
#define ITERATIONS 16 #define ITERATIONS 16
#define HALF_ITERATIONS 8 #define HALF_ITERATIONS 8
@@ -26,58 +129,58 @@
#define MAXWRITE (1024*16) #define MAXWRITE (1024*16)
#define BSIZE (MAXWRITE+4) #define BSIZE (MAXWRITE+4)
#define c2l(c,l) (l =((u_int32_t)(*((c)++))) , \ #define c2l(c,l) (l =((unsigned long)(*((c)++))) , \
l|=((u_int32_t)(*((c)++)))<< 8, \ l|=((unsigned long)(*((c)++)))<< 8L, \
l|=((u_int32_t)(*((c)++)))<<16, \ l|=((unsigned long)(*((c)++)))<<16L, \
l|=((u_int32_t)(*((c)++)))<<24) l|=((unsigned long)(*((c)++)))<<24L)
/* NOTE - c is not incremented as per c2l */ /* NOTE - c is not incremented as per c2l */
#define c2ln(c,l1,l2,n) { \ #define c2ln(c,l1,l2,n) { \
c+=n; \ c+=n; \
l1=l2=0; \ l1=l2=0; \
switch (n) { \ switch (n) { \
case 8: l2|=((u_int32_t)(*(--(c))))<<24; \ case 8: l2 =((unsigned long)(*(--(c))))<<24L; \
case 7: l2|=((u_int32_t)(*(--(c))))<<16; \ case 7: l2|=((unsigned long)(*(--(c))))<<16L; \
case 6: l2|=((u_int32_t)(*(--(c))))<< 8; \ case 6: l2|=((unsigned long)(*(--(c))))<< 8L; \
case 5: l2|=((u_int32_t)(*(--(c)))); \ case 5: l2|=((unsigned long)(*(--(c)))); \
case 4: l1|=((u_int32_t)(*(--(c))))<<24; \ case 4: l1 =((unsigned long)(*(--(c))))<<24L; \
case 3: l1|=((u_int32_t)(*(--(c))))<<16; \ case 3: l1|=((unsigned long)(*(--(c))))<<16L; \
case 2: l1|=((u_int32_t)(*(--(c))))<< 8; \ case 2: l1|=((unsigned long)(*(--(c))))<< 8L; \
case 1: l1|=((u_int32_t)(*(--(c)))); \ case 1: l1|=((unsigned long)(*(--(c)))); \
} \ } \
} }
#define l2c(l,c) (*((c)++)=(unsigned char)(((l) )&0xff), \ #define l2c(l,c) (*((c)++)=(unsigned char)(((l) )&0xff), \
*((c)++)=(unsigned char)(((l)>> 8)&0xff), \ *((c)++)=(unsigned char)(((l)>> 8L)&0xff), \
*((c)++)=(unsigned char)(((l)>>16)&0xff), \ *((c)++)=(unsigned char)(((l)>>16L)&0xff), \
*((c)++)=(unsigned char)(((l)>>24)&0xff)) *((c)++)=(unsigned char)(((l)>>24L)&0xff))
/* replacements for htonl and ntohl since I have no idea what to do /* replacements for htonl and ntohl since I have no idea what to do
* when faced with machines with 8 byte longs. */ * when faced with machines with 8 byte longs. */
#define HDRSIZE 4 #define HDRSIZE 4
#define n2l(c,l) (l =((u_int32_t)(*((c)++)))<<24, \ #define n2l(c,l) (l =((unsigned long)(*((c)++)))<<24L, \
l|=((u_int32_t)(*((c)++)))<<16, \ l|=((unsigned long)(*((c)++)))<<16L, \
l|=((u_int32_t)(*((c)++)))<< 8, \ l|=((unsigned long)(*((c)++)))<< 8L, \
l|=((u_int32_t)(*((c)++)))) l|=((unsigned long)(*((c)++))))
#define l2n(l,c) (*((c)++)=(unsigned char)(((l)>>24)&0xff), \ #define l2n(l,c) (*((c)++)=(unsigned char)(((l)>>24L)&0xff), \
*((c)++)=(unsigned char)(((l)>>16)&0xff), \ *((c)++)=(unsigned char)(((l)>>16L)&0xff), \
*((c)++)=(unsigned char)(((l)>> 8)&0xff), \ *((c)++)=(unsigned char)(((l)>> 8L)&0xff), \
*((c)++)=(unsigned char)(((l) )&0xff)) *((c)++)=(unsigned char)(((l) )&0xff))
/* NOTE - c is not incremented as per l2c */ /* NOTE - c is not incremented as per l2c */
#define l2cn(l1,l2,c,n) { \ #define l2cn(l1,l2,c,n) { \
c+=n; \ c+=n; \
switch (n) { \ switch (n) { \
case 8: *(--(c))=(unsigned char)(((l2)>>24)&0xff); \ case 8: *(--(c))=(unsigned char)(((l2)>>24L)&0xff); \
case 7: *(--(c))=(unsigned char)(((l2)>>16)&0xff); \ case 7: *(--(c))=(unsigned char)(((l2)>>16L)&0xff); \
case 6: *(--(c))=(unsigned char)(((l2)>> 8)&0xff); \ case 6: *(--(c))=(unsigned char)(((l2)>> 8L)&0xff); \
case 5: *(--(c))=(unsigned char)(((l2) )&0xff); \ case 5: *(--(c))=(unsigned char)(((l2) )&0xff); \
case 4: *(--(c))=(unsigned char)(((l1)>>24)&0xff); \ case 4: *(--(c))=(unsigned char)(((l1)>>24L)&0xff); \
case 3: *(--(c))=(unsigned char)(((l1)>>16)&0xff); \ case 3: *(--(c))=(unsigned char)(((l1)>>16L)&0xff); \
case 2: *(--(c))=(unsigned char)(((l1)>> 8)&0xff); \ case 2: *(--(c))=(unsigned char)(((l1)>> 8L)&0xff); \
case 1: *(--(c))=(unsigned char)(((l1) )&0xff); \ case 1: *(--(c))=(unsigned char)(((l1) )&0xff); \
} \ } \
} }
@@ -85,27 +188,27 @@
* compiler and the achitecture. gcc2 always seems to do well :-). * compiler and the achitecture. gcc2 always seems to do well :-).
* Inspired by Dana How <how@isl.stanford.edu> * Inspired by Dana How <how@isl.stanford.edu>
* DO NOT use the alternative version on machines with 8 byte longs. */ * DO NOT use the alternative version on machines with 8 byte longs. */
#ifdef ALT_ECB #ifdef DES_USR_PTR
#define D_ENCRYPT(L,R,S) \ #define D_ENCRYPT(L,R,S) { \
u=((R^s[S ])<<2); \ u=((R^s[S ])<<2); \
t= R^s[S+1]; \ t= R^s[S+1]; \
t=((t>>2)+(t<<30)); \ t=((t>>2)+(t<<30)); \
L^= \ L^= \
*(u_int32_t *)(des_SP+0x0100+((t )&0xfc))+ \ *(unsigned long *)(des_SP+0x0100+((t )&0xfc))+ \
*(u_int32_t *)(des_SP+0x0300+((t>> 8)&0xfc))+ \ *(unsigned long *)(des_SP+0x0300+((t>> 8)&0xfc))+ \
*(u_int32_t *)(des_SP+0x0500+((t>>16)&0xfc))+ \ *(unsigned long *)(des_SP+0x0500+((t>>16)&0xfc))+ \
*(u_int32_t *)(des_SP+0x0700+((t>>24)&0xfc))+ \ *(unsigned long *)(des_SP+0x0700+((t>>24)&0xfc))+ \
*(u_int32_t *)(des_SP+ ((u )&0xfc))+ \ *(unsigned long *)(des_SP+ ((u )&0xfc))+ \
*(u_int32_t *)(des_SP+0x0200+((u>> 8)&0xfc))+ \ *(unsigned long *)(des_SP+0x0200+((u>> 8)&0xfc))+ \
*(u_int32_t *)(des_SP+0x0400+((u>>16)&0xfc))+ \ *(unsigned long *)(des_SP+0x0400+((u>>16)&0xfc))+ \
*(u_int32_t *)(des_SP+0x0600+((u>>24)&0xfc)); *(unsigned long *)(des_SP+0x0600+((u>>24)&0xfc)); }
#else /* original version */ #else /* original version */
#ifdef MSDOS #ifdef MSDOS
#define D_ENCRYPT(L,R,S) \ #define D_ENCRYPT(L,R,S) \
U.l=R^s[S+1]; \ U.l=R^s[S+1]; \
T.s[0]=((U.s[0]>>4)|(U.s[1]<<12))&0x3f3f; \ T.s[0]=((U.s[0]>>4)|(U.s[1]<<12))&0x3f3f; \
T.s[1]=((U.s[1]>>4)|(U.s[0]<<12))&0x3f3f; \ T.s[1]=((U.s[1]>>4)|(U.s[0]<<12))&0x3f3f; \
U.l=(R^s[S ])&0x3f3f3f3f; \ U.l=(R^s[S ])&0x3f3f3f3fL; \
L^= des_SPtrans[1][(T.c[0])]| \ L^= des_SPtrans[1][(T.c[0])]| \
des_SPtrans[3][(T.c[1])]| \ des_SPtrans[3][(T.c[1])]| \
des_SPtrans[5][(T.c[2])]| \ des_SPtrans[5][(T.c[2])]| \
@@ -115,18 +218,18 @@
des_SPtrans[4][(U.c[2])]| \ des_SPtrans[4][(U.c[2])]| \
des_SPtrans[6][(U.c[3])]; des_SPtrans[6][(U.c[3])];
#else #else
#define D_ENCRYPT(L,R,S) \ #define D_ENCRYPT(Q,R,S) {\
u=(R^s[S ]); \ u=(R^s[S ]); \
t=R^s[S+1]; \ t=R^s[S+1]; \
t=((t>>4)+(t<<28)); \ t=((t>>4L)+(t<<28L)); \
L^= des_SPtrans[1][(t )&0x3f]| \ Q^= des_SPtrans[1][(t )&0x3f]| \
des_SPtrans[3][(t>> 8)&0x3f]| \ des_SPtrans[3][(t>> 8L)&0x3f]| \
des_SPtrans[5][(t>>16)&0x3f]| \ des_SPtrans[5][(t>>16L)&0x3f]| \
des_SPtrans[7][(t>>24)&0x3f]| \ des_SPtrans[7][(t>>24L)&0x3f]| \
des_SPtrans[0][(u )&0x3f]| \ des_SPtrans[0][(u )&0x3f]| \
des_SPtrans[2][(u>> 8)&0x3f]| \ des_SPtrans[2][(u>> 8L)&0x3f]| \
des_SPtrans[4][(u>>16)&0x3f]| \ des_SPtrans[4][(u>>16L)&0x3f]| \
des_SPtrans[6][(u>>24)&0x3f]; des_SPtrans[6][(u>>24L)&0x3f]; }
#endif #endif
#endif #endif
@@ -171,5 +274,23 @@
(b)^=(t),\ (b)^=(t),\
(a)^=((t)<<(n))) (a)^=((t)<<(n)))
#define IP(l,r) \
{ \
register unsigned 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); \
}
#endif /* __des_locl_h */ #define FP(l,r) \
{ \
register unsigned 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); \
}
#endif

File diff suppressed because it is too large Load Diff

77
lib/des/ecb3_enc.c Normal file
View File

@@ -0,0 +1,77 @@
/* lib/des/ecb3_enc.c */
/* 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.]
*/
#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 unsigned long l0,l1;
register unsigned char *in,*out;
unsigned long ll[2];
in=(unsigned char *)input;
out=(unsigned char *)output;
c2l(in,l0);
c2l(in,l1);
IP(l0,l1);
ll[0]=l0;
ll[1]=l1;
des_encrypt2(ll,ks1,encrypt);
des_encrypt2(ll,ks2,!encrypt);
des_encrypt2(ll,ks3,encrypt);
l0=ll[0];
l1=ll[1];
FP(l1,l0);
l2c(l0,out);
l2c(l1,out);
}

View File

@@ -1,110 +1,203 @@
/* ecb_enc.c */ /* lib/des/ecb_enc.c */
/* Copyright (C) 1993 Eric Young - see README for more details */ /* 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.]
*/
#include "des_locl.h" #include "des_locl.h"
#include "spr.h" #include "spr.h"
int des_ecb_encrypt(des_cblock (*input), des_cblock (*output), struct des_ks_struct *ks, int encrypt) const char *DES_version="libdes v 3.21 - 95/11/21 - eay";
{
register u_int32_t l0,l1;
register unsigned char *in,*out;
u_int32_t ll[2];
in=(unsigned char *)input; void des_ecb_encrypt(input, output, ks, encrypt)
out=(unsigned char *)output; des_cblock (*input);
c2l(in,l0); des_cblock (*output);
c2l(in,l1); des_key_schedule ks;
ll[0]=l0; int encrypt;
ll[1]=l1; {
des_encrypt(ll,ll,ks,encrypt); register unsigned long l0,l1;
l0=ll[0]; register unsigned char *in,*out;
l1=ll[1]; unsigned long ll[2];
l2c(l0,out);
l2c(l1,out);
l0=l1=ll[0]=ll[1]=0;
return(0);
}
int des_encrypt(u_int32_t *input, u_int32_t *output, struct des_ks_struct *ks, int encrypt) in=(unsigned char *)input;
{ out=(unsigned char *)output;
register u_int32_t l,r,t,u; c2l(in,l0); ll[0]=l0;
#ifdef ALT_ECB c2l(in,l1); ll[1]=l1;
register unsigned char *des_SP=(unsigned char *)des_SPtrans; des_encrypt(ll,ks,encrypt);
l0=ll[0]; l2c(l0,out);
l1=ll[1]; l2c(l1,out);
l0=l1=ll[0]=ll[1]=0;
}
void des_encrypt(data, ks, encrypt)
unsigned long *data;
des_key_schedule ks;
int encrypt;
{
register unsigned long l,r,t,u;
#ifdef DES_USE_PTR
register unsigned char *des_SP=(unsigned char *)des_SPtrans;
#endif #endif
#ifdef MSDOS #ifdef MSDOS
union fudge { union fudge {
u_int32_t l; unsigned long l;
unsigned short s[2]; unsigned short s[2];
unsigned char c[4]; unsigned char c[4];
} U,T; } U,T;
#endif #endif
register int i; register int i;
register u_int32_t *s; register unsigned long *s;
l=input[0]; u=data[0];
r=input[1]; r=data[1];
/* do IP */ IP(u,r);
PERM_OP(r,l,t, 4,0x0f0f0f0f); /* Things have been modified so that the initial rotate is
PERM_OP(l,r,t,16,0x0000ffff); * done outside the loop. This required the
PERM_OP(r,l,t, 2,0x33333333); * des_SPtrans values in sp.h to be rotated 1 bit to the right.
PERM_OP(l,r,t, 8,0x00ff00ff); * One perl script later and things have a 5% speed up on a sparc2.
PERM_OP(r,l,t, 1,0x55555555); * Thanks to Richard Outerbridge <71755.204@CompuServe.COM>
/* r and l are reversed - remember that :-) - fix * for pointing this out. */
* it in the next step */ l=(r<<1)|(r>>31);
r=(u<<1)|(u>>31);
/* Things have been modified so that the initial rotate is /* clear the top bits on machines with 8byte longs */
* done outside the loop. This required the l&=0xffffffffL;
* des_SPtrans values in sp.h to be rotated 1 bit to the right. r&=0xffffffffL;
* 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. */
t=(r<<1)|(r>>31);
r=(l<<1)|(l>>31);
l=t;
/* clear the top bits on machines with 8byte longs */ s=(unsigned long *)ks;
l&=0xffffffff; /* I don't know if it is worth the effort of loop unrolling the
r&=0xffffffff; * inner loop */
if (encrypt)
{
for (i=0; i<32; i+=4)
{
D_ENCRYPT(l,r,i+0); /* 1 */
D_ENCRYPT(r,l,i+2); /* 2 */
}
}
else
{
for (i=30; i>0; i-=4)
{
D_ENCRYPT(l,r,i-0); /* 16 */
D_ENCRYPT(r,l,i-2); /* 15 */
}
}
l=(l>>1)|(l<<31);
r=(r>>1)|(r<<31);
/* clear the top bits on machines with 8byte longs */
l&=0xffffffffL;
r&=0xffffffffL;
s=(u_int32_t *)ks; FP(r,l);
/* I don't know if it is worth the effort of loop unrolling the data[0]=l;
* inner loop */ data[1]=r;
if (encrypt) l=r=t=u=0;
{
for (i=0; i<32; i+=4)
{
D_ENCRYPT(l,r,i+0); /* 1 */
D_ENCRYPT(r,l,i+2); /* 2 */
} }
}
else void des_encrypt2(data, ks, encrypt)
{ unsigned long *data;
for (i=30; i>0; i-=4) des_key_schedule ks;
int encrypt;
{ {
D_ENCRYPT(l,r,i-0); /* 16 */ register unsigned long l,r,t,u;
D_ENCRYPT(r,l,i-2); /* 15 */ #ifdef DES_USE_PTR
register unsigned char *des_SP=(unsigned char *)des_SPtrans;
#endif
#ifdef MSDOS
union fudge {
unsigned long l;
unsigned short s[2];
unsigned char c[4];
} U,T;
#endif
register int i;
register unsigned long *s;
u=data[0];
r=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. */
l=(r<<1)|(r>>31);
r=(u<<1)|(u>>31);
/* clear the top bits on machines with 8byte longs */
l&=0xffffffffL;
r&=0xffffffffL;
s=(unsigned long *)ks;
/* I don't know if it is worth the effort of loop unrolling the
* inner loop */
if (encrypt)
{
for (i=0; i<32; i+=4)
{
D_ENCRYPT(l,r,i+0); /* 1 */
D_ENCRYPT(r,l,i+2); /* 2 */
}
}
else
{
for (i=30; i>0; i-=4)
{
D_ENCRYPT(l,r,i-0); /* 16 */
D_ENCRYPT(r,l,i-2); /* 15 */
}
}
l=(l>>1)|(l<<31);
r=(r>>1)|(r<<31);
/* clear the top bits on machines with 8byte longs */
l&=0xffffffffL;
r&=0xffffffffL;
data[0]=l;
data[1]=r;
l=r=t=u=0;
} }
}
l=(l>>1)|(l<<31);
r=(r>>1)|(r<<31);
/* clear the top bits on machines with 8byte longs */
l&=0xffffffff;
r&=0xffffffff;
/* swap l and r
* we will not do the swap so just remember they are
* reversed for the rest of the subroutine
* luckily FP fixes this problem :-) */
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);
output[0]=l;
output[1]=r;
l=r=t=u=0;
return(0);
}

163
lib/des/ede_enc.c Normal file
View File

@@ -0,0 +1,163 @@
/* lib/des/ede_enc.c */
/* 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.]
*/
#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 unsigned long tin0,tin1;
register unsigned long tout0,tout1,xor0,xor1;
register unsigned char *in,*out;
register long l=length;
unsigned 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>0; l-=8)
{
if (l >= 8)
{
c2l(in,tin0);
c2l(in,tin1);
}
else
c2ln(in,tin0,tin1,l);
tin0^=tout0;
tin1^=tout1;
IP(tin0,tin1);
tin[0]=tin0;
tin[1]=tin1;
des_encrypt2((unsigned long *)tin,ks1,DES_ENCRYPT);
des_encrypt2((unsigned long *)tin,ks2,DES_DECRYPT);
des_encrypt2((unsigned long *)tin,ks3,DES_ENCRYPT);
tout0=tin[0];
tout1=tin[1];
FP(tout1,tout0);
l2c(tout0,out);
l2c(tout1,out);
}
iv=(unsigned char *)ivec;
l2c(tout0,iv);
l2c(tout1,iv);
}
else
{
c2l(iv,xor0);
c2l(iv,xor1);
for (; l>0; l-=8)
{
register unsigned long t0,t1;
c2l(in,tin0);
c2l(in,tin1);
t0=tin0;
t1=tin1;
IP(tin0,tin1);
tin[0]=tin0;
tin[1]=tin1;
des_encrypt2((unsigned long *)tin,ks3,DES_DECRYPT);
des_encrypt2((unsigned long *)tin,ks2,DES_ENCRYPT);
des_encrypt2((unsigned long *)tin,ks1,DES_DECRYPT);
tout0=tin[0];
tout1=tin[1];
FP(tout1,tout0); /**/
tout0^=xor0;
tout1^=xor1;
if (l >= 8)
{
l2c(tout0,out);
l2c(tout1,out);
}
else
l2cn(tout0,tout1,out,l);
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

View File

@@ -1,157 +1,189 @@
/* enc_read.c */ /* lib/des/enc_read.c */
/* Copyright (C) 1993 Eric Young - see README for more details */ /* 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.]
*/
#include <unistd.h> #include <stdio.h>
#include <errno.h> #include <errno.h>
#include "des_locl.h" #include "des_locl.h"
int LEFT_JUSTIFIED = 0;
/* This has some uglies in it but it works - even over sockets. */ /* This has some uglies in it but it works - even over sockets. */
extern int errno; extern int errno;
int des_rw_mode=DES_PCBC_MODE; int des_rw_mode=DES_PCBC_MODE;
int des_enc_read(int fd, char *buf, int len, struct des_ks_struct *sched, des_cblock (*iv)) int des_enc_read(fd, buf, len, sched, iv)
{ int fd;
/* data to be unencrypted */ char *buf;
int net_num=0; int len;
unsigned char net[BSIZE]; des_key_schedule sched;
/* extra unencrypted data des_cblock (*iv);
* for when a block of 100 comes in but is des_read one byte at
* a time. */
static char unnet[BSIZE];
static int unnet_start=0;
static int unnet_left=0;
int i;
long num=0,rnum;
unsigned char *p;
/* left over data from last decrypt */
if (unnet_left != 0)
{
if (unnet_left < len)
{ {
/* we still still need more data but will return /* data to be unencrypted */
* with the number of bytes we have - should always int net_num=0;
* check the return value */ unsigned char net[BSIZE];
memcpy(buf,&(unnet[unnet_start]),unnet_left); /* extra unencrypted data
/* eay 26/08/92 I had the next 2 lines * for when a block of 100 comes in but is des_read one byte at
* reversed :-( */ * a time. */
i=unnet_left; static char unnet[BSIZE];
unnet_start=unnet_left=0; static int unnet_start=0;
static int unnet_left=0;
int i;
long num=0,rnum;
unsigned char *p;
/* 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 */
net_num=0;
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)
pcbc_encrypt((des_cblock *)net,(des_cblock *)unnet,
num,sched,iv,DES_DECRYPT);
else
cbc_encrypt((des_cblock *)net,(des_cblock *)unnet,
num,sched,iv,DES_DECRYPT);
memcpy(buf,unnet,(unsigned int)len);
unnet_start=len;
unnet_left=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)
{
char tmpbuf[BSIZE];
if (des_rw_mode & DES_PCBC_MODE)
pcbc_encrypt((des_cblock *)net,
(des_cblock *)tmpbuf,
num,sched,iv,DES_DECRYPT);
else
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)
pcbc_encrypt((des_cblock *)net,
(des_cblock *)buf,num,sched,iv,
DES_DECRYPT);
else
cbc_encrypt((des_cblock *)net,
(des_cblock *)buf,num,sched,iv,
DES_DECRYPT);
}
}
return(num);
} }
else
{
memcpy(buf,&(unnet[unnet_start]),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 */
net_num=0;
while (net_num < HDRSIZE)
{
i=read(fd,&(net[net_num]),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]),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,len);
unnet_start=len;
unnet_left=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)
{
char tmpbuf[BSIZE];
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 :-( */
if (LEFT_JUSTIFIED || (len >= 8))
memcpy(buf,tmpbuf,num);
else
memcpy(buf,tmpbuf+(8-num),num); /* Right justified */
}
else if (num >= 8)
{
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);
}
else
{
if (des_rw_mode & DES_PCBC_MODE)
des_pcbc_encrypt((des_cblock *)net,
(des_cblock *)buf,8,sched,iv,
DES_DECRYPT);
else
des_cbc_encrypt((des_cblock *)net,
(des_cblock *)buf,8,sched,iv,
DES_DECRYPT);
if (!LEFT_JUSTIFIED)
memcpy(buf, buf+(8-num), num); /* Right justified */
}
}
return(num);
}

View File

@@ -1,100 +1,142 @@
/* enc_writ.c */ /* lib/des/enc_writ.c */
/* Copyright (C) 1993 Eric Young - see README for more details */ /* 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.]
*/
#include <unistd.h>
#include <errno.h> #include <errno.h>
#include <stdlib.h> #include <time.h>
#include "des_locl.h" #include "des_locl.h"
extern int LEFT_JUSTIFIED; int des_enc_write(fd, buf, len, sched, iv)
int fd;
int des_enc_write(int fd, char *buf, int len, struct des_ks_struct *sched, des_cblock (*iv)) char *buf;
{ int len;
long rnum; des_key_schedule sched;
int i,j,k,outnum; des_cblock (*iv);
char outbuf[BSIZE+HDRSIZE];
char shortbuf[8];
char *p;
static int start=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;
srand(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]), #ifdef _LIBC
((len-i) > MAXWRITE)?MAXWRITE:(len-i),sched,iv); extern int srandom();
if (k < 0) extern unsigned long time();
return(k); extern int random();
else extern int write();
j+=k; #endif
}
return(j);
}
/* write length first */ long rnum;
p=outbuf; int i,j,k,outnum;
l2n(len,p); char outbuf[BSIZE+HDRSIZE];
char shortbuf[8];
char *p;
static int start=1;
/* pad short strings */ /* If we are sending less than 8 bytes, the same char will look
if (len < 8) * the same if we don't pad it out with random bytes */
{ if (start)
if (LEFT_JUSTIFIED) {
{ 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; p=shortbuf;
memcpy(shortbuf,buf,len); memcpy(shortbuf,buf,(unsigned int)len);
for (i=len; i<8; i++) for (i=len; i<8; i++)
shortbuf[i]=rand(); shortbuf[i]=random();
rnum=8; rnum=8;
} }
else else
{ {
p=shortbuf; p=buf;
for (i=0; i<8-len; i++) rnum=((len+7)/8*8); /* round up to nearest eight */
shortbuf[i]=rand(); }
memcpy(shortbuf + 8 - len, buf, len);
rnum=8;
}
}
else
{
p=buf;
rnum=((len+7)/8*8); /* round up to nearest eight */
}
if (des_rw_mode & DES_PCBC_MODE) if (des_rw_mode & DES_PCBC_MODE)
des_pcbc_encrypt((des_cblock *)p,(des_cblock *)&(outbuf[HDRSIZE]), pcbc_encrypt((des_cblock *)p,(des_cblock *)&(outbuf[HDRSIZE]),
(long)((len<8)?8:len),sched,iv,DES_ENCRYPT); (long)((len<8)?8:len),sched,iv,DES_ENCRYPT);
else else
des_cbc_encrypt((des_cblock *)p,(des_cblock *)&(outbuf[HDRSIZE]), cbc_encrypt((des_cblock *)p,(des_cblock *)&(outbuf[HDRSIZE]),
(long)((len<8)?8:len),sched,iv,DES_ENCRYPT); (long)((len<8)?8:len),sched,iv,DES_ENCRYPT);
/* output */ /* output */
outnum=rnum+HDRSIZE; outnum=rnum+HDRSIZE;
for (j=0; j<outnum; j+=i) for (j=0; j<outnum; j+=i)
{ {
/* eay 26/08/92 I was not doing writing from where we /* eay 26/08/92 I was not doing writing from where we
* got upto. */ * got upto. */
i=write(fd,&(outbuf[j]),(int)(outnum-j)); i=write(fd,&(outbuf[j]),(unsigned int)(outnum-j));
if (i == -1) if (i == -1)
{ {
if (errno == EINTR) if (errno == EINTR)
i=0; i=0;
else /* This is really a bad error - very bad else /* This is really a bad error - very bad
* It will stuff-up both ends. */ * It will stuff-up both ends. */
return(-1); return(-1);
} }
} }
return(len); return(len);
} }

File diff suppressed because it is too large Load Diff

View File

@@ -6,6 +6,8 @@
#undef des_fixup_key_parity #undef des_fixup_key_parity
#endif /* des_fixup_key_parity */ #endif /* des_fixup_key_parity */
void des_fixup_key_parity(des_cblock *key);
void void
des_fixup_key_parity(des_cblock *key) des_fixup_key_parity(des_cblock *key)
{ {

50
lib/des/makefile.bc Normal file
View File

@@ -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 -DPROTO
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

120
lib/des/ncbc_enc.c Normal file
View File

@@ -0,0 +1,120 @@
/* lib/des/ncbc_enc.c */
/* 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.]
*/
#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 unsigned long tin0,tin1;
register unsigned long tout0,tout1,xor0,xor1;
register unsigned char *in,*out;
register long l=length;
unsigned 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>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((unsigned 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>0; l-=8)
{
c2l(in,tin0); tin[0]=tin0;
c2l(in,tin1); tin[1]=tin1;
des_encrypt((unsigned long *)tin,schedule,DES_DECRYPT);
tout0=tin[0]^xor0;
tout1=tin[1]^xor1;
if (l >= 8)
{
l2c(tout0,out);
l2c(tout1,out);
}
else
l2cn(tout0,tout1,out,l);
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;
}

126
lib/des/ofb64ede.c Normal file
View File

@@ -0,0 +1,126 @@
/* lib/des/ofb64enc.c */
/* 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.]
*/
#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 unsigned long v0,v1;
register int n=*num;
register long l=length;
des_cblock d;
register char *dp;
unsigned 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)
{
IP(v0,v1);
ti[0]=v0;
ti[1]=v1;
des_encrypt2((unsigned long *)ti,k1,DES_ENCRYPT);
des_encrypt2((unsigned long *)ti,k2,DES_DECRYPT);
des_encrypt2((unsigned long *)ti,k3,DES_ENCRYPT);
v0=ti[0];
v1=ti[1];
FP(v1,v0);
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

103
lib/des/ofb64enc.c Normal file
View File

@@ -0,0 +1,103 @@
/* lib/des/ofb64enc.c */
/* 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.]
*/
#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 unsigned long v0,v1,t;
register int n=*num;
register long l=length;
des_cblock d;
register char *dp;
unsigned 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((unsigned 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;
}

View File

@@ -1,5 +1,50 @@
/* ofb_enc.c */ /* lib/des/ofb_enc.c */
/* Copyright (C) 1993 Eric Young - see README for more details */ /* 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.]
*/
#include "des_locl.h" #include "des_locl.h"
/* The input and output are loaded in multiples of 8 bits. /* The input and output are loaded in multiples of 8 bits.
@@ -8,55 +53,59 @@
* the second. The second 12 bits will come from the 3rd and half the 4th * the second. The second 12 bits will come from the 3rd and half the 4th
* byte. * byte.
*/ */
int des_ofb_encrypt(unsigned char *in, unsigned char *out, int numbits, long int length, struct des_ks_struct *schedule, des_cblock (*ivec)) void des_ofb_encrypt(in, out, numbits, length, schedule, ivec)
{ unsigned char *in;
register u_int32_t d0,d1,v0,v1,n=(numbits+7)/8; unsigned char *out;
register u_int32_t mask0,mask1; int numbits;
register long l=length; long length;
register int num=numbits; des_key_schedule schedule;
u_int32_t ti[2]; des_cblock (*ivec);
unsigned char *iv; {
register unsigned long d0,d1,v0,v1,n=(numbits+7)/8;
register unsigned long mask0,mask1;
register long l=length;
register int num=numbits;
unsigned long ti[2];
unsigned char *iv;
if (num > 64) return(0); if (num > 64) return;
if (num > 32) if (num > 32)
{ {
mask0=0xffffffff; mask0=0xffffffffL;
if (num >= 64) if (num >= 64)
mask1=mask0; mask1=mask0;
else else
mask1=(1L<<(num-32))-1; mask1=(1L<<(num-32))-1;
} }
else else
{ {
if (num == 32) if (num == 32)
mask0=0xffffffff; mask0=0xffffffffL;
else else
mask0=(1L<<num)-1; mask0=(1L<<num)-1;
mask1=0x00000000; mask1=0x00000000;
} }
iv=(unsigned char *)ivec; iv=(unsigned char *)ivec;
c2l(iv,v0); c2l(iv,v0);
c2l(iv,v1); c2l(iv,v1);
ti[0]=v0; ti[0]=v0;
ti[1]=v1; ti[1]=v1;
while (l-- > 0) while (l-- > 0)
{ {
des_encrypt(ti,ti, des_encrypt((unsigned long *)ti,schedule,DES_ENCRYPT);
schedule,DES_ENCRYPT); c2ln(in,d0,d1,n);
c2ln(in,d0,d1,n); in+=n;
in+=n; d0=(d0^ti[0])&mask0;
d0=(d0^ti[0])&mask0; d1=(d1^ti[1])&mask1;
d1=(d1^ti[1])&mask1; l2cn(d0,d1,out,n);
l2cn(d0,d1,out,n); out+=n;
out+=n; }
} v0=ti[0];
v0=ti[0]; v1=ti[1];
v1=ti[1]; iv=(unsigned char *)ivec;
iv=(unsigned char *)ivec; l2c(v0,iv);
l2c(v0,iv); l2c(v1,iv);
l2c(v1,iv); v0=v1=d0=d1=ti[0]=ti[1]=0;
v0=v1=d0=d1=ti[0]=ti[1]=0; }
return(0);
}

View File

@@ -1,67 +1,115 @@
/* pcbc_enc.c */ /* lib/des/pcbc_enc.c */
/* Copyright (C) 1993 Eric Young - see README for more details */ /* 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.]
*/
#include "des_locl.h" #include "des_locl.h"
int des_pcbc_encrypt(des_cblock (*input), des_cblock (*output), long int length, struct des_ks_struct *schedule, des_cblock (*ivec), int encrypt) void des_pcbc_encrypt(input, output, length, schedule, ivec, encrypt)
{ des_cblock (*input);
register u_int32_t sin0,sin1,xor0,xor1,tout0,tout1; des_cblock (*output);
u_int32_t tin[2],tout[2]; long length;
unsigned char *in,*out,*iv; des_key_schedule schedule;
des_cblock (*ivec);
in=(unsigned char *)input; int encrypt;
out=(unsigned char *)output;
iv=(unsigned char *)ivec;
if (encrypt)
{
c2l(iv,xor0);
c2l(iv,xor1);
for (; length>0; length-=8)
{ {
if (length >= 8) register unsigned long sin0,sin1,xor0,xor1,tout0,tout1;
{ unsigned long tin[2];
c2l(in,sin0); unsigned char *in,*out,*iv;
c2l(in,sin1);
} in=(unsigned char *)input;
else out=(unsigned char *)output;
c2ln(in,sin0,sin1,length); iv=(unsigned char *)ivec;
tin[0]=sin0^xor0;
tin[1]=sin1^xor1; if (encrypt)
des_encrypt(tin,tout, {
schedule,encrypt); c2l(iv,xor0);
tout0=tout[0]; c2l(iv,xor1);
tout1=tout[1]; for (; length>0; length-=8)
xor0=sin0^tout[0]; {
xor1=sin1^tout[1]; if (length >= 8)
l2c(tout0,out); {
l2c(tout1,out); c2l(in,sin0);
c2l(in,sin1);
}
else
c2ln(in,sin0,sin1,length);
tin[0]=sin0^xor0;
tin[1]=sin1^xor1;
des_encrypt((unsigned 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((unsigned 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;
} }
}
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(tin,tout,
schedule,encrypt);
tout0=tout[0]^xor0;
tout1=tout[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]=tout[0]=tout[1]=0;
sin0=sin1=xor0=xor1=tout0=tout1=0;
return(0);
}

View File

@@ -1,6 +1,51 @@
/* podd.h */ /* lib/des/podd.h */
/* Copyright (C) 1993 Eric Young - see README for more details */ /* Copyright (C) 1995 Eric Young (eay@mincom.oz.au)
static unsigned char odd_parity[256]={ * 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.]
*/
static const unsigned char odd_parity[256]={
1, 1, 2, 2, 4, 4, 7, 7, 8, 8, 11, 11, 13, 13, 14, 14, 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, 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, 32, 32, 35, 35, 37, 37, 38, 38, 41, 41, 42, 42, 44, 44, 47, 47,

View File

@@ -1,5 +1,50 @@
/* qud_cksm.c */ /* lib/des/qud_cksm.c */
/* Copyright (C) 1993 Eric Young - see README for more details */ /* 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.]
*/
/* From "Message Authentication" R.R. Jueneman, S.M. Matyas, C.H. Meyer /* From "Message Authentication" R.R. Jueneman, S.M. Matyas, C.H. Meyer
* IEEE Communications Magazine Sept 1985 Vol. 23 No. 9 p 29-40 * 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 * This module in only based on the code in this paper and is
@@ -8,76 +53,81 @@
#include "des_locl.h" #include "des_locl.h"
/* bug fix for dos - 7/6/91 - Larry hughes@logos.ucs.indiana.edu */ /* bug fix for dos - 7/6/91 - Larry hughes@logos.ucs.indiana.edu */
#define B0(a) (((u_int32_t)(a))) #define B0(a) (((unsigned long)(a)))
#define B1(a) (((u_int32_t)(a))<<8) #define B1(a) (((unsigned long)(a))<<8)
#define B2(a) (((u_int32_t)(a))<<16) #define B2(a) (((unsigned long)(a))<<16)
#define B3(a) (((u_int32_t)(a))<<24) #define B3(a) (((unsigned long)(a))<<24)
/* used to scramble things a bit */ /* used to scramble things a bit */
/* Got the value MIT uses via brute force :-) 2/10/90 eay */ /* Got the value MIT uses via brute force :-) 2/10/90 eay */
#define NOISE ((u_int32_t)83653421) #define NOISE ((unsigned long)83653421L)
u_int32_t des_quad_cksum(des_cblock (*input), des_cblock (*output), long int length, int out_count, des_cblock (*seed)) unsigned long des_quad_cksum(input, output, length, out_count, seed)
{ des_cblock (*input);
u_int32_t z0,z1,t0,t1; des_cblock (*output);
int i; long length;
long l=0; int out_count;
unsigned char *cp; des_cblock (*seed);
unsigned char *lp;
if (out_count < 1) out_count=1;
lp=(unsigned char *)output;
z0=B0((*seed)[0])|B1((*seed)[1])|B2((*seed)[2])|B3((*seed)[3]);
z1=B0((*seed)[4])|B1((*seed)[5])|B2((*seed)[6])|B3((*seed)[7]);
for (i=0; ((i<4)&&(i<out_count)); i++)
{
cp=(unsigned char *)input;
l=length;
while (l > 0)
{ {
if (l > 1) unsigned long z0,z1,t0,t1;
{ int i;
t0= (u_int32_t)(*(cp++)); long l=0;
t0|=(u_int32_t)B1(*(cp++)); unsigned char *cp;
l--; unsigned char *lp;
}
else
t0= (u_int32_t)(*(cp++));
l--;
/* add */
t0+=z0;
t0&=0xffffffff;
t1=z1;
/* square, well sort of square */
z0=((((t0*t0)&0xffffffff)+((t1*t1)&0xffffffff))
&0xffffffff)%0x7fffffff;
z1=((t0*((t1+NOISE)&0xffffffff))&0xffffffff)%0x7fffffff;
}
if (lp != NULL)
{
/* I believe I finally have things worked out.
* The MIT library assumes that the checksum
* is one huge number and it is returned in a
* host dependant byte order.
*/
static u_int32_t l=1;
static unsigned char *c=(unsigned char *)&l;
if (c[0]) if (out_count < 1) out_count=1;
{ lp=(unsigned char *)output;
l2c(z0,lp);
l2c(z1,lp); z0=B0((*seed)[0])|B1((*seed)[1])|B2((*seed)[2])|B3((*seed)[3]);
} z1=B0((*seed)[4])|B1((*seed)[5])|B2((*seed)[6])|B3((*seed)[7]);
else
{ for (i=0; ((i<4)&&(i<out_count)); i++)
lp=output[out_count-i-1]; {
l2n(z1,lp); cp=(unsigned char *)input;
l2n(z0,lp); l=length;
} while (l > 0)
} {
} if (l > 1)
return(z0); {
} t0= (unsigned long)(*(cp++));
t0|=(unsigned long)B1(*(cp++));
l--;
}
else
t0= (unsigned 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)
{
/* I believe I finally have things worked out.
* The MIT library assumes that the checksum
* is one huge number and it is returned in a
* host dependant byte order.
*/
static unsigned long ltmp=1;
static unsigned char *c=(unsigned char *)&ltmp;
if (c[0])
{
l2c(z0,lp);
l2c(z1,lp);
}
else
{
lp=output[out_count-i-1];
l2n(z1,lp);
l2n(z0,lp);
}
}
}
return(z0);
}

View File

@@ -1,44 +1,107 @@
/* rand_key.c */ /* lib/des/rand_key.c */
/* Copyright (C) 1993 Eric Young - see README for more details */ /* 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.]
*/
#include "des_locl.h" #include "des_locl.h"
#include <time.h>
int des_random_key(unsigned char *ret) static int seed=0;
{ static des_cblock init;
des_key_schedule ks;
static u_int32_t c=0; void des_random_seed(key)
static unsigned short pid=0; des_cblock key;
static des_cblock data={0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef}; {
des_cblock key; memcpy(init,key,sizeof(des_cblock));
unsigned char *p; seed=1;
u_int32_t t, now; }
void des_random_key(ret)
unsigned char *ret;
{
des_key_schedule ks;
static unsigned 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;
unsigned long t;
int i;
now=(unsigned long)time(NULL);
#ifdef MSDOS #ifdef MSDOS
pid=1; pid=1;
#else #else
if (!pid) pid=getpid(); if (!pid) pid=getpid();
#endif #endif
try_again: p=key;
p=key; if (seed)
t=now; {
l2c(t,p); for (i=0; i<8; i++)
t=(u_int32_t)((pid)|((c++)<<16)); {
l2c(t,p); data[i] ^= init[i];
init[i]=0;
}
seed=0;
}
t=(unsigned long)time(NULL);
l2c(t,p);
t=(unsigned long)((pid)|((c++)<<16));
l2c(t,p);
des_set_odd_parity((des_cblock *)data); des_set_odd_parity((des_cblock *)data);
des_set_key((des_cblock *)data,ks); des_set_key((des_cblock *)data,ks);
des_cbc_cksum((des_cblock *)key,(des_cblock *)key, des_cbc_cksum((des_cblock *)key,(des_cblock *)key,
(long)sizeof(key),ks,(des_cblock *)data);
des_set_odd_parity((des_cblock *)key);
des_cbc_cksum((des_cblock *)key,(des_cblock *)key,
(long)sizeof(key),ks,(des_cblock *)data); (long)sizeof(key),ks,(des_cblock *)data);
memcpy(ret,key,sizeof(key)); des_set_odd_parity((des_cblock *)key);
memset(key,0,sizeof(key)); des_set_key((des_cblock *)key,ks);
memset(ks,0,sizeof(ks)); des_cbc_cksum((des_cblock *)key,(des_cblock *)data,
t=0; (long)sizeof(key),ks,(des_cblock *)key);
/* random key must have odd parity and not be weak */
des_set_odd_parity((des_cblock *)ret); memcpy(ret,data,sizeof(key));
if (des_is_weak_key((des_cblock *)ret)) goto try_again; memset(key,0,sizeof(key));
return(0); memset(ks,0,sizeof(ks));
} t=0;
}

View File

@@ -1,35 +1,108 @@
/* read_pwd.c */ /* lib/des/read_pwd.c */
/* Copyright (C) 1993 Eric Young - see README for more details */ /* 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.]
*/
/* 06-Apr-92 Luke Brennan Support for VMS */ /* 06-Apr-92 Luke Brennan Support for VMS */
#include "des_locl.h" #include "des_locl.h"
#include <string.h>
#include <signal.h> #include <signal.h>
#include <string.h>
#include <setjmp.h> #include <setjmp.h>
/* Ick! */ /* There are 5 types of terminal interface supported,
#if defined(__svr4__) || defined(__sgi) || defined(__linux) * TERMIO, TERMIOS, VMS, MSDOS and SGTTY
*/
#if defined(sgi) || defined(__sgi)
#define TERMIOS
#undef TERMIO
#undef SGTTY
#endif
#ifdef _LIBC
#define TERMIO #define TERMIO
#endif #endif
#ifndef VMS #if !defined(TERMIO) && !defined(TERMIOS) && !defined(VMS) && !defined(MSDOS)
#ifndef 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 #ifdef TERMIO
#include <termio.h> #include <termio.h>
#define sgttyb termio #define TTY_STRUCT struct termio
#define sg_flags c_lflag #define TTY_FLAGS c_lflag
/* Really redefine these ioctl's! */ #define TTY_get(tty,data) ioctl(tty,TCGETA,data)
#undef TIOCGETP #define TTY_set(tty,data) ioctl(tty,TCSETA,data)
#define TIOCGETP TCGETA
#undef TIOCSETP
#define TIOCSETP TCSETA
#else /* !TERMIO */
#include <sgtty.h>
#endif #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
#ifndef _LIBC
#include <sys/ioctl.h> #include <sys/ioctl.h>
#else /* MSDOS */ #endif
#ifdef MSDOS
#include <conio.h>
#define fgets(a,b,c) noecho_fgets(a,b,c) #define fgets(a,b,c) noecho_fgets(a,b,c)
#endif #endif
#else /* VMS */
#ifdef VMS
#include <ssdef.h> #include <ssdef.h>
#include <iodef.h> #include <iodef.h>
#include <ttdef.h> #include <ttdef.h>
@@ -40,69 +113,114 @@ struct IOSB {
long iosb$l_info; long iosb$l_info;
}; };
#endif #endif
#ifndef NSIG
#define NSIG 32 #ifndef NX509_SIG
#define NX509_SIG 32
#endif #endif
#ifdef PROTO
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);
#ifdef MSDOS
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();
#ifdef MSDOS #ifdef MSDOS
static int noecho_fgets(); static int noecho_fgets();
#endif #endif
#endif
static void (*savsig[NSIG])(); static void (*savsig[NX509_SIG])();
static jmp_buf save; static jmp_buf save;
static void recsig(int sig) int des_read_password(key, prompt, verify)
{ des_cblock (*key);
longjmp(save,1); char *prompt;
} int verify;
{
int ok;
char buf[BUFSIZ],buff[BUFSIZ];
static void pushsig(void) if ((ok=read_pw(buf,buff,BUFSIZ,prompt,verify)) == 0)
{ des_string_to_key(buf,key);
int i; memset(buf,0,BUFSIZ);
memset(buff,0,BUFSIZ);
return(ok);
}
for (i=0; i<NSIG; i++) int des_read_2passwords(key1, key2, prompt, verify)
savsig[i]=signal(i,recsig); des_cblock (*key1);
} des_cblock (*key2);
char *prompt;
int verify;
{
int ok;
char buf[BUFSIZ],buff[BUFSIZ];
static void popsig(void) if ((ok=read_pw(buf,buff,BUFSIZ,prompt,verify)) == 0)
{ des_string_to_2keys(buf,key1,key2);
int i; memset(buf,0,BUFSIZ);
memset(buff,0,BUFSIZ);
return(ok);
}
for (i=0; i<NSIG; i++) int des_read_pw_string(buf, length, prompt, verify)
signal(i,savsig[i]); 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);
}
static void read_till_nl(FILE *in) static void read_till_nl(in)
{ FILE *in;
{
#define SIZE 4 #define SIZE 4
char buf[SIZE+1]; char buf[SIZE+1];
do { do {
fgets(buf,SIZE,in); fgets(buf,SIZE,in);
} while (strchr(buf,'\n') == NULL); } while (strchr(buf,'\n') == NULL);
} }
/* return 0 if ok, 1 (or -1) otherwise */ /* return 0 if ok, 1 (or -1) otherwise */
static int read_pw(char *buf, char *buff, int size, char *prompt,int verify) static int read_pw(buf, buff, size, prompt, verify)
{ char *buf;
#ifndef VMS char *buff;
#ifndef MSDOS int size;
struct sgttyb tty_orig,tty_new; char *prompt;
#endif /* !MSDOS */ int verify;
#else {
#ifdef VMS
struct IOSB iosb; struct IOSB iosb;
$DESCRIPTOR(terminal,"TT"); $DESCRIPTOR(terminal,"TT");
long tty_orig[3], tty_new[3]; long tty_orig[3], tty_new[3];
long status; long status;
unsigned short channel = 0; unsigned short channel = 0;
#else
#ifndef MSDOS
TTY_STRUCT tty_orig,tty_new;
#endif #endif
#endif
int number=5;
int ok=0; int ok=0;
char *p;
int ps=0; int ps=0;
FILE *tty; FILE *tty=NULL;
char *p;
#ifndef MSDOS #ifndef MSDOS
if ((tty=fopen("/dev/tty","r")) == NULL) if ((tty=fopen("/dev/tty","r")) == NULL)
@@ -111,13 +229,13 @@ static int read_pw(char *buf, char *buff, int size, char *prompt,int verify)
if ((tty=fopen("con","r")) == NULL) if ((tty=fopen("con","r")) == NULL)
tty=stdin; tty=stdin;
#endif /* MSDOS */ #endif /* MSDOS */
#ifndef VMS
#ifdef TIOCGETP #if defined(TTY_get) && !defined(VMS)
if (ioctl(fileno(tty),TIOCGETP,(char *)&tty_orig) == -1) if (TTY_get(fileno(tty),&tty_orig) == -1)
return(-1); return(-1);
bcopy(&(tty_orig),&(tty_new),sizeof(tty_orig)); memcpy(&(tty_new),&(tty_orig),sizeof(tty_orig));
#endif #endif
#else /* VMS */ #ifdef VMS
status = SYS$ASSIGN(&terminal,&channel,0,0); status = SYS$ASSIGN(&terminal,&channel,0,0);
if (status != SS$_NORMAL) if (status != SS$_NORMAL)
return(-1); return(-1);
@@ -133,25 +251,26 @@ static int read_pw(char *buf, char *buff, int size, char *prompt,int verify)
} }
pushsig(); pushsig();
ps=1; ps=1;
#ifndef VMS
#ifndef MSDOS #ifdef TTY_FLAGS
tty_new.sg_flags &= ~ECHO; tty_new.TTY_FLAGS &= ~ECHO;
#endif /* !MSDOS */ #endif
#ifdef TIOCSETP
if (ioctl(fileno(tty),TIOCSETP,(char *)&tty_new) == -1) #if defined(TTY_set) && !defined(VMS)
if (TTY_set(fileno(tty),&tty_new) == -1)
return(-1); return(-1);
#endif #endif
#else /* VMS */ #ifdef VMS
tty_new[0] = tty_orig[0]; tty_new[0] = tty_orig[0];
tty_new[1] = tty_orig[1] | TT$M_NOECHO; tty_new[1] = tty_orig[1] | TT$M_NOECHO;
tty_new[2] = tty_orig[2]; tty_new[2] = tty_orig[2];
status = SYS$QIOW(0,channel,IO$_SETMODE,&iosb,0,0,tty_new,12,0,0,0,0); 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)) if ((status != SS$_NORMAL) || (iosb.iosb$w_value != SS$_NORMAL))
return(-1); return(-1);
#endif /* VMS */ #endif
ps=2; ps=2;
while (!ok) while ((!ok) && (number--))
{ {
fputs(prompt,stderr); fputs(prompt,stderr);
fflush(stderr); fflush(stderr);
@@ -175,9 +294,10 @@ static int read_pw(char *buf, char *buff, int size, char *prompt,int verify)
if (strcmp(buf,buff) != 0) if (strcmp(buf,buff) != 0)
{ {
fprintf(stderr,"\nVerify failure - try again\n"); fprintf(stderr,"\nVerify failure");
fflush(stderr); fflush(stderr);
continue; break;
/* continue; */
} }
} }
ok=1; ok=1;
@@ -186,15 +306,14 @@ static int read_pw(char *buf, char *buff, int size, char *prompt,int verify)
error: error:
fprintf(stderr,"\n"); fprintf(stderr,"\n");
/* What can we do if there is an error? */ /* What can we do if there is an error? */
#ifndef VMS #if defined(TTY_set) && !defined(VMS)
#ifdef TIOCSETP if (ps >= 2) TTY_set(fileno(tty),&tty_orig);
if (ps >= 2) ioctl(fileno(tty),TIOCSETP,(char *)&tty_orig);
#endif #endif
#else /* VMS */ #ifdef VMS
if (ps >= 2) if (ps >= 2)
status = SYS$QIOW(0,channel,IO$_SETMODE,&iosb,0,0 status = SYS$QIOW(0,channel,IO$_SETMODE,&iosb,0,0
,tty_orig,12,0,0,0,0); ,tty_orig,12,0,0,0,0);
#endif /* VMS */ #endif
if (ps >= 1) popsig(); if (ps >= 1) popsig();
if (stdin != tty) fclose(tty); if (stdin != tty) fclose(tty);
@@ -204,59 +323,38 @@ error:
return(!ok); return(!ok);
} }
int des_read_password(key,prompt,verify) static void pushsig()
des_cblock *key;
char *prompt;
int verify;
{ {
int ok; int i;
char buf[BUFSIZ],buff[BUFSIZ];
if ((ok=read_pw(buf,buff,BUFSIZ,prompt,verify)) == 0) for (i=1; i<NX509_SIG; i++)
des_string_to_key(buf,key); savsig[i]=signal(i,recsig);
bzero(buf,BUFSIZ);
bzero(buff,BUFSIZ);
return(ok);
} }
int des_read_2passwords(key1,key2,prompt,verify) static void popsig()
des_cblock *key1;
des_cblock *key2;
char *prompt;
int verify;
{ {
int ok; int i;
char buf[BUFSIZ],buff[BUFSIZ];
if ((ok=read_pw(buf,buff,BUFSIZ,prompt,verify)) == 0) for (i=1; i<NX509_SIG; i++)
des_string_to_2keys(buf,key1,key2); signal(i,savsig[i]);
bzero(buf,BUFSIZ);
bzero(buff,BUFSIZ);
return(ok);
} }
int des_read_pw_string(buf,length,prompt,verify) static void recsig(i)
char *buf; int i;
int length;
char *prompt;
int verify;
{ {
char buff[BUFSIZ]; longjmp(save,1);
int ret; #ifdef LINT
i=i;
ret=read_pw(buf,buff,(length>BUFSIZ)?BUFSIZ:length,prompt,verify); #endif
bzero(buff,BUFSIZ);
return(ret);
} }
#ifdef MSDOS #ifdef MSDOS
static int noecho_fgets(buf,size,tty) static int noecho_fgets(buf,size,tty)
char *buf; char *buf;
int size; int size;
FILE *tty; FILE *tty;
{ {
int i; int i,n;
char *p; char *p;
p=buf; p=buf;
@@ -277,5 +375,6 @@ FILE *tty;
break; break;
} }
} }
return(strlen(buf));
} }
#endif #endif

View File

@@ -1,9 +1,86 @@
#include "des_locl.h" #ifdef HAVE_CONFIG_H
#include "config.h"
#include "protos.h"
RCSID("$Id$"); RCSID("$Id$");
#endif
#include <des.h>
#include <sys/bitypes.h>
#include <sys/time.h> #include <sys/time.h>
#include <unistd.h>
#include <signal.h> #include <signal.h>
#include <fcntl.h>
/*
* 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 *sum_)
{
int32_t *sum = sum_;
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);
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. * Create a sequence of random 64 bit blocks.
@@ -31,18 +108,15 @@ sigALRM(int sig)
if (igdata < gsize) if (igdata < gsize)
gdata[igdata++] ^= counter & 0xff; gdata[igdata++] ^= counter & 0xff;
#ifdef VOID_RETSIGTYPE SIGRETURN(0);
return;
#else
return (RETSIGTYPE)0;
#endif
} }
/* /*
* Generate size bytes of "random" data using timed interrupts. * Generate size bytes of "random" data using timed interrupts.
* This is a slooow routine but it's meant to be slow. * It takes about 40ms/byte random data.
* It's not neccessary to be root to run it. * It's not neccessary to be root to run it.
*/ */
static
void void
des_rand_data(unsigned char *data, int size) des_rand_data(unsigned char *data, int size)
{ {
@@ -61,6 +135,10 @@ des_rand_data(unsigned char *data, int size)
close(fd); 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; gdata = data;
gsize = size; gsize = size;
igdata = 0; igdata = 0;
@@ -137,7 +215,7 @@ do_initialize(void)
{ {
des_cblock default_seed; des_cblock default_seed;
do { do {
des_rand_data((unsigned char*)&default_seed, sizeof(default_seed)); des_generate_random_block(&default_seed);
des_set_odd_parity(&default_seed); des_set_odd_parity(&default_seed);
} while (des_is_weak_key(&default_seed)); } while (des_is_weak_key(&default_seed));
des_init_random_number_generator(&default_seed); des_init_random_number_generator(&default_seed);
@@ -205,16 +283,15 @@ void
des_init_random_number_generator(des_cblock *seed) des_init_random_number_generator(des_cblock *seed)
{ {
struct timeval now; struct timeval now;
static u_int32_t uniq[2]; des_cblock uniq;
des_cblock new_key; des_cblock new_key;
gettimeofday(&now, (struct timezone *)0); gettimeofday(&now, (struct timezone *)0);
if (uniq[0] == 0 && uniq[1] == 0) des_generate_random_block(&uniq);
des_rand_data((unsigned char *)uniq, sizeof(uniq));
/* Pick a unique random key from the shared sequence. */ /* Pick a unique random key from the shared sequence. */
des_set_random_generator_seed(seed); des_set_random_generator_seed(seed);
set_sequence_number((unsigned char *)uniq); set_sequence_number((unsigned char *)&uniq);
des_new_random_key(&new_key); des_new_random_key(&new_key);
/* Select a new nonshared sequence, */ /* Select a new nonshared sequence, */
@@ -227,10 +304,10 @@ des_init_random_number_generator(des_cblock *seed)
} }
/* This is for backwards compatibility. */ /* This is for backwards compatibility. */
int void
des_random_key(unsigned char *ret) des_random_key(des_cblock ret)
{ {
return des_new_random_key((des_cblock *) ret); des_new_random_key((des_cblock *)ret);
} }
#ifdef TESTRUN #ifdef TESTRUN
@@ -242,7 +319,8 @@ main()
while (1) while (1)
{ {
des_rand_data(data, 8); if (sumFile("/dev/mem", (1024*1024*8), data) != 0)
{ perror("sumFile"); exit(1); }
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
printf("%02x", data[i]); printf("%02x", data[i]);
printf("\n"); printf("\n");
@@ -254,7 +332,7 @@ main()
int int
main() main()
{ {
unsigned char data[8]; des_cblock data;
int i; int i;
while (1) while (1)

68
lib/des/rpc_des.h Normal file
View File

@@ -0,0 +1,68 @@
/* @(#)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 */
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)

96
lib/des/rpc_enc.c Normal file
View File

@@ -0,0 +1,96 @@
/* lib/des/rpc_enc.c */
/* 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.]
*/
#include "rpc_des.h"
#include "des_locl.h"
#include "version.h"
#ifdef PROTO
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;
{
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);
}

View File

@@ -1,37 +1,90 @@
/* rpw.c */ /* lib/des/rpw.c */
/* Copyright (C) 1993 Eric Young - see README for more details */ /* 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.]
*/
#include <stdio.h> #include <stdio.h>
#include "des.h" #include "des.h"
void int main(argc,argv)
main(void) int argc;
{ char *argv[];
des_cblock k,k1; {
int i; des_cblock k,k1;
int i;
printf("read passwd\n"); printf("read passwd\n");
if ((i=des_read_password((des_cblock *)k,"Enter password:",0)) == 0) if ((i=des_read_password((C_Block *)k,"Enter password:",0)) == 0)
{ {
printf("password = "); printf("password = ");
for (i=0; i<8; i++) for (i=0; i<8; i++)
printf("%02x ",k[i]); printf("%02x ",k[i]);
} }
else else
printf("error %d\n",i); printf("error %d\n",i);
printf("\n"); printf("\n");
printf("read 2passwds and verify\n"); printf("read 2passwds and verify\n");
if ((i=des_read_2passwords((des_cblock *)k,(des_cblock *)k1, if ((i=des_read_2passwords((C_Block *)k,(C_Block *)k1,
"Enter verified password:",1)) == 0) "Enter verified password:",1)) == 0)
{ {
printf("password1 = "); printf("password1 = ");
for (i=0; i<8; i++) for (i=0; i<8; i++)
printf("%02x ",k[i]); printf("%02x ",k[i]);
printf("\n"); printf("\n");
printf("password2 = "); printf("password2 = ");
for (i=0; i<8; i++) for (i=0; i<8; i++)
printf("%02x ",k1[i]); printf("%02x ",k1[i]);
printf("\n"); printf("\n");
} exit(1);
else }
printf("error %d\n",i); else
} {
printf("error %d\n",i);
exit(0);
}
#ifdef LINT
return(0);
#endif
}

View File

@@ -1,5 +1,50 @@
/* set_key.c */ /* lib/des/set_key.c */
/* Copyright (C) 1993 Eric Young - see README for more details */ /* 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.]
*/
/* set_key.c v 1.4 eay 24/9/91 /* set_key.c v 1.4 eay 24/9/91
* 1.4 Speed up by 400% :-) * 1.4 Speed up by 400% :-)
* 1.3 added register declarations. * 1.3 added register declarations.
@@ -11,29 +56,35 @@
#include "podd.h" #include "podd.h"
#include "sk.h" #include "sk.h"
#ifdef PROTO
static int check_parity(des_cblock (*key)); static int check_parity(des_cblock (*key));
#else
static int check_parity();
#endif
int des_check_key=0; int des_check_key=0;
void des_set_odd_parity(des_cblock (*key)) void des_set_odd_parity(key)
{ des_cblock (*key);
int i; {
int i;
for (i=0; i<DES_KEY_SZ; i++) for (i=0; i<DES_KEY_SZ; i++)
(*key)[i]=odd_parity[(*key)[i]]; (*key)[i]=odd_parity[(*key)[i]];
} }
static int check_parity(des_cblock (*key)) static int check_parity(key)
{ des_cblock (*key);
int i; {
int i;
for (i=0; i<DES_KEY_SZ; i++) for (i=0; i<DES_KEY_SZ; i++)
{ {
if ((*key)[i] != odd_parity[(*key)[i]]) if ((*key)[i] != odd_parity[(*key)[i]])
return(0); return(0);
} }
return(1); return(1);
} }
/* Weak and semi week keys as take from /* Weak and semi week keys as take from
* %A D.W. Davies * %A D.W. Davies
@@ -46,133 +97,138 @@ static int check_parity(des_cblock (*key))
*/ */
#define NUM_WEAK_KEY 16 #define NUM_WEAK_KEY 16
static des_cblock weak_keys[NUM_WEAK_KEY]={ static des_cblock weak_keys[NUM_WEAK_KEY]={
/* weak keys */ /* weak keys */
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, {0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01},
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, {0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE},
0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F, {0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F},
0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0, {0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0},
/* semi-weak keys */ /* semi-weak keys */
0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE, {0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE},
0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01, {0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01},
0x1F,0xE0,0x1F,0xE0,0x0E,0xF1,0x0E,0xF1, {0x1F,0xE0,0x1F,0xE0,0x0E,0xF1,0x0E,0xF1},
0xE0,0x1F,0xE0,0x1F,0xF1,0x0E,0xF1,0x0E, {0xE0,0x1F,0xE0,0x1F,0xF1,0x0E,0xF1,0x0E},
0x01,0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1, {0x01,0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1},
0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1,0x01, {0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1,0x01},
0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E,0xFE, {0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E,0xFE},
0xFE,0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E, {0xFE,0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E},
0x01,0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E, {0x01,0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E},
0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E,0x01, {0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E,0x01},
0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1,0xFE, {0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1,0xFE},
0xFE,0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1}; {0xFE,0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1}};
int des_is_weak_key(des_cblock (*key)) int des_is_weak_key(key)
{ des_cblock (*key);
int i; {
int i;
for (i=0; i<NUM_WEAK_KEY; i++) for (i=0; i<NUM_WEAK_KEY; i++)
/* Added == 0 to comparision, I obviously don't run /* Added == 0 to comparision, I obviously don't run
* this section very often :-(, thanks to * this section very often :-(, thanks to
* engineering@MorningStar.Com for the fix * engineering@MorningStar.Com for the fix
* eay 93/06/29 */ * eay 93/06/29 */
if (memcmp(weak_keys[i],key,sizeof(key)) == 0) return(1); if (memcmp(weak_keys[i],key,sizeof(key)) == 0) return(1);
return(0); return(0);
} }
/* NOW DEFINED IN des_local.h /* NOW DEFINED IN des_local.h
* See ecb_encrypt.c for a pseudo description of these macros. * See ecb_encrypt.c for a pseudo description of these macros.
* #define PERM_OP(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),\ * #define PERM_OP(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),\
* (b)^=(t),\ * (b)^=(t),\
* (a)=((a)^((t)<<(n)))) * (a)=((a)^((t)<<(n))))
*/ */
#define HPERM_OP(a,t,n,m) ((t)=((((a)<<(16-(n)))^(a))&(m)),\ #define HPERM_OP(a,t,n,m) ((t)=((((a)<<(16-(n)))^(a))&(m)),\
(a)=(a)^(t)^(t>>(16-(n)))) (a)=(a)^(t)^(t>>(16-(n))))
static char shifts2[16]={0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0}; static int shifts2[16]={0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0};
/* return 0 if key parity is odd (correct), /* return 0 if key parity is odd (correct),
* return -1 if key parity error, * return -1 if key parity error,
* return -2 if illegal weak key. * return -2 if illegal weak key.
*/ */
int des_set_key(des_cblock (*key), struct des_ks_struct *schedule) int des_set_key(key, schedule)
{ des_cblock (*key);
register u_int32_t c,d,t,s; des_key_schedule schedule;
register unsigned char *in; {
register u_int32_t *k; register unsigned long c,d,t,s;
register int i; register unsigned char *in;
register unsigned long *k;
register int i;
if (des_check_key) if (des_check_key)
{ {
if (!check_parity(key)) if (!check_parity(key))
return(-1); return(-1);
if (des_is_weak_key(key)) if (des_is_weak_key(key))
return(-2); return(-2);
} }
k=(u_int32_t *)schedule; k=(unsigned long *)schedule;
in=(unsigned char *)key; in=(unsigned char *)key;
c2l(in,c); c2l(in,c);
c2l(in,d); c2l(in,d);
/* do PC1 in 60 simple operations */ /* do PC1 in 60 simple operations */
/* PERM_OP(d,c,t,4,0x0f0f0f0f); /* PERM_OP(d,c,t,4,0x0f0f0f0fL);
HPERM_OP(c,t,-2, 0xcccc0000); HPERM_OP(c,t,-2, 0xcccc0000L);
HPERM_OP(c,t,-1, 0xaaaa0000); HPERM_OP(c,t,-1, 0xaaaa0000L);
HPERM_OP(c,t, 8, 0x00ff0000); HPERM_OP(c,t, 8, 0x00ff0000L);
HPERM_OP(c,t,-1, 0xaaaa0000); HPERM_OP(c,t,-1, 0xaaaa0000L);
HPERM_OP(d,t,-8, 0xff000000); HPERM_OP(d,t,-8, 0xff000000L);
HPERM_OP(d,t, 8, 0x00ff0000); HPERM_OP(d,t, 8, 0x00ff0000L);
HPERM_OP(d,t, 2, 0x33330000); HPERM_OP(d,t, 2, 0x33330000L);
d=((d&0x00aa00aa)<<7)|((d&0x55005500)>>7)|(d&0xaa55aa55); d=((d&0x00aa00aaL)<<7L)|((d&0x55005500L)>>7L)|(d&0xaa55aa55L);
d=(d>>8)|((c&0xf0000000)>>4); d=(d>>8)|((c&0xf0000000L)>>4);
c&=0x0fffffff; */ c&=0x0fffffffL; */
/* I now do it in 47 simple operations :-) /* I now do it in 47 simple operations :-)
* Thanks to John Fletcher (john_fletcher@lccmail.ocf.llnl.gov) * Thanks to John Fletcher (john_fletcher@lccmail.ocf.llnl.gov)
* for the inspiration. :-) */ * for the inspiration. :-) */
PERM_OP (d,c,t,4,0x0f0f0f0f); PERM_OP (d,c,t,4,0x0f0f0f0fL);
HPERM_OP(c,t,-2,0xcccc0000); HPERM_OP(c,t,-2,0xcccc0000L);
HPERM_OP(d,t,-2,0xcccc0000); HPERM_OP(d,t,-2,0xcccc0000L);
PERM_OP (d,c,t,1,0x55555555); PERM_OP (d,c,t,1,0x55555555L);
PERM_OP (c,d,t,8,0x00ff00ff); PERM_OP (c,d,t,8,0x00ff00ffL);
PERM_OP (d,c,t,1,0x55555555); PERM_OP (d,c,t,1,0x55555555L);
d= (((d&0x000000ff)<<16)| (d&0x0000ff00) | d= (((d&0x000000ffL)<<16L)| (d&0x0000ff00L) |
((d&0x00ff0000)>>16)|((c&0xf0000000)>>4)); ((d&0x00ff0000L)>>16L)|((c&0xf0000000L)>>4L));
c&=0x0fffffff; c&=0x0fffffffL;
for (i=0; i<ITERATIONS; i++) for (i=0; i<ITERATIONS; i++)
{ {
if (shifts2[i]) if (shifts2[i])
{ c=((c>>2)|(c<<26)); d=((d>>2)|(d<<26)); } { c=((c>>2L)|(c<<26L)); d=((d>>2L)|(d<<26L)); }
else else
{ c=((c>>1)|(c<<27)); d=((d>>1)|(d<<27)); } { c=((c>>1L)|(c<<27L)); d=((d>>1L)|(d<<27L)); }
c&=0x0fffffff; c&=0x0fffffffL;
d&=0x0fffffff; d&=0x0fffffffL;
/* could be a few less shifts but I am to lazy at this /* could be a few less shifts but I am to lazy at this
* point in time to investigate */ * point in time to investigate */
s= des_skb[0][ (c )&0x3f ]| s= des_skb[0][ (c )&0x3f ]|
des_skb[1][((c>> 6)&0x03)|((c>> 7)&0x3c)]| des_skb[1][((c>> 6)&0x03)|((c>> 7L)&0x3c)]|
des_skb[2][((c>>13)&0x0f)|((c>>14)&0x30)]| des_skb[2][((c>>13)&0x0f)|((c>>14L)&0x30)]|
des_skb[3][((c>>20)&0x01)|((c>>21)&0x06) | des_skb[3][((c>>20)&0x01)|((c>>21L)&0x06) |
((c>>22)&0x38)]; ((c>>22L)&0x38)];
t= des_skb[4][ (d )&0x3f ]| t= des_skb[4][ (d )&0x3f ]|
des_skb[5][((d>> 7)&0x03)|((d>> 8)&0x3c)]| des_skb[5][((d>> 7L)&0x03)|((d>> 8L)&0x3c)]|
des_skb[6][ (d>>15)&0x3f ]| des_skb[6][ (d>>15L)&0x3f ]|
des_skb[7][((d>>21)&0x0f)|((d>>22)&0x30)]; des_skb[7][((d>>21L)&0x0f)|((d>>22L)&0x30)];
/* table contained 0213 4657 */ /* table contained 0213 4657 */
*(k++)=((t<<16)|(s&0x0000ffff))&0xffffffff; *(k++)=((t<<16L)|(s&0x0000ffffL))&0xffffffffL;
s= ((s>>16)|(t&0xffff0000)); s= ((s>>16L)|(t&0xffff0000L));
s=(s<<4)|(s>>28); s=(s<<4L)|(s>>28L);
*(k++)=s&0xffffffff; *(k++)=s&0xffffffffL;
} }
return(0); return(0);
} }
int des_key_sched(des_cblock *key, des_key_schedule schedule) int des_key_sched(key, schedule)
{ des_cblock (*key);
return(des_set_key(key, (struct des_ks_struct *)schedule)); des_key_schedule schedule;
} {
return(des_set_key(key,schedule));
}

View File

@@ -1,140 +1,193 @@
/* sk.h */ /* lib/des/sk.h */
/* Copyright (C) 1993 Eric Young - see README for more details */ /* Copyright (C) 1995 Eric Young (eay@mincom.oz.au)
static u_int32_t des_skb[8][64]={ * 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.]
*/
static const unsigned long des_skb[8][64]={
{
/* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
0x00000000,0x00000010,0x20000000,0x20000010, 0x00000000L,0x00000010L,0x20000000L,0x20000010L,
0x00010000,0x00010010,0x20010000,0x20010010, 0x00010000L,0x00010010L,0x20010000L,0x20010010L,
0x00000800,0x00000810,0x20000800,0x20000810, 0x00000800L,0x00000810L,0x20000800L,0x20000810L,
0x00010800,0x00010810,0x20010800,0x20010810, 0x00010800L,0x00010810L,0x20010800L,0x20010810L,
0x00000020,0x00000030,0x20000020,0x20000030, 0x00000020L,0x00000030L,0x20000020L,0x20000030L,
0x00010020,0x00010030,0x20010020,0x20010030, 0x00010020L,0x00010030L,0x20010020L,0x20010030L,
0x00000820,0x00000830,0x20000820,0x20000830, 0x00000820L,0x00000830L,0x20000820L,0x20000830L,
0x00010820,0x00010830,0x20010820,0x20010830, 0x00010820L,0x00010830L,0x20010820L,0x20010830L,
0x00080000,0x00080010,0x20080000,0x20080010, 0x00080000L,0x00080010L,0x20080000L,0x20080010L,
0x00090000,0x00090010,0x20090000,0x20090010, 0x00090000L,0x00090010L,0x20090000L,0x20090010L,
0x00080800,0x00080810,0x20080800,0x20080810, 0x00080800L,0x00080810L,0x20080800L,0x20080810L,
0x00090800,0x00090810,0x20090800,0x20090810, 0x00090800L,0x00090810L,0x20090800L,0x20090810L,
0x00080020,0x00080030,0x20080020,0x20080030, 0x00080020L,0x00080030L,0x20080020L,0x20080030L,
0x00090020,0x00090030,0x20090020,0x20090030, 0x00090020L,0x00090030L,0x20090020L,0x20090030L,
0x00080820,0x00080830,0x20080820,0x20080830, 0x00080820L,0x00080830L,0x20080820L,0x20080830L,
0x00090820,0x00090830,0x20090820,0x20090830, 0x00090820L,0x00090830L,0x20090820L,0x20090830L,
},{
/* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */ /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */
0x00000000,0x02000000,0x00002000,0x02002000, 0x00000000L,0x02000000L,0x00002000L,0x02002000L,
0x00200000,0x02200000,0x00202000,0x02202000, 0x00200000L,0x02200000L,0x00202000L,0x02202000L,
0x00000004,0x02000004,0x00002004,0x02002004, 0x00000004L,0x02000004L,0x00002004L,0x02002004L,
0x00200004,0x02200004,0x00202004,0x02202004, 0x00200004L,0x02200004L,0x00202004L,0x02202004L,
0x00000400,0x02000400,0x00002400,0x02002400, 0x00000400L,0x02000400L,0x00002400L,0x02002400L,
0x00200400,0x02200400,0x00202400,0x02202400, 0x00200400L,0x02200400L,0x00202400L,0x02202400L,
0x00000404,0x02000404,0x00002404,0x02002404, 0x00000404L,0x02000404L,0x00002404L,0x02002404L,
0x00200404,0x02200404,0x00202404,0x02202404, 0x00200404L,0x02200404L,0x00202404L,0x02202404L,
0x10000000,0x12000000,0x10002000,0x12002000, 0x10000000L,0x12000000L,0x10002000L,0x12002000L,
0x10200000,0x12200000,0x10202000,0x12202000, 0x10200000L,0x12200000L,0x10202000L,0x12202000L,
0x10000004,0x12000004,0x10002004,0x12002004, 0x10000004L,0x12000004L,0x10002004L,0x12002004L,
0x10200004,0x12200004,0x10202004,0x12202004, 0x10200004L,0x12200004L,0x10202004L,0x12202004L,
0x10000400,0x12000400,0x10002400,0x12002400, 0x10000400L,0x12000400L,0x10002400L,0x12002400L,
0x10200400,0x12200400,0x10202400,0x12202400, 0x10200400L,0x12200400L,0x10202400L,0x12202400L,
0x10000404,0x12000404,0x10002404,0x12002404, 0x10000404L,0x12000404L,0x10002404L,0x12002404L,
0x10200404,0x12200404,0x10202404,0x12202404, 0x10200404L,0x12200404L,0x10202404L,0x12202404L,
},{
/* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */ /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */
0x00000000,0x00000001,0x00040000,0x00040001, 0x00000000L,0x00000001L,0x00040000L,0x00040001L,
0x01000000,0x01000001,0x01040000,0x01040001, 0x01000000L,0x01000001L,0x01040000L,0x01040001L,
0x00000002,0x00000003,0x00040002,0x00040003, 0x00000002L,0x00000003L,0x00040002L,0x00040003L,
0x01000002,0x01000003,0x01040002,0x01040003, 0x01000002L,0x01000003L,0x01040002L,0x01040003L,
0x00000200,0x00000201,0x00040200,0x00040201, 0x00000200L,0x00000201L,0x00040200L,0x00040201L,
0x01000200,0x01000201,0x01040200,0x01040201, 0x01000200L,0x01000201L,0x01040200L,0x01040201L,
0x00000202,0x00000203,0x00040202,0x00040203, 0x00000202L,0x00000203L,0x00040202L,0x00040203L,
0x01000202,0x01000203,0x01040202,0x01040203, 0x01000202L,0x01000203L,0x01040202L,0x01040203L,
0x08000000,0x08000001,0x08040000,0x08040001, 0x08000000L,0x08000001L,0x08040000L,0x08040001L,
0x09000000,0x09000001,0x09040000,0x09040001, 0x09000000L,0x09000001L,0x09040000L,0x09040001L,
0x08000002,0x08000003,0x08040002,0x08040003, 0x08000002L,0x08000003L,0x08040002L,0x08040003L,
0x09000002,0x09000003,0x09040002,0x09040003, 0x09000002L,0x09000003L,0x09040002L,0x09040003L,
0x08000200,0x08000201,0x08040200,0x08040201, 0x08000200L,0x08000201L,0x08040200L,0x08040201L,
0x09000200,0x09000201,0x09040200,0x09040201, 0x09000200L,0x09000201L,0x09040200L,0x09040201L,
0x08000202,0x08000203,0x08040202,0x08040203, 0x08000202L,0x08000203L,0x08040202L,0x08040203L,
0x09000202,0x09000203,0x09040202,0x09040203, 0x09000202L,0x09000203L,0x09040202L,0x09040203L,
},{
/* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */ /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */
0x00000000,0x00100000,0x00000100,0x00100100, 0x00000000L,0x00100000L,0x00000100L,0x00100100L,
0x00000008,0x00100008,0x00000108,0x00100108, 0x00000008L,0x00100008L,0x00000108L,0x00100108L,
0x00001000,0x00101000,0x00001100,0x00101100, 0x00001000L,0x00101000L,0x00001100L,0x00101100L,
0x00001008,0x00101008,0x00001108,0x00101108, 0x00001008L,0x00101008L,0x00001108L,0x00101108L,
0x04000000,0x04100000,0x04000100,0x04100100, 0x04000000L,0x04100000L,0x04000100L,0x04100100L,
0x04000008,0x04100008,0x04000108,0x04100108, 0x04000008L,0x04100008L,0x04000108L,0x04100108L,
0x04001000,0x04101000,0x04001100,0x04101100, 0x04001000L,0x04101000L,0x04001100L,0x04101100L,
0x04001008,0x04101008,0x04001108,0x04101108, 0x04001008L,0x04101008L,0x04001108L,0x04101108L,
0x00020000,0x00120000,0x00020100,0x00120100, 0x00020000L,0x00120000L,0x00020100L,0x00120100L,
0x00020008,0x00120008,0x00020108,0x00120108, 0x00020008L,0x00120008L,0x00020108L,0x00120108L,
0x00021000,0x00121000,0x00021100,0x00121100, 0x00021000L,0x00121000L,0x00021100L,0x00121100L,
0x00021008,0x00121008,0x00021108,0x00121108, 0x00021008L,0x00121008L,0x00021108L,0x00121108L,
0x04020000,0x04120000,0x04020100,0x04120100, 0x04020000L,0x04120000L,0x04020100L,0x04120100L,
0x04020008,0x04120008,0x04020108,0x04120108, 0x04020008L,0x04120008L,0x04020108L,0x04120108L,
0x04021000,0x04121000,0x04021100,0x04121100, 0x04021000L,0x04121000L,0x04021100L,0x04121100L,
0x04021008,0x04121008,0x04021108,0x04121108, 0x04021008L,0x04121008L,0x04021108L,0x04121108L,
},{
/* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
0x00000000,0x10000000,0x00010000,0x10010000, 0x00000000L,0x10000000L,0x00010000L,0x10010000L,
0x00000004,0x10000004,0x00010004,0x10010004, 0x00000004L,0x10000004L,0x00010004L,0x10010004L,
0x20000000,0x30000000,0x20010000,0x30010000, 0x20000000L,0x30000000L,0x20010000L,0x30010000L,
0x20000004,0x30000004,0x20010004,0x30010004, 0x20000004L,0x30000004L,0x20010004L,0x30010004L,
0x00100000,0x10100000,0x00110000,0x10110000, 0x00100000L,0x10100000L,0x00110000L,0x10110000L,
0x00100004,0x10100004,0x00110004,0x10110004, 0x00100004L,0x10100004L,0x00110004L,0x10110004L,
0x20100000,0x30100000,0x20110000,0x30110000, 0x20100000L,0x30100000L,0x20110000L,0x30110000L,
0x20100004,0x30100004,0x20110004,0x30110004, 0x20100004L,0x30100004L,0x20110004L,0x30110004L,
0x00001000,0x10001000,0x00011000,0x10011000, 0x00001000L,0x10001000L,0x00011000L,0x10011000L,
0x00001004,0x10001004,0x00011004,0x10011004, 0x00001004L,0x10001004L,0x00011004L,0x10011004L,
0x20001000,0x30001000,0x20011000,0x30011000, 0x20001000L,0x30001000L,0x20011000L,0x30011000L,
0x20001004,0x30001004,0x20011004,0x30011004, 0x20001004L,0x30001004L,0x20011004L,0x30011004L,
0x00101000,0x10101000,0x00111000,0x10111000, 0x00101000L,0x10101000L,0x00111000L,0x10111000L,
0x00101004,0x10101004,0x00111004,0x10111004, 0x00101004L,0x10101004L,0x00111004L,0x10111004L,
0x20101000,0x30101000,0x20111000,0x30111000, 0x20101000L,0x30101000L,0x20111000L,0x30111000L,
0x20101004,0x30101004,0x20111004,0x30111004, 0x20101004L,0x30101004L,0x20111004L,0x30111004L,
},{
/* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */ /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
0x00000000,0x08000000,0x00000008,0x08000008, 0x00000000L,0x08000000L,0x00000008L,0x08000008L,
0x00000400,0x08000400,0x00000408,0x08000408, 0x00000400L,0x08000400L,0x00000408L,0x08000408L,
0x00020000,0x08020000,0x00020008,0x08020008, 0x00020000L,0x08020000L,0x00020008L,0x08020008L,
0x00020400,0x08020400,0x00020408,0x08020408, 0x00020400L,0x08020400L,0x00020408L,0x08020408L,
0x00000001,0x08000001,0x00000009,0x08000009, 0x00000001L,0x08000001L,0x00000009L,0x08000009L,
0x00000401,0x08000401,0x00000409,0x08000409, 0x00000401L,0x08000401L,0x00000409L,0x08000409L,
0x00020001,0x08020001,0x00020009,0x08020009, 0x00020001L,0x08020001L,0x00020009L,0x08020009L,
0x00020401,0x08020401,0x00020409,0x08020409, 0x00020401L,0x08020401L,0x00020409L,0x08020409L,
0x02000000,0x0A000000,0x02000008,0x0A000008, 0x02000000L,0x0A000000L,0x02000008L,0x0A000008L,
0x02000400,0x0A000400,0x02000408,0x0A000408, 0x02000400L,0x0A000400L,0x02000408L,0x0A000408L,
0x02020000,0x0A020000,0x02020008,0x0A020008, 0x02020000L,0x0A020000L,0x02020008L,0x0A020008L,
0x02020400,0x0A020400,0x02020408,0x0A020408, 0x02020400L,0x0A020400L,0x02020408L,0x0A020408L,
0x02000001,0x0A000001,0x02000009,0x0A000009, 0x02000001L,0x0A000001L,0x02000009L,0x0A000009L,
0x02000401,0x0A000401,0x02000409,0x0A000409, 0x02000401L,0x0A000401L,0x02000409L,0x0A000409L,
0x02020001,0x0A020001,0x02020009,0x0A020009, 0x02020001L,0x0A020001L,0x02020009L,0x0A020009L,
0x02020401,0x0A020401,0x02020409,0x0A020409, 0x02020401L,0x0A020401L,0x02020409L,0x0A020409L,
},{
/* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */ /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
0x00000000,0x00000100,0x00080000,0x00080100, 0x00000000L,0x00000100L,0x00080000L,0x00080100L,
0x01000000,0x01000100,0x01080000,0x01080100, 0x01000000L,0x01000100L,0x01080000L,0x01080100L,
0x00000010,0x00000110,0x00080010,0x00080110, 0x00000010L,0x00000110L,0x00080010L,0x00080110L,
0x01000010,0x01000110,0x01080010,0x01080110, 0x01000010L,0x01000110L,0x01080010L,0x01080110L,
0x00200000,0x00200100,0x00280000,0x00280100, 0x00200000L,0x00200100L,0x00280000L,0x00280100L,
0x01200000,0x01200100,0x01280000,0x01280100, 0x01200000L,0x01200100L,0x01280000L,0x01280100L,
0x00200010,0x00200110,0x00280010,0x00280110, 0x00200010L,0x00200110L,0x00280010L,0x00280110L,
0x01200010,0x01200110,0x01280010,0x01280110, 0x01200010L,0x01200110L,0x01280010L,0x01280110L,
0x00000200,0x00000300,0x00080200,0x00080300, 0x00000200L,0x00000300L,0x00080200L,0x00080300L,
0x01000200,0x01000300,0x01080200,0x01080300, 0x01000200L,0x01000300L,0x01080200L,0x01080300L,
0x00000210,0x00000310,0x00080210,0x00080310, 0x00000210L,0x00000310L,0x00080210L,0x00080310L,
0x01000210,0x01000310,0x01080210,0x01080310, 0x01000210L,0x01000310L,0x01080210L,0x01080310L,
0x00200200,0x00200300,0x00280200,0x00280300, 0x00200200L,0x00200300L,0x00280200L,0x00280300L,
0x01200200,0x01200300,0x01280200,0x01280300, 0x01200200L,0x01200300L,0x01280200L,0x01280300L,
0x00200210,0x00200310,0x00280210,0x00280310, 0x00200210L,0x00200310L,0x00280210L,0x00280310L,
0x01200210,0x01200310,0x01280210,0x01280310, 0x01200210L,0x01200310L,0x01280210L,0x01280310L,
},{
/* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */ /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
0x00000000,0x04000000,0x00040000,0x04040000, 0x00000000L,0x04000000L,0x00040000L,0x04040000L,
0x00000002,0x04000002,0x00040002,0x04040002, 0x00000002L,0x04000002L,0x00040002L,0x04040002L,
0x00002000,0x04002000,0x00042000,0x04042000, 0x00002000L,0x04002000L,0x00042000L,0x04042000L,
0x00002002,0x04002002,0x00042002,0x04042002, 0x00002002L,0x04002002L,0x00042002L,0x04042002L,
0x00000020,0x04000020,0x00040020,0x04040020, 0x00000020L,0x04000020L,0x00040020L,0x04040020L,
0x00000022,0x04000022,0x00040022,0x04040022, 0x00000022L,0x04000022L,0x00040022L,0x04040022L,
0x00002020,0x04002020,0x00042020,0x04042020, 0x00002020L,0x04002020L,0x00042020L,0x04042020L,
0x00002022,0x04002022,0x00042022,0x04042022, 0x00002022L,0x04002022L,0x00042022L,0x04042022L,
0x00000800,0x04000800,0x00040800,0x04040800, 0x00000800L,0x04000800L,0x00040800L,0x04040800L,
0x00000802,0x04000802,0x00040802,0x04040802, 0x00000802L,0x04000802L,0x00040802L,0x04040802L,
0x00002800,0x04002800,0x00042800,0x04042800, 0x00002800L,0x04002800L,0x00042800L,0x04042800L,
0x00002802,0x04002802,0x00042802,0x04042802, 0x00002802L,0x04002802L,0x00042802L,0x04042802L,
0x00000820,0x04000820,0x00040820,0x04040820, 0x00000820L,0x04000820L,0x00040820L,0x04040820L,
0x00000822,0x04000822,0x00040822,0x04040822, 0x00000822L,0x04000822L,0x00040822L,0x04040822L,
0x00002820,0x04002820,0x00042820,0x04042820, 0x00002820L,0x04002820L,0x00042820L,0x04042820L,
0x00002822,0x04002822,0x00042822,0x04042822, 0x00002822L,0x04002822L,0x00042822L,0x04042822L,
}; }};

View File

@@ -1,5 +1,50 @@
/* speed.c */ /* lib/des/speed.c */
/* Copyright (C) 1993 Eric Young - see README for more details */ /* 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.]
*/
/* 11-Sep-92 Andrew Daviel Support for Silicon Graphics IRIX added */ /* 11-Sep-92 Andrew Daviel Support for Silicon Graphics IRIX added */
/* 06-Apr-92 Luke Brennan Support for VMS and add extra signal calls */ /* 06-Apr-92 Luke Brennan Support for VMS and add extra signal calls */
@@ -8,198 +53,258 @@
#endif #endif
#include <stdio.h> #include <stdio.h>
#ifndef MSDOS
#include <unistd.h>
#else
#include <io.h>
#endif
#include <signal.h> #include <signal.h>
#ifndef VMS #ifndef VMS
#if !(defined(_IRIX) || defined(sgi)) #ifndef _IRIX
#include <time.h> #include <time.h>
#endif #endif
#ifdef TIMES #ifdef TIMES
#include <sys/types.h> #include <sys/types.h>
#include <sys/times.h> #include <sys/times.h>
#endif /* TIMES */ #endif
#else /* VMS */ #else /* VMS */
#include <types.h> #include <types.h>
struct tms { struct tms {
time_t tms_utime; time_t tms_utime;
time_t tms_stime; time_t tms_stime;
time_t tms_uchild; /* I dunno... */ time_t tms_uchild; /* I dunno... */
time_t tms_uchildsys; /* so these names are a guess :-) */ time_t tms_uchildsys; /* so these names are a guess :-) */
} }
#endif #endif
#ifndef TIMES #ifndef TIMES
#include <sys/timeb.h> #include <sys/timeb.h>
#endif #endif
#ifdef sun
#include <limits.h>
#include <sys/param.h>
#endif
#include "des.h" #include "des.h"
/* The following if from times(3) man page. It may need to be changed */ /* The following if from times(3) man page. It may need to be changed */
#ifndef HZ
#ifndef CLK_TCK #ifndef CLK_TCK
#ifndef VMS #ifndef VMS
#define HZ 60.0 #define HZ 100.0
#else /* VMS */ #else /* VMS */
#define HZ 100.0 #define HZ 100.0
#endif #endif
#else /* CLK_TCK */ #else /* CLK_TCK */
#define HZ ((double)CLK_TCK) #define HZ ((double)CLK_TCK)
#endif #endif
#endif
#define BUFSIZE ((long)1024*8) #define BUFSIZE ((long)1024*8)
long run=0; long run=0;
#ifdef PROTO
double Time_F(int s);
#else
double Time_F();
#endif
#ifdef SIGALRM #ifdef SIGALRM
#ifdef __STDC__ #if defined(__STDC__) || defined(sgi)
#define SIGRETTYPE void #define SIGRETTYPE void
#else #else
#define SIGRETTYPE int #define SIGRETTYPE int
#endif #endif
static SIGRETTYPE #ifdef PROTO
sig_done(int sig) SIGRETTYPE sig_done(int sig);
{ #else
signal(SIGALRM,sig_done); SIGRETTYPE sig_done();
run=0; #endif
}
unsigned int alarm(int seconds); SIGRETTYPE sig_done(sig)
int sig;
{
signal(SIGALRM,sig_done);
run=0;
#ifdef LINT
sig=sig;
#endif
}
#endif #endif
#define START 0 #define START 0
#define STOP 1 #define STOP 1
static double double Time_F(s)
Time_F(int s) int s;
{ {
double ret; double ret;
#ifdef TIMES #ifdef TIMES
static struct tms tstart,tend; static struct tms tstart,tend;
if (s == START) if (s == START)
{ {
times(&tstart); times(&tstart);
return(0); return(0);
} }
else else
{ {
times(&tend); times(&tend);
ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ; ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
return((ret == 0.0)?1e-6:ret); return((ret == 0.0)?1e-6:ret);
} }
#else /* !times() */ #else /* !times() */
static struct timeb tstart,tend; static struct timeb tstart,tend;
long i; long i;
if (s == START) if (s == START)
{ {
ftime(&tstart); ftime(&tstart);
return(0); return(0);
} }
else else
{ {
ftime(&tend); ftime(&tend);
i=(long)tend.millitm-(long)tstart.millitm; i=(long)tend.millitm-(long)tstart.millitm;
ret=((double)(tend.time-tstart.time))+((double)i)/1000.0; ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
return((ret == 0.0)?1e-6:ret); return((ret == 0.0)?1e-6:ret);
} }
#endif #endif
} }
void int main(argc,argv)
main(int argc, char **argv) int argc;
{ char **argv;
long count; {
static unsigned char buf[BUFSIZE]; long count;
static des_cblock key={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0}; static unsigned char buf[BUFSIZE];
des_key_schedule sch; static des_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
double d,a,b,c; static des_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
#ifndef SIGALRM static des_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
long ca,cb,cc,cd; des_key_schedule sch,sch2,sch3;
double a,b,c,d,e;
#ifndef SIGALARM
long ca,cb,cc,cd,ce;
#endif #endif
#ifndef TIMES #ifndef TIMES
printf("To get the most acurate results, try to run this\n"); printf("To get the most acurate results, try to run this\n");
printf("program when this computer is idle.\n"); printf("program when this computer is idle.\n");
#endif #endif
des_set_key((C_Block *)key2,sch2);
des_set_key((C_Block *)key3,sch3);
#ifndef SIGALRM #ifndef SIGALRM
printf("First we calculate the aproximate speed ...\n"); printf("First we calculate the aproximate speed ...\n");
des_set_key((des_cblock *)key,sch); des_set_key((C_Block *)key,sch);
count=10; count=10;
do { do {
int i; long i;
count*=2;
Time_F(START); count*=2;
for (i=count; i; i--) Time_F(START);
des_ecb_encrypt((des_cblock *)buf,(des_cblock *)buf, for (i=count; i; i--)
&(sch[0]),DES_ENCRYPT); des_ecb_encrypt((C_Block *)buf,(C_Block *)buf,
d=Time_F(STOP); &(sch[0]),DES_ENCRYPT);
} while (d <3); d=Time_F(STOP);
ca=count; } while (d < 3.0);
cb=count*10; ca=count;
cc=count*10*8/BUFSIZE+1; cb=count*3;
cd=count/20+1; cc=count*3*8/BUFSIZE+1;
printf("Doing set_key %ld times\n",ca); cd=count*8/BUFSIZE+1;
ce=count/20+1;
printf("Doing set_key %ld times\n",ca);
#define COND(d) (count != (d)) #define COND(d) (count != (d))
#define COUNT(d) (d) #define COUNT(d) (d)
#else #else
#define COND(c) (run) #define COND(c) (run)
#define COUNT(d) (count) #define COUNT(d) (count)
signal(SIGALRM,sig_done); signal(SIGALRM,sig_done);
printf("Doing set_key for 10 seconds\n"); printf("Doing set_key for 10 seconds\n");
alarm(10); alarm(10);
#endif #endif
Time_F(START); Time_F(START);
for (count=0,run=1; COND(ca); count++) for (count=0,run=1; COND(ca); count++)
des_set_key((des_cblock *)key,sch); des_set_key((C_Block *)key,sch);
d=Time_F(STOP); d=Time_F(STOP);
printf("%ld set_key's in %.2f seconds\n",count,d); printf("%ld set_key's in %.2f seconds\n",count,d);
a=((double)COUNT(ca))/d; a=((double)COUNT(ca))/d;
#ifdef SIGALRM #ifdef SIGALRM
printf("Doing des_ecb_encrypt's for 10 seconds\n"); printf("Doing des_ecb_encrypt's for 10 seconds\n");
alarm(10); alarm(10);
#else #else
printf("Doing des_ecb_encrypt %ld times\n",cb); printf("Doing des_ecb_encrypt %ld times\n",cb);
#endif #endif
Time_F(START); Time_F(START);
for (count=0,run=1; COND(cb); count++) for (count=0,run=1; COND(cb); count++)
des_ecb_encrypt((des_cblock *)buf,(des_cblock *)buf, des_ecb_encrypt((C_Block *)buf,(C_Block *)buf,
&(sch[0]),DES_ENCRYPT); &(sch[0]),DES_ENCRYPT);
d=Time_F(STOP); d=Time_F(STOP);
printf("%ld des_ecb_encrypt's in %.2f second\n",count,d); printf("%ld des_ecb_encrypt's in %.2f second\n",count,d);
b=((double)COUNT(cb)*8)/d; b=((double)COUNT(cb)*8)/d;
#ifdef SIGALRM #ifdef SIGALRM
printf("Doing des_cbc_encrypt on %ld byte blocks for 10 seconds\n", printf("Doing des_cbc_encrypt on %ld byte blocks for 10 seconds\n",
BUFSIZE); BUFSIZE);
alarm(10); alarm(10);
#else #else
printf("Doing des_cbc_encrypt %ld times on %ld byte blocks\n",cc, printf("Doing des_cbc_encrypt %ld times on %ld byte blocks\n",cc,
BUFSIZE); BUFSIZE);
#endif #endif
Time_F(START); Time_F(START);
for (count=0,run=1; COND(cc); count++) for (count=0,run=1; COND(cc); count++)
des_cbc_encrypt((des_cblock *)buf,(des_cblock *)buf,BUFSIZE,&(sch[0]), des_cbc_encrypt((C_Block *)buf,(C_Block *)buf,BUFSIZE,&(sch[0]),
(des_cblock *)&(key[0]),DES_ENCRYPT); (C_Block *)&(key[0]),DES_ENCRYPT);
d=Time_F(STOP); d=Time_F(STOP);
printf("%ld des_cbc_encrypt's of %ld byte blocks in %.2f second\n", printf("%ld des_cbc_encrypt's of %ld byte blocks in %.2f second\n",
count,BUFSIZE,d); count,BUFSIZE,d);
c=((double)COUNT(cc)*BUFSIZE)/d; c=((double)COUNT(cc)*BUFSIZE)/d;
#ifdef SIGALRM #ifdef SIGALRM
printf("Doing crypt for 10 seconds\n"); printf("Doing des_ede_cbc_encrypt on %ld byte blocks for 10 seconds\n",
alarm(10); BUFSIZE);
alarm(10);
#else #else
printf("Doing crypt %ld times\n",cd); printf("Doing des_ede_cbc_encrypt %ld times on %ld byte blocks\n",cd,
BUFSIZE);
#endif #endif
Time_F(START); Time_F(START);
for (count=0,run=1; COND(cd); count++) for (count=0,run=1; COND(cd); count++)
crypt("testing1","ef"); des_ede3_cbc_encrypt((C_Block *)buf,(C_Block *)buf,BUFSIZE,
d=Time_F(STOP); &(sch[0]),
printf("%ld crypts in %.2f second\n",count,d); &(sch2[0]),
d=((double)COUNT(cd))/d; &(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;
printf("set_key per sec = %12.2f (%5.1fuS)\n",a,1.0e6/a); #ifdef SIGALRM
printf("DES ecb bytes per sec = %12.2f (%5.1fuS)\n",b,8.0e6/b); printf("Doing crypt for 10 seconds\n");
printf("DES cbc bytes per sec = %12.2f (%5.1fuS)\n",c,8.0e6/c); alarm(10);
printf("crypt per sec = %12.2f (%5.1fuS)\n",d,1.0e6/d); #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 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);
#ifdef LINT
return(0);
#endif
}

View File

@@ -1,146 +1,193 @@
/* spr.h */ /* lib/des/spr.h */
/* Copyright (C) 1993 Eric Young - see README for more details */ /* Copyright (C) 1995 Eric Young (eay@mincom.oz.au)
static u_int32_t des_SPtrans[8][64]={ * 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.]
*/
static const unsigned long des_SPtrans[8][64]={
{
/* nibble 0 */ /* nibble 0 */
0x00820200, 0x00020000, 0x80800000, 0x80820200, 0x00820200L, 0x00020000L, 0x80800000L, 0x80820200L,
0x00800000, 0x80020200, 0x80020000, 0x80800000, 0x00800000L, 0x80020200L, 0x80020000L, 0x80800000L,
0x80020200, 0x00820200, 0x00820000, 0x80000200, 0x80020200L, 0x00820200L, 0x00820000L, 0x80000200L,
0x80800200, 0x00800000, 0x00000000, 0x80020000, 0x80800200L, 0x00800000L, 0x00000000L, 0x80020000L,
0x00020000, 0x80000000, 0x00800200, 0x00020200, 0x00020000L, 0x80000000L, 0x00800200L, 0x00020200L,
0x80820200, 0x00820000, 0x80000200, 0x00800200, 0x80820200L, 0x00820000L, 0x80000200L, 0x00800200L,
0x80000000, 0x00000200, 0x00020200, 0x80820000, 0x80000000L, 0x00000200L, 0x00020200L, 0x80820000L,
0x00000200, 0x80800200, 0x80820000, 0x00000000, 0x00000200L, 0x80800200L, 0x80820000L, 0x00000000L,
0x00000000, 0x80820200, 0x00800200, 0x80020000, 0x00000000L, 0x80820200L, 0x00800200L, 0x80020000L,
0x00820200, 0x00020000, 0x80000200, 0x00800200, 0x00820200L, 0x00020000L, 0x80000200L, 0x00800200L,
0x80820000, 0x00000200, 0x00020200, 0x80800000, 0x80820000L, 0x00000200L, 0x00020200L, 0x80800000L,
0x80020200, 0x80000000, 0x80800000, 0x00820000, 0x80020200L, 0x80000000L, 0x80800000L, 0x00820000L,
0x80820200, 0x00020200, 0x00820000, 0x80800200, 0x80820200L, 0x00020200L, 0x00820000L, 0x80800200L,
0x00800000, 0x80000200, 0x80020000, 0x00000000, 0x00800000L, 0x80000200L, 0x80020000L, 0x00000000L,
0x00020000, 0x00800000, 0x80800200, 0x00820200, 0x00020000L, 0x00800000L, 0x80800200L, 0x00820200L,
0x80000000, 0x80820000, 0x00000200, 0x80020200, 0x80000000L, 0x80820000L, 0x00000200L, 0x80020200L,
},{
/* nibble 1 */ /* nibble 1 */
0x10042004, 0x00000000, 0x00042000, 0x10040000, 0x10042004L, 0x00000000L, 0x00042000L, 0x10040000L,
0x10000004, 0x00002004, 0x10002000, 0x00042000, 0x10000004L, 0x00002004L, 0x10002000L, 0x00042000L,
0x00002000, 0x10040004, 0x00000004, 0x10002000, 0x00002000L, 0x10040004L, 0x00000004L, 0x10002000L,
0x00040004, 0x10042000, 0x10040000, 0x00000004, 0x00040004L, 0x10042000L, 0x10040000L, 0x00000004L,
0x00040000, 0x10002004, 0x10040004, 0x00002000, 0x00040000L, 0x10002004L, 0x10040004L, 0x00002000L,
0x00042004, 0x10000000, 0x00000000, 0x00040004, 0x00042004L, 0x10000000L, 0x00000000L, 0x00040004L,
0x10002004, 0x00042004, 0x10042000, 0x10000004, 0x10002004L, 0x00042004L, 0x10042000L, 0x10000004L,
0x10000000, 0x00040000, 0x00002004, 0x10042004, 0x10000000L, 0x00040000L, 0x00002004L, 0x10042004L,
0x00040004, 0x10042000, 0x10002000, 0x00042004, 0x00040004L, 0x10042000L, 0x10002000L, 0x00042004L,
0x10042004, 0x00040004, 0x10000004, 0x00000000, 0x10042004L, 0x00040004L, 0x10000004L, 0x00000000L,
0x10000000, 0x00002004, 0x00040000, 0x10040004, 0x10000000L, 0x00002004L, 0x00040000L, 0x10040004L,
0x00002000, 0x10000000, 0x00042004, 0x10002004, 0x00002000L, 0x10000000L, 0x00042004L, 0x10002004L,
0x10042000, 0x00002000, 0x00000000, 0x10000004, 0x10042000L, 0x00002000L, 0x00000000L, 0x10000004L,
0x00000004, 0x10042004, 0x00042000, 0x10040000, 0x00000004L, 0x10042004L, 0x00042000L, 0x10040000L,
0x10040004, 0x00040000, 0x00002004, 0x10002000, 0x10040004L, 0x00040000L, 0x00002004L, 0x10002000L,
0x10002004, 0x00000004, 0x10040000, 0x00042000, 0x10002004L, 0x00000004L, 0x10040000L, 0x00042000L,
},{
/* nibble 2 */ /* nibble 2 */
0x41000000, 0x01010040, 0x00000040, 0x41000040, 0x41000000L, 0x01010040L, 0x00000040L, 0x41000040L,
0x40010000, 0x01000000, 0x41000040, 0x00010040, 0x40010000L, 0x01000000L, 0x41000040L, 0x00010040L,
0x01000040, 0x00010000, 0x01010000, 0x40000000, 0x01000040L, 0x00010000L, 0x01010000L, 0x40000000L,
0x41010040, 0x40000040, 0x40000000, 0x41010000, 0x41010040L, 0x40000040L, 0x40000000L, 0x41010000L,
0x00000000, 0x40010000, 0x01010040, 0x00000040, 0x00000000L, 0x40010000L, 0x01010040L, 0x00000040L,
0x40000040, 0x41010040, 0x00010000, 0x41000000, 0x40000040L, 0x41010040L, 0x00010000L, 0x41000000L,
0x41010000, 0x01000040, 0x40010040, 0x01010000, 0x41010000L, 0x01000040L, 0x40010040L, 0x01010000L,
0x00010040, 0x00000000, 0x01000000, 0x40010040, 0x00010040L, 0x00000000L, 0x01000000L, 0x40010040L,
0x01010040, 0x00000040, 0x40000000, 0x00010000, 0x01010040L, 0x00000040L, 0x40000000L, 0x00010000L,
0x40000040, 0x40010000, 0x01010000, 0x41000040, 0x40000040L, 0x40010000L, 0x01010000L, 0x41000040L,
0x00000000, 0x01010040, 0x00010040, 0x41010000, 0x00000000L, 0x01010040L, 0x00010040L, 0x41010000L,
0x40010000, 0x01000000, 0x41010040, 0x40000000, 0x40010000L, 0x01000000L, 0x41010040L, 0x40000000L,
0x40010040, 0x41000000, 0x01000000, 0x41010040, 0x40010040L, 0x41000000L, 0x01000000L, 0x41010040L,
0x00010000, 0x01000040, 0x41000040, 0x00010040, 0x00010000L, 0x01000040L, 0x41000040L, 0x00010040L,
0x01000040, 0x00000000, 0x41010000, 0x40000040, 0x01000040L, 0x00000000L, 0x41010000L, 0x40000040L,
0x41000000, 0x40010040, 0x00000040, 0x01010000, 0x41000000L, 0x40010040L, 0x00000040L, 0x01010000L,
},{
/* nibble 3 */ /* nibble 3 */
0x00100402, 0x04000400, 0x00000002, 0x04100402, 0x00100402L, 0x04000400L, 0x00000002L, 0x04100402L,
0x00000000, 0x04100000, 0x04000402, 0x00100002, 0x00000000L, 0x04100000L, 0x04000402L, 0x00100002L,
0x04100400, 0x04000002, 0x04000000, 0x00000402, 0x04100400L, 0x04000002L, 0x04000000L, 0x00000402L,
0x04000002, 0x00100402, 0x00100000, 0x04000000, 0x04000002L, 0x00100402L, 0x00100000L, 0x04000000L,
0x04100002, 0x00100400, 0x00000400, 0x00000002, 0x04100002L, 0x00100400L, 0x00000400L, 0x00000002L,
0x00100400, 0x04000402, 0x04100000, 0x00000400, 0x00100400L, 0x04000402L, 0x04100000L, 0x00000400L,
0x00000402, 0x00000000, 0x00100002, 0x04100400, 0x00000402L, 0x00000000L, 0x00100002L, 0x04100400L,
0x04000400, 0x04100002, 0x04100402, 0x00100000, 0x04000400L, 0x04100002L, 0x04100402L, 0x00100000L,
0x04100002, 0x00000402, 0x00100000, 0x04000002, 0x04100002L, 0x00000402L, 0x00100000L, 0x04000002L,
0x00100400, 0x04000400, 0x00000002, 0x04100000, 0x00100400L, 0x04000400L, 0x00000002L, 0x04100000L,
0x04000402, 0x00000000, 0x00000400, 0x00100002, 0x04000402L, 0x00000000L, 0x00000400L, 0x00100002L,
0x00000000, 0x04100002, 0x04100400, 0x00000400, 0x00000000L, 0x04100002L, 0x04100400L, 0x00000400L,
0x04000000, 0x04100402, 0x00100402, 0x00100000, 0x04000000L, 0x04100402L, 0x00100402L, 0x00100000L,
0x04100402, 0x00000002, 0x04000400, 0x00100402, 0x04100402L, 0x00000002L, 0x04000400L, 0x00100402L,
0x00100002, 0x00100400, 0x04100000, 0x04000402, 0x00100002L, 0x00100400L, 0x04100000L, 0x04000402L,
0x00000402, 0x04000000, 0x04000002, 0x04100400, 0x00000402L, 0x04000000L, 0x04000002L, 0x04100400L,
},{
/* nibble 4 */ /* nibble 4 */
0x02000000, 0x00004000, 0x00000100, 0x02004108, 0x02000000L, 0x00004000L, 0x00000100L, 0x02004108L,
0x02004008, 0x02000100, 0x00004108, 0x02004000, 0x02004008L, 0x02000100L, 0x00004108L, 0x02004000L,
0x00004000, 0x00000008, 0x02000008, 0x00004100, 0x00004000L, 0x00000008L, 0x02000008L, 0x00004100L,
0x02000108, 0x02004008, 0x02004100, 0x00000000, 0x02000108L, 0x02004008L, 0x02004100L, 0x00000000L,
0x00004100, 0x02000000, 0x00004008, 0x00000108, 0x00004100L, 0x02000000L, 0x00004008L, 0x00000108L,
0x02000100, 0x00004108, 0x00000000, 0x02000008, 0x02000100L, 0x00004108L, 0x00000000L, 0x02000008L,
0x00000008, 0x02000108, 0x02004108, 0x00004008, 0x00000008L, 0x02000108L, 0x02004108L, 0x00004008L,
0x02004000, 0x00000100, 0x00000108, 0x02004100, 0x02004000L, 0x00000100L, 0x00000108L, 0x02004100L,
0x02004100, 0x02000108, 0x00004008, 0x02004000, 0x02004100L, 0x02000108L, 0x00004008L, 0x02004000L,
0x00004000, 0x00000008, 0x02000008, 0x02000100, 0x00004000L, 0x00000008L, 0x02000008L, 0x02000100L,
0x02000000, 0x00004100, 0x02004108, 0x00000000, 0x02000000L, 0x00004100L, 0x02004108L, 0x00000000L,
0x00004108, 0x02000000, 0x00000100, 0x00004008, 0x00004108L, 0x02000000L, 0x00000100L, 0x00004008L,
0x02000108, 0x00000100, 0x00000000, 0x02004108, 0x02000108L, 0x00000100L, 0x00000000L, 0x02004108L,
0x02004008, 0x02004100, 0x00000108, 0x00004000, 0x02004008L, 0x02004100L, 0x00000108L, 0x00004000L,
0x00004100, 0x02004008, 0x02000100, 0x00000108, 0x00004100L, 0x02004008L, 0x02000100L, 0x00000108L,
0x00000008, 0x00004108, 0x02004000, 0x02000008, 0x00000008L, 0x00004108L, 0x02004000L, 0x02000008L,
},{
/* nibble 5 */ /* nibble 5 */
0x20000010, 0x00080010, 0x00000000, 0x20080800, 0x20000010L, 0x00080010L, 0x00000000L, 0x20080800L,
0x00080010, 0x00000800, 0x20000810, 0x00080000, 0x00080010L, 0x00000800L, 0x20000810L, 0x00080000L,
0x00000810, 0x20080810, 0x00080800, 0x20000000, 0x00000810L, 0x20080810L, 0x00080800L, 0x20000000L,
0x20000800, 0x20000010, 0x20080000, 0x00080810, 0x20000800L, 0x20000010L, 0x20080000L, 0x00080810L,
0x00080000, 0x20000810, 0x20080010, 0x00000000, 0x00080000L, 0x20000810L, 0x20080010L, 0x00000000L,
0x00000800, 0x00000010, 0x20080800, 0x20080010, 0x00000800L, 0x00000010L, 0x20080800L, 0x20080010L,
0x20080810, 0x20080000, 0x20000000, 0x00000810, 0x20080810L, 0x20080000L, 0x20000000L, 0x00000810L,
0x00000010, 0x00080800, 0x00080810, 0x20000800, 0x00000010L, 0x00080800L, 0x00080810L, 0x20000800L,
0x00000810, 0x20000000, 0x20000800, 0x00080810, 0x00000810L, 0x20000000L, 0x20000800L, 0x00080810L,
0x20080800, 0x00080010, 0x00000000, 0x20000800, 0x20080800L, 0x00080010L, 0x00000000L, 0x20000800L,
0x20000000, 0x00000800, 0x20080010, 0x00080000, 0x20000000L, 0x00000800L, 0x20080010L, 0x00080000L,
0x00080010, 0x20080810, 0x00080800, 0x00000010, 0x00080010L, 0x20080810L, 0x00080800L, 0x00000010L,
0x20080810, 0x00080800, 0x00080000, 0x20000810, 0x20080810L, 0x00080800L, 0x00080000L, 0x20000810L,
0x20000010, 0x20080000, 0x00080810, 0x00000000, 0x20000010L, 0x20080000L, 0x00080810L, 0x00000000L,
0x00000800, 0x20000010, 0x20000810, 0x20080800, 0x00000800L, 0x20000010L, 0x20000810L, 0x20080800L,
0x20080000, 0x00000810, 0x00000010, 0x20080010, 0x20080000L, 0x00000810L, 0x00000010L, 0x20080010L,
},{
/* nibble 6 */ /* nibble 6 */
0x00001000, 0x00000080, 0x00400080, 0x00400001, 0x00001000L, 0x00000080L, 0x00400080L, 0x00400001L,
0x00401081, 0x00001001, 0x00001080, 0x00000000, 0x00401081L, 0x00001001L, 0x00001080L, 0x00000000L,
0x00400000, 0x00400081, 0x00000081, 0x00401000, 0x00400000L, 0x00400081L, 0x00000081L, 0x00401000L,
0x00000001, 0x00401080, 0x00401000, 0x00000081, 0x00000001L, 0x00401080L, 0x00401000L, 0x00000081L,
0x00400081, 0x00001000, 0x00001001, 0x00401081, 0x00400081L, 0x00001000L, 0x00001001L, 0x00401081L,
0x00000000, 0x00400080, 0x00400001, 0x00001080, 0x00000000L, 0x00400080L, 0x00400001L, 0x00001080L,
0x00401001, 0x00001081, 0x00401080, 0x00000001, 0x00401001L, 0x00001081L, 0x00401080L, 0x00000001L,
0x00001081, 0x00401001, 0x00000080, 0x00400000, 0x00001081L, 0x00401001L, 0x00000080L, 0x00400000L,
0x00001081, 0x00401000, 0x00401001, 0x00000081, 0x00001081L, 0x00401000L, 0x00401001L, 0x00000081L,
0x00001000, 0x00000080, 0x00400000, 0x00401001, 0x00001000L, 0x00000080L, 0x00400000L, 0x00401001L,
0x00400081, 0x00001081, 0x00001080, 0x00000000, 0x00400081L, 0x00001081L, 0x00001080L, 0x00000000L,
0x00000080, 0x00400001, 0x00000001, 0x00400080, 0x00000080L, 0x00400001L, 0x00000001L, 0x00400080L,
0x00000000, 0x00400081, 0x00400080, 0x00001080, 0x00000000L, 0x00400081L, 0x00400080L, 0x00001080L,
0x00000081, 0x00001000, 0x00401081, 0x00400000, 0x00000081L, 0x00001000L, 0x00401081L, 0x00400000L,
0x00401080, 0x00000001, 0x00001001, 0x00401081, 0x00401080L, 0x00000001L, 0x00001001L, 0x00401081L,
0x00400001, 0x00401080, 0x00401000, 0x00001001, 0x00400001L, 0x00401080L, 0x00401000L, 0x00001001L,
},{
/* nibble 7 */ /* nibble 7 */
0x08200020, 0x08208000, 0x00008020, 0x00000000, 0x08200020L, 0x08208000L, 0x00008020L, 0x00000000L,
0x08008000, 0x00200020, 0x08200000, 0x08208020, 0x08008000L, 0x00200020L, 0x08200000L, 0x08208020L,
0x00000020, 0x08000000, 0x00208000, 0x00008020, 0x00000020L, 0x08000000L, 0x00208000L, 0x00008020L,
0x00208020, 0x08008020, 0x08000020, 0x08200000, 0x00208020L, 0x08008020L, 0x08000020L, 0x08200000L,
0x00008000, 0x00208020, 0x00200020, 0x08008000, 0x00008000L, 0x00208020L, 0x00200020L, 0x08008000L,
0x08208020, 0x08000020, 0x00000000, 0x00208000, 0x08208020L, 0x08000020L, 0x00000000L, 0x00208000L,
0x08000000, 0x00200000, 0x08008020, 0x08200020, 0x08000000L, 0x00200000L, 0x08008020L, 0x08200020L,
0x00200000, 0x00008000, 0x08208000, 0x00000020, 0x00200000L, 0x00008000L, 0x08208000L, 0x00000020L,
0x00200000, 0x00008000, 0x08000020, 0x08208020, 0x00200000L, 0x00008000L, 0x08000020L, 0x08208020L,
0x00008020, 0x08000000, 0x00000000, 0x00208000, 0x00008020L, 0x08000000L, 0x00000000L, 0x00208000L,
0x08200020, 0x08008020, 0x08008000, 0x00200020, 0x08200020L, 0x08008020L, 0x08008000L, 0x00200020L,
0x08208000, 0x00000020, 0x00200020, 0x08008000, 0x08208000L, 0x00000020L, 0x00200020L, 0x08008000L,
0x08208020, 0x00200000, 0x08200000, 0x08000020, 0x08208020L, 0x00200000L, 0x08200000L, 0x08000020L,
0x00208000, 0x00008020, 0x08008020, 0x08200000, 0x00208000L, 0x00008020L, 0x08008020L, 0x08200000L,
0x00000020, 0x08208000, 0x00208020, 0x00000000, 0x00000020L, 0x08208000L, 0x00208020L, 0x00000000L,
0x08000000, 0x08200020, 0x00008000, 0x00208020}; 0x08000000L, 0x08200020L, 0x00008000L, 0x00208020L,
}};

View File

@@ -1,112 +1,160 @@
/* str2key.c */ /* lib/des/str2key.c */
/* Copyright (C) 1993 Eric Young - see README for more details */ /* 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.]
*/
#include "des_locl.h" #include "des_locl.h"
extern int des_check_key; extern int des_check_key;
int des_string_to_key(char *str, des_cblock (*key)) void des_string_to_key(str, key)
{ char *str;
des_key_schedule ks; des_cblock (*key);
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 */ des_key_schedule ks;
j=((j<<4)&0xf0)|((j>>4)&0x0f); int i,length;
j=((j<<2)&0xcc)|((j>>2)&0x33); register unsigned char j;
j=((j<<1)&0xaa)|((j>>1)&0x55);
(*key)[7-(i%8)]^=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 #endif
des_set_odd_parity((des_cblock *)key); des_set_odd_parity((des_cblock *)key);
i=des_check_key; i=des_check_key;
des_check_key=0; des_check_key=0;
des_set_key((des_cblock *)key,ks); des_set_key((des_cblock *)key,ks);
des_check_key=i; des_check_key=i;
des_cbc_cksum((des_cblock *)str,(des_cblock *)key,(long)length,ks, des_cbc_cksum((des_cblock *)str,(des_cblock *)key,(long)length,ks,
(des_cblock *)key); (des_cblock *)key);
memset(ks,0,sizeof(ks)); memset(ks,0,sizeof(ks));
des_set_odd_parity((des_cblock *)key); des_set_odd_parity((des_cblock *)key);
return(0); }
}
int des_string_to_2keys(char *str, des_cblock (*key1), des_cblock (*key2)) void des_string_to_2keys(str, key1, key2)
{ char *str;
des_key_schedule ks; des_cblock (*key1);
int i,length; des_cblock (*key2);
register unsigned char j; {
des_key_schedule ks;
int i,length;
register unsigned char j;
memset(key1,0,8); memset(key1,0,8);
memset(key2,0,8); memset(key2,0,8);
length=strlen(str); length=strlen(str);
#ifdef OLD_STR_TO_KEY #ifdef OLD_STR_TO_KEY
if (length <= 8) if (length <= 8)
{ {
for (i=0; i<length; i++) for (i=0; i<length; i++)
{ {
(*key2)[i]=(*key1)[i]=(str[i]<<1); (*key2)[i]=(*key1)[i]=(str[i]<<1);
} }
} }
else else
{ {
for (i=0; i<length; i++) for (i=0; i<length; i++)
{ {
if ((i/8)&1) if ((i/8)&1)
(*key2)[i%8]^=(str[i]<<1); (*key2)[i%8]^=(str[i]<<1);
else else
(*key1)[i%8]^=(str[i]<<1); (*key1)[i%8]^=(str[i]<<1);
} }
} }
#else /* MIT COMPATIBLE */ #else /* MIT COMPATIBLE */
for (i=0; i<length; i++) for (i=0; i<length; i++)
{ {
j=str[i]; j=str[i];
if ((i%32) < 16) if ((i%32) < 16)
{ {
if ((i%16) < 8) if ((i%16) < 8)
(*key1)[i%8]^=(j<<1); (*key1)[i%8]^=(j<<1);
else else
(*key2)[i%8]^=(j<<1); (*key2)[i%8]^=(j<<1);
} }
else else
{ {
j=((j<<4)&0xf0)|((j>>4)&0x0f); j=((j<<4)&0xf0)|((j>>4)&0x0f);
j=((j<<2)&0xcc)|((j>>2)&0x33); j=((j<<2)&0xcc)|((j>>2)&0x33);
j=((j<<1)&0xaa)|((j>>1)&0x55); j=((j<<1)&0xaa)|((j>>1)&0x55);
if ((i%16) < 8) if ((i%16) < 8)
(*key1)[7-(i%8)]^=j; (*key1)[7-(i%8)]^=j;
else else
(*key2)[7-(i%8)]^=j; (*key2)[7-(i%8)]^=j;
} }
} }
if (length <= 8) memcpy(key2,key1,8); if (length <= 8) memcpy(key2,key1,8);
#endif #endif
des_set_odd_parity((des_cblock *)key1); des_set_odd_parity((des_cblock *)key1);
des_set_odd_parity((des_cblock *)key2); des_set_odd_parity((des_cblock *)key2);
i=des_check_key; i=des_check_key;
des_check_key=0; des_check_key=0;
des_set_key((des_cblock *)key1,ks); des_set_key((des_cblock *)key1,ks);
des_cbc_cksum((des_cblock *)str,(des_cblock *)key1,(long)length,ks, des_cbc_cksum((des_cblock *)str,(des_cblock *)key1,(long)length,ks,
(des_cblock *)key1); (des_cblock *)key1);
des_set_key((des_cblock *)key2,ks); des_set_key((des_cblock *)key2,ks);
des_cbc_cksum((des_cblock *)str,(des_cblock *)key2,(long)length,ks, des_cbc_cksum((des_cblock *)str,(des_cblock *)key2,(long)length,ks,
(des_cblock *)key2); (des_cblock *)key2);
des_check_key=i; des_check_key=i;
memset(ks,0,sizeof(ks)); memset(ks,0,sizeof(ks));
des_set_odd_parity(key1); des_set_odd_parity(key1);
des_set_odd_parity(key2); des_set_odd_parity(key2);
return(0); }
}

51
lib/des/supp.c Normal file
View File

@@ -0,0 +1,51 @@
/*
* 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$
*/
#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, " }");
}

0
lib/des/t/perl Normal file
View File

27
lib/des/t/test Normal file
View File

@@ -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";

View File

@@ -1,4 +1,76 @@
DEC Alpha DEC 4000/610 AXP OSF/1 v 1.3 - gcc v 2.3.3 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)
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) set_key per sec = 101840.19 ( 9.8uS)
DES ecb bytes per sec = 1223712.35 ( 6.5uS) DES ecb bytes per sec = 1223712.35 ( 6.5uS)
DES cbc bytes per sec = 1230542.98 ( 6.5uS) DES cbc bytes per sec = 1230542.98 ( 6.5uS)
@@ -28,6 +100,12 @@ DES ecb bytes per sec = 505971.82
DES cbc bytes per sec = 515381.13 DES cbc bytes per sec = 515381.13
crypt per sec = 2438.24 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 sun sparc 10/30 - cc -O4
set_key per sec = 38379.86 ( 26.1uS) set_key per sec = 38379.86 ( 26.1uS)
DES ecb bytes per sec = 460051.34 ( 17.4uS) DES ecb bytes per sec = 460051.34 ( 17.4uS)
@@ -46,6 +124,24 @@ DES ecb bytes per sec = 222231.26
DES cbc bytes per sec = 223926.79 DES cbc bytes per sec = 223926.79
crypt per sec = 981.20 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 68030 HP400
set_key per sec = 5251.28 set_key per sec = 5251.28
DES ecb bytes per sec = 56186.56 DES ecb bytes per sec = 56186.56

34
lib/des/typemap Normal file
View File

@@ -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);

48
lib/des/version.h Normal file
View File

@@ -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;