From ad6515ba55ba9da90c2d3f17c8e0074bb1731dc3 Mon Sep 17 00:00:00 2001 From: Frank Morgner Date: Mon, 9 Oct 2017 17:59:50 +0200 Subject: [PATCH] CTX: detect card resets --- src/libopensc/reader-cryptotokenkit.m | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/libopensc/reader-cryptotokenkit.m b/src/libopensc/reader-cryptotokenkit.m index 8101fe70..a889fc65 100644 --- a/src/libopensc/reader-cryptotokenkit.m +++ b/src/libopensc/reader-cryptotokenkit.m @@ -155,9 +155,13 @@ static int cryptotokenkit_connect(sc_reader_t *reader) priv->tksmartcard = [priv->tksmartcardslot makeSmartCard]; } - if (!priv->tksmartcard || ![priv->tksmartcard valid]) + if (!priv->tksmartcard || !priv->tksmartcard.valid) return SC_ERROR_CARD_NOT_PRESENT; + /* if tksmartcard.context is set to nil, we know that the card has been + * reset or aquired by a different session */ + priv->tksmartcard.context = @(YES); + /* attempt to detect protocol in use T0/T1/RAW */ ctk_set_proto(reader); @@ -185,6 +189,12 @@ static int cryptotokenkit_lock(sc_reader_t *reader) if (reader->ctx->flags & SC_CTX_FLAG_TERMINATE) goto err; + if (priv->tksmartcard.context == nil) { + r = SC_ERROR_CARD_RESET; + priv->tksmartcard.context = @(YES); + goto err; + } + [priv->tksmartcard beginSessionWithReply:^(BOOL success, NSError *error) { if (success != TRUE) { NSLog(@"Error locking card <%@>", error);