- added parsing of PACE data

- bugfix: PACE output data had to be wrapped again


git-svn-id: https://vsmartcard.svn.sourceforge.net/svnroot/vsmartcard@201 96b47cad-a561-4643-ad3b-153ac7d7599c
This commit is contained in:
frankmorgner
2010-07-07 10:31:50 +00:00
parent 143e41fe76
commit 4a3c04a755
3 changed files with 278 additions and 35 deletions

View File

@@ -81,7 +81,7 @@ Index: ccid-1.3.11/src/commands.c
/***************************************************************************** /*****************************************************************************
@@ -691,7 +697,144 @@ @@ -691,7 +697,217 @@
return ret; return ret;
} /* SecurePINModify */ } /* SecurePINModify */
@@ -91,8 +91,10 @@ Index: ccid-1.3.11/src/commands.c
+{ +{
+ RESPONSECODE return_value; + RESPONSECODE return_value;
+ unsigned char lengthCHAT, lengthPIN; + unsigned char lengthCHAT, lengthPIN;
+ uint16_t lengthCertificateDescription; + uint16_t lengthCertificateDescription, lengthEF_CardAccess, length_IDicc;
+ uint8_t lengthCAR, lengthCARprev;
+ int old_read_timeout; + int old_read_timeout;
+ size_t parsed;
+ _ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index); + _ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index);
+ old_read_timeout= ccid_descriptor -> readTimeout; + old_read_timeout= ccid_descriptor -> readTimeout;
@@ -136,6 +138,74 @@ Index: ccid-1.3.11/src/commands.c
+ /* bPINOperation: PIN PACE Capabilities */ + /* bPINOperation: PIN PACE Capabilities */
+ return_value = SecurePINPACE(reader_index, TxBuffer, TxLength, RxBuffer, + return_value = SecurePINPACE(reader_index, TxBuffer, TxLength, RxBuffer,
+ RxLength, CCID_CLASS_PIN_PACE_EXECUTE); + RxLength, CCID_CLASS_PIN_PACE_EXECUTE);
+ if (IFD_SUCCESS != return_value)
+ goto err;
+
+
+ if (6+2 > *RxLength)
+ goto err;
+ DEBUG_INFO3("MSE:Set AT Statusbytes: %02X %02X",
+ RxBuffer[6+0], RxBuffer[6+1]);
+ parsed = 6+2;
+
+
+ if (parsed+2 > *RxLength)
+ goto err;
+ lengthEF_CardAccess = w2i(RxBuffer, parsed);
+ if (parsed+2+lengthEF_CardAccess > *RxLength) {
+ DEBUG_CRITICAL("Malformed Establish PACE Channel output data.");
+ return_value = IFD_COMMUNICATION_ERROR;
+ goto err;
+ }
+ if (lengthEF_CardAccess)
+ DEBUG_INFO_XXD("EF.CardAccess:\n", &RxBuffer[parsed+2], lengthEF_CardAccess);
+ parsed += 2 + lengthEF_CardAccess;
+
+ if (parsed+1 > *RxLength)
+ goto err;
+ lengthCAR = RxBuffer[parsed+1];
+ if (parsed+1+lengthCAR > *RxLength) {
+ DEBUG_CRITICAL("Malformed Establish PACE Channel output data.");
+ return_value = IFD_COMMUNICATION_ERROR;
+ goto err;
+ }
+ if (lengthCAR)
+ DEBUG_INFO_XXD("Recent Certificate Authority:\n",
+ &RxBuffer[parsed+1],
+ lengthCAR);
+ parsed += 1 + lengthCAR;
+
+ if (parsed+1 > *RxLength)
+ goto err;
+ lengthCARprev = RxBuffer[parsed+1];
+ if (parsed+1+lengthCARprev > *RxLength) {
+ DEBUG_CRITICAL("Malformed Establish PACE Channel output data.");
+ return_value = IFD_COMMUNICATION_ERROR;
+ goto err;
+ }
+ if (lengthCARprev)
+ DEBUG_INFO_XXD("Previous Certificate Authority:\n",
+ &RxBuffer[parsed+1],
+ lengthCARprev);
+ parsed += 1 + lengthCARprev;
+
+ if (parsed+2 > *RxLength)
+ goto err;
+ length_IDicc = w2i(RxBuffer, parsed);
+ if (parsed+2+length_IDicc > *RxLength) {
+ DEBUG_CRITICAL("Malformed Establish PACE Channel output data.");
+ return_value = IFD_COMMUNICATION_ERROR;
+ goto err;
+ }
+ if (length_IDicc)
+ DEBUG_INFO_XXD("IDicc:\n", &RxBuffer[parsed+2], length_IDicc);
+ parsed += 2 + length_IDicc;
+
+ if (parsed != *RxLength) {
+ DEBUG_CRITICAL2("Overrun by %d bytes", *RxLength - parsed);
+ return_value = IFD_COMMUNICATION_ERROR;
+ goto err;
+ }
+ +
+err: +err:
+ ccid_descriptor -> readTimeout = old_read_timeout; + ccid_descriptor -> readTimeout = old_read_timeout;
@@ -210,15 +280,17 @@ Index: ccid-1.3.11/src/commands.c
+ } + }
+ +
+ length = dw2i(cmd, 1); + length = dw2i(cmd, 1);
+ if (length <= *RxLength) + if (length + 6 <= *RxLength)
+ *RxLength = length; + *RxLength = length + 6;
+ else + else
+ { + {
+ DEBUG_CRITICAL2("overrun by %d bytes", length - *RxLength); + DEBUG_CRITICAL2("overrun by %d bytes", length + 6 - *RxLength);
+ length = *RxLength;
+ return IFD_ERROR_INSUFFICIENT_BUFFER; + return IFD_ERROR_INSUFFICIENT_BUFFER;
+ } + }
+ memcpy(RxBuffer, &cmd[10], length); + uint32_t s = 0x00000000;
+ memcpy(RxBuffer, &s, 4); /* "Kein Fehler" */
+ memcpy(RxBuffer+4, &length, 2); /* lengthOutputData */
+ memcpy(RxBuffer+6, &cmd[10], length);
+ +
+ return IFD_SUCCESS; + return IFD_SUCCESS;
+} +}
@@ -227,7 +299,7 @@ Index: ccid-1.3.11/src/commands.c
/***************************************************************************** /*****************************************************************************
* *
* Escape * Escape
@@ -2081,3 +2224,15 @@ @@ -2081,3 +2297,15 @@
buffer[3] = (value >> 24) & 0xFF; buffer[3] = (value >> 24) & 0xFF;
} /* i2dw */ } /* i2dw */
@@ -262,7 +334,7 @@ Index: ccid-1.3.11/src/commands.h
RESPONSECODE CmdEscape(unsigned int reader_index, RESPONSECODE CmdEscape(unsigned int reader_index,
const unsigned char TxBuffer[], unsigned int TxLength, const unsigned char TxBuffer[], unsigned int TxLength,
unsigned char RxBuffer[], unsigned int *RxLength); unsigned char RxBuffer[], unsigned int *RxLength);
Index: src/ccid.h Index: ccid-1.3.11/src/ccid.h
=================================================================== ===================================================================
--- ccid-1.3.11/src/ccid.h (Revision 4347) --- ccid-1.3.11/src/ccid.h (Revision 4347)
+++ ccid-1.3.11/src/ccid.h (Arbeitskopie) +++ ccid-1.3.11/src/ccid.h (Arbeitskopie)
@@ -279,6 +351,15 @@ Index: src/ccid.h
/* See CCID specs ch. 4.2.1 */ /* See CCID specs ch. 4.2.1 */
#define CCID_ICC_PRESENT_ACTIVE 0x00 /* 00 0000 00 */ #define CCID_ICC_PRESENT_ACTIVE 0x00 /* 00 0000 00 */
@@ -216,6 +218,8 @@
/* convert a 4 byte integer in USB format into an int */
#define dw2i(a, x) (unsigned int)((((((a[x+3] << 8) + a[x+2]) << 8) + a[x+1]) << 8) + a[x])
+/* convert a 2 byte integer in USB format into an int */
+#define w2i(a, x) (unsigned int)(((a[x+1]) << 8) + a[x])
/* all the data rates specified by ISO 7816-3 Fi/Di tables */
#define ISO_DATA_RATES 10753, 14337, 15625, 17204, \
Index: ccid-1.3.11/src/ccid_ifdhandler.h Index: ccid-1.3.11/src/ccid_ifdhandler.h
=================================================================== ===================================================================
--- ccid-1.3.11/src/ccid_ifdhandler.h (Revision 4347) --- ccid-1.3.11/src/ccid_ifdhandler.h (Revision 4347)

View File

@@ -6,7 +6,7 @@ Index: ccid-1.3.13/src/ifdhandler.c
iBytesReturned += sizeof(PCSC_TLV_STRUCTURE); iBytesReturned += sizeof(PCSC_TLV_STRUCTURE);
} }
+ if (ccid_descriptor -> bPINSupport & CCID_CLASS_PIN_PACE_CAPABILITIES) + if (get_ccid_descriptor(reader_index) -> bPINSupport & CCID_CLASS_PIN_PACE_CAPABILITIES)
+ { + {
+ pcsc_tlv -> tag = FEATURE_EXECUTE_PACE; + pcsc_tlv -> tag = FEATURE_EXECUTE_PACE;
+ pcsc_tlv -> length = 0x04; /* always 0x04 */ + pcsc_tlv -> length = 0x04; /* always 0x04 */
@@ -81,7 +81,7 @@ Index: ccid-1.3.13/src/commands.c
/***************************************************************************** /*****************************************************************************
@@ -712,7 +718,144 @@ @@ -712,7 +718,217 @@
return ret; return ret;
} /* SecurePINModify */ } /* SecurePINModify */
@@ -91,8 +91,10 @@ Index: ccid-1.3.13/src/commands.c
+{ +{
+ RESPONSECODE return_value; + RESPONSECODE return_value;
+ unsigned char lengthCHAT, lengthPIN; + unsigned char lengthCHAT, lengthPIN;
+ uint16_t lengthCertificateDescription; + uint16_t lengthCertificateDescription, lengthEF_CardAccess, length_IDicc;
+ uint8_t lengthCAR, lengthCARprev;
+ int old_read_timeout; + int old_read_timeout;
+ size_t parsed;
+ _ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index); + _ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index);
+ old_read_timeout= ccid_descriptor -> readTimeout; + old_read_timeout= ccid_descriptor -> readTimeout;
@@ -136,6 +138,74 @@ Index: ccid-1.3.13/src/commands.c
+ /* bPINOperation: PIN PACE Capabilities */ + /* bPINOperation: PIN PACE Capabilities */
+ return_value = SecurePINPACE(reader_index, TxBuffer, TxLength, RxBuffer, + return_value = SecurePINPACE(reader_index, TxBuffer, TxLength, RxBuffer,
+ RxLength, CCID_CLASS_PIN_PACE_EXECUTE); + RxLength, CCID_CLASS_PIN_PACE_EXECUTE);
+ if (IFD_SUCCESS != return_value)
+ goto err;
+
+
+ if (6+2 > *RxLength)
+ goto err;
+ DEBUG_INFO3("MSE:Set AT Statusbytes: %02X %02X",
+ RxBuffer[6+0], RxBuffer[6+1]);
+ parsed = 6+2;
+
+
+ if (parsed+2 > *RxLength)
+ goto err;
+ lengthEF_CardAccess = w2i(RxBuffer, parsed);
+ if (parsed+2+lengthEF_CardAccess > *RxLength) {
+ DEBUG_CRITICAL("Malformed Establish PACE Channel output data.");
+ return_value = IFD_COMMUNICATION_ERROR;
+ goto err;
+ }
+ if (lengthEF_CardAccess)
+ DEBUG_INFO_XXD("EF.CardAccess:\n", &RxBuffer[parsed+2], lengthEF_CardAccess);
+ parsed += 2 + lengthEF_CardAccess;
+
+ if (parsed+1 > *RxLength)
+ goto err;
+ lengthCAR = RxBuffer[parsed+1];
+ if (parsed+1+lengthCAR > *RxLength) {
+ DEBUG_CRITICAL("Malformed Establish PACE Channel output data.");
+ return_value = IFD_COMMUNICATION_ERROR;
+ goto err;
+ }
+ if (lengthCAR)
+ DEBUG_INFO_XXD("Recent Certificate Authority:\n",
+ &RxBuffer[parsed+1],
+ lengthCAR);
+ parsed += 1 + lengthCAR;
+
+ if (parsed+1 > *RxLength)
+ goto err;
+ lengthCARprev = RxBuffer[parsed+1];
+ if (parsed+1+lengthCARprev > *RxLength) {
+ DEBUG_CRITICAL("Malformed Establish PACE Channel output data.");
+ return_value = IFD_COMMUNICATION_ERROR;
+ goto err;
+ }
+ if (lengthCARprev)
+ DEBUG_INFO_XXD("Previous Certificate Authority:\n",
+ &RxBuffer[parsed+1],
+ lengthCARprev);
+ parsed += 1 + lengthCARprev;
+
+ if (parsed+2 > *RxLength)
+ goto err;
+ length_IDicc = w2i(RxBuffer, parsed);
+ if (parsed+2+length_IDicc > *RxLength) {
+ DEBUG_CRITICAL("Malformed Establish PACE Channel output data.");
+ return_value = IFD_COMMUNICATION_ERROR;
+ goto err;
+ }
+ if (length_IDicc)
+ DEBUG_INFO_XXD("IDicc:\n", &RxBuffer[parsed+2], length_IDicc);
+ parsed += 2 + length_IDicc;
+
+ if (parsed != *RxLength) {
+ DEBUG_CRITICAL2("Overrun by %d bytes", *RxLength - parsed);
+ return_value = IFD_COMMUNICATION_ERROR;
+ goto err;
+ }
+ +
+err: +err:
+ ccid_descriptor -> readTimeout = old_read_timeout; + ccid_descriptor -> readTimeout = old_read_timeout;
@@ -210,15 +280,17 @@ Index: ccid-1.3.13/src/commands.c
+ } + }
+ +
+ length = dw2i(cmd, 1); + length = dw2i(cmd, 1);
+ if (length <= *RxLength) + if (length + 6 <= *RxLength)
+ *RxLength = length; + *RxLength = length + 6;
+ else + else
+ { + {
+ DEBUG_CRITICAL2("overrun by %d bytes", length - *RxLength); + DEBUG_CRITICAL2("overrun by %d bytes", length + 6 - *RxLength);
+ length = *RxLength;
+ return IFD_ERROR_INSUFFICIENT_BUFFER; + return IFD_ERROR_INSUFFICIENT_BUFFER;
+ } + }
+ memcpy(RxBuffer, &cmd[10], length); + uint32_t s = 0x00000000;
+ memcpy(RxBuffer, &s, 4); /* "Kein Fehler" */
+ memcpy(RxBuffer+4, &length, 2); /* lengthOutputData */
+ memcpy(RxBuffer+6, &cmd[10], length);
+ +
+ return IFD_SUCCESS; + return IFD_SUCCESS;
+} +}
@@ -227,7 +299,7 @@ Index: ccid-1.3.13/src/commands.c
/***************************************************************************** /*****************************************************************************
* *
* Escape * Escape
@@ -2113,3 +2256,15 @@ @@ -2113,3 +2329,15 @@
buffer[3] = (value >> 24) & 0xFF; buffer[3] = (value >> 24) & 0xFF;
} /* i2dw */ } /* i2dw */
@@ -279,6 +351,15 @@ Index: ccid-1.3.13/src/ccid.h
/* See CCID specs ch. 4.2.1 */ /* See CCID specs ch. 4.2.1 */
#define CCID_ICC_PRESENT_ACTIVE 0x00 /* 00 0000 00 */ #define CCID_ICC_PRESENT_ACTIVE 0x00 /* 00 0000 00 */
@@ -227,6 +229,8 @@
/* convert a 4 byte integer in USB format into an int */
#define dw2i(a, x) (unsigned int)((((((a[x+3] << 8) + a[x+2]) << 8) + a[x+1]) << 8) + a[x])
+/* convert a 2 byte integer in USB format into an int */
+#define w2i(a, x) (unsigned int)(((a[x+1]) << 8) + a[x])
/* all the data rates specified by ISO 7816-3 Fi/Di tables */
#define ISO_DATA_RATES 10753, 14337, 15625, 17204, \
Index: ccid-1.3.13/src/ccid_ifdhandler.h Index: ccid-1.3.13/src/ccid_ifdhandler.h
=================================================================== ===================================================================
--- ccid-1.3.13/src/ccid_ifdhandler.h (Revision 4979) --- ccid-1.3.13/src/ccid_ifdhandler.h (Revision 4979)

View File

@@ -1,6 +1,6 @@
Index: PCSC/src/PCSC/reader.h.in Index: PCSC/src/PCSC/reader.h.in
=================================================================== ===================================================================
--- PCSC/src/PCSC/reader.h.in (Revision 4993) --- PCSC/src/PCSC/reader.h.in (Revision 5063)
+++ PCSC/src/PCSC/reader.h.in (Arbeitskopie) +++ PCSC/src/PCSC/reader.h.in (Arbeitskopie)
@@ -121,6 +121,7 @@ @@ -121,6 +121,7 @@
#define FEATURE_IFD_DISPLAY_PROPERTIES 0x11 #define FEATURE_IFD_DISPLAY_PROPERTIES 0x11
@@ -12,13 +12,13 @@ Index: PCSC/src/PCSC/reader.h.in
* "IFDs with Secure Pin Entry Capabilities" */ * "IFDs with Secure Pin Entry Capabilities" */
Index: Drivers/ccid/src/ifdhandler.c Index: Drivers/ccid/src/ifdhandler.c
=================================================================== ===================================================================
--- Drivers/ccid/src/ifdhandler.c (Revision 4993) --- Drivers/ccid/src/ifdhandler.c (Revision 5063)
+++ Drivers/ccid/src/ifdhandler.c (Arbeitskopie) +++ Drivers/ccid/src/ifdhandler.c (Arbeitskopie)
@@ -1384,6 +1384,16 @@ @@ -1417,6 +1417,16 @@
iBytesReturned += sizeof(PCSC_TLV_STRUCTURE); iBytesReturned += sizeof(PCSC_TLV_STRUCTURE);
} }
+ if (ccid_descriptor -> bPINSupport & CCID_CLASS_PIN_PACE_CAPABILITIES) + if (get_ccid_descriptor(reader_index) -> bPINSupport & CCID_CLASS_PIN_PACE_CAPABILITIES)
+ { + {
+ pcsc_tlv -> tag = FEATURE_EXECUTE_PACE; + pcsc_tlv -> tag = FEATURE_EXECUTE_PACE;
+ pcsc_tlv -> length = 0x04; /* always 0x04 */ + pcsc_tlv -> length = 0x04; /* always 0x04 */
@@ -31,7 +31,7 @@ Index: Drivers/ccid/src/ifdhandler.c
/* We can always forward wLcdLayout */ /* We can always forward wLcdLayout */
pcsc_tlv -> tag = FEATURE_IFD_PIN_PROPERTIES; pcsc_tlv -> tag = FEATURE_IFD_PIN_PROPERTIES;
pcsc_tlv -> length = 0x04; /* always 0x04 */ pcsc_tlv -> length = 0x04; /* always 0x04 */
@@ -1548,6 +1558,43 @@ @@ -1581,6 +1591,43 @@
} }
} }
@@ -77,7 +77,7 @@ Index: Drivers/ccid/src/ifdhandler.c
Index: Drivers/ccid/src/commands.c Index: Drivers/ccid/src/commands.c
=================================================================== ===================================================================
--- Drivers/ccid/src/commands.c (Revision 4993) --- Drivers/ccid/src/commands.c (Revision 5063)
+++ Drivers/ccid/src/commands.c (Arbeitskopie) +++ Drivers/ccid/src/commands.c (Arbeitskopie)
@@ -68,7 +68,13 @@ @@ -68,7 +68,13 @@
unsigned int tx_length, unsigned char tx_buffer[], unsigned int *rx_length, unsigned int tx_length, unsigned char tx_buffer[], unsigned int *rx_length,
@@ -93,7 +93,7 @@ Index: Drivers/ccid/src/commands.c
/***************************************************************************** /*****************************************************************************
@@ -712,7 +718,144 @@ @@ -712,7 +718,217 @@
return ret; return ret;
} /* SecurePINModify */ } /* SecurePINModify */
@@ -103,8 +103,10 @@ Index: Drivers/ccid/src/commands.c
+{ +{
+ RESPONSECODE return_value; + RESPONSECODE return_value;
+ unsigned char lengthCHAT, lengthPIN; + unsigned char lengthCHAT, lengthPIN;
+ uint16_t lengthCertificateDescription; + uint16_t lengthCertificateDescription, lengthEF_CardAccess, length_IDicc;
+ uint8_t lengthCAR, lengthCARprev;
+ int old_read_timeout; + int old_read_timeout;
+ size_t parsed;
+ _ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index); + _ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index);
+ old_read_timeout= ccid_descriptor -> readTimeout; + old_read_timeout= ccid_descriptor -> readTimeout;
@@ -148,6 +150,74 @@ Index: Drivers/ccid/src/commands.c
+ /* bPINOperation: PIN PACE Capabilities */ + /* bPINOperation: PIN PACE Capabilities */
+ return_value = SecurePINPACE(reader_index, TxBuffer, TxLength, RxBuffer, + return_value = SecurePINPACE(reader_index, TxBuffer, TxLength, RxBuffer,
+ RxLength, CCID_CLASS_PIN_PACE_EXECUTE); + RxLength, CCID_CLASS_PIN_PACE_EXECUTE);
+ if (IFD_SUCCESS != return_value)
+ goto err;
+
+
+ if (6+2 > *RxLength)
+ goto err;
+ DEBUG_INFO3("MSE:Set AT Statusbytes: %02X %02X",
+ RxBuffer[6+0], RxBuffer[6+1]);
+ parsed = 6+2;
+
+
+ if (parsed+2 > *RxLength)
+ goto err;
+ lengthEF_CardAccess = w2i(RxBuffer, parsed);
+ if (parsed+2+lengthEF_CardAccess > *RxLength) {
+ DEBUG_CRITICAL("Malformed Establish PACE Channel output data.");
+ return_value = IFD_COMMUNICATION_ERROR;
+ goto err;
+ }
+ if (lengthEF_CardAccess)
+ DEBUG_INFO_XXD("EF.CardAccess:\n", &RxBuffer[parsed+2], lengthEF_CardAccess);
+ parsed += 2 + lengthEF_CardAccess;
+
+ if (parsed+1 > *RxLength)
+ goto err;
+ lengthCAR = RxBuffer[parsed+1];
+ if (parsed+1+lengthCAR > *RxLength) {
+ DEBUG_CRITICAL("Malformed Establish PACE Channel output data.");
+ return_value = IFD_COMMUNICATION_ERROR;
+ goto err;
+ }
+ if (lengthCAR)
+ DEBUG_INFO_XXD("Recent Certificate Authority:\n",
+ &RxBuffer[parsed+1],
+ lengthCAR);
+ parsed += 1 + lengthCAR;
+
+ if (parsed+1 > *RxLength)
+ goto err;
+ lengthCARprev = RxBuffer[parsed+1];
+ if (parsed+1+lengthCARprev > *RxLength) {
+ DEBUG_CRITICAL("Malformed Establish PACE Channel output data.");
+ return_value = IFD_COMMUNICATION_ERROR;
+ goto err;
+ }
+ if (lengthCARprev)
+ DEBUG_INFO_XXD("Previous Certificate Authority:\n",
+ &RxBuffer[parsed+1],
+ lengthCARprev);
+ parsed += 1 + lengthCARprev;
+
+ if (parsed+2 > *RxLength)
+ goto err;
+ length_IDicc = w2i(RxBuffer, parsed);
+ if (parsed+2+length_IDicc > *RxLength) {
+ DEBUG_CRITICAL("Malformed Establish PACE Channel output data.");
+ return_value = IFD_COMMUNICATION_ERROR;
+ goto err;
+ }
+ if (length_IDicc)
+ DEBUG_INFO_XXD("IDicc:\n", &RxBuffer[parsed+2], length_IDicc);
+ parsed += 2 + length_IDicc;
+
+ if (parsed != *RxLength) {
+ DEBUG_CRITICAL2("Overrun by %d bytes", *RxLength - parsed);
+ return_value = IFD_COMMUNICATION_ERROR;
+ goto err;
+ }
+ +
+err: +err:
+ ccid_descriptor -> readTimeout = old_read_timeout; + ccid_descriptor -> readTimeout = old_read_timeout;
@@ -222,15 +292,17 @@ Index: Drivers/ccid/src/commands.c
+ } + }
+ +
+ length = dw2i(cmd, 1); + length = dw2i(cmd, 1);
+ if (length <= *RxLength) + if (length + 6 <= *RxLength)
+ *RxLength = length; + *RxLength = length + 6;
+ else + else
+ { + {
+ DEBUG_CRITICAL2("overrun by %d bytes", length - *RxLength); + DEBUG_CRITICAL2("overrun by %d bytes", length + 6 - *RxLength);
+ length = *RxLength;
+ return IFD_ERROR_INSUFFICIENT_BUFFER; + return IFD_ERROR_INSUFFICIENT_BUFFER;
+ } + }
+ memcpy(RxBuffer, &cmd[10], length); + uint32_t s = 0x00000000;
+ memcpy(RxBuffer, &s, 4); /* "Kein Fehler" */
+ memcpy(RxBuffer+4, &length, 2); /* lengthOutputData */
+ memcpy(RxBuffer+6, &cmd[10], length);
+ +
+ return IFD_SUCCESS; + return IFD_SUCCESS;
+} +}
@@ -239,7 +311,7 @@ Index: Drivers/ccid/src/commands.c
/***************************************************************************** /*****************************************************************************
* *
* Escape * Escape
@@ -2113,3 +2256,15 @@ @@ -2113,3 +2329,15 @@
buffer[3] = (value >> 24) & 0xFF; buffer[3] = (value >> 24) & 0xFF;
} /* i2dw */ } /* i2dw */
@@ -257,7 +329,7 @@ Index: Drivers/ccid/src/commands.c
+ +
Index: Drivers/ccid/src/commands.h Index: Drivers/ccid/src/commands.h
=================================================================== ===================================================================
--- Drivers/ccid/src/commands.h (Revision 4993) --- Drivers/ccid/src/commands.h (Revision 5063)
+++ Drivers/ccid/src/commands.h (Arbeitskopie) +++ Drivers/ccid/src/commands.h (Arbeitskopie)
@@ -37,6 +37,14 @@ @@ -37,6 +37,14 @@
unsigned char TxBuffer[], unsigned int TxLength, unsigned char TxBuffer[], unsigned int TxLength,
@@ -276,7 +348,7 @@ Index: Drivers/ccid/src/commands.h
unsigned char RxBuffer[], unsigned int *RxLength); unsigned char RxBuffer[], unsigned int *RxLength);
Index: Drivers/ccid/src/ccid.h Index: Drivers/ccid/src/ccid.h
=================================================================== ===================================================================
--- Drivers/ccid/src/ccid.h (Revision 4993) --- Drivers/ccid/src/ccid.h (Revision 5063)
+++ Drivers/ccid/src/ccid.h (Arbeitskopie) +++ Drivers/ccid/src/ccid.h (Arbeitskopie)
@@ -142,8 +142,10 @@ @@ -142,8 +142,10 @@
#define CCID_CLASS_EXCHANGE_MASK 0x00070000 #define CCID_CLASS_EXCHANGE_MASK 0x00070000
@@ -291,9 +363,18 @@ Index: Drivers/ccid/src/ccid.h
/* See CCID specs ch. 4.2.1 */ /* See CCID specs ch. 4.2.1 */
#define CCID_ICC_PRESENT_ACTIVE 0x00 /* 00 0000 00 */ #define CCID_ICC_PRESENT_ACTIVE 0x00 /* 00 0000 00 */
@@ -228,6 +230,8 @@
/* convert a 4 byte integer in USB format into an int */
#define dw2i(a, x) (unsigned int)((((((a[x+3] << 8) + a[x+2]) << 8) + a[x+1]) << 8) + a[x])
+/* convert a 2 byte integer in USB format into an int */
+#define w2i(a, x) (unsigned int)(((a[x+1]) << 8) + a[x])
/* all the data rates specified by ISO 7816-3 Fi/Di tables */
#define ISO_DATA_RATES 10753, 14337, 15625, 17204, \
Index: Drivers/ccid/src/ccid_ifdhandler.h Index: Drivers/ccid/src/ccid_ifdhandler.h
=================================================================== ===================================================================
--- Drivers/ccid/src/ccid_ifdhandler.h (Revision 4993) --- Drivers/ccid/src/ccid_ifdhandler.h (Revision 5063)
+++ Drivers/ccid/src/ccid_ifdhandler.h (Arbeitskopie) +++ Drivers/ccid/src/ccid_ifdhandler.h (Arbeitskopie)
@@ -37,6 +37,8 @@ @@ -37,6 +37,8 @@
SCARD_CTL_CODE(FEATURE_IFD_PIN_PROPERTIES + CLASS2_IOCTL_MAGIC) SCARD_CTL_CODE(FEATURE_IFD_PIN_PROPERTIES + CLASS2_IOCTL_MAGIC)