---------------------
PatchSet 2046 
Date: 1970/01/01 01:33:25
Author: sth
Branch: HEAD
Tag: (none) 
Log:
Have the option add a delay before resending an APDU (after a 6CXX response). Is needed for most current belpic cards on fast readers

Members: 
	src/include/winconfig.h:1.17->1.18 
	src/libopensc/card-belpic.c:1.3->1.4 
	src/libopensc/card.c:1.73->1.74 
	src/libopensc/opensc.h:1.143->1.144 

Index: opensc/src/include/winconfig.h
===================================================================
RCS file: /cvsroot/opensc/src/include/winconfig.h,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- opensc/src/include/winconfig.h	15 Dec 2004 15:42:27 -0000	1.17
+++ opensc/src/include/winconfig.h	30 Jan 2005 19:20:38 -0000	1.18
@@ -54,8 +54,6 @@
 
 #define PATH_MAX _MAX_PATH
 
-#define sleep(t) Sleep((t) * 1000)
-
 #ifndef VERSION
 #define VERSION "0.9.4"
 #endif
Index: opensc/src/libopensc/card-belpic.c
===================================================================
RCS file: /cvsroot/opensc/src/libopensc/card-belpic.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- opensc/src/libopensc/card-belpic.c	30 Jan 2005 13:50:08 -0000	1.3
+++ opensc/src/libopensc/card-belpic.c	30 Jan 2005 19:20:38 -0000	1.4
@@ -1008,6 +1008,11 @@
 				     SC_ALGORITHM_RSA_PAD_PKCS1 | SC_ALGORITHM_RSA_HASH_NONE, 0);
 	}
 
+	/* V1 applets have a problem: if the card sends a 6C XX (only XX bytes available),
+	 * and we resend the command too soon (i.e. the reader is too fast), the card
+	 * doesn't respond. So we build in a delay. */
+	card->wait_resend_apdu = 40;
+
 	/* State that we have an RNG */
 	card->caps |= SC_CARD_CAP_RNG;
 
Index: opensc/src/libopensc/card.c
===================================================================
RCS file: /cvsroot/opensc/src/libopensc/card.c,v
retrieving revision 1.73
retrieving revision 1.74
diff -u -r1.73 -r1.74
--- opensc/src/libopensc/card.c	28 Jan 2005 21:22:40 -0000	1.73
+++ opensc/src/libopensc/card.c	30 Jan 2005 19:20:38 -0000	1.74
@@ -260,6 +260,9 @@
 	if (apdu->sw1 == 0x6C && apdu->resplen == 0) {
 		apdu->resplen = orig_resplen;
 		apdu->le = apdu->sw2;
+		/* Fix for cards (e.g. belpic) that need a delay on fast readers */
+		if (card->wait_resend_apdu != 0)
+			msleep(card->wait_resend_apdu);
 		r = sc_transceive(card, apdu);
 		if (r != 0) {
 			sc_unlock(card);
Index: opensc/src/libopensc/opensc.h
===================================================================
RCS file: /cvsroot/opensc/src/libopensc/opensc.h,v
retrieving revision 1.143
retrieving revision 1.144
diff -u -r1.143 -r1.144
--- opensc/src/libopensc/opensc.h	29 Jan 2005 12:10:52 -0000	1.143
+++ opensc/src/libopensc/opensc.h	30 Jan 2005 19:20:38 -0000	1.144
@@ -179,8 +179,11 @@
 /* A 64-bit uint, used in sc_current_time() */
 #ifndef _WIN32
 typedef unsigned long long sc_timestamp_t;
+#define msleep(t)	usleep((t) * 1000)
 #else
 typedef unsigned __int64 sc_timestamp_t;
+#define msleep(t)	Sleep(t)
+#define sleep(t)	Sleep((t) * 1000)
 #endif
 
 /* Event masks for sc_wait_for_event() */
@@ -440,6 +443,7 @@
 	struct sc_slot_info *slot;
 
 	unsigned long caps, flags;
+	unsigned int wait_resend_apdu;	/* Delay (msec) before responding to an SW12 = 6CXX */
 	int cla;
 	u8 atr[SC_MAX_ATR_SIZE];
 	size_t atr_len;

