The consequence of constification is that to pass the address to a
[openssl.git] / apps / speed.c
index c468e33721c2a86652fb2990c82e262a798dcd4a..333dea6c92eabbdd8fd0d668bbcb28387e2b646e 100644 (file)
 #include <openssl/crypto.h>
 #include <openssl/rand.h>
 #include <openssl/err.h>
+#include <openssl/engine.h>
 
 #if defined(__FreeBSD__)
 # define USE_TOD
 #elif !defined(MSDOS) && (!defined(VMS) || defined(__DECC))
 # define TIMES
 #endif
-#if !defined(_UNICOS) && !defined(__OpenBSD__)
+#if !defined(_UNICOS) && !defined(__OpenBSD__) && !defined(sgi) && !defined(__FreeBSD__) && !(defined(__bsdi) || defined(__bsdi__)) && !defined(_AIX) && !defined(MPE) && !defined(__NetBSD__)
 # define TIMEB
 #endif
 
 #include <sys/timeb.h>
 #endif
 
-#if !defined(TIMES) && !defined(TIMEB)
+#if !defined(TIMES) && !defined(TIMEB) && !defined(USE_TOD)
 #error "It seems neither struct tms nor struct timeb is supported in this platform!"
 #endif
 
@@ -310,6 +311,7 @@ int MAIN(int, char **);
 
 int MAIN(int argc, char **argv)
        {
+       ENGINE *e;
        unsigned char *buf=NULL,*buf2=NULL;
        int mret=1;
 #define ALGOR_NUM      15
@@ -318,7 +320,7 @@ int MAIN(int argc, char **argv)
 #define DSA_NUM                3
        long count,rsa_count;
        int i,j,k;
-       unsigned rsa_num,rsa_num2;
+       unsigned rsa_num;
 #ifndef NO_MD2
        unsigned char md2[MD2_DIGEST_LENGTH];
 #endif
@@ -470,6 +472,37 @@ int MAIN(int argc, char **argv)
                {
                if      ((argc > 0) && (strcmp(*argv,"-elapsed") == 0))
                        usertime = 0;
+               else
+               if      ((argc > 0) && (strcmp(*argv,"-engine") == 0))
+                       {
+                       argc--;
+                       argv++;
+                       if(argc == 0)
+                               {
+                               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
+                          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
                if      (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
                else
@@ -517,7 +550,7 @@ int MAIN(int argc, char **argv)
 #ifdef RSAref
                        if (strcmp(*argv,"rsaref") == 0) 
                        {
-                       RSA_set_default_method(RSA_PKCS1_RSAref());
+                       RSA_set_default_openssl_method(RSA_PKCS1_RSAref());
                        j--;
                        }
                else
@@ -525,7 +558,7 @@ int MAIN(int argc, char **argv)
 #ifndef RSA_NULL
                        if (strcmp(*argv,"openssl") == 0) 
                        {
-                       RSA_set_default_method(RSA_PKCS1_SSLeay());
+                       RSA_set_default_openssl_method(RSA_PKCS1_SSLeay());
                        j--;
                        }
                else
@@ -670,11 +703,12 @@ int MAIN(int argc, char **argv)
                        BIO_printf(bio_err,"\n");
 #endif
 
-#ifdef TIMES
                        BIO_printf(bio_err,"\n");
                        BIO_printf(bio_err,"Available options:\n");
+#ifdef TIMES
                        BIO_printf(bio_err,"-elapsed        measure time in real time instead of CPU user time.\n");
 #endif
+                       BIO_printf(bio_err,"-engine e       use engine e, possibly a hardware device.\n");
                        goto end;
                        }
                argc--;
@@ -705,7 +739,7 @@ int MAIN(int argc, char **argv)
 #ifndef NO_RSA
        for (i=0; i<RSA_NUM; i++)
                {
-               unsigned char *p;
+               const unsigned char *p;
 
                p=rsa_data[i];
                rsa_key[i]=d2i_RSAPrivateKey(NULL,&p,rsa_data_length[i]);
@@ -1133,49 +1167,73 @@ int MAIN(int argc, char **argv)
                int ret;
                if (!rsa_doit[j]) continue;
                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,usertime);
-               for (count=0,run=1; COND(rsa_c[j][0]); count++)
+               if (ret == 0)
+                       {
+                       BIO_printf(bio_err,"RSA sign failure.  No RSA sign will be done.\n");
+                       ERR_print_errors(bio_err);
+                       rsa_count=1;
+                       }
+               else
                        {
-                       ret=RSA_sign(NID_md5_sha1, buf,36, buf2, &rsa_num,
-                                                                rsa_key[j]);
-                       if (ret <= 0)
+                       pkey_print_message("private","rsa",
+                               rsa_c[j][0],rsa_bits[j],
+                               RSA_SECONDS);
+/*                     RSA_blinding_on(rsa_key[j],NULL); */
+                       Time_F(START,usertime);
+                       for (count=0,run=1; COND(rsa_c[j][0]); count++)
                                {
-                               BIO_printf(bio_err,"RSA private encrypt failure\n");
-                               ERR_print_errors(bio_err);
-                               count=1;
-                               break;
+                               ret=RSA_sign(NID_md5_sha1, buf,36, buf2,
+                                       &rsa_num, rsa_key[j]);
+                               if (ret == 0)
+                                       {
+                                       BIO_printf(bio_err,
+                                               "RSA sign failure\n");
+                                       ERR_print_errors(bio_err);
+                                       count=1;
+                                       break;
+                                       }
                                }
+                       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;
                        }
-               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
                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,usertime);
-               for (count=0,run=1; COND(rsa_c[j][1]); count++)
+               if (ret <= 0)
                        {
-                       ret=RSA_verify(NID_md5_sha1, buf,36, buf2, rsa_num,
-                                                               rsa_key[j]);
-                       if (ret <= 0)
+                       BIO_printf(bio_err,"RSA verify failure.  No RSA verify will be done.\n");
+                       ERR_print_errors(bio_err);
+                       dsa_doit[j] = 0;
+                       }
+               else
+                       {
+                       pkey_print_message("public","rsa",
+                               rsa_c[j][1],rsa_bits[j],
+                               RSA_SECONDS);
+                       Time_F(START,usertime);
+                       for (count=0,run=1; COND(rsa_c[j][1]); count++)
                                {
-                               BIO_printf(bio_err,"RSA verify failure\n");
-                               ERR_print_errors(bio_err);
-                               count=1;
-                               break;
+                               ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
+                                       rsa_num, rsa_key[j]);
+                               if (ret == 0)
+                                       {
+                                       BIO_printf(bio_err,
+                                               "RSA verify failure\n");
+                                       ERR_print_errors(bio_err);
+                                       count=1;
+                                       break;
+                                       }
                                }
+                       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;
                        }
-               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;
 #endif
 
                if (rsa_count <= 1)
@@ -1197,54 +1255,77 @@ int MAIN(int argc, char **argv)
        for (j=0; j<DSA_NUM; j++)
                {
                unsigned int kk;
+               int ret;
 
                if (!dsa_doit[j]) continue;
                DSA_generate_key(dsa_key[j]);
 /*             DSA_sign_setup(dsa_key[j],NULL); */
-               rsa_num=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
+               ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
                        &kk,dsa_key[j]);
-               pkey_print_message("sign","dsa",dsa_c[j][0],dsa_bits[j],
-                       DSA_SECONDS);
-               Time_F(START,usertime);
-               for (count=0,run=1; COND(dsa_c[j][0]); count++)
+               if (ret == 0)
+                       {
+                       BIO_printf(bio_err,"DSA sign failure.  No DSA sign will be done.\n");
+                       ERR_print_errors(bio_err);
+                       rsa_count=1;
+                       }
+               else
                        {
-                       rsa_num=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
-                               &kk,dsa_key[j]);
-                       if (rsa_num <= 0)
+                       pkey_print_message("sign","dsa",
+                               dsa_c[j][0],dsa_bits[j],
+                               DSA_SECONDS);
+                       Time_F(START,usertime);
+                       for (count=0,run=1; COND(dsa_c[j][0]); count++)
                                {
-                               BIO_printf(bio_err,"DSA sign failure\n");
-                               ERR_print_errors(bio_err);
-                               count=1;
-                               break;
+                               ret=DSA_sign(EVP_PKEY_DSA,buf,20,buf2,
+                                       &kk,dsa_key[j]);
+                               if (ret == 0)
+                                       {
+                                       BIO_printf(bio_err,
+                                               "DSA sign failure\n");
+                                       ERR_print_errors(bio_err);
+                                       count=1;
+                                       break;
+                                       }
                                }
+                       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;
+                       rsa_count=count;
                        }
-               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;
-               rsa_count=count;
 
-               rsa_num2=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
+               ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
                        kk,dsa_key[j]);
-               pkey_print_message("verify","dsa",dsa_c[j][1],dsa_bits[j],
-                       DSA_SECONDS);
-               Time_F(START,usertime);
-               for (count=0,run=1; COND(dsa_c[j][1]); count++)
+               if (ret <= 0)
+                       {
+                       BIO_printf(bio_err,"DSA verify failure.  No DSA verify will be done.\n");
+                       ERR_print_errors(bio_err);
+                       dsa_doit[j] = 0;
+                       }
+               else
                        {
-                       rsa_num2=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
-                               kk,dsa_key[j]);
-                       if (rsa_num2 <= 0)
+                       pkey_print_message("verify","dsa",
+                               dsa_c[j][1],dsa_bits[j],
+                               DSA_SECONDS);
+                       Time_F(START,usertime);
+                       for (count=0,run=1; COND(dsa_c[j][1]); count++)
                                {
-                               BIO_printf(bio_err,"DSA verify failure\n");
-                               ERR_print_errors(bio_err);
-                               count=1;
-                               break;
+                               ret=DSA_verify(EVP_PKEY_DSA,buf,20,buf2,
+                                       kk,dsa_key[j]);
+                               if (ret <= 0)
+                                       {
+                                       BIO_printf(bio_err,
+                                               "DSA verify failure\n");
+                                       ERR_print_errors(bio_err);
+                                       count=1;
+                                       break;
+                                       }
                                }
+                       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;
                        }
-               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;
 
                if (rsa_count <= 1)
                        {
@@ -1332,6 +1413,7 @@ int MAIN(int argc, char **argv)
 #endif
        mret=0;
 end:
+       ERR_print_errors(bio_err);
        if (buf != NULL) OPENSSL_free(buf);
        if (buf2 != NULL) OPENSSL_free(buf2);
 #ifndef NO_RSA