From 30b447fcfe0e4f362c2575e1b9388e8144b5b2fd Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Tue, 17 May 2016 19:59:51 +0200 Subject: [PATCH] tests: New maintenance helper run-encrypt. * tests/run-encrypt.c: New. Signed-off-by: Werner Koch --- NEWS | 2 +- tests/Makefile.am | 2 +- tests/run-encrypt.c | 218 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 220 insertions(+), 2 deletions(-) create mode 100644 tests/run-encrypt.c diff --git a/NEWS b/NEWS index 85c084ff..cfff559e 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,4 @@ -Noteworthy changes in version 1.6.1 (unreleased) [C25/A14/R_] +Noteworthy changes in version 1.7.0 (unreleased) [C25/A14/R_] ------------------------------------------------ * New function to format a GnuPG style public key algorithm string. diff --git a/tests/Makefile.am b/tests/Makefile.am index 89e52e8d..22c07d2c 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -32,7 +32,7 @@ LDADD = ../src/libgpgme.la @GPG_ERROR_LIBS@ noinst_HEADERS = run-support.h noinst_PROGRAMS = $(TESTS) run-keylist run-export run-import run-sign \ - run-verify + run-verify run-encrypt if RUN_GPG_TESTS diff --git a/tests/run-encrypt.c b/tests/run-encrypt.c new file mode 100644 index 00000000..a00f0282 --- /dev/null +++ b/tests/run-encrypt.c @@ -0,0 +1,218 @@ +/* run-encrypt.c - Helper to perform an encrypt operation + * Copyright (C) 2016 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 . + */ + +/* 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 + +#define PGM "run-encrypt" + +#include "run-support.h" + + +static int verbose; + +static gpg_error_t +status_cb (void *opaque, const char *keyword, const char *value) +{ + (void)opaque; + printf ("status_cb: %s %s\n", keyword, value); + return 0; +} + + +static void +print_result (gpgme_encrypt_result_t result) +{ + gpgme_invalid_key_t invkey; + + for (invkey = result->invalid_recipients; invkey; invkey = invkey->next) + printf ("Encryption key `%s' not used: %s <%s>\n", + nonnull (invkey->fpr), + gpg_strerror (invkey->reason), gpg_strsource (invkey->reason)); +} + + + +static int +show_usage (int ex) +{ + fputs ("usage: " PGM " [options] FILE\n\n" + "Options:\n" + " --verbose run in verbose mode\n" + " --status print status lines from the backend\n" + " --openpgp use the OpenPGP protocol (default)\n" + " --cms use the CMS protocol\n" + " --uiserver use the UI server\n" + " --loopback use a loopback pinentry\n" + " --key NAME encrypt to key NAME\n" + , stderr); + exit (ex); +} + + +int +main (int argc, char **argv) +{ + int last_argc = -1; + gpgme_error_t err; + gpgme_ctx_t ctx; + const char *key_string = NULL; + gpgme_protocol_t protocol = GPGME_PROTOCOL_OpenPGP; + gpgme_data_t in, out; + gpgme_encrypt_result_t result; + int print_status = 0; + int use_loopback = 0; + char *keyargs[10]; + gpgme_key_t keys[10+1]; + int keycount = 0; + int i; + + if (argc) + { argc--; argv++; } + + if (DIM(keys) != DIM(keyargs)+1) + abort (); + + while (argc && last_argc != argc ) + { + last_argc = argc; + if (!strcmp (*argv, "--")) + { + argc--; argv++; + break; + } + else if (!strcmp (*argv, "--help")) + show_usage (0); + else if (!strcmp (*argv, "--verbose")) + { + verbose = 1; + argc--; argv++; + } + else if (!strcmp (*argv, "--status")) + { + print_status = 1; + argc--; argv++; + } + else if (!strcmp (*argv, "--openpgp")) + { + protocol = GPGME_PROTOCOL_OpenPGP; + argc--; argv++; + } + else if (!strcmp (*argv, "--cms")) + { + protocol = GPGME_PROTOCOL_CMS; + argc--; argv++; + } + else if (!strcmp (*argv, "--uiserver")) + { + protocol = GPGME_PROTOCOL_UISERVER; + argc--; argv++; + } + else if (!strcmp (*argv, "--key")) + { + argc--; argv++; + if (!argc) + show_usage (1); + if (keycount == DIM (keyargs)) + show_usage (1); + keyargs[keycount++] = *argv; + argc--; argv++; + } + else if (!strcmp (*argv, "--loopback")) + { + use_loopback = 1; + argc--; argv++; + } + else if (!strncmp (*argv, "--", 2)) + show_usage (1); + + } + + if (argc != 1) + show_usage (1); + + if (key_string && protocol == GPGME_PROTOCOL_UISERVER) + { + fprintf (stderr, PGM ": ignoring --key in UI-server mode\n"); + key_string = NULL; + } + + if (!key_string) + key_string = "test"; + + init_gpgme (protocol); + + err = gpgme_new (&ctx); + fail_if_err (err); + gpgme_set_protocol (ctx, protocol); + gpgme_set_armor (ctx, 1); + if (print_status) + gpgme_set_status_cb (ctx, status_cb, NULL); + if (use_loopback) + gpgme_set_pinentry_mode (ctx, GPGME_PINENTRY_MODE_LOOPBACK); + + for (i=0; i < keycount; i++) + { + err = gpgme_get_key (ctx, keyargs[i], &keys[i], 0); + fail_if_err (err); + } + keys[i] = NULL; + + err = gpgme_data_new_from_file (&in, *argv, 1); + if (err) + { + fprintf (stderr, PGM ": error reading `%s': %s\n", + *argv, gpg_strerror (err)); + exit (1); + } + + err = gpgme_data_new (&out); + fail_if_err (err); + + err = gpgme_op_encrypt (ctx, keys, GPGME_ENCRYPT_ALWAYS_TRUST, in, out); + result = gpgme_op_encrypt_result (ctx); + if (result) + print_result (result); + if (err) + { + fprintf (stderr, PGM ": encrypting failed: %s\n", gpg_strerror (err)); + exit (1); + } + + fputs ("Begin Output:\n", stdout); + print_data (out); + fputs ("End Output.\n", stdout); + gpgme_data_release (out); + + gpgme_data_release (in); + + for (i=0; i < keycount; i++) + gpgme_key_unref (keys[i]); + gpgme_release (ctx); + return 0; +}