scd:openpgp: Send a KEY-TIME status with READKEY

* scd/app-openpgp.c (retrieve_fprtime_from_card): New.
(do_readkey): Send a KEY_TIME status.
--

It might be easier to fold this into KEYPAIRINFO but for backward
compatibility using a separate status line is safer.

Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
Werner Koch 2020-02-11 20:41:29 +01:00
parent 6bc7318ef5
commit 77ea916533
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B
2 changed files with 39 additions and 1 deletions

View File

@ -1291,6 +1291,36 @@ retrieve_fpr_from_card (app_t app, int keyno, char *fpr)
}
/* Retrieve the creation time of the fingerprint for key KEYNO from
* the card inserted in the slot of APP and store it at R_FPRTIME.
* Returns 0 on success or an error code. */
static gpg_error_t
retrieve_fprtime_from_card (app_t app, int keyno, u32 *r_fprtime)
{
gpg_error_t err = 0;
void *relptr;
unsigned char *value;
size_t valuelen;
u32 fprtime;
log_assert (keyno >=0 && keyno <= 2);
relptr = get_one_do (app, 0x00CD, &value, &valuelen, NULL);
if (relptr && valuelen >= 4*(keyno+1))
{
fprtime = buf32_to_u32 (value + 4*keyno);
if (!fprtime)
err = gpg_error (GPG_ERR_NOT_FOUND);
else
*r_fprtime = fprtime;
}
else
err = gpg_error (GPG_ERR_NOT_FOUND);
xfree (relptr);
return err;
}
/* Retrieve the public key material for the RSA key, whose fingerprint
is FPR, from gpg output, which can be read through the stream FP.
The RSA modulus will be stored at the address of M and MLEN, the
@ -1938,6 +1968,7 @@ do_readkey (app_t app, ctrl_t ctrl, const char *keyid, unsigned int flags,
gpg_error_t err;
int keyno;
unsigned char *buf;
u32 fprtime;
if (strlen (keyid) == 40)
{
@ -1975,6 +2006,13 @@ do_readkey (app_t app, ctrl_t ctrl, const char *keyid, unsigned int flags,
err = send_keypair_info (app, ctrl, keyno+1);
if (err)
return err;
if (!retrieve_fprtime_from_card (app, keyno, &fprtime))
{
err = send_status_printf (ctrl, "KEY-TIME", "OPENPGP.%d %lu",
keyno+1, (unsigned long)fprtime);
if (err)
return err;
}
}
if (pk && pklen)

View File

@ -2368,7 +2368,7 @@ send_status_direct (ctrl_t ctrl, const char *keyword, const char *args)
/* This status functions expects a printf style format string. No
* filtering of the data is done instead the orintf formatted data is
* filtering of the data is done instead the printf formatted data is
* send using assuan_send_status. */
gpg_error_t
send_status_printf (ctrl_t ctrl, const char *keyword, const char *format, ...)