From b495a3da9bbd4e546e527dd22c230e513899e2a8 Mon Sep 17 00:00:00 2001 From: frankmorgner Date: Fri, 18 Jun 2010 16:27:34 +0000 Subject: [PATCH] - ccid-emulator: propagating PACE capabilities to ccid descriptor of - ccid-test: IOCTL_FEATURE_IFD_PIN_PROPERTIES is currently hardcoded and should be replaced by the value from GET_FEATURE_REQUEST - pcsclite_trunk.patch: fixed propagation of data from SCardControl to SecurePINSpecialVerify and SecurePINSpecialCapabilities git-svn-id: https://vsmartcard.svn.sourceforge.net/svnroot/vsmartcard@154 96b47cad-a561-4643-ad3b-153ac7d7599c --- ccid/pcsclite_trunk.patch | 57 +++++++++++++++++++++++++++------------ ccid/src/ccid-test.c | 19 ++++++++----- ccid/src/ccid.c | 8 +++--- 3 files changed, 58 insertions(+), 26 deletions(-) diff --git a/ccid/pcsclite_trunk.patch b/ccid/pcsclite_trunk.patch index af7ade3..af4f9d8 100644 --- a/ccid/pcsclite_trunk.patch +++ b/ccid/pcsclite_trunk.patch @@ -1,6 +1,6 @@ Index: PCSC/src/PCSC/reader.h.in =================================================================== ---- PCSC/src/PCSC/reader.h.in (Revision 4999) +--- PCSC/src/PCSC/reader.h.in (Revision 4993) +++ PCSC/src/PCSC/reader.h.in (Arbeitskopie) @@ -121,6 +121,7 @@ #define FEATURE_IFD_DISPLAY_PROPERTIES 0x11 @@ -12,13 +12,13 @@ Index: PCSC/src/PCSC/reader.h.in * "IFDs with Secure Pin Entry Capabilities" */ Index: Drivers/ccid/src/ifdhandler.c =================================================================== ---- Drivers/ccid/src/ifdhandler.c (Revision 4999) +--- Drivers/ccid/src/ifdhandler.c (Revision 4993) +++ Drivers/ccid/src/ifdhandler.c (Arbeitskopie) @@ -1384,6 +1384,16 @@ iBytesReturned += sizeof(PCSC_TLV_STRUCTURE); } -+ if (ccid_descriptor -> bPINSupport & CCID_CLASS_PIN_SPECIAL) ++ if (ccid_descriptor -> bPINSupport & CCID_CLASS_PIN_SPECIAL_CAPABILITIES) + { + pcsc_tlv -> tag = FEATURE_EXECUTE_PACE; + pcsc_tlv -> length = 0x04; /* always 0x04 */ @@ -31,18 +31,36 @@ Index: Drivers/ccid/src/ifdhandler.c /* We can always forward wLcdLayout */ pcsc_tlv -> tag = FEATURE_IFD_PIN_PROPERTIES; pcsc_tlv -> length = 0x04; /* always 0x04 */ -@@ -1548,6 +1558,16 @@ +@@ -1548,6 +1558,34 @@ } } + if (IOCTL_FEATURE_EXECUTE_PACE == dwControlCode) + { -+ unsigned int iBytesReturned; ++ if (TxLength < 3 || !TxBuffer) { ++ DEBUG_INFO("PACE Command refused by driver"); ++ return_value = IFD_COMMUNICATION_ERROR; ++ } else { ++ unsigned int iBytesReturned; ++ uint16_t lengthInputData; + -+ iBytesReturned = RxLength; -+ return_value = SecurePINSpecialVerify(reader_index, TxBuffer, TxLength, -+ RxBuffer, &iBytesReturned); -+ *pdwBytesReturned = iBytesReturned; ++ iBytesReturned = RxLength; ++ lengthInputData = (uint16_t *) TxBuffer + 1; ++ if (*TxBuffer == 1) { ++ return_value = SecurePINSpecialCapabilities(reader_index, ++ TxBuffer + 3, lengthInputData, ++ RxBuffer, &iBytesReturned); ++ *pdwBytesReturned = iBytesReturned; ++ } else if (*TxBuffer == 2) { ++ return_value = SecurePINSpecialVerify(reader_index, ++ TxBuffer + 3, lengthInputData, ++ RxBuffer, &iBytesReturned); ++ *pdwBytesReturned = iBytesReturned; ++ } else { ++ DEBUG_INFO("PACE Command refused by driver"); ++ return_value = IFD_COMMUNICATION_ERROR; ++ } ++ } + } + if (IFD_SUCCESS != return_value) @@ -50,7 +68,7 @@ Index: Drivers/ccid/src/ifdhandler.c Index: Drivers/ccid/src/commands.c =================================================================== ---- Drivers/ccid/src/commands.c (Revision 4999) +--- Drivers/ccid/src/commands.c (Revision 4993) +++ Drivers/ccid/src/commands.c (Arbeitskopie) @@ -68,7 +68,13 @@ unsigned int tx_length, unsigned char tx_buffer[], unsigned int *rx_length, @@ -190,7 +208,7 @@ Index: Drivers/ccid/src/commands.c + Index: Drivers/ccid/src/commands.h =================================================================== ---- Drivers/ccid/src/commands.h (Revision 4999) +--- Drivers/ccid/src/commands.h (Revision 4993) +++ Drivers/ccid/src/commands.h (Arbeitskopie) @@ -37,6 +37,14 @@ unsigned char TxBuffer[], unsigned int TxLength, @@ -209,19 +227,24 @@ Index: Drivers/ccid/src/commands.h unsigned char RxBuffer[], unsigned int *RxLength); Index: Drivers/ccid/src/ccid.h =================================================================== ---- Drivers/ccid/src/ccid.h (Revision 4999) +--- Drivers/ccid/src/ccid.h (Revision 4993) +++ Drivers/ccid/src/ccid.h (Arbeitskopie) -@@ -144,6 +144,7 @@ +@@ -142,8 +142,10 @@ + #define CCID_CLASS_EXCHANGE_MASK 0x00070000 + /* Features from bPINSupport */ - #define CCID_CLASS_PIN_VERIFY 0x01 - #define CCID_CLASS_PIN_MODIFY 0x02 -+#define CCID_CLASS_PIN_SPECIAL 0x10 +-#define CCID_CLASS_PIN_VERIFY 0x01 +-#define CCID_CLASS_PIN_MODIFY 0x02 ++#define CCID_CLASS_PIN_VERIFY 0x01 ++#define CCID_CLASS_PIN_MODIFY 0x02 ++#define CCID_CLASS_PIN_SPECIAL_CAPABILITIES 0x10 ++#define CCID_CLASS_PIN_SPECIAL_EXECUTE 0x11 /* See CCID specs ch. 4.2.1 */ #define CCID_ICC_PRESENT_ACTIVE 0x00 /* 00 0000 00 */ Index: Drivers/ccid/src/ccid_ifdhandler.h =================================================================== ---- Drivers/ccid/src/ccid_ifdhandler.h (Revision 4999) +--- Drivers/ccid/src/ccid_ifdhandler.h (Revision 4993) +++ Drivers/ccid/src/ccid_ifdhandler.h (Arbeitskopie) @@ -37,6 +37,8 @@ SCARD_CTL_CODE(FEATURE_IFD_PIN_PROPERTIES + CLASS2_IOCTL_MAGIC) diff --git a/ccid/src/ccid-test.c b/ccid/src/ccid-test.c index 707728e..e2c2600 100644 --- a/ccid/src/ccid-test.c +++ b/ccid/src/ccid-test.c @@ -23,6 +23,9 @@ #include #include +/* XXX IOCTL_FEATURE_IFD_PIN_PROPERTIES */ +const static DWORD feature_execute_pace = 0x42330020; + int main(int argc, char *argv[]) { @@ -87,17 +90,21 @@ main(int argc, char *argv[]) goto err; - rv = SCardControl(hCard, FEATURE_EXECUTE_PACE, pbSendBufferCapabilities, - sizeof(pbSendBufferCapabilities), pbRecvBuffer, - sizeof(pbRecvBuffer), &dwRecvLength); + rv = SCardControl(hCard, feature_execute_pace, + pbSendBufferCapabilities, sizeof(pbSendBufferCapabilities), + pbRecvBuffer, sizeof(pbRecvBuffer), &dwRecvLength); if (rv < 0) goto err; + printf("GetReadersPACECapabilities successfull, received %d bytes\n", + dwRecvLength); - rv = SCardControl(hCard, FEATURE_EXECUTE_PACE, pbSendBufferEstablish, - sizeof(pbSendBufferEstablish), pbRecvBuffer, - sizeof(pbRecvBuffer), &dwRecvLength); + rv = SCardControl(hCard, feature_execute_pace, + pbSendBufferEstablish, sizeof(pbSendBufferEstablish), + pbRecvBuffer, sizeof(pbRecvBuffer), &dwRecvLength); if (rv < 0) goto err; + printf("EstablishPACEChannel successfull, received %d bytes\n", + dwRecvLength); rv = SCardDisconnect(hCard, SCARD_LEAVE_CARD); diff --git a/ccid/src/ccid.c b/ccid/src/ccid.c index 21ad4cc..13e9261 100644 --- a/ccid/src/ccid.c +++ b/ccid/src/ccid.c @@ -77,7 +77,8 @@ ccid_desc = { 0x00FF), // Number of characters per line //.bPINSupport = 0, .bPINSupport = 0x1| // PIN Verification supported - 0x2, // PIN Modification supported + 0x2| // PIN Modification supported + 0x10, // PIN Special supported .bMaxCCIDBusySlots = 0x01, }; @@ -1075,8 +1076,9 @@ perform_unknown(const __u8 *in, __u8 **out, size_t *outlen) result->bMessageType = 0x84; break; default: - sc_debug(ctx, "Unknown message type in request. " - "Using bMessageType=0x%2x for output.", 0); + sc_debug(ctx, "Unknown message type in request (0x%02x). " + "Using bMessageType=0x%02x for output.", + request->bMessageType, 0); result->bMessageType = 0; } result->dwLength = __constant_cpu_to_le32(0);