aboutsummaryrefslogtreecommitdiffstats
path: root/scd/app-p15.c
diff options
context:
space:
mode:
authorNIIBE Yutaka <[email protected]>2022-05-26 03:01:16 +0000
committerNIIBE Yutaka <[email protected]>2022-05-26 03:01:16 +0000
commit5264d3f58e8a8362900c3518bdd683ff9a23cccc (patch)
treed49c9b558c4f2ca4408fcb98910d742c8789f2e8 /scd/app-p15.c
parentscd,piv: Fix status report of KEYPAIRINFO. (diff)
downloadgnupg-5264d3f58e8a8362900c3518bdd683ff9a23cccc.tar.gz
gnupg-5264d3f58e8a8362900c3518bdd683ff9a23cccc.zip
scd: Return USAGE information for KEYINFO command.
* scd/command.c (hlp_keyinfo): Update. (send_keyinfo): Add a USAGE argument. * scd/scdaemon.h (send_keyinfo): Add a USAGE argument. * scd/app-nks.c (set_usage_string): New. (do_learn_status_core, do_readkey): Use set_usage_string. (do_with_keygrip): Add USAGE to call send_keyinfo, using set_usage_string. * scd/app-openpgp.c (get_usage_string): New. (send_keypair_info): Use get_usage_string. (send_keyinfo_if_available): Add USAGE to call send_keyinfo, using get_usage_string. * scd/app-p15.c (set_usage_string): New. (send_keypairinfo): Use set_usage_string. (do_with_keygrip): Add USAGE to call send_keyinfo, using set_usage_string. * scd/app-piv.c (do_with_keygrip): Add USAGE to call send_keyinfo. -- Signed-off-by: NIIBE Yutaka <[email protected]>
Diffstat (limited to 'scd/app-p15.c')
-rw-r--r--scd/app-p15.c82
1 files changed, 46 insertions, 36 deletions
diff --git a/scd/app-p15.c b/scd/app-p15.c
index ac6b875b8..5310af84d 100644
--- a/scd/app-p15.c
+++ b/scd/app-p15.c
@@ -4110,6 +4110,47 @@ keyref_from_prkdf (app_t app, prkdf_object_t prkdf)
}
+static void
+set_usage_string (char usage[5], prkdf_object_t prkdf)
+{
+ size_t usagelen = 0;
+ if (prkdf->gpgusage.any)
+ {
+ if (prkdf->gpgusage.sign)
+ usage[usagelen++] = 's';
+ if (prkdf->gpgusage.cert)
+ usage[usagelen++] = 'c';
+ if (prkdf->gpgusage.encr)
+ usage[usagelen++] = 'e';
+ if (prkdf->gpgusage.auth)
+ usage[usagelen++] = 'a';
+ }
+ else
+ {
+ if ((prkdf->usageflags.sign
+ || prkdf->usageflags.sign_recover
+ || prkdf->usageflags.non_repudiation)
+ && (!prkdf->extusage.valid
+ || prkdf->extusage.sign))
+ usage[usagelen++] = 's';
+ if ((prkdf->usageflags.sign
+ || prkdf->usageflags.sign_recover)
+ && (!prkdf->extusage.valid || prkdf->extusage.sign))
+ usage[usagelen++] = 'c';
+ if ((prkdf->usageflags.decrypt
+ || prkdf->usageflags.unwrap)
+ && (!prkdf->extusage.valid || prkdf->extusage.encr))
+ usage[usagelen++] = 'e';
+ if ((prkdf->usageflags.sign
+ || prkdf->usageflags.sign_recover)
+ && (!prkdf->extusage.valid || prkdf->extusage.auth))
+ usage[usagelen++] = 'a';
+ }
+ if (!usagelen)
+ usage[usagelen++] = '-';
+ usage[usagelen++] = 0;
+}
+
/* Helper to do_learn_status: Send information about all known
keypairs back. FIXME: much code duplication from
send_certinfo(). */
@@ -4140,40 +4181,6 @@ send_keypairinfo (app_t app, ctrl_t ctrl, prkdf_object_t prkdf)
char usage[5];
char keytime[20];
const char *algostr;
- size_t usagelen = 0;
-
- if (prkdf->gpgusage.any)
- {
- if (prkdf->gpgusage.sign)
- usage[usagelen++] = 's';
- if (prkdf->gpgusage.cert)
- usage[usagelen++] = 'c';
- if (prkdf->gpgusage.encr)
- usage[usagelen++] = 'e';
- if (prkdf->gpgusage.auth)
- usage[usagelen++] = 'a';
- }
- else
- {
- if ((prkdf->usageflags.sign
- || prkdf->usageflags.sign_recover
- || prkdf->usageflags.non_repudiation)
- && (!prkdf->extusage.valid
- || prkdf->extusage.sign))
- usage[usagelen++] = 's';
- if ((prkdf->usageflags.sign
- || prkdf->usageflags.sign_recover)
- && (!prkdf->extusage.valid || prkdf->extusage.sign))
- usage[usagelen++] = 'c';
- if ((prkdf->usageflags.decrypt
- || prkdf->usageflags.unwrap)
- && (!prkdf->extusage.valid || prkdf->extusage.encr))
- usage[usagelen++] = 'e';
- if ((prkdf->usageflags.sign
- || prkdf->usageflags.sign_recover)
- && (!prkdf->extusage.valid || prkdf->extusage.auth))
- usage[usagelen++] = 'a';
- }
log_assert (strlen (prkdf->keygrip) == 40);
if (prkdf->keytime && prkdf->have_keytime)
@@ -4184,10 +4191,11 @@ send_keypairinfo (app_t app, ctrl_t ctrl, prkdf_object_t prkdf)
algostr = prkdf->keyalgostr;
+ set_usage_string (usage, prkdf);
send_status_info (ctrl, "KEYPAIRINFO",
prkdf->keygrip, 2*KEYGRIP_LEN,
buf, strlen (buf),
- usage, usagelen,
+ usage, strlen (usage),
keytime, strlen (keytime),
algostr, strlen (algostr?algostr:""),
NULL, (size_t)0);
@@ -6017,6 +6025,7 @@ do_with_keygrip (app_t app, ctrl_t ctrl, int action,
else if (!want_keygripstr || !strcmp (prkdf->keygrip, want_keygripstr))
{
char *keyref;
+ char usage[5];
if (capability == GCRY_PK_USAGE_SIGN)
{
@@ -6042,7 +6051,8 @@ do_with_keygrip (app_t app, ctrl_t ctrl, int action,
goto leave;
}
- send_keyinfo (ctrl, as_data, prkdf->keygrip, serialno, keyref);
+ set_usage_string (usage, prkdf);
+ send_keyinfo (ctrl, as_data, prkdf->keygrip, serialno, keyref, usage);
xfree (keyref);
if (want_keygripstr)
{