summaryrefslogtreecommitdiff
path: root/sm
diff options
context:
space:
mode:
authorDongHun Kwak <dh0128.kwak@samsung.com>2022-09-16 07:45:18 +0900
committerDongHun Kwak <dh0128.kwak@samsung.com>2022-09-16 07:45:18 +0900
commitb8e317c2a634907810564598cde8cf691ef03d88 (patch)
tree7978657ccc96ec5a55c31801e14bca75291cfe4c /sm
parent028733bb89982a39cf1341937417c9d76f39b2ef (diff)
downloadgpg2-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.am2
-rw-r--r--sm/Makefile.in4
-rw-r--r--sm/gpgsm.c46
-rw-r--r--sm/gpgsm.h2
-rw-r--r--sm/keylist.c95
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)
diff --git a/sm/gpgsm.c b/sm/gpgsm.c
index fd59fc7..ca30358 100644
--- a/sm/gpgsm.c
+++ b/sm/gpgsm.c
@@ -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. */
{
diff --git a/sm/gpgsm.h b/sm/gpgsm.h
index e96f157..7c27c58 100644
--- a/sm/gpgsm.h
+++ b/sm/gpgsm.h
@@ -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;
+}