mirror of
git://git.gnupg.org/gnupg.git
synced 2025-04-13 22:21:09 +02:00
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>
This commit is contained in:
parent
5e21ef2d55
commit
7317aeb3f4
@ -890,28 +890,59 @@ learn_status_cb (void *opaque, const char *line)
|
|||||||
else if (!memcmp (keyword, "KEYPAIRINFO", keywordlen))
|
else if (!memcmp (keyword, "KEYPAIRINFO", keywordlen))
|
||||||
{
|
{
|
||||||
/* The format of such a line is:
|
/* 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_buffer = pline = xstrdup (line);
|
||||||
line++;
|
|
||||||
while (spacep (line))
|
|
||||||
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. */
|
/* Check whether we already have an item for the keyref. */
|
||||||
kinfo = find_kinfo (parm, keyref);
|
kinfo = find_kinfo (parm, keyref);
|
||||||
if (!kinfo) /* New entry. */
|
if (!kinfo) /* New entry. */
|
||||||
kinfo = create_kinfo (parm, keyref);
|
kinfo = create_kinfo (parm, keyref);
|
||||||
else /* Existing entry - clear the grip. */
|
else /* Existing entry - clear grip and usage */
|
||||||
memset (kinfo->grip, 0, sizeof kinfo->grip);
|
{
|
||||||
|
memset (kinfo->grip, 0, sizeof kinfo->grip);
|
||||||
|
kinfo->usage = 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Set or update the grip. Note that due to the
|
/* Set or update the grip. Note that due to the
|
||||||
* calloc/memset an erroneous too short grip will be nul
|
* calloc/memset an erroneous too short grip will be nul
|
||||||
* padded on the right. */
|
* padded on the right. */
|
||||||
unhexify_fpr (hexgrp, kinfo->grip, sizeof kinfo->grip);
|
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;
|
break;
|
||||||
|
|
||||||
|
@ -127,7 +127,7 @@ struct key_info_s
|
|||||||
unsigned char fprlen; /* Use length of the next item. */
|
unsigned char fprlen; /* Use length of the next item. */
|
||||||
unsigned char fpr[32]; /* The binary fingerprint of length FPRLEN. */
|
unsigned char fpr[32]; /* The binary fingerprint of length FPRLEN. */
|
||||||
u32 created; /* The time the key was created. */
|
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). */
|
char keyref[1]; /* String with the keyref (e.g. OPENPGP.1). */
|
||||||
};
|
};
|
||||||
typedef struct key_info_s *key_info_t;
|
typedef struct key_info_s *key_info_t;
|
||||||
|
@ -621,6 +621,7 @@ list_one_kinfo (key_info_t firstkinfo, key_info_t kinfo, estream_t fp)
|
|||||||
key_info_t ki;
|
key_info_t ki;
|
||||||
const char *s;
|
const char *s;
|
||||||
gcry_sexp_t s_pkey;
|
gcry_sexp_t s_pkey;
|
||||||
|
int any;
|
||||||
|
|
||||||
if (firstkinfo && kinfo)
|
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");
|
tty_fprintf (fp, "[none]\n");
|
||||||
goto leave;
|
goto leave;
|
||||||
}
|
}
|
||||||
|
|
||||||
print_keygrip (fp, kinfo->grip);
|
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))
|
if (!scd_readkey (kinfo->keyref, &s_pkey))
|
||||||
{
|
{
|
||||||
char *tmp = pubkey_algo_string (s_pkey);
|
char *tmp = pubkey_algo_string (s_pkey);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user