mirror of
git://git.gnupg.org/gnupg.git
synced 2025-05-24 16:43:28 +02:00
gpg: New option --auto-key-import
* g10/gpg.c (opts): New options --auto-key-import, --no-auto-key-import, and --no-include-key-block. (gpgconf_list): Add them. * g10/options.h (opt): Add field flags.auto_key_import. * g10/mainproc.c (check_sig_and_print): Use flag to enable that feature. * tools/gpgconf-comp.c: Give the new options a Basic config level. -- Note that the --no variants of the options are intended for easy disabling at the command line. GnuPG-bug-id: 4856 Signed-off-by: Werner Koch <wk@gnupg.org> Backported from master. Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
parent
b42d9f540c
commit
95b42278ca
26
doc/gpg.texi
26
doc/gpg.texi
@ -1818,6 +1818,20 @@ list. The default is "local,wkd".
|
|||||||
@end table
|
@end table
|
||||||
|
|
||||||
|
|
||||||
|
@item --auto-key-import
|
||||||
|
@itemx --no-auto-key-import
|
||||||
|
@opindex auto-key-import
|
||||||
|
@opindex no-auto-key-import
|
||||||
|
This is an offline mechanism to get a missing key for signature
|
||||||
|
verification and for later encryption to this key. If this option is
|
||||||
|
enabled and a signature includes an embedded key, that key is
|
||||||
|
used to verify the signature and on verification success that key is
|
||||||
|
imported. The default is @option{--no-auto-key-import}.
|
||||||
|
|
||||||
|
On the sender (signing) site the option @option{--include-key-block}
|
||||||
|
needs to be used to put the public part of the signing key as “Key
|
||||||
|
Block subpacket” into the signature.
|
||||||
|
|
||||||
@item --auto-key-retrieve
|
@item --auto-key-retrieve
|
||||||
@itemx --no-auto-key-retrieve
|
@itemx --no-auto-key-retrieve
|
||||||
@opindex auto-key-retrieve
|
@opindex auto-key-retrieve
|
||||||
@ -1828,22 +1842,26 @@ local keyring. The default is @option{--no-auto-key-retrieve}.
|
|||||||
|
|
||||||
The order of methods tried to lookup the key is:
|
The order of methods tried to lookup the key is:
|
||||||
|
|
||||||
1. If a preferred keyserver is specified in the signature and the
|
1. If the option @option{--auto-key-import} is set and the signatures
|
||||||
|
includes an embedded key, that key is used to verify the
|
||||||
|
signature and on verification success that key is imported.
|
||||||
|
|
||||||
|
2. If a preferred keyserver is specified in the signature and the
|
||||||
option @option{honor-keyserver-url} is active (which is not the
|
option @option{honor-keyserver-url} is active (which is not the
|
||||||
default), that keyserver is tried. Note that the creator of the
|
default), that keyserver is tried. Note that the creator of the
|
||||||
signature uses the option @option{--sig-keyserver-url} to specify the
|
signature uses the option @option{--sig-keyserver-url} to specify the
|
||||||
preferred keyserver for data signatures.
|
preferred keyserver for data signatures.
|
||||||
|
|
||||||
2. If the signature has the Signer's UID set (e.g. using
|
3. If the signature has the Signer's UID set (e.g. using
|
||||||
@option{--sender} while creating the signature) a Web Key Directory
|
@option{--sender} while creating the signature) a Web Key Directory
|
||||||
(WKD) lookup is done. This is the default configuration but can be
|
(WKD) lookup is done. This is the default configuration but can be
|
||||||
disabled by removing WKD from the auto-key-locate list or by using the
|
disabled by removing WKD from the auto-key-locate list or by using the
|
||||||
option @option{--disable-signer-uid}.
|
option @option{--disable-signer-uid}.
|
||||||
|
|
||||||
3. If the option @option{honor-pka-record} is active, the legacy PKA
|
4. If the option @option{honor-pka-record} is active, the legacy PKA
|
||||||
method is used.
|
method is used.
|
||||||
|
|
||||||
4. If any keyserver is configured and the Issuer Fingerprint is part
|
5. If any keyserver is configured and the Issuer Fingerprint is part
|
||||||
of the signature (since GnuPG 2.1.16), the configured keyservers are
|
of the signature (since GnuPG 2.1.16), the configured keyservers are
|
||||||
tried.
|
tried.
|
||||||
|
|
||||||
|
11
g10/gpg.c
11
g10/gpg.c
@ -352,6 +352,8 @@ enum cmd_and_opt_values
|
|||||||
oNoRandomSeedFile,
|
oNoRandomSeedFile,
|
||||||
oAutoKeyRetrieve,
|
oAutoKeyRetrieve,
|
||||||
oNoAutoKeyRetrieve,
|
oNoAutoKeyRetrieve,
|
||||||
|
oAutoKeyImport,
|
||||||
|
oNoAutoKeyImport,
|
||||||
oUseAgent,
|
oUseAgent,
|
||||||
oNoUseAgent,
|
oNoUseAgent,
|
||||||
oGpgAgentInfo,
|
oGpgAgentInfo,
|
||||||
@ -425,6 +427,7 @@ enum cmd_and_opt_values
|
|||||||
oNoSymkeyCache,
|
oNoSymkeyCache,
|
||||||
oUseOnlyOpenPGPCard,
|
oUseOnlyOpenPGPCard,
|
||||||
oIncludeKeyBlock,
|
oIncludeKeyBlock,
|
||||||
|
oNoIncludeKeyBlock,
|
||||||
|
|
||||||
oNoop
|
oNoop
|
||||||
};
|
};
|
||||||
@ -890,6 +893,8 @@ static ARGPARSE_OPTS opts[] = {
|
|||||||
ARGPARSE_s_n (oNoAutostart, "no-autostart", "@"),
|
ARGPARSE_s_n (oNoAutostart, "no-autostart", "@"),
|
||||||
ARGPARSE_s_n (oNoSymkeyCache, "no-symkey-cache", "@"),
|
ARGPARSE_s_n (oNoSymkeyCache, "no-symkey-cache", "@"),
|
||||||
ARGPARSE_s_n (oIncludeKeyBlock, "include-key-block", "@"),
|
ARGPARSE_s_n (oIncludeKeyBlock, "include-key-block", "@"),
|
||||||
|
ARGPARSE_s_n (oAutoKeyImport, "auto-key-import", "@"),
|
||||||
|
ARGPARSE_s_n (oNoAutoKeyImport, "no-auto-key-import", "@"),
|
||||||
|
|
||||||
/* Options to override new security defaults. */
|
/* Options to override new security defaults. */
|
||||||
ARGPARSE_s_n (oAllowWeakKeySignatures, "allow-weak-key-signatures", "@"),
|
ARGPARSE_s_n (oAllowWeakKeySignatures, "allow-weak-key-signatures", "@"),
|
||||||
@ -1873,6 +1878,8 @@ gpgconf_list (const char *configfile)
|
|||||||
es_printf ("encrypt-to:%lu:\n", GC_OPT_FLAG_NONE);
|
es_printf ("encrypt-to:%lu:\n", GC_OPT_FLAG_NONE);
|
||||||
es_printf ("try-secret-key:%lu:\n", GC_OPT_FLAG_NONE);
|
es_printf ("try-secret-key:%lu:\n", GC_OPT_FLAG_NONE);
|
||||||
es_printf ("auto-key-locate:%lu:\n", GC_OPT_FLAG_NONE);
|
es_printf ("auto-key-locate:%lu:\n", GC_OPT_FLAG_NONE);
|
||||||
|
es_printf ("auto-key-import:%lu:\n", GC_OPT_FLAG_NONE);
|
||||||
|
es_printf ("include-key-block:%lu:\n", GC_OPT_FLAG_NONE);
|
||||||
es_printf ("auto-key-retrieve:%lu:\n", GC_OPT_FLAG_NONE);
|
es_printf ("auto-key-retrieve:%lu:\n", GC_OPT_FLAG_NONE);
|
||||||
es_printf ("log-file:%lu:\n", GC_OPT_FLAG_NONE);
|
es_printf ("log-file:%lu:\n", GC_OPT_FLAG_NONE);
|
||||||
es_printf ("debug-level:%lu:\"none:\n", GC_OPT_FLAG_DEFAULT);
|
es_printf ("debug-level:%lu:\"none:\n", GC_OPT_FLAG_DEFAULT);
|
||||||
@ -2993,6 +3000,7 @@ main (int argc, char **argv)
|
|||||||
|
|
||||||
case oDisableSignerUID: opt.flags.disable_signer_uid = 1; break;
|
case oDisableSignerUID: opt.flags.disable_signer_uid = 1; break;
|
||||||
case oIncludeKeyBlock: opt.flags.include_key_block = 1; break;
|
case oIncludeKeyBlock: opt.flags.include_key_block = 1; break;
|
||||||
|
case oNoIncludeKeyBlock: opt.flags.include_key_block = 0; break;
|
||||||
|
|
||||||
case oS2KMode: opt.s2k_mode = pargs.r.ret_int; break;
|
case oS2KMode: opt.s2k_mode = pargs.r.ret_int; break;
|
||||||
case oS2KDigest: s2k_digest_string = xstrdup(pargs.r.ret_str); break;
|
case oS2KDigest: s2k_digest_string = xstrdup(pargs.r.ret_str); break;
|
||||||
@ -3375,6 +3383,9 @@ main (int argc, char **argv)
|
|||||||
case oIgnoreMDCError: opt.ignore_mdc_error = 1; break;
|
case oIgnoreMDCError: opt.ignore_mdc_error = 1; break;
|
||||||
case oNoRandomSeedFile: use_random_seed = 0; break;
|
case oNoRandomSeedFile: use_random_seed = 0; break;
|
||||||
|
|
||||||
|
case oAutoKeyImport: opt.flags.auto_key_import = 1; break;
|
||||||
|
case oNoAutoKeyImport: opt.flags.auto_key_import = 0; break;
|
||||||
|
|
||||||
case oAutoKeyRetrieve:
|
case oAutoKeyRetrieve:
|
||||||
opt.keyserver_options.options |= KEYSERVER_AUTO_KEY_RETRIEVE;
|
opt.keyserver_options.options |= KEYSERVER_AUTO_KEY_RETRIEVE;
|
||||||
break;
|
break;
|
||||||
|
@ -1905,14 +1905,11 @@ check_sig_and_print (CTX c, kbnode_t node)
|
|||||||
|
|
||||||
rc = do_check_sig (c, node, NULL, NULL, &is_expkey, &is_revkey, &pk);
|
rc = do_check_sig (c, node, NULL, NULL, &is_expkey, &is_revkey, &pk);
|
||||||
|
|
||||||
/* If the key is not found but the signaure includes a key bnlock we
|
/* If the key is not found but the signature includes a key block we
|
||||||
* import that key block and trry again. We keep this key block
|
* use that key block for verification and on success import it. */
|
||||||
* only if the signature verifies. */
|
|
||||||
/* FIXME: Shall we add an option to disable it or use it only if
|
|
||||||
* --auto-key-retriueve is set? */
|
|
||||||
if (gpg_err_code (rc) == GPG_ERR_NO_PUBKEY
|
if (gpg_err_code (rc) == GPG_ERR_NO_PUBKEY
|
||||||
&& sig->flags.key_block)
|
&& sig->flags.key_block
|
||||||
/* && (opt.keyserver_options.options & KEYSERVER_AUTO_KEY_RETRIEVE)) */
|
&& opt.flags.auto_key_import)
|
||||||
{
|
{
|
||||||
PKT_public_key *included_pk;
|
PKT_public_key *included_pk;
|
||||||
const byte *kblock;
|
const byte *kblock;
|
||||||
|
@ -233,6 +233,7 @@ struct
|
|||||||
unsigned int large_rsa:1;
|
unsigned int large_rsa:1;
|
||||||
unsigned int disable_signer_uid:1;
|
unsigned int disable_signer_uid:1;
|
||||||
unsigned int include_key_block:1;
|
unsigned int include_key_block:1;
|
||||||
|
unsigned int auto_key_import:1;
|
||||||
/* Flag to enable experimental features from RFC4880bis. */
|
/* Flag to enable experimental features from RFC4880bis. */
|
||||||
unsigned int rfc4880bis:1;
|
unsigned int rfc4880bis:1;
|
||||||
/* Hack: --output is not given but OUTFILE was temporary set to "-". */
|
/* Hack: --output is not given but OUTFILE was temporary set to "-". */
|
||||||
|
@ -756,6 +756,12 @@ static gc_option_t gc_options_gpg[] =
|
|||||||
{ "auto-key-locate", GC_OPT_FLAG_NONE, GC_LEVEL_ADVANCED,
|
{ "auto-key-locate", GC_OPT_FLAG_NONE, GC_LEVEL_ADVANCED,
|
||||||
"gnupg", N_("|MECHANISMS|use MECHANISMS to locate keys by mail address"),
|
"gnupg", N_("|MECHANISMS|use MECHANISMS to locate keys by mail address"),
|
||||||
GC_ARG_TYPE_STRING, GC_BACKEND_GPG },
|
GC_ARG_TYPE_STRING, GC_BACKEND_GPG },
|
||||||
|
{ "auto-key-import", GC_OPT_FLAG_NONE, GC_LEVEL_BASIC,
|
||||||
|
N_("import missing key from a signature"), "gnupg",
|
||||||
|
GC_ARG_TYPE_NONE, GC_BACKEND_GPG },
|
||||||
|
{ "include-key-block", GC_OPT_FLAG_NONE, GC_LEVEL_BASIC,
|
||||||
|
N_("include the public key in signatures"), "gnupg",
|
||||||
|
GC_ARG_TYPE_NONE, GC_BACKEND_GPG },
|
||||||
{ "auto-key-retrieve", GC_OPT_FLAG_NONE, GC_LEVEL_EXPERT,
|
{ "auto-key-retrieve", GC_OPT_FLAG_NONE, GC_LEVEL_EXPERT,
|
||||||
NULL, NULL, GC_ARG_TYPE_NONE, GC_BACKEND_GPG },
|
NULL, NULL, GC_ARG_TYPE_NONE, GC_BACKEND_GPG },
|
||||||
{ "no-auto-key-retrieve", GC_OPT_FLAG_NONE, GC_LEVEL_INVISIBLE,
|
{ "no-auto-key-retrieve", GC_OPT_FLAG_NONE, GC_LEVEL_INVISIBLE,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user