-
-
Save jacopo-j/91dd3a0bacb597fcfe5962724f66e67a to your computer and use it in GitHub Desktop.
pyscard bug tests
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#ifdef WIN32 | |
#undef UNICODE | |
#endif | |
#include <stdio.h> | |
#include <stdlib.h> | |
#ifdef __APPLE__ | |
#include <PCSC/winscard.h> | |
#include <PCSC/wintypes.h> | |
#else | |
#include <winscard.h> | |
#endif | |
#ifdef WIN32 | |
static char *pcsc_stringify_error(LONG rv) | |
{ | |
static char out[20]; | |
sprintf_s(out, sizeof(out), "0x%08X", rv); | |
return out; | |
} | |
#endif | |
#define CHECK(f, rv) \ | |
if (SCARD_S_SUCCESS != rv) \ | |
{ \ | |
printf(f ": %s\n", pcsc_stringify_error(rv)); \ | |
return -1; \ | |
} | |
int main(void) | |
{ | |
LONG rv; | |
SCARDCONTEXT hContext; | |
LPTSTR mszReaders; | |
SCARDHANDLE hCard; | |
DWORD dwReaders, dwActiveProtocol, dwRecvLength; | |
SCARD_IO_REQUEST pioSendPci; | |
BYTE pbRecvBuffer[258]; | |
BYTE cmd1[] = { 0x00, 0xA4, 0x04, 0x00, 0x0E, 0x32, 0x50, 0x41, 0x59, 0x2E, | |
0x53, 0x59, 0x53, 0x2E, 0x44, 0x44, 0x46, 0x30, 0x31, 0x00 }; | |
unsigned int i; | |
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; | |
} | |
dwRecvLength = sizeof(pbRecvBuffer); | |
rv = SCardTransmit(hCard, &pioSendPci, cmd1, sizeof(cmd1), | |
NULL, pbRecvBuffer, &dwRecvLength); | |
CHECK("SCardTransmit", rv) | |
printf("response: "); | |
for(i=0; i<dwRecvLength; i++) | |
printf("%02X ", pbRecvBuffer[i]); | |
printf("\n"); | |
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; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /usr/bin/env python | |
from smartcard.scard import * | |
import smartcard.util | |
SELECT = [0x00, 0xA4, 0x04, 0x00, 0x0E, 0x32, 0x50, 0x41, 0x59, 0x2E, 0x53, 0x59, 0x53, 0x2E, 0x44, 0x44, 0x46, 0x30, 0x31, 0x00] | |
try: | |
hresult, hcontext = SCardEstablishContext(SCARD_SCOPE_USER) | |
if hresult != SCARD_S_SUCCESS: | |
raise Exception('Failed to establish context : ' + | |
SCardGetErrorMessage(hresult)) | |
print('Context established!') | |
try: | |
hresult, readers = SCardListReaders(hcontext, []) | |
if hresult != SCARD_S_SUCCESS: | |
raise Exception('Failed to list readers: ' + | |
SCardGetErrorMessage(hresult)) | |
print('PCSC Readers:', readers) | |
if len(readers) < 1: | |
raise Exception('No smart card readers') | |
reader = readers[1] | |
print("Using reader:", reader) | |
try: | |
hresult, hcard, dwActiveProtocol = SCardConnect(hcontext, reader, | |
SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1) | |
if hresult != SCARD_S_SUCCESS: | |
raise Exception('Unable to connect: ' + | |
SCardGetErrorMessage(hresult)) | |
print('Connected with active protocol', dwActiveProtocol) | |
try: | |
hresult, response = SCardTransmit(hcard, dwActiveProtocol, | |
SELECT) | |
if hresult != SCARD_S_SUCCESS: | |
raise Exception('Failed to transmit: ' + | |
SCardGetErrorMessage(hresult)) | |
print('Select: ' + smartcard.util.toHexString(response, | |
smartcard.util.HEX)) | |
finally: | |
hresult = SCardDisconnect(hcard, SCARD_UNPOWER_CARD) | |
if hresult != SCARD_S_SUCCESS: | |
raise Exception('Failed to disconnect: ' + | |
SCardGetErrorMessage(hresult)) | |
print('Disconnected') | |
except Exception as message: | |
print("Exception:", message) | |
finally: | |
hresult = SCardReleaseContext(hcontext) | |
if hresult != SCARD_S_SUCCESS: | |
raise Exception('Failed to release context: ' + | |
SCardGetErrorMessage(hresult)) | |
print('Released context.') | |
except Exception as message: | |
print("Exception:", message) | |
import sys | |
if 'win32' == sys.platform: | |
print('press Enter to continue') | |
sys.stdin.read(1) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment