diff --git a/scd/app-openpgp.c b/scd/app-openpgp.c --- a/scd/app-openpgp.c +++ b/scd/app-openpgp.c @@ -5327,6 +5327,9 @@ wipe_and_free (pinvalue, pinlen); } + // Prompt to touch/ack the card. + if (opt.ack_prompt) + pincb (pincb_arg, _("--ack"), NULL); if (app->app_local->cardcap.ext_lc_le && app->app_local->keyattr[0].key_type == KEY_TYPE_RSA @@ -5350,6 +5353,10 @@ cache_pin (app, ctrl, 1, NULL); } + // Dismiss prompt after signing (or timing out) + if (opt.ack_prompt) + pincb (pincb_arg, NULL, NULL); + return rc; } @@ -5422,9 +5429,19 @@ exmode = 0; le_value = 0; } + + // Prompt to touch/ack the card. + if (opt.ack_prompt) + pincb (pincb_arg, _("--ack"), NULL); + rc = iso7816_internal_authenticate (app_get_slot (app), exmode, indata, indatalen, le_value, outdata, outdatalen); + + // Dismiss prompt after authenticating (or timing out) + if (opt.ack_prompt) + pincb (pincb_arg, NULL, NULL); + if (gpg_err_code (rc) == GPG_ERR_TIMEOUT) clear_chv_status (app, ctrl, 1); } @@ -5617,10 +5634,19 @@ else exmode = le_value = 0; + // Prompt to touch/ack the card. + if (opt.ack_prompt) + pincb (pincb_arg, _("--ack"), NULL); + rc = iso7816_decipher (app_get_slot (app), exmode, indata, indatalen, le_value, padind, outdata, outdatalen); xfree (fixbuf); + + // Dismiss prompt after deciphering (or timing out) + if (opt.ack_prompt) + pincb (pincb_arg, NULL, NULL); + if (!rc && app->app_local->keyattr[1].key_type == KEY_TYPE_ECC) { unsigned char prefix = 0; diff --git a/scd/scdaemon.h b/scd/scdaemon.h --- a/scd/scdaemon.h +++ b/scd/scdaemon.h @@ -60,6 +60,7 @@ int disable_ccid; /* Disable the use of the internal CCID driver. */ int disable_pinpad; /* Do not use a pinpad. */ int enable_pinpad_varlen; /* Use variable length input for pinpad. */ + int ack_prompt; /* Display ACK prompt to user when waiting for card. */ int allow_admin; /* Allow the use of admin commands for certain cards. */ int pcsc_shared; /* Use shared PC/SC access. */ diff --git a/scd/scdaemon.c b/scd/scdaemon.c --- a/scd/scdaemon.c +++ b/scd/scdaemon.c @@ -102,6 +102,7 @@ oDenyAdmin, oDisableApplication, oApplicationPriority, + oAckPrompt, oEnablePinpadVarlen, oListenBacklog }; @@ -170,6 +171,7 @@ ARGPARSE_s_s (oDisableApplication, "disable-application", "@"), ARGPARSE_s_s (oApplicationPriority, "application-priority", N_("|LIST|change the application priority to LIST")), + ARGPARSE_s_n (oAckPrompt, "ack-prompt", N_("display ACK prompt while waiting for card")), ARGPARSE_s_i (oListenBacklog, "listen-backlog", "@"), @@ -610,6 +612,8 @@ case oDisablePinpad: opt.disable_pinpad = 1; break; + case oAckPrompt: opt.ack_prompt = 1; break; + case oAllowAdmin: /* Dummy because allow is now the default. */ break; case oDenyAdmin: opt.allow_admin = 0; break;