[Pcsclite-cvs-commit] r4847 - in /trunk/Drivers/ccid/src: ccid_ifdhandler.h ifdhandler.c

rousseau at users.alioth.debian.org rousseau at users.alioth.debian.org
Tue Mar 30 09:48:05 UTC 2010


Author: rousseau
Date: Tue Mar 30 09:48:04 2010
New Revision: 4847

URL: http://svn.debian.org/wsvn/pcsclite/?sc=1&rev=4847
Log:
add support of FEATURE_GET_TLV_PROPERTIES

Modified:
    trunk/Drivers/ccid/src/ccid_ifdhandler.h
    trunk/Drivers/ccid/src/ifdhandler.c

Modified: trunk/Drivers/ccid/src/ccid_ifdhandler.h
URL: http://svn.debian.org/wsvn/pcsclite/trunk/Drivers/ccid/src/ccid_ifdhandler.h?rev=4847&op=diff
==============================================================================
--- trunk/Drivers/ccid/src/ccid_ifdhandler.h (original)
+++ trunk/Drivers/ccid/src/ccid_ifdhandler.h Tue Mar 30 09:48:04 2010
@@ -35,6 +35,8 @@
 	SCARD_CTL_CODE(FEATURE_MCT_READER_DIRECT + CLASS2_IOCTL_MAGIC)
 #define IOCTL_FEATURE_IFD_PIN_PROPERTIES \
 	SCARD_CTL_CODE(FEATURE_IFD_PIN_PROPERTIES + CLASS2_IOCTL_MAGIC)
+#define IOCTL_FEATURE_GET_TLV_PROPERTIES \
+	SCARD_CTL_CODE(FEATURE_GET_TLV_PROPERTIES + CLASS2_IOCTL_MAGIC)
 
 #define DRIVER_OPTION_CCID_EXCHANGE_AUTHORIZED 1
 #define DRIVER_OPTION_GEMPC_TWIN_KEY_APDU 2

Modified: trunk/Drivers/ccid/src/ifdhandler.c
URL: http://svn.debian.org/wsvn/pcsclite/trunk/Drivers/ccid/src/ifdhandler.c?rev=4847&op=diff
==============================================================================
--- trunk/Drivers/ccid/src/ifdhandler.c (original)
+++ trunk/Drivers/ccid/src/ifdhandler.c Tue Mar 30 09:48:04 2010
@@ -1250,10 +1250,13 @@
 	 */
 	RESPONSECODE return_value = IFD_ERROR_NOT_SUPPORTED;
 	int reader_index;
+	_ccid_descriptor *ccid_descriptor;
 
 	reader_index = LunToReaderIndex(Lun);
 	if ((-1 == reader_index) || (NULL == pdwBytesReturned))
 		return IFD_COMMUNICATION_ERROR;
+
+	ccid_descriptor = get_ccid_descriptor(reader_index);
 
 	DEBUG_INFO4("ControlCode: 0x%X, %s (lun: %X)", dwControlCode,
 		CcidSlots[reader_index].readerName, Lun);
@@ -1302,7 +1305,7 @@
 		}
 	}
 
-	/* Implement the PC/SC v2.02.05 Part 10 IOCTL mechanism */
+	/* Implement the PC/SC v2.02.07 Part 10 IOCTL mechanism */
 
 	/* Query for features */
 	if (CM_IOCTL_GET_FEATURE_REQUEST == dwControlCode)
@@ -1310,8 +1313,8 @@
 		unsigned int iBytesReturned = 0;
 		PCSC_TLV_STRUCTURE *pcsc_tlv = (PCSC_TLV_STRUCTURE *)RxBuffer;
 
-		/* we need room for up to four records */
-		if (RxLength < 4 * sizeof(PCSC_TLV_STRUCTURE))
+		/* we need room for up to five records */
+		if (RxLength < 5 * sizeof(PCSC_TLV_STRUCTURE))
 			return IFD_ERROR_INSUFFICIENT_BUFFER;
 
 		/* We can only support direct verify and/or modify currently */
@@ -1355,6 +1358,12 @@
 			iBytesReturned += sizeof(PCSC_TLV_STRUCTURE);
 		}
 
+		pcsc_tlv -> tag = FEATURE_GET_TLV_PROPERTIES;
+		pcsc_tlv -> length = 0x04; /* always 0x04 */
+		pcsc_tlv -> value = htonl(IOCTL_FEATURE_GET_TLV_PROPERTIES);
+		pcsc_tlv++;
+		iBytesReturned += sizeof(PCSC_TLV_STRUCTURE);
+
 		*pdwBytesReturned = iBytesReturned;
 		return_value = IFD_SUCCESS;
 	}
@@ -1373,6 +1382,53 @@
 		caps -> bTimeOut2 = 0x00; /* We do not distinguish bTimeOut from TimeOut2 */
 
 		*pdwBytesReturned = sizeof(*caps);
+		return_value = IFD_SUCCESS;
+	}
+
+	/* Reader features */
+	if (IOCTL_FEATURE_GET_TLV_PROPERTIES == dwControlCode)
+	{
+		int p = 0;
+		int tmp;
+
+		/* wLcdLayout */
+		RxBuffer[p++] = PCSCv2_PART10_PROPERTY_wLcdLayout;	/* tag */
+		RxBuffer[p++] = 2;	/* length */
+		tmp = ccid_descriptor -> wLcdLayout;
+		RxBuffer[p++] = tmp & 0xFF;	/* value in little endian order */
+		RxBuffer[p++] = (tmp >> 8) & 0xFF;
+
+		/* bEntryValidationCondition */
+		RxBuffer[p++] = PCSCv2_PART10_PROPERTY_bEntryValidationCondition;
+		RxBuffer[p++] = 1;
+		RxBuffer[p++] = 0x07;
+
+		/* bTimeOut2 */
+		RxBuffer[p++] = PCSCv2_PART10_PROPERTY_bTimeOut2;
+		RxBuffer[p++] = 1;
+		RxBuffer[p++] = 0x00;
+
+		/* sFirmwareID */
+		if (VENDOR_GEMALTO == GET_VENDOR(ccid_descriptor -> readerID))
+		{
+			unsigned char firmware[256];
+			const unsigned char cmd[] = { 0x02 };
+			RESPONSECODE ret;
+			unsigned int len;
+
+			len = sizeof(firmware);
+			ret = CmdEscape(reader_index, cmd, sizeof(cmd), firmware, &len);
+
+			if (IFD_SUCCESS == ret)
+			{
+				RxBuffer[p++] = PCSCv2_PART10_PROPERTY_sFirmwareID;
+				RxBuffer[p++] = len;
+				memcpy(&RxBuffer[p], firmware, len);
+				p += len;
+			}
+		}
+
+		*pdwBytesReturned = p;
 		return_value = IFD_SUCCESS;
 	}
 




More information about the Pcsclite-cvs-commit mailing list