reset the card before disconnecting to unpower and reset the secure messaging status
git-svn-id: https://vsmartcard.svn.sourceforge.net/svnroot/vsmartcard@265 96b47cad-a561-4643-ad3b-153ac7d7599c
This commit is contained in:
@@ -116,10 +116,12 @@ detect_card_presence(int slot)
|
|||||||
if (sc_result == 0
|
if (sc_result == 0
|
||||||
&& card_in_slot[slot]
|
&& card_in_slot[slot]
|
||||||
&& sc_card_valid(card_in_slot[slot])) {
|
&& sc_card_valid(card_in_slot[slot])) {
|
||||||
|
sc_reset(card_in_slot[slot]);
|
||||||
sc_disconnect_card(card_in_slot[slot], 0);
|
sc_disconnect_card(card_in_slot[slot], 0);
|
||||||
sc_debug(ctx, "Card removed from slot %d", slot);
|
sc_debug(ctx, "Card removed from slot %d", slot);
|
||||||
}
|
}
|
||||||
if (sc_result & SC_SLOT_CARD_CHANGED) {
|
if (sc_result & SC_SLOT_CARD_CHANGED) {
|
||||||
|
sc_reset(card_in_slot[slot]);
|
||||||
sc_disconnect_card(card_in_slot[slot], 0);
|
sc_disconnect_card(card_in_slot[slot], 0);
|
||||||
sc_debug(ctx, "Card exchanged in slot %d", slot);
|
sc_debug(ctx, "Card exchanged in slot %d", slot);
|
||||||
}
|
}
|
||||||
@@ -164,6 +166,7 @@ void ccid_shutdown()
|
|||||||
int i;
|
int i;
|
||||||
for (i = 0; i < sizeof *card_in_slot; i++) {
|
for (i = 0; i < sizeof *card_in_slot; i++) {
|
||||||
if (card_in_slot[i] && sc_card_valid(card_in_slot[i])) {
|
if (card_in_slot[i] && sc_card_valid(card_in_slot[i])) {
|
||||||
|
sc_reset(card_in_slot[i]);
|
||||||
sc_disconnect_card(card_in_slot[i], 0);
|
sc_disconnect_card(card_in_slot[i], 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -412,6 +415,7 @@ perform_PC_to_RDR_IccPowerOn(const __u8 *in, size_t inlen, __u8 **out, size_t *o
|
|||||||
if (request->bSlot < sizeof *card_in_slot) {
|
if (request->bSlot < sizeof *card_in_slot) {
|
||||||
if (card_in_slot[request->bSlot]
|
if (card_in_slot[request->bSlot]
|
||||||
&& sc_card_valid(card_in_slot[request->bSlot])) {
|
&& sc_card_valid(card_in_slot[request->bSlot])) {
|
||||||
|
sc_reset(card_in_slot[request->bSlot]);
|
||||||
sc_disconnect_card(card_in_slot[request->bSlot], 0);
|
sc_disconnect_card(card_in_slot[request->bSlot], 0);
|
||||||
}
|
}
|
||||||
sc_result = sc_connect_card(reader, request->bSlot,
|
sc_result = sc_connect_card(reader, request->bSlot,
|
||||||
@@ -457,8 +461,10 @@ perform_PC_to_RDR_IccPowerOff(const __u8 *in, size_t inlen, __u8 **out, size_t *
|
|||||||
|
|
||||||
if (request->bSlot > sizeof *card_in_slot)
|
if (request->bSlot > sizeof *card_in_slot)
|
||||||
sc_result = SC_ERROR_INVALID_DATA;
|
sc_result = SC_ERROR_INVALID_DATA;
|
||||||
else
|
else {
|
||||||
|
sc_reset(card_in_slot[request->bSlot]);
|
||||||
sc_result = sc_disconnect_card(card_in_slot[request->bSlot], 0);
|
sc_result = sc_disconnect_card(card_in_slot[request->bSlot], 0);
|
||||||
|
}
|
||||||
|
|
||||||
return get_RDR_to_PC_SlotStatus(request->bSlot, request->bSeq, sc_result,
|
return get_RDR_to_PC_SlotStatus(request->bSlot, request->bSeq, sc_result,
|
||||||
out, outlen, NULL, 0);
|
out, outlen, NULL, 0);
|
||||||
@@ -855,8 +861,6 @@ perform_PC_to_RDR_Secure_EstablishPACEChannel(sc_card_t *card,
|
|||||||
pace_input.certificate_description_length);
|
pace_input.certificate_description_length);
|
||||||
|
|
||||||
|
|
||||||
/*if (sc_reset(card) < 0)*/
|
|
||||||
/*sc_error(ctx, "Could not reset card, will continue anyway");*/
|
|
||||||
#ifdef BUERGERCLIENT_WORKAROUND
|
#ifdef BUERGERCLIENT_WORKAROUND
|
||||||
pace_output.ef_cardaccess_length = ef_cardaccess_length;
|
pace_output.ef_cardaccess_length = ef_cardaccess_length;
|
||||||
pace_output.ef_cardaccess = ef_cardaccess;
|
pace_output.ef_cardaccess = ef_cardaccess;
|
||||||
|
|||||||
@@ -515,6 +515,7 @@ err:
|
|||||||
if (pace_output.id_pcd)
|
if (pace_output.id_pcd)
|
||||||
free(pace_output.id_pcd);
|
free(pace_output.id_pcd);
|
||||||
|
|
||||||
|
sc_reset(card);
|
||||||
sc_disconnect_card(card, 0);
|
sc_disconnect_card(card, 0);
|
||||||
sc_release_context(ctx);
|
sc_release_context(ctx);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user