Give the user the option to measure real time instead of user CPU time.
[openssl.git] / apps / speed.c
index d6ee53e9fe5cb266d10344e12e4202522ee699a0..7166606da7c8a32574889b39d1484aa6851870ee 100644 (file)
 #include <openssl/rand.h>
 #include <openssl/err.h>
 
-#ifndef MSDOS
+#if !defined(MSDOS) && (!defined(VMS) || defined(__DECC))
 #define TIMES
 #endif
 
-#ifndef VMS
 #ifndef _IRIX
 #include <time.h>
 #endif
 #include <sys/types.h>
 #include <sys/times.h>
 #endif
-#else /* VMS */
-#include <types.h>
-struct tms {
-       time_t tms_utime;
-       time_t tms_stime;
-       time_t tms_uchild;      /* I dunno...  */
-       time_t tms_uchildsys;   /* so these names are a guess :-) */
-       }
+
+/* Depending on the VMS version, the tms structure is perhaps defined.
+   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)
+#undef TIMES
 #endif
-#ifndef TIMES
+
 #include <sys/timeb.h>
-#endif
 
 #if defined(sun) || defined(__ultrix)
 #define _POSIX_SOURCE
@@ -124,13 +121,15 @@ struct tms {
 #endif
 #ifndef NO_MD5
 #include <openssl/md5.h>
+#endif
+#ifndef NO_HMAC
 #include <openssl/hmac.h>
-#include <openssl/evp.h>
 #endif
-#ifndef NO_SHA1
+#include <openssl/evp.h>
+#ifndef NO_SHA
 #include <openssl/sha.h>
 #endif
-#ifndef NO_RMD160
+#ifndef NO_RIPEMD
 #include <openssl/ripemd.h>
 #endif
 #ifndef NO_RC4
@@ -145,7 +144,7 @@ struct tms {
 #ifndef NO_IDEA
 #include <openssl/idea.h>
 #endif
-#ifndef NO_BLOWFISH
+#ifndef NO_BF
 #include <openssl/blowfish.h>
 #endif
 #ifndef NO_CAST
@@ -153,9 +152,9 @@ struct tms {
 #endif
 #ifndef NO_RSA
 #include <openssl/rsa.h>
+#include "./testrsa.h"
 #endif
 #include <openssl/x509.h>
-#include "./testrsa.h"
 #ifndef NO_DSA
 #include "./testdsa.h"
 #endif
@@ -164,11 +163,7 @@ struct tms {
 #ifndef HZ
 # ifndef CLK_TCK
 #  ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
-#   ifndef VMS
-#    define HZ 100.0
-#   else /* VMS */
-#    define HZ 100.0
-#   endif
+#   define HZ  100.0
 #  else /* _BSD_CLK_TCK_ */
 #   define HZ ((double)_BSD_CLK_TCK_)
 #  endif
@@ -181,16 +176,9 @@ struct tms {
 #define BUFSIZE        ((long)1024*8+1)
 int run=0;
 
-#ifndef NOPROTO
-static double Time_F(int s);
+static double Time_F(int s, int usertime);
 static void print_message(char *s,long num,int length);
 static void pkey_print_message(char *str,char *str2,long num,int bits,int sec);
-#else
-static double Time_F();
-static void print_message();
-static void pkey_print_message();
-#endif
-
 #ifdef SIGALRM
 #if defined(__STDC__) || defined(sgi) || defined(_AIX)
 #define SIGRETTYPE void
@@ -198,12 +186,7 @@ static void pkey_print_message();
 #define SIGRETTYPE int
 #endif 
 
-#ifndef NOPROTO
 static SIGRETTYPE sig_done(int sig);
-#else
-static SIGRETTYPE sig_done();
-#endif
-
 static SIGRETTYPE sig_done(int sig)
        {
        signal(SIGALRM,sig_done);
@@ -217,52 +200,60 @@ static SIGRETTYPE sig_done(int sig)
 #define START  0
 #define STOP   1
 
-static double Time_F(int s)
+static double Time_F(int s, int usertime)
        {
        double ret;
 #ifdef TIMES
-       static struct tms tstart,tend;
-
-       if (s == START)
-               {
-               times(&tstart);
-               return(0);
-               }
-       else
+       if (usertime)
                {
-               times(&tend);
-               ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
-               return((ret < 1e-3)?1e-3:ret);
-               }
-#else /* !times() */
-       static struct timeb tstart,tend;
-       long i;
+               static struct tms tstart,tend;
 
-       if (s == START)
-               {
-               ftime(&tstart);
-               return(0);
+               if (s == START)
+                       {
+                       times(&tstart);
+                       return(0);
+                       }
+               else
+                       {
+                       times(&tend);
+                       ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
+                       return((ret < 1e-3)?1e-3:ret);
+                       }
                }
        else
+#endif /* times() */
                {
-               ftime(&tend);
-               i=(long)tend.millitm-(long)tstart.millitm;
-               ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
-               return((ret < 0.001)?0.001:ret);
+               static struct timeb tstart,tend;
+               long i;
+
+               if (s == START)
+                       {
+                       ftime(&tstart);
+                       return(0);
+                       }
+               else
+                       {
+                       ftime(&tend);
+                       i=(long)tend.millitm-(long)tstart.millitm;
+                       ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
+                       return((ret < 0.001)?0.001:ret);
+                       }
                }
-#endif
        }
 
+int MAIN(int, char **);
+
 int MAIN(int argc, char **argv)
        {
        unsigned char *buf=NULL,*buf2=NULL;
-       int ret=1;
+       int mret=1;
 #define ALGOR_NUM      14
 #define SIZE_NUM       5
 #define RSA_NUM                4
 #define DSA_NUM                3
        long count,rsa_count;
-       int i,j,k,rsa_num,rsa_num2;
+       int i,j,k;
+       unsigned rsa_num,rsa_num2;
 #ifndef NO_MD2
        unsigned char md2[MD2_DIGEST_LENGTH];
 #endif
@@ -273,10 +264,10 @@ int MAIN(int argc, char **argv)
        unsigned char md5[MD5_DIGEST_LENGTH];
        unsigned char hmac[MD5_DIGEST_LENGTH];
 #endif
-#ifndef NO_SHA1
+#ifndef NO_SHA
        unsigned char sha[SHA_DIGEST_LENGTH];
 #endif
-#ifndef NO_RMD160
+#ifndef NO_RIPEMD
        unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
 #endif
 #ifndef NO_RC4
@@ -291,7 +282,7 @@ int MAIN(int argc, char **argv)
 #ifndef NO_IDEA
        IDEA_KEY_SCHEDULE idea_ks;
 #endif
-#ifndef NO_BLOWFISH
+#ifndef NO_BF
        BF_KEY bf_ks;
 #endif
 #ifndef NO_CAST
@@ -302,6 +293,7 @@ int MAIN(int argc, char **argv)
                 0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12};
        unsigned char iv[8];
 #ifndef 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};
        static des_cblock key3={0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34};
@@ -335,9 +327,9 @@ int MAIN(int argc, char **argv)
 #define        R_RSA_1024      1
 #define        R_RSA_2048      2
 #define        R_RSA_4096      3
+#ifndef NO_RSA
        RSA *rsa_key[RSA_NUM];
        long rsa_c[RSA_NUM][2];
-#ifndef NO_RSA
        double rsa_results[RSA_NUM][2];
        static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
        static unsigned char *rsa_data[RSA_NUM]=
@@ -356,9 +348,15 @@ int MAIN(int argc, char **argv)
        int dsa_doit[DSA_NUM];
        int doit[ALGOR_NUM];
        int pr_header=0;
+       int usertime=1;
+
+#ifndef TIMES
+       usertime=-1;
+#endif
 
        apps_startup();
-#ifdef NO_DSA
+       memset(results, 0, sizeof(results));
+#ifndef NO_DSA
        memset(dsa_key,0,sizeof(dsa_key));
 #endif
 
@@ -372,12 +370,15 @@ int MAIN(int argc, char **argv)
                rsa_key[i]=NULL;
 #endif
 
-       if ((buf=(unsigned char *)Malloc((int)BUFSIZE)) == NULL)
+       if ((buf=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
                {
                BIO_printf(bio_err,"out of memory\n");
                goto end;
                }
-       if ((buf2=(unsigned char *)Malloc((int)BUFSIZE)) == NULL)
+#ifndef NO_DES
+       buf_as_des_cblock = (des_cblock *)buf;
+#endif
+       if ((buf2=(unsigned char *)OPENSSL_malloc((int)BUFSIZE)) == NULL)
                {
                BIO_printf(bio_err,"out of memory\n");
                goto end;
@@ -398,6 +399,8 @@ int MAIN(int argc, char **argv)
        argv++;
        while (argc)
                {
+               if      ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
+                       usertime = 0;
 #ifndef NO_MD2
                if      (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
                else
@@ -414,13 +417,13 @@ int MAIN(int argc, char **argv)
                        if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
                else
 #endif
-#ifndef NO_SHA1
+#ifndef 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_RMD160
+#ifndef NO_RIPEMD
                        if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
                else
                        if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
@@ -432,7 +435,7 @@ int MAIN(int argc, char **argv)
                        if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
                else 
 #endif
-#ifndef NO_DEF
+#ifndef 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
@@ -446,12 +449,14 @@ int MAIN(int argc, char **argv)
                        }
                else
 #endif
+#ifndef RSA_NULL
                        if (strcmp(*argv,"openssl") == 0) 
                        {
                        RSA_set_default_method(RSA_PKCS1_SSLeay());
                        j--;
                        }
                else
+#endif
 #endif /* !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;
@@ -476,7 +481,7 @@ int MAIN(int argc, char **argv)
                else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
                else
 #endif
-#ifndef NO_BLOWFISH
+#ifndef 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;
@@ -515,7 +520,7 @@ int MAIN(int argc, char **argv)
                else
 #endif
                        {
-                       BIO_printf(bio_err,"bad value, pick one of\n");
+                       BIO_printf(bio_err,"bad option or value, pick one of\n");
                        BIO_printf(bio_err,"md2      mdc2       md5      hmac      sha1    rmd160\n");
 #ifndef NO_IDEA
                        BIO_printf(bio_err,"idea-cbc ");
@@ -526,10 +531,10 @@ int MAIN(int argc, char **argv)
 #ifndef NO_RC5
                        BIO_printf(bio_err,"rc5-cbc  ");
 #endif
-#ifndef NO_BLOWFISH
+#ifndef NO_BF
                        BIO_printf(bio_err,"bf-cbc");
 #endif
-#if !defined(NO_IDEA) && !defined(NO_RC2) && !defined(NO_BLOWFISH) && !defined(NO_RC5)
+#if !defined(NO_IDEA) && !defined(NO_RC2) && !defined(NO_BF) && !defined(NO_RC5)
                        BIO_printf(bio_err,"\n");
 #endif
                        BIO_printf(bio_err,"des-cbc  des-ede3 ");
@@ -543,6 +548,10 @@ int MAIN(int argc, char **argv)
                        BIO_printf(bio_err,"\ndsa512   dsa1024  dsa2048\n");
 #endif
                        BIO_printf(bio_err,"idea     rc2      des      rsa    blowfish\n");
+                       BIO_printf(bio_err,"\n");
+                       BIO_printf(bio_err,"Available options:\n");
+                       BIO_printf(bio_err,"\n");
+                       BIO_printf(bio_err,"-elapsed        measure time in real time instead of CPU user time.\n");
                        goto end;
                        }
                argc--;
@@ -562,10 +571,13 @@ int MAIN(int argc, char **argv)
        for (i=0; i<ALGOR_NUM; i++)
                if (doit[i]) pr_header++;
 
-#ifndef TIMES
-       BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
-       BIO_printf(bio_err,"program when this computer is idle.\n");
-#endif
+       if (usertime == 0)
+               BIO_printf(bio_err,"You have chosen to measure elapsed time instead of user CPU time.\n");
+       if (usertime <= 0)
+               {
+               BIO_printf(bio_err,"To get the most accurate results, try to run this\n");
+               BIO_printf(bio_err,"program when this computer is idle.\n");
+               }
 
 #ifndef NO_RSA
        for (i=0; i<RSA_NUM; i++)
@@ -597,9 +609,9 @@ int MAIN(int argc, char **argv)
 #endif
 
 #ifndef NO_DES
-       des_set_key(key,sch);
-       des_set_key(key2,sch2);
-       des_set_key(key3,sch3);
+       des_set_key_unchecked(&key,sch);
+       des_set_key_unchecked(&key2,sch2);
+       des_set_key_unchecked(&key3,sch3);
 #endif
 #ifndef NO_IDEA
        idea_set_encrypt_key(key16,&idea_ks);
@@ -613,24 +625,27 @@ int MAIN(int argc, char **argv)
 #ifndef NO_RC5
        RC5_32_set_key(&rc5_ks,16,key16,12);
 #endif
-#ifndef NO_BLOWFISH
+#ifndef NO_BF
        BF_set_key(&bf_ks,16,key16);
 #endif
 #ifndef NO_CAST
        CAST_set_key(&cast_ks,16,key16);
 #endif
-
+#ifndef NO_RSA
        memset(rsa_c,0,sizeof(rsa_c));
+#endif
 #ifndef SIGALRM
+#ifndef NO_DES
        BIO_printf(bio_err,"First we calculate the approximate speed ...\n");
        count=10;
        do      {
                long i;
                count*=2;
-               Time_F(START);
+               Time_F(START,usertime);
                for (i=count; i; i--)
-                       des_ecb_encrypt(buf,buf, &(sch[0]),DES_ENCRYPT);
-               d=Time_F(STOP);
+                       des_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
+                               &(sch[0]),DES_ENCRYPT);
+               d=Time_F(STOP,usertime);
                } while (d <3);
        c[D_MD2][0]=count/10;
        c[D_MDC2][0]=count/10;
@@ -671,6 +686,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
        rsa_c[R_RSA_512][0]=count/2000;
        rsa_c[R_RSA_512][1]=count/400;
        for (i=1; i<RSA_NUM; i++)
@@ -688,6 +704,7 @@ int MAIN(int argc, char **argv)
                                }
                        }                               
                }
+#endif
 
        dsa_c[R_DSA_512][0]=count/1000;
        dsa_c[R_DSA_512][1]=count/1000/2;
@@ -710,10 +727,14 @@ int MAIN(int argc, char **argv)
 #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 */
+#else
 #define COND(c)        (run)
 #define COUNT(d) (count)
        signal(SIGALRM,sig_done);
-#endif
+#endif /* SIGALRM */
 
 #ifndef NO_MD2
        if (doit[D_MD2])
@@ -721,10 +742,10 @@ int MAIN(int argc, char **argv)
                for (j=0; j<SIZE_NUM; j++)
                        {
                        print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
-                       Time_F(START);
+                       Time_F(START,usertime);
                        for (count=0,run=1; COND(c[D_MD2][j]); count++)
                                MD2(buf,(unsigned long)lengths[j],&(md2[0]));
-                       d=Time_F(STOP);
+                       d=Time_F(STOP,usertime);
                        BIO_printf(bio_err,"%ld %s's in %.2fs\n",
                                count,names[D_MD2],d);
                        results[D_MD2][j]=((double)count)/d*lengths[j];
@@ -737,10 +758,10 @@ int MAIN(int argc, char **argv)
                for (j=0; j<SIZE_NUM; j++)
                        {
                        print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
-                       Time_F(START);
+                       Time_F(START,usertime);
                        for (count=0,run=1; COND(c[D_MDC2][j]); count++)
                                MDC2(buf,(unsigned long)lengths[j],&(mdc2[0]));
-                       d=Time_F(STOP);
+                       d=Time_F(STOP,usertime);
                        BIO_printf(bio_err,"%ld %s's in %.2fs\n",
                                count,names[D_MDC2],d);
                        results[D_MDC2][j]=((double)count)/d*lengths[j];
@@ -754,10 +775,10 @@ int MAIN(int argc, char **argv)
                for (j=0; j<SIZE_NUM; j++)
                        {
                        print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
-                       Time_F(START);
+                       Time_F(START,usertime);
                        for (count=0,run=1; COND(c[D_MD5][j]); count++)
                                MD5(&(buf[0]),(unsigned long)lengths[j],&(md5[0]));
-                       d=Time_F(STOP);
+                       d=Time_F(STOP,usertime);
                        BIO_printf(bio_err,"%ld %s's in %.2fs\n",
                                count,names[D_MD5],d);
                        results[D_MD5][j]=((double)count)/d*lengths[j];
@@ -765,7 +786,7 @@ int MAIN(int argc, char **argv)
                }
 #endif
 
-#ifndef NO_MD5
+#if !defined(NO_MD5) && !defined(NO_HMAC)
        if (doit[D_HMAC])
                {
                HMAC_CTX hctx;
@@ -775,46 +796,46 @@ int MAIN(int argc, char **argv)
                for (j=0; j<SIZE_NUM; j++)
                        {
                        print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
-                       Time_F(START);
+                       Time_F(START,usertime);
                        for (count=0,run=1; COND(c[D_HMAC][j]); count++)
                                {
                                HMAC_Init(&hctx,NULL,0,NULL);
                                 HMAC_Update(&hctx,buf,lengths[j]);
                                 HMAC_Final(&hctx,&(hmac[0]),NULL);
                                }
-                       d=Time_F(STOP);
+                       d=Time_F(STOP,usertime);
                        BIO_printf(bio_err,"%ld %s's in %.2fs\n",
                                count,names[D_HMAC],d);
                        results[D_HMAC][j]=((double)count)/d*lengths[j];
                        }
                }
 #endif
-#ifndef NO_SHA1
+#ifndef NO_SHA
        if (doit[D_SHA1])
                {
                for (j=0; j<SIZE_NUM; j++)
                        {
                        print_message(names[D_SHA1],c[D_SHA1][j],lengths[j]);
-                       Time_F(START);
+                       Time_F(START,usertime);
                        for (count=0,run=1; COND(c[D_SHA1][j]); count++)
                                SHA1(buf,(unsigned long)lengths[j],&(sha[0]));
-                       d=Time_F(STOP);
+                       d=Time_F(STOP,usertime);
                        BIO_printf(bio_err,"%ld %s's in %.2fs\n",
                                count,names[D_SHA1],d);
                        results[D_SHA1][j]=((double)count)/d*lengths[j];
                        }
                }
 #endif
-#ifndef NO_RMD160
+#ifndef NO_RIPEMD
        if (doit[D_RMD160])
                {
                for (j=0; j<SIZE_NUM; j++)
                        {
                        print_message(names[D_RMD160],c[D_RMD160][j],lengths[j]);
-                       Time_F(START);
+                       Time_F(START,usertime);
                        for (count=0,run=1; COND(c[D_RMD160][j]); count++)
                                RIPEMD160(buf,(unsigned long)lengths[j],&(rmd160[0]));
-                       d=Time_F(STOP);
+                       d=Time_F(STOP,usertime);
                        BIO_printf(bio_err,"%ld %s's in %.2fs\n",
                                count,names[D_RMD160],d);
                        results[D_RMD160][j]=((double)count)/d*lengths[j];
@@ -827,11 +848,11 @@ int MAIN(int argc, char **argv)
                for (j=0; j<SIZE_NUM; j++)
                        {
                        print_message(names[D_RC4],c[D_RC4][j],lengths[j]);
-                       Time_F(START);
+                       Time_F(START,usertime);
                        for (count=0,run=1; COND(c[D_RC4][j]); count++)
                                RC4(&rc4_ks,(unsigned int)lengths[j],
                                        buf,buf);
-                       d=Time_F(STOP);
+                       d=Time_F(STOP,usertime);
                        BIO_printf(bio_err,"%ld %s's in %.2fs\n",
                                count,names[D_RC4],d);
                        results[D_RC4][j]=((double)count)/d*lengths[j];
@@ -844,11 +865,11 @@ int MAIN(int argc, char **argv)
                for (j=0; j<SIZE_NUM; j++)
                        {
                        print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
-                       Time_F(START);
+                       Time_F(START,usertime);
                        for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
                                des_ncbc_encrypt(buf,buf,lengths[j],sch,
-                                                &(iv[0]),DES_ENCRYPT);
-                       d=Time_F(STOP);
+                                                &iv,DES_ENCRYPT);
+                       d=Time_F(STOP,usertime);
                        BIO_printf(bio_err,"%ld %s's in %.2fs\n",
                                count,names[D_CBC_DES],d);
                        results[D_CBC_DES][j]=((double)count)/d*lengths[j];
@@ -860,12 +881,12 @@ int MAIN(int argc, char **argv)
                for (j=0; j<SIZE_NUM; j++)
                        {
                        print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
-                       Time_F(START);
+                       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,
-                                                    &(iv[0]),DES_ENCRYPT);
-                       d=Time_F(STOP);
+                                                    &iv,DES_ENCRYPT);
+                       d=Time_F(STOP,usertime);
                        BIO_printf(bio_err,"%ld %s's in %.2fs\n",
                                count,names[D_EDE3_DES],d);
                        results[D_EDE3_DES][j]=((double)count)/d*lengths[j];
@@ -878,12 +899,12 @@ int MAIN(int argc, char **argv)
                for (j=0; j<SIZE_NUM; j++)
                        {
                        print_message(names[D_CBC_IDEA],c[D_CBC_IDEA][j],lengths[j]);
-                       Time_F(START);
+                       Time_F(START,usertime);
                        for (count=0,run=1; COND(c[D_CBC_IDEA][j]); count++)
                                idea_cbc_encrypt(buf,buf,
                                        (unsigned long)lengths[j],&idea_ks,
-                                       (unsigned char *)&(iv[0]),IDEA_ENCRYPT);
-                       d=Time_F(STOP);
+                                       iv,IDEA_ENCRYPT);
+                       d=Time_F(STOP,usertime);
                        BIO_printf(bio_err,"%ld %s's in %.2fs\n",
                                count,names[D_CBC_IDEA],d);
                        results[D_CBC_IDEA][j]=((double)count)/d*lengths[j];
@@ -896,12 +917,12 @@ int MAIN(int argc, char **argv)
                for (j=0; j<SIZE_NUM; j++)
                        {
                        print_message(names[D_CBC_RC2],c[D_CBC_RC2][j],lengths[j]);
-                       Time_F(START);
+                       Time_F(START,usertime);
                        for (count=0,run=1; COND(c[D_CBC_RC2][j]); count++)
                                RC2_cbc_encrypt(buf,buf,
                                        (unsigned long)lengths[j],&rc2_ks,
-                                       (unsigned char *)&(iv[0]),RC2_ENCRYPT);
-                       d=Time_F(STOP);
+                                       iv,RC2_ENCRYPT);
+                       d=Time_F(STOP,usertime);
                        BIO_printf(bio_err,"%ld %s's in %.2fs\n",
                                count,names[D_CBC_RC2],d);
                        results[D_CBC_RC2][j]=((double)count)/d*lengths[j];
@@ -914,30 +935,30 @@ int MAIN(int argc, char **argv)
                for (j=0; j<SIZE_NUM; j++)
                        {
                        print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
-                       Time_F(START);
+                       Time_F(START,usertime);
                        for (count=0,run=1; COND(c[D_CBC_RC5][j]); count++)
                                RC5_32_cbc_encrypt(buf,buf,
                                        (unsigned long)lengths[j],&rc5_ks,
-                                       (unsigned char *)&(iv[0]),RC5_ENCRYPT);
-                       d=Time_F(STOP);
+                                       iv,RC5_ENCRYPT);
+                       d=Time_F(STOP,usertime);
                        BIO_printf(bio_err,"%ld %s's in %.2fs\n",
                                count,names[D_CBC_RC5],d);
                        results[D_CBC_RC5][j]=((double)count)/d*lengths[j];
                        }
                }
 #endif
-#ifndef NO_BLOWFISH
+#ifndef NO_BF
        if (doit[D_CBC_BF])
                {
                for (j=0; j<SIZE_NUM; j++)
                        {
                        print_message(names[D_CBC_BF],c[D_CBC_BF][j],lengths[j]);
-                       Time_F(START);
+                       Time_F(START,usertime);
                        for (count=0,run=1; COND(c[D_CBC_BF][j]); count++)
                                BF_cbc_encrypt(buf,buf,
                                        (unsigned long)lengths[j],&bf_ks,
-                                       (unsigned char *)&(iv[0]),BF_ENCRYPT);
-                       d=Time_F(STOP);
+                                       iv,BF_ENCRYPT);
+                       d=Time_F(STOP,usertime);
                        BIO_printf(bio_err,"%ld %s's in %.2fs\n",
                                count,names[D_CBC_BF],d);
                        results[D_CBC_BF][j]=((double)count)/d*lengths[j];
@@ -950,12 +971,12 @@ int MAIN(int argc, char **argv)
                for (j=0; j<SIZE_NUM; j++)
                        {
                        print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
-                       Time_F(START);
+                       Time_F(START,usertime);
                        for (count=0,run=1; COND(c[D_CBC_CAST][j]); count++)
                                CAST_cbc_encrypt(buf,buf,
                                        (unsigned long)lengths[j],&cast_ks,
-                                       (unsigned char *)&(iv[0]),CAST_ENCRYPT);
-                       d=Time_F(STOP);
+                                       iv,CAST_ENCRYPT);
+                       d=Time_F(STOP,usertime);
                        BIO_printf(bio_err,"%ld %s's in %.2fs\n",
                                count,names[D_CBC_CAST],d);
                        results[D_CBC_CAST][j]=((double)count)/d*lengths[j];
@@ -963,22 +984,22 @@ int MAIN(int argc, char **argv)
                }
 #endif
 
-       RAND_bytes(buf,30);
+       RAND_pseudo_bytes(buf,36);
 #ifndef NO_RSA
        for (j=0; j<RSA_NUM; j++)
                {
+               int ret;
                if (!rsa_doit[j]) continue;
-               rsa_num=RSA_private_encrypt(30,buf,buf2,rsa_key[j],
-                       RSA_PKCS1_PADDING);
+               ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num, rsa_key[j]);
                pkey_print_message("private","rsa",rsa_c[j][0],rsa_bits[j],
                        RSA_SECONDS);
 /*             RSA_blinding_on(rsa_key[j],NULL); */
-               Time_F(START);
+               Time_F(START,usertime);
                for (count=0,run=1; COND(rsa_c[j][0]); count++)
                        {
-                       rsa_num=RSA_private_encrypt(30,buf,buf2,rsa_key[j],
-                               RSA_PKCS1_PADDING);
-                       if (rsa_num <= 0)
+                       ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num,
+                                                                rsa_key[j]);
+                       if (ret <= 0)
                                {
                                BIO_printf(bio_err,"RSA private encrypt failure\n");
                                ERR_print_errors(bio_err);
@@ -986,31 +1007,30 @@ int MAIN(int argc, char **argv)
                                break;
                                }
                        }
-               d=Time_F(STOP);
+               d=Time_F(STOP,usertime);
                BIO_printf(bio_err,"%ld %d bit private RSA's in %.2fs\n",
                        count,rsa_bits[j],d);
                rsa_results[j][0]=d/(double)count;
                rsa_count=count;
 
 #if 1
-               rsa_num2=RSA_public_decrypt(rsa_num,buf2,buf,rsa_key[j],
-                       RSA_PKCS1_PADDING);
+               ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num, rsa_key[j]);
                pkey_print_message("public","rsa",rsa_c[j][1],rsa_bits[j],
                        RSA_SECONDS);
-               Time_F(START);
+               Time_F(START,usertime);
                for (count=0,run=1; COND(rsa_c[j][1]); count++)
                        {
-                       rsa_num2=RSA_public_decrypt(rsa_num,buf2,buf,rsa_key[j],
-                               RSA_PKCS1_PADDING);
-                       if (rsa_num2 <= 0)
+                       ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num,
+                                                               rsa_key[j]);
+                       if (ret <= 0)
                                {
-                               BIO_printf(bio_err,"RSA public encrypt failure\n");
+                               BIO_printf(bio_err,"RSA verify failure\n");
                                ERR_print_errors(bio_err);
                                count=1;
                                break;
                                }
                        }
-               d=Time_F(STOP);
+               d=Time_F(STOP,usertime);
                BIO_printf(bio_err,"%ld %d bit public RSA's in %.2fs\n",
                        count,rsa_bits[j],d);
                rsa_results[j][1]=d/(double)count;
@@ -1025,8 +1045,13 @@ int MAIN(int argc, char **argv)
                }
 #endif
 
-       RAND_bytes(buf,20);
+       RAND_pseudo_bytes(buf,20);
 #ifndef NO_DSA
+       if (RAND_status() != 1)
+               {
+               RAND_seed(rnd_seed, sizeof rnd_seed);
+               rnd_fake = 1;
+               }
        for (j=0; j<DSA_NUM; j++)
                {
                unsigned int kk;
@@ -1038,12 +1063,12 @@ int MAIN(int argc, char **argv)
                        &kk,dsa_key[j]);
                pkey_print_message("sign","dsa",dsa_c[j][0],dsa_bits[j],
                        DSA_SECONDS);
-               Time_F(START);
+               Time_F(START,usertime);
                for (count=0,run=1; COND(dsa_c[j][0]); count++)
                        {
                        rsa_num=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
                                &kk,dsa_key[j]);
-                       if (rsa_num <= 0)
+                       if (rsa_num == 0)
                                {
                                BIO_printf(bio_err,"DSA sign failure\n");
                                ERR_print_errors(bio_err);
@@ -1051,7 +1076,7 @@ int MAIN(int argc, char **argv)
                                break;
                                }
                        }
-               d=Time_F(STOP);
+               d=Time_F(STOP,usertime);
                BIO_printf(bio_err,"%ld %d bit DSA signs in %.2fs\n",
                        count,dsa_bits[j],d);
                dsa_results[j][0]=d/(double)count;
@@ -1061,12 +1086,12 @@ int MAIN(int argc, char **argv)
                        kk,dsa_key[j]);
                pkey_print_message("verify","dsa",dsa_c[j][1],dsa_bits[j],
                        DSA_SECONDS);
-               Time_F(START);
+               Time_F(START,usertime);
                for (count=0,run=1; COND(dsa_c[j][1]); count++)
                        {
                        rsa_num2=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
                                kk,dsa_key[j]);
-                       if (rsa_num2 <= 0)
+                       if (rsa_num2 == 0)
                                {
                                BIO_printf(bio_err,"DSA verify failure\n");
                                ERR_print_errors(bio_err);
@@ -1074,7 +1099,7 @@ int MAIN(int argc, char **argv)
                                break;
                                }
                        }
-               d=Time_F(STOP);
+               d=Time_F(STOP,usertime);
                BIO_printf(bio_err,"%ld %d bit DSA verify in %.2fs\n",
                        count,dsa_bits[j],d);
                dsa_results[j][1]=d/(double)count;
@@ -1086,6 +1111,7 @@ int MAIN(int argc, char **argv)
                                dsa_doit[j]=0;
                        }
                }
+       if (rnd_fake) RAND_cleanup();
 #endif
 
        fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
@@ -1104,7 +1130,7 @@ int MAIN(int argc, char **argv)
 #ifndef NO_IDEA
        printf("%s ",idea_options());
 #endif
-#ifndef NO_BLOWFISH
+#ifndef NO_BF
        printf("%s ",BF_options());
 #endif
        fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
@@ -1141,7 +1167,7 @@ int MAIN(int argc, char **argv)
                        printf("%18ssign    verify    sign/s verify/s\n"," ");
                        j=0;
                        }
-               fprintf(stdout,"rsa %4d bits %8.4fs %8.4fs %8.1f %8.1f",
+               fprintf(stdout,"rsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
                        rsa_bits[k],rsa_results[k][0],rsa_results[k][1],
                        1.0/rsa_results[k][0],1.0/rsa_results[k][1]);
                fprintf(stdout,"\n");
@@ -1156,16 +1182,16 @@ int MAIN(int argc, char **argv)
                        printf("%18ssign    verify    sign/s verify/s\n"," ");
                        j=0;
                        }
-               fprintf(stdout,"dsa %4d bits %8.4fs %8.4fs %8.1f %8.1f",
+               fprintf(stdout,"dsa %4u bits %8.4fs %8.4fs %8.1f %8.1f",
                        dsa_bits[k],dsa_results[k][0],dsa_results[k][1],
                        1.0/dsa_results[k][0],1.0/dsa_results[k][1]);
                fprintf(stdout,"\n");
                }
 #endif
-       ret=0;
+       mret=0;
 end:
-       if (buf != NULL) Free(buf);
-       if (buf2 != NULL) Free(buf2);
+       if (buf != NULL) OPENSSL_free(buf);
+       if (buf2 != NULL) OPENSSL_free(buf2);
 #ifndef NO_RSA
        for (i=0; i<RSA_NUM; i++)
                if (rsa_key[i] != NULL)
@@ -1176,18 +1202,18 @@ end:
                if (dsa_key[i] != NULL)
                        DSA_free(dsa_key[i]);
 #endif
-       EXIT(ret);
+       EXIT(mret);
        }
 
 static void print_message(char *s, long num, int length)
        {
 #ifdef SIGALRM
        BIO_printf(bio_err,"Doing %s for %ds on %d size blocks: ",s,SECONDS,length);
-       BIO_flush(bio_err);
+       (void)BIO_flush(bio_err);
        alarm(SECONDS);
 #else
        BIO_printf(bio_err,"Doing %s %ld times on %d size blocks: ",s,num,length);
-       BIO_flush(bio_err);
+       (void)BIO_flush(bio_err);
 #endif
 #ifdef LINT
        num=num;
@@ -1199,11 +1225,11 @@ static void pkey_print_message(char *str, char *str2, long num, int bits,
        {
 #ifdef SIGALRM
        BIO_printf(bio_err,"Doing %d bit %s %s's for %ds: ",bits,str,str2,tm);
-       BIO_flush(bio_err);
+       (void)BIO_flush(bio_err);
        alarm(RSA_SECONDS);
 #else
        BIO_printf(bio_err,"Doing %ld %d bit %s %s's: ",num,bits,str,str2);
-       BIO_flush(bio_err);
+       (void)BIO_flush(bio_err);
 #endif
 #ifdef LINT
        num=num;