Add GCRYCTL_DISABLE_HWF
[libgcrypt.git] / tests / benchmark.c
index ab2aeb2..cf78c76 100644 (file)
@@ -51,6 +51,12 @@ static int cipher_repetitions;
 /* Number of hash repetitions.  */
 static int hash_repetitions;
 
+/* Alignment of the buffers.  */
+static int buffer_alignment;
+
+/* Whether to include the keysetup in the cipher timings.  */
+static int cipher_with_keysetup;
+
 /* Whether fips mode was active at startup.  */
 static int in_fips_mode;
 
@@ -360,7 +366,7 @@ progress_cb (void *cb_data, const char *what, int printchar,
              int current, int total)
 {
   (void)cb_data;
-  
+
   fprintf (stderr, PGM ": progress (%s %c %d %d)\n",
            what, printchar, current, total);
   fflush (stderr);
@@ -502,6 +508,7 @@ cipher_bench ( const char *algoname )
   int keylen, blklen;
   char key[128];
   char *outbuf, *buf;
+  char *raw_outbuf, *raw_buf;
   size_t allocated_buflen, buflen;
   int repetitions;
   static struct { int mode; const char *name; int blocked; } modes[] = {
@@ -537,8 +544,16 @@ cipher_bench ( const char *algoname )
     }
   repetitions *= cipher_repetitions;
 
-  buf = gcry_xmalloc (allocated_buflen);
-  outbuf = gcry_xmalloc (allocated_buflen);
+  buf = raw_buf = gcry_xmalloc (allocated_buflen+15);
+  if (buffer_alignment)
+    while (((size_t)buf & 0x0f))
+      buf++;
+
+  outbuf = raw_outbuf = gcry_xmalloc (allocated_buflen+15);
+  if (buffer_alignment)
+    while (((size_t)outbuf & 0x0f))
+      outbuf++;
+
 
   if (!header_printed)
     {
@@ -606,30 +621,46 @@ cipher_bench ( const char *algoname )
           fprintf (stderr, PGM ": error opening cipher `%s'\n", algoname);
           exit (1);
         }
-      
-      err = gcry_cipher_setkey (hd, key, keylen);
-      if (err)
-      { 
-          fprintf (stderr, "gcry_cipher_setkey failed: %s\n",
-                  gpg_strerror (err));
-          gcry_cipher_close (hd);
-          exit (1);
+
+      if (!cipher_with_keysetup)
+        {
+          err = gcry_cipher_setkey (hd, key, keylen);
+          if (err)
+            {
+              fprintf (stderr, "gcry_cipher_setkey failed: %s\n",
+                       gpg_strerror (err));
+              gcry_cipher_close (hd);
+              exit (1);
+            }
         }
 
       buflen = allocated_buflen;
       if (modes[modeidx].blocked)
         buflen = (buflen / blklen) * blklen;
-      
+
       start_timer ();
       for (i=err=0; !err && i < repetitions; i++)
-        err = gcry_cipher_encrypt ( hd, outbuf, buflen, buf, buflen);
+        {
+          if (cipher_with_keysetup)
+            {
+              err = gcry_cipher_setkey (hd, key, keylen);
+              if (err)
+                {
+                  fprintf (stderr, "gcry_cipher_setkey failed: %s\n",
+                           gpg_strerror (err));
+                  gcry_cipher_close (hd);
+                  exit (1);
+                }
+            }
+          err = gcry_cipher_encrypt ( hd, outbuf, buflen, buf, buflen);
+        }
       stop_timer ();
 
       printf (" %s", elapsed_time ());
       fflush (stdout);
       gcry_cipher_close (hd);
       if (err)
-        { 
+        {
           fprintf (stderr, "gcry_cipher_encrypt failed: %s\n",
                    gpg_strerror (err) );
           exit (1);
@@ -641,25 +672,41 @@ cipher_bench ( const char *algoname )
           fprintf (stderr, PGM ": error opening cipher `%s'/n", algoname);
           exit (1);
         }
-      
-      err = gcry_cipher_setkey (hd, key, keylen);
-      if (err)
-        { 
-          fprintf (stderr, "gcry_cipher_setkey failed: %s\n",
-                   gpg_strerror (err));
-          gcry_cipher_close (hd);
-          exit (1);
+
+      if (!cipher_with_keysetup)
+        {
+          err = gcry_cipher_setkey (hd, key, keylen);
+          if (err)
+            {
+              fprintf (stderr, "gcry_cipher_setkey failed: %s\n",
+                       gpg_strerror (err));
+              gcry_cipher_close (hd);
+              exit (1);
+            }
         }
 
       start_timer ();
       for (i=err=0; !err && i < repetitions; i++)
-        err = gcry_cipher_decrypt ( hd, outbuf, buflen,  buf, buflen);
+        {
+          if (cipher_with_keysetup)
+            {
+              err = gcry_cipher_setkey (hd, key, keylen);
+              if (err)
+                {
+                  fprintf (stderr, "gcry_cipher_setkey failed: %s\n",
+                           gpg_strerror (err));
+                  gcry_cipher_close (hd);
+                  exit (1);
+                }
+            }
+          err = gcry_cipher_decrypt ( hd, outbuf, buflen,  buf, buflen);
+        }
       stop_timer ();
       printf (" %s", elapsed_time ());
       fflush (stdout);
       gcry_cipher_close (hd);
       if (err)
-        { 
+        {
           fprintf (stderr, "gcry_cipher_decrypt failed: %s\n",
                    gpg_strerror (err) );
           exit (1);
@@ -667,8 +714,8 @@ cipher_bench ( const char *algoname )
     }
 
   putchar ('\n');
-  gcry_free (buf);
-  gcry_free (outbuf);
+  gcry_free (raw_buf);
+  gcry_free (raw_outbuf);
 }
 
 
@@ -1032,17 +1079,17 @@ mpi_bench (void)
 
   do_powm (
 "20A94417D4D5EF2B2DA99165C7DC87DADB3979B72961AF90D09D59BA24CB9A10166FDCCC9C659F2B9626EC23F3FA425F564A072BA941B03FA81767CC289E4",
-           "29", 
+           "29",
 "B870187A323F1ECD5B8A0B4249507335A1C4CE8394F38FD76B08C78A42C58F6EA136ACF90DFE8603697B1694A3D81114D6117AC1811979C51C4DD013D52F8"
            );
   do_powm (
            "20A94417D4D5EF2B2DA99165C7DC87DADB3979B72961AF90D09D59BA24CB9A10166FDCCC9C659F2B9626EC23F3FA425F564A072BA941B03FA81767CC289E41071F0246879A442658FBD18C1771571E7073EEEB2160BA0CBFB3404D627069A6CFBD53867AD2D9D40231648000787B5C84176B4336144644AE71A403CA40716",
-           "29", 
+           "29",
            "B870187A323F1ECD5B8A0B4249507335A1C4CE8394F38FD76B08C78A42C58F6EA136ACF90DFE8603697B1694A3D81114D6117AC1811979C51C4DD013D52F8FC4EE4BB446B83E48ABED7DB81CBF5E81DE4759E8D68AC985846D999F96B0D8A80E5C69D272C766AB8A23B40D50A4FA889FBC2BD2624222D8EB297F4BAEF8593847"
            );
   do_powm (
            "20A94417D4D5EF2B2DA99165C7DC87DADB3979B72961AF90D09D59BA24CB9A10166FDCCC9C659F2B9626EC23F3FA425F564A072BA941B03FA81767CC289E41071F0246879A442658FBD18C1771571E7073EEEB2160BA0CBFB3404D627069A6CFBD53867AD2D9D40231648000787B5C84176B4336144644AE71A403CA4071620A94417D4D5EF2B2DA99165C7DC87DADB3979B72961AF90D09D59BA24CB9A10166FDCCC9C659F2B9626EC23F3FA425F564A072BA941B03FA81767CC289E41071F0246879A442658FBD18C1771571E7073EEEB2160BA0CBFB3404D627069A6CFBD53867AD2D9D40231648000787B5C84176B4336144644AE71A403CA40716",
-           "29", 
+           "29",
            "B870187A323F1ECD5B8A0B4249507335A1C4CE8394F38FD76B08C78A42C58F6EA136ACF90DFE8603697B1694A3D81114D6117AC1811979C51C4DD013D52F8FC4EE4BB446B83E48ABED7DB81CBF5E81DE4759E8D68AC985846D999F96B0D8A80E5C69D272C766AB8A23B40D50A4FA889FBC2BD2624222D8EB297F4BAEF8593847B870187A323F1ECD5B8A0B4249507335A1C4CE8394F38FD76B08C78A42C58F6EA136ACF90DFE8603697B1694A3D81114D6117AC1811979C51C4DD013D52F8FC4EE4BB446B83E48ABED7DB81CBF5E81DE4759E8D68AC985846D999F96B0D8A80E5C69D272C766AB8A23B40D50A4FA889FBC2BD2624222D8EB297F4BAEF8593847"
            );
 
@@ -1107,6 +1154,11 @@ main( int argc, char **argv )
               argc--; argv++;
             }
         }
+      else if (!strcmp (*argv, "--cipher-with-keysetup"))
+        {
+          cipher_with_keysetup = 1;
+          argc--; argv++;
+        }
       else if (!strcmp (*argv, "--hash-repetitions"))
         {
           argc--; argv++;
@@ -1116,6 +1168,26 @@ main( int argc, char **argv )
               argc--; argv++;
             }
         }
+      else if (!strcmp (*argv, "--alignment"))
+        {
+          argc--; argv++;
+          if (argc)
+            {
+              buffer_alignment = atoi(*argv);
+              argc--; argv++;
+            }
+        }
+      else if (!strcmp (*argv, "--disable-hwf"))
+        {
+          argc--; argv++;
+          if (argc)
+            {
+              if (gcry_control (GCRYCTL_DISABLE_HWF, *argv, NULL))
+                fprintf (stderr, PGM ": unknown hardware feature `%s'"
+                         " - option ignored\n", *argv);
+              argc--; argv++;
+            }
+        }
       else if (!strcmp (*argv, "--fips"))
         {
           argc--; argv++;
@@ -1127,7 +1199,16 @@ main( int argc, char **argv )
           argc--; argv++;
           with_progress = 1;
         }
-    }          
+    }
+
+  switch (buffer_alignment)
+    {
+    case 0:
+    case 16:
+      break;
+    default:
+      die ("option --alignment not used with a value of 0 or 16\n");
+    }
 
   gcry_control (GCRYCTL_SET_VERBOSITY, (int)verbose);
 
@@ -1154,7 +1235,7 @@ main( int argc, char **argv )
     cipher_repetitions = 1;
   if (hash_repetitions < 1)
     hash_repetitions = 1;
-  
+
   if ( !argc )
     {
       gcry_control (GCRYCTL_ENABLE_QUICK_RANDOM, 0);
@@ -1227,7 +1308,6 @@ main( int argc, char **argv )
 
   if (in_fips_mode && !gcry_fips_mode_active ())
     fprintf (stderr, PGM ": FIPS mode is not anymore active\n");
-  
+
   return 0;
 }
-