- cats-test and picc_to_pcsc are using the same pcsc abstraction. this reduces the code to maintain

- partial rewrite of picc_to_pcsc to reduce memory leaks and add fault tolerancy


git-svn-id: https://vsmartcard.svn.sourceforge.net/svnroot/vsmartcard@300 96b47cad-a561-4643-ad3b-153ac7d7599c
This commit is contained in:
frankmorgner
2010-10-07 10:41:45 +00:00
parent 320cca0731
commit 480cf4d722
10 changed files with 223 additions and 931 deletions

View File

@@ -53,22 +53,6 @@
#define PCSC_TLV_ELEMENT_SIZE 6
static void
printb(const char *label, unsigned char *buf, size_t len)
{
size_t i = 0;
printf("%s", label);
while (i < len) {
printf("%02X", buf[i]);
i++;
if (i%20)
printf(" ");
else if (i != len)
printf("\n");
}
printf("\n");
}
static LONG parse_EstablishPACEChannel_OutputData(
unsigned char output[], unsigned int output_length)
{
@@ -188,7 +172,7 @@ main(int argc, char *argv[])
SCARDHANDLE hCard;
LPSTR readers = NULL;
BYTE sendbuf[16], recvbuf[1024];
DWORD ctl, recvlen;
DWORD ctl, recvlen, protocol;
time_t t_start, t_end;
size_t l, pinlen = 0;
char *pin = NULL;
@@ -216,15 +200,15 @@ main(int argc, char *argv[])
r = pcsc_connect(readernum, SCARD_SHARE_DIRECT, 0, &hContext, &readers,
&hCard);
&hCard, &protocol);
if (r != SCARD_S_SUCCESS)
goto err;
#define SIMULATE_BUERGERCLIENT 1
#ifdef SIMULATE_BUERGERCLIENT
r = SCardReconnect(hCard, SCARD_SHARE_EXCLUSIVE, SCARD_PROTOCOL_T0,
SCARD_LEAVE_CARD, &ctl);
r = SCardReconnect(hCard, SCARD_SHARE_EXCLUSIVE, SCARD_PROTOCOL_ANY,
SCARD_LEAVE_CARD, &protocol);
if (r != SCARD_S_SUCCESS) {
fprintf(stderr, "Could not reconnect\n");
goto err;
@@ -250,18 +234,16 @@ main(int argc, char *argv[])
};
LPBYTE buf0 = bufs0;
DWORD lens0[] = {4, 4, 4, 4, 7, 14, 7, 20, 7, 7, 5, 5, 5, 5, 5, 7, 20};
SCARD_IO_REQUEST pioRecvPci;
for (l = 0; l < sizeof(lens0)/sizeof(DWORD); l++) {
recvlen = sizeof(recvbuf);
r = SCardTransmit(hCard, SCARD_PCI_T0, buf0, lens0[l], &pioRecvPci,
recvbuf, &recvlen);
r = pcsc_transmit(protocol, hCard, buf0, lens0[l], recvbuf, &recvlen);
if (r != SCARD_S_SUCCESS) {
fprintf(stderr, "Simulation of Buergerclient failed\n");
goto err;
}
buf0 += lens0[l];
}
r = SCardReconnect(hCard, SCARD_SHARE_DIRECT, 0, SCARD_LEAVE_CARD, &ctl);
r = SCardReconnect(hCard, SCARD_SHARE_DIRECT, 0, SCARD_LEAVE_CARD, &protocol);
if (r != SCARD_S_SUCCESS) {
fprintf(stderr, "Could not reconnect\n");
goto err;
@@ -338,8 +320,8 @@ main(int argc, char *argv[])
#define SIMULATE_TA_CA 1
#ifdef SIMULATE_TA_CA
r = SCardReconnect(hCard, SCARD_SHARE_EXCLUSIVE, SCARD_PROTOCOL_T0,
SCARD_LEAVE_CARD, &ctl);
r = SCardReconnect(hCard, SCARD_SHARE_EXCLUSIVE, SCARD_PROTOCOL_ANY,
SCARD_LEAVE_CARD, &protocol);
if (r != SCARD_S_SUCCESS) {
fprintf(stderr, "Could not reconnect\n");
goto err;
@@ -376,11 +358,9 @@ main(int argc, char *argv[])
LPBYTE buf1 = bufs1;
DWORD lens1[] = {20, 233, 21, 328, 88, 5, 69, 7, 7, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 17, 75};
SCARD_IO_REQUEST ridpioRecvPci;
for (l = 0; l < sizeof(lens1)/sizeof(DWORD); l++) {
recvlen = sizeof(recvbuf);
r = SCardTransmit(hCard, SCARD_PCI_T0, buf1, lens1[l], &ridpioRecvPci,
recvbuf, &recvlen);
r = pcsc_transmit(protocol, hCard, buf1, lens1[l], recvbuf, &recvlen);
if (r != SCARD_S_SUCCESS) {
fprintf(stderr,
"Simulation of Terminal and Chip Authentication failed\n");
@@ -388,33 +368,16 @@ main(int argc, char *argv[])
}
buf1 += lens1[l];
}
r = SCardReconnect(hCard, SCARD_SHARE_DIRECT, 0, SCARD_LEAVE_CARD, &ctl);
r = SCardReconnect(hCard, SCARD_SHARE_DIRECT, 0, SCARD_LEAVE_CARD, &protocol);
if (r != SCARD_S_SUCCESS) {
fprintf(stderr, "Could not reconnect\n");
goto err;
}
#endif
r = SCardDisconnect(hCard, SCARD_LEAVE_CARD);
if (r != SCARD_S_SUCCESS)
goto err;
r = SCardFreeMemory(hContext, readers);
if (r != SCARD_S_SUCCESS)
goto err;
exit(0);
err:
#ifdef HAVE_PCSCLITE_H
if (r != SCARD_S_SUCCESS)
puts(pcsc_stringify_error(r));
#endif
if (readers)
SCardFreeMemory(hContext, readers);
stringify_error(r);
pcsc_disconnect(hContext, hCard, readers);
exit(1);
exit(r == SCARD_S_SUCCESS ? 0 : 1);
}

View File

@@ -22,8 +22,9 @@
#include "pcscutil.h"
LONG
pcsc_connect(unsigned int readernum, DWORD dwShareMode, DWORD dwPreferredProtocol,
SCARDCONTEXT *hContext, LPSTR *readers, LPSCARDHANDLE phCard)
pcsc_connect(unsigned int readernum, DWORD dwShareMode, DWORD dwPreferredProtocols,
SCARDCONTEXT *hContext, LPSTR *readers, LPSCARDHANDLE phCard,
LPDWORD pdwActiveProtocol)
{
LONG r;
DWORD ctl, readerslen;
@@ -57,8 +58,8 @@ pcsc_connect(unsigned int readernum, DWORD dwShareMode, DWORD dwPreferredProtoco
}
r = SCardConnect(hContext, reader, dwShareMode, dwPreferredProtocol,
phCard, &ctl);
r = SCardConnect(hContext, reader, dwShareMode, dwPreferredProtocols,
phCard, pdwActiveProtocol);
if (r != SCARD_S_SUCCESS) {
fprintf(stderr, "Could not connect to %s\n", reader);
goto err;
@@ -68,3 +69,56 @@ pcsc_connect(unsigned int readernum, DWORD dwShareMode, DWORD dwPreferredProtoco
err:
return r;
}
void
pcsc_disconnect(SCARDCONTEXT hContext, SCARDHANDLE hCard, LPSTR readers)
{
SCardDisconnect(hCard, SCARD_LEAVE_CARD);
SCardFreeMemory(hContext, readers);
SCardReleaseContext(hContext);
}
LONG
pcsc_transmit(DWORD dwActiveProtocol, SCARDHANDLE hCard,
LPCBYTE pbSendBuffer, DWORD cbSendLength,
LPBYTE pbRecvBuffer, LPDWORD pcbRecvLength)
{
LONG r;
SCARD_IO_REQUEST ioRecvPci;
switch (dwActiveProtocol) {
case SCARD_PROTOCOL_T0:
r = SCardTransmit(hCard, SCARD_PCI_T0, pbSendBuffer, cbSendLength,
&ioRecvPci, pbRecvBuffer, pcbRecvLength);
break;
case SCARD_PROTOCOL_T1:
r = SCardTransmit(hCard, SCARD_PCI_T1, pbSendBuffer, cbSendLength,
&ioRecvPci, pbRecvBuffer, pcbRecvLength);
break;
default:
fprintf(stderr, "Could not transmit with unknown protocol %u\n",
(unsigned int) dwActiveProtocol);
r = SCARD_E_PROTO_MISMATCH;
break;
}
return r;
}
void
printb(const char *label, unsigned char *buf, size_t len)
{
size_t i = 0;
printf("%s", label);
while (i < len) {
printf("%02X", buf[i]);
i++;
if (i%20)
printf(" ");
else if (i != len)
printf("\n");
}
printf("\n");
}

View File

@@ -23,8 +23,12 @@
#include "config.h"
#endif
#include <stdio.h>
#ifdef HAVE_PCSCLITE_H
#include <pcsclite.h>
#define stringify_error(r) { if (r != SCARD_S_SUCCESS) fputs(pcsc_stringify_error(r), stderr); }
#else
#define stringify_error(r) { if (r != SCARD_S_SUCCESS) fprintf(stderr, "PC/SC error code %u\n", (unsigned int) r); }
#endif
#ifdef HAVE_READER_H
@@ -38,7 +42,19 @@ extern "C" {
LONG
pcsc_connect(unsigned int readernum, DWORD dwShareMode, DWORD dwPreferredProtocol,
SCARDCONTEXT *hContext, LPSTR *readers, LPSCARDHANDLE phCard);
SCARDCONTEXT *hContext, LPSTR *readers, LPSCARDHANDLE phCard,
LPDWORD pdwActiveProtocol);
void
pcsc_disconnect(SCARDCONTEXT hContext, SCARDHANDLE hCard, LPSTR readers);
LONG
pcsc_transmit(DWORD dwActiveProtocol, SCARDHANDLE hCard,
LPCBYTE pbSendBuffer, DWORD cbSendLength,
LPBYTE pbRecvBuffer, LPDWORD pcbRecvLength);
void
printb(const char *label, unsigned char *buf, size_t len);
#ifdef __cplusplus
}