Merge the common code of testing digest speed, and make it reuse
existing context. Context creation can be heavy operation, and it's
speed depends on if engine is used or not. As we are measuring the
digest speed, the context creation overhead should not be included
like hmac tests do.

This also adds test for hmac-sha1 speed.
---
 apps/speed.c |  243 +++++++++++++++++++++-------------------------------------
 1 files changed, 86 insertions(+), 157 deletions(-)

diff --git a/apps/speed.c b/apps/speed.c
index 539bfff..f64289e 100644
--- a/apps/speed.c
+++ b/apps/speed.c
@@ -214,7 +214,7 @@ static void print_result(int alg,int run_no,int 
count,double time_used);
 static int do_multi(int multi);
 #endif
 
-#define ALGOR_NUM      29
+#define ALGOR_NUM      30
 #define SIZE_NUM       5
 #define RSA_NUM                4
 #define DSA_NUM                3
@@ -229,9 +229,11 @@ static const char *names[ALGOR_NUM]={
   "aes-128 cbc","aes-192 cbc","aes-256 cbc",
   "camellia-128 cbc","camellia-192 cbc","camellia-256 cbc",
   "evp","sha256","sha512","whirlpool",
-  "aes-128 ige","aes-192 ige","aes-256 ige"};
+  "aes-128 ige","aes-192 ige","aes-256 ige","hmac(sha1)"};
 static double results[ALGOR_NUM][SIZE_NUM];
 static int lengths[SIZE_NUM]={16,64,256,1024,8*1024};
+static unsigned char *buf=NULL,*buf2=NULL;
+static long c[ALGOR_NUM][SIZE_NUM];
 #ifndef OPENSSL_NO_RSA
 static double rsa_results[RSA_NUM][2];
 #endif
@@ -329,6 +331,66 @@ static void *KDF1_SHA1(const void *in, size_t inlen, void 
*out, size_t *outlen)
        }
 #endif /* OPENSSL_NO_ECDH */
 
+#ifndef SIGALRM
+#define COND(d)        (count < (d))
+#else
+#define COND(c)        (run)
+#endif /* SIGALRM */
+
+static void Test_Digest(int digest, const EVP_MD *type)
+{
+       unsigned char md[EVP_MAX_MD_SIZE];
+       int j, count;
+       double d=0.0;
+       EVP_MD_CTX ctx;
+
+       EVP_MD_CTX_init(&ctx);
+       EVP_MD_CTX_set_flags(&ctx,EVP_MD_CTX_FLAG_ONESHOT);
+
+       for (j=0; j<SIZE_NUM; j++)
+               {
+               print_message(names[digest],c[digest][j],lengths[j]);
+               Time_F(START);
+               for (count=0,run=1; COND(c[digest][j]); count++)
+                       {
+                       EVP_DigestInit_ex(&ctx, type, NULL);
+                       EVP_DigestUpdate(&ctx, buf, (unsigned long)lengths[j]);
+                       EVP_DigestFinal_ex(&ctx, md, NULL);
+                       }
+               d=Time_F(STOP);
+               print_result(digest,j,count,d);
+               }
+
+       EVP_MD_CTX_cleanup(&ctx);
+}
+
+static void Test_HMAC(int digest, const EVP_MD *type)
+{
+       unsigned char md[EVP_MAX_MD_SIZE];
+       HMAC_CTX hctx;
+       int j, count;
+       double d=0.0;
+
+       HMAC_CTX_init(&hctx);
+       HMAC_CTX_set_flags(&hctx, EVP_MD_CTX_FLAG_ONESHOT);
+       HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
+               16,type, NULL);
+
+       for (j=0; j<SIZE_NUM; j++)
+               {
+               print_message(names[digest],c[digest][j],lengths[j]);
+               Time_F(START);
+               for (count=0,run=1; COND(c[digest][j]); count++)
+                       {
+                       HMAC_Init_ex(&hctx,NULL,0,NULL,NULL);
+                       HMAC_Update(&hctx,buf,lengths[j]);
+                       HMAC_Final(&hctx,md,NULL);
+                       }
+               d=Time_F(STOP);
+               print_result(digest,j,count,d);
+               }
+       HMAC_CTX_cleanup(&hctx);
+}
 
 int MAIN(int, char **);
 
@@ -337,7 +399,6 @@ int MAIN(int argc, char **argv)
 #ifndef OPENSSL_NO_ENGINE
        ENGINE *e = NULL;
 #endif
-       unsigned char *buf=NULL,*buf2=NULL;
        int mret=1;
        long count=0,save_count=0;
        int i,j,k;
@@ -348,34 +409,6 @@ int MAIN(int argc, char **argv)
        unsigned rsa_num;
 #endif
        unsigned char md[EVP_MAX_MD_SIZE];
-#ifndef OPENSSL_NO_MD2
-       unsigned char md2[MD2_DIGEST_LENGTH];
-#endif
-#ifndef OPENSSL_NO_MDC2
-       unsigned char mdc2[MDC2_DIGEST_LENGTH];
-#endif
-#ifndef OPENSSL_NO_MD4
-       unsigned char md4[MD4_DIGEST_LENGTH];
-#endif
-#ifndef OPENSSL_NO_MD5
-       unsigned char md5[MD5_DIGEST_LENGTH];
-       unsigned char hmac[MD5_DIGEST_LENGTH];
-#endif
-#ifndef OPENSSL_NO_SHA
-       unsigned char sha[SHA_DIGEST_LENGTH];
-#ifndef OPENSSL_NO_SHA256
-       unsigned char sha256[SHA256_DIGEST_LENGTH];
-#endif
-#ifndef OPENSSL_NO_SHA512
-       unsigned char sha512[SHA512_DIGEST_LENGTH];
-#endif
-#endif
-#ifndef OPENSSL_NO_WHIRLPOOL
-       unsigned char whirlpool[WHIRLPOOL_DIGEST_LENGTH];
-#endif
-#ifndef OPENSSL_NO_RIPEMD
-       unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
-#endif
 #ifndef OPENSSL_NO_RC4
        RC4_KEY rc4_ks;
 #endif
@@ -473,8 +506,8 @@ int MAIN(int argc, char **argv)
 #define D_IGE_128_AES   26
 #define D_IGE_192_AES   27
 #define D_IGE_256_AES   28
+#define D_HMAC_SHA1    29
        double d=0.0;
-       long c[ALGOR_NUM][SIZE_NUM];
 #define        R_DSA_512       0
 #define        R_DSA_1024      1
 #define        R_DSA_2048      2
@@ -783,6 +816,8 @@ int MAIN(int argc, char **argv)
                                                        doit[D_SHA256]=1,
                                                        doit[D_SHA512]=1;
                else
+                       if (strcmp(*argv,"hmac-sha1") == 0) doit[D_HMAC_SHA1]=1;
+               else
 #ifndef OPENSSL_NO_SHA256
                        if (strcmp(*argv,"sha256") == 0) doit[D_SHA256]=1;
                else
@@ -1000,6 +1035,9 @@ int MAIN(int argc, char **argv)
 #endif
 #ifndef OPENSSL_NO_SHA1
                        BIO_printf(bio_err,"sha1     ");
+#ifndef OPENSSL_NO_HMAC
+                       BIO_printf(bio_err,"hmac-sha1 ");
+#endif
 #endif
 #ifndef OPENSSL_NO_SHA256
                        BIO_printf(bio_err,"sha256   ");
@@ -1270,6 +1308,7 @@ int MAIN(int argc, char **argv)
        c[D_IGE_128_AES][0]=count;
        c[D_IGE_192_AES][0]=count;
        c[D_IGE_256_AES][0]=count;
+       c[D_HMAC_SHA1][0]=count;
 
        for (i=1; i<SIZE_NUM; i++)
                {
@@ -1283,6 +1322,7 @@ int MAIN(int argc, char **argv)
                c[D_SHA256][i]=c[D_SHA256][0]*4*lengths[0]/lengths[i];
                c[D_SHA512][i]=c[D_SHA512][0]*4*lengths[0]/lengths[i];
                c[D_WHIRLPOOL][i]=c[D_WHIRLPOOL][0]*4*lengths[0]/lengths[i];
+               c[D_HMAC_SHA1][i]=c[D_HMAC_SHA1][0]*4*lengths[0]/lengths[i];
                }
        for (i=1; i<SIZE_NUM; i++)
                {
@@ -1457,15 +1497,11 @@ int MAIN(int argc, char **argv)
                }
 #endif
 
-#define COND(d)        (count < (d))
-#define COUNT(d) (d)
 #else
 /* not worth fixing */
 # error "You cannot disable DES on systems without SIGALRM."
 #endif /* OPENSSL_NO_DES */
 #else
-#define COND(c)        (run)
-#define COUNT(d) (count)
 #ifndef _WIN32
        signal(SIGALRM,sig_done);
 #endif
@@ -1473,161 +1509,54 @@ int MAIN(int argc, char **argv)
 
 #ifndef OPENSSL_NO_MD2
        if (doit[D_MD2])
-               {
-               for (j=0; j<SIZE_NUM; j++)
-                       {
-                       print_message(names[D_MD2],c[D_MD2][j],lengths[j]);
-                       Time_F(START);
-                       for (count=0,run=1; COND(c[D_MD2][j]); count++)
-                               EVP_Digest(buf,(unsigned 
long)lengths[j],&(md2[0]),NULL,EVP_md2(),NULL);
-                       d=Time_F(STOP);
-                       print_result(D_MD2,j,count,d);
-                       }
-               }
+               Test_Digest(D_MD2, EVP_md2());
 #endif
 #ifndef OPENSSL_NO_MDC2
        if (doit[D_MDC2])
-               {
-               for (j=0; j<SIZE_NUM; j++)
-                       {
-                       print_message(names[D_MDC2],c[D_MDC2][j],lengths[j]);
-                       Time_F(START);
-                       for (count=0,run=1; COND(c[D_MDC2][j]); count++)
-                               EVP_Digest(buf,(unsigned 
long)lengths[j],&(mdc2[0]),NULL,EVP_mdc2(),NULL);
-                       d=Time_F(STOP);
-                       print_result(D_MDC2,j,count,d);
-                       }
-               }
+               Test_Digest(D_MDC2, EVP_mdc2());
 #endif
 
 #ifndef OPENSSL_NO_MD4
        if (doit[D_MD4])
-               {
-               for (j=0; j<SIZE_NUM; j++)
-                       {
-                       print_message(names[D_MD4],c[D_MD4][j],lengths[j]);
-                       Time_F(START);
-                       for (count=0,run=1; COND(c[D_MD4][j]); count++)
-                               EVP_Digest(&(buf[0]),(unsigned 
long)lengths[j],&(md4[0]),NULL,EVP_md4(),NULL);
-                       d=Time_F(STOP);
-                       print_result(D_MD4,j,count,d);
-                       }
-               }
+               Test_Digest(D_MD4, EVP_md4());
 #endif
 
 #ifndef OPENSSL_NO_MD5
        if (doit[D_MD5])
-               {
-               for (j=0; j<SIZE_NUM; j++)
-                       {
-                       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++)
-                               EVP_Digest(&(buf[0]),(unsigned 
long)lengths[j],&(md5[0]),NULL,EVP_get_digestbyname("md5"),NULL);
-                       d=Time_F(STOP);
-                       print_result(D_MD5,j,count,d);
-                       }
-               }
+               Test_Digest(D_MD5, EVP_md5());
 #endif
 
 #if !defined(OPENSSL_NO_MD5) && !defined(OPENSSL_NO_HMAC)
        if (doit[D_HMAC])
-               {
-               HMAC_CTX hctx;
-
-               HMAC_CTX_init(&hctx);
-               HMAC_Init_ex(&hctx,(unsigned char *)"This is a key...",
-                       16,EVP_md5(), NULL);
-
-               for (j=0; j<SIZE_NUM; j++)
-                       {
-                       print_message(names[D_HMAC],c[D_HMAC][j],lengths[j]);
-                       Time_F(START);
-                       for (count=0,run=1; COND(c[D_HMAC][j]); count++)
-                               {
-                               HMAC_Init_ex(&hctx,NULL,0,NULL,NULL);
-                               HMAC_Update(&hctx,buf,lengths[j]);
-                               HMAC_Final(&hctx,&(hmac[0]),NULL);
-                               }
-                       d=Time_F(STOP);
-                       print_result(D_HMAC,j,count,d);
-                       }
-               HMAC_CTX_cleanup(&hctx);
-               }
+               Test_HMAC(D_HMAC, EVP_md5());
+#endif
+#if !defined(OPENSSL_NO_SHA1) && !defined(OPENSSL_NO_HMAC)
+       if (doit[D_HMAC_SHA1])
+               Test_HMAC(D_HMAC_SHA1, EVP_sha1());
 #endif
 #ifndef OPENSSL_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);
-                       for (count=0,run=1; COND(c[D_SHA1][j]); count++)
-                               EVP_Digest(buf,(unsigned 
long)lengths[j],&(sha[0]),NULL,EVP_sha1(),NULL);
-                       d=Time_F(STOP);
-                       print_result(D_SHA1,j,count,d);
-                       }
-               }
+               Test_Digest(D_SHA1, EVP_sha1());
 
 #ifndef OPENSSL_NO_SHA256
        if (doit[D_SHA256])
-               {
-               for (j=0; j<SIZE_NUM; j++)
-                       {
-                       
print_message(names[D_SHA256],c[D_SHA256][j],lengths[j]);
-                       Time_F(START);
-                       for (count=0,run=1; COND(c[D_SHA256][j]); count++)
-                               SHA256(buf,lengths[j],sha256);
-                       d=Time_F(STOP);
-                       print_result(D_SHA256,j,count,d);
-                       }
-               }
+               Test_Digest(D_SHA256, EVP_sha256());
 #endif
 
 #ifndef OPENSSL_NO_SHA512
        if (doit[D_SHA512])
-               {
-               for (j=0; j<SIZE_NUM; j++)
-                       {
-                       
print_message(names[D_SHA512],c[D_SHA512][j],lengths[j]);
-                       Time_F(START);
-                       for (count=0,run=1; COND(c[D_SHA512][j]); count++)
-                               SHA512(buf,lengths[j],sha512);
-                       d=Time_F(STOP);
-                       print_result(D_SHA512,j,count,d);
-                       }
-               }
+               Test_Digest(D_SHA512, EVP_sha512());
 #endif
 #endif
 
 #ifndef OPENSSL_NO_WHIRLPOOL
        if (doit[D_WHIRLPOOL])
-               {
-               for (j=0; j<SIZE_NUM; j++)
-                       {
-                       
print_message(names[D_WHIRLPOOL],c[D_WHIRLPOOL][j],lengths[j]);
-                       Time_F(START);
-                       for (count=0,run=1; COND(c[D_WHIRLPOOL][j]); count++)
-                               WHIRLPOOL(buf,lengths[j],whirlpool);
-                       d=Time_F(STOP);
-                       print_result(D_WHIRLPOOL,j,count,d);
-                       }
-               }
+               Test_Digest(D_WHIRLPOOL, EVP_whirlpool());
 #endif
 
 #ifndef OPENSSL_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);
-                       for (count=0,run=1; COND(c[D_RMD160][j]); count++)
-                               EVP_Digest(buf,(unsigned 
long)lengths[j],&(rmd160[0]),NULL,EVP_ripemd160(),NULL);
-                       d=Time_F(STOP);
-                       print_result(D_RMD160,j,count,d);
-                       }
-               }
+               Test_Digest(D_RMD160, EVP_ripemd160());
 #endif
 #ifndef OPENSSL_NO_RC4
        if (doit[D_RC4])
-- 
1.7.0.4

______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
Development Mailing List                       [email protected]
Automated List Manager                           [email protected]

Reply via email to