From 0a5f26ada7a0529367c81a7d4a2e5b4e7733b8ab Mon Sep 17 00:00:00 2001 From: Marcus Brinkmann Date: Fri, 25 Apr 2003 12:38:55 +0000 Subject: [PATCH] 2003-04-25 Marcus Brinkmann * gpgsm/t-genkey.c: Rewritten. * gpgsm/Makefile.am (noinst_PROGRAMS): Add t-genkey. * gpg/t-genkey.c: Include . (main): Check result->fpr before checking its length. --- trunk/tests/ChangeLog | 7 ++ trunk/tests/gpg/t-genkey.c | 3 +- trunk/tests/gpgsm/Makefile.am | 4 +- trunk/tests/gpgsm/t-genkey.c | 214 +++++++++++++++++++++++----------- 4 files changed, 158 insertions(+), 70 deletions(-) diff --git a/trunk/tests/ChangeLog b/trunk/tests/ChangeLog index 407d0cf..4800f22 100644 --- a/trunk/tests/ChangeLog +++ b/trunk/tests/ChangeLog @@ -1,3 +1,10 @@ +2003-04-25 Marcus Brinkmann + + * gpgsm/t-genkey.c: Rewritten. + * gpgsm/Makefile.am (noinst_PROGRAMS): Add t-genkey. + * gpg/t-genkey.c: Include . + (main): Check result->fpr before checking its length. + 2003-04-24 Marcus Brinkmann * gpg/t-genkey.c: Rewritten to match new semantics. diff --git a/trunk/tests/gpg/t-genkey.c b/trunk/tests/gpg/t-genkey.c index 75ef421..3a56b39 100644 --- a/trunk/tests/gpg/t-genkey.c +++ b/trunk/tests/gpg/t-genkey.c @@ -18,6 +18,7 @@ along with GPGME; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include #include #include @@ -98,7 +99,7 @@ main (int argc, char **argv) result->primary ? (result->sub ? "primary, sub" : "primary") : (result->sub ? "sub" : "none")); - if (strlen (result->fpr) != 40) + if (result->fpr && strlen (result->fpr) != 40) { fprintf (stderr, "%s:%d: generated key has unexpected fingerprint\n", __FILE__, __LINE__); diff --git a/trunk/tests/gpgsm/Makefile.am b/trunk/tests/gpgsm/Makefile.am index ab4d2d9..85ea1c8 100644 --- a/trunk/tests/gpgsm/Makefile.am +++ b/trunk/tests/gpgsm/Makefile.am @@ -31,7 +31,9 @@ INCLUDES = -I$(top_srcdir)/gpgme LDADD = ../../gpgme/libgpgme.la -noinst_PROGRAMS = $(TESTS) +# We don't run t-genkey in the test suite, because it takes too long +# and needs a working pinentry. +noinst_PROGRAMS = $(TESTS) t-genkey key_id := 32100C27173EF6E9C4E9A25D3D69F86D37A4F939 diff --git a/trunk/tests/gpgsm/t-genkey.c b/trunk/tests/gpgsm/t-genkey.c index 3849f9e..3f5a879 100644 --- a/trunk/tests/gpgsm/t-genkey.c +++ b/trunk/tests/gpgsm/t-genkey.c @@ -1,85 +1,163 @@ /* t-genkey.c - regression test - * Copyright (C) 2000 Werner Koch (dd9jn) - * Copyright (C) 2001 g10 Code GmbH - * - * This file is part of GPGME. - * - * GPGME is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * GPGME is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ + Copyright (C) 2000 Werner Koch (dd9jn) + Copyright (C) 2001, 2003 g10 Code GmbH + + This file is part of GPGME. + + GPGME is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + GPGME is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GPGME; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include #include +#include #include -#include +#include #include -#define fail_if_err(a) do { if(a) { \ - fprintf (stderr, "%s:%d: GpgmeError %s\n", \ - __FILE__, __LINE__, gpgme_strerror(a)); \ - exit (1); } \ - } while(0) +#define fail_if_err(err) \ + do \ + { \ + if (err) \ + { \ + fprintf (stderr, "%s:%d: GpgmeError %s\n", \ + __FILE__, __LINE__, gpgme_strerror (err)); \ + exit (1); \ + } \ + } \ + while (0) + + +void +dump_data (GpgmeData dh) +{ +#define BUF_SIZE 512 + char buffer[BUF_SIZE + 1]; + int bufread; + + gpgme_data_rewind (dh); + + do + { + bufread = gpgme_data_read (dh, buffer, BUF_SIZE); + if (bufread > 0) + { + buffer[bufread] = '\0'; + printf ("%s", buffer); + } + } + while (bufread > 0); + + if (bufread < 0) + { + fprintf (stderr, "%s:%d: gpgme_data_read failed: %s\n", + __FILE__, __LINE__, strerror (errno)); + exit (1); + } + printf ("\n"); +} +/* True if progress function printed something on the screen. */ +int progress_called; + static void -progress ( void *self, const char *what, int type, int current, int total) +progress (void *self, const char *what, int type, int current, int total) { - fprintf (stderr, "progress `%s' %d %d %d\n", what, type, current, total); + if (!strcmp (what, "primegen") && !current && !total + && (type == '.' || type == '+' || type == '!' + || type == '^' || type == '<' || type == '>')) + { + printf ("%c", type); + fflush (stdout); + progress_called = 1; + } + else + { + fprintf (stderr, "unknown progress `%s' %d %d %d\n", what, type, + current, total); + exit (1); + } } int -main (int argc, char **argv ) +main (int argc, char **argv) { - GpgmeCtx ctx; - GpgmeError err; - GpgmeData pub; - char *result; - const char *format; - char *parms; - int count = 0; - int len, i; - - do { - err = gpgme_data_new (&pub); - err = gpgme_new (&ctx); - fail_if_err (err); - gpgme_set_protocol (ctx, GPGME_PROTOCOL_CMS); - gpgme_set_armor (ctx, 1); - gpgme_set_progress_cb (ctx, progress, NULL); - - format = "\n" - "Key-Type: RSA\n" - "Key-Length: 1024\n" - "Name-DN: C=de,O=g10 code,OU=Testlab,CN=Joe %d Tester\n" - "Name-Email: joe@foo.bar\n" - "\n"; - parms = malloc ( strlen (format) + 1 + 20 ); - if (!parms) - exit (8); - sprintf (parms, format, ++count ); - err = gpgme_op_genkey (ctx, parms, pub, NULL ); - fail_if_err (err); - free (parms); - - gpgme_release (ctx); - result = gpgme_data_release_and_get_mem (pub, &len); - for (i = 0; i < len; i++) - printf ("%c", result[i]); - free (result); - } while ( argc > 1 && !strcmp( argv[1], "--loop" ) ); - - return 0; + GpgmeCtx ctx; + GpgmeError err; + const char *parms = "\n" + "Key-Type: RSA\n" + "Key-Length: 1024\n" + "Name-DN: C=de,O=g10 code,OU=Testlab,CN=Joe 2 Tester\n" + "Name-Email: joe@foo.bar\n" + "\n"; + GpgmeGenKeyResult result; + GpgmeData certreq; + + err = gpgme_engine_check_version (GPGME_PROTOCOL_CMS); + fail_if_err (err); + + err = gpgme_data_new (&certreq); + fail_if_err (err); + + err = gpgme_new (&ctx); + fail_if_err (err); + + gpgme_set_protocol (ctx, GPGME_PROTOCOL_CMS); + gpgme_set_armor (ctx, 1); + + gpgme_set_progress_cb (ctx, progress, NULL); + + err = gpgme_op_genkey (ctx, parms, certreq, NULL); + fail_if_err (err); + + result = gpgme_op_genkey_result (ctx); + if (!result) + { + fprintf (stderr, "%s:%d: gpgme_op_genkey_result returns NULL\n", + __FILE__, __LINE__); + exit (1); + } + if (progress_called) + printf ("\n"); + + printf ("Generated key: %s (%s)\n", result->fpr ? result->fpr : "none", + result->primary ? (result->sub ? "primary, sub" : "primary") + : (result->sub ? "sub" : "none")); + + if (result->fpr) + { + fprintf (stderr, "%s:%d: generated key has (unexpectdly) a fingerprint\n", + __FILE__, __LINE__); + exit (1); + } + if (!result->primary) + { + fprintf (stderr, "%s:%d: primary key was not generated\n", + __FILE__, __LINE__); + exit (1); + } + if (result->sub) + { + fprintf (stderr, "%s:%d: sub key was (unexpectedly) generated\n", + __FILE__, __LINE__); + exit (1); + } + gpgme_release (ctx); + + dump_data (certreq); + gpgme_data_release (certreq); + + return 0; } -- 2.26.2