diff --git a/src/libopensc/pkcs15-esteid.c b/src/libopensc/pkcs15-esteid.c index 87a4385e..d1a72998 100644 --- a/src/libopensc/pkcs15-esteid.c +++ b/src/libopensc/pkcs15-esteid.c @@ -122,6 +122,7 @@ sc_pkcs15emu_esteid_init (sc_pkcs15_card_t * p15card) static const int esteid_pin_min[3] = {4, 5, 8}; static const int esteid_pin_ref[3] = {1, 2, 0}; + static const int esteid_pin_authid[3] = {1, 2, 3}; static const int esteid_pin_flags[3] = {0, 0, SC_PKCS15_PIN_FLAG_UNBLOCKING_PIN}; struct sc_pkcs15_pin_info pin_info; @@ -137,7 +138,7 @@ sc_pkcs15emu_esteid_init (sc_pkcs15_card_t * p15card) tries_left = buff[5]; pin_info.auth_id.len = 1; - pin_info.auth_id.value[0] = i + 1; + pin_info.auth_id.value[0] = esteid_pin_authid[i]; pin_info.reference = esteid_pin_ref[i]; pin_info.flags = esteid_pin_flags[i]; pin_info.type = SC_PKCS15_PIN_TYPE_ASCII_NUMERIC; @@ -149,7 +150,11 @@ sc_pkcs15emu_esteid_init (sc_pkcs15_card_t * p15card) strncpy(pin_obj.label, esteid_pin_names[i], SC_PKCS15_MAX_LABEL_SIZE - 1); pin_obj.flags = esteid_pin_flags[i]; - + + if (i < 2) + pin_obj.auth_id.len = 1; + pin_obj.auth_id.value[0] = 3; + r = sc_pkcs15emu_add_pin_obj(p15card, &pin_obj, &pin_info); if (r < 0) return SC_ERROR_INTERNAL; diff --git a/src/libopensc/reader-pcsc.c b/src/libopensc/reader-pcsc.c index 12163de7..a83f402e 100644 --- a/src/libopensc/reader-pcsc.c +++ b/src/libopensc/reader-pcsc.c @@ -925,12 +925,15 @@ class2_pin_cmd(sc_reader_t *reader, sc_slot_info_t *slot, r = SC_SUCCESS; switch (((unsigned int) apdu->sw1 << 8) | apdu->sw2) { - case 0x6402: /* Input timed out */ + case 0x6400: /* Input timed out */ r = SC_ERROR_KEYPAD_TIMEOUT; break; case 0x6401: /* Input cancelled */ r = SC_ERROR_KEYPAD_CANCELLED; break; + case 0x6402: /* PINs don't match */ + r = SC_ERROR_KEYPAD_PIN_MISMATCH; + break; } SC_TEST_RET(reader->ctx, r, "PIN command failed");