[Pcsclite-cvs-commit] r1676 - trunk/Drivers/ccid/examples

Ludovic Rousseau rousseau at costa.debian.org
Mon Sep 26 14:43:52 UTC 2005


Author: rousseau
Date: 2005-09-26 14:43:51 +0000 (Mon, 26 Sep 2005)
New Revision: 1676

Modified:
   trunk/Drivers/ccid/examples/scardcontrol.c
Log:
use the new HandlerTest applet commands


Modified: trunk/Drivers/ccid/examples/scardcontrol.c
===================================================================
--- trunk/Drivers/ccid/examples/scardcontrol.c	2005-09-26 14:42:26 UTC (rev 1675)
+++ trunk/Drivers/ccid/examples/scardcontrol.c	2005-09-26 14:43:51 UTC (rev 1676)
@@ -29,6 +29,9 @@
 #include <PCSC/winscard.h>
 #include <PCSC/reader.h>
 
+#define VERIFY_PIN
+#undef MODIFY_PIN
+
 #ifndef TRUE
 #define TRUE 1
 #define FALSE 0
@@ -68,7 +71,7 @@
 	int i, offset;
 	unsigned char bSendBuffer[MAX_BUFFER_SIZE];
 	unsigned char bRecvBuffer[MAX_BUFFER_SIZE];
-	DWORD length;
+	DWORD send_length, length;
 	DWORD verify_ioctl = 0;
 	DWORD modify_ioctl = 0;
 	SCARD_IO_REQUEST pioRecvPci;
@@ -78,7 +81,7 @@
 	PIN_MODIFY_STRUCTURE *pin_modify;
 
 	printf("SCardControl sample code\n");
-	printf("V 1.0 2004, Ludovic Rousseau <ludovic.rousseau at free.fr>\n");
+	printf("V 1.1 2004-2005, 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");
@@ -251,21 +254,16 @@
 			return -1;
 	}
 
-	/* APDU select DF */
-	memcpy(bSendBuffer, "\x00\xA4\x04\x00\x05\x47\x54\x4F\x4B\x31", 10);
-	length = sizeof(bRecvBuffer);
-	rv = SCardTransmit(hCard, &pioSendPci, bSendBuffer, 10,
-		&pioRecvPci, bRecvBuffer, &length);
-	printf(" card response:");
-	for (i=0; i<length; i++)
-		printf(" %02X", bRecvBuffer[i]);
+	/* APDU select applet */
+	printf("Select applet: ");
+	send_length = 11;
+	memcpy(bSendBuffer, "\x00\xA4\x04\x00\x06\xA0\x00\x00\x00\x18\xFF",
+		send_length);
+	for (i=0; i<send_length; i++)
+		printf(" %02X", bSendBuffer[i]);
 	printf("\n");
-	PCSC_ERROR_EXIT(rv, "SCardTransmit")
-
-	/* APDU select EF */
-	memcpy(bSendBuffer, "\x00\xA4\x02\x00\x02\x00\x04", 7);
 	length = sizeof(bRecvBuffer);
-	rv = SCardTransmit(hCard, &pioSendPci, bSendBuffer, 7,
+	rv = SCardTransmit(hCard, &pioSendPci, bSendBuffer, send_length,
 		&pioRecvPci, bRecvBuffer, &length);
 	printf(" card response:");
 	for (i=0; i<length; i++)
@@ -273,6 +271,7 @@
 	printf("\n");
 	PCSC_ERROR_EXIT(rv, "SCardTransmit")
 
+#ifdef VERIFY_PIN
 	/* verify PIN */
 	printf(" Secure verify PIN\n");
 	pin_verify = (PIN_VERIFY_STRUCTURE *)bSendBuffer;
@@ -284,7 +283,7 @@
 	pin_verify -> bmPINBlockString = 0x04;
 	pin_verify -> bmPINLengthFormat = 0x00;
 	pin_verify -> wPINMaxExtraDigit = HOST_TO_CCID_16(0x0408); /* Min Max */
-	pin_verify -> bEntryValidationCondition = 0x02;	/* validation key pressed */
+	pin_verify -> bEntryValidationCondition = 0x03;	/* validation key pressed */
 	pin_verify -> bNumberMessage = 0x00;
 	pin_verify -> wLangId = HOST_TO_CCID_16(0x0904);
 	pin_verify -> bMsgIndex = 0x00;
@@ -321,12 +320,6 @@
 	rv = SCardControl(hCard, verify_ioctl, bSendBuffer,
 		length, bRecvBuffer, sizeof(bRecvBuffer), &length);
 
-	printf(" card response:");
-	for (i=0; i<length; i++)
-		printf(" %02X", bRecvBuffer[i]);
-	printf("\n");
-	PCSC_ERROR_CONT(rv, "SCardControl")
-
 	{
 #ifndef S_SPLINT_S
 		fd_set fd;
@@ -348,8 +341,56 @@
 
 			printf("keyboard sent: %s", in);
 		}
+		else
+			/* if it is not a keyboard */
+			printf("\n");
 	}
 
+	printf(" card response:");
+	for (i=0; i<length; i++)
+		printf(" %02X", bRecvBuffer[i]);
+	printf("\n");
+	PCSC_ERROR_CONT(rv, "SCardControl")
+
+	/* verify PIN dump */
+	printf("\nverify PIN dump: ");
+	send_length = 5;
+	memcpy(bSendBuffer, "\x00\x40\x00\x00\xFF",
+		send_length);
+	for (i=0; i<send_length; i++)
+		printf(" %02X", bSendBuffer[i]);
+	printf("\n");
+	length = sizeof(bRecvBuffer);
+	rv = SCardTransmit(hCard, &pioSendPci, bSendBuffer, send_length,
+		&pioRecvPci, bRecvBuffer, &length);
+	printf(" card response:");
+	for (i=0; i<length; i++)
+		printf(" %02X", bRecvBuffer[i]);
+	printf("\n");
+	PCSC_ERROR_EXIT(rv, "SCardTransmit")
+
+	if ((2 == length) && (0x6C == bRecvBuffer[0]))
+	{
+		printf("\nverify PIN dump: ");
+		send_length = 5;
+		memcpy(bSendBuffer, "\x00\x40\x00\x00\xFF",
+			send_length);
+		bSendBuffer[4] = bRecvBuffer[1];
+		for (i=0; i<send_length; i++)
+			printf(" %02X", bSendBuffer[i]);
+		printf("\n");
+		length = sizeof(bRecvBuffer);
+		rv = SCardTransmit(hCard, &pioSendPci, bSendBuffer, send_length,
+			&pioRecvPci, bRecvBuffer, &length);
+		printf(" card response:");
+		for (i=0; i<length; i++)
+			printf(" %02X", bRecvBuffer[i]);
+		printf("\n");
+		PCSC_ERROR_EXIT(rv, "SCardTransmit")
+	}
+#endif
+
+	/* check if the reader supports Modify PIN */
 	if (0 == modify_ioctl)
 	{
 		printf("Reader %s does not support PIN modification\n",
@@ -357,6 +398,7 @@
 		goto end;
 	}
 
+#ifdef MODIFY_PIN
 	/* Modify PIN */
 	printf(" Secure modify PIN\n");
 	pin_modify = (PIN_MODIFY_STRUCTURE *)bSendBuffer;
@@ -447,6 +489,7 @@
 			printf("keyboard sent: %s", in);
 		}
 	}
+#endif
 
 	/* card disconnect */
 	rv = SCardDisconnect(hCard, SCARD_UNPOWER_CARD);




More information about the Pcsclite-cvs-commit mailing list