- 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:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user