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

Generated on Fri Sep 15 14:58:51 2006 for pcsc-lite by  doxygen 1.4.7