Change HZ in speed to rely on sysconf() if the clock tick is available
[openssl.git] / apps / speed.c
index 90dcd4787e0e05dd139e354199311f7d5cd03356..45df8aa91b3204665fbb5b848a690c8d482ecd6a 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 <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(OPENSSL_SYS_MPE) && !defined(__NetBSD__) /* FIXME */
    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
 
 
 /* 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(const char *s,long num,int length);
 static void pkey_print_message(char *str,char *str2,long num,int bits,int sec);
@@ -230,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);
@@ -251,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);
@@ -271,6 +279,7 @@ static double Time_F(int s, int usertime)
                {
                static struct tms tstart,tend;
 
+               times_used = 1;
                if (s == START)
                        {
                        times(&tstart);
@@ -292,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);
@@ -426,6 +436,7 @@ int MAIN(int argc, char **argv)
        int pr_header=0;
        int usertime=1;
        const EVP_CIPHER *evp=NULL;
+       int decrypt=0;
 
 #ifndef TIMES
        usertime=-1;
@@ -477,7 +488,11 @@ int MAIN(int argc, char **argv)
        while (argc)
                {
                if      ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
+                       {
                        usertime = 0;
+                       j--;    /* Otherwise, -elapsed gets confused with
+                                  an algorithm. */
+                       }
                else if ((argc > 0) && (strcmp(*argv,"-evp") == 0))
                        {
                        argc--;
@@ -495,8 +510,13 @@ int MAIN(int argc, char **argv)
                                }
                        doit[D_EVP]=1;
                        }
-               else
-               if      ((argc > 0) && (strcmp(*argv,"-engine") == 0))
+               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++;
@@ -505,21 +525,8 @@ int MAIN(int argc, char **argv)
                                BIO_printf(bio_err,"no engine given\n");
                                goto end;
                                }
-                       if((e = ENGINE_by_id(*argv)) == NULL)
-                               {
-                               BIO_printf(bio_err,"invalid engine \"%s\"\n",
-                                       *argv);
-                               goto end;
-                               }
-                       if(!ENGINE_set_default(e, ENGINE_METHOD_ALL))
-                               {
-                               BIO_printf(bio_err,"can't use that engine\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) */
@@ -581,7 +588,7 @@ 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
@@ -797,9 +804,9 @@ int MAIN(int argc, char **argv)
 #endif
 
 #ifndef OPENSSL_NO_DES
-       des_set_key_unchecked(&key,sch);
-       des_set_key_unchecked(&key2,sch2);
-       des_set_key_unchecked(&key3,sch3);
+       des_set_key_unchecked(&key,&sch);
+       des_set_key_unchecked(&key2,&sch2);
+       des_set_key_unchecked(&key3,&sch3);
 #endif
 #ifndef OPENSSL_NO_IDEA
        idea_set_encrypt_key(key16,&idea_ks);
@@ -897,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++)
@@ -914,6 +922,7 @@ int MAIN(int argc, char **argv)
                                }
                        }                               
                }
+#endif
 
 #define COND(d)        (count < (d))
 #define COUNT(d) (d)
@@ -935,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);
@@ -951,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);
@@ -968,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);
@@ -985,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);
@@ -998,6 +1007,8 @@ int MAIN(int argc, char **argv)
        if (doit[D_HMAC])
                {
                HMAC_CTX hctx;
+
+               HMAC_CTX_init(&hctx);
                HMAC_Init(&hctx,(unsigned char *)"This is a key...",
                        16,EVP_md5());
 
@@ -1016,6 +1027,7 @@ 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 OPENSSL_NO_SHA
@@ -1026,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);
@@ -1042,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);
@@ -1075,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];
                        }
                }
@@ -1092,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",
@@ -1202,11 +1214,22 @@ int MAIN(int argc, char **argv)
                        names[D_EVP]=OBJ_nid2ln(evp->nid);
                        print_message(names[D_EVP],save_count,
                                                  lengths[j]);
-                       EVP_EncryptInit(&ctx,evp,key16,iv);
+                       if(decrypt)
+                               EVP_DecryptInit(&ctx,evp,key16,iv);
+                       else
+                               EVP_EncryptInit(&ctx,evp,key16,iv);
+                               
                        Time_F(START,usertime);
-                       for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)
-                           EVP_EncryptUpdate(&ctx,buf,&outl,buf,lengths[j]);
-                       EVP_EncryptFinal(&ctx,buf,&outl);
+                       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);
@@ -1261,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
                        {
@@ -1312,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]);
@@ -1411,6 +1434,33 @@ int MAIN(int argc, char **argv)
        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)
                {
@@ -1480,6 +1530,7 @@ end:
                if (dsa_key[i] != NULL)
                        DSA_free(dsa_key[i]);
 #endif
+       apps_shutdown();
        EXIT(mret);
        }