tests: Beautify some diagnostics.
authorWerner Koch <wk@gnupg.org>
Sat, 7 Sep 2013 08:06:46 +0000 (10:06 +0200)
committerWerner Koch <wk@gnupg.org>
Thu, 19 Sep 2013 14:43:33 +0000 (16:43 +0200)
* tests/benchmark.c (ecc_bench): Print the key sexp in very verbose
mode.
(main): Add option --pk-count.
* tests/keygen.c: Add Elgamal generation and improved diagnostics.
* tests/t-ed25519.c (check_ed25519): Print running number of tests
done.

Signed-off-by: Werner Koch <wk@gnupg.org>
tests/benchmark.c
tests/keygen.c
tests/t-ed25519.c

index 1fa2676..5d1434a 100644 (file)
@@ -928,6 +928,8 @@ ecc_bench (int iterations, int print_header)
       if (err)
         die ("creating %d bit ECC key failed: %s\n",
              p_size, gcry_strerror (err));
+      if (verbose > 2)
+        show_sexp ("ECC key:\n", key_pair);
 
       pub_key = gcry_sexp_find_token (key_pair, "public-key", 0);
       if (! pub_key)
@@ -961,7 +963,15 @@ ecc_bench (int iterations, int print_header)
           gcry_sexp_release (sig);
           err = gcry_pk_sign (&sig, data, sec_key);
           if (err)
-            die ("signing failed: %s\n", gpg_strerror (err));
+            {
+              if (verbose)
+                {
+                  putc ('\n', stderr);
+                  show_sexp ("signing key:\n", sec_key);
+                  show_sexp ("signed data:\n", data);
+                }
+              die ("signing failed: %s\n", gpg_strerror (err));
+            }
         }
       stop_timer ();
       printf ("   %s", elapsed_time ());
@@ -1065,6 +1075,7 @@ main( int argc, char **argv )
   int use_random_daemon = 0;
   int with_progress = 0;
   int debug = 0;
+  int pk_count = 100;
 
   buffer_alignment = 1;
 
@@ -1152,6 +1163,15 @@ main( int argc, char **argv )
               argc--; argv++;
             }
         }
+      else if (!strcmp (*argv, "--pk-count"))
+        {
+          argc--; argv++;
+          if (argc)
+            {
+              pk_count = atoi(*argv);
+              argc--; argv++;
+            }
+        }
       else if (!strcmp (*argv, "--alignment"))
         {
           argc--; argv++;
@@ -1225,9 +1245,9 @@ main( int argc, char **argv )
       putchar ('\n');
       cipher_bench (NULL);
       putchar ('\n');
-      rsa_bench (100, 1, no_blinding);
-      dsa_bench (100, 0);
-      ecc_bench (100, 0);
+      rsa_bench (pk_count, 1, no_blinding);
+      dsa_bench (pk_count, 0);
+      ecc_bench (pk_count, 0);
       putchar ('\n');
       mpi_bench ();
       putchar ('\n');
@@ -1269,17 +1289,17 @@ main( int argc, char **argv )
   else if ( !strcmp (*argv, "rsa"))
     {
         gcry_control (GCRYCTL_ENABLE_QUICK_RANDOM, 0);
-        rsa_bench (100, 1, no_blinding);
+        rsa_bench (pk_count, 1, no_blinding);
     }
   else if ( !strcmp (*argv, "dsa"))
     {
         gcry_control (GCRYCTL_ENABLE_QUICK_RANDOM, 0);
-        dsa_bench (100, 1);
+        dsa_bench (pk_count, 1);
     }
   else if ( !strcmp (*argv, "ecc"))
     {
         gcry_control (GCRYCTL_ENABLE_QUICK_RANDOM, 0);
-        ecc_bench (100, 1);
+        ecc_bench (pk_count, 1);
     }
   else
     {
index eed62e1..b955116 100644 (file)
 #include "../src/gcrypt-int.h"
 
 
+#define PGM "keygen"
+
+#define xmalloc(a)    gcry_xmalloc ((a))
+#define xcalloc(a,b)  gcry_xcalloc ((a),(b))
+#define xstrdup(a)    gcry_xstrdup ((a))
+#define xfree(a)      gcry_free ((a))
+#define pass()        do { ; } while (0)
+
 
 static int verbose;
 static int debug;
 static int error_count;
 
+
 static void
-show ( const char *format, ... )
+die (const char *format, ...)
 {
-    va_list arg_ptr ;
+  va_list arg_ptr ;
 
-    va_start( arg_ptr, format ) ;
-    vfprintf (stderr, format, arg_ptr );
-    va_end(arg_ptr);
+  fflush (stdout);
+  fprintf (stderr, "%s: ", PGM);
+  va_start( arg_ptr, format ) ;
+  vfprintf (stderr, format, arg_ptr );
+  va_end(arg_ptr);
+  if (*format && format[strlen(format)-1] != '\n')
+    putc ('\n', stderr);
+  exit (1);
 }
 
 static void
-fail ( const char *format, ... )
+fail (const char *format, ...)
 {
-    va_list arg_ptr ;
+  va_list arg_ptr;
 
-    va_start( arg_ptr, format ) ;
-    vfprintf (stderr, format, arg_ptr );
-    va_end(arg_ptr);
-    error_count++;
+  fflush (stdout);
+  fprintf (stderr, "%s: ", PGM);
+  /* if (wherestr) */
+  /*   fprintf (stderr, "%s: ", wherestr); */
+  va_start (arg_ptr, format);
+  vfprintf (stderr, format, arg_ptr);
+  va_end (arg_ptr);
+  if (*format && format[strlen(format)-1] != '\n')
+    putc ('\n', stderr);
+  error_count++;
+  if (error_count >= 50)
+    die ("stopped after 50 errors.");
+}
+
+static void
+show (const char *format, ...)
+{
+  va_list arg_ptr;
+
+  fprintf (stderr, "%s: ", PGM);
+  va_start (arg_ptr, format);
+  vfprintf (stderr, format, arg_ptr);
+  if (*format && format[strlen(format)-1] != '\n')
+    putc ('\n', stderr);
+  va_end (arg_ptr);
 }
 
+
+static void
+show_note (const char *format, ...)
+{
+  va_list arg_ptr;
+
+  if (!verbose && getenv ("srcdir"))
+    fputs ("      ", stderr);  /* To align above "PASS: ".  */
+  else
+    fprintf (stderr, "%s: ", PGM);
+  va_start (arg_ptr, format);
+  vfprintf (stderr, format, arg_ptr);
+  if (*format && format[strlen(format)-1] != '\n')
+    putc ('\n', stderr);
+  va_end (arg_ptr);
+}
+
+
 static void
-die ( const char *format, ... )
+show_sexp (const char *prefix, gcry_sexp_t a)
 {
-    va_list arg_ptr ;
+  char *buf;
+  size_t size;
+
+  fprintf (stderr, "%s: ", PGM);
+  if (prefix)
+    fputs (prefix, stderr);
+  size = gcry_sexp_sprint (a, GCRYSEXP_FMT_ADVANCED, NULL, 0);
+  buf = xmalloc (size);
 
-    va_start( arg_ptr, format ) ;
-    vfprintf (stderr, format, arg_ptr );
-    va_end(arg_ptr);
-    exit (1);
+  gcry_sexp_sprint (a, GCRYSEXP_FMT_ADVANCED, buf, size);
+  fprintf (stderr, "%.*s", (int)size, buf);
+  gcry_free (buf);
 }
 
 
 static void
-print_mpi (const char *text, gcry_mpi_t a)
+show_mpi (const char *prefix, gcry_mpi_t a)
 {
   char *buf;
   void *bufaddr = &buf;
   gcry_error_t rc;
 
+  fprintf (stderr, "%s: ", PGM);
+  if (prefix)
+    fputs (prefix, stderr);
   rc = gcry_mpi_aprint (GCRYMPI_FMT_HEX, bufaddr, NULL, a);
   if (rc)
-    fprintf (stderr, "%s=[error printing number: %s]\n",
-             text, gpg_strerror (rc));
+    fprintf (stderr, "[error printing number: %s]\n",  gpg_strerror (rc));
   else
     {
-      fprintf (stderr, "%s=0x%s\n", text, buf);
+      fprintf (stderr, "%s\n", buf);
       gcry_free (buf);
     }
 }
@@ -103,11 +164,11 @@ check_generated_rsa_key (gcry_sexp_t key, unsigned long expected_e)
       else if (!expected_e)
         {
           if (verbose)
-            print_mpi ("e", e);
+            show_mpi ("public exponent: ", e);
         }
       else if ( gcry_mpi_cmp_ui (e, expected_e))
         {
-          print_mpi ("e", e);
+          show_mpi ("public exponent: ", e);
           fail ("public exponent is not %lu\n", expected_e);
         }
       gcry_sexp_release (list);
@@ -125,68 +186,41 @@ check_generated_rsa_key (gcry_sexp_t key, unsigned long expected_e)
         fail ("gcry_pk_testkey failed: %s\n", gpg_strerror (rc));
       gcry_sexp_release (skey);
     }
+}
 
- }
 
 static void
 check_rsa_keys (void)
 {
   gcry_sexp_t keyparm, key;
   int rc;
-  int i;
-
-  /* Check that DSA generation works and that it can grok the qbits
-     argument. */
-  if (verbose)
-    fprintf (stderr, "creating 5 1024 bit DSA keys\n");
-  for (i=0; i < 5; i++)
-    {
-      rc = gcry_sexp_new (&keyparm,
-                          "(genkey\n"
-                          " (dsa\n"
-                          "  (nbits 4:1024)\n"
-                          " ))", 0, 1);
-      if (rc)
-        die ("error creating S-expression: %s\n", gpg_strerror (rc));
-      rc = gcry_pk_genkey (&key, keyparm);
-      gcry_sexp_release (keyparm);
-      if (rc)
-        die ("error generating DSA key: %s\n", gpg_strerror (rc));
-      gcry_sexp_release (key);
-      if (verbose)
-        fprintf (stderr, "  done\n");
-    }
 
   if (verbose)
-    fprintf (stderr, "creating 1536 bit DSA key\n");
+    show ("creating 1024 bit RSA key\n");
   rc = gcry_sexp_new (&keyparm,
                       "(genkey\n"
-                      " (dsa\n"
-                      "  (nbits 4:1536)\n"
-                      "  (qbits 3:224)\n"
+                      " (rsa\n"
+                      "  (nbits 4:1024)\n"
                       " ))", 0, 1);
   if (rc)
     die ("error creating S-expression: %s\n", gpg_strerror (rc));
   rc = gcry_pk_genkey (&key, keyparm);
   gcry_sexp_release (keyparm);
   if (rc)
-    die ("error generating DSA key: %s\n", gpg_strerror (rc));
-  if (debug)
-    {
-      char buffer[20000];
-      gcry_sexp_sprint (key, GCRYSEXP_FMT_ADVANCED, buffer, sizeof buffer);
-      if (verbose)
-        printf ("=============================\n%s\n"
-                "=============================\n", buffer);
-    }
+    die ("error generating RSA key: %s\n", gpg_strerror (rc));
+  if (verbose > 1)
+    show_sexp ("1024 bit RSA key:\n", key);
+  check_generated_rsa_key (key, 65537);
   gcry_sexp_release (key);
 
+
   if (verbose)
-    fprintf (stderr, "creating 1024 bit RSA key\n");
+    show ("creating 512 bit RSA key with e=257\n");
   rc = gcry_sexp_new (&keyparm,
                       "(genkey\n"
                       " (rsa\n"
-                      "  (nbits 4:1024)\n"
+                      "  (nbits 3:512)\n"
+                      "  (rsa-use-e 3:257)\n"
                       " ))", 0, 1);
   if (rc)
     die ("error creating S-expression: %s\n", gpg_strerror (rc));
@@ -195,17 +229,16 @@ check_rsa_keys (void)
   if (rc)
     die ("error generating RSA key: %s\n", gpg_strerror (rc));
 
-  check_generated_rsa_key (key, 65537);
+  check_generated_rsa_key (key, 257);
   gcry_sexp_release (key);
 
-
   if (verbose)
-    fprintf (stderr, "creating 512 bit RSA key with e=257\n");
+    show ("creating 512 bit RSA key with default e\n");
   rc = gcry_sexp_new (&keyparm,
                       "(genkey\n"
                       " (rsa\n"
                       "  (nbits 3:512)\n"
-                      "  (rsa-use-e 3:257)\n"
+                      "  (rsa-use-e 1:0)\n"
                       " ))", 0, 1);
   if (rc)
     die ("error creating S-expression: %s\n", gpg_strerror (rc));
@@ -214,27 +247,82 @@ check_rsa_keys (void)
   if (rc)
     die ("error generating RSA key: %s\n", gpg_strerror (rc));
 
-  check_generated_rsa_key (key, 257);
+  check_generated_rsa_key (key, 0); /* We don't expect a constant exponent. */
   gcry_sexp_release (key);
+}
+
+
+static void
+check_elg_keys (void)
+{
+  gcry_sexp_t keyparm, key;
+  int rc;
 
   if (verbose)
-    fprintf (stderr, "creating 512 bit RSA key with default e\n");
+    show ("creating 1024 bit Elgamal key\n");
   rc = gcry_sexp_new (&keyparm,
                       "(genkey\n"
-                      " (rsa\n"
-                      "  (nbits 3:512)\n"
-                      "  (rsa-use-e 1:0)\n"
+                      " (elg\n"
+                      "  (nbits 4:1024)\n"
                       " ))", 0, 1);
   if (rc)
     die ("error creating S-expression: %s\n", gpg_strerror (rc));
   rc = gcry_pk_genkey (&key, keyparm);
   gcry_sexp_release (keyparm);
   if (rc)
-    die ("error generating RSA key: %s\n", gpg_strerror (rc));
-
-  check_generated_rsa_key (key, 0); /* We don't expect a constant exponent. */
+    die ("error generating Elgamal key: %s\n", gpg_strerror (rc));
+  if (verbose > 1)
+    show_sexp ("1024 bit Elgamal key:\n", key);
   gcry_sexp_release (key);
+}
+
+
+static void
+check_dsa_keys (void)
+{
+  gcry_sexp_t keyparm, key;
+  int rc;
+  int i;
 
+  /* Check that DSA generation works and that it can grok the qbits
+     argument. */
+  if (verbose)
+    show ("creating 5 1024 bit DSA keys\n");
+  for (i=0; i < 5; i++)
+    {
+      rc = gcry_sexp_new (&keyparm,
+                          "(genkey\n"
+                          " (dsa\n"
+                          "  (nbits 4:1024)\n"
+                          " ))", 0, 1);
+      if (rc)
+        die ("error creating S-expression: %s\n", gpg_strerror (rc));
+      rc = gcry_pk_genkey (&key, keyparm);
+      gcry_sexp_release (keyparm);
+      if (rc)
+        die ("error generating DSA key: %s\n", gpg_strerror (rc));
+      if (!i && verbose > 1)
+        show_sexp ("1024 bit DSA key:\n", key);
+      gcry_sexp_release (key);
+    }
+
+  if (verbose)
+    show ("creating 1536 bit DSA key\n");
+  rc = gcry_sexp_new (&keyparm,
+                      "(genkey\n"
+                      " (dsa\n"
+                      "  (nbits 4:1536)\n"
+                      "  (qbits 3:224)\n"
+                      " ))", 0, 1);
+  if (rc)
+    die ("error creating S-expression: %s\n", gpg_strerror (rc));
+  rc = gcry_pk_genkey (&key, keyparm);
+  gcry_sexp_release (keyparm);
+  if (rc)
+    die ("error generating DSA key: %s\n", gpg_strerror (rc));
+  if (verbose > 1)
+    show_sexp ("1536 bit DSA key:\n", key);
+  gcry_sexp_release (key);
 }
 
 
@@ -285,7 +373,7 @@ check_ecc_keys (void)
   for (testno=0; curves[testno]; testno++)
     {
       if (verbose)
-        fprintf (stderr, "creating ECC key using curve %s\n", curves[testno]);
+        show ("creating ECC key using curve %s\n", curves[testno]);
       rc = gcry_sexp_build (&keyparm, NULL,
                             "(genkey(ecc(curve %s)))", curves[testno]);
       if (rc)
@@ -296,8 +384,11 @@ check_ecc_keys (void)
         die ("error generating ECC key using curve %s: %s\n",
              curves[testno], gpg_strerror (rc));
 
+      if (verbose > 1)
+        show_sexp ("ECC key:\n", key);
+
       if (!strcmp (curves[testno], "Ed25519"))
-        show ("Note: gcry_pk_testkey does not yet work for Ed25519\n");
+        show_note ("note: gcry_pk_testkey does not yet work for Ed25519\n");
       else
         check_generated_ecc_key (key);
 
@@ -314,7 +405,7 @@ check_nonce (void)
   int oops=0;
 
   if (verbose)
-    fprintf (stderr, "checking gcry_create_nonce\n");
+    show ("checking gcry_create_nonce\n");
 
   gcry_create_nonce (a, sizeof a);
   for (i=0; i < 10; i++)
@@ -365,10 +456,49 @@ progress_cb (void *cb_data, const char *what, int printchar,
 int
 main (int argc, char **argv)
 {
-  if (argc > 1 && !strcmp (argv[1], "--verbose"))
-    verbose = 1;
-  else if (argc > 1 && !strcmp (argv[1], "--debug"))
-    verbose = debug = 1;
+  int last_argc = -1;
+  int with_progress = 0;
+
+  if (argc)
+    { argc--; argv++; }
+
+  while (argc && last_argc != argc )
+    {
+      last_argc = argc;
+      if (!strcmp (*argv, "--"))
+        {
+          argc--; argv++;
+          break;
+        }
+      else if (!strcmp (*argv, "--help"))
+        {
+          fputs ("usage: " PGM " [options]\n"
+                 "Options:\n"
+                 "  --verbose       be verbose\n"
+                 "  --debug         flyswatter\n"
+                 "  --progress      print progress indicators\n",
+                 stdout);
+          exit (0);
+        }
+      else if (!strcmp (*argv, "--verbose"))
+        {
+          verbose++;
+          argc--; argv++;
+        }
+      else if (!strcmp (*argv, "--debug"))
+        {
+          verbose += 2;
+          debug++;
+          argc--; argv++;
+        }
+      else if (!strcmp (*argv, "--progress"))
+        {
+          argc--; argv++;
+          with_progress = 1;
+        }
+      else if (!strncmp (*argv, "--", 2))
+        die ("unknown option '%s'", *argv);
+    }
 
   if (!gcry_check_version (GCRYPT_VERSION))
     die ("version mismatch\n");
@@ -378,10 +508,12 @@ main (int argc, char **argv)
     gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 1u , 0);
   /* No valuable keys are create, so we can speed up our RNG. */
   gcry_control (GCRYCTL_ENABLE_QUICK_RANDOM, 0);
-  if (verbose)
-    gcry_set_progress_handler ( progress_cb, NULL );
+  if (with_progress)
+    gcry_set_progress_handler (progress_cb, NULL);
 
   check_rsa_keys ();
+  check_elg_keys ();
+  check_dsa_keys ();
   check_ecc_keys ();
   check_nonce ();
 
index baa6a7a..f816fda 100644 (file)
@@ -32,6 +32,7 @@
 #include "stopwatch.h"
 
 #define PGM "t-ed25519"
+#define N_TESTS 1024
 
 #define my_isascii(c) (!((c) & 0x80))
 #define digitp(p)   (*(p) >= '0' && *(p) <= '9')
@@ -83,7 +84,7 @@ fail (const char *format, ...)
   if (*format && format[strlen(format)-1] != '\n')
     putc ('\n', stderr);
   error_count++;
-  if (error_count)
+  if (error_count >= 50)
     die ("stopped after 50 errors.");
 }
 
@@ -104,6 +105,23 @@ show (const char *format, ...)
 
 
 static void
+show_note (const char *format, ...)
+{
+  va_list arg_ptr;
+
+  if (!verbose && getenv ("srcdir"))
+    fputs ("      ", stderr);  /* To align above "PASS: ".  */
+  else
+    fprintf (stderr, "%s: ", PGM);
+  va_start (arg_ptr, format);
+  vfprintf (stderr, format, arg_ptr);
+  if (*format && format[strlen(format)-1] != '\n')
+    putc ('\n', stderr);
+  va_end (arg_ptr);
+}
+
+
+static void
 show_sexp (const char *prefix, gcry_sexp_t a)
 {
   char *buf;
@@ -427,6 +445,8 @@ check_ed25519 (void)
           hexdowncase (sig);
           one_test (testno, sk, pk, msg, sig);
           ntests++;
+          if (!(ntests % 256))
+            show_note ("%d of %d tests done\n", ntests, N_TESTS);
           xfree (pk);  pk = NULL;
           xfree (sk);  sk = NULL;
           xfree (msg); msg = NULL;
@@ -439,8 +459,8 @@ check_ed25519 (void)
   xfree (msg);
   xfree (sig);
 
-  if (ntests != 1024)
-    fail ("did %d tests but expected 1024", ntests);
+  if (ntests != N_TESTS)
+    fail ("did %d tests but expected %s", ntests, N_TESTS);
 
   fclose (fp);
   xfree (fname);