summaryrefslogtreecommitdiff
path: root/tests/keygen.c
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>2013-09-07 10:06:46 +0200
committerWerner Koch <wk@gnupg.org>2013-09-19 16:43:33 +0200
commit2fe084873333c4d67bcfba0b527d63cd3cff6c47 (patch)
tree802673cb71da04f7a1d85c5d8cb2d6d455dbbff9 /tests/keygen.c
parentb3f3d47d347c14ed41d755cee580f000309b9c03 (diff)
downloadlibgcrypt-2fe084873333c4d67bcfba0b527d63cd3cff6c47.tar.gz
tests: Beautify some diagnostics.
* 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>
Diffstat (limited to 'tests/keygen.c')
-rw-r--r--tests/keygen.c298
1 files changed, 215 insertions, 83 deletions
diff --git a/tests/keygen.c b/tests/keygen.c
index eed62e1b..b955116c 100644
--- a/tests/keygen.c
+++ b/tests/keygen.c
@@ -28,58 +28,119 @@
#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 ();