For some odd reason, md4 is not included in openssl.  Here's a patch
that adds it, since it's quite similar to the already existing md5.

Any questions?

/assar
diff --exclude=*~ -ruN openssl-0.9.5a.orig/Makefile openssl-0.9.5a/Makefile
--- openssl-0.9.5a.orig/Makefile        Sat Apr  1 13:22:56 2000
+++ openssl-0.9.5a/Makefile     Mon Aug 14 09:38:04 2000
@@ -149,7 +149,7 @@
 
 # dirs in crypto to build
 SDIRS=  \
-       md2 md5 sha mdc2 hmac ripemd \
+       md2 md4 md5 sha mdc2 hmac ripemd \
        des rc2 rc4 rc5 idea bf cast \
        bn rsa dsa dh \
        buffer bio stack lhash rand err objects \
diff --exclude=*~ -ruN openssl-0.9.5a.orig/Makefile.org openssl-0.9.5a/Makefile.org
--- openssl-0.9.5a.orig/Makefile.org    Thu Mar 16 20:46:20 2000
+++ openssl-0.9.5a/Makefile.org Mon Aug 14 07:43:18 2000
@@ -147,7 +147,7 @@
 
 # dirs in crypto to build
 SDIRS=  \
-       md2 md5 sha mdc2 hmac ripemd \
+       md2 md4 md5 sha mdc2 hmac ripemd \
        des rc2 rc4 rc5 idea bf cast \
        bn rsa dsa dh \
        buffer bio stack lhash rand err objects \
diff --exclude=*~ -ruN openssl-0.9.5a.orig/Makefile.ssl openssl-0.9.5a/Makefile.ssl
--- openssl-0.9.5a.orig/Makefile.ssl    Sat Apr  1 13:22:56 2000
+++ openssl-0.9.5a/Makefile.ssl Mon Aug 14 09:38:04 2000
@@ -149,7 +149,7 @@
 
 # dirs in crypto to build
 SDIRS=  \
-       md2 md5 sha mdc2 hmac ripemd \
+       md2 md4 md5 sha mdc2 hmac ripemd \
        des rc2 rc4 rc5 idea bf cast \
        bn rsa dsa dh \
        buffer bio stack lhash rand err objects \
diff --exclude=*~ -ruN openssl-0.9.5a.orig/apps/md4.c openssl-0.9.5a/apps/md4.c
--- openssl-0.9.5a.orig/apps/md4.c      Thu Jan  1 01:00:00 1970
+++ openssl-0.9.5a/apps/md4.c   Mon Aug 14 07:19:31 2000
@@ -0,0 +1,127 @@
+/* crypto/md4/md4.c */
+/* Copyright (C) 1995-1998 Eric Young ([EMAIL PROTECTED])
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young ([EMAIL PROTECTED]).
+ * The implementation was written so as to conform with Netscapes SSL.
+ * 
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson ([EMAIL PROTECTED]).
+ * 
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young ([EMAIL PROTECTED])"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from 
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson ([EMAIL PROTECTED])"
+ * 
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * 
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed.  i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <openssl/md4.h>
+
+#define BUFSIZE        1024*16
+
+void do_fp(FILE *f);
+void pt(unsigned char *md);
+#ifndef _OSD_POSIX
+int read(int, void *, unsigned int);
+#endif
+
+int main(int argc, char **argv)
+       {
+       int i,err=0;
+       FILE *IN;
+
+       if (argc == 1)
+               {
+               do_fp(stdin);
+               }
+       else
+               {
+               for (i=1; i<argc; i++)
+                       {
+                       IN=fopen(argv[i],"r");
+                       if (IN == NULL)
+                               {
+                               perror(argv[i]);
+                               err++;
+                               continue;
+                               }
+                       printf("MD4(%s)= ",argv[i]);
+                       do_fp(IN);
+                       fclose(IN);
+                       }
+               }
+       exit(err);
+       }
+
+void do_fp(FILE *f)
+       {
+       MD4_CTX c;
+       unsigned char md[MD4_DIGEST_LENGTH];
+       int fd;
+       int i;
+       static unsigned char buf[BUFSIZE];
+
+       fd=fileno(f);
+       MD4_Init(&c);
+       for (;;)
+               {
+               i=read(fd,buf,BUFSIZE);
+               if (i <= 0) break;
+               MD4_Update(&c,buf,(unsigned long)i);
+               }
+       MD4_Final(&(md[0]),&c);
+       pt(md);
+       }
+
+void pt(unsigned char *md)
+       {
+       int i;
+
+       for (i=0; i<MD4_DIGEST_LENGTH; i++)
+               printf("%02x",md[i]);
+       printf("\n");
+       }
+
diff --exclude=*~ -ruN openssl-0.9.5a.orig/crypto/md4/Makefile 
openssl-0.9.5a/crypto/md4/Makefile
--- openssl-0.9.5a.orig/crypto/md4/Makefile     Thu Jan  1 01:00:00 1970
+++ openssl-0.9.5a/crypto/md4/Makefile  Mon Aug 14 07:19:00 2000
@@ -0,0 +1,84 @@
+#
+# SSLeay/crypto/md4/Makefile
+#
+
+DIR=    md4
+TOP=    ../..
+CC=     cc
+CPP=    $(CC) -E
+INCLUDES=
+CFLAG=-g
+INSTALL_PREFIX=
+OPENSSLDIR=     /usr/local/ssl
+INSTALLTOP=/usr/local/ssl
+MAKE=           make -f Makefile.ssl
+MAKEDEPEND=    $(TOP)/util/domd $(TOP)
+MAKEFILE=       Makefile.ssl
+AR=             ar r
+
+CFLAGS= $(INCLUDES) $(CFLAG)
+
+GENERAL=Makefile
+TEST=md4test.c
+APPS=md4.c
+
+LIB=$(TOP)/libcrypto.a
+LIBSRC=md4_dgst.c md4_one.c
+LIBOBJ=md4_dgst.o md4_one.o
+
+SRC= $(LIBSRC)
+
+EXHEADER= md4.h
+HEADER= md4_locl.h $(EXHEADER)
+
+ALL=    $(GENERAL) $(SRC) $(HEADER)
+
+top:
+       (cd ../..; $(MAKE) DIRS=crypto SDIRS=$(DIR) sub_all)
+
+all:    lib
+
+lib:    $(LIBOBJ)
+       $(AR) $(LIB) $(LIBOBJ)
+       $(RANLIB) $(LIB)
+       @touch lib
+
+files:
+       $(PERL) $(TOP)/util/files.pl Makefile.ssl >> $(TOP)/MINFO
+
+links:
+       @$(TOP)/util/point.sh Makefile.ssl Makefile
+       @$(PERL) $(TOP)/util/mklink.pl ../../include/openssl $(EXHEADER)
+       @$(PERL) $(TOP)/util/mklink.pl ../../test $(TEST)
+       @$(PERL) $(TOP)/util/mklink.pl ../../apps $(APPS)
+
+install:
+       @for i in $(EXHEADER) ; \
+       do  \
+       (cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i; \
+       chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i ); \
+       done;
+
+tags:
+       ctags $(SRC)
+
+tests:
+
+lint:
+       lint -DLINT $(INCLUDES) $(SRC)>fluff
+
+depend:
+       $(MAKEDEPEND) $(INCLUDES) $(DEPFLAG) $(PROGS) $(LIBSRC)
+
+dclean:
+       $(PERL) -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) 
+>Makefile.new
+       mv -f Makefile.new $(MAKEFILE)
+
+clean:
+       rm -f asm/mx86unix.cpp *.o asm/*.o *.obj lib tags core .pure .nfs* *.old *.bak 
+fluff
+
+# DO NOT DELETE THIS LINE -- make depend depends on it.
+
+md4_dgst.o: ../../include/openssl/md4.h ../../include/openssl/opensslconf.h
+md4_dgst.o: ../../include/openssl/opensslv.h ../md32_common.h md4_locl.h
+md4_one.o: ../../include/openssl/md4.h
diff --exclude=*~ -ruN openssl-0.9.5a.orig/crypto/md4/Makefile.save 
openssl-0.9.5a/crypto/md4/Makefile.save
--- openssl-0.9.5a.orig/crypto/md4/Makefile.save        Thu Jan  1 01:00:00 1970
+++ openssl-0.9.5a/crypto/md4/Makefile.save     Mon Aug 14 07:19:18 2000
@@ -0,0 +1,84 @@
+#
+# SSLeay/crypto/md4/Makefile
+#
+
+DIR=    md4
+TOP=    ../..
+CC=     cc
+CPP=    $(CC) -E
+INCLUDES=
+CFLAG=-g
+INSTALL_PREFIX=
+OPENSSLDIR=     /usr/local/ssl
+INSTALLTOP=/usr/local/ssl
+MAKE=           make -f Makefile.ssl
+MAKEDEPEND=    $(TOP)/util/domd $(TOP)
+MAKEFILE=       Makefile.ssl
+AR=             ar r
+
+CFLAGS= $(INCLUDES) $(CFLAG)
+
+GENERAL=Makefile
+TEST=md4test.c
+APPS=md4.c
+
+LIB=$(TOP)/libcrypto.a
+LIBSRC=md4_dgst.c md4_one.c
+LIBOBJ=md4_dgst.o md4_one.o
+
+SRC= $(LIBSRC)
+
+EXHEADER= md4.h
+HEADER= md4_locl.h $(EXHEADER)
+
+ALL=    $(GENERAL) $(SRC) $(HEADER)
+
+top:
+       (cd ../..; $(MAKE) DIRS=crypto SDIRS=$(DIR) sub_all)
+
+all:    lib
+
+lib:    $(LIBOBJ)
+       $(AR) $(LIB) $(LIBOBJ)
+       $(RANLIB) $(LIB)
+       @touch lib
+
+files:
+       $(PERL) $(TOP)/util/files.pl Makefile.ssl >> $(TOP)/MINFO
+
+links:
+       @$(TOP)/util/point.sh Makefile.ssl Makefile
+       @$(PERL) $(TOP)/util/mklink.pl ../../include/openssl $(EXHEADER)
+       @$(PERL) $(TOP)/util/mklink.pl ../../test $(TEST)
+       @$(PERL) $(TOP)/util/mklink.pl ../../apps $(APPS)
+
+install:
+       @for i in $(EXHEADER) ; \
+       do  \
+       (cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i; \
+       chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i ); \
+       done;
+
+tags:
+       ctags $(SRC)
+
+tests:
+
+lint:
+       lint -DLINT $(INCLUDES) $(SRC)>fluff
+
+depend:
+       $(MAKEDEPEND) $(INCLUDES) $(DEPFLAG) $(PROGS) $(LIBSRC)
+
+dclean:
+       $(PERL) -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) 
+>Makefile.new
+       mv -f Makefile.new $(MAKEFILE)
+
+clean:
+       rm -f asm/mx86unix.cpp *.o asm/*.o *.obj lib tags core .pure .nfs* *.old *.bak 
+fluff
+
+# DO NOT DELETE THIS LINE -- make depend depends on it.
+
+md4_dgst.o: ../../include/openssl/md4.h ../../include/openssl/opensslconf.h
+md4_dgst.o: ../../include/openssl/opensslv.h ../md32_common.h md4_locl.h
+md4_one.o: ../../include/openssl/md4.h
diff --exclude=*~ -ruN openssl-0.9.5a.orig/crypto/md4/Makefile.ssl 
openssl-0.9.5a/crypto/md4/Makefile.ssl
--- openssl-0.9.5a.orig/crypto/md4/Makefile.ssl Thu Jan  1 01:00:00 1970
+++ openssl-0.9.5a/crypto/md4/Makefile.ssl      Mon Aug 14 07:19:00 2000
@@ -0,0 +1,84 @@
+#
+# SSLeay/crypto/md4/Makefile
+#
+
+DIR=    md4
+TOP=    ../..
+CC=     cc
+CPP=    $(CC) -E
+INCLUDES=
+CFLAG=-g
+INSTALL_PREFIX=
+OPENSSLDIR=     /usr/local/ssl
+INSTALLTOP=/usr/local/ssl
+MAKE=           make -f Makefile.ssl
+MAKEDEPEND=    $(TOP)/util/domd $(TOP)
+MAKEFILE=       Makefile.ssl
+AR=             ar r
+
+CFLAGS= $(INCLUDES) $(CFLAG)
+
+GENERAL=Makefile
+TEST=md4test.c
+APPS=md4.c
+
+LIB=$(TOP)/libcrypto.a
+LIBSRC=md4_dgst.c md4_one.c
+LIBOBJ=md4_dgst.o md4_one.o
+
+SRC= $(LIBSRC)
+
+EXHEADER= md4.h
+HEADER= md4_locl.h $(EXHEADER)
+
+ALL=    $(GENERAL) $(SRC) $(HEADER)
+
+top:
+       (cd ../..; $(MAKE) DIRS=crypto SDIRS=$(DIR) sub_all)
+
+all:    lib
+
+lib:    $(LIBOBJ)
+       $(AR) $(LIB) $(LIBOBJ)
+       $(RANLIB) $(LIB)
+       @touch lib
+
+files:
+       $(PERL) $(TOP)/util/files.pl Makefile.ssl >> $(TOP)/MINFO
+
+links:
+       @$(TOP)/util/point.sh Makefile.ssl Makefile
+       @$(PERL) $(TOP)/util/mklink.pl ../../include/openssl $(EXHEADER)
+       @$(PERL) $(TOP)/util/mklink.pl ../../test $(TEST)
+       @$(PERL) $(TOP)/util/mklink.pl ../../apps $(APPS)
+
+install:
+       @for i in $(EXHEADER) ; \
+       do  \
+       (cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i; \
+       chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i ); \
+       done;
+
+tags:
+       ctags $(SRC)
+
+tests:
+
+lint:
+       lint -DLINT $(INCLUDES) $(SRC)>fluff
+
+depend:
+       $(MAKEDEPEND) $(INCLUDES) $(DEPFLAG) $(PROGS) $(LIBSRC)
+
+dclean:
+       $(PERL) -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) 
+>Makefile.new
+       mv -f Makefile.new $(MAKEFILE)
+
+clean:
+       rm -f asm/mx86unix.cpp *.o asm/*.o *.obj lib tags core .pure .nfs* *.old *.bak 
+fluff
+
+# DO NOT DELETE THIS LINE -- make depend depends on it.
+
+md4_dgst.o: ../../include/openssl/md4.h ../../include/openssl/opensslconf.h
+md4_dgst.o: ../../include/openssl/opensslv.h ../md32_common.h md4_locl.h
+md4_one.o: ../../include/openssl/md4.h
diff --exclude=*~ -ruN openssl-0.9.5a.orig/crypto/md4/md4.c 
openssl-0.9.5a/crypto/md4/md4.c
--- openssl-0.9.5a.orig/crypto/md4/md4.c        Thu Jan  1 01:00:00 1970
+++ openssl-0.9.5a/crypto/md4/md4.c     Mon Aug 14 07:19:31 2000
@@ -0,0 +1,127 @@
+/* crypto/md4/md4.c */
+/* Copyright (C) 1995-1998 Eric Young ([EMAIL PROTECTED])
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young ([EMAIL PROTECTED]).
+ * The implementation was written so as to conform with Netscapes SSL.
+ * 
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson ([EMAIL PROTECTED]).
+ * 
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young ([EMAIL PROTECTED])"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from 
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson ([EMAIL PROTECTED])"
+ * 
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * 
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed.  i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <openssl/md4.h>
+
+#define BUFSIZE        1024*16
+
+void do_fp(FILE *f);
+void pt(unsigned char *md);
+#ifndef _OSD_POSIX
+int read(int, void *, unsigned int);
+#endif
+
+int main(int argc, char **argv)
+       {
+       int i,err=0;
+       FILE *IN;
+
+       if (argc == 1)
+               {
+               do_fp(stdin);
+               }
+       else
+               {
+               for (i=1; i<argc; i++)
+                       {
+                       IN=fopen(argv[i],"r");
+                       if (IN == NULL)
+                               {
+                               perror(argv[i]);
+                               err++;
+                               continue;
+                               }
+                       printf("MD4(%s)= ",argv[i]);
+                       do_fp(IN);
+                       fclose(IN);
+                       }
+               }
+       exit(err);
+       }
+
+void do_fp(FILE *f)
+       {
+       MD4_CTX c;
+       unsigned char md[MD4_DIGEST_LENGTH];
+       int fd;
+       int i;
+       static unsigned char buf[BUFSIZE];
+
+       fd=fileno(f);
+       MD4_Init(&c);
+       for (;;)
+               {
+               i=read(fd,buf,BUFSIZE);
+               if (i <= 0) break;
+               MD4_Update(&c,buf,(unsigned long)i);
+               }
+       MD4_Final(&(md[0]),&c);
+       pt(md);
+       }
+
+void pt(unsigned char *md)
+       {
+       int i;
+
+       for (i=0; i<MD4_DIGEST_LENGTH; i++)
+               printf("%02x",md[i]);
+       printf("\n");
+       }
+
diff --exclude=*~ -ruN openssl-0.9.5a.orig/crypto/md4/md4.h 
openssl-0.9.5a/crypto/md4/md4.h
--- openssl-0.9.5a.orig/crypto/md4/md4.h        Thu Jan  1 01:00:00 1970
+++ openssl-0.9.5a/crypto/md4/md4.h     Mon Aug 14 07:19:41 2000
@@ -0,0 +1,114 @@
+/* crypto/md4/md4.h */
+/* Copyright (C) 1995-1998 Eric Young ([EMAIL PROTECTED])
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young ([EMAIL PROTECTED]).
+ * The implementation was written so as to conform with Netscapes SSL.
+ * 
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson ([EMAIL PROTECTED]).
+ * 
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young ([EMAIL PROTECTED])"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from 
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson ([EMAIL PROTECTED])"
+ * 
+ * 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_MD4_H
+#define HEADER_MD4_H
+
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
+#ifdef NO_MD4
+#error MD4 is disabled.
+#endif
+
+/*
+ * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ * ! MD4_LONG has to be at least 32 bits wide. If it's wider, then !
+ * ! MD4_LONG_LOG2 has to be defined along.                       !
+ * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ */
+
+#if defined(WIN16) || defined(__LP32__)
+#define MD4_LONG unsigned long
+#elif defined(_CRAY) || defined(__ILP64__)
+#define MD4_LONG unsigned long
+#define MD4_LONG_LOG2 3
+/*
+ * _CRAY note. I could declare short, but I have no idea what impact
+ * does it have on performance on none-T3E machines. I could declare
+ * int, but at least on C90 sizeof(int) can be chosen at compile time.
+ * So I've chosen long...
+ *                                     <[EMAIL PROTECTED]>
+ */
+#else
+#define MD4_LONG unsigned int
+#endif
+
+#define MD4_CBLOCK     64
+#define MD4_LBLOCK     (MD4_CBLOCK/4)
+#define MD4_DIGEST_LENGTH 16
+
+typedef struct MD4state_st
+       {
+       MD4_LONG A,B,C,D;
+       MD4_LONG Nl,Nh;
+       MD4_LONG data[MD4_LBLOCK];
+       int num;
+       } MD4_CTX;
+
+void MD4_Init(MD4_CTX *c);
+void MD4_Update(MD4_CTX *c, const void *data, unsigned long len);
+void MD4_Final(unsigned char *md, MD4_CTX *c);
+unsigned char *MD4(const unsigned char *d, unsigned long n, unsigned char *md);
+void MD4_Transform(MD4_CTX *c, const unsigned char *b);
+#ifdef  __cplusplus
+}
+#endif
+
+#endif
diff --exclude=*~ -ruN openssl-0.9.5a.orig/crypto/md4/md4_dgst.c 
openssl-0.9.5a/crypto/md4/md4_dgst.c
--- openssl-0.9.5a.orig/crypto/md4/md4_dgst.c   Thu Jan  1 01:00:00 1970
+++ openssl-0.9.5a/crypto/md4/md4_dgst.c        Mon Aug 14 09:17:56 2000
@@ -0,0 +1,285 @@
+/* crypto/md4/md4_dgst.c */
+/* Copyright (C) 1995-1998 Eric Young ([EMAIL PROTECTED])
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young ([EMAIL PROTECTED]).
+ * The implementation was written so as to conform with Netscapes SSL.
+ * 
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson ([EMAIL PROTECTED]).
+ * 
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young ([EMAIL PROTECTED])"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from 
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson ([EMAIL PROTECTED])"
+ * 
+ * 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 "md4_locl.h"
+#include <openssl/opensslv.h>
+
+const char *MD4_version="MD4" OPENSSL_VERSION_PTEXT;
+
+/* Implemented from RFC1186 The MD4 Message-Digest Algorithm
+ */
+
+#define INIT_DATA_A (unsigned long)0x67452301L
+#define INIT_DATA_B (unsigned long)0xefcdab89L
+#define INIT_DATA_C (unsigned long)0x98badcfeL
+#define INIT_DATA_D (unsigned long)0x10325476L
+
+void MD4_Init(MD4_CTX *c)
+       {
+       c->A=INIT_DATA_A;
+       c->B=INIT_DATA_B;
+       c->C=INIT_DATA_C;
+       c->D=INIT_DATA_D;
+       c->Nl=0;
+       c->Nh=0;
+       c->num=0;
+       }
+
+#ifndef md4_block_host_order
+void md4_block_host_order (MD4_CTX *c, const void *data, int num)
+       {
+       const MD4_LONG *X=data;
+       register unsigned long A,B,C,D;
+       /*
+        * In case you wonder why A-D are declared as long and not
+        * as MD4_LONG. Doing so results in slight performance
+        * boost on LP64 architectures. The catch is we don't
+        * really care if 32 MSBs of a 64-bit register get polluted
+        * with eventual overflows as we *save* only 32 LSBs in
+        * *either* case. Now declaring 'em long excuses the compiler
+        * from keeping 32 MSBs zeroed resulting in 13% performance
+        * improvement under SPARC Solaris7/64 and 5% under AlphaLinux.
+        * Well, to be honest it should say that this *prevents* 
+        * performance degradation.
+        *
+        *                              <[EMAIL PROTECTED]>
+        */
+
+       A=c->A;
+       B=c->B;
+       C=c->C;
+       D=c->D;
+
+       for (;num--;X+=HASH_LBLOCK)
+               {
+       /* Round 0 */
+       R0(A,B,C,D,X[ 0], 3,0);
+       R0(D,A,B,C,X[ 1], 7,0);
+       R0(C,D,A,B,X[ 2],11,0);
+       R0(B,C,D,A,X[ 3],19,0);
+       R0(A,B,C,D,X[ 4], 3,0);
+       R0(D,A,B,C,X[ 5], 7,0);
+       R0(C,D,A,B,X[ 6],11,0);
+       R0(B,C,D,A,X[ 7],19,0);
+       R0(A,B,C,D,X[ 8], 3,0);
+       R0(D,A,B,C,X[ 9], 7,0);
+       R0(C,D,A,B,X[10],11,0);
+       R0(B,C,D,A,X[11],19,0);
+       R0(A,B,C,D,X[12], 3,0);
+       R0(D,A,B,C,X[13], 7,0);
+       R0(C,D,A,B,X[14],11,0);
+       R0(B,C,D,A,X[15],19,0);
+       /* Round 1 */
+       R1(A,B,C,D,X[ 0], 3,0x5A827999L);
+       R1(D,A,B,C,X[ 4], 5,0x5A827999L);
+       R1(C,D,A,B,X[ 8], 9,0x5A827999L);
+       R1(B,C,D,A,X[12],13,0x5A827999L);
+       R1(A,B,C,D,X[ 1], 3,0x5A827999L);
+       R1(D,A,B,C,X[ 5], 5,0x5A827999L);
+       R1(C,D,A,B,X[ 9], 9,0x5A827999L);
+       R1(B,C,D,A,X[13],13,0x5A827999L);
+       R1(A,B,C,D,X[ 2], 3,0x5A827999L);
+       R1(D,A,B,C,X[ 6], 5,0x5A827999L);
+       R1(C,D,A,B,X[10], 9,0x5A827999L);
+       R1(B,C,D,A,X[14],13,0x5A827999L);
+       R1(A,B,C,D,X[ 3], 3,0x5A827999L);
+       R1(D,A,B,C,X[ 7], 5,0x5A827999L);
+       R1(C,D,A,B,X[11], 9,0x5A827999L);
+       R1(B,C,D,A,X[15],13,0x5A827999L);
+       /* Round 2 */
+       R2(A,B,C,D,X[ 0], 3,0x6ED9EBA1);
+       R2(D,A,B,C,X[ 8], 9,0x6ED9EBA1);
+       R2(C,D,A,B,X[ 4],11,0x6ED9EBA1);
+       R2(B,C,D,A,X[12],15,0x6ED9EBA1);
+       R2(A,B,C,D,X[ 2], 3,0x6ED9EBA1);
+       R2(D,A,B,C,X[10], 9,0x6ED9EBA1);
+       R2(C,D,A,B,X[ 6],11,0x6ED9EBA1);
+       R2(B,C,D,A,X[14],15,0x6ED9EBA1);
+       R2(A,B,C,D,X[ 1], 3,0x6ED9EBA1);
+       R2(D,A,B,C,X[ 9], 9,0x6ED9EBA1);
+       R2(C,D,A,B,X[ 5],11,0x6ED9EBA1);
+       R2(B,C,D,A,X[13],15,0x6ED9EBA1);
+       R2(A,B,C,D,X[ 3], 3,0x6ED9EBA1);
+       R2(D,A,B,C,X[11], 9,0x6ED9EBA1);
+       R2(C,D,A,B,X[ 7],11,0x6ED9EBA1);
+       R2(B,C,D,A,X[15],15,0x6ED9EBA1);
+
+       A = c->A += A;
+       B = c->B += B;
+       C = c->C += C;
+       D = c->D += D;
+               }
+       }
+#endif
+
+#ifndef md4_block_data_order
+#ifdef X
+#undef X
+#endif
+void md4_block_data_order (MD4_CTX *c, const void *data_, int num)
+       {
+       const unsigned char *data=data_;
+       register unsigned long A,B,C,D,l;
+       /*
+        * In case you wonder why A-D are declared as long and not
+        * as MD4_LONG. Doing so results in slight performance
+        * boost on LP64 architectures. The catch is we don't
+        * really care if 32 MSBs of a 64-bit register get polluted
+        * with eventual overflows as we *save* only 32 LSBs in
+        * *either* case. Now declaring 'em long excuses the compiler
+        * from keeping 32 MSBs zeroed resulting in 13% performance
+        * improvement under SPARC Solaris7/64 and 5% under AlphaLinux.
+        * Well, to be honest it should say that this *prevents* 
+        * performance degradation.
+        *
+        *                              <[EMAIL PROTECTED]>
+        */
+#ifndef MD32_XARRAY
+       /* See comment in crypto/sha/sha_locl.h for details. */
+       unsigned long   XX0, XX1, XX2, XX3, XX4, XX5, XX6, XX7,
+                       XX8, XX9,XX10,XX11,XX12,XX13,XX14,XX15;
+# define X(i)  XX##i
+#else
+       MD4_LONG XX[MD4_LBLOCK];
+# define X(i)  XX[i]
+#endif
+
+       A=c->A;
+       B=c->B;
+       C=c->C;
+       D=c->D;
+
+       for (;num--;)
+               {
+       HOST_c2l(data,l); X( 0)=l;              HOST_c2l(data,l); X( 1)=l;
+       /* Round 0 */
+       R0(A,B,C,D,X( 0), 3,0); HOST_c2l(data,l); X( 2)=l;
+       R0(D,A,B,C,X( 1), 7,0); HOST_c2l(data,l); X( 3)=l;
+       R0(C,D,A,B,X( 2),11,0); HOST_c2l(data,l); X( 4)=l;
+       R0(B,C,D,A,X( 3),19,0); HOST_c2l(data,l); X( 5)=l;
+       R0(A,B,C,D,X( 4), 3,0); HOST_c2l(data,l); X( 6)=l;
+       R0(D,A,B,C,X( 5), 7,0); HOST_c2l(data,l); X( 7)=l;
+       R0(C,D,A,B,X( 6),11,0); HOST_c2l(data,l); X( 8)=l;
+       R0(B,C,D,A,X( 7),19,0); HOST_c2l(data,l); X( 9)=l;
+       R0(A,B,C,D,X( 8), 3,0); HOST_c2l(data,l); X(10)=l;
+       R0(D,A,B,C,X( 9), 7,0); HOST_c2l(data,l); X(11)=l;
+       R0(C,D,A,B,X(10),11,0); HOST_c2l(data,l); X(12)=l;
+       R0(B,C,D,A,X(11),19,0); HOST_c2l(data,l); X(13)=l;
+       R0(A,B,C,D,X(12), 3,0); HOST_c2l(data,l); X(14)=l;
+       R0(D,A,B,C,X(13), 7,0); HOST_c2l(data,l); X(15)=l;
+       R0(C,D,A,B,X(14),11,0);
+       R0(B,C,D,A,X(15),19,0);
+       /* Round 1 */
+       R1(A,B,C,D,X( 0), 3,0x5A827999L);
+       R1(D,A,B,C,X( 4), 5,0x5A827999L);
+       R1(C,D,A,B,X( 8), 9,0x5A827999L);
+       R1(B,C,D,A,X(12),13,0x5A827999L);
+       R1(A,B,C,D,X( 1), 3,0x5A827999L);
+       R1(D,A,B,C,X( 5), 5,0x5A827999L);
+       R1(C,D,A,B,X( 9), 9,0x5A827999L);
+       R1(B,C,D,A,X(13),13,0x5A827999L);
+       R1(A,B,C,D,X( 2), 3,0x5A827999L);
+       R1(D,A,B,C,X( 6), 5,0x5A827999L);
+       R1(C,D,A,B,X(10), 9,0x5A827999L);
+       R1(B,C,D,A,X(14),13,0x5A827999L);
+       R1(A,B,C,D,X( 3), 3,0x5A827999L);
+       R1(D,A,B,C,X( 7), 5,0x5A827999L);
+       R1(C,D,A,B,X(11), 9,0x5A827999L);
+       R1(B,C,D,A,X(15),13,0x5A827999L);
+       /* Round 2 */
+       R2(A,B,C,D,X( 0), 3,0x6ED9EBA1L);
+       R2(D,A,B,C,X( 8), 9,0x6ED9EBA1L);
+       R2(C,D,A,B,X( 4),11,0x6ED9EBA1L);
+       R2(B,C,D,A,X(12),15,0x6ED9EBA1L);
+       R2(A,B,C,D,X( 2), 3,0x6ED9EBA1L);
+       R2(D,A,B,C,X(10), 9,0x6ED9EBA1L);
+       R2(C,D,A,B,X( 6),11,0x6ED9EBA1L);
+       R2(B,C,D,A,X(14),15,0x6ED9EBA1L);
+       R2(A,B,C,D,X( 1), 3,0x6ED9EBA1L);
+       R2(D,A,B,C,X( 9), 9,0x6ED9EBA1L);
+       R2(C,D,A,B,X( 5),11,0x6ED9EBA1L);
+       R2(B,C,D,A,X(13),15,0x6ED9EBA1L);
+       R2(A,B,C,D,X( 3), 3,0x6ED9EBA1L);
+       R2(D,A,B,C,X(11), 9,0x6ED9EBA1L);
+       R2(C,D,A,B,X( 7),11,0x6ED9EBA1L);
+       R2(B,C,D,A,X(15),15,0x6ED9EBA1L);
+
+       A = c->A += A;
+       B = c->B += B;
+       C = c->C += C;
+       D = c->D += D;
+               }
+       }
+#endif
+
+#ifdef undef
+int printit(unsigned long *l)
+       {
+       int i,ii;
+
+       for (i=0; i<2; i++)
+               {
+               for (ii=0; ii<8; ii++)
+                       {
+                       fprintf(stderr,"%08lx ",l[i*8+ii]);
+                       }
+               fprintf(stderr,"\n");
+               }
+       }
+#endif
diff --exclude=*~ -ruN openssl-0.9.5a.orig/crypto/md4/md4_locl.h 
openssl-0.9.5a/crypto/md4/md4_locl.h
--- openssl-0.9.5a.orig/crypto/md4/md4_locl.h   Thu Jan  1 01:00:00 1970
+++ openssl-0.9.5a/crypto/md4/md4_locl.h        Mon Aug 14 08:47:15 2000
@@ -0,0 +1,154 @@
+/* crypto/md4/md4_locl.h */
+/* Copyright (C) 1995-1998 Eric Young ([EMAIL PROTECTED])
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young ([EMAIL PROTECTED]).
+ * The implementation was written so as to conform with Netscapes SSL.
+ * 
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson ([EMAIL PROTECTED]).
+ * 
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young ([EMAIL PROTECTED])"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from 
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson ([EMAIL PROTECTED])"
+ * 
+ * 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 <stdlib.h>
+#include <string.h>
+#include <openssl/opensslconf.h>
+#include <openssl/md4.h>
+
+#ifndef MD4_LONG_LOG2
+#define MD4_LONG_LOG2 2 /* default to 32 bits */
+#endif
+
+void md4_block_host_order (MD4_CTX *c, const void *p,int num);
+void md4_block_data_order (MD4_CTX *c, const void *p,int num);
+
+#if defined(__i386) || defined(_M_IX86) || defined(__INTEL__)
+/*
+ * *_block_host_order is expected to handle aligned data while
+ * *_block_data_order - unaligned. As algorithm and host (x86)
+ * are in this case of the same "endianness" these two are
+ * otherwise indistinguishable. But normally you don't want to
+ * call the same function because unaligned access in places
+ * where alignment is expected is usually a "Bad Thing". Indeed,
+ * on RISCs you get punished with BUS ERROR signal or *severe*
+ * performance degradation. Intel CPUs are in turn perfectly
+ * capable of loading unaligned data without such drastic side
+ * effect. Yes, they say it's slower than aligned load, but no
+ * exception is generated and therefore performance degradation
+ * is *incomparable* with RISCs. What we should weight here is
+ * costs of unaligned access against costs of aligning data.
+ * According to my measurements allowing unaligned access results
+ * in ~9% performance improvement on Pentium II operating at
+ * 266MHz. I won't be surprised if the difference will be higher
+ * on faster systems:-)
+ *
+ *                             <[EMAIL PROTECTED]>
+ */
+#define md4_block_data_order md4_block_host_order
+#endif
+
+#define DATA_ORDER_IS_LITTLE_ENDIAN
+
+#define HASH_LONG              MD4_LONG
+#define HASH_LONG_LOG2         MD4_LONG_LOG2
+#define HASH_CTX               MD4_CTX
+#define HASH_CBLOCK            MD4_CBLOCK
+#define HASH_LBLOCK            MD4_LBLOCK
+#define HASH_UPDATE            MD4_Update
+#define HASH_TRANSFORM         MD4_Transform
+#define HASH_FINAL             MD4_Final
+#define        HASH_MAKE_STRING(c,s)   do {    \
+       unsigned long ll;               \
+       ll=(c)->A; HOST_l2c(ll,(s));    \
+       ll=(c)->B; HOST_l2c(ll,(s));    \
+       ll=(c)->C; HOST_l2c(ll,(s));    \
+       ll=(c)->D; HOST_l2c(ll,(s));    \
+       } while (0)
+#define HASH_BLOCK_HOST_ORDER  md4_block_host_order
+#if !defined(L_ENDIAN) || defined(md4_block_data_order)
+#define        HASH_BLOCK_DATA_ORDER   md4_block_data_order
+/*
+ * Little-endians (Intel and Alpha) feel better without this.
+ * It looks like memcpy does better job than generic
+ * md4_block_data_order on copying-n-aligning input data.
+ * But frankly speaking I didn't expect such result on Alpha.
+ * On the other hand I've got this with egcs-1.0.2 and if
+ * program is compiled with another (better?) compiler it
+ * might turn out other way around.
+ *
+ *                             <[EMAIL PROTECTED]>
+ */
+#endif
+
+#include "md32_common.h"
+
+/*
+#define        F(x,y,z)        (((x) & (y))  |  ((~(x)) & (z)))
+#define        G(x,y,z)        (((x) & (y))  |  ((x) & ((z))) | ((y) & ((z))))
+*/
+
+/* As pointed out by Wei Dai <[EMAIL PROTECTED]>, the above can be
+ * simplified to the code below.  Wei attributes these optimizations
+ * to Peter Gutmann's SHS code, and he attributes it to Rich Schroeppel.
+ */
+#define        F(b,c,d)        ((((c) ^ (d)) & (b)) ^ (d))
+#define G(b,c,d)       (((b) & (c)) | ((b) & (d)) | ((c) & (d)))
+#define        H(b,c,d)        ((b) ^ (c) ^ (d))
+
+#define R0(a,b,c,d,k,s,t) { \
+       a+=((k)+(t)+F((b),(c),(d))); \
+       a=ROTATE(a,s); };
+
+#define R1(a,b,c,d,k,s,t) { \
+       a+=((k)+(t)+G((b),(c),(d))); \
+       a=ROTATE(a,s); };\
+
+#define R2(a,b,c,d,k,s,t) { \
+       a+=((k)+(t)+H((b),(c),(d))); \
+       a=ROTATE(a,s); };
diff --exclude=*~ -ruN openssl-0.9.5a.orig/crypto/md4/md4_one.c 
openssl-0.9.5a/crypto/md4/md4_one.c
--- openssl-0.9.5a.orig/crypto/md4/md4_one.c    Thu Jan  1 01:00:00 1970
+++ openssl-0.9.5a/crypto/md4/md4_one.c Mon Aug 14 07:35:44 2000
@@ -0,0 +1,95 @@
+/* crypto/md4/md4_one.c */
+/* Copyright (C) 1995-1998 Eric Young ([EMAIL PROTECTED])
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young ([EMAIL PROTECTED]).
+ * The implementation was written so as to conform with Netscapes SSL.
+ * 
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson ([EMAIL PROTECTED]).
+ * 
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young ([EMAIL PROTECTED])"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from 
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson ([EMAIL PROTECTED])"
+ * 
+ * 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 <string.h>
+#include <openssl/md4.h>
+
+#ifdef CHARSET_EBCDIC
+#include <openssl/ebcdic.h>
+#endif
+
+unsigned char *MD4(const unsigned char *d, unsigned long n, unsigned char *md)
+       {
+       MD4_CTX c;
+       static unsigned char m[MD4_DIGEST_LENGTH];
+
+       if (md == NULL) md=m;
+       MD4_Init(&c);
+#ifndef CHARSET_EBCDIC
+       MD4_Update(&c,d,n);
+#else
+       {
+               char temp[1024];
+               unsigned long chunk;
+
+               while (n > 0)
+               {
+                       chunk = (n > sizeof(temp)) ? sizeof(temp) : n;
+                       ebcdic2ascii(temp, d, chunk);
+                       MD4_Update(&c,temp,chunk);
+                       n -= chunk;
+                       d += chunk;
+               }
+       }
+#endif
+       MD4_Final(md,&c);
+       memset(&c,0,sizeof(c)); /* security consideration */
+       return(md);
+       }
+
diff --exclude=*~ -ruN openssl-0.9.5a.orig/crypto/md4/md4s.cpp 
openssl-0.9.5a/crypto/md4/md4s.cpp
--- openssl-0.9.5a.orig/crypto/md4/md4s.cpp     Thu Jan  1 01:00:00 1970
+++ openssl-0.9.5a/crypto/md4/md4s.cpp  Mon Aug 14 07:36:01 2000
@@ -0,0 +1,78 @@
+//
+// gettsc.inl
+//
+// gives access to the Pentium's (secret) cycle counter
+//
+// This software was written by Leonard Janke ([EMAIL PROTECTED])
+// in 1996-7 and is entered, by him, into the public domain.
+
+#if defined(__WATCOMC__)
+void GetTSC(unsigned long&);
+#pragma aux GetTSC = 0x0f 0x31 "mov [edi], eax" parm [edi] modify [edx eax];
+#elif defined(__GNUC__)
+inline
+void GetTSC(unsigned long& tsc)
+{
+  asm volatile(".byte 15, 49\n\t"
+              : "=eax" (tsc)
+              :
+              : "%edx", "%eax");
+}
+#elif defined(_MSC_VER)
+inline
+void GetTSC(unsigned long& tsc)
+{
+  unsigned long a;
+  __asm _emit 0fh
+  __asm _emit 31h
+  __asm mov a, eax;
+  tsc=a;
+}
+#endif      
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <openssl/md4.h>
+
+extern "C" {
+void md4_block_x86(MD4_CTX *ctx, unsigned char *buffer,int num);
+}
+
+void main(int argc,char *argv[])
+       {
+       unsigned char buffer[64*256];
+       MD4_CTX ctx;
+       unsigned long s1,s2,e1,e2;
+       unsigned char k[16];
+       unsigned long data[2];
+       unsigned char iv[8];
+       int i,num=0,numm;
+       int j=0;
+
+       if (argc >= 2)
+               num=atoi(argv[1]);
+
+       if (num == 0) num=16;
+       if (num > 250) num=16;
+       numm=num+2;
+       num*=64;
+       numm*=64;
+
+       for (j=0; j<6; j++)
+               {
+               for (i=0; i<10; i++) /**/
+                       {
+                       md4_block_x86(&ctx,buffer,numm);
+                       GetTSC(s1);
+                       md4_block_x86(&ctx,buffer,numm);
+                       GetTSC(e1);
+                       GetTSC(s2);
+                       md4_block_x86(&ctx,buffer,num);
+                       GetTSC(e2);
+                       md4_block_x86(&ctx,buffer,num);
+                       }
+               printf("md4 (%d bytes) %d %d (%.2f)\n",num,
+                       e1-s1,e2-s2,(double)((e1-s1)-(e2-s2))/2);
+               }
+       }
+
diff --exclude=*~ -ruN openssl-0.9.5a.orig/crypto/md4/md4test.c 
openssl-0.9.5a/crypto/md4/md4test.c
--- openssl-0.9.5a.orig/crypto/md4/md4test.c    Thu Jan  1 01:00:00 1970
+++ openssl-0.9.5a/crypto/md4/md4test.c Mon Aug 14 07:37:58 2000
@@ -0,0 +1,129 @@
+/* crypto/md4/md4test.c */
+/* Copyright (C) 1995-1998 Eric Young ([EMAIL PROTECTED])
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young ([EMAIL PROTECTED]).
+ * The implementation was written so as to conform with Netscapes SSL.
+ * 
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson ([EMAIL PROTECTED]).
+ * 
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young ([EMAIL PROTECTED])"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from 
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson ([EMAIL PROTECTED])"
+ * 
+ * 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 <string.h>
+#include <stdlib.h>
+
+#ifdef NO_MD4
+int main(int argc, char *argv[])
+{
+    printf("No MD4 support\n");
+    return(0);
+}
+#else
+#include <openssl/md4.h>
+
+static char *test[]={
+       "",
+       "a",
+       "abc",
+       "message digest",
+       "abcdefghijklmnopqrstuvwxyz",
+       "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
+       NULL,
+       };
+
+static char *ret[]={
+"31d6cfe0d16ae931b73c59d7e0c089c0",
+"bde52cb31de33e46245e05fbdbd6fb24",
+"a448017aaf21d8525fc10ae87aa6729d",
+"d9130a8164549fe818874806e1c7014b",
+"d79e1c308aa5bbcdeea8ed63df412da9",
+"043f8582f241db351ce627e153e7f0e4"
+};
+
+static char *pt(unsigned char *md);
+int main(int argc, char *argv[])
+       {
+       int i,err=0;
+       unsigned char **P,**R;
+       char *p;
+
+       P=(unsigned char **)test;
+       R=(unsigned char **)ret;
+       i=1;
+       while (*P != NULL)
+               {
+               p=pt(MD4(&(P[0][0]),(unsigned long)strlen((char *)*P),NULL));
+               if (strcmp(p,(char *)*R) != 0)
+                       {
+                       printf("error calculating MD4 on '%s'\n",*P);
+                       printf("got %s instead of %s\n",p,*R);
+                       err++;
+                       }
+               else
+                       printf("test %d ok\n",i);
+               i++;
+               R++;
+               P++;
+               }
+       exit(err);
+       return(0);
+       }
+
+static char *pt(unsigned char *md)
+       {
+       int i;
+       static char buf[80];
+
+       for (i=0; i<MD4_DIGEST_LENGTH; i++)
+               sprintf(&(buf[i*2]),"%02x",md[i]);
+       return(buf);
+       }
+#endif
diff --exclude=*~ -ruN openssl-0.9.5a.orig/doc/crypto/crypto.pod 
openssl-0.9.5a/doc/crypto/crypto.pod
--- openssl-0.9.5a.orig/doc/crypto/crypto.pod   Wed Feb 23 18:09:50 2000
+++ openssl-0.9.5a/doc/crypto/crypto.pod        Mon Aug 14 09:34:57 2000
@@ -40,8 +40,9 @@
 
 =item AUTHENTICATION CODES, HASH FUNCTIONS
 
-L<hmac(3)|hmac(3)>, L<md2(3)|md2(3)>, L<md5(3)|md5(3)>, L<mdc2(3)|mdc2(3)>,
-L<ripemd(3)|ripemd(3)>, L<sha(3)|sha(3)> 
+L<hmac(3)|hmac(3)>, L<md2(3)|md2(3)>, L<md4(3)|md4(3)>,
+L<md5(3)|md5(3)>, L<mdc2(3)|mdc2(3)>, L<ripemd(3)|ripemd(3)>,
+L<sha(3)|sha(3)>
 
 =item AUXILIARY FUNCTIONS
 
diff --exclude=*~ -ruN openssl-0.9.5a.orig/doc/crypto/md5.pod 
openssl-0.9.5a/doc/crypto/md5.pod
--- openssl-0.9.5a.orig/doc/crypto/md5.pod      Fri Feb 25 17:00:23 2000
+++ openssl-0.9.5a/doc/crypto/md5.pod   Mon Aug 14 09:33:59 2000
@@ -2,8 +2,8 @@
 
 =head1 NAME
 
-MD2, MD5, MD2_Init, MD2_Update, MD2_Final, MD5_Init, MD5_Update,
-MD5_Final - MD2 and MD5 hash functions
+MD2, MD4, MD5, MD2_Init, MD2_Update, MD2_Final, MD4_Init, MD4_Update,
+MD4_Final, MD5_Init, MD5_Update, MD5_Final - MD2, MD4, and MD5 hash functions
 
 =head1 SYNOPSIS
 
@@ -18,6 +18,16 @@
  void MD2_Final(unsigned char *md, MD2_CTX *c);
 
 
+ #include <openssl/md4.h>
+
+ unsigned char *MD4(const unsigned char *d, unsigned long n,
+                  unsigned char *md);
+
+ void MD4_Init(MD4_CTX *c);
+ void MD4_Update(MD4_CTX *c, const void *data,
+                  unsigned long len);
+ void MD4_Final(unsigned char *md, MD4_CTX *c);
+
  #include <openssl/md5.h>
 
  unsigned char *MD5(const unsigned char *d, unsigned long n,
@@ -30,12 +40,13 @@
 
 =head1 DESCRIPTION
 
-MD2 and MD5 are cryptographic hash functions with a 128 bit output.
+MD2, MD4, and MD5 are cryptographic hash functions with a 128 bit output.
 
-MD2() and MD5() compute the MD2 and MD5 message digest of the B<n>
-bytes at B<d> and place it in B<md> (which must have space for
-MD2_DIGEST_LENGTH == MD5_DIGEST_LENGTH == 16 bytes of output). If
-B<md> is NULL, the digest is placed in a static array.
+MD2(), MD4(), and MD5() compute the MD2, MD4, and MD5 message digest
+of the B<n> bytes at B<d> and place it in B<md> (which must have space
+for MD2_DIGEST_LENGTH == MD4_DIGEST_LENGTH == MD5_DIGEST_LENGTH == 16
+bytes of output). If B<md> is NULL, the digest is placed in a static
+array.
 
 The following functions may be used if the message is not completely
 stored in memory:
@@ -48,8 +59,8 @@
 MD2_Final() places the message digest in B<md>, which must have space
 for MD2_DIGEST_LENGTH == 16 bytes of output, and erases the B<MD2_CTX>.
 
-MD5_Init(), MD5_Update() and MD5_Final() are analogous using an
-B<MD5_CTX> structure.
+MD4_Init(), MD4_Update(), MD4_Final(), MD5_Init(), MD5_Update(), and
+MD5_Final() are analogous using an B<MD4_CTX> and B<MD5_CTX> structure.
 
 Applications should use the higher level functions
 L<EVP_DigestInit(3)|EVP_DigestInit(3)>
@@ -57,20 +68,21 @@
 
 =head1 NOTE
 
-MD2 and MD5 are recommended only for compatibility with existing
+MD2, MD4, and MD5 are recommended only for compatibility with existing
 applications. In new applications, SHA-1 or RIPEMD-160 should be
 preferred.
 
 =head1 RETURN VALUES
 
-MD2() and MD5() return pointers to the hash value. 
+MD2(), MD4(), and MD5() return pointers to the hash value. 
 
-MD2_Init(), MD2_Update() MD2_Final(), MD5_Init(), MD5_Update() and
-MD5_Final() do not return values.
+MD2_Init(), MD2_Update(), MD2_Final(), MD4_Init(), MD4_Update(),
+MD4_Final(), MD5_Init(), MD5_Update(), and MD5_Final() do not return
+values.
 
 =head1 CONFORMING TO
 
-RFC 1319, RFC 1321
+RFC 1319, RFC 1320, RFC 1321
 
 =head1 SEE ALSO
 
@@ -81,5 +93,8 @@
 MD2(), MD2_Init(), MD2_Update() MD2_Final(), MD5(), MD5_Init(),
 MD5_Update() and MD5_Final() are available in all versions of SSLeay
 and OpenSSL.
+
+MD4(), MD4_Init(), and MD4_Update() are available in OpenSSL 0.9.6 and
+above.
 
 =cut
diff --exclude=*~ -ruN openssl-0.9.5a.orig/include/openssl/md4.h 
openssl-0.9.5a/include/openssl/md4.h
--- openssl-0.9.5a.orig/include/openssl/md4.h   Thu Jan  1 01:00:00 1970
+++ openssl-0.9.5a/include/openssl/md4.h        Mon Aug 14 07:19:41 2000
@@ -0,0 +1,114 @@
+/* crypto/md4/md4.h */
+/* Copyright (C) 1995-1998 Eric Young ([EMAIL PROTECTED])
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young ([EMAIL PROTECTED]).
+ * The implementation was written so as to conform with Netscapes SSL.
+ * 
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson ([EMAIL PROTECTED]).
+ * 
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young ([EMAIL PROTECTED])"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from 
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson ([EMAIL PROTECTED])"
+ * 
+ * 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_MD4_H
+#define HEADER_MD4_H
+
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
+#ifdef NO_MD4
+#error MD4 is disabled.
+#endif
+
+/*
+ * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ * ! MD4_LONG has to be at least 32 bits wide. If it's wider, then !
+ * ! MD4_LONG_LOG2 has to be defined along.                       !
+ * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ */
+
+#if defined(WIN16) || defined(__LP32__)
+#define MD4_LONG unsigned long
+#elif defined(_CRAY) || defined(__ILP64__)
+#define MD4_LONG unsigned long
+#define MD4_LONG_LOG2 3
+/*
+ * _CRAY note. I could declare short, but I have no idea what impact
+ * does it have on performance on none-T3E machines. I could declare
+ * int, but at least on C90 sizeof(int) can be chosen at compile time.
+ * So I've chosen long...
+ *                                     <[EMAIL PROTECTED]>
+ */
+#else
+#define MD4_LONG unsigned int
+#endif
+
+#define MD4_CBLOCK     64
+#define MD4_LBLOCK     (MD4_CBLOCK/4)
+#define MD4_DIGEST_LENGTH 16
+
+typedef struct MD4state_st
+       {
+       MD4_LONG A,B,C,D;
+       MD4_LONG Nl,Nh;
+       MD4_LONG data[MD4_LBLOCK];
+       int num;
+       } MD4_CTX;
+
+void MD4_Init(MD4_CTX *c);
+void MD4_Update(MD4_CTX *c, const void *data, unsigned long len);
+void MD4_Final(unsigned char *md, MD4_CTX *c);
+unsigned char *MD4(const unsigned char *d, unsigned long n, unsigned char *md);
+void MD4_Transform(MD4_CTX *c, const unsigned char *b);
+#ifdef  __cplusplus
+}
+#endif
+
+#endif
diff --exclude=*~ -ruN openssl-0.9.5a.orig/test/Makefile openssl-0.9.5a/test/Makefile
--- openssl-0.9.5a.orig/test/Makefile   Mon Mar 20 08:27:35 2000
+++ openssl-0.9.5a/test/Makefile        Mon Aug 14 07:55:54 2000
@@ -38,6 +38,7 @@
 MDC2TEST=      mdc2test
 RMDTEST=       rmdtest
 MD2TEST=       md2test
+MD4TEST=       md4test
 MD5TEST=       md5test
 HMACTEST=      hmactest
 RC2TEST=       rc2test
@@ -53,7 +54,7 @@
 SSLTEST=       ssltest
 RSATEST=       rsa_test
 
-EXE=   $(BNTEST) $(IDEATEST) $(MD2TEST)  $(MD5TEST) $(HMACTEST) \
+EXE=   $(BNTEST) $(IDEATEST) $(MD2TEST)  $(MD4TEST) $(MD5TEST) $(HMACTEST) \
        $(RC2TEST) $(RC4TEST) $(RC5TEST) \
        $(DESTEST) $(SHATEST) $(SHA1TEST) $(MDC2TEST) $(RMDTEST) \
        $(RANDTEST) $(DHTEST) \
@@ -61,12 +62,14 @@
 
 # $(METHTEST)
 
-OBJ=   $(BNTEST).o $(IDEATEST).o $(MD2TEST).o  $(MD5TEST).o $(HMACTEST).o \
+OBJ=   $(BNTEST).o $(IDEATEST).o $(MD2TEST).o $(MD4TEST).o $(MD5TEST).o \
+       $(HMACTEST).o \
        $(RC2TEST).o $(RC4TEST).o $(RC5TEST).o \
        $(DESTEST).o $(SHATEST).o $(SHA1TEST).o $(MDC2TEST).o $(RMDTEST).o \
        $(RANDTEST).o $(DHTEST).o $(CASTTEST).o \
        $(BFTEST).o  $(SSLTEST).o  $(DSATEST).o  $(EXPTEST).o $(RSATEST).o
-SRC=   $(BNTEST).c $(IDEATEST).c $(MD2TEST).c  $(MD5TEST).c  $(HMACTEST).c \
+SRC=   $(BNTEST).c $(IDEATEST).c $(MD2TEST).c  $(MD4TEST).c $(MD5TEST).c \
+       $(HMACTEST).c \
        $(RC2TEST).c $(RC4TEST).c $(RC5TEST).c \
        $(DESTEST).c $(SHATEST).c $(SHA1TEST).c $(MDC2TEST).c $(RMDTEST).c \
        $(RANDTEST).c $(DHTEST).c $(CASTTEST).c \
@@ -98,7 +101,8 @@
        ctags $(SRC)
 
 tests: exe apps \
-       test_des test_idea test_sha test_md5 test_hmac test_md2 test_mdc2 \
+       test_des test_idea test_sha test_md4 test_md5 test_hmac \
+       test_md2 test_mdc2 \
        test_rmd test_rc2 test_rc4 test_rc5 test_bf test_cast \
        test_rand test_bn test_enc test_x509 test_rsa test_crl test_sid \
        test_gen test_req test_pkcs7 test_verify test_dh test_dsa \
@@ -123,6 +127,9 @@
 test_md5:
        ./$(MD5TEST)
 
+test_md4:
+       ./$(MD4TEST)
+
 test_hmac:
        ./$(HMACTEST)
 
@@ -268,6 +275,9 @@
 $(MDC2TEST): $(MDC2TEST).o $(DLIBCRYPTO)
        $(CC) -o $(MDC2TEST) $(CFLAGS) $(MDC2TEST).o $(PEX_LIBS) $(LIBCRYPTO) 
$(EX_LIBS)
 
+$(MD4TEST): $(MD4TEST).o $(DLIBCRYPTO)
+       $(CC) -o $(MD4TEST) $(CFLAGS) $(MD4TEST).o $(PEX_LIBS) $(LIBCRYPTO) $(EX_LIBS)
+
 $(MD5TEST): $(MD5TEST).o $(DLIBCRYPTO)
        $(CC) -o $(MD5TEST) $(CFLAGS) $(MD5TEST).o $(PEX_LIBS) $(LIBCRYPTO) $(EX_LIBS)
 
@@ -361,6 +371,7 @@
 hmactest.o: ../include/openssl/stack.h
 ideatest.o: ../include/openssl/idea.h ../include/openssl/opensslconf.h
 md2test.o: ../include/openssl/md2.h ../include/openssl/opensslconf.h
+md4test.o: ../include/openssl/md4.h
 md5test.o: ../include/openssl/md5.h
 mdc2test.o: ../include/openssl/des.h ../include/openssl/e_os2.h
 mdc2test.o: ../include/openssl/mdc2.h ../include/openssl/opensslconf.h
diff --exclude=*~ -ruN openssl-0.9.5a.orig/test/Makefile.save 
openssl-0.9.5a/test/Makefile.save
--- openssl-0.9.5a.orig/test/Makefile.save      Mon Mar 20 08:27:34 2000
+++ openssl-0.9.5a/test/Makefile.save   Mon Aug 14 07:54:23 2000
@@ -38,6 +38,7 @@
 MDC2TEST=      mdc2test
 RMDTEST=       rmdtest
 MD2TEST=       md2test
+MD4TEST=       md4test
 MD5TEST=       md5test
 HMACTEST=      hmactest
 RC2TEST=       rc2test
@@ -53,7 +54,7 @@
 SSLTEST=       ssltest
 RSATEST=       rsa_test
 
-EXE=   $(BNTEST) $(IDEATEST) $(MD2TEST)  $(MD5TEST) $(HMACTEST) \
+EXE=   $(BNTEST) $(IDEATEST) $(MD2TEST)  $(MD4TEST) $(MD5TEST) $(HMACTEST) \
        $(RC2TEST) $(RC4TEST) $(RC5TEST) \
        $(DESTEST) $(SHATEST) $(SHA1TEST) $(MDC2TEST) $(RMDTEST) \
        $(RANDTEST) $(DHTEST) \
@@ -61,12 +62,14 @@
 
 # $(METHTEST)
 
-OBJ=   $(BNTEST).o $(IDEATEST).o $(MD2TEST).o  $(MD5TEST).o $(HMACTEST).o \
+OBJ=   $(BNTEST).o $(IDEATEST).o $(MD2TEST).o $(MD4TEST).o $(MD5TEST).o \
+       $(HMACTEST).o \
        $(RC2TEST).o $(RC4TEST).o $(RC5TEST).o \
        $(DESTEST).o $(SHATEST).o $(SHA1TEST).o $(MDC2TEST).o $(RMDTEST).o \
        $(RANDTEST).o $(DHTEST).o $(CASTTEST).o \
        $(BFTEST).o  $(SSLTEST).o  $(DSATEST).o  $(EXPTEST).o $(RSATEST).o
-SRC=   $(BNTEST).c $(IDEATEST).c $(MD2TEST).c  $(MD5TEST).c  $(HMACTEST).c \
+SRC=   $(BNTEST).c $(IDEATEST).c $(MD2TEST).c  $(MD4TEST).c $(MD5TEST).c \
+       $(HMACTEST).c \
        $(RC2TEST).c $(RC4TEST).c $(RC5TEST).c \
        $(DESTEST).c $(SHATEST).c $(SHA1TEST).c $(MDC2TEST).c $(RMDTEST).c \
        $(RANDTEST).c $(DHTEST).c $(CASTTEST).c \
@@ -98,7 +101,8 @@
        ctags $(SRC)
 
 tests: exe apps \
-       test_des test_idea test_sha test_md5 test_hmac test_md2 test_mdc2 \
+       test_des test_idea test_sha test_md4 test_md5 test_hmac \
+       test_md2 test_mdc2 \
        test_rmd test_rc2 test_rc4 test_rc5 test_bf test_cast \
        test_rand test_bn test_enc test_x509 test_rsa test_crl test_sid \
        test_gen test_req test_pkcs7 test_verify test_dh test_dsa \
@@ -123,6 +127,9 @@
 test_md5:
        ./$(MD5TEST)
 
+test_md4:
+       ./$(MD4TEST)
+
 test_hmac:
        ./$(HMACTEST)
 
@@ -268,6 +275,9 @@
 $(MDC2TEST): $(MDC2TEST).o $(DLIBCRYPTO)
        $(CC) -o $(MDC2TEST) $(CFLAGS) $(MDC2TEST).o $(PEX_LIBS) $(LIBCRYPTO) 
$(EX_LIBS)
 
+$(MD4TEST): $(MD4TEST).o $(DLIBCRYPTO)
+       $(CC) -o $(MD4TEST) $(CFLAGS) $(MD4TEST).o $(PEX_LIBS) $(LIBCRYPTO) $(EX_LIBS)
+
 $(MD5TEST): $(MD5TEST).o $(DLIBCRYPTO)
        $(CC) -o $(MD5TEST) $(CFLAGS) $(MD5TEST).o $(PEX_LIBS) $(LIBCRYPTO) $(EX_LIBS)
 
@@ -361,6 +371,7 @@
 hmactest.o: ../include/openssl/stack.h
 ideatest.o: ../include/openssl/idea.h ../include/openssl/opensslconf.h
 md2test.o: ../include/openssl/md2.h ../include/openssl/opensslconf.h
+md4test.o: ../include/openssl/md4.h
 md5test.o: ../include/openssl/md5.h
 mdc2test.o: ../include/openssl/des.h ../include/openssl/e_os2.h
 mdc2test.o: ../include/openssl/mdc2.h ../include/openssl/opensslconf.h
diff --exclude=*~ -ruN openssl-0.9.5a.orig/test/Makefile.ssl 
openssl-0.9.5a/test/Makefile.ssl
--- openssl-0.9.5a.orig/test/Makefile.ssl       Mon Mar 20 08:27:35 2000
+++ openssl-0.9.5a/test/Makefile.ssl    Mon Aug 14 07:55:54 2000
@@ -38,6 +38,7 @@
 MDC2TEST=      mdc2test
 RMDTEST=       rmdtest
 MD2TEST=       md2test
+MD4TEST=       md4test
 MD5TEST=       md5test
 HMACTEST=      hmactest
 RC2TEST=       rc2test
@@ -53,7 +54,7 @@
 SSLTEST=       ssltest
 RSATEST=       rsa_test
 
-EXE=   $(BNTEST) $(IDEATEST) $(MD2TEST)  $(MD5TEST) $(HMACTEST) \
+EXE=   $(BNTEST) $(IDEATEST) $(MD2TEST)  $(MD4TEST) $(MD5TEST) $(HMACTEST) \
        $(RC2TEST) $(RC4TEST) $(RC5TEST) \
        $(DESTEST) $(SHATEST) $(SHA1TEST) $(MDC2TEST) $(RMDTEST) \
        $(RANDTEST) $(DHTEST) \
@@ -61,12 +62,14 @@
 
 # $(METHTEST)
 
-OBJ=   $(BNTEST).o $(IDEATEST).o $(MD2TEST).o  $(MD5TEST).o $(HMACTEST).o \
+OBJ=   $(BNTEST).o $(IDEATEST).o $(MD2TEST).o $(MD4TEST).o $(MD5TEST).o \
+       $(HMACTEST).o \
        $(RC2TEST).o $(RC4TEST).o $(RC5TEST).o \
        $(DESTEST).o $(SHATEST).o $(SHA1TEST).o $(MDC2TEST).o $(RMDTEST).o \
        $(RANDTEST).o $(DHTEST).o $(CASTTEST).o \
        $(BFTEST).o  $(SSLTEST).o  $(DSATEST).o  $(EXPTEST).o $(RSATEST).o
-SRC=   $(BNTEST).c $(IDEATEST).c $(MD2TEST).c  $(MD5TEST).c  $(HMACTEST).c \
+SRC=   $(BNTEST).c $(IDEATEST).c $(MD2TEST).c  $(MD4TEST).c $(MD5TEST).c \
+       $(HMACTEST).c \
        $(RC2TEST).c $(RC4TEST).c $(RC5TEST).c \
        $(DESTEST).c $(SHATEST).c $(SHA1TEST).c $(MDC2TEST).c $(RMDTEST).c \
        $(RANDTEST).c $(DHTEST).c $(CASTTEST).c \
@@ -98,7 +101,8 @@
        ctags $(SRC)
 
 tests: exe apps \
-       test_des test_idea test_sha test_md5 test_hmac test_md2 test_mdc2 \
+       test_des test_idea test_sha test_md4 test_md5 test_hmac \
+       test_md2 test_mdc2 \
        test_rmd test_rc2 test_rc4 test_rc5 test_bf test_cast \
        test_rand test_bn test_enc test_x509 test_rsa test_crl test_sid \
        test_gen test_req test_pkcs7 test_verify test_dh test_dsa \
@@ -123,6 +127,9 @@
 test_md5:
        ./$(MD5TEST)
 
+test_md4:
+       ./$(MD4TEST)
+
 test_hmac:
        ./$(HMACTEST)
 
@@ -268,6 +275,9 @@
 $(MDC2TEST): $(MDC2TEST).o $(DLIBCRYPTO)
        $(CC) -o $(MDC2TEST) $(CFLAGS) $(MDC2TEST).o $(PEX_LIBS) $(LIBCRYPTO) 
$(EX_LIBS)
 
+$(MD4TEST): $(MD4TEST).o $(DLIBCRYPTO)
+       $(CC) -o $(MD4TEST) $(CFLAGS) $(MD4TEST).o $(PEX_LIBS) $(LIBCRYPTO) $(EX_LIBS)
+
 $(MD5TEST): $(MD5TEST).o $(DLIBCRYPTO)
        $(CC) -o $(MD5TEST) $(CFLAGS) $(MD5TEST).o $(PEX_LIBS) $(LIBCRYPTO) $(EX_LIBS)
 
@@ -361,6 +371,7 @@
 hmactest.o: ../include/openssl/stack.h
 ideatest.o: ../include/openssl/idea.h ../include/openssl/opensslconf.h
 md2test.o: ../include/openssl/md2.h ../include/openssl/opensslconf.h
+md4test.o: ../include/openssl/md4.h
 md5test.o: ../include/openssl/md5.h
 mdc2test.o: ../include/openssl/des.h ../include/openssl/e_os2.h
 mdc2test.o: ../include/openssl/mdc2.h ../include/openssl/opensslconf.h
diff --exclude=*~ -ruN openssl-0.9.5a.orig/test/md4test.c openssl-0.9.5a/test/md4test.c
--- openssl-0.9.5a.orig/test/md4test.c  Thu Jan  1 01:00:00 1970
+++ openssl-0.9.5a/test/md4test.c       Mon Aug 14 07:37:58 2000
@@ -0,0 +1,129 @@
+/* crypto/md4/md4test.c */
+/* Copyright (C) 1995-1998 Eric Young ([EMAIL PROTECTED])
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young ([EMAIL PROTECTED]).
+ * The implementation was written so as to conform with Netscapes SSL.
+ * 
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson ([EMAIL PROTECTED]).
+ * 
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young ([EMAIL PROTECTED])"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from 
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson ([EMAIL PROTECTED])"
+ * 
+ * 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 <string.h>
+#include <stdlib.h>
+
+#ifdef NO_MD4
+int main(int argc, char *argv[])
+{
+    printf("No MD4 support\n");
+    return(0);
+}
+#else
+#include <openssl/md4.h>
+
+static char *test[]={
+       "",
+       "a",
+       "abc",
+       "message digest",
+       "abcdefghijklmnopqrstuvwxyz",
+       "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
+       NULL,
+       };
+
+static char *ret[]={
+"31d6cfe0d16ae931b73c59d7e0c089c0",
+"bde52cb31de33e46245e05fbdbd6fb24",
+"a448017aaf21d8525fc10ae87aa6729d",
+"d9130a8164549fe818874806e1c7014b",
+"d79e1c308aa5bbcdeea8ed63df412da9",
+"043f8582f241db351ce627e153e7f0e4"
+};
+
+static char *pt(unsigned char *md);
+int main(int argc, char *argv[])
+       {
+       int i,err=0;
+       unsigned char **P,**R;
+       char *p;
+
+       P=(unsigned char **)test;
+       R=(unsigned char **)ret;
+       i=1;
+       while (*P != NULL)
+               {
+               p=pt(MD4(&(P[0][0]),(unsigned long)strlen((char *)*P),NULL));
+               if (strcmp(p,(char *)*R) != 0)
+                       {
+                       printf("error calculating MD4 on '%s'\n",*P);
+                       printf("got %s instead of %s\n",p,*R);
+                       err++;
+                       }
+               else
+                       printf("test %d ok\n",i);
+               i++;
+               R++;
+               P++;
+               }
+       exit(err);
+       return(0);
+       }
+
+static char *pt(unsigned char *md)
+       {
+       int i;
+       static char buf[80];
+
+       for (i=0; i<MD4_DIGEST_LENGTH; i++)
+               sprintf(&(buf[i*2]),"%02x",md[i]);
+       return(buf);
+       }
+#endif
diff --exclude=*~ -ruN openssl-0.9.5a.orig/times/x86/md4s.cpp 
openssl-0.9.5a/times/x86/md4s.cpp
--- openssl-0.9.5a.orig/times/x86/md4s.cpp      Thu Jan  1 01:00:00 1970
+++ openssl-0.9.5a/times/x86/md4s.cpp   Mon Aug 14 09:29:08 2000
@@ -0,0 +1,78 @@
+//
+// gettsc.inl
+//
+// gives access to the Pentium's (secret) cycle counter
+//
+// This software was written by Leonard Janke ([EMAIL PROTECTED])
+// in 1996-7 and is entered, by him, into the public domain.
+
+#if defined(__WATCOMC__)
+void GetTSC(unsigned long&);
+#pragma aux GetTSC = 0x0f 0x31 "mov [edi], eax" parm [edi] modify [edx eax];
+#elif defined(__GNUC__)
+inline
+void GetTSC(unsigned long& tsc)
+{
+  asm volatile(".byte 15, 49\n\t"
+              : "=eax" (tsc)
+              :
+              : "%edx", "%eax");
+}
+#elif defined(_MSC_VER)
+inline
+void GetTSC(unsigned long& tsc)
+{
+  unsigned long a;
+  __asm _emit 0fh
+  __asm _emit 31h
+  __asm mov a, eax;
+  tsc=a;
+}
+#endif      
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <openssl/md4.h>
+
+extern "C" {
+void md4_block_x86(MD4_CTX *ctx, unsigned char *buffer,int num);
+}
+
+void main(int argc,char *argv[])
+       {
+       unsigned char buffer[64*256];
+       MD4_CTX ctx;
+       unsigned long s1,s2,e1,e2;
+       unsigned char k[16];
+       unsigned long data[2];
+       unsigned char iv[8];
+       int i,num=0,numm;
+       int j=0;
+
+       if (argc >= 2)
+               num=atoi(argv[1]);
+
+       if (num == 0) num=16;
+       if (num > 250) num=16;
+       numm=num+2;
+       num*=64;
+       numm*=64;
+
+       for (j=0; j<6; j++)
+               {
+               for (i=0; i<10; i++) /**/
+                       {
+                       md4_block_x86(&ctx,buffer,numm);
+                       GetTSC(s1);
+                       md4_block_x86(&ctx,buffer,numm);
+                       GetTSC(e1);
+                       GetTSC(s2);
+                       md4_block_x86(&ctx,buffer,num);
+                       GetTSC(e2);
+                       md4_block_x86(&ctx,buffer,num);
+                       }
+               printf("md4 (%d bytes) %d %d (%.2f)\n",num,
+                       e1-s1,e2-s2,(double)((e1-s1)-(e2-s2))/2);
+               }
+       }
+

Reply via email to