diff --git a/tests/gpgsm/t-genkey.c b/tests/gpgsm/t-genkey.c index ac7ef798..e5bbf9cb 100644 --- a/tests/gpgsm/t-genkey.c +++ b/tests/gpgsm/t-genkey.c @@ -1,130 +1,158 @@ /* t-genkey.c - Regression test. * Copyright (C) 2000 Werner Koch (dd9jn) * Copyright (C) 2001, 2003, 2004 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 Lesser General Public License as * published by the Free Software Foundation; either version 2.1 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later */ /* We need to include config.h so that we know whether we are building with large file system (LFS) support. */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include "t-support.h" /* True if progress function printed something on the screen. */ static int progress_called; static void progress (void *self, const char *what, int type, int current, int total) { (void)self; 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 (void) +static void +check_result (gpgme_genkey_result_t result) { - gpgme_ctx_t ctx; - gpgme_error_t 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"; - gpgme_genkey_result_t result; - gpgme_data_t certreq; - - init_gpgme (GPGME_PROTOCOL_CMS); - - 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 (unexpectedly) 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); +} - print_data (certreq); - gpgme_data_release (certreq); +static 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", + "\n" + "Key-Type: ECC\n" + "Key-Curve: NIST P-256\n" + "Name-DN: C=de,O=g10 code,OU=Testlab,CN=Joe 2 Tester\n" + "Name-Email: joe@foo.bar\n" + "\n", + "\n" + "Key-Type: ECC\n" + "Key-Curve: Ed25519\n" + "Name-DN: C=de,O=g10 code,OU=Testlab,CN=Joe 2 Tester\n" + "Name-Email: joe@foo.bar\n" + "\n", +}; + +int +main (void) +{ + gpgme_ctx_t ctx; + gpgme_error_t err; + gpgme_genkey_result_t result; + int i; + + init_gpgme (GPGME_PROTOCOL_CMS); + + 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); + + for (i = 0; i < DIM(parms); i++) + { + gpgme_data_t certreq; + + progress_called = 0; + err = gpgme_data_new (&certreq); + fail_if_err (err); + + err = gpgme_op_genkey (ctx, parms[i], certreq, NULL); + fail_if_err (err); + + result = gpgme_op_genkey_result (ctx); + check_result (result); + + print_data (certreq); + gpgme_data_release (certreq); + } + + gpgme_release (ctx); return 0; } diff --git a/tests/gpgsm/t-support.h b/tests/gpgsm/t-support.h index a0066599..fe65364f 100644 --- a/tests/gpgsm/t-support.h +++ b/tests/gpgsm/t-support.h @@ -1,119 +1,123 @@ /* t-support.h - Helper routines for regression tests. * Copyright (C) 2000 Werner Koch (dd9jn) * Copyright (C) 2001, 2002, 2003, 2004 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 Lesser General Public License as * published by the Free Software Foundation; either version 2.1 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later */ #include #include #include #include #include +#ifndef DIM +#define DIM(v) (sizeof(v)/sizeof((v)[0])) +#endif + #define fail_if_err(err) \ do \ { \ if (err) \ { \ fprintf (stderr, "%s:%d: %s: %s (%d.%d)\n", \ __FILE__, __LINE__, gpgme_strsource (err), \ gpgme_strerror (err), \ gpgme_err_source (err), gpgme_err_code (err)); \ exit (1); \ } \ } \ while (0) void print_data (gpgme_data_t dh) { #define BUF_SIZE 512 char buf[BUF_SIZE + 1]; int ret; ret = gpgme_data_seek (dh, 0, SEEK_SET); if (ret) fail_if_err (gpgme_error_from_errno (errno)); while ((ret = gpgme_data_read (dh, buf, BUF_SIZE)) > 0) fwrite (buf, ret, 1, stdout); if (ret < 0) fail_if_err (gpgme_error_from_errno (errno)); } gpgme_error_t passphrase_cb (void *opaque, const char *uid_hint, const char *passphrase_info, int last_was_bad, int fd) { int res; char pass[] = "abc\n"; int passlen = strlen (pass); int off = 0; (void)opaque; (void)uid_hint; (void)passphrase_info; (void)last_was_bad; do { res = gpgme_io_write (fd, &pass[off], passlen - off); if (res > 0) off += res; } while (res > 0 && off != passlen); return off == passlen ? 0 : gpgme_error_from_errno (errno); } char * make_filename (const char *fname) { const char *srcdir = getenv ("srcdir"); char *buf; if (!srcdir) srcdir = "."; buf = malloc (strlen(srcdir) + strlen(fname) + 2); if (!buf) exit (8); strcpy (buf, srcdir); strcat (buf, "/"); strcat (buf, fname); return buf; } void init_gpgme (gpgme_protocol_t proto) { gpgme_error_t err; gpgme_check_version (NULL); #ifndef HAVE_W32_SYSTEM setlocale (LC_ALL, ""); gpgme_set_locale (NULL, LC_CTYPE, setlocale (LC_CTYPE, NULL)); gpgme_set_locale (NULL, LC_MESSAGES, setlocale (LC_MESSAGES, NULL)); #endif err = gpgme_engine_check_version (proto); fail_if_err (err); }