1
0
mirror of git://git.gnupg.org/gnupg.git synced 2024-06-29 02:22:45 +02:00

scd: Improve reading of binary records.

* scd/iso7816.c (iso7816_read_binary_ext): Handle the 0x6a86 SW the
same as 6b00.
* scd/apdu.c (apdu_get_atr): Modify debug messages.
* scd/app-p15.c (app_select_p15): Print FCI on error.
(read_p15_info): Clean up diag in presence of debug options.
--

Some cards return 6a86 instead of 6b00.

Signed-off-by: Werner Koch <wk@gnupg.org>
Backported-from-master: 44f977d0e3
This commit is contained in:
Werner Koch 2021-06-16 20:29:47 +02:00
parent 88606cc484
commit adf387b3f1
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B
3 changed files with 5 additions and 10 deletions

View File

@ -2615,19 +2615,16 @@ apdu_get_atr (int slot, size_t *atrlen)
{ {
unsigned char *buf; unsigned char *buf;
if (DBG_READER)
log_debug ("enter: apdu_get_atr: slot=%d\n", slot);
if (slot < 0 || slot >= MAX_READER || !reader_table[slot].used ) if (slot < 0 || slot >= MAX_READER || !reader_table[slot].used )
{ {
if (DBG_READER) if (DBG_READER)
log_debug ("leave: apdu_get_atr => NULL (bad slot)\n"); log_debug ("apdu_get_atr => NULL (bad slot)\n");
return NULL; return NULL;
} }
if (!reader_table[slot].atrlen) if (!reader_table[slot].atrlen)
{ {
if (DBG_READER) if (DBG_READER)
log_debug ("leave: apdu_get_atr => NULL (no ATR)\n"); log_debug ("apdu_get_atr => NULL (no ATR)\n");
return NULL; return NULL;
} }
@ -2635,13 +2632,11 @@ apdu_get_atr (int slot, size_t *atrlen)
if (!buf) if (!buf)
{ {
if (DBG_READER) if (DBG_READER)
log_debug ("leave: apdu_get_atr => NULL (out of core)\n"); log_debug ("apdu_get_atr => NULL (out of core)\n");
return NULL; return NULL;
} }
memcpy (buf, reader_table[slot].atr, reader_table[slot].atrlen); memcpy (buf, reader_table[slot].atr, reader_table[slot].atrlen);
*atrlen = reader_table[slot].atrlen; *atrlen = reader_table[slot].atrlen;
if (DBG_READER)
log_debug ("leave: apdu_get_atr => atrlen=%zu\n", *atrlen);
return buf; return buf;
} }

View File

@ -3906,8 +3906,8 @@ read_p15_info (app_t app)
log_printf ("\n"); log_printf ("\n");
} }
log_info ("p15: atr ..........: ");
atr = apdu_get_atr (app_get_slot (app), &atrlen); atr = apdu_get_atr (app_get_slot (app), &atrlen);
log_info ("p15: atr ..........: ");
if (!atr) if (!atr)
log_printf ("[error]\n"); log_printf ("[error]\n");
else else

View File

@ -906,7 +906,7 @@ iso7816_read_binary_ext (int slot, int extended_mode,
if (r_sw) if (r_sw)
*r_sw = sw; *r_sw = sw;
if (*result && sw == SW_BAD_P0_P1) if (*result && (sw == SW_BAD_P0_P1 || sw == SW_INCORRECT_P0_P1))
{ {
/* Bad Parameter means that the offset is outside of the /* Bad Parameter means that the offset is outside of the
EF. When reading all data we take this as an indication EF. When reading all data we take this as an indication