diff options
author | Werner Koch <wk@gnupg.org> | 2019-02-21 12:43:07 +0100 |
---|---|---|
committer | Werner Koch <wk@gnupg.org> | 2019-02-21 12:43:07 +0100 |
commit | 7317aeb3f448c98dcfa9c04f49b9a69d81c26776 (patch) | |
tree | cef6aa41dc512016a7233f1426cd5807e6402e19 /tools | |
parent | scd: Extend KEYPAIRINFO by key usage info. (diff) | |
download | gnupg2-7317aeb3f448c98dcfa9c04f49b9a69d81c26776.tar.xz gnupg2-7317aeb3f448c98dcfa9c04f49b9a69d81c26776.zip |
card: Print usage info for each key.
* tools/card-call-scd.c (learn_status_cb): Handle extended
KEYPARIRINFO.
* tools/card-tool.h (struct key_info_s): Add field 'usage'.
* tools/gpg-card-tool.c (list_one_kinfo): Show usage flags.
Signed-off-by: Werner Koch <wk@gnupg.org>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/card-call-scd.c | 49 | ||||
-rw-r--r-- | tools/card-tool.h | 2 | ||||
-rw-r--r-- | tools/gpg-card-tool.c | 20 |
3 files changed, 60 insertions, 11 deletions
diff --git a/tools/card-call-scd.c b/tools/card-call-scd.c index 8610da8b6..83e9ba099 100644 --- a/tools/card-call-scd.c +++ b/tools/card-call-scd.c @@ -890,28 +890,59 @@ learn_status_cb (void *opaque, const char *line) else if (!memcmp (keyword, "KEYPAIRINFO", keywordlen)) { /* The format of such a line is: - * KEYPARINFO <hexgrip> <keyref> + * KEYPAIRINFO <hexgrip> <keyref> [usage] */ - const char *hexgrp = line; + char *hexgrp, *usage; - while (*line && !spacep (line)) - line++; - while (spacep (line)) - line++; + line_buffer = pline = xstrdup (line); - keyref = line; + hexgrp = pline; + while (*pline && !spacep (pline)) + pline++; + while (spacep (pline)) + pline++; + + keyref = pline; + while (*pline && !spacep (pline)) + pline++; + if (*pline) + { + *pline++ = 0; + while (spacep (pline)) + pline++; + usage = pline; + while (*pline && !spacep (pline)) + pline++; + *pline = 0; + } + else + usage = ""; /* Check whether we already have an item for the keyref. */ kinfo = find_kinfo (parm, keyref); if (!kinfo) /* New entry. */ kinfo = create_kinfo (parm, keyref); - else /* Existing entry - clear the grip. */ - memset (kinfo->grip, 0, sizeof kinfo->grip); + else /* Existing entry - clear grip and usage */ + { + memset (kinfo->grip, 0, sizeof kinfo->grip); + kinfo->usage = 0; + } /* Set or update the grip. Note that due to the * calloc/memset an erroneous too short grip will be nul * padded on the right. */ unhexify_fpr (hexgrp, kinfo->grip, sizeof kinfo->grip); + /* Parse and set the usage. */ + for (; *usage; usage++) + { + switch (*usage) + { + case 's': kinfo->usage |= GCRY_PK_USAGE_SIGN; break; + case 'c': kinfo->usage |= GCRY_PK_USAGE_CERT; break; + case 'a': kinfo->usage |= GCRY_PK_USAGE_AUTH; break; + case 'e': kinfo->usage |= GCRY_PK_USAGE_ENCR; break; + } + } } break; diff --git a/tools/card-tool.h b/tools/card-tool.h index f83ebf983..5598ae5fd 100644 --- a/tools/card-tool.h +++ b/tools/card-tool.h @@ -127,7 +127,7 @@ struct key_info_s unsigned char fprlen; /* Use length of the next item. */ unsigned char fpr[32]; /* The binary fingerprint of length FPRLEN. */ u32 created; /* The time the key was created. */ - + unsigned int usage; /* Usage flags. (GCRY_PK_USAGE_*) */ char keyref[1]; /* String with the keyref (e.g. OPENPGP.1). */ }; typedef struct key_info_s *key_info_t; diff --git a/tools/gpg-card-tool.c b/tools/gpg-card-tool.c index a13a6bdaf..eb723d7ab 100644 --- a/tools/gpg-card-tool.c +++ b/tools/gpg-card-tool.c @@ -621,6 +621,7 @@ list_one_kinfo (key_info_t firstkinfo, key_info_t kinfo, estream_t fp) key_info_t ki; const char *s; gcry_sexp_t s_pkey; + int any; if (firstkinfo && kinfo) { @@ -630,8 +631,25 @@ list_one_kinfo (key_info_t firstkinfo, key_info_t kinfo, estream_t fp) tty_fprintf (fp, "[none]\n"); goto leave; } + print_keygrip (fp, kinfo->grip); - tty_fprintf (fp, " keyref .....: %s\n", kinfo->keyref); + tty_fprintf (fp, " keyref .....: %s", kinfo->keyref); + if (kinfo->usage) + { + any = 0; + tty_fprintf (fp, " ("); + if ((kinfo->usage & GCRY_PK_USAGE_SIGN)) + { tty_fprintf (fp, "sign"); any=1; } + if ((kinfo->usage & GCRY_PK_USAGE_CERT)) + { tty_fprintf (fp, "%scert", any?",":""); any=1; } + if ((kinfo->usage & GCRY_PK_USAGE_AUTH)) + { tty_fprintf (fp, "%sauth", any?",":""); any=1; } + if ((kinfo->usage & GCRY_PK_USAGE_ENCR)) + { tty_fprintf (fp, "%sencr", any?",":""); any=1; } + tty_fprintf (fp, ")"); + } + tty_fprintf (fp, "\n"); + if (!scd_readkey (kinfo->keyref, &s_pkey)) { char *tmp = pubkey_algo_string (s_pkey); |