From 03f04dfb9a03f0b10dfd7e01ee06df7495b95667 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Mon, 31 Oct 2022 15:01:24 +0100 Subject: [PATCH] gpg: New option --compatibility-flags * g10/gpg.c (oCompatibilityFlags): New. (opts): Add option. (compatibility_flags): New list. (main): Set flags and print help. * g10/options.h (opt): Add field compatibility_flags. -- No flags are yet defined but it is good to have the framework. --- doc/gpg.texi | 8 ++++++++ g10/gpg.c | 20 ++++++++++++++++++++ g10/options.h | 8 +++++++- 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/doc/gpg.texi b/doc/gpg.texi index 5c5bab6e5..59d5e578f 100644 --- a/doc/gpg.texi +++ b/doc/gpg.texi @@ -2997,6 +2997,14 @@ therefore enables a fast listing of the encryption keys. @opindex interactive Prompt before overwriting any files. +@item --compatibility-flags @var{flags} +@opindex compatibility-flags +Set compatibility flags to work around problems due to non-compliant +keys or data. The @var{flags} are given as a comma separated +list of flag names and are OR-ed together. The special flag "none" +clears the list and allows to start over with an empty list. To get a +list of available flags the sole word "help" can be used. + @item --debug-level @var{level} @opindex debug-level Select the debug level for investigating problems. @var{level} may be diff --git a/g10/gpg.c b/g10/gpg.c index 35ffaf339..07f62e9b8 100644 --- a/g10/gpg.c +++ b/g10/gpg.c @@ -444,6 +444,7 @@ enum cmd_and_opt_values oForceSignKey, oForbidGenKey, oRequireCompliance, + oCompatibilityFlags, oNoop }; @@ -914,6 +915,7 @@ static gpgrt_opt_t opts[] = { ARGPARSE_s_n (oUseKeyboxd, "use-keyboxd", "@"), ARGPARSE_s_n (oForbidGenKey, "forbid-gen-key", "@"), ARGPARSE_s_n (oRequireCompliance, "require-compliance", "@"), + ARGPARSE_s_s (oCompatibilityFlags, "compatibility-flags", "@"), /* Options which can be used in special circumstances. They are not * published and we hope they are never required. */ ARGPARSE_s_n (oUseOnlyOpenPGPCard, "use-only-openpgp-card", "@"), @@ -1009,6 +1011,13 @@ static struct debug_flags_s debug_flags [] = }; +/* The list of compatibility flags. */ +static struct compatibility_flags_s compatibility_flags [] = + { + { 0, NULL } + }; + + #ifdef ENABLE_SELINUX_HACKS #define ALWAYS_ADD_KEYRINGS 1 #else @@ -2861,6 +2870,15 @@ main (int argc, char **argv) allow_large_chunks = 1; break; + case oCompatibilityFlags: + if (parse_compatibility_flags (pargs.r.ret_str, &opt.compat_flags, + compatibility_flags)) + { + pargs.r_opt = ARGPARSE_INVALID_ARG; + pargs.err = ARGPARSE_PRINT_ERROR; + } + break; + case oStatusFD: set_status_fd ( translate_sys2libc_fd_int (pargs.r.ret_int, 1) ); break; @@ -3920,6 +3938,8 @@ main (int argc, char **argv) } set_debug (debug_level); + if (opt.verbose) /* Print the compatibility flags. */ + parse_compatibility_flags (NULL, &opt.compat_flags, compatibility_flags); gnupg_set_compliance_extra_info (opt.min_rsa_length); if (DBG_CLOCK) log_clock ("start"); diff --git a/g10/options.h b/g10/options.h index 10e61ea4c..0cd2d52e7 100644 --- a/g10/options.h +++ b/g10/options.h @@ -308,6 +308,9 @@ struct int no_symkey_cache; /* Disable the cache used for --symmetric. */ int use_keyboxd; /* Use the external keyboxd as storage backend. */ + + /* Compatibility flags (COMPAT_FLAG_xxxx). */ + unsigned int compat_flags; } opt; /* CTRL is used to keep some global variables we currently can't @@ -363,8 +366,11 @@ struct { EXTERN_UNLESS_MAIN_MODULE int memory_debug_mode; EXTERN_UNLESS_MAIN_MODULE int memory_stat_debug_mode; +/* Compatibility flags */ +/* #define COMPAT_FOO 1 */ -/* Compatibility flags. */ + +/* Compliance test macors. */ #define GNUPG (opt.compliance==CO_GNUPG || opt.compliance==CO_DE_VS) #define RFC2440 (opt.compliance==CO_RFC2440) #define RFC4880 (opt.compliance==CO_RFC4880)