Main Page | Data Structures | File List | Data Fields | Globals | Related Pages

testpcsc.c

Go to the documentation of this file.
00001 /*
00002  * MUSCLE SmartCard Development ( http://www.linuxnet.com )
00003  *
00004  * Copyright (C) 1999
00005  *  David Corcoran <corcoran@linuxnet.com>
00006  * Copyright (C) 2004-2006
00007  *  Ludovic Rousseau <ludovic.rousseau@free.fr>
00008  *
00009  * $Id: testpcsc.c 2320 2007-01-09 15:28:13Z rousseau $
00010  */
00011 
00017 #include "config.h"
00018 #include <stdio.h>
00019 #include <stdlib.h>
00020 #include <string.h>
00021 
00022 #include "pcsclite.h"
00023 #include "winscard.h"
00024 #include "reader.h"
00025 
00026 #define PANIC 0
00027 #define DONT_PANIC 1
00028 #define RED_PRINTF_FORMAT "\33[01;31m%s\33[0m\n"
00029 
00030 void test_rv(int rv, SCARDCONTEXT hContext, int dont_panic)
00031 {
00032     if (rv != SCARD_S_SUCCESS)
00033     {
00034         if (dont_panic)
00035             printf("\33[34m%s (don't panic)\33[0m\n", pcsc_stringify_error(rv));
00036         else
00037         {
00038             printf(RED_PRINTF_FORMAT, pcsc_stringify_error(rv));
00039             SCardReleaseContext(hContext);
00040             exit(-1);
00041         }
00042     }
00043     else
00044         puts(pcsc_stringify_error(rv));
00045 }
00046 
00047 int main(int argc, char **argv)
00048 {
00049     SCARDHANDLE hCard;
00050     SCARDCONTEXT hContext;
00051     SCARD_READERSTATE_A rgReaderStates[1];
00052     DWORD dwReaderLen, dwState, dwProt, dwAtrLen;
00053     DWORD dwPref, dwReaders;
00054     char *pcReaders, *mszReaders;
00055     unsigned char pbAtr[MAX_ATR_SIZE];
00056     char *mszGroups;
00057     DWORD dwGroups;
00058     long rv;
00059     DWORD i;
00060     int p, iReader;
00061     int iList[16];
00062     SCARD_IO_REQUEST pioRecvPci;
00063     SCARD_IO_REQUEST pioSendPci;
00064     unsigned char bSendBuffer[MAX_BUFFER_SIZE];
00065     unsigned char bRecvBuffer[MAX_BUFFER_SIZE];
00066     DWORD send_length, length;
00067 
00068     printf("\nMUSCLE PC/SC Lite unitary test Program\n\n");
00069 
00070     printf("\33[35mTHIS PROGRAM IS NOT DESIGNED AS A TESTING TOOL FOR END USERS!\n");
00071     printf("Do NOT use it unless you really know what you do.\33[0m\n\n");
00072 
00073     printf("Testing SCardEstablishContext\t: ");
00074     rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
00075     test_rv(rv, hContext, PANIC);
00076 
00077     printf("Testing SCardIsValidContext\t: ");
00078     rv = SCardIsValidContext(hContext);
00079     test_rv(rv, hContext, PANIC);
00080 
00081     printf("Testing SCardIsValidContext\t: ");
00082     rv = SCardIsValidContext(hContext+1);
00083     test_rv(rv, hContext, DONT_PANIC);
00084 
00085     printf("Testing SCardGetStatusChange \n");
00086     printf("Please insert a working reader\t: ");
00087     fflush(stdout);
00088     rv = SCardGetStatusChange(hContext, INFINITE, 0, 0);
00089     test_rv(rv, hContext, PANIC);
00090 
00091     printf("Testing SCardListReaderGroups\t: ");
00092     rv = SCardListReaderGroups(hContext, 0, &dwGroups);
00093     test_rv(rv, hContext, PANIC);
00094 
00095     mszGroups = malloc(sizeof(char) * dwGroups);
00096     rv = SCardListReaderGroups(hContext, mszGroups, &dwGroups);
00097     test_rv(rv, hContext, PANIC);
00098 
00099     /*
00100      * Have to understand the multi-string here
00101      */
00102     p = 0;
00103     for (i = 0; i < dwGroups - 1; i++)
00104     {
00105         ++p;
00106         printf("Group %02d: %s\n", p, &mszGroups[i]);
00107         iList[p] = i;
00108         while (mszGroups[++i] != 0) ;
00109     }
00110 
00111     printf("Testing SCardListReaders\t: ");
00112 
00113     mszGroups = 0;
00114     rv = SCardListReaders(hContext, mszGroups, 0, &dwReaders);
00115     test_rv(rv, hContext, PANIC);
00116 
00117     mszReaders = malloc(sizeof(char) * dwReaders);
00118     rv = SCardListReaders(hContext, mszGroups, mszReaders, &dwReaders);
00119     test_rv(rv, hContext, PANIC);
00120 
00121     /*
00122      * Have to understand the multi-string here
00123      */
00124     p = 0;
00125     for (i = 0; i < dwReaders - 1; i++)
00126     {
00127         ++p;
00128         printf("Reader %02d: %s\n", p, &mszReaders[i]);
00129         iList[p] = i;
00130         while (mszReaders[++i] != 0) ;
00131     }
00132 
00133     if (p > 1)
00134         do
00135         {
00136             char input[80];
00137 
00138             printf("Enter the reader number\t\t: ");
00139             fgets(input, sizeof(input), stdin);
00140             sscanf(input, "%d", &iReader);
00141 
00142             if (iReader > p || iReader <= 0)
00143                 printf("Invalid Value - try again\n");
00144         }
00145         while (iReader > p || iReader <= 0);
00146     else
00147         iReader = 1;
00148 
00149     rgReaderStates[0].szReader = &mszReaders[iList[iReader]];
00150     rgReaderStates[0].dwCurrentState = SCARD_STATE_EMPTY;
00151 
00152     printf("Waiting for card insertion\t: ");
00153     fflush(stdout);
00154     rv = SCardGetStatusChange(hContext, INFINITE, rgReaderStates, 1);
00155     test_rv(rv, hContext, PANIC);
00156 
00157     printf("Testing SCardConnect\t\t: ");
00158     rv = SCardConnect(hContext, &mszReaders[iList[iReader]],
00159         SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1,
00160         &hCard, &dwPref);
00161     test_rv(rv, hContext, PANIC);
00162 
00163     switch(dwPref)
00164     {
00165         case SCARD_PROTOCOL_T0:
00166             pioSendPci = *SCARD_PCI_T0;
00167             break;
00168         case SCARD_PROTOCOL_T1:
00169             pioSendPci = *SCARD_PCI_T1;
00170             break;
00171         default:
00172             printf("Unknown protocol\n");
00173             return -1;
00174     }
00175 
00176     /* APDU select file */
00177     printf("Select file: ");
00178     send_length = 7;
00179     memcpy(bSendBuffer, "\x00\xA4\x00\x00\x02\x3F\x00", send_length);
00180     for (i=0; i<send_length; i++)
00181         printf(" %02X", bSendBuffer[i]);
00182     printf("\n");
00183     length = sizeof(bRecvBuffer);
00184 
00185     printf("Testing SCardTransmit\t\t: ");
00186     rv = SCardTransmit(hCard, &pioSendPci, bSendBuffer, send_length,
00187         &pioRecvPci, bRecvBuffer, &length);
00188     printf("%s\n", pcsc_stringify_error(rv));
00189     printf(" card response:");
00190     for (i=0; i<length; i++)
00191         printf(" %02X", bRecvBuffer[i]);
00192     printf("\n");
00193 
00194     printf("Testing SCardControl\t\t: ");
00195 #ifdef PCSC_PRE_120
00196     {
00197         char buffer[1024] = "Foobar";
00198         DWORD cbRecvLength = sizeof(buffer);
00199 
00200         rv = SCardControl(hCard, buffer, 7, buffer, &cbRecvLength);
00201     }
00202 #else
00203     {
00204         char buffer[1024] = { 0x02 };
00205         DWORD cbRecvLength = sizeof(buffer);
00206 
00207         rv = SCardControl(hCard, SCARD_CTL_CODE(1), buffer, 1, buffer,
00208             sizeof(buffer), &cbRecvLength);
00209         if (cbRecvLength)
00210         {
00211             for (i=0; i<cbRecvLength; i++)
00212                 printf("%c", buffer[i]);
00213             printf(" ");
00214         }
00215     }
00216 #endif
00217     test_rv(rv, hContext, DONT_PANIC);
00218 
00219     printf("Testing SCardGetAttrib\t\t: ");
00220     rv = SCardGetAttrib(hCard, SCARD_ATTR_ATR_STRING, NULL, &dwAtrLen);
00221     test_rv(rv, hContext, DONT_PANIC);
00222     if (rv == SCARD_S_SUCCESS)
00223         printf("ATR length: %ld\n", dwAtrLen);
00224 
00225     printf("Testing SCardGetAttrib\t\t: ");
00226     dwAtrLen = sizeof(pbAtr);
00227     rv = SCardGetAttrib(hCard, SCARD_ATTR_ATR_STRING, pbAtr, &dwAtrLen);
00228     test_rv(rv, hContext, DONT_PANIC);
00229     if (rv == SCARD_S_SUCCESS)
00230     {
00231         for (i = 0; i < dwAtrLen; i++)
00232             printf("%02X ", pbAtr[i]);
00233         printf("\n");
00234     }
00235 
00236     printf("Testing SCardGetAttrib\t\t: ");
00237     dwAtrLen = sizeof(pbAtr);
00238     rv = SCardGetAttrib(hCard, SCARD_ATTR_VENDOR_IFD_VERSION, pbAtr, &dwAtrLen);
00239     test_rv(rv, hContext, DONT_PANIC);
00240     if (rv == SCARD_S_SUCCESS)
00241         printf("Vendor IFD version\t\t: 0x%08lX\n", ((DWORD *)pbAtr)[0]);
00242 
00243     printf("Testing SCardGetAttrib\t\t: ");
00244     dwAtrLen = sizeof(pbAtr);
00245     rv = SCardGetAttrib(hCard, SCARD_ATTR_MAXINPUT, pbAtr, &dwAtrLen);
00246     test_rv(rv, hContext, DONT_PANIC);
00247     if (rv == SCARD_S_SUCCESS)
00248     {
00249         if (dwAtrLen == sizeof(uint32_t))
00250             printf("Max message length\t\t: %d\n", *(uint32_t *)pbAtr);
00251         else
00252             printf(RED_PRINTF_FORMAT, "Wrong size");
00253     }
00254 
00255     printf("Testing SCardGetAttrib\t\t: ");
00256     dwAtrLen = sizeof(pbAtr);
00257     rv = SCardGetAttrib(hCard, SCARD_ATTR_VENDOR_NAME, pbAtr, &dwAtrLen);
00258     test_rv(rv, hContext, DONT_PANIC);
00259     if (rv == SCARD_S_SUCCESS)
00260         printf("Vendor name\t\t\t: %s\n", pbAtr);
00261 
00262     printf("Testing SCardSetAttrib\t\t: ");
00263     rv = SCardSetAttrib(hCard, SCARD_ATTR_ATR_STRING, (LPCBYTE)"", 1);
00264     test_rv(rv, hContext, DONT_PANIC);
00265 
00266     printf("Testing SCardStatus\t\t: ");
00267 
00268     dwReaderLen = 50;
00269     pcReaders   = malloc(sizeof(char) * 50);
00270     dwAtrLen    = MAX_ATR_SIZE;
00271 
00272     rv = SCardStatus(hCard, pcReaders, &dwReaderLen, &dwState, &dwProt,
00273         pbAtr, &dwAtrLen);
00274     test_rv(rv, hContext, PANIC);
00275 
00276     printf("Current Reader Name\t\t: %s\n", pcReaders);
00277     printf("Current Reader State\t\t: 0x%.4lx\n", dwState);
00278     printf("Current Reader Protocol\t\t: T=%ld\n", dwProt - 1);
00279     printf("Current Reader ATR Size\t\t: %ld bytes\n", dwAtrLen);
00280     printf("Current Reader ATR Value\t: ");
00281 
00282     for (i = 0; i < dwAtrLen; i++)
00283     {
00284         printf("%02X ", pbAtr[i]);
00285     }
00286     printf("\n");
00287 
00288     if (rv != SCARD_S_SUCCESS)
00289     {
00290         SCardDisconnect(hCard, SCARD_RESET_CARD);
00291         SCardReleaseContext(hContext);
00292     }
00293 
00294     printf("Press enter: ");
00295     getchar();
00296     printf("Testing SCardReconnect\t\t: ");
00297     rv = SCardReconnect(hCard, SCARD_SHARE_SHARED,
00298         SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, SCARD_UNPOWER_CARD, &dwPref);
00299     test_rv(rv, hContext, PANIC);
00300 
00301     printf("Testing SCardDisconnect\t\t: ");
00302     rv = SCardDisconnect(hCard, SCARD_UNPOWER_CARD);
00303     test_rv(rv, hContext, PANIC);
00304 
00305     printf("Testing SCardReleaseContext\t: ");
00306     rv = SCardReleaseContext(hContext);
00307     test_rv(rv, hContext, PANIC);
00308 
00309     printf("\n");
00310     printf("PC/SC Test Completed Successfully !\n");
00311 
00312     return 0;
00313 }

Generated on Fri Jan 26 22:54:53 2007 for pcsc-lite by  doxygen 1.3.9.1