00001
00002
00003
00004
00005
00006
00007
00008
00009
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
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
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
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 }