sch isn't an array, how did this pass through gcc?
[openssl.git] / apps / speed.c
index 92712cf464d7ca0ece247e350727a2c0be36c05d..aeb2fa7fd7cb519ef001867e9a4bdec14788a1e1 100644 (file)
@@ -1,4 +1,4 @@
-/* apps/speed.c */
+/* apps/speed.c -*- mode:C; c-file-style: "eay" -*- */
 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
 #include <string.h>
 #include <math.h>
 #include "apps.h"
-#ifdef NO_STDIO
+#ifdef OPENSSL_NO_STDIO
 #define APPS_WIN16
 #endif
 #include <openssl/crypto.h>
 #include <openssl/rand.h>
 #include <openssl/err.h>
-#include <openssl/engine.h>
+#include <openssl/evp.h>
+#include <openssl/objects.h>
+#include OPENSSL_UNISTD
 
-#if defined(__FreeBSD__)
+#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(OPENSSL_SYS_MACOSX)
 # define USE_TOD
-#elif !defined(MSDOS) && (!defined(VMS) || defined(__DECC))
+#elif !defined(OPENSSL_SYS_MSDOS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC))
 # define TIMES
 #endif
-#if !defined(_UNICOS) && !defined(__OpenBSD__) && !defined(sgi) && !defined(__FreeBSD__) && !(defined(__bsdi) || defined(__bsdi__)) && !defined(_AIX) && !defined(MPE) && !defined(__NetBSD__)
+#if !defined(_UNICOS) && !defined(__OpenBSD__) && !defined(sgi) && !defined(__FreeBSD__) && !(defined(__bsdi) || defined(__bsdi__)) && !defined(_AIX) && !defined(OPENSSL_SYS_MPE) && !defined(__NetBSD__) /* FIXME */
 # define TIMEB
 #endif
 
    The __TMS macro will show if it was.  If it wasn't defined, we should
    undefine TIMES, since that tells the rest of the program how things
    should be handled.                          -- Richard Levitte */
-#if defined(VMS) && defined(__DECC) && !defined(__TMS)
+#if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
 #undef TIMES
 #endif
 
 #include <sys/param.h>
 #endif
 
-#ifndef NO_DES
+#ifndef OPENSSL_NO_DES
 #include <openssl/des.h>
 #endif
-#ifndef NO_MD2
+#ifndef OPENSSL_NO_MD2
 #include <openssl/md2.h>
 #endif
-#ifndef NO_MDC2
+#ifndef OPENSSL_NO_MDC2
 #include <openssl/mdc2.h>
 #endif
-#ifndef NO_MD4
+#ifndef OPENSSL_NO_MD4
 #include <openssl/md4.h>
 #endif
-#ifndef NO_MD5
+#ifndef OPENSSL_NO_MD5
 #include <openssl/md5.h>
 #endif
-#ifndef NO_HMAC
+#ifndef OPENSSL_NO_HMAC
 #include <openssl/hmac.h>
 #endif
 #include <openssl/evp.h>
-#ifndef NO_SHA
+#ifndef OPENSSL_NO_SHA
 #include <openssl/sha.h>
 #endif
-#ifndef NO_RIPEMD
+#ifndef OPENSSL_NO_RIPEMD
 #include <openssl/ripemd.h>
 #endif
-#ifndef NO_RC4
+#ifndef OPENSSL_NO_RC4
 #include <openssl/rc4.h>
 #endif
-#ifndef NO_RC5
+#ifndef OPENSSL_NO_RC5
 #include <openssl/rc5.h>
 #endif
-#ifndef NO_RC2
+#ifndef OPENSSL_NO_RC2
 #include <openssl/rc2.h>
 #endif
-#ifndef NO_IDEA
+#ifndef OPENSSL_NO_IDEA
 #include <openssl/idea.h>
 #endif
-#ifndef NO_BF
+#ifndef OPENSSL_NO_BF
 #include <openssl/blowfish.h>
 #endif
-#ifndef NO_CAST
+#ifndef OPENSSL_NO_CAST
 #include <openssl/cast.h>
 #endif
-#ifndef NO_RSA
+#ifndef OPENSSL_NO_RSA
 #include <openssl/rsa.h>
 #include "./testrsa.h"
 #endif
 #include <openssl/x509.h>
-#ifndef NO_DSA
+#ifndef OPENSSL_NO_DSA
 #include "./testdsa.h"
 #endif
 
 /* The following if from times(3) man page.  It may need to be changed */
 #ifndef HZ
-# ifndef CLK_TCK
-#  ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
-#   define HZ  100.0
-#  else /* _BSD_CLK_TCK_ */
-#   define HZ ((double)_BSD_CLK_TCK_)
+# ifdef _SC_CLK_TCK
+#  define HZ ((double)sysconf(_SC_CLK_TCK))
+# else
+#  ifndef CLK_TCK
+#   ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
+#    define HZ 100.0
+#   else /* _BSD_CLK_TCK_ */
+#    define HZ ((double)_BSD_CLK_TCK_)
+#   endif
+#  else /* CLK_TCK */
+#   define HZ ((double)CLK_TCK)
 #  endif
-# else /* CLK_TCK */
-#  define HZ ((double)CLK_TCK)
 # endif
 #endif
 
 #define BUFSIZE        ((long)1024*8+1)
 int run=0;
 
+static char ftime_used = 0, times_used = 0, gettimeofday_used = 0, getrusage_used = 0;
+
 static double Time_F(int s, int usertime);
-static void print_message(char *s,long num,int length);
+static void print_message(const char *s,long num,int length);
 static void pkey_print_message(char *str,char *str2,long num,int bits,int sec);
 #ifdef SIGALRM
 #if defined(__STDC__) || defined(sgi) || defined(_AIX)
@@ -228,6 +236,7 @@ static double Time_F(int s, int usertime)
            {
                static struct rusage tstart,tend;
 
+               getrusage_used = 1;
                if (s == START)
                        {
                        getrusage(RUSAGE_SELF,&tstart);
@@ -249,6 +258,7 @@ static double Time_F(int s, int usertime)
                static struct timeval tstart,tend;
                long i;
 
+               gettimeofday_used = 1;
                if (s == START)
                        {
                        gettimeofday(&tstart,NULL);
@@ -269,6 +279,7 @@ static double Time_F(int s, int usertime)
                {
                static struct tms tstart,tend;
 
+               times_used = 1;
                if (s == START)
                        {
                        times(&tstart);
@@ -290,6 +301,7 @@ static double Time_F(int s, int usertime)
                static struct timeb tstart,tend;
                long i;
 
+               ftime_used = 1;
                if (s == START)
                        {
                        ftime(&tstart);
@@ -314,55 +326,57 @@ int MAIN(int argc, char **argv)
        ENGINE *e;
        unsigned char *buf=NULL,*buf2=NULL;
        int mret=1;
-#define ALGOR_NUM      15
+#define ALGOR_NUM      16
 #define SIZE_NUM       5
 #define RSA_NUM                4
 #define DSA_NUM                3
-       long count,rsa_count;
+       long count,rsa_count,save_count=0;
        int i,j,k;
+#ifndef OPENSSL_NO_RSA
        unsigned rsa_num;
-#ifndef NO_MD2
+#endif
+#ifndef OPENSSL_NO_MD2
        unsigned char md2[MD2_DIGEST_LENGTH];
 #endif
-#ifndef NO_MDC2
+#ifndef OPENSSL_NO_MDC2
        unsigned char mdc2[MDC2_DIGEST_LENGTH];
 #endif
-#ifndef NO_MD4
+#ifndef OPENSSL_NO_MD4
        unsigned char md4[MD4_DIGEST_LENGTH];
 #endif
-#ifndef NO_MD5
+#ifndef OPENSSL_NO_MD5
        unsigned char md5[MD5_DIGEST_LENGTH];
        unsigned char hmac[MD5_DIGEST_LENGTH];
 #endif
-#ifndef NO_SHA
+#ifndef OPENSSL_NO_SHA
        unsigned char sha[SHA_DIGEST_LENGTH];
 #endif
-#ifndef NO_RIPEMD
+#ifndef OPENSSL_NO_RIPEMD
        unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
 #endif
-#ifndef NO_RC4
+#ifndef OPENSSL_NO_RC4
        RC4_KEY rc4_ks;
 #endif
-#ifndef NO_RC5
+#ifndef OPENSSL_NO_RC5
        RC5_32_KEY rc5_ks;
 #endif
-#ifndef NO_RC2
+#ifndef OPENSSL_NO_RC2
        RC2_KEY rc2_ks;
 #endif
-#ifndef NO_IDEA
+#ifndef OPENSSL_NO_IDEA
        IDEA_KEY_SCHEDULE idea_ks;
 #endif
-#ifndef NO_BF
+#ifndef OPENSSL_NO_BF
        BF_KEY bf_ks;
 #endif
-#ifndef NO_CAST
+#ifndef OPENSSL_NO_CAST
        CAST_KEY cast_ks;
 #endif
        static unsigned char key16[16]=
                {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
                 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
        unsigned char iv[8];
-#ifndef NO_DES
+#ifndef OPENSSL_NO_DES
        des_cblock *buf_as_des_cblock = NULL;
        static des_cblock key ={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
        static des_cblock key2={0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
@@ -384,10 +398,11 @@ int MAIN(int argc, char **argv)
 #define        D_CBC_RC5       12
 #define        D_CBC_BF        13
 #define        D_CBC_CAST      14
+#define D_EVP          15
        double d,results[ALGOR_NUM][SIZE_NUM];
        static int lengths[SIZE_NUM]={8,64,256,1024,8*1024};
        long c[ALGOR_NUM][SIZE_NUM];
-       static char *names[ALGOR_NUM]={
+       static const char *names[ALGOR_NUM]={
                "md2","mdc2","md4","md5","hmac(md5)","sha1","rmd160","rc4",
                "des cbc","des ede3","idea cbc",
                "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc"};
@@ -398,7 +413,7 @@ int MAIN(int argc, char **argv)
 #define        R_RSA_1024      1
 #define        R_RSA_2048      2
 #define        R_RSA_4096      3
-#ifndef NO_RSA
+#ifndef OPENSSL_NO_RSA
        RSA *rsa_key[RSA_NUM];
        long rsa_c[RSA_NUM][2];
        double rsa_results[RSA_NUM][2];
@@ -409,7 +424,7 @@ int MAIN(int argc, char **argv)
                sizeof(test512),sizeof(test1024),
                sizeof(test2048),sizeof(test4096)};
 #endif
-#ifndef NO_DSA
+#ifndef OPENSSL_NO_DSA
        DSA *dsa_key[DSA_NUM];
        long dsa_c[DSA_NUM][2];
        double dsa_results[DSA_NUM][2];
@@ -420,6 +435,8 @@ int MAIN(int argc, char **argv)
        int doit[ALGOR_NUM];
        int pr_header=0;
        int usertime=1;
+       const EVP_CIPHER *evp=NULL;
+       int decrypt=0;
 
 #ifndef TIMES
        usertime=-1;
@@ -427,7 +444,7 @@ int MAIN(int argc, char **argv)
 
        apps_startup();
        memset(results, 0, sizeof(results));
-#ifndef NO_DSA
+#ifndef OPENSSL_NO_DSA
        memset(dsa_key,0,sizeof(dsa_key));
 #endif
 
@@ -435,7 +452,7 @@ int MAIN(int argc, char **argv)
                if ((bio_err=BIO_new(BIO_s_file())) != NULL)
                        BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
 
-#ifndef NO_RSA
+#ifndef OPENSSL_NO_RSA
        memset(rsa_key,0,sizeof(rsa_key));
        for (i=0; i<RSA_NUM; i++)
                rsa_key[i]=NULL;
@@ -446,7 +463,7 @@ int MAIN(int argc, char **argv)
                BIO_printf(bio_err,"out of memory\n");
                goto end;
                }
-#ifndef NO_DES
+#ifndef OPENSSL_NO_DES
        buf_as_des_cblock = (des_cblock *)buf;
 #endif
        if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
@@ -471,65 +488,78 @@ int MAIN(int argc, char **argv)
        while (argc)
                {
                if      ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
+                       {
                        usertime = 0;
-               else
-               if      ((argc > 0) && (strcmp(*argv,"-engine") == 0))
+                       j--;    /* Otherwise, -elapsed gets confused with
+                                  an algorithm. */
+                       }
+               else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
                        {
                        argc--;
                        argv++;
                        if(argc == 0)
                                {
-                               BIO_printf(bio_err,"no engine given\n");
+                               BIO_printf(bio_err,"no EVP given\n");
                                goto end;
                                }
-                       if((e = ENGINE_by_id(*argv)) == NULL)
+                       evp=EVP_get_cipherbyname(*argv);
+                       if(!evp)
                                {
-                               BIO_printf(bio_err,"invalid engine \"%s\"\n",
-                                       *argv);
+                               BIO_printf(bio_err,"%s is an unknown cipher\n",*argv);
                                goto end;
                                }
-                       if(!ENGINE_set_default(e, ENGINE_METHOD_ALL))
+                       doit[D_EVP]=1;
+                       }
+               else if (argc > 0 && !strcmp(*argv,"-decrypt"))
+                       {
+                       decrypt=1;
+                       j--;    /* Otherwise, -elapsed gets confused with
+                                  an algorithm. */
+                       }
+               else if ((argc > 0) && (strcmp(*argv,"-engine") == 0))
+                       {
+                       argc--;
+                       argv++;
+                       if(argc == 0)
                                {
-                               BIO_printf(bio_err,"can't use that engine\n");
+                               BIO_printf(bio_err,"no engine given\n");
                                goto end;
                                }
-                       BIO_printf(bio_err,"engine \"%s\" set.\n", *argv);
-                       /* Free our "structural" reference. */
-                       ENGINE_free(e);
-                       /* It will be increased again further down.  We just
+                        e = setup_engine(bio_err, *argv, 0);
+                       /* j will be increased again further down.  We just
                           don't want speed to confuse an engine with an
                           algorithm, especially when none is given (which
                           means all of them should be run) */
                        j--;
                        }
                else
-#ifndef NO_MD2
+#ifndef OPENSSL_NO_MD2
                if      (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
                else
 #endif
-#ifndef NO_MDC2
+#ifndef OPENSSL_NO_MDC2
                        if (strcmp(*argv,"mdc2") == 0) doit[D_MDC2]=1;
                else
 #endif
-#ifndef NO_MD4
+#ifndef OPENSSL_NO_MD4
                        if (strcmp(*argv,"md4") == 0) doit[D_MD4]=1;
                else
 #endif
-#ifndef NO_MD5
+#ifndef OPENSSL_NO_MD5
                        if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
                else
 #endif
-#ifndef NO_MD5
+#ifndef OPENSSL_NO_MD5
                        if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
                else
 #endif
-#ifndef NO_SHA
+#ifndef OPENSSL_NO_SHA
                        if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
                else
                        if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
                else
 #endif
-#ifndef NO_RIPEMD
+#ifndef OPENSSL_NO_RIPEMD
                        if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
                else
                        if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
@@ -537,16 +567,16 @@ int MAIN(int argc, char **argv)
                        if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
                else
 #endif
-#ifndef NO_RC4
+#ifndef OPENSSL_NO_RC4
                        if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
                else 
 #endif
-#ifndef NO_DES
+#ifndef OPENSSL_NO_DES
                        if (strcmp(*argv,"des-cbc") == 0) doit[D_CBC_DES]=1;
                else    if (strcmp(*argv,"des-ede3") == 0) doit[D_EDE3_DES]=1;
                else
 #endif
-#ifndef NO_RSA
+#ifndef OPENSSL_NO_RSA
 #if 0 /* was: #ifdef RSAref */
                        if (strcmp(*argv,"rsaref") == 0) 
                        {
@@ -558,12 +588,12 @@ int MAIN(int argc, char **argv)
 #ifndef RSA_NULL
                        if (strcmp(*argv,"openssl") == 0) 
                        {
-                       RSA_set_default_openssl_method(RSA_PKCS1_SSLeay());
+                       RSA_set_default_method(RSA_PKCS1_SSLeay());
                        j--;
                        }
                else
 #endif
-#endif /* !NO_RSA */
+#endif /* !OPENSSL_NO_RSA */
                     if (strcmp(*argv,"dsa512") == 0) dsa_doit[R_DSA_512]=2;
                else if (strcmp(*argv,"dsa1024") == 0) dsa_doit[R_DSA_1024]=2;
                else if (strcmp(*argv,"dsa2048") == 0) dsa_doit[R_DSA_2048]=2;
@@ -572,34 +602,34 @@ int MAIN(int argc, char **argv)
                else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
                else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
                else
-#ifndef NO_RC2
+#ifndef OPENSSL_NO_RC2
                     if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
                else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
                else
 #endif
-#ifndef NO_RC5
+#ifndef OPENSSL_NO_RC5
                     if (strcmp(*argv,"rc5-cbc") == 0) doit[D_CBC_RC5]=1;
                else if (strcmp(*argv,"rc5") == 0) doit[D_CBC_RC5]=1;
                else
 #endif
-#ifndef NO_IDEA
+#ifndef OPENSSL_NO_IDEA
                     if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
                else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
                else
 #endif
-#ifndef NO_BF
+#ifndef OPENSSL_NO_BF
                     if (strcmp(*argv,"bf-cbc") == 0) doit[D_CBC_BF]=1;
                else if (strcmp(*argv,"blowfish") == 0) doit[D_CBC_BF]=1;
                else if (strcmp(*argv,"bf") == 0) doit[D_CBC_BF]=1;
                else
 #endif
-#ifndef NO_CAST
+#ifndef OPENSSL_NO_CAST
                     if (strcmp(*argv,"cast-cbc") == 0) doit[D_CBC_CAST]=1;
                else if (strcmp(*argv,"cast") == 0) doit[D_CBC_CAST]=1;
                else if (strcmp(*argv,"cast5") == 0) doit[D_CBC_CAST]=1;
                else
 #endif
-#ifndef NO_DES
+#ifndef OPENSSL_NO_DES
                        if (strcmp(*argv,"des") == 0)
                        {
                        doit[D_CBC_DES]=1;
@@ -607,7 +637,7 @@ int MAIN(int argc, char **argv)
                        }
                else
 #endif
-#ifndef NO_RSA
+#ifndef OPENSSL_NO_RSA
                        if (strcmp(*argv,"rsa") == 0)
                        {
                        rsa_doit[R_RSA_512]=1;
@@ -617,7 +647,7 @@ int MAIN(int argc, char **argv)
                        }
                else
 #endif
-#ifndef NO_DSA
+#ifndef OPENSSL_NO_DSA
                        if (strcmp(*argv,"dsa") == 0)
                        {
                        dsa_doit[R_DSA_512]=1;
@@ -629,77 +659,82 @@ int MAIN(int argc, char **argv)
                        BIO_printf(bio_err,"Error: bad option or value\n");
                        BIO_printf(bio_err,"\n");
                        BIO_printf(bio_err,"Available values:\n");
-#ifndef NO_MD2
+#ifndef OPENSSL_NO_MD2
                        BIO_printf(bio_err,"md2      ");
 #endif
-#ifndef NO_MDC2
+#ifndef OPENSSL_NO_MDC2
                        BIO_printf(bio_err,"mdc2     ");
 #endif
-#ifndef NO_MD4
+#ifndef OPENSSL_NO_MD4
                        BIO_printf(bio_err,"md4      ");
 #endif
-#ifndef NO_MD5
+#ifndef OPENSSL_NO_MD5
                        BIO_printf(bio_err,"md5      ");
-#ifndef NO_HMAC
+#ifndef OPENSSL_NO_HMAC
                        BIO_printf(bio_err,"hmac     ");
 #endif
 #endif
-#ifndef NO_SHA1
+#ifndef OPENSSL_NO_SHA1
                        BIO_printf(bio_err,"sha1     ");
 #endif
-#ifndef NO_RIPEMD160
+#ifndef OPENSSL_NO_RIPEMD160
                        BIO_printf(bio_err,"rmd160");
 #endif
-#if !defined(NO_MD2) || !defined(NO_MDC2) || !defined(NO_MD4) || !defined(NO_MD5) || !defined(NO_SHA1) || !defined(NO_RIPEMD160)
+#if !defined(OPENSSL_NO_MD2) || !defined(OPENSSL_NO_MDC2) || \
+    !defined(OPENSSL_NO_MD4) || !defined(OPENSSL_NO_MD5) || \
+    !defined(OPENSSL_NO_SHA1) || !defined(OPENSSL_NO_RIPEMD160)
                        BIO_printf(bio_err,"\n");
 #endif
 
-#ifndef NO_IDEA
+#ifndef OPENSSL_NO_IDEA
                        BIO_printf(bio_err,"idea-cbc ");
 #endif
-#ifndef NO_RC2
+#ifndef OPENSSL_NO_RC2
                        BIO_printf(bio_err,"rc2-cbc  ");
 #endif
-#ifndef NO_RC5
+#ifndef OPENSSL_NO_RC5
                        BIO_printf(bio_err,"rc5-cbc  ");
 #endif
-#ifndef NO_BF
+#ifndef OPENSSL_NO_BF
                        BIO_printf(bio_err,"bf-cbc");
 #endif
-#if !defined(NO_IDEA) || !defined(NO_RC2) || !defined(NO_BF) || !defined(NO_RC5)
+#if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
+    !defined(OPENSSL_NO_BF) || !defined(OPENSSL_NO_RC5)
                        BIO_printf(bio_err,"\n");
 #endif
 
                        BIO_printf(bio_err,"des-cbc  des-ede3 ");
-#ifndef NO_RC4
+#ifndef OPENSSL_NO_RC4
                        BIO_printf(bio_err,"rc4");
 #endif
                        BIO_printf(bio_err,"\n");
 
-#ifndef NO_RSA
+#ifndef OPENSSL_NO_RSA
                        BIO_printf(bio_err,"rsa512   rsa1024  rsa2048  rsa4096\n");
 #endif
 
-#ifndef NO_DSA
+#ifndef OPENSSL_NO_DSA
                        BIO_printf(bio_err,"dsa512   dsa1024  dsa2048\n");
 #endif
 
-#ifndef NO_IDEA
+#ifndef OPENSSL_NO_IDEA
                        BIO_printf(bio_err,"idea     ");
 #endif
-#ifndef NO_RC2
+#ifndef OPENSSL_NO_RC2
                        BIO_printf(bio_err,"rc2      ");
 #endif
-#ifndef NO_DES
+#ifndef OPENSSL_NO_DES
                        BIO_printf(bio_err,"des      ");
 #endif
-#ifndef NO_RSA
+#ifndef OPENSSL_NO_RSA
                        BIO_printf(bio_err,"rsa      ");
 #endif
-#ifndef NO_BF
+#ifndef OPENSSL_NO_BF
                        BIO_printf(bio_err,"blowfish");
 #endif
-#if !defined(NO_IDEA) || !defined(NO_RC2) || !defined(NO_DES) || !defined(NO_RSA) || !defined(NO_BF)
+#if !defined(OPENSSL_NO_IDEA) || !defined(OPENSSL_NO_RC2) || \
+    !defined(OPENSSL_NO_DES) || !defined(OPENSSL_NO_RSA) || \
+    !defined(OPENSSL_NO_BF)
                        BIO_printf(bio_err,"\n");
 #endif
 
@@ -719,7 +754,10 @@ int MAIN(int argc, char **argv)
        if (j == 0)
                {
                for (i=0; i<ALGOR_NUM; i++)
-                       doit[i]=1;
+                       {
+                       if (i != D_EVP)
+                               doit[i]=1;
+                       }
                for (i=0; i<RSA_NUM; i++)
                        rsa_doit[i]=1;
                for (i=0; i<DSA_NUM; i++)
@@ -736,7 +774,7 @@ int MAIN(int argc, char **argv)
                BIO_printf(bio_err,"program when this computer is idle.\n");
                }
 
-#ifndef NO_RSA
+#ifndef OPENSSL_NO_RSA
        for (i=0; i<RSA_NUM; i++)
                {
                const unsigned char *p;
@@ -759,40 +797,40 @@ int MAIN(int argc, char **argv)
                }
 #endif
 
-#ifndef NO_DSA
+#ifndef OPENSSL_NO_DSA
        dsa_key[0]=get_dsa512();
        dsa_key[1]=get_dsa1024();
        dsa_key[2]=get_dsa2048();
 #endif
 
-#ifndef NO_DES
-       des_set_key_unchecked(&key,sch);
-       des_set_key_unchecked(&key2,sch2);
-       des_set_key_unchecked(&key3,sch3);
+#ifndef OPENSSL_NO_DES
+       des_set_key_unchecked(&key,&sch);
+       des_set_key_unchecked(&key2,&sch2);
+       des_set_key_unchecked(&key3,&sch3);
 #endif
-#ifndef NO_IDEA
+#ifndef OPENSSL_NO_IDEA
        idea_set_encrypt_key(key16,&idea_ks);
 #endif
-#ifndef NO_RC4
+#ifndef OPENSSL_NO_RC4
        RC4_set_key(&rc4_ks,16,key16);
 #endif
-#ifndef NO_RC2
+#ifndef OPENSSL_NO_RC2
        RC2_set_key(&rc2_ks,16,key16,128);
 #endif
-#ifndef NO_RC5
+#ifndef OPENSSL_NO_RC5
        RC5_32_set_key(&rc5_ks,16,key16,12);
 #endif
-#ifndef NO_BF
+#ifndef OPENSSL_NO_BF
        BF_set_key(&bf_ks,16,key16);
 #endif
-#ifndef NO_CAST
+#ifndef OPENSSL_NO_CAST
        CAST_set_key(&cast_ks,16,key16);
 #endif
-#ifndef NO_RSA
+#ifndef OPENSSL_NO_RSA
        memset(rsa_c,0,sizeof(rsa_c));
 #endif
 #ifndef SIGALRM
-#ifndef NO_DES
+#ifndef OPENSSL_NO_DES
        BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
        count=10;
        do      {
@@ -801,9 +839,10 @@ int MAIN(int argc, char **argv)
                Time_F(START,usertime);
                for (i=count; i; i--)
                        des_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
-                               &(sch[0]),DES_ENCRYPT);
+                               &sch,DES_ENCRYPT);
                d=Time_F(STOP,usertime);
                } while (d <3);
+       save_count=count;
        c[D_MD2][0]=count/10;
        c[D_MDC2][0]=count/10;
        c[D_MD4][0]=count;
@@ -845,7 +884,7 @@ int MAIN(int argc, char **argv)
                c[D_CBC_BF][i]=c[D_CBC_BF][i-1]*l0/l1;
                c[D_CBC_CAST][i]=c[D_CBC_CAST][i-1]*l0/l1;
                }
-#ifndef NO_RSA
+#ifndef OPENSSL_NO_RSA
        rsa_c[R_RSA_512][0]=count/2000;
        rsa_c[R_RSA_512][1]=count/400;
        for (i=1; i<RSA_NUM; i++)
@@ -865,6 +904,7 @@ int MAIN(int argc, char **argv)
                }
 #endif
 
+#ifndef OPENSSL_NO_DSA
        dsa_c[R_DSA_512][0]=count/1000;
        dsa_c[R_DSA_512][1]=count/1000/2;
        for (i=1; i<DSA_NUM; i++)
@@ -882,20 +922,21 @@ int MAIN(int argc, char **argv)
                                }
                        }                               
                }
+#endif
 
 #define COND(d)        (count < (d))
 #define COUNT(d) (d)
 #else
 /* not worth fixing */
 # error "You cannot disable DES on systems without SIGALRM."
-#endif /* NO_DES */
+#endif /* OPENSSL_NO_DES */
 #else
 #define COND(c)        (run)
 #define COUNT(d) (count)
        signal(SIGALRM,sig_done);
 #endif /* SIGALRM */
 
-#ifndef NO_MD2
+#ifndef OPENSSL_NO_MD2
        if (doit[D_MD2])
                {
                for (j=0; j<SIZE_NUM; j++)
@@ -903,7 +944,7 @@ int MAIN(int argc, char **argv)
                        print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
                        Time_F(START,usertime);
                        for (count=0,run=1; COND(c[D_MD2][j]); count++)
-                               MD2(buf,(unsigned long)lengths[j],&(md2[0]));
+                               EVP_Digest(buf,(unsigned long)lengths[j],&(md2[0]),NULL,EVP_md2());
                        d=Time_F(STOP,usertime);
                        BIO_printf(bio_err,"%ld %s's in %.2fs\n",
                                count,names[D_MD2],d);
@@ -911,7 +952,7 @@ int MAIN(int argc, char **argv)
                        }
                }
 #endif
-#ifndef NO_MDC2
+#ifndef OPENSSL_NO_MDC2
        if (doit[D_MDC2])
                {
                for (j=0; j<SIZE_NUM; j++)
@@ -919,7 +960,7 @@ int MAIN(int argc, char **argv)
                        print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
                        Time_F(START,usertime);
                        for (count=0,run=1; COND(c[D_MDC2][j]); count++)
-                               MDC2(buf,(unsigned long)lengths[j],&(mdc2[0]));
+                               EVP_Digest(buf,(unsigned long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2());
                        d=Time_F(STOP,usertime);
                        BIO_printf(bio_err,"%ld %s's in %.2fs\n",
                                count,names[D_MDC2],d);
@@ -928,7 +969,7 @@ int MAIN(int argc, char **argv)
                }
 #endif
 
-#ifndef NO_MD4
+#ifndef OPENSSL_NO_MD4
        if (doit[D_MD4])
                {
                for (j=0; j<SIZE_NUM; j++)
@@ -936,7 +977,7 @@ int MAIN(int argc, char **argv)
                        print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
                        Time_F(START,usertime);
                        for (count=0,run=1; COND(c[D_MD4][j]); count++)
-                               MD4(&(buf[0]),(unsigned long)lengths[j],&(md4[0]));
+                               EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md4[0]),NULL,EVP_md4());
                        d=Time_F(STOP,usertime);
                        BIO_printf(bio_err,"%ld %s's in %.2fs\n",
                                count,names[D_MD4],d);
@@ -945,7 +986,7 @@ int MAIN(int argc, char **argv)
                }
 #endif
 
-#ifndef NO_MD5
+#ifndef OPENSSL_NO_MD5
        if (doit[D_MD5])
                {
                for (j=0; j<SIZE_NUM; j++)
@@ -953,7 +994,7 @@ int MAIN(int argc, char **argv)
                        print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
                        Time_F(START,usertime);
                        for (count=0,run=1; COND(c[D_MD5][j]); count++)
-                               MD5(&(buf[0]),(unsigned long)lengths[j],&(md5[0]));
+                               EVP_Digest(&(buf[0]),(unsigned long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"));
                        d=Time_F(STOP,usertime);
                        BIO_printf(bio_err,"%ld %s's in %.2fs\n",
                                count,names[D_MD5],d);
@@ -962,10 +1003,12 @@ int MAIN(int argc, char **argv)
                }
 #endif
 
-#if !defined(NO_MD5) && !defined(NO_HMAC)
+#if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
        if (doit[D_HMAC])
                {
                HMAC_CTX hctx;
+
+               HMAC_CTX_init(&hctx);
                HMAC_Init(&hctx,(unsigned char *)"This is a key...",
                        16,EVP_md5());
 
@@ -984,9 +1027,10 @@ int MAIN(int argc, char **argv)
                                count,names[D_HMAC],d);
                        results[D_HMAC][j]=((double)count)/d*lengths[j];
                        }
+               HMAC_CTX_cleanup(&hctx);
                }
 #endif
-#ifndef NO_SHA
+#ifndef OPENSSL_NO_SHA
        if (doit[D_SHA1])
                {
                for (j=0; j<SIZE_NUM; j++)
@@ -994,7 +1038,7 @@ int MAIN(int argc, char **argv)
                        print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
                        Time_F(START,usertime);
                        for (count=0,run=1; COND(c[D_SHA1][j]); count++)
-                               SHA1(buf,(unsigned long)lengths[j],&(sha[0]));
+                               EVP_Digest(buf,(unsigned long)lengths[j],&(sha[0]),NULL,EVP_sha1());
                        d=Time_F(STOP,usertime);
                        BIO_printf(bio_err,"%ld %s's in %.2fs\n",
                                count,names[D_SHA1],d);
@@ -1002,7 +1046,7 @@ int MAIN(int argc, char **argv)
                        }
                }
 #endif
-#ifndef NO_RIPEMD
+#ifndef OPENSSL_NO_RIPEMD
        if (doit[D_RMD160])
                {
                for (j=0; j<SIZE_NUM; j++)
@@ -1010,7 +1054,7 @@ int MAIN(int argc, char **argv)
                        print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
                        Time_F(START,usertime);
                        for (count=0,run=1; COND(c[D_RMD160][j]); count++)
-                               RIPEMD160(buf,(unsigned long)lengths[j],&(rmd160[0]));
+                               EVP_Digest(buf,(unsigned long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160());
                        d=Time_F(STOP,usertime);
                        BIO_printf(bio_err,"%ld %s's in %.2fs\n",
                                count,names[D_RMD160],d);
@@ -1018,7 +1062,7 @@ int MAIN(int argc, char **argv)
                        }
                }
 #endif
-#ifndef NO_RC4
+#ifndef OPENSSL_NO_RC4
        if (doit[D_RC4])
                {
                for (j=0; j<SIZE_NUM; j++)
@@ -1035,7 +1079,7 @@ int MAIN(int argc, char **argv)
                        }
                }
 #endif
-#ifndef NO_DES
+#ifndef OPENSSL_NO_DES
        if (doit[D_CBC_DES])
                {
                for (j=0; j<SIZE_NUM; j++)
@@ -1043,11 +1087,11 @@ int MAIN(int argc, char **argv)
                        print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
                        Time_F(START,usertime);
                        for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
-                               des_ncbc_encrypt(buf,buf,lengths[j],sch,
+                               des_ncbc_encrypt(buf,buf,lengths[j],&sch,
                                                 &iv,DES_ENCRYPT);
                        d=Time_F(STOP,usertime);
                        BIO_printf(bio_err,"%ld %s's in %.2fs\n",
-                               count,names[D_CBC_DES],d);
+                                  count,names[D_CBC_DES],d);
                        results[D_CBC_DES][j]=((double)count)/d*lengths[j];
                        }
                }
@@ -1060,7 +1104,7 @@ int MAIN(int argc, char **argv)
                        Time_F(START,usertime);
                        for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
                                des_ede3_cbc_encrypt(buf,buf,lengths[j],
-                                                    sch,sch2,sch3,
+                                                    &sch,&sch2,&sch3,
                                                     &iv,DES_ENCRYPT);
                        d=Time_F(STOP,usertime);
                        BIO_printf(bio_err,"%ld %s's in %.2fs\n",
@@ -1069,7 +1113,7 @@ int MAIN(int argc, char **argv)
                        }
                }
 #endif
-#ifndef NO_IDEA
+#ifndef OPENSSL_NO_IDEA
        if (doit[D_CBC_IDEA])
                {
                for (j=0; j<SIZE_NUM; j++)
@@ -1087,7 +1131,7 @@ int MAIN(int argc, char **argv)
                        }
                }
 #endif
-#ifndef NO_RC2
+#ifndef OPENSSL_NO_RC2
        if (doit[D_CBC_RC2])
                {
                for (j=0; j<SIZE_NUM; j++)
@@ -1105,7 +1149,7 @@ int MAIN(int argc, char **argv)
                        }
                }
 #endif
-#ifndef NO_RC5
+#ifndef OPENSSL_NO_RC5
        if (doit[D_CBC_RC5])
                {
                for (j=0; j<SIZE_NUM; j++)
@@ -1123,7 +1167,7 @@ int MAIN(int argc, char **argv)
                        }
                }
 #endif
-#ifndef NO_BF
+#ifndef OPENSSL_NO_BF
        if (doit[D_CBC_BF])
                {
                for (j=0; j<SIZE_NUM; j++)
@@ -1141,7 +1185,7 @@ int MAIN(int argc, char **argv)
                        }
                }
 #endif
-#ifndef NO_CAST
+#ifndef OPENSSL_NO_CAST
        if (doit[D_CBC_CAST])
                {
                for (j=0; j<SIZE_NUM; j++)
@@ -1160,8 +1204,41 @@ int MAIN(int argc, char **argv)
                }
 #endif
 
+       if (doit[D_EVP])
+               {
+               for (j=0; j<SIZE_NUM; j++)
+                       {
+                       EVP_CIPHER_CTX ctx;
+                       int outl;
+
+                       names[D_EVP]=OBJ_nid2ln(evp->nid);
+                       print_message(names[D_EVP],save_count,
+                                                 lengths[j]);
+                       if(decrypt)
+                               EVP_DecryptInit(&ctx,evp,key16,iv);
+                       else
+                               EVP_EncryptInit(&ctx,evp,key16,iv);
+                               
+                       Time_F(START,usertime);
+                       if(decrypt)
+                               for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
+                                       EVP_DecryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
+                       else
+                               for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
+                                       EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
+                       if(decrypt)
+                               EVP_DecryptFinal(&ctx,buf,&outl);
+                       else
+                               EVP_EncryptFinal(&ctx,buf,&outl);
+                       d=Time_F(STOP,usertime);
+                       BIO_printf(bio_err,"%ld %s's in %.2fs\n",
+                                          count,names[D_EVP],d);
+                       results[D_EVP][j]=((double)count)/d*lengths[j];
+                       }
+               }
+
        RAND_pseudo_bytes(buf,36);
-#ifndef NO_RSA
+#ifndef OPENSSL_NO_RSA
        for (j=0; j<RSA_NUM; j++)
                {
                int ret;
@@ -1207,7 +1284,7 @@ int MAIN(int argc, char **argv)
                        {
                        BIO_printf(bio_err,"RSA verify failure.  No RSA verify will be done.\n");
                        ERR_print_errors(bio_err);
-                       dsa_doit[j] = 0;
+                       rsa_doit[j] = 0;
                        }
                else
                        {
@@ -1246,7 +1323,7 @@ int MAIN(int argc, char **argv)
 #endif
 
        RAND_pseudo_bytes(buf,20);
-#ifndef NO_DSA
+#ifndef OPENSSL_NO_DSA
        if (RAND_status() != 1)
                {
                RAND_seed(rnd_seed, sizeof rnd_seed);
@@ -1258,7 +1335,7 @@ int MAIN(int argc, char **argv)
                int ret;
 
                if (!dsa_doit[j]) continue;
-               DSA_generate_key(dsa_key[j]);
+/*             DSA_generate_key(dsa_key[j]); */
 /*             DSA_sign_setup(dsa_key[j],NULL); */
                ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
                        &kk,dsa_key[j]);
@@ -1341,22 +1418,49 @@ int MAIN(int argc, char **argv)
         fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_BUILT_ON));
        printf("options:");
        printf("%s ",BN_options());
-#ifndef NO_MD2
+#ifndef OPENSSL_NO_MD2
        printf("%s ",MD2_options());
 #endif
-#ifndef NO_RC4
+#ifndef OPENSSL_NO_RC4
        printf("%s ",RC4_options());
 #endif
-#ifndef NO_DES
+#ifndef OPENSSL_NO_DES
        printf("%s ",des_options());
 #endif
-#ifndef NO_IDEA
+#ifndef OPENSSL_NO_IDEA
        printf("%s ",idea_options());
 #endif
-#ifndef NO_BF
+#ifndef OPENSSL_NO_BF
        printf("%s ",BF_options());
 #endif
        fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
+       printf("available timing options: ");
+#ifdef TIMES
+       printf("TIMES ");
+#endif
+#ifdef TIMEB
+       printf("TIMEB ");
+#endif
+#ifdef USE_TOD
+       printf("USE_TOD ");
+#endif
+#ifdef HZ
+#define as_string(s) (#s)
+       printf("HZ=%g", HZ);
+# ifdef _SC_CLK_TCK
+       printf(" [sysconf value]");
+# endif
+#endif
+       printf("\n");
+       printf("timing function used: %s%s%s%s%s%s%s\n",
+               (ftime_used ? "ftime" : ""),
+               (ftime_used + times_used > 1 ? "," : ""),
+               (times_used ? "times" : ""),
+               (ftime_used + times_used + gettimeofday_used > 1 ? "," : ""),
+               (gettimeofday_used ? "gettimeofday" : ""),
+               (ftime_used + times_used + gettimeofday_used + getrusage_used > 1 ? "," : ""),
+               (getrusage_used ? "getrusage" : ""));
+
 
        if (pr_header)
                {
@@ -1380,7 +1484,7 @@ int MAIN(int argc, char **argv)
                        }
                fprintf(stdout,"\n");
                }
-#ifndef NO_RSA
+#ifndef OPENSSL_NO_RSA
        j=1;
        for (k=0; k<RSA_NUM; k++)
                {
@@ -1396,7 +1500,7 @@ int MAIN(int argc, char **argv)
                fprintf(stdout,"\n");
                }
 #endif
-#ifndef NO_DSA
+#ifndef OPENSSL_NO_DSA
        j=1;
        for (k=0; k<DSA_NUM; k++)
                {
@@ -1416,20 +1520,21 @@ end:
        ERR_print_errors(bio_err);
        if (buf != NULL) OPENSSL_free(buf);
        if (buf2 != NULL) OPENSSL_free(buf2);
-#ifndef NO_RSA
+#ifndef OPENSSL_NO_RSA
        for (i=0; i<RSA_NUM; i++)
                if (rsa_key[i] != NULL)
                        RSA_free(rsa_key[i]);
 #endif
-#ifndef NO_DSA
+#ifndef OPENSSL_NO_DSA
        for (i=0; i<DSA_NUM; i++)
                if (dsa_key[i] != NULL)
                        DSA_free(dsa_key[i]);
 #endif
+       apps_shutdown();
        EXIT(mret);
        }
 
-static void print_message(char *s, long num, int length)
+static void print_message(const char *s, long num, int length)
        {
 #ifdef SIGALRM
        BIO_printf(bio_err,"Doing %s for %ds on %d size blocks: ",s,SECONDS,length);