[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