[Pcsclite-cvs-commit] r4846 - /trunk/Drivers/ccid/examples/scardcontrol.c
rousseau at users.alioth.debian.org
rousseau at users.alioth.debian.org
Tue Mar 30 09:46:07 UTC 2010
Author: rousseau
Date: Tue Mar 30 09:46:07 2010
New Revision: 4846
URL: http://svn.debian.org/wsvn/pcsclite/?sc=1&rev=4846
Log:
add support of FEATURE_GET_TLV_PROPERTIES
Modified:
trunk/Drivers/ccid/examples/scardcontrol.c
Modified: trunk/Drivers/ccid/examples/scardcontrol.c
URL: http://svn.debian.org/wsvn/pcsclite/trunk/Drivers/ccid/examples/scardcontrol.c?rev=4846&op=diff
==============================================================================
--- trunk/Drivers/ccid/examples/scardcontrol.c (original)
+++ trunk/Drivers/ccid/examples/scardcontrol.c Tue Mar 30 09:46:07 2010
@@ -46,21 +46,148 @@
#define IOCTL_SMARTCARD_VENDOR_IFD_EXCHANGE SCARD_CTL_CODE(1)
+#define BLUE "\33[34m"
+#define RED "\33[31m"
+#define BRIGHT_RED "\33[01;31m"
+#define GREEN "\33[32m"
+#define NORMAL "\33[0m"
+#define MAGENTA "\33[35m"
+
/* PCSC error message pretty print */
#define PCSC_ERROR_EXIT(rv, text) \
if (rv != SCARD_S_SUCCESS) \
{ \
- printf(text ": %s (0x%lX)\n", pcsc_stringify_error(rv), rv); \
+ printf(text ": " RED "%s (0x%lX)\n" NORMAL, pcsc_stringify_error(rv), rv); \
goto end; \
} \
else \
- printf(text ": OK\n\n");
+ printf(text ": " BLUE "OK\n\n" NORMAL);
#define PCSC_ERROR_CONT(rv, text) \
if (rv != SCARD_S_SUCCESS) \
- printf(text ": %s (0x%lX)\n", pcsc_stringify_error(rv), rv); \
+ printf(text ": " BLUE "%s (0x%lX)\n" NORMAL, pcsc_stringify_error(rv), rv); \
else \
- printf(text ": OK\n\n");
+ printf(text ": " BLUE "OK\n\n" NORMAL);
+
+#define PRINT_GREEN(text, value) \
+ printf("%s: " GREEN "%s\n" NORMAL, text, value)
+
+#define PRINT_GREEN_DEC(text, value) \
+ printf("%s: " GREEN "%d\n" NORMAL, text, value)
+
+#define PRINT_GREEN_HEX2(text, value) \
+ printf("%s: " GREEN "0x%02X\n" NORMAL, text, value)
+
+#define PRINT_GREEN_HEX4(text, value) \
+ printf("%s: " GREEN "0x%04X\n" NORMAL, text, value)
+
+static void parse_properties(unsigned char *bRecvBuffer, int length)
+{
+ unsigned char *p;
+ int i;
+
+ p = bRecvBuffer;
+ while (p-bRecvBuffer < length)
+ {
+ int tag, len, value;
+
+ tag = *p++;
+ len = *p++;
+
+ switch(len)
+ {
+ case 1:
+ value = *p;
+ break;
+ case 2:
+ value = *p + (*(p+1)<<8);
+ break;
+ case 4:
+ value = *p + (*(p+1)<<8) + (*(p+2)<<16) + (*(p+3)<<24);
+ break;
+ default:
+ value = -1;
+ }
+
+ switch(tag)
+ {
+ case PCSCv2_PART10_PROPERTY_wLcdLayout:
+ PRINT_GREEN_HEX4("wLcdLayout", value);
+ break;
+ case PCSCv2_PART10_PROPERTY_bEntryValidationCondition:
+ PRINT_GREEN_HEX2("bEntryValidationCondition", value);
+ break;
+ case PCSCv2_PART10_PROPERTY_bTimeOut2:
+ PRINT_GREEN_HEX2("bTimeOut2", value);
+ break;
+ case PCSCv2_PART10_PROPERTY_wLcdMaxCharacters:
+ PRINT_GREEN_HEX4("wLcdMaxCharacters", value);
+ break;
+ case PCSCv2_PART10_PROPERTY_wLcdMaxLines:
+ PRINT_GREEN_HEX4("wLcdMaxLines", value);
+ break;
+ case PCSCv2_PART10_PROPERTY_bMinPINSize:
+ PRINT_GREEN_HEX2("bMinPINSize", value);
+ break;
+ case PCSCv2_PART10_PROPERTY_bMaxPINSize:
+ PRINT_GREEN_HEX2("bMaxPINSize", value);
+ break;
+ case PCSCv2_PART10_PROPERTY_sFirmwareID:
+ printf("PCSCv2_PART10_PROPERTY_sFirmwareID: " GREEN);
+ for (i=0; i<len; i++)
+ putchar(p[i]);
+ printf(NORMAL "\n");
+ break;
+ default:
+ printf("Unknown tag: 0x%02X (length = %d)\n", tag, len);
+ }
+
+ p += len;
+ }
+} /* parse_properties */
+
+static int find_property_by_tag(unsigned char *bRecvBuffer, int length,
+ int tag_searched)
+{
+ unsigned char *p;
+ int found = 0, len, value = -1;
+
+ p = bRecvBuffer;
+ while (p-bRecvBuffer < length)
+ {
+ if (*p++ == tag_searched)
+ {
+ found = 1;
+ break;
+ }
+
+ /* go to next tag */
+ len = *p++;
+ p += len;
+ }
+
+ if (found)
+ {
+ len = *p++;
+
+ switch(len)
+ {
+ case 1:
+ value = *p;
+ break;
+ case 2:
+ value = *p + (*(p+1)<<8);
+ break;
+ case 4:
+ value = *p + (*(p+1)<<8) + (*(p+2)<<16) + (*(p+3)<<24);
+ break;
+ default:
+ value = -1;
+ }
+ }
+
+ return value;
+} /* find_property_by_tag */
int main(int argc, char *argv[])
{
@@ -83,6 +210,7 @@
DWORD modify_ioctl = 0;
DWORD pin_properties_ioctl = 0;
DWORD mct_readerdirect_ioctl = 0;
+ DWORD properties_in_tlv_ioctl = 0;
SCARD_IO_REQUEST pioRecvPci;
SCARD_IO_REQUEST pioSendPci;
PCSC_TLV_STRUCTURE *pcsc_tlv;
@@ -98,10 +226,10 @@
char secoder_info[] = { 0x20, 0x70, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 };
printf("SCardControl sample code\n");
- printf("V 1.3 © 2004-2009, Ludovic Rousseau <ludovic.rousseau at free.fr>\n");
-
- printf("\nTHIS PROGRAM IS NOT DESIGNED AS A TESTING TOOL!\n");
- printf("Do NOT use it unless you really know what you do.\n\n");
+ printf("V 1.4 © 2004-2010, Ludovic Rousseau <ludovic.rousseau at free.fr>\n\n");
+
+ printf(MAGENTA "THIS PROGRAM IS NOT DESIGNED AS A TESTING TOOL!\n");
+ printf("Do NOT use it unless you really know what you do.\n\n" NORMAL);
rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
if (rv != SCARD_S_SUCCESS)
@@ -176,10 +304,10 @@
/* connect to a reader (even without a card) */
dwActiveProtocol = -1;
- printf("Using reader: %s\n", readers[reader_nb]);
+ printf("Using reader: " GREEN "%s\n" NORMAL, readers[reader_nb]);
rv = SCardConnect(hContext, readers[reader_nb], SCARD_SHARE_DIRECT,
SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, &hCard, &dwActiveProtocol);
- printf(" Protocol: %ld\n", dwActiveProtocol);
+ printf(" Protocol: " GREEN "%ld\n" NORMAL, dwActiveProtocol);
PCSC_ERROR_EXIT(rv, "SCardConnect")
#ifdef GET_GEMPC_FIRMWARE
@@ -191,13 +319,13 @@
rv = SCardControl(hCard, IOCTL_SMARTCARD_VENDOR_IFD_EXCHANGE, bSendBuffer,
1, bRecvBuffer, sizeof(bRecvBuffer), &length);
- printf(" Firmware: ");
+ printf(" Firmware: " GREEN);
for (i=0; i<length; i++)
printf("%02X ", bRecvBuffer[i]);
- printf("\n");
+ printf(NORMAL "\n");
bRecvBuffer[length] = '\0';
- printf(" Firmware: %s (length %ld bytes)\n", bRecvBuffer, length);
+ printf(" Firmware: " GREEN "%s" NORMAL" (length " GREEN "%ld" NORMAL " bytes)\n", bRecvBuffer, length);
PCSC_ERROR_CONT(rv, "SCardControl")
#endif
@@ -207,10 +335,10 @@
bRecvBuffer, sizeof(bRecvBuffer), &length);
PCSC_ERROR_EXIT(rv, "SCardControl")
- printf(" TLV (%ld): ", length);
+ printf(" TLV (%ld): " GREEN, length);
for (i=0; i<length; i++)
printf("%02X ", bRecvBuffer[i]);
- printf("\n");
+ printf(NORMAL "\n");
PCSC_ERROR_CONT(rv, "SCardControl(CM_IOCTL_GET_FEATURE_REQUEST)")
@@ -229,26 +357,54 @@
switch (pcsc_tlv[i].tag)
{
case FEATURE_VERIFY_PIN_DIRECT:
- printf("Reader supports FEATURE_VERIFY_PIN_DIRECT\n");
+ PRINT_GREEN("Reader supports", "FEATURE_VERIFY_PIN_DIRECT");
verify_ioctl = ntohl(pcsc_tlv[i].value);
break;
case FEATURE_MODIFY_PIN_DIRECT:
- printf("Reader supports FEATURE_MODIFY_PIN_DIRECT\n");
+ PRINT_GREEN("Reader supports", "FEATURE_MODIFY_PIN_DIRECT");
modify_ioctl = ntohl(pcsc_tlv[i].value);
break;
case FEATURE_IFD_PIN_PROPERTIES:
- printf("Reader supports FEATURE_IFD_PIN_PROPERTIES\n");
+ PRINT_GREEN("Reader supports", "FEATURE_IFD_PIN_PROPERTIES");
pin_properties_ioctl = ntohl(pcsc_tlv[i].value);
break;
case FEATURE_MCT_READER_DIRECT:
- printf("Reader supports FEATURE_MCT_READER_DIRECT\n");
+ PRINT_GREEN("Reader supports", "FEATURE_MCT_READER_DIRECT");
mct_readerdirect_ioctl = ntohl(pcsc_tlv[i].value);
break;
+ case FEATURE_GET_TLV_PROPERTIES:
+ PRINT_GREEN("Reader supports", "FEATURE_GET_TLV_PROPERTIES");
+ properties_in_tlv_ioctl = ntohl(pcsc_tlv[i].value);
+ break;
default:
- printf("Can't parse tag: 0x%02X\n", pcsc_tlv[i].tag);
+ printf("Can't parse tag: " RED "0x%02X" NORMAL, pcsc_tlv[i].tag);
}
}
printf("\n");
+
+ if (properties_in_tlv_ioctl)
+ {
+ int value;
+
+ rv = SCardControl(hCard, properties_in_tlv_ioctl, secoder_info,
+ sizeof(secoder_info), bRecvBuffer, sizeof(bRecvBuffer), &length);
+ PCSC_ERROR_CONT(rv, "SCardControl(GET_TLV_PROPERTIES)")
+
+ printf("GET_TLV_PROPERTIES (" GREEN "%ld" NORMAL "): " GREEN, length);
+ for (i=0; i<length; i++)
+ printf("%02X ", bRecvBuffer[i]);
+ printf(NORMAL "\n");
+
+ printf("\nDisplay all the properties:\n");
+ parse_properties(bRecvBuffer, length);
+
+ printf("\nFind a specific property:\n");
+ value = find_property_by_tag(bRecvBuffer, length, PCSCv2_PART10_PROPERTY_bEntryValidationCondition);
+ PRINT_GREEN_DEC("bEntryValidationCondition", value);
+
+ value = find_property_by_tag(bRecvBuffer, length, PCSCv2_PART10_PROPERTY_bMaxPINSize);
+ PRINT_GREEN_DEC("bMaxPINSize", value);
+ }
if (mct_readerdirect_ioctl)
{
@@ -260,7 +416,6 @@
for (i=0; i<length; i++)
printf("%02X ", bRecvBuffer[i]);
printf("\n");
-
}
if (0 == verify_ioctl)
More information about the Pcsclite-cvs-commit
mailing list