From 842d233d408457cfa9a8473a6748472956f44e84 Mon Sep 17 00:00:00 2001 From: Justus Winter Date: Wed, 7 Jun 2017 11:50:54 +0200 Subject: [PATCH] common,gpg,sm: Move the compliance option parser. * common/compliance.c (gnupg_parse_compliance_option): New function. * common/compliance.h (struct gnupg_compliance_option): New type. (gnupg_parse_compliance_option): New prototype. * g10/gpg.c (parse_compliance_option): Remove function. (compliance_options): New variable. (main): Adapt callsite. * sm/gpgsm.c (main): Use the new common function. * sm/gpgsm.h (opt): New field 'compliance'. GnuPG-bug-id: 3191 Signed-off-by: Justus Winter --- common/compliance.c | 33 +++++++++++++++++++++++++++++++++ common/compliance.h | 11 +++++++++++ g10/gpg.c | 37 +++++++++++-------------------------- sm/gpgsm.c | 15 ++++++++++++++- sm/gpgsm.h | 2 ++ 5 files changed, 71 insertions(+), 27 deletions(-) diff --git a/common/compliance.c b/common/compliance.c index 14ba0970d..d81a50385 100644 --- a/common/compliance.c +++ b/common/compliance.c @@ -33,6 +33,7 @@ #include "openpgpdefs.h" #include "logging.h" #include "util.h" +#include "i18n.h" #include "compliance.h" /* Return true if ALGO with a key of KEYLENGTH is compliant to the @@ -210,3 +211,35 @@ gnupg_status_compliance_flag (enum gnupg_compliance_mode compliance) } log_assert (!"invalid compliance mode"); } + + +/* Parse the value of --compliance. Returns the value corresponding + * to the given STRING according to OPTIONS of size LENGTH, or -1 + * indicating that the lookup was unsuccessful, or the list of options + * was printed. If quiet is false, an additional hint to use 'help' + * is printed on unsuccessful lookups. */ +int +gnupg_parse_compliance_option (const char *string, + struct gnupg_compliance_option options[], + size_t length, + int quiet) +{ + size_t i; + + if (! ascii_strcasecmp (string, "help")) + { + log_info (_ ("valid values for option '%s':\n"), "--compliance"); + for (i = 0; i < length; i++) + log_info (" %s\n", options[i].keyword); + return -1; + } + + for (i = 0; i < length; i++) + if (! ascii_strcasecmp (string, options[i].keyword)) + return options[i].value; + + log_error (_ ("invalid value for option '%s'\n"), "--compliance"); + if (! quiet) + log_info (_ ("(use \"help\" to list choices)\n")); + return -1; +} diff --git a/common/compliance.h b/common/compliance.h index 4f78ad42f..198447c6e 100644 --- a/common/compliance.h +++ b/common/compliance.h @@ -48,4 +48,15 @@ int gnupg_digest_is_compliant (enum gnupg_compliance_mode compliance, digest_algo_t digest); const char *gnupg_status_compliance_flag (enum gnupg_compliance_mode compliance); +struct gnupg_compliance_option +{ + const char *keyword; + int value; +}; + +int gnupg_parse_compliance_option (const char *string, + struct gnupg_compliance_option options[], + size_t length, + int quiet); + #endif /*GNUPG_COMMON_COMPLIANCE_H*/ diff --git a/g10/gpg.c b/g10/gpg.c index cddaf7716..686fcd73e 100644 --- a/g10/gpg.c +++ b/g10/gpg.c @@ -2073,11 +2073,8 @@ parse_tofu_policy (const char *policystr) } -/* Parse the value of --compliance. */ -static int -parse_compliance_option (const char *string) -{ - struct { const char *keyword; enum cmd_and_opt_values option; } list[] = { +static struct gnupg_compliance_option compliance_options[] = + { { "gnupg", oGnuPG }, { "openpgp", oOpenPGP }, { "rfc4880bis", oRFC4880bis }, @@ -2088,26 +2085,6 @@ parse_compliance_option (const char *string) { "pgp8", oPGP8 }, { "de-vs", oDE_VS } }; - int i; - - if (!ascii_strcasecmp (string, "help")) - { - log_info (_("valid values for option '%s':\n"), "--compliance"); - for (i=0; i < DIM (list); i++) - log_info (" %s\n", list[i].keyword); - g10_exit (1); - } - - for (i=0; i < DIM (list); i++) - if (!ascii_strcasecmp (string, list[i].keyword)) - return list[i].option; - - log_error (_("invalid value for option '%s'\n"), "--compliance"); - if (!opt.quiet) - log_info (_("(use \"help\" to list choices)\n")); - g10_exit (1); -} - /* Helper to set compliance related options. This is a separate @@ -2862,7 +2839,15 @@ main (int argc, char **argv) break; case oCompliance: - set_compliance_option (parse_compliance_option (pargs.r.ret_str)); + { + int compliance = gnupg_parse_compliance_option (pargs.r.ret_str, + compliance_options, + DIM (compliance_options), + opt.quiet); + if (compliance < 0) + g10_exit (1); + set_compliance_option (compliance); + } break; case oOpenPGP: case oRFC2440: diff --git a/sm/gpgsm.c b/sm/gpgsm.c index cb181e8f6..4b8077892 100644 --- a/sm/gpgsm.c +++ b/sm/gpgsm.c @@ -41,6 +41,7 @@ #include "../common/gc-opt-flags.h" #include "../common/asshelp.h" #include "../common/init.h" +#include "../common/compliance.h" #ifndef O_BINARY @@ -1443,7 +1444,19 @@ main ( int argc, char **argv) case oNoAutostart: opt.autostart = 0; break; case oCompliance: - /* Dummy option for now. */ + { + struct gnupg_compliance_option compliance_options[] = + { + { "de-vs", CO_DE_VS } + }; + int compliance = gnupg_parse_compliance_option (pargs.r.ret_str, + compliance_options, + DIM (compliance_options), + opt.quiet); + if (compliance < 0) + gpgsm_exit (1); + opt.compliance = compliance; + } break; default: diff --git a/sm/gpgsm.h b/sm/gpgsm.h index df96770f1..8c1f520de 100644 --- a/sm/gpgsm.h +++ b/sm/gpgsm.h @@ -34,6 +34,7 @@ #include "../common/audit.h" #include "../common/session-env.h" #include "../common/ksba-io-support.h" +#include "../common/compliance.h" #define MAX_DIGEST_LEN 64 @@ -144,6 +145,7 @@ struct OID per string. */ strlist_t ignored_cert_extensions; + enum gnupg_compliance_mode compliance; } opt; /* Debug values and macros. */