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 #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
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
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
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 }