apps/speed.c: add multi-block benchmark.
[openssl.git] / apps / speed.c
index 619269bc694644e1259486a6347cf45c8124cdad..6201a84985af9612d09936c402a46a5b94c03404 100644 (file)
@@ -229,7 +229,7 @@ static int do_multi(int multi);
 #define ALGOR_NUM      30
 #define SIZE_NUM       5
 #define PRIME_NUM      3
-#define RSA_NUM                4
+#define RSA_NUM                7
 #define DSA_NUM                3
 
 #define EC_NUM       16
@@ -357,6 +357,7 @@ static void *KDF1_SHA1(const void *in, size_t inlen, void *out, size_t *outlen)
        }
 #endif /* OPENSSL_NO_ECDH */
 
+static void multiblock_speed(const EVP_CIPHER *evp_cipher);
 
 int MAIN(int, char **);
 
@@ -512,7 +513,10 @@ int MAIN(int argc, char **argv)
 #define        R_RSA_512       0
 #define        R_RSA_1024      1
 #define        R_RSA_2048      2
-#define        R_RSA_4096      3
+#define        R_RSA_3072      3
+#define        R_RSA_4096      4
+#define        R_RSA_7680      5
+#define        R_RSA_15360     6
 
 #define R_EC_P160    0
 #define R_EC_P192    1 
@@ -534,12 +538,14 @@ int MAIN(int argc, char **argv)
 #ifndef OPENSSL_NO_RSA
        RSA *rsa_key[RSA_NUM];
        long rsa_c[RSA_NUM][2];
-       static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,4096};
+       static unsigned int rsa_bits[RSA_NUM]={512,1024,2048,3072,4096,7680,15360};
        static unsigned char *rsa_data[RSA_NUM]=
-               {test512,test1024,test2048,test4096};
+               {test512,test1024,test2048,test3072,test4096,test7680,test15360};
        static int rsa_data_length[RSA_NUM]={
                sizeof(test512),sizeof(test1024),
-               sizeof(test2048),sizeof(test4096)};
+               sizeof(test2048),sizeof(test3072),
+               sizeof(test4096),sizeof(test7680),
+               sizeof(test15360)};
 #endif
 #ifndef OPENSSL_NO_DSA
        DSA *dsa_key[DSA_NUM];
@@ -636,6 +642,7 @@ int MAIN(int argc, char **argv)
 #ifndef NO_FORK
        int multi=0;
 #endif
+       int multiblock=0;
 
 #ifndef TIMES
        usertime=-1;
@@ -786,6 +793,11 @@ int MAIN(int argc, char **argv)
                        j--;    /* Otherwise, -mr gets confused with
                                   an algorithm. */
                        }
+               else if (argc > 0 && !strcmp(*argv,"-mb"))
+                       {
+                       multiblock=1;
+                       j--;
+                       }
                else
 #ifndef OPENSSL_NO_MD2
                if      (strcmp(*argv,"md2") == 0) doit[D_MD2]=1;
@@ -883,7 +895,10 @@ int MAIN(int argc, char **argv)
                else if (strcmp(*argv,"rsa512") == 0) rsa_doit[R_RSA_512]=2;
                else if (strcmp(*argv,"rsa1024") == 0) rsa_doit[R_RSA_1024]=2;
                else if (strcmp(*argv,"rsa2048") == 0) rsa_doit[R_RSA_2048]=2;
+               else if (strcmp(*argv,"rsa3072") == 0) rsa_doit[R_RSA_3072]=2;
                else if (strcmp(*argv,"rsa4096") == 0) rsa_doit[R_RSA_4096]=2;
+               else if (strcmp(*argv,"rsa7680") == 0) rsa_doit[R_RSA_7680]=2;
+               else if (strcmp(*argv,"rsa15360") == 0) rsa_doit[R_RSA_15360]=2;
                else
 #ifndef OPENSSL_NO_RC2
                     if (strcmp(*argv,"rc2-cbc") == 0) doit[D_CBC_RC2]=1;
@@ -953,7 +968,10 @@ int MAIN(int argc, char **argv)
                        rsa_doit[R_RSA_512]=1;
                        rsa_doit[R_RSA_1024]=1;
                        rsa_doit[R_RSA_2048]=1;
+                       rsa_doit[R_RSA_3072]=1;
                        rsa_doit[R_RSA_4096]=1;
+                       rsa_doit[R_RSA_7680]=1;
+                       rsa_doit[R_RSA_15360]=1;
                        }
                else
 #endif
@@ -1103,7 +1121,8 @@ int MAIN(int argc, char **argv)
                        BIO_printf(bio_err,"\n");
 
 #ifndef OPENSSL_NO_RSA
-                       BIO_printf(bio_err,"rsa512   rsa1024  rsa2048  rsa4096\n");
+                       BIO_printf(bio_err,"rsa512   rsa1024  rsa2048  rsa3072  rsa4096\n");
+                       BIO_printf(bio_err,"rsa7680  rsa15360\n");
 #endif
 
 #ifndef OPENSSL_NO_DSA
@@ -1981,6 +2000,19 @@ int MAIN(int argc, char **argv)
 
        if (doit[D_EVP])
                {
+#ifdef EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK
+               if (multiblock && evp_cipher)
+                       {
+                       if (!(EVP_CIPHER_flags(evp_cipher)&EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK))
+                               {
+                               fprintf(stderr,"%s is not multi-block capable\n",OBJ_nid2ln(evp_cipher->nid));
+                               goto end;
+                               }
+                       multiblock_speed(evp_cipher);
+                       mret=0;
+                       goto end;
+                       }
+#endif
                for (j=0; j<SIZE_NUM; j++)
                        {
                        if (evp_cipher)
@@ -2956,4 +2988,108 @@ static int do_multi(int multi)
        return 1;
        }
 #endif
+
+static void multiblock_speed(const EVP_CIPHER *evp_cipher)
+       {
+       static int mblengths[]={8*1024,2*8*1024,4*8*1024,8*8*1024,8*16*1024};
+       int j,count,num=sizeof(lengths)/sizeof(lengths[0]);
+       const char *alg_name;
+       unsigned char *inp,*out,no_key[32],no_iv[16];
+       EVP_CIPHER_CTX ctx;
+       double d=0.0;
+
+       inp = OPENSSL_malloc(mblengths[num-1]);
+       out = OPENSSL_malloc(mblengths[num-1]+1024);
+
+       EVP_CIPHER_CTX_init(&ctx);
+       EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,no_key,no_iv);
+       EVP_CIPHER_CTX_ctrl(&ctx,EVP_CTRL_AEAD_SET_MAC_KEY,sizeof(no_key),no_key);
+       alg_name=OBJ_nid2ln(evp_cipher->nid);
+
+       for (j=0; j<num; j++)
+               {
+               print_message(alg_name,0,mblengths[j]);
+               Time_F(START);
+               for (count=0,run=1; run && count<0x7fffffff; count++)
+                       {
+                       unsigned char aad[13];
+                       EVP_CTRL_TLS1_1_MULTIBLOCK_PARAM mb_param = {NULL,aad,sizeof(aad),0};
+                       size_t len = mblengths[j];
+                       int packlen;
+
+                       aad[8] = 23;
+                       aad[9] = 3;
+                       aad[10] = 2;
+                       aad[11] = 0;
+                       aad[12] = 0;
+                       mb_param.out = NULL;
+                       mb_param.inp = aad;
+                       mb_param.len = len;
+                       mb_param.interleave = 8;
+
+                       packlen=EVP_CIPHER_CTX_ctrl(&ctx,
+                                       EVP_CTRL_TLS1_1_MULTIBLOCK_AAD,
+                                       sizeof(mb_param),&mb_param);
+
+                       if (packlen>0)
+                               {
+                               mb_param.out = out;
+                               mb_param.inp = inp;
+                               mb_param.len = len;
+                               EVP_CIPHER_CTX_ctrl(&ctx,
+                                       EVP_CTRL_TLS1_1_MULTIBLOCK_ENCRYPT,
+                                       sizeof(mb_param),&mb_param);
+                               }
+                       else
+                               {
+                               int pad;
+
+                               RAND_bytes(out,16);
+                               len+=16;
+                               aad[11] = len>>8;
+                               aad[12] = len;
+                               pad=EVP_CIPHER_CTX_ctrl(&ctx,
+                                       EVP_CTRL_AEAD_TLS1_AAD,13,aad);
+                               EVP_Cipher(&ctx,out,inp,len+pad);
+                               }
+                       }
+               d=Time_F(STOP);
+               BIO_printf(bio_err,mr ? "+R:%d:%s:%f\n"
+                       : "%d %s's in %.2fs\n",count,"evp",d);
+               results[D_EVP][j]=((double)count)/d*mblengths[j];
+               }
+
+       if (mr)
+               {
+               fprintf(stdout,"+H");
+               for (j=0; j<num; j++)
+                       fprintf(stdout,":%d",mblengths[j]);
+               fprintf(stdout,"\n");
+               fprintf(stdout,"+F:%d:%s",D_EVP,alg_name);
+               for (j=0; j<num; j++)
+                       fprintf(stdout,":%.2f",results[D_EVP][j]);
+               fprintf(stdout,"\n");
+               }
+       else
+               {
+               fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n"); 
+               fprintf(stdout,"type                    ");
+               for (j=0;  j<num; j++)
+                       fprintf(stdout,"%7d bytes",mblengths[j]);
+               fprintf(stdout,"\n");
+               fprintf(stdout,"%-24s",alg_name);
+
+               for (j=0; j<num; j++)
+                       {
+                       if (results[D_EVP][j] > 10000)
+                               fprintf(stdout," %11.2fk",results[D_EVP][j]/1e3);
+                       else
+                               fprintf(stdout," %11.2f ",results[D_EVP][j]);
+                       }
+               fprintf(stdout,"\n");
+               }
+
+       OPENSSL_free(inp);
+       OPENSSL_free(out);
+       }
 #endif