'Ubuntu does not recognize my smart card reader
I am using Ubuntu 18 and trying to write code to use a smart card.
I am using ACS APG8201-b2 smart card reader, and I have installed the official driver (PC/SC Driver Package 3.04 MB, Version 1.1.8, 10-Jan-2020), and libpcsclite-dev.
As a starting point, I am trying to run Ludovic Rousseau's sample C code here.
I can compile my code ApduTool.c as:
#ifdef WIN32
#undef UNICODE
#endif
#include <stdio.h>
#include <stdlib.h>
#include <winscard.h>
#ifdef WIN32
static char *pcsc_stringify_error(LONG rv)
{
static char out[20];
sprintf_s(out, sizeof(out), "0x%08X", rv);
return out;
}
#endif
#define CHECK(f, rv) \
if (SCARD_S_SUCCESS != rv) \
{ \
printf(f ": %s\n", pcsc_stringify_error(rv)); \
return -1; \
}
int main(void)
{
LONG rv;
SCARDCONTEXT hContext;
LPTSTR mszReaders;
SCARDHANDLE hCard;
DWORD dwReaders, dwActiveProtocol, dwRecvLength;
SCARD_IO_REQUEST pioSendPci;
BYTE pbRecvBuffer[258];
BYTE cmd1[] = { 0x00, 0xA4, 0x04, 0x00, 0x0A, 0xA0, 0x00, 0x00, 0x00, 0x62, 0x03, 0x01, 0x0C, 0x06, 0x01 };
BYTE cmd2[] = { 0x00, 0x00, 0x00, 0x00 };
unsigned int i;
rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
CHECK("SCardEstablishContext", rv)
#ifdef SCARD_AUTOALLOCATE
dwReaders = SCARD_AUTOALLOCATE;
rv = SCardListReaders(hContext, NULL, (LPTSTR)&mszReaders, &dwReaders);
CHECK("SCardListReaders", rv)
#else
rv = SCardListReaders(hContext, NULL, NULL, &dwReaders);
CHECK("SCardListReaders", rv)
mszReaders = calloc(dwReaders, sizeof(char));
rv = SCardListReaders(hContext, NULL, mszReaders, &dwReaders);
CHECK("SCardListReaders", rv)
#endif
printf("reader name: %s\n", mszReaders);
return 0;
}
using Makefile:
all: ApduTool.c
gcc -c ApduTool.c -lsqlite3 -lpcsclite -lcrypto -lssl -I/usr/local/include/PCSC/ -I/usr/lib/ -I.
gcc ApduTool.o -o ApduTool -lsqlite3 -lpcsclite -lcrypto -lssl -I/usr/local/include/PCSC/ -I/usr/lib/ -I.
clean:
rm -f ApduTool *.o
When I run ApduTool binary file the SCardListReaders function returns: SCardListReaders: Cannot find a smart card reader.
I cannot Guess what the problem can be since I can see my USB reader when running lsusb:
Bus 001 Device 003: ID 072f:8206 Advanced Card Systems, Ltd
Bus 001 Device 002: ID 80ee:0021 VirtualBox USB Tablet
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
and I have run the PCSC daemon (pcscd) while running the code.
Can anyone help me solve this? Have I missed to install a specific driver or so?
Solution 1:[1]
pcscd should log what is happening and if the reader driver is found.
See https://pcsclite.apdu.fr/#support to know how to generate a correct pcscd log.
Solution 2:[2]
The fact, that your system identifies the USB reader as existing and connected is insufficent for knowing how to address it.
I assume, that the respective driver is missing (not sure, whether ACS provides one for Linux).
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Ludovic Rousseau |
| Solution 2 | guidot |
