diff options
Diffstat (limited to '')
| -rw-r--r-- | NEWS | 2 | ||||
| -rw-r--r-- | tests/Makefile.am | 2 | ||||
| -rw-r--r-- | tests/run-encrypt.c | 218 | 
3 files changed, 220 insertions, 2 deletions
| @@ -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 <http://www.gnu.org/licenses/>. + */ + +/* 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 <config.h> +#endif + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#include <gpgme.h> + +#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; +} | 
