diff options
author | DongHun Kwak <dh0128.kwak@samsung.com> | 2022-09-16 07:45:18 +0900 |
---|---|---|
committer | DongHun Kwak <dh0128.kwak@samsung.com> | 2022-09-16 07:45:18 +0900 |
commit | b8e317c2a634907810564598cde8cf691ef03d88 (patch) | |
tree | 7978657ccc96ec5a55c31801e14bca75291cfe4c /sm | |
parent | 028733bb89982a39cf1341937417c9d76f39b2ef (diff) | |
download | gpg2-b8e317c2a634907810564598cde8cf691ef03d88.tar.gz gpg2-b8e317c2a634907810564598cde8cf691ef03d88.tar.bz2 gpg2-b8e317c2a634907810564598cde8cf691ef03d88.zip |
Imported Upstream version 2.3.1upstream/2.3.1
Diffstat (limited to 'sm')
-rw-r--r-- | sm/Makefile.am | 2 | ||||
-rw-r--r-- | sm/Makefile.in | 4 | ||||
-rw-r--r-- | sm/gpgsm.c | 46 | ||||
-rw-r--r-- | sm/gpgsm.h | 2 | ||||
-rw-r--r-- | sm/keylist.c | 95 |
5 files changed, 144 insertions, 5 deletions
diff --git a/sm/Makefile.am b/sm/Makefile.am index 9e768aa..b2f042d 100644 --- a/sm/Makefile.am +++ b/sm/Makefile.am @@ -79,7 +79,7 @@ module_maint_tests = t-minip12 t_common_src = t_common_ldadd = $(libcommon) $(LIBGCRYPT_LIBS) $(KSBA_LIBS) \ - $(GPG_ERROR_LIBS) $(LIBINTL) + $(GPG_ERROR_LIBS) $(LIBINTL) $(LIBICONV) t_minip12_CFLAGS = -DWITHOUT_NPTH=1 \ diff --git a/sm/Makefile.in b/sm/Makefile.in index 06c15db..0ddfb89 100644 --- a/sm/Makefile.in +++ b/sm/Makefile.in @@ -195,7 +195,7 @@ am_t_minip12_OBJECTS = $(am__objects_1) t_minip12-t-minip12.$(OBJEXT) \ t_minip12_OBJECTS = $(am_t_minip12_OBJECTS) am__DEPENDENCIES_2 = $(libcommon) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) t_minip12_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) t_minip12_LINK = $(CCLD) $(t_minip12_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ @@ -554,7 +554,7 @@ module_tests = module_maint_tests = t-minip12 t_common_src = t_common_ldadd = $(libcommon) $(LIBGCRYPT_LIBS) $(KSBA_LIBS) \ - $(GPG_ERROR_LIBS) $(LIBINTL) + $(GPG_ERROR_LIBS) $(LIBINTL) $(LIBICONV) t_minip12_CFLAGS = -DWITHOUT_NPTH=1 \ $(LIBGCRYPT_CFLAGS) $(GPG_ERROR_CFLAGS) @@ -1,7 +1,7 @@ /* gpgsm.c - GnuPG for S/MIME * Copyright (C) 2001-2020 Free Software Foundation, Inc. * Copyright (C) 2001-2019 Werner Koch - * Copyright (C) 2015-2020 g10 Code GmbH + * Copyright (C) 2015-2021 g10 Code GmbH * * This file is part of GnuPG. * @@ -47,6 +47,7 @@ #include "../common/asshelp.h" #include "../common/init.h" #include "../common/compliance.h" +#include "../common/comopt.h" #include "minip12.h" #ifndef O_BINARY @@ -95,6 +96,7 @@ enum cmd_and_opt_values { aDumpChain, aDumpSecretKeys, aDumpExternalKeys, + aShowCerts, aKeydbClearSomeCertFlags, aFingerprint, @@ -251,6 +253,7 @@ static gpgrt_opt_t opts[] = { ARGPARSE_c (aGPGConfList, "gpgconf-list", "@"), ARGPARSE_c (aGPGConfTest, "gpgconf-test", "@"), + ARGPARSE_c (aShowCerts, "show-certs", "@"), ARGPARSE_c (aDumpKeys, "dump-cert", "@"), ARGPARSE_c (aDumpKeys, "dump-keys", "@"), ARGPARSE_c (aDumpChain, "dump-chain", "@"), @@ -1005,6 +1008,7 @@ main ( int argc, char **argv) estream_t htmlauditfp = NULL; struct assuan_malloc_hooks malloc_hooks; int pwfd = -1; + int no_logfile = 0; static const char *homedirvalue; static const char *changeuser; @@ -1210,6 +1214,7 @@ main ( int argc, char **argv) case aExportSecretKeyP12: case aExportSecretKeyP8: case aExportSecretKeyRaw: + case aShowCerts: case aDumpKeys: case aDumpChain: case aDumpExternalKeys: @@ -1354,7 +1359,7 @@ main ( int argc, char **argv) break; case oLogFile: logfile = pargs.r.ret_str; break; - case oNoLogFile: logfile = NULL; break; + case oNoLogFile: logfile = NULL; no_logfile = 1; break; case oAuditLog: auditlog = pargs.r.ret_str; break; case oHtmlAuditLog: htmlauditlog = pargs.r.ret_str; break; @@ -1613,6 +1618,34 @@ main ( int argc, char **argv) gpgsm_exit(2); } + /* Process common component options. */ + if (parse_comopt (GNUPG_MODULE_NAME_GPGSM, debug_argparser)) + { + gpgsm_status_with_error (&ctrl, STATUS_FAILURE, + "option-parser", gpg_error (GPG_ERR_GENERAL)); + gpgsm_exit(2); + } + + if (!logfile && !no_logfile) + { + logfile = comopt.logfile; + comopt.logfile = NULL; + } + + if (opt.use_keyboxd) + log_info ("Note: Please move option \"%s\" to \"common.conf\"\n", + "use-keyboxd"); + opt.use_keyboxd = comopt.use_keyboxd; /* Override. */ + + if (opt.keyboxd_program) + log_info ("Note: Please move option \"%s\" to \"common.conf\"\n", + "keyboxd-program"); + if (!opt.keyboxd_program && comopt.keyboxd_program) + { + opt.keyboxd_program = comopt.keyboxd_program; + comopt.keyboxd_program = NULL; + } + if (pwfd != -1) /* Read the passphrase now. */ read_passphrase_from_fd (pwfd); @@ -2091,6 +2124,15 @@ main ( int argc, char **argv) } break; + case aShowCerts: + { + estream_t fp; + + fp = open_es_fwrite (opt.outfile?opt.outfile:"-"); + gpgsm_show_certs (&ctrl, argc, argv, fp); + es_fclose (fp); + } + break; case aKeygen: /* Generate a key; well kind of. */ { @@ -389,6 +389,8 @@ int gpgsm_find_cert (ctrl_t ctrl, const char *name, ksba_sexp_t keyid, /*-- keylist.c --*/ gpg_error_t gpgsm_list_keys (ctrl_t ctrl, strlist_t names, estream_t fp, unsigned int mode); +gpg_error_t gpgsm_show_certs (ctrl_t ctrl, int nfiles, char **files, + estream_t fp); /*-- import.c --*/ int gpgsm_import (ctrl_t ctrl, int in_fd, int reimport_mode); diff --git a/sm/keylist.c b/sm/keylist.c index 1a062d1..3c9e10c 100644 --- a/sm/keylist.c +++ b/sm/keylist.c @@ -1710,3 +1710,98 @@ gpgsm_list_keys (ctrl_t ctrl, strlist_t names, estream_t fp, err = list_external_keys (ctrl, names, fp, (mode&256)); return err; } + + + +static gpg_error_t +do_show_certs (ctrl_t ctrl, const char *fname, estream_t outfp) +{ + gpg_error_t err; + gnupg_ksba_io_t b64reader = NULL; + ksba_reader_t reader; + ksba_cert_t cert = NULL; + estream_t fp; + int any = 0; + + if (!fname || (fname[0] == '-' && !fname[1])) + { + fp = es_stdin; + fname = "[stdin]"; + } + else + { + fp = es_fopen (fname, "rb"); + if (!fp) + { + err = gpg_error_from_syserror (); + log_error (_("can't open '%s': %s\n"), fname, gpg_strerror (err)); + return err; + } + } + + err = gnupg_ksba_create_reader + (&b64reader, ((ctrl->is_pem? GNUPG_KSBA_IO_PEM : 0) + | (ctrl->is_base64? GNUPG_KSBA_IO_BASE64 : 0) + | (ctrl->autodetect_encoding? GNUPG_KSBA_IO_AUTODETECT : 0) + | GNUPG_KSBA_IO_MULTIPEM), + fp, &reader); + if (err) + { + log_error ("can't create reader: %s\n", gpg_strerror (err)); + goto leave; + } + + /* We need to loop here to handle multiple PEM objects per file. */ + do + { + ksba_cert_release (cert); cert = NULL; + + err = ksba_cert_new (&cert); + if (err) + goto leave; + + err = ksba_cert_read_der (cert, reader); + if (err) + goto leave; + + es_fprintf (outfp, "File ........: %s\n", fname); + list_cert_raw (ctrl, NULL, cert, outfp, 0, 0); + es_putc ('\n', outfp); + any = 1; + + ksba_reader_clear (reader, NULL, NULL); + } + while (!gnupg_ksba_reader_eof_seen (b64reader)); + + leave: + if (any && gpg_err_code (err) == GPG_ERR_EOF) + err = 0; + ksba_cert_release (cert); + gnupg_ksba_destroy_reader (b64reader); + if (fp != es_stdin) + es_fclose (fp); + return err; +} + + +/* Show a raw dump of the certificates found in the files given in + * the arrag FILES. Write output to FP. */ +gpg_error_t +gpgsm_show_certs (ctrl_t ctrl, int nfiles, char **files, estream_t fp) +{ + gpg_error_t saveerr = 0; + gpg_error_t err; + + if (!nfiles) + saveerr = do_show_certs (ctrl, NULL, fp); + else + { + for (; nfiles; nfiles--, files++) + { + err = do_show_certs (ctrl, *files, fp); + if (err && !saveerr) + saveerr = err; + } + } + return saveerr; +} |