29 #define USE_AUTOALLOCATE
31 #define BLUE "\33[34m"
33 #define BRIGHT_RED "\33[01;31m"
34 #define GREEN "\33[32m"
35 #define NORMAL "\33[0m"
36 #define MAGENTA "\33[35m"
38 static void test_rv(LONG rv,
SCARDCONTEXT hContext,
int dont_panic)
55 int main(
int argc,
char **argv)
60 DWORD dwReaderLen, dwState, dwProt, dwAtrLen;
61 DWORD dwPref, dwReaders = 0;
62 char *pcReaders = NULL, *mszReaders;
63 #ifdef USE_AUTOALLOCATE
64 unsigned char *pbAtr = NULL;
69 unsigned char as_char[100];
74 unsigned char *pbAttr = NULL;
86 DWORD send_length, length;
91 printf(
"\nMUSCLE PC/SC Lite unitary test Program\n\n");
93 printf(MAGENTA
"THIS PROGRAM IS NOT DESIGNED AS A TESTING TOOL FOR END USERS!\n");
94 printf(
"Do NOT use it unless you really know what you do.\n\n" NORMAL);
96 printf(
"Testing SCardEstablishContext\t: ");
98 test_rv(rv, hContext, PANIC);
100 printf(
"Testing SCardIsValidContext\t: ");
102 test_rv(rv, hContext, PANIC);
104 printf(
"Testing SCardIsValidContext\t: ");
106 test_rv(rv, hContext, DONT_PANIC);
108 printf(
"Testing SCardListReaderGroups\t: ");
109 #ifdef USE_AUTOALLOCATE
114 test_rv(rv, hContext, PANIC);
116 printf(
"Testing SCardListReaderGroups\t: ");
117 mszGroups = calloc(dwGroups,
sizeof(
char));
120 test_rv(rv, hContext, PANIC);
126 for (i = 0; i+1 < dwGroups; i++)
129 printf(GREEN
"Group %02d: %s\n" NORMAL, p, &mszGroups[i]);
130 while (mszGroups[++i] != 0) ;
133 #ifdef USE_AUTOALLOCATE
134 printf(
"Testing SCardFreeMemory\t\t: ");
136 test_rv(rv, hContext, PANIC);
143 printf(
"Testing SCardListReaders\t: ");
145 test_rv(rv, hContext, DONT_PANIC);
148 printf(
"Testing SCardGetStatusChange \n");
149 printf(
"Please insert a working reader\t: ");
150 (void)fflush(stdout);
151 rgReaderStates[0].szReader =
"\\\\?PnP?\\Notification";
155 test_rv(rv, hContext, PANIC);
158 printf(
"Testing SCardListReaders\t: ");
159 #ifdef USE_AUTOALLOCATE
164 test_rv(rv, hContext, PANIC);
166 printf(
"Testing SCardListReaders\t: ");
167 mszReaders = calloc(dwReaders,
sizeof(
char));
170 test_rv(rv, hContext, DONT_PANIC);
176 for (i = 0; i+1 < dwReaders; i++)
179 printf(GREEN
"Reader %02d: %s\n" NORMAL, p, &mszReaders[i]);
181 while (mszReaders[++i] != 0) ;
189 printf(
"Enter the reader number\t\t: ");
190 (void)fgets(input,
sizeof(input), stdin);
191 iReader = atoi(input);
193 if (iReader > p || iReader <= 0)
194 printf(
"Invalid Value - try again\n");
196 while (iReader > p || iReader <= 0);
200 rgReaderStates[0].szReader = &mszReaders[iList[iReader]];
203 printf(
"Waiting for card insertion\t: ");
204 (void)fflush(stdout);
206 test_rv(rv, hContext, PANIC);
209 printf(
"\nA reader has been connected/disconnected\n");
210 goto wait_for_card_again;
213 printf(
"Testing SCardConnect\t\t: ");
214 rv =
SCardConnect(hContext, &mszReaders[iList[iReader]],
217 test_rv(rv, hContext, PANIC);
231 printf(
"Unknown protocol\n");
236 printf(
"Select file:");
238 memcpy(bSendBuffer,
"\x00\xA4\x00\x00\x02\x3F\x00", send_length);
239 for (i=0; i<send_length; i++)
240 printf(
" %02X", bSendBuffer[i]);
242 length =
sizeof(bRecvBuffer);
244 printf(
"Testing SCardTransmit\t\t: ");
245 rv =
SCardTransmit(hCard, pioSendPci, bSendBuffer, send_length,
246 &ioRecvPci, bRecvBuffer, &length);
247 test_rv(rv, hContext, PANIC);
248 printf(
" card response:" GREEN);
249 for (i=0; i<length; i++)
250 printf(
" %02X", bRecvBuffer[i]);
253 printf(
"Testing SCardControl\t\t: ");
256 char buffer[1024] =
"Foobar";
257 DWORD cbRecvLength =
sizeof(buffer);
259 rv =
SCardControl(hCard, buffer, 7, buffer, &cbRecvLength);
263 char buffer[1024] = { 0x02 };
264 DWORD cbRecvLength =
sizeof(buffer);
267 sizeof(buffer), &cbRecvLength);
270 for (i=0; i<cbRecvLength; i++)
271 printf(
"%c", buffer[i]);
276 test_rv(rv, hContext, DONT_PANIC);
278 printf(
"Testing SCardGetAttrib\t\t: ");
279 #ifdef USE_AUTOALLOCATE
285 test_rv(rv, hContext, DONT_PANIC);
288 printf(
"SCARD_ATTR_DEVICE_FRIENDLY_NAME length: " GREEN
"%ld\n" NORMAL, pcbAttrLen);
289 pbAttr = malloc(pcbAttrLen);
292 printf(
"Testing SCardGetAttrib\t\t: ");
295 test_rv(rv, hContext, DONT_PANIC);
297 printf(
"SCARD_ATTR_DEVICE_FRIENDLY_NAME: " GREEN
"%s\n" NORMAL, pbAttr);
299 #ifdef USE_AUTOALLOCATE
300 printf(
"Testing SCardFreeMemory\t\t: ");
302 test_rv(rv, hContext, PANIC);
308 printf(
"Testing SCardGetAttrib\t\t: ");
309 #ifdef USE_AUTOALLOCATE
315 test_rv(rv, hContext, DONT_PANIC);
318 printf(
"SCARD_ATTR_ATR_STRING length: " GREEN
"%ld\n" NORMAL, pcbAttrLen);
319 pbAttr = malloc(pcbAttrLen);
322 printf(
"Testing SCardGetAttrib\t\t: ");
325 test_rv(rv, hContext, DONT_PANIC);
328 printf(
"SCARD_ATTR_ATR_STRING length: " GREEN
"%ld\n" NORMAL, pcbAttrLen);
329 printf(
"SCARD_ATTR_ATR_STRING: " GREEN);
330 for (i = 0; i < pcbAttrLen; i++)
331 printf(
"%02X ", pbAttr[i]);
335 #ifdef USE_AUTOALLOCATE
336 printf(
"Testing SCardFreeMemory\t\t: ");
338 test_rv(rv, hContext, PANIC);
344 printf(
"Testing SCardGetAttrib\t\t: ");
345 dwBufLen =
sizeof(buf);
347 test_rv(rv, hContext, DONT_PANIC);
349 printf(
"Vendor IFD version\t\t: " GREEN
"0x%08lX\n" NORMAL,
352 printf(
"Testing SCardGetAttrib\t\t: ");
353 dwBufLen =
sizeof(buf);
355 test_rv(rv, hContext, DONT_PANIC);
358 if (dwBufLen ==
sizeof(uint32_t))
359 printf(
"Max message length\t\t: " GREEN
"%d\n" NORMAL,
362 printf(RED
"Wrong size" NORMAL);
365 printf(
"Testing SCardGetAttrib\t\t: ");
366 dwBufLen =
sizeof(buf);
368 test_rv(rv, hContext, DONT_PANIC);
370 printf(
"Vendor name\t\t\t: " GREEN
"%s\n" NORMAL, buf.as_char);
372 printf(
"Testing SCardSetAttrib\t\t: ");
374 test_rv(rv, hContext, DONT_PANIC);
376 printf(
"Testing SCardStatus\t\t: ");
378 #ifdef USE_AUTOALLOCATE
381 rv =
SCardStatus(hCard, (LPSTR)&pcReaders, &dwReaderLen, &dwState, &dwProt,
382 (LPBYTE)&pbAtr, &dwAtrLen);
385 pcReaders = malloc(
sizeof(
char) * 100);
388 rv =
SCardStatus(hCard, pcReaders, &dwReaderLen, &dwState, &dwProt,
391 test_rv(rv, hContext, PANIC);
393 printf(
"Current Reader Name\t\t: " GREEN
"%s\n" NORMAL, pcReaders);
394 printf(
"Current Reader State\t\t: " GREEN
"0x%.4lx\n" NORMAL, dwState);
395 printf(
"Current Reader Protocol\t\t: T=" GREEN
"%ld\n" NORMAL, dwProt - 1);
396 printf(
"Current Reader ATR Size\t\t: " GREEN
"%ld" NORMAL
" bytes\n",
398 printf(
"Current Reader ATR Value\t: " GREEN);
400 for (i = 0; i < dwAtrLen; i++)
402 printf(
"%02X ", pbAtr[i]);
406 #ifdef USE_AUTOALLOCATE
407 printf(
"Testing SCardFreeMemory\t\t: ");
409 test_rv(rv, hContext, PANIC);
410 printf(
"Testing SCardFreeMemory\t\t: ");
412 test_rv(rv, hContext, PANIC);
424 printf(
"Press enter: ");
426 printf(
"Testing SCardReconnect\t\t: ");
429 test_rv(rv, hContext, PANIC);
431 printf(
"Testing SCardDisconnect\t\t: ");
433 test_rv(rv, hContext, PANIC);
435 #ifdef USE_AUTOALLOCATE
436 printf(
"Testing SCardFreeMemory\t\t: ");
438 test_rv(rv, hContext, PANIC);
443 printf(
"Testing SCardReleaseContext\t: ");
445 test_rv(rv, hContext, PANIC);
448 printf(
"PC/SC Test Completed Successfully !\n");
#define SCARD_ATTR_ATR_STRING
Answer to reset (ATR) string.
#define SCARD_ATTR_DEVICE_FRIENDLY_NAME
Reader's display name.
#define SCARD_ATTR_VENDOR_IFD_VERSION
Vendor-supplied interface device version (DWORD in the form 0xMMmmbbbb where MM = major version...
PCSC_API LONG SCardListReaders(SCARDCONTEXT hContext, LPCSTR mszGroups, LPSTR mszReaders, LPDWORD pcchReaders)
Returns a list of currently available readers on the system.
#define MAX_BUFFER_SIZE
Maximum Tx/Rx Buffer for short APDU.
PCSC_API LONG SCardListReaderGroups(SCARDCONTEXT hContext, LPSTR mszGroups, LPDWORD pcchGroups)
Returns a list of currently available reader groups on the system.
#define SCARD_STATE_EMPTY
Card removed.
This keeps a list of defines shared between the driver and the application.
PCSC_API char * pcsc_stringify_error(const LONG pcscError)
Returns a human readable text for the given PC/SC error code.
PCSC_API LONG SCardEstablishContext(DWORD dwScope, LPCVOID pvReserved1, LPCVOID pvReserved2, LPSCARDCONTEXT phContext)
Creates an Application Context to the PC/SC Resource Manager.
#define SCARD_E_NO_READERS_AVAILABLE
Cannot find a smart card reader.
#define SCARD_PROTOCOL_T1
T=1 active protocol.
PCSC_API LONG SCardFreeMemory(SCARDCONTEXT hContext, LPCVOID pvMem)
Releases memory that has been returned from the resource manager using the SCARD_AUTOALLOCATE length ...
LONG SCardGetStatusChange(SCARDCONTEXT hContext, DWORD dwTimeout, SCARD_READERSTATE *rgReaderStates, DWORD cReaders)
Blocks execution until the current availability of the cards in a specific set of readers changes...
PCSC_API LONG SCardGetAttrib(SCARDHANDLE hCard, DWORD dwAttrId, LPBYTE pbAttr, LPDWORD pcbAttrLen)
Get an attribute from the IFD Handler (reader driver).
#define SCARD_PCI_T0
protocol control information (PCI) for T=0
PCSC_API LONG SCardDisconnect(SCARDHANDLE hCard, DWORD dwDisposition)
Terminates a connection made through SCardConnect().
#define SCARD_PCI_RAW
protocol control information (PCI) for RAW protocol
PCSC_API LONG SCardIsValidContext(SCARDCONTEXT hContext)
Check if a SCARDCONTEXT is valid.
#define INFINITE
Infinite timeout.
#define SCARD_STATE_UNKNOWN
Reader unknown.
#define SCARD_AUTOALLOCATE
see SCardFreeMemory()
LONG SCARDCONTEXT
hContext returned by SCardEstablishContext()
#define SCARD_SHARE_SHARED
Shared mode only.
#define SCARD_PROTOCOL_T0
T=0 active protocol.
#define SCARD_ATTR_MAXINPUT
FIXME.
PCSC_API LONG SCardReconnect(SCARDHANDLE hCard, DWORD dwShareMode, DWORD dwPreferredProtocols, DWORD dwInitialization, LPDWORD pdwActiveProtocol)
Reestablishes a connection to a reader that was previously connected to using SCardConnect().
#define SCARD_PCI_T1
protocol control information (PCI) for T=1
#define SCARD_UNPOWER_CARD
Power down on close.
This keeps a list of defines for pcsc-lite.
PCSC_API LONG SCardConnect(SCARDCONTEXT hContext, LPCSTR szReader, DWORD dwShareMode, DWORD dwPreferredProtocols, LPSCARDHANDLE phCard, LPDWORD pdwActiveProtocol)
Establishes a connection to the reader specified in * szReader.
PCSC_API LONG SCardStatus(SCARDHANDLE hCard, LPSTR mszReaderName, LPDWORD pcchReaderLen, LPDWORD pdwState, LPDWORD pdwProtocol, LPBYTE pbAtr, LPDWORD pcbAtrLen)
Returns the current status of the reader connected to by hCard.
PCSC_API LONG SCardSetAttrib(SCARDHANDLE hCard, DWORD dwAttrId, LPCBYTE pbAttr, DWORD cbAttrLen)
Set an attribute of the IFD Handler.
#define SCARD_RESET_CARD
Reset on close.
LONG SCARDHANDLE
hCard returned by SCardConnect()
#define SCARD_PROTOCOL_RAW
Raw active protocol.
#define SCARD_CTL_CODE(code)
Provide source compatibility on different platforms.
Protocol Control Information (PCI)
PCSC_API LONG SCardControl(SCARDHANDLE hCard, DWORD dwControlCode, LPCVOID pbSendBuffer, DWORD cbSendLength, LPVOID pbRecvBuffer, DWORD cbRecvLength, LPDWORD lpBytesReturned)
Sends a command directly to the IFD Handler (reader driver) to be processed by the reader...
#define SCARD_ATTR_VENDOR_NAME
Vendor name.
#define MAX_ATR_SIZE
Maximum ATR size.
PCSC_API LONG SCardTransmit(SCARDHANDLE hCard, const SCARD_IO_REQUEST *pioSendPci, LPCBYTE pbSendBuffer, DWORD cbSendLength, SCARD_IO_REQUEST *pioRecvPci, LPBYTE pbRecvBuffer, LPDWORD pcbRecvLength)
Sends an APDU to the smart card contained in the reader connected to by SCardConnect().
#define SCARD_S_SUCCESS
error codes from http://msdn.microsoft.com/en-us/library/aa924526.aspx
#define SCARD_SCOPE_SYSTEM
Scope in system.
This handles smart card reader communications.
PCSC_API LONG SCardReleaseContext(SCARDCONTEXT hContext)
Destroys a communication context to the PC/SC Resource Manager.