mirror of
git://git.gnupg.org/gnupg.git
synced 2025-07-03 22:56:33 +02:00
scd: Factor common PIN status check out.
* scd/iso7816.h (ISO7816_VERIFY_ERROR): New. (ISO7816_VERIFY_NO_PIN): New. (ISO7816_VERIFY_BLOCKED): New. (ISO7816_VERIFY_NULLPIN): New. (ISO7816_VERIFY_NOT_NEEDED): New. * scd/iso7816.c (iso7816_verify_status): New. * scd/app-nks.c (get_chv_status): Use new function. -- Signed-off-by: Werner Koch <wk@gnupg.org> Backported from master: - Removed the non-existant app-piv.c patches. Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
parent
471b06e91b
commit
9497d25c56
4 changed files with 49 additions and 42 deletions
|
@ -248,53 +248,17 @@ keygripstr_from_pk_file (app_t app, int fid, char *r_gripstr)
|
|||
|
||||
|
||||
/* TCOS responds to a verify with empty data (i.e. without the Lc
|
||||
byte) with the status of the PIN. PWID is the PIN ID, If SIGG is
|
||||
true, the application is switched into SigG mode.
|
||||
Returns:
|
||||
-1 = Error retrieving the data,
|
||||
-2 = No such PIN,
|
||||
-3 = PIN blocked,
|
||||
-4 = NullPIN activ,
|
||||
n >= 0 = Number of verification attempts left. */
|
||||
* byte) with the status of the PIN. PWID is the PIN ID, If SIGG is
|
||||
* true, the application is switched into SigG mode. Returns:
|
||||
* ISO7816_VERIFY_* codes or non-negative number of verification
|
||||
* attempts left. */
|
||||
static int
|
||||
get_chv_status (app_t app, int sigg, int pwid)
|
||||
{
|
||||
unsigned char *result = NULL;
|
||||
size_t resultlen;
|
||||
char command[4];
|
||||
int rc;
|
||||
|
||||
if (switch_application (app, sigg))
|
||||
return sigg? -2 : -1; /* No such PIN / General error. */
|
||||
|
||||
command[0] = 0x00;
|
||||
command[1] = 0x20;
|
||||
command[2] = 0x00;
|
||||
command[3] = pwid;
|
||||
|
||||
if (apdu_send_direct (app->slot, 0, (unsigned char *)command,
|
||||
4, 0, NULL, &result, &resultlen))
|
||||
rc = -1; /* Error. */
|
||||
else if (resultlen < 2)
|
||||
rc = -1; /* Error. */
|
||||
else
|
||||
{
|
||||
unsigned int sw = buf16_to_uint (result+resultlen-2);
|
||||
|
||||
if (sw == 0x6a88)
|
||||
rc = -2; /* No such PIN. */
|
||||
else if (sw == 0x6983)
|
||||
rc = -3; /* PIN is blocked. */
|
||||
else if (sw == 0x6985)
|
||||
rc = -4; /* NullPIN is activ. */
|
||||
else if ((sw & 0xfff0) == 0x63C0)
|
||||
rc = (sw & 0x000f); /* PIN has N tries left. */
|
||||
else
|
||||
rc = -1; /* Other error. */
|
||||
}
|
||||
xfree (result);
|
||||
|
||||
return rc;
|
||||
return iso7816_verify_status (app_get_slot (app), pwid);
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue