More Win32 fixes and upsdate INSTALL.W32 documentation.
[openssl.git] / apps / speed.c
index e0aff278f5641dbb756ec9b216ddf91a31f8c645..4a337be0ae753edff6c9896ca619504d070e355b 100644 (file)
@@ -1,5 +1,5 @@
 /* apps/speed.c */
-/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
  * This package is an SSL implementation written
@@ -60,8 +60,8 @@
 
 #undef SECONDS
 #define SECONDS                3       
-#define RSA_SECONDS    10      
-#define DSA_SECONDS    10      
+#define RSA_SECONDS    10
+#define DSA_SECONDS    10
 
 /* 11-Sep-92 Andrew Daviel   Support for Silicon Graphics IRIX added */
 /* 06-Apr-92 Luke Brennan    Support for VMS and add extra signal calls */
@@ -73,8 +73,9 @@
 #include <stdlib.h>
 #include <signal.h>
 #include <string.h>
+#include <math.h>
 #include "apps.h"
-#ifdef WIN16
+#ifdef NO_STDIO
 #define APPS_WIN16
 #endif
 #include "crypto.h"
@@ -106,7 +107,8 @@ struct tms {
 #include <sys/timeb.h>
 #endif
 
-#ifdef sun
+#if defined(sun) || defined(__ultrix)
+#define _POSIX_SOURCE
 #include <limits.h>
 #include <sys/param.h>
 #endif
@@ -122,13 +124,21 @@ struct tms {
 #endif
 #ifndef NO_MD5
 #include "md5.h"
+#include "hmac.h"
+#include "evp.h"
 #endif
-#if !defined(NO_SHA) && !defined(NO_SHA1)
+#ifndef NO_SHA1
 #include "sha.h"
 #endif
+#ifndef NO_RMD160
+#include "ripemd.h"
+#endif
 #ifndef NO_RC4
 #include "rc4.h"
 #endif
+#ifndef NO_RC5
+#include "rc5.h"
+#endif
 #ifndef NO_RC2
 #include "rc2.h"
 #endif
@@ -138,6 +148,9 @@ struct tms {
 #ifndef NO_BLOWFISH
 #include "blowfish.h"
 #endif
+#ifndef NO_CAST
+#include "cast.h"
+#endif
 #ifndef NO_RSA
 #include "rsa.h"
 #endif
@@ -165,7 +178,7 @@ struct tms {
 #endif
 
 #undef BUFSIZE
-#define BUFSIZE        ((long)1024*8)
+#define BUFSIZE        ((long)1024*8+1)
 int run=0;
 
 #ifndef NOPROTO
@@ -248,13 +261,12 @@ char **argv;
        {
        unsigned char *buf=NULL,*buf2=NULL;
        int ret=1;
-#define ALGOR_NUM      11
+#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;
-       unsigned int kk;
 #ifndef NO_MD2
        unsigned char md2[MD2_DIGEST_LENGTH];
 #endif
@@ -263,13 +275,20 @@ char **argv;
 #endif
 #ifndef NO_MD5
        unsigned char md5[MD5_DIGEST_LENGTH];
+       unsigned char hmac[MD5_DIGEST_LENGTH];
 #endif
-#if !defined(NO_SHA) || !defined(NO_SHA1)
+#ifndef NO_SHA1
        unsigned char sha[SHA_DIGEST_LENGTH];
 #endif
+#ifndef NO_RMD160
+       unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
+#endif
 #ifndef NO_RC4
        RC4_KEY rc4_ks;
 #endif
+#ifndef NO_RC5
+       RC5_32_KEY rc5_ks;
+#endif
 #ifndef NO_RC2
        RC2_KEY rc2_ks;
 #endif
@@ -278,6 +297,9 @@ char **argv;
 #endif
 #ifndef NO_BLOWFISH
        BF_KEY bf_ks;
+#endif
+#ifndef NO_CAST
+       CAST_KEY cast_ks;
 #endif
        static unsigned char key16[16]=
                {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
@@ -292,21 +314,24 @@ char **argv;
 #define        D_MD2           0
 #define        D_MDC2          1
 #define        D_MD5           2
-#define        D_SHA           3
+#define        D_HMAC          3
 #define        D_SHA1          4
-#define        D_RC4           5
-#define        D_CBC_DES       6
-#define        D_EDE3_DES      7
-#define        D_CBC_IDEA      8
-#define        D_CBC_RC2       9
-#define        D_CBC_BF        10
+#define D_RMD160       5
+#define        D_RC4           6
+#define        D_CBC_DES       7
+#define        D_EDE3_DES      8
+#define        D_CBC_IDEA      9
+#define        D_CBC_RC2       10
+#define        D_CBC_RC5       11
+#define        D_CBC_BF        12
+#define        D_CBC_CAST      13
        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]={
-               "md2","mdc2","md5","sha","sha1","rc4",
+               "md2","mdc2","md5","hmac(md5)","sha1","rmd160","rc4",
                "des cbc","des ede3","idea cbc",
-               "rc2 cbc","blowfish cbc"};
+               "rc2 cbc","rc5-32/12 cbc","blowfish cbc","cast cbc"};
 #define        R_DSA_512       0
 #define        R_DSA_1024      1
 #define        R_DSA_2048      2
@@ -315,35 +340,41 @@ char **argv;
 #define        R_RSA_2048      2
 #define        R_RSA_4096      3
        RSA *rsa_key[RSA_NUM];
-       DSA *dsa_key[DSA_NUM];
        long rsa_c[RSA_NUM][2];
-       long dsa_c[DSA_NUM][2];
 #ifndef NO_RSA
        double rsa_results[RSA_NUM][2];
-#endif
-#ifndef NO_DSA
-       double dsa_results[DSA_NUM][2];
-#endif
        static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
-       static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
        static unsigned char *rsa_data[RSA_NUM]=
                {test512,test1024,test2048,test4096};
        static int rsa_data_length[RSA_NUM]={
                sizeof(test512),sizeof(test1024),
                sizeof(test2048),sizeof(test4096)};
-       int doit[ALGOR_NUM];
+#endif
+#ifndef NO_DSA
+       DSA *dsa_key[DSA_NUM];
+       long dsa_c[DSA_NUM][2];
+       double dsa_results[DSA_NUM][2];
+       static unsigned int dsa_bits[DSA_NUM]={512,1024,2048};
+#endif
        int rsa_doit[RSA_NUM];
        int dsa_doit[DSA_NUM];
+       int doit[ALGOR_NUM];
        int pr_header=0;
 
        apps_startup();
+#ifdef NO_DSA
+       memset(dsa_key,0,sizeof(dsa_key));
+#endif
 
        if (bio_err == NULL)
                if ((bio_err=BIO_new(BIO_s_file())) != NULL)
-                       BIO_set_fp(bio_err,stderr,BIO_NOCLOSE);
+                       BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
 
+#ifndef NO_RSA
+       memset(rsa_key,0,sizeof(rsa_key));
        for (i=0; i<RSA_NUM; i++)
                rsa_key[i]=NULL;
+#endif
 
        if ((buf=(unsigned char *)Malloc((int)BUFSIZE)) == NULL)
                {
@@ -383,13 +414,23 @@ char **argv;
                        if (strcmp(*argv,"md5") == 0) doit[D_MD5]=1;
                else
 #endif
-#ifndef NO_SHA
-                       if (strcmp(*argv,"sha") == 0) doit[D_SHA]=1;
+#ifndef NO_MD5
+                       if (strcmp(*argv,"hmac") == 0) doit[D_HMAC]=1;
                else
 #endif
 #ifndef NO_SHA1
                        if (strcmp(*argv,"sha1") == 0) doit[D_SHA1]=1;
                else
+                       if (strcmp(*argv,"sha") == 0) doit[D_SHA1]=1;
+               else
+#endif
+#ifndef NO_RMD160
+                       if (strcmp(*argv,"ripemd") == 0) doit[D_RMD160]=1;
+               else
+                       if (strcmp(*argv,"rmd160") == 0) doit[D_RMD160]=1;
+               else
+                       if (strcmp(*argv,"ripemd160") == 0) doit[D_RMD160]=1;
+               else
 #endif
 #ifndef NO_RC4
                        if (strcmp(*argv,"rc4") == 0) doit[D_RC4]=1;
@@ -409,7 +450,7 @@ char **argv;
                        }
                else
 #endif
-                       if (strcmp(*argv,"ssleay") == 0) 
+                       if (strcmp(*argv,"openssl") == 0) 
                        {
                        RSA_set_default_method(RSA_PKCS1_SSLeay());
                        j--;
@@ -429,6 +470,11 @@ char **argv;
                else if (strcmp(*argv,"rc2") == 0) doit[D_CBC_RC2]=1;
                else
 #endif
+#ifndef 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
                     if (strcmp(*argv,"idea-cbc") == 0) doit[D_CBC_IDEA]=1;
                else if (strcmp(*argv,"idea") == 0) doit[D_CBC_IDEA]=1;
@@ -437,6 +483,13 @@ char **argv;
 #ifndef NO_BLOWFISH
                     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
+                    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
@@ -467,17 +520,20 @@ char **argv;
 #endif
                        {
                        BIO_printf(bio_err,"bad value, pick one of\n");
-                       BIO_printf(bio_err,"md2      mdc2       md5      sha      sha1\n");
+                       BIO_printf(bio_err,"md2      mdc2       md5      hmac      sha1    rmd160\n");
 #ifndef NO_IDEA
                        BIO_printf(bio_err,"idea-cbc ");
 #endif
 #ifndef NO_RC2
                        BIO_printf(bio_err,"rc2-cbc  ");
 #endif
-#ifndef NO_RC2
+#ifndef NO_RC5
+                       BIO_printf(bio_err,"rc5-cbc  ");
+#endif
+#ifndef NO_BLOWFISH
                        BIO_printf(bio_err,"bf-cbc");
 #endif
-#if !defined(NO_IDEA) && !defined(NO_RC2) && !defined(NO_BLOWFISH)
+#if !defined(NO_IDEA) && !defined(NO_RC2) && !defined(NO_BLOWFISH) && !defined(NO_RC5)
                        BIO_printf(bio_err,"\n");
 #endif
                        BIO_printf(bio_err,"des-cbc  des-ede3 ");
@@ -527,6 +583,14 @@ char **argv;
                        BIO_printf(bio_err,"internal error loading RSA key number %d\n",i);
                        goto end;
                        }
+#if 0
+               else
+                       {
+                       BIO_printf(bio_err,"Loaded RSA key, %d bit modulus and e= 0x",BN_num_bits(rsa_key[i]->n));
+                       BN_print(bio_err,rsa_key[i]->e);
+                       BIO_printf(bio_err,"\n");
+                       }
+#endif
                }
 #endif
 
@@ -537,9 +601,9 @@ char **argv;
 #endif
 
 #ifndef NO_DES
-       des_set_key((C_Block *)key,sch);
-       des_set_key((C_Block *)key2,sch2);
-       des_set_key((C_Block *)key3,sch3);
+       des_set_key(key,sch);
+       des_set_key(key2,sch2);
+       des_set_key(key3,sch3);
 #endif
 #ifndef NO_IDEA
        idea_set_encrypt_key(key16,&idea_ks);
@@ -550,9 +614,15 @@ char **argv;
 #ifndef NO_RC2
        RC2_set_key(&rc2_ks,16,key16,128);
 #endif
+#ifndef NO_RC5
+       RC5_32_set_key(&rc5_ks,16,key16,12);
+#endif
 #ifndef NO_BLOWFISH
        BF_set_key(&bf_ks,16,key16);
 #endif
+#ifndef NO_CAST
+       CAST_set_key(&cast_ks,16,key16);
+#endif
 
        memset(rsa_c,0,sizeof(rsa_c));
 #ifndef SIGALRM
@@ -563,29 +633,32 @@ char **argv;
                count*=2;
                Time_F(START);
                for (i=count; i; i--)
-                       des_ecb_encrypt((C_Block *)buf,(C_Block *)buf,
-                               &(sch[0]),DES_ENCRYPT);
+                       des_ecb_encrypt(buf,buf, &(sch[0]),DES_ENCRYPT);
                d=Time_F(STOP);
                } while (d <3);
        c[D_MD2][0]=count/10;
        c[D_MDC2][0]=count/10;
        c[D_MD5][0]=count;
-       c[D_SHA][0]=count;
+       c[D_HMAC][0]=count;
        c[D_SHA1][0]=count;
+       c[D_RMD160][0]=count;
        c[D_RC4][0]=count*5;
        c[D_CBC_DES][0]=count;
        c[D_EDE3_DES][0]=count/3;
        c[D_CBC_IDEA][0]=count;
        c[D_CBC_RC2][0]=count;
+       c[D_CBC_RC5][0]=count;
        c[D_CBC_BF][0]=count;
+       c[D_CBC_CAST][0]=count;
 
        for (i=1; i<SIZE_NUM; i++)
                {
                c[D_MD2][i]=c[D_MD2][0]*4*lengths[0]/lengths[i];
                c[D_MDC2][i]=c[D_MDC2][0]*4*lengths[0]/lengths[i];
                c[D_MD5][i]=c[D_MD5][0]*4*lengths[0]/lengths[i];
-               c[D_SHA][i]=c[D_SHA][0]*4*lengths[0]/lengths[i];
+               c[D_HMAC][i]=c[D_HMAC][0]*4*lengths[0]/lengths[i];
                c[D_SHA1][i]=c[D_SHA1][0]*4*lengths[0]/lengths[i];
+               c[D_RMD160][i]=c[D_RMD160][0]*4*lengths[0]/lengths[i];
                }
        for (i=1; i<SIZE_NUM; i++)
                {
@@ -598,7 +671,9 @@ char **argv;
                c[D_EDE3_DES][i]=c[D_EDE3_DES][i-1]*l0/l1;
                c[D_CBC_IDEA][i]=c[D_CBC_IDEA][i-1]*l0/l1;
                c[D_CBC_RC2][i]=c[D_CBC_RC2][i-1]*l0/l1;
+               c[D_CBC_RC5][i]=c[D_CBC_RC5][i-1]*l0/l1;
                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;
                }
        rsa_c[R_RSA_512][0]=count/2000;
        rsa_c[R_RSA_512][1]=count/400;
@@ -610,7 +685,7 @@ char **argv;
                        rsa_doit[i]=0;
                else
                        {
-                       if (rsa_c[i] == 0)
+                       if (rsa_c[i][0] == 0)
                                {
                                rsa_c[i][0]=1;
                                rsa_c[i][1]=20;
@@ -636,7 +711,7 @@ char **argv;
                        }                               
                }
 
-#define COND(d)        (count != (d))
+#define COND(d)        (count < (d))
 #define COUNT(d) (d)
 #else
 #define COND(c)        (run)
@@ -685,7 +760,7 @@ char **argv;
                        print_message(names[D_MD5],c[D_MD5][j],lengths[j]);
                        Time_F(START);
                        for (count=0,run=1; COND(c[D_MD5][j]); count++)
-                               MD5(buf,(unsigned long)lengths[j],&(md5[0]));
+                               MD5(&(buf[0]),(unsigned long)lengths[j],&(md5[0]));
                        d=Time_F(STOP);
                        BIO_printf(bio_err,"%ld %s's in %.2fs\n",
                                count,names[D_MD5],d);
@@ -694,19 +769,27 @@ char **argv;
                }
 #endif
 
-#ifndef NO_SHA
-       if (doit[D_SHA])
+#ifndef NO_MD5
+       if (doit[D_HMAC])
                {
+               HMAC_CTX hctx;
+               HMAC_Init(&hctx,(unsigned char *)"This is a key...",
+                       16,EVP_md5());
+
                for (j=0; j<SIZE_NUM; j++)
                        {
-                       print_message(names[D_SHA],c[D_SHA][j],lengths[j]);
+                       print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
                        Time_F(START);
-                       for (count=0,run=1; COND(c[D_SHA][j]); count++)
-                               SHA(buf,(unsigned long)lengths[j],&(sha[0]));
+                       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);
                        BIO_printf(bio_err,"%ld %s's in %.2fs\n",
-                               count,names[D_SHA],d);
-                       results[D_SHA][j]=((double)count)/d*lengths[j];
+                               count,names[D_HMAC],d);
+                       results[D_HMAC][j]=((double)count)/d*lengths[j];
                        }
                }
 #endif
@@ -726,6 +809,22 @@ char **argv;
                        }
                }
 #endif
+#ifndef NO_RMD160
+       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);
+                       for (count=0,run=1; COND(c[D_RMD160][j]); count++)
+                               RIPEMD160(buf,(unsigned long)lengths[j],&(rmd160[0]));
+                       d=Time_F(STOP);
+                       BIO_printf(bio_err,"%ld %s's in %.2fs\n",
+                               count,names[D_RMD160],d);
+                       results[D_RMD160][j]=((double)count)/d*lengths[j];
+                       }
+               }
+#endif
 #ifndef NO_RC4
        if (doit[D_RC4])
                {
@@ -751,10 +850,8 @@ char **argv;
                        print_message(names[D_CBC_DES],c[D_CBC_DES][j],lengths[j]);
                        Time_F(START);
                        for (count=0,run=1; COND(c[D_CBC_DES][j]); count++)
-                               des_ncbc_encrypt((C_Block *)buf,
-                                       (C_Block *)buf,
-                                       (long)lengths[j],sch,
-                                       (C_Block *)&(iv[0]),DES_ENCRYPT);
+                               des_ncbc_encrypt(buf,buf,lengths[j],sch,
+                                                &(iv[0]),DES_ENCRYPT);
                        d=Time_F(STOP);
                        BIO_printf(bio_err,"%ld %s's in %.2fs\n",
                                count,names[D_CBC_DES],d);
@@ -769,10 +866,9 @@ char **argv;
                        print_message(names[D_EDE3_DES],c[D_EDE3_DES][j],lengths[j]);
                        Time_F(START);
                        for (count=0,run=1; COND(c[D_EDE3_DES][j]); count++)
-                               des_ede3_cbc_encrypt((C_Block *)buf,
-                                       (C_Block *)buf,
-                                       (long)lengths[j],sch,sch2,sch3,
-                                       (C_Block *)&(iv[0]),DES_ENCRYPT);
+                               des_ede3_cbc_encrypt(buf,buf,lengths[j],
+                                                    sch,sch2,sch3,
+                                                    &(iv[0]),DES_ENCRYPT);
                        d=Time_F(STOP);
                        BIO_printf(bio_err,"%ld %s's in %.2fs\n",
                                count,names[D_EDE3_DES],d);
@@ -816,6 +912,24 @@ char **argv;
                        }
                }
 #endif
+#ifndef NO_RC5
+       if (doit[D_CBC_RC5])
+               {
+               for (j=0; j<SIZE_NUM; j++)
+                       {
+                       print_message(names[D_CBC_RC5],c[D_CBC_RC5][j],lengths[j]);
+                       Time_F(START);
+                       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);
+                       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
        if (doit[D_CBC_BF])
                {
@@ -834,14 +948,35 @@ char **argv;
                        }
                }
 #endif
+#ifndef NO_CAST
+       if (doit[D_CBC_CAST])
+               {
+               for (j=0; j<SIZE_NUM; j++)
+                       {
+                       print_message(names[D_CBC_CAST],c[D_CBC_CAST][j],lengths[j]);
+                       Time_F(START);
+                       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);
+                       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];
+                       }
+               }
+#endif
 
        RAND_bytes(buf,30);
 #ifndef NO_RSA
        for (j=0; j<RSA_NUM; j++)
                {
                if (!rsa_doit[j]) continue;
+               rsa_num=RSA_private_encrypt(30,buf,buf2,rsa_key[j],
+                       RSA_PKCS1_PADDING);
                pkey_print_message("private","rsa",rsa_c[j][0],rsa_bits[j],
                        RSA_SECONDS);
+/*             RSA_blinding_on(rsa_key[j],NULL); */
                Time_F(START);
                for (count=0,run=1; COND(rsa_c[j][0]); count++)
                        {
@@ -861,6 +996,9 @@ char **argv;
                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);
                pkey_print_message("public","rsa",rsa_c[j][1],rsa_bits[j],
                        RSA_SECONDS);
                Time_F(START);
@@ -880,6 +1018,7 @@ char **argv;
                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)
                        {
@@ -894,9 +1033,13 @@ char **argv;
 #ifndef NO_DSA
        for (j=0; j<DSA_NUM; j++)
                {
+               unsigned int kk;
+
                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,
+                       &kk,dsa_key[j]);
                pkey_print_message("sign","dsa",dsa_c[j][0],dsa_bits[j],
                        DSA_SECONDS);
                Time_F(START);
@@ -918,6 +1061,8 @@ char **argv;
                dsa_results[j][0]=d/(double)count;
                rsa_count=count;
 
+               rsa_num2=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);
@@ -966,7 +1111,7 @@ char **argv;
 #ifndef NO_BLOWFISH
        printf("%s ",BF_options());
 #endif
-       fprintf(stdout,"%s\n",SSLeay_version(SSLEAY_CFLAGS));
+       fprintf(stdout,"\n%s\n",SSLeay_version(SSLEAY_CFLAGS));
 
        if (pr_header)
                {
@@ -980,7 +1125,7 @@ char **argv;
        for (k=0; k<ALGOR_NUM; k++)
                {
                if (!doit[k]) continue;
-               fprintf(stdout,"%-12s",names[k]);
+               fprintf(stdout,"%-13s",names[k]);
                for (j=0; j<SIZE_NUM; j++)
                        {
                        if (results[k][j] > 10000)
@@ -995,9 +1140,14 @@ char **argv;
        for (k=0; k<RSA_NUM; k++)
                {
                if (!rsa_doit[k]) continue;
-               if (j) { printf("%18ssign    verify\n"," "); j=0; }
-               fprintf(stdout,"rsa %4d bits %8.4fs %8.4fs",
-                       rsa_bits[k],rsa_results[k][0],rsa_results[k][1]);
+               if (j)
+                       {
+                       printf("%18ssign    verify    sign/s verify/s\n"," ");
+                       j=0;
+                       }
+               fprintf(stdout,"rsa %4d 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");
                }
 #endif
@@ -1006,9 +1156,13 @@ char **argv;
        for (k=0; k<DSA_NUM; k++)
                {
                if (!dsa_doit[k]) continue;
-               if (j) { printf("%18ssign    verify\n"," "); j=0; }
-               fprintf(stdout,"dsa %4d bits %8.4fs %8.4fs",
-                       dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);
+               if (j)  {
+                       printf("%18ssign    verify    sign/s verify/s\n"," ");
+                       j=0;
+                       }
+               fprintf(stdout,"dsa %4d 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
@@ -1066,3 +1220,4 @@ int tm;
        num=num;
 #endif
        }
+