1
0
mirror of git://git.gnupg.org/gnupg.git synced 2024-12-22 10:19:57 +01:00

card: New option --no-key-lookup.

* tools/gpg-card.h (opt): Add var no_key_lookup.
* tools/gpg-card.c (oNoKeyLookup): New const.
(opts): New option --no-key-lookup.
(list_one_kinfo): Add arg no_key_lookup and implement.
(list_all_kinfo): Add arg no_key_lookup.
(list_openpgp, list_piv, list_card): Ditto.
(cmd_list): New option --no-key-lookup.
--

Printing the OpenPGP and X.509 keys used for a specific card key can
be a lengthy operation.  The new command line option and option to
"list" allows to suppress that part of the output.
This commit is contained in:
Werner Koch 2020-02-12 11:16:41 +01:00
parent 9c719c9c1f
commit 2c6092bc5d
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B
2 changed files with 40 additions and 22 deletions

View File

@ -71,6 +71,8 @@ enum opt_values
oLCctype,
oLCmessages,
oNoKeyLookup,
oDummy
};
@ -94,6 +96,8 @@ static ARGPARSE_OPTS opts[] = {
ARGPARSE_s_s (oXauthority, "xauthority", "@"),
ARGPARSE_s_s (oLCctype, "lc-ctype", "@"),
ARGPARSE_s_s (oLCmessages, "lc-messages","@"),
ARGPARSE_s_n (oNoKeyLookup,"no-key-lookup",
"use --no-key-lookup for \"list\""),
ARGPARSE_end ()
};
@ -220,6 +224,8 @@ parse_arguments (ARGPARSE_ARGS *pargs, ARGPARSE_OPTS *popts)
case oLCctype: opt.lc_ctype = pargs->r.ret_str; break;
case oLCmessages: opt.lc_messages = pargs->r.ret_str; break;
case oNoKeyLookup: opt.no_key_lookup = 1; break;
default: pargs->err = 2; break;
}
}
@ -636,7 +642,7 @@ mem_is_zero (const char *mem, unsigned int memlen)
* reference if no info is available; it may be NULL. */
static void
list_one_kinfo (key_info_t firstkinfo, key_info_t kinfo,
const char *label_keyref, estream_t fp)
const char *label_keyref, estream_t fp, int no_key_lookup)
{
gpg_error_t err;
keyblock_t keyblock = NULL;
@ -697,9 +703,12 @@ list_one_kinfo (key_info_t firstkinfo, key_info_t kinfo,
tty_fprintf (fp, " created ....: %s\n",
isotimestamp (kinfo->created));
}
err = get_matching_keys (kinfo->grip,
(GNUPG_PROTOCOL_OPENPGP | GNUPG_PROTOCOL_CMS),
&keyblock);
if (no_key_lookup)
err = 0;
else
err = get_matching_keys (kinfo->grip,
(GNUPG_PROTOCOL_OPENPGP | GNUPG_PROTOCOL_CMS),
&keyblock);
if (err)
{
if (gpg_err_code (err) != GPG_ERR_NO_PUBKEY)
@ -765,7 +774,8 @@ list_one_kinfo (key_info_t firstkinfo, key_info_t kinfo,
/* List all keyinfo in INFO using the list of LABELS. */
static void
list_all_kinfo (card_info_t info, keyinfolabel_t labels, estream_t fp)
list_all_kinfo (card_info_t info, keyinfolabel_t labels, estream_t fp,
int no_key_lookup)
{
key_info_t kinfo;
int idx, i;
@ -780,7 +790,8 @@ list_all_kinfo (card_info_t info, keyinfolabel_t labels, estream_t fp)
{
tty_fprintf (fp, "%s", labels[idx].label);
kinfo = find_kinfo (info, labels[idx].keyref);
list_one_kinfo (info->kinfo, kinfo, labels[idx].keyref, fp);
list_one_kinfo (info->kinfo, kinfo, labels[idx].keyref,
fp, no_key_lookup);
if (kinfo)
kinfo->xflag = 1;
}
@ -793,14 +804,14 @@ list_all_kinfo (card_info_t info, keyinfolabel_t labels, estream_t fp)
for (i=5+strlen (kinfo->keyref); i < 18; i++)
tty_fprintf (fp, ".");
tty_fprintf (fp, ":");
list_one_kinfo (info->kinfo, kinfo, NULL, fp);
list_one_kinfo (info->kinfo, kinfo, NULL, fp, no_key_lookup);
}
}
/* List OpenPGP card specific data. */
static void
list_openpgp (card_info_t info, estream_t fp)
list_openpgp (card_info_t info, estream_t fp, int no_key_lookup)
{
static struct keyinfolabel_s keyinfolabels[] = {
{ "Signature key ....:", "OPENPGP.1" },
@ -871,14 +882,14 @@ list_openpgp (card_info_t info, estream_t fp)
info->uif[2] ? "on" : "off");
}
list_all_kinfo (info, keyinfolabels, fp);
list_all_kinfo (info, keyinfolabels, fp, no_key_lookup);
}
/* List PIV card specific data. */
static void
list_piv (card_info_t info, estream_t fp)
list_piv (card_info_t info, estream_t fp, int no_key_lookup)
{
static struct keyinfolabel_s keyinfolabels[] = {
{ "PIV authentication:", "PIV.9A" },
@ -931,8 +942,7 @@ list_piv (card_info_t info, estream_t fp)
}
}
tty_fprintf (fp, "\n");
list_all_kinfo (info, keyinfolabels, fp);
list_all_kinfo (info, keyinfolabels, fp, no_key_lookup);
}
@ -955,9 +965,11 @@ print_a_version (estream_t fp, const char *prefix, unsigned int value)
}
/* Print all available information about the current card. */
/* Print all available information about the current card. With
* NO_KEY_LOOKUP the sometimes expensive listing of all matching
* OpenPGP and X.509 keys is not done */
static void
list_card (card_info_t info)
list_card (card_info_t info, int no_key_lookup)
{
estream_t fp = opt.interactive? NULL : es_stdout;
@ -983,8 +995,8 @@ list_card (card_info_t info)
switch (info->apptype)
{
case APP_TYPE_OPENPGP: list_openpgp (info, fp); break;
case APP_TYPE_PIV: list_piv (info, fp); break;
case APP_TYPE_OPENPGP: list_openpgp (info, fp, no_key_lookup); break;
case APP_TYPE_PIV: list_piv (info, fp, no_key_lookup); break;
default: break;
}
}
@ -996,7 +1008,7 @@ static gpg_error_t
cmd_list (card_info_t info, char *argstr)
{
gpg_error_t err;
int opt_cards, opt_apps;
int opt_cards, opt_apps, opt_no_key_lookup;
strlist_t cards = NULL;
strlist_t sl;
estream_t fp = opt.interactive? NULL : es_stdout;
@ -1010,19 +1022,23 @@ cmd_list (card_info_t info, char *argstr)
if (!info)
return print_help
("LIST [--cards] [--apps] [N] [APP]\n\n"
("LIST [--cards] [--apps] [--no-key-lookup] [N] [APP]\n\n"
"Show the content of the current card.\n"
"With N given select and list the n-th card;\n"
"with APP also given select that application.\n"
"To select an APP on the current card use '-' for N.\n"
"Option --cards lists available cards.\n"
"Option --apps lists additional card applications",
0);
" --cards lists available cards\n"
" --apps lists additional card applications\n"
" --no-key-lookup does not list matching OpenPGP or X.509 keys\n"
, 0);
opt_cards = has_leading_option (argstr, "--cards");
opt_apps = has_leading_option (argstr, "--apps");
opt_no_key_lookup = has_leading_option (argstr, "--no-key-lookup");
argstr = skip_options (argstr);
if (opt.no_key_lookup)
opt_no_key_lookup = 1;
if (digitp (argstr) || (*argstr == '-' && spacep (argstr+1)))
{
@ -1132,7 +1148,7 @@ cmd_list (card_info_t info, char *argstr)
else
err = 0;
if (!err)
list_card (info);
list_card (info, opt_no_key_lookup);
}
leave:

View File

@ -38,6 +38,8 @@ struct
const char *agent_program;
int autostart;
int no_key_lookup; /* Assume --no-key-lookup for "list". */
/* Options passed to the gpg-agent: */
session_env_t session_env;
char *lc_ctype;