diff --git a/src/libopensc/card-cardos.c b/src/libopensc/card-cardos.c index d0a62823..710e17ef 100644 --- a/src/libopensc/card-cardos.c +++ b/src/libopensc/card-cardos.c @@ -1190,14 +1190,19 @@ static int cardos_get_serialnr(sc_card_t *card, sc_serial_number_t *serial) LOG_TEST_RET(card->ctx, r, "APDU transmit failed"); if (apdu.sw1 != 0x90 || apdu.sw2 != 0x00) return SC_ERROR_INTERNAL; - if (apdu.resplen != 32) { + if ((apdu.resplen == 8) && (card->type == SC_CARD_TYPE_CARDOS_V5_0)) { + /* cache serial number */ + memcpy(card->serialnr.value, rbuf, 8); + card->serialnr.len = 8; + } else if (apdu.resplen == 32) { + /* cache serial number */ + memcpy(card->serialnr.value, &rbuf[10], 6); + card->serialnr.len = 6; + } else { sc_log(card->ctx, "unexpected response to GET DATA serial" " number\n"); return SC_ERROR_INTERNAL; } - /* cache serial number */ - memcpy(card->serialnr.value, &rbuf[10], 6); - card->serialnr.len = 6; /* copy and return serial number */ memcpy(serial, &card->serialnr, sizeof(*serial)); return SC_SUCCESS;