Improve back compatibility.
[openssl.git] / apps / speed.c
index de35c47e47d81adc482f9d3d764af2a0d1707bdb..5d609a8c16b939247edc1cf8443a39e52484de7c 100644 (file)
@@ -83,7 +83,9 @@
 #include <openssl/err.h>
 #include <openssl/evp.h>
 #include <openssl/objects.h>
+#if !defined(OPENSSL_SYS_MSDOS)
 #include OPENSSL_UNISTD
+#endif
 
 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(OPENSSL_SYS_MACOSX)
 # define USE_TOD
 # endif
 #endif
 
+#if !defined(OPENSSL_SYS_VMS) && !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MACINTOSH_CLASSIC) && !defined(OPENSSL_SYS_OS2)
+# define HAVE_FORK 1
+#endif
+
 #undef BUFSIZE
 #define BUFSIZE        ((long)1024*8+1)
 int run=0;
@@ -209,13 +215,9 @@ static double Time_F(int s);
 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);
 static void print_result(int alg,int run_no,int count,double time_used);
+#ifdef HAVE_FORK
 static int do_multi(int multi);
-#ifdef SIGALRM
-#if defined(__STDC__) || defined(sgi) || defined(_AIX)
-#define SIGRETTYPE void
-#else
-#define SIGRETTYPE int
-#endif 
+#endif
 
 #define ALGOR_NUM      16
 #define SIZE_NUM       5
@@ -230,6 +232,13 @@ static int lengths[SIZE_NUM]={8,64,256,1024,8*1024};
 static double rsa_results[RSA_NUM][2];
 static double dsa_results[DSA_NUM][2];
 
+#ifdef SIGALRM
+#if defined(__STDC__) || defined(sgi) || defined(_AIX)
+#define SIGRETTYPE void
+#else
+#define SIGRETTYPE int
+#endif 
+
 static SIGRETTYPE sig_done(int sig);
 static SIGRETTYPE sig_done(int sig)
        {
@@ -343,11 +352,12 @@ int MAIN(int argc, char **argv)
        ENGINE *e;
        unsigned char *buf=NULL,*buf2=NULL;
        int mret=1;
-       long count,rsa_count,save_count=0;
+       long count=0,rsa_count,save_count=0;
        int i,j,k;
 #ifndef OPENSSL_NO_RSA
        unsigned rsa_num;
 #endif
+       unsigned char md[EVP_MAX_MD_SIZE];
 #ifndef OPENSSL_NO_MD2
        unsigned char md2[MD2_DIGEST_LENGTH];
 #endif
@@ -414,7 +424,7 @@ int MAIN(int argc, char **argv)
 #define        D_CBC_BF        13
 #define        D_CBC_CAST      14
 #define D_EVP          15
-       double d;
+       double d=0;
        long c[ALGOR_NUM][SIZE_NUM];
 #define        R_DSA_512       0
 #define        R_DSA_1024      1
@@ -442,9 +452,12 @@ int MAIN(int argc, char **argv)
        int dsa_doit[DSA_NUM];
        int doit[ALGOR_NUM];
        int pr_header=0;
-       const EVP_CIPHER *evp=NULL;
+       const EVP_CIPHER *evp_cipher=NULL;
+       const EVP_MD *evp_md=NULL;
        int decrypt=0;
+#ifdef HAVE_FORK
        int multi=0;
+#endif
 
 #ifndef TIMES
        usertime=-1;
@@ -510,10 +523,14 @@ int MAIN(int argc, char **argv)
                                BIO_printf(bio_err,"no EVP given\n");
                                goto end;
                                }
-                       evp=EVP_get_cipherbyname(*argv);
-                       if(!evp)
+                       evp_cipher=EVP_get_cipherbyname(*argv);
+                       if(!evp_cipher)
                                {
-                               BIO_printf(bio_err,"%s is an unknown cipher\n",*argv);
+                               evp_md=EVP_get_digestbyname(*argv);
+                               }
+                       if(!evp_cipher && !evp_md)
+                               {
+                               BIO_printf(bio_err,"%s is an unknown cipher or digest\n",*argv);
                                goto end;
                                }
                        doit[D_EVP]=1;
@@ -540,6 +557,7 @@ int MAIN(int argc, char **argv)
                           means all of them should be run) */
                        j--;
                        }
+#ifdef HAVE_FORK
                else if ((argc > 0) && (strcmp(*argv,"-multi") == 0))
                        {
                        argc--;
@@ -555,7 +573,10 @@ int MAIN(int argc, char **argv)
                                BIO_printf(bio_err,"bad multi count\n");
                                goto end;
                                }                               
+                       j--;    /* Otherwise, -mr gets confused with
+                                  an algorithm. */
                        }
+#endif
                else if (argc > 0 && !strcmp(*argv,"-mr"))
                        {
                        mr=1;
@@ -777,7 +798,9 @@ int MAIN(int argc, char **argv)
                        BIO_printf(bio_err,"-evp e          use EVP e.\n");
                        BIO_printf(bio_err,"-decrypt        time decryption instead of encryption (only EVP).\n");
                        BIO_printf(bio_err,"-mr             produce machine readable output.\n");
+#ifdef HAVE_FORK
                        BIO_printf(bio_err,"-multi n        run n benchmarks in parallel.\n");
+#endif
                        goto end;
                        }
                argc--;
@@ -785,8 +808,10 @@ int MAIN(int argc, char **argv)
                j++;
                }
 
+#ifdef HAVE_FORK
        if(multi && do_multi(multi))
                goto show_res;
+#endif
 
        if (j == 0)
                {
@@ -875,9 +900,9 @@ int MAIN(int argc, char **argv)
        do      {
                long i;
                count*=2;
-               Time_F(START,usertime);
+               Time_F(START);
                for (i=count; i; i--)
-                       des_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
+                       DES_ecb_encrypt(buf_as_des_cblock,buf_as_des_cblock,
                                &sch,DES_ENCRYPT);
                d=Time_F(STOP);
                } while (d <3);
@@ -1040,8 +1065,8 @@ int MAIN(int argc, char **argv)
                HMAC_CTX hctx;
 
                HMAC_CTX_init(&hctx);
-               HMAC_Init(&hctx,(unsigned char *)"This is a key...",
-                       16,EVP_md5());
+               HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
+                            16,EVP_md5());
 
                for (j=0; j<SIZE_NUM; j++)
                        {
@@ -1049,7 +1074,7 @@ int MAIN(int argc, char **argv)
                        Time_F(START);
                        for (count=0,run=1; COND(c[D_HMAC][j]); count++)
                                {
-                               HMAC_Init(&hctx,NULL,0,NULL);
+                               HMAC_Init_ex(&hctx,NULL,0,NULL);
                                 HMAC_Update(&hctx,buf,lengths[j]);
                                 HMAC_Final(&hctx,&(hmac[0]),NULL);
                                }
@@ -1217,30 +1242,46 @@ int MAIN(int argc, char **argv)
                {
                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]);
-                       EVP_CIPHER_CTX_init(&ctx);
-                       if(decrypt)
-                               EVP_DecryptInit_ex(&ctx,evp,NULL,key16,iv);
-                       else
-                               EVP_EncryptInit_ex(&ctx,evp,NULL,key16,iv);
-                               
-                       Time_F(START);
-                       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
+                       if (evp_cipher)
+                               {
+                               EVP_CIPHER_CTX ctx;
+                               int outl;
+
+                               names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);
+                               print_message(names[D_EVP],save_count,
+                                       lengths[j]);
+
+                               EVP_CIPHER_CTX_init(&ctx);
+                               if(decrypt)
+                                       EVP_DecryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
+                               else
+                                       EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv);
+
+                               Time_F(START);
+                               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_ex(&ctx,buf,&outl);
+                               else
+                                       EVP_EncryptFinal_ex(&ctx,buf,&outl);
+                               d=Time_F(STOP);
+                               }
+                       if (evp_md)
+                               {
+                               names[D_EVP]=OBJ_nid2ln(evp_md->type);
+                               print_message(names[D_EVP],save_count,
+                                       lengths[j]);
+
+                               Time_F(START);
                                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_ex(&ctx,buf,&outl);
-                       else
-                               EVP_EncryptFinal_ex(&ctx,buf,&outl);
-                       d=Time_F(STOP);
+                                       EVP_Digest(buf,lengths[j],&(md[0]),NULL,evp_md,NULL);
+
+                               d=Time_F(STOP);
+                               }
                        print_result(D_EVP,j,count,d);
                        }
                }
@@ -1423,7 +1464,9 @@ int MAIN(int argc, char **argv)
                }
        if (rnd_fake) RAND_cleanup();
 #endif
+#ifdef HAVE_FORK
 show_res:
+#endif
        if(!mr)
                {
                fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_VERSION));
@@ -1458,7 +1501,7 @@ show_res:
 #endif
 #ifdef HZ
 #define as_string(s) (#s)
-               printf("HZ=%g", HZ);
+               printf("HZ=%g", (double)HZ);
 # ifdef _SC_CLK_TCK
                printf(" [sysconf value]");
 # endif
@@ -1635,6 +1678,7 @@ static char *sstrsep(char **string, const char *delim)
     return token;
     }
 
+#ifdef HAVE_FORK
 static int do_multi(int multi)
        {
        int n;
@@ -1767,4 +1811,4 @@ static int do_multi(int multi)
                }
        return 1;
        }
-
+#endif