|
Packit Service |
fa4841 |
// compile against PCSC gcc -o scardtest TestSmartCardStatus.c -DPCSC=1 -I /usr/include/PCSC
|
|
Packit Service |
fa4841 |
// -lpcsclite
|
|
Packit Service |
fa4841 |
#include <stdio.h>
|
|
Packit Service |
fa4841 |
#include <stdlib.h>
|
|
Packit Service |
fa4841 |
#include <string.h>
|
|
Packit Service |
fa4841 |
#if defined(__APPLE__) || defined(PCSC)
|
|
Packit Service |
fa4841 |
#include <PCSC/winscard.h>
|
|
Packit Service |
fa4841 |
#include <PCSC/wintypes.h>
|
|
Packit Service |
fa4841 |
#elif defined(__linux__)
|
|
Packit Service |
fa4841 |
#include <winpr/crt.h>
|
|
Packit Service |
fa4841 |
#include <winpr/smartcard.h>
|
|
Packit Service |
fa4841 |
#include <winpr/synch.h>
|
|
Packit Service |
fa4841 |
#else
|
|
Packit Service |
fa4841 |
#include <winscard.h>
|
|
Packit Service |
fa4841 |
#endif
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
#if defined(PCSC)
|
|
Packit Service |
fa4841 |
int main(int argc, char* argv[])
|
|
Packit Service |
fa4841 |
#else
|
|
Packit Service |
fa4841 |
int TestSmartCardStatus(int argc, char* argv[])
|
|
Packit Service |
fa4841 |
#endif
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
SCARDCONTEXT hContext;
|
|
Packit Service |
fa4841 |
LPSTR mszReaders;
|
|
Packit Service |
fa4841 |
DWORD cchReaders = 0;
|
|
Packit Service |
fa4841 |
DWORD err;
|
|
Packit Service |
fa4841 |
SCARDHANDLE hCard;
|
|
Packit Service |
fa4841 |
DWORD dwActiveProtocol;
|
|
Packit Service |
fa4841 |
char name[100];
|
|
Packit Service |
fa4841 |
char* aname = NULL;
|
|
Packit Service |
fa4841 |
char* aatr = NULL;
|
|
Packit Service |
fa4841 |
DWORD len;
|
|
Packit Service |
fa4841 |
BYTE atr[32];
|
|
Packit Service |
fa4841 |
DWORD atrlen = 32;
|
|
Packit Service |
fa4841 |
DWORD status = 0;
|
|
Packit Service |
fa4841 |
DWORD protocol = 0;
|
|
Packit Service |
fa4841 |
err = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (err != SCARD_S_SUCCESS)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
printf("ScardEstablishedContext: 0x%08x\n", err);
|
|
Packit Service |
fa4841 |
return -1;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
err = SCardListReaders(hContext, "SCard$AllReaders", NULL, &cchReaders);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (err != 0)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
printf("ScardListReaders: 0x%08x\n", err);
|
|
Packit Service |
fa4841 |
return -1;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
mszReaders = calloc(cchReaders, sizeof(char));
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!mszReaders)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
printf("calloc\n");
|
|
Packit Service |
fa4841 |
return -1;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
err = SCardListReaders(hContext, "SCard$AllReaders", mszReaders, &cchReaders);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (err != SCARD_S_SUCCESS)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
printf("ScardListReaders: 0x%08x\n", err);
|
|
Packit Service |
fa4841 |
return -1;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
printf("Reader: %s\n", mszReaders);
|
|
Packit Service |
fa4841 |
err = SCardConnect(hContext, mszReaders, SCARD_SHARE_SHARED,
|
|
Packit Service |
fa4841 |
SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, &hCard, &dwActiveProtocol);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (err != SCARD_S_SUCCESS)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
printf("ScardConnect: 0x%08x\n", err);
|
|
Packit Service |
fa4841 |
return -1;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
free(mszReaders);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
printf("# test 1 - get reader length\n");
|
|
Packit Service |
fa4841 |
err = SCardStatus(hCard, NULL, &len, NULL, NULL, NULL, NULL);
|
|
Packit Service |
fa4841 |
if (err != SCARD_S_SUCCESS)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
printf("SCardStatus: 0x%08x\n", err);
|
|
Packit Service |
fa4841 |
return -1;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
printf("reader name length: %u\n", len);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
printf("# test 2 - get reader name value\n");
|
|
Packit Service |
fa4841 |
err = SCardStatus(hCard, name, &len, NULL, NULL, NULL, NULL);
|
|
Packit Service |
fa4841 |
if (err != SCARD_S_SUCCESS)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
printf("SCardStatus: 0x%08x\n", err);
|
|
Packit Service |
fa4841 |
return -1;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
printf("Reader name: %s (%ld)\n", name, strlen(name));
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
printf("# test 3 - get all values - pre allocated\n");
|
|
Packit Service |
fa4841 |
err = SCardStatus(hCard, name, &len, &status, &protocol, atr, &atrlen);
|
|
Packit Service |
fa4841 |
if (err != SCARD_S_SUCCESS)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
printf("SCardStatus: 0x%08x\n", err);
|
|
Packit Service |
fa4841 |
return -1;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
printf("Reader name: %s (%ld/len %u)\n", name, strlen(name), len);
|
|
Packit Service |
fa4841 |
printf("status: 0x%08X\n", status);
|
|
Packit Service |
fa4841 |
printf("proto: 0x%08X\n", protocol);
|
|
Packit Service |
fa4841 |
printf("atrlen: %u\n", atrlen);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
printf("# test 4 - get all values - auto allocate\n");
|
|
Packit Service |
fa4841 |
len = atrlen = SCARD_AUTOALLOCATE;
|
|
Packit Service |
fa4841 |
err = SCardStatus(hCard, (LPSTR)&aname, &len, &status, &protocol, (LPBYTE)&aatr, &atrlen);
|
|
Packit Service |
fa4841 |
if (err != SCARD_S_SUCCESS)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
printf("SCardStatus: 0x%08x\n", err);
|
|
Packit Service |
fa4841 |
return -1;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
printf("Reader name: %s (%ld/%u)\n", aname, strlen(aname), len);
|
|
Packit Service |
fa4841 |
printf("status: 0x%08X\n", status);
|
|
Packit Service |
fa4841 |
printf("proto: 0x%08X\n", protocol);
|
|
Packit Service |
fa4841 |
printf("atrlen: %u\n", atrlen);
|
|
Packit Service |
fa4841 |
SCardFreeMemory(hContext, aname);
|
|
Packit Service |
fa4841 |
SCardFreeMemory(hContext, aatr);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
printf("# test 5 - get status and protocol only\n");
|
|
Packit Service |
fa4841 |
err = SCardStatus(hCard, NULL, NULL, &status, &protocol, NULL, NULL);
|
|
Packit Service |
fa4841 |
if (err != SCARD_S_SUCCESS)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
printf("SCardStatus: 0x%08x\n", err);
|
|
Packit Service |
fa4841 |
return -1;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
printf("status: 0x%08X\n", status);
|
|
Packit Service |
fa4841 |
printf("proto: 0x%08X\n", protocol);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
printf("# test 6 - get atr only auto allocated\n");
|
|
Packit Service |
fa4841 |
atrlen = SCARD_AUTOALLOCATE;
|
|
Packit Service |
fa4841 |
err = SCardStatus(hCard, NULL, NULL, NULL, NULL, (LPBYTE)&aatr, &atrlen);
|
|
Packit Service |
fa4841 |
if (err != SCARD_S_SUCCESS)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
printf("SCardStatus: 0x%08x\n", err);
|
|
Packit Service |
fa4841 |
return -1;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
printf("atrlen: %u\n", atrlen);
|
|
Packit Service |
fa4841 |
SCardFreeMemory(hContext, aatr);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
printf("# test 7 - get atr only pre allocated\n");
|
|
Packit Service |
fa4841 |
atrlen = 32;
|
|
Packit Service |
fa4841 |
err = SCardStatus(hCard, NULL, NULL, NULL, NULL, atr, &atrlen);
|
|
Packit Service |
fa4841 |
if (err != SCARD_S_SUCCESS)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
printf("SCardStatus: 0x%08x\n", err);
|
|
Packit Service |
fa4841 |
return -1;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
printf("atrlen: %u\n", atrlen);
|
|
Packit Service |
fa4841 |
SCardDisconnect(hCard, SCARD_LEAVE_CARD);
|
|
Packit Service |
fa4841 |
SCardReleaseContext(hContext);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
return 0;
|
|
Packit Service |
fa4841 |
}
|