diff options
author | NIIBE Yutaka <[email protected]> | 2022-05-26 03:01:16 +0000 |
---|---|---|
committer | NIIBE Yutaka <[email protected]> | 2022-05-26 03:01:16 +0000 |
commit | 5264d3f58e8a8362900c3518bdd683ff9a23cccc (patch) | |
tree | d49c9b558c4f2ca4408fcb98910d742c8789f2e8 /scd/app-p15.c | |
parent | scd,piv: Fix status report of KEYPAIRINFO. (diff) | |
download | gnupg-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.c | 82 |
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) { |