[Pcsclite-cvs-commit] Drivers/ccid/examples scardcontrol.c,1.5,1.6
rousseau@haydn.debian.org
rousseau@haydn.debian.org
Update of /cvsroot/pcsclite/Drivers/ccid/examples
In directory haydn:/tmp/cvs-serv2119
Modified Files:
scardcontrol.c
Log Message:
- send Select DF and Select EF APDU before Verify PIN
- read stdin (consume the "*" fake keys) if the pinpad is on a keyboard
Index: scardcontrol.c
===================================================================
RCS file: /cvsroot/pcsclite/Drivers/ccid/examples/scardcontrol.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- scardcontrol.c 13 Jun 2004 16:59:13 -0000 1.5
+++ scardcontrol.c 23 Jun 2004 14:54:44 -0000 1.6
@@ -26,8 +26,7 @@
#include <time.h>
#include <unistd.h>
#include <string.h>
-#include <wintypes.h>
-#include <winscard.h>
+#include <PCSC/winscard.h>
#ifndef TRUE
#define TRUE 1
@@ -62,7 +61,7 @@
LONG rv;
SCARDCONTEXT hContext;
DWORD dwReaders;
- LPSTR mszReaders;
+ LPTSTR mszReaders;
char *ptr, **readers = NULL;
int nbReaders;
SCARDHANDLE hCard;
@@ -76,6 +75,7 @@
DWORD length;
char attribute[1];
DWORD attribute_length;
+ SCARD_IO_REQUEST pioRecvPci;
printf("SCardControl sample code\n");
printf("V 1.0 2004, Ludovic Rousseau <ludovic.rousseau@free.fr>\n");
@@ -159,8 +159,8 @@
printf(" Protocol: %ld\n", dwActiveProtocol);
PCSC_ERROR_EXIT(rv, "SCardConnect")
- /* get firmware */
- printf(" Get Firmware\n");
+ /* get GemPC firmware */
+ printf(" Get GemPC Firmware\n");
/* this is specific to Gemplus readers */
bSendBuffer[0] = 0x02;
@@ -203,6 +203,35 @@
goto end;
}
+ /* connect to a reader (even without a card) */
+ dwActiveProtocol = -1;
+ rv = SCardReconnect(hCard, SCARD_SHARE_SHARED,
+ SCARD_PROTOCOL_T0, SCARD_UNPOWER_CARD, &dwActiveProtocol);
+ printf(" Protocol: %ld\n", dwActiveProtocol);
+ PCSC_ERROR_EXIT(rv, "SCardReconnect")
+
+ /* APDU select DF */
+ memcpy(bSendBuffer, "\x00\xA4\x04\x00\x05\x47\x54\x4F\x4B\x31", 10);
+ length = sizeof(bRecvBuffer);
+ rv = SCardTransmit(hCard, SCARD_PCI_T0, bSendBuffer, 10,
+ &pioRecvPci, bRecvBuffer, &length);
+ printf(" card response:");
+ for (i=0; i<length; i++)
+ printf(" %02X", bRecvBuffer[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, SCARD_PCI_T0, bSendBuffer, 7,
+ &pioRecvPci, bRecvBuffer, &length);
+ printf(" card response:");
+ for (i=0; i<length; i++)
+ printf(" %02X", bRecvBuffer[i]);
+ printf("\n");
+ PCSC_ERROR_EXIT(rv, "SCardTransmit")
+
/* verify PIN */
printf(" Secure verify PIN\n");
offset = 0;
@@ -241,7 +270,7 @@
for (i=0; i<offset; i++)
printf(" %02X", bSendBuffer[i]);
printf("\n");
- printf("Enter your PIN:");
+ printf("Enter your PIN: ");
fflush(stdout);
rv = SCardControl(hCard, IOCTL_SMARTCARD_VENDOR_VERIFY_PIN, bSendBuffer,
offset, bRecvBuffer, sizeof(bRecvBuffer), &length);
@@ -251,6 +280,27 @@
printf(" %02X", bRecvBuffer[i]);
printf("\n");
PCSC_ERROR_CONT(rv, "SCardControl")
+
+ {
+ fd_set fd;
+ struct timeval timeout;
+
+ FD_ZERO(&fd);
+ FD_SET(STDIN_FILENO, &fd); /* stdin */
+ timeout.tv_sec = 0; /* timeout = 0 */
+ timeout.tv_usec = 0;
+
+ /* we only try to read stdin if the pinpad is on a keyboard
+ * we do not read stdin for a SPR 532 for example */
+ if (select(1, &fd, NULL, NULL, &timeout) > 0)
+ {
+ /* read the fake digits */
+ char in[10]; /* 4 digits + \n + \0 */
+ fgets(in, sizeof(in), stdin);
+
+ printf("keyboard sent: %s", in);
+ }
+ }
/* card disconnect */
rv = SCardDisconnect(hCard, SCARD_UNPOWER_CARD);