cnsparser/lib/read_dati_personali_c.cpp

98 lines
2.7 KiB
C++

#include "CNS.h"
/*
``
pcsc_stringify_error()
The returned string uses a Thread-Local Storage (TLS) buffer and is valid: [...]
only while the thread on which it was obtained is alive.
''
*/
#define CHECK(what, rv) \
if (rv != SCARD_S_SUCCESS) { \
char message[256]; \
sprintf(message, what ": %s\n", pcsc_stringify_error(rv)); \
throw ExPCSC(message); \
}
int read_dati_personali_c(char** output_buffer, int* len) {
LONG rv;
SCARDCONTEXT hContext;
LPTSTR mszReaders;
SCARDHANDLE hCard;
DWORD dwReaders, dwActiveProtocol, dwRecvLength;
SCARD_IO_REQUEST pioSendPci;
BYTE pbRecvBuffer[1024];
BYTE cmd[4][7];
memcpy(cmd[0], "\x00\xA4\x00\x00\x02\03f\x00", 7);
memcpy(cmd[1], "\x00\xA4\x00\x00\x02\x11\x00", 7);
memcpy(cmd[2], "\x00\xA4\x00\x00\x02\x11\x02", 7);
memcpy(cmd[3], "\x00\xB0\x00\x00\x00\x00", 6);
rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
CHECK("SCardEstablishContext", rv)
#ifdef SCARD_AUTOALLOCATE
dwReaders = SCARD_AUTOALLOCATE;
rv = SCardListReaders(hContext, NULL, (LPTSTR)&mszReaders, &dwReaders);
CHECK("SCardListReaders", rv)
#else
rv = SCardListReaders(hContext, NULL, NULL, &dwReaders);
CHECK("SCardListReaders", rv)
mszReaders = calloc(dwReaders, sizeof(char));
rv = SCardListReaders(hContext, NULL, mszReaders, &dwReaders);
CHECK("SCardListReaders", rv)
#endif
/* printf("reader name: %s\n", mszReaders); */
rv = SCardConnect(hContext, mszReaders, SCARD_SHARE_SHARED,
SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, &hCard, &dwActiveProtocol);
CHECK("SCardConnect", rv)
switch(dwActiveProtocol) {
case SCARD_PROTOCOL_T0:
pioSendPci = *SCARD_PCI_T0;
break;
case SCARD_PROTOCOL_T1:
pioSendPci = *SCARD_PCI_T1;
break;
}
for (int j = 0; j < 4; ++j) {
dwRecvLength = sizeof(pbRecvBuffer);
/* TODO: hardcoded packet length*/
rv = SCardTransmit(hCard, &pioSendPci, cmd[j], ((j == 3) ? 6 : 7), NULL, pbRecvBuffer, &dwRecvLength);
CHECK("SCardTransmit", rv)
/*
printf("response %d\tlen %d\t", j, dwRecvLength);
printf("%.*s", dwRecvLength, pbRecvBuffer);
printf("\n");
*/
}
/* send back last buffer read */
*output_buffer = (char*)malloc(dwRecvLength);
memcpy(*output_buffer, pbRecvBuffer, dwRecvLength);
*len = dwRecvLength;
rv = SCardDisconnect(hCard, SCARD_LEAVE_CARD);
CHECK("SCardDisconnect", rv)
#ifdef SCARD_AUTOALLOCATE
rv = SCardFreeMemory(hContext, mszReaders);
CHECK("SCardFreeMemory", rv)
#else
free(mszReaders);
#endif
rv = SCardReleaseContext(hContext);
CHECK("SCardReleaseContext", rv)
return 0;
}