From 7ab591a6840f7017d673300a5262305e0ee2d1e0 Mon Sep 17 00:00:00 2001 From: martin Date: Tue, 30 Nov 2010 11:22:31 +0000 Subject: [PATCH] libopensc: make sc_reset() take an additional parameter "do_cold_reset" which will unpower the card. git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@4896 c6295689-39f2-0310-b995-f0e70906c6a9 --- src/libopensc/card-mcrd.c | 4 ++-- src/libopensc/card.c | 4 ++-- src/libopensc/opensc.h | 5 +++-- src/libopensc/reader-pcsc.c | 4 ++-- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/libopensc/card-mcrd.c b/src/libopensc/card-mcrd.c index 5fda8961..b80ecae3 100644 --- a/src/libopensc/card-mcrd.c +++ b/src/libopensc/card-mcrd.c @@ -300,7 +300,7 @@ static int mcrd_init(sc_card_t * card) /* Reset the MULTOS card to get to a known state */ if (card->type == SC_CARD_TYPE_MCRD_ESTEID_V11) - sc_reset(card); + sc_reset(card, 0); /* Select the EstEID AID to get to a known state. * For some reason a reset is required as well... */ @@ -308,7 +308,7 @@ static int mcrd_init(sc_card_t * card) flags = SC_ALGORITHM_RSA_HASH_SHA1 | SC_ALGORITHM_RSA_PAD_PKCS1 | SC_ALGORITHM_RSA_HASH_SHA256; /* EstEID v3.0 supports 2048 bit keys */ _sc_card_add_rsa_alg(card, 2048, flags, 0); - sc_reset(card); + sc_reset(card, 0); sc_format_apdu(card, &apdu, SC_APDU_CASE_3, 0xA4, 0x04, 0x00); apdu.lc = sizeof(EstEID_v3_AID); diff --git a/src/libopensc/card.c b/src/libopensc/card.c index b2345d5f..df260bae 100644 --- a/src/libopensc/card.c +++ b/src/libopensc/card.c @@ -261,7 +261,7 @@ int sc_disconnect_card(sc_card_t *card) SC_FUNC_RETURN(ctx, SC_LOG_DEBUG_NORMAL, 0); } -int sc_reset(sc_card_t *card) +int sc_reset(sc_card_t *card, int do_cold_reset) { int r, r2; @@ -274,7 +274,7 @@ int sc_reset(sc_card_t *card) if (r != SC_SUCCESS) return r; - r = card->reader->ops->reset(card->reader); + r = card->reader->ops->reset(card->reader, do_cold_reset); /* invalidate cache */ memset(&card->cache, 0, sizeof(card->cache)); card->cache_valid = 0; diff --git a/src/libopensc/opensc.h b/src/libopensc/opensc.h index ed9b1cc4..42791915 100644 --- a/src/libopensc/opensc.h +++ b/src/libopensc/opensc.h @@ -311,7 +311,7 @@ struct sc_reader_operations { int (*wait_for_event)(struct sc_context *ctx, unsigned int event_mask, sc_reader_t **event_reader, unsigned int *event, int timeout, void **reader_states); /* Reset a reader */ - int (*reset)(struct sc_reader *); + int (*reset)(struct sc_reader *, int); }; /* @@ -733,9 +733,10 @@ int sc_wait_for_event(sc_context_t *ctx, unsigned int event_mask, * Resets the card. * NOTE: only PC/SC backend implements this function at this moment. * @param card The card to reset. + * @param do_cold_reset 0 for a warm reset, 1 for a cold reset (unpower) * @retval SC_SUCCESS on success */ -int sc_reset(sc_card_t *card); +int sc_reset(sc_card_t *card, int do_cold_reset); /** * Cancel all pending PC/SC calls diff --git a/src/libopensc/reader-pcsc.c b/src/libopensc/reader-pcsc.c index e343d42c..9569f535 100644 --- a/src/libopensc/reader-pcsc.c +++ b/src/libopensc/reader-pcsc.c @@ -557,13 +557,13 @@ static int pcsc_release(sc_reader_t *reader) return SC_SUCCESS; } -static int pcsc_reset(sc_reader_t *reader) +static int pcsc_reset(sc_reader_t *reader, int do_cold_reset) { struct pcsc_private_data *priv = GET_PRIV_DATA(reader); int r; int old_locked = priv->locked; - r = pcsc_reconnect(reader, SCARD_UNPOWER_CARD); + r = pcsc_reconnect(reader, do_cold_reset ? SCARD_UNPOWER_CARD : SCARD_RESET_CARD); if(r != SC_SUCCESS) return r;