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>
This commit is contained in:
Werner Koch 2021-06-16 20:29:47 +02:00
parent 7718244168
commit 44f977d0e3
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B
3 changed files with 10 additions and 11 deletions

View File

@ -2614,19 +2614,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;
} }
@ -2634,13 +2631,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

@ -3791,8 +3791,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
@ -6040,7 +6040,11 @@ app_select_p15 (app_t app)
if (s && n == 2) if (s && n == 2)
def_home_df = buf16_to_ushort (s); def_home_df = buf16_to_ushort (s);
else else
log_error ("p15: select(AID) did not return the DF\n"); {
if (fcilen)
log_printhex (fci, fcilen, "fci:");
log_error ("p15: select(AID) did not return the DF\n");
}
} }
app->app_local->home_df = def_home_df; app->app_local->home_df = def_home_df;

View File

@ -1034,7 +1034,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