aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNIIBE Yutaka <[email protected]>2019-04-26 02:00:53 +0000
committerNIIBE Yutaka <[email protected]>2019-04-26 02:00:53 +0000
commitc2da86bbf1f75018b4533b7f90a2f710869b1d54 (patch)
tree36b961771acda207213226c9c6a172e58299fa69
parentscd: Add new command: KEYINFO. (diff)
downloadgnupg-c2da86bbf1f75018b4533b7f90a2f710869b1d54.tar.gz
gnupg-c2da86bbf1f75018b4533b7f90a2f710869b1d54.zip
scd: Support direct use of app with PKSIGN.
* scd/command.c (cmd_pksign): When length of keyidstr is 40, it is considered a keygrip for direct use. Signed-off-by: NIIBE Yutaka <[email protected]>
-rw-r--r--scd/command.c31
1 files changed, 26 insertions, 5 deletions
diff --git a/scd/command.c b/scd/command.c
index 33e1985b3..9cbfbbb42 100644
--- a/scd/command.c
+++ b/scd/command.c
@@ -757,6 +757,8 @@ cmd_pksign (assuan_context_t ctx, char *line)
size_t outdatalen;
char *keyidstr;
int hash_algo;
+ app_t app;
+ int direct = 0;
if (has_option (line, "--hash=rmd160"))
hash_algo = GCRY_MD_RMD160;
@@ -789,11 +791,30 @@ cmd_pksign (assuan_context_t ctx, char *line)
if (!keyidstr)
return out_of_core ();
- rc = app_sign (ctrl->app_ctx, ctrl,
- keyidstr, hash_algo,
- pin_cb, ctx,
- ctrl->in_data.value, ctrl->in_data.valuelen,
- &outdata, &outdatalen);
+ /* When it's a keygrip, we directly use APP, with no change of
+ ctrl->app_ctx. */
+ if (strlen (keyidstr) == 40)
+ {
+ app = app_do_with_keygrip (ctrl, KEYGRIP_ACTION_LOOKUP, keyidstr);
+ direct = 1;
+ }
+ else
+ app = ctrl->app_ctx;
+
+ if (app)
+ {
+ if (direct)
+ app->ref_count++;
+ rc = app_sign (app, ctrl,
+ keyidstr, hash_algo,
+ pin_cb, ctx,
+ ctrl->in_data.value, ctrl->in_data.valuelen,
+ &outdata, &outdatalen);
+ if (direct)
+ app->ref_count--;
+ }
+ else
+ rc = gpg_error (GPG_ERR_NO_SECKEY);
xfree (keyidstr);
if (rc)