- 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;
} /* SecurePINModify */
@@ -91,8 +91,10 @@ Index: ccid-1.3.11/src/commands.c
+{
+ RESPONSECODE return_value;
+ unsigned char lengthCHAT, lengthPIN;
+ uint16_t lengthCertificateDescription;
+ uint16_t lengthCertificateDescription, lengthEF_CardAccess, length_IDicc;
+ uint8_t lengthCAR, lengthCARprev;
+ int old_read_timeout;
+ size_t parsed;
+ _ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index);
+ old_read_timeout= ccid_descriptor -> readTimeout;
@@ -136,6 +138,74 @@ Index: ccid-1.3.11/src/commands.c
+ /* bPINOperation: PIN PACE Capabilities */
+ return_value = SecurePINPACE(reader_index, TxBuffer, TxLength, RxBuffer,
+ 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:
+ ccid_descriptor -> readTimeout = old_read_timeout;
@@ -210,15 +280,17 @@ Index: ccid-1.3.11/src/commands.c
+ }
+
+ length = dw2i(cmd, 1);
+ if (length <= *RxLength)
+ *RxLength = length;
+ if (length + 6 <= *RxLength)
+ *RxLength = length + 6;
+ else
+ {
+ DEBUG_CRITICAL2("overrun by %d bytes", length - *RxLength);
+ length = *RxLength;
+ DEBUG_CRITICAL2("overrun by %d bytes", length + 6 - *RxLength);
+ 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;
+}
@@ -227,7 +299,7 @@ Index: ccid-1.3.11/src/commands.c
/*****************************************************************************
*
* Escape
@@ -2081,3 +2224,15 @@
@@ -2081,3 +2297,15 @@
buffer[3] = (value >> 24) & 0xFF;
} /* i2dw */
@@ -262,7 +334,7 @@ Index: ccid-1.3.11/src/commands.h
RESPONSECODE CmdEscape(unsigned int reader_index,
const unsigned char TxBuffer[], unsigned int TxLength,
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 (Arbeitskopie)
@@ -279,6 +351,15 @@ Index: src/ccid.h
/* See CCID specs ch. 4.2.1 */
#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
===================================================================
--- 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);
}
+ 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 -> 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;
} /* SecurePINModify */
@@ -91,8 +91,10 @@ Index: ccid-1.3.13/src/commands.c
+{
+ RESPONSECODE return_value;
+ unsigned char lengthCHAT, lengthPIN;
+ uint16_t lengthCertificateDescription;
+ uint16_t lengthCertificateDescription, lengthEF_CardAccess, length_IDicc;
+ uint8_t lengthCAR, lengthCARprev;
+ int old_read_timeout;
+ size_t parsed;
+ _ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index);
+ old_read_timeout= ccid_descriptor -> readTimeout;
@@ -136,6 +138,74 @@ Index: ccid-1.3.13/src/commands.c
+ /* bPINOperation: PIN PACE Capabilities */
+ return_value = SecurePINPACE(reader_index, TxBuffer, TxLength, RxBuffer,
+ 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:
+ ccid_descriptor -> readTimeout = old_read_timeout;
@@ -210,15 +280,17 @@ Index: ccid-1.3.13/src/commands.c
+ }
+
+ length = dw2i(cmd, 1);
+ if (length <= *RxLength)
+ *RxLength = length;
+ if (length + 6 <= *RxLength)
+ *RxLength = length + 6;
+ else
+ {
+ DEBUG_CRITICAL2("overrun by %d bytes", length - *RxLength);
+ length = *RxLength;
+ DEBUG_CRITICAL2("overrun by %d bytes", length + 6 - *RxLength);
+ 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;
+}
@@ -227,7 +299,7 @@ Index: ccid-1.3.13/src/commands.c
/*****************************************************************************
*
* Escape
@@ -2113,3 +2256,15 @@
@@ -2113,3 +2329,15 @@
buffer[3] = (value >> 24) & 0xFF;
} /* i2dw */
@@ -279,6 +351,15 @@ Index: ccid-1.3.13/src/ccid.h
/* See CCID specs ch. 4.2.1 */
#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
===================================================================
--- ccid-1.3.13/src/ccid_ifdhandler.h (Revision 4979)

View File

@@ -1,6 +1,6 @@
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)
@@ -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 4993)
--- Drivers/ccid/src/ifdhandler.c (Revision 5063)
+++ Drivers/ccid/src/ifdhandler.c (Arbeitskopie)
@@ -1384,6 +1384,16 @@
@@ -1417,6 +1417,16 @@
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 -> length = 0x04; /* always 0x04 */
@@ -31,7 +31,7 @@ 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,43 @@
@@ -1581,6 +1591,43 @@
}
}
@@ -77,7 +77,7 @@ Index: Drivers/ccid/src/ifdhandler.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)
@@ -68,7 +68,13 @@
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;
} /* SecurePINModify */
@@ -103,8 +103,10 @@ Index: Drivers/ccid/src/commands.c
+{
+ RESPONSECODE return_value;
+ unsigned char lengthCHAT, lengthPIN;
+ uint16_t lengthCertificateDescription;
+ uint16_t lengthCertificateDescription, lengthEF_CardAccess, length_IDicc;
+ uint8_t lengthCAR, lengthCARprev;
+ int old_read_timeout;
+ size_t parsed;
+ _ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index);
+ old_read_timeout= ccid_descriptor -> readTimeout;
@@ -148,6 +150,74 @@ Index: Drivers/ccid/src/commands.c
+ /* bPINOperation: PIN PACE Capabilities */
+ return_value = SecurePINPACE(reader_index, TxBuffer, TxLength, RxBuffer,
+ 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:
+ ccid_descriptor -> readTimeout = old_read_timeout;
@@ -222,15 +292,17 @@ Index: Drivers/ccid/src/commands.c
+ }
+
+ length = dw2i(cmd, 1);
+ if (length <= *RxLength)
+ *RxLength = length;
+ if (length + 6 <= *RxLength)
+ *RxLength = length + 6;
+ else
+ {
+ DEBUG_CRITICAL2("overrun by %d bytes", length - *RxLength);
+ length = *RxLength;
+ DEBUG_CRITICAL2("overrun by %d bytes", length + 6 - *RxLength);
+ 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;
+}
@@ -239,7 +311,7 @@ Index: Drivers/ccid/src/commands.c
/*****************************************************************************
*
* Escape
@@ -2113,3 +2256,15 @@
@@ -2113,3 +2329,15 @@
buffer[3] = (value >> 24) & 0xFF;
} /* i2dw */
@@ -257,7 +329,7 @@ Index: Drivers/ccid/src/commands.c
+
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)
@@ -37,6 +37,14 @@
unsigned char TxBuffer[], unsigned int TxLength,
@@ -276,7 +348,7 @@ Index: Drivers/ccid/src/commands.h
unsigned char RxBuffer[], unsigned int *RxLength);
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)
@@ -142,8 +142,10 @@
#define CCID_CLASS_EXCHANGE_MASK 0x00070000
@@ -291,9 +363,18 @@ Index: Drivers/ccid/src/ccid.h
/* See CCID specs ch. 4.2.1 */
#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
===================================================================
--- Drivers/ccid/src/ccid_ifdhandler.h (Revision 4993)
--- Drivers/ccid/src/ccid_ifdhandler.h (Revision 5063)
+++ Drivers/ccid/src/ccid_ifdhandler.h (Arbeitskopie)
@@ -37,6 +37,8 @@
SCARD_CTL_CODE(FEATURE_IFD_PIN_PROPERTIES + CLASS2_IOCTL_MAGIC)