From 2fe084873333c4d67bcfba0b527d63cd3cff6c47 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Sat, 7 Sep 2013 10:06:46 +0200 Subject: 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 --- tests/keygen.c | 298 +++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 215 insertions(+), 83 deletions(-) (limited to 'tests/keygen.c') 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 (); -- cgit v1.2.1