Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Accessing javax.smartcardio from Linux 64 bits

Tags:

I'm trying to load the smartcard terminals using the javax.smartcardio API with the following code:

public CardTerminal getReadyCardTerminal() throws CardException {      TerminalFactory factory = TerminalFactory.getDefault();     CardTerminals terminals = factory.terminals();     List<CardTerminal> list = terminals.list(State.CARD_PRESENT);      while (list.isEmpty()) {         terminals.waitForChange(1000);         list = terminals.list(State.CARD_PRESENT);     }     CardTerminal cardTerminal = list.get(0);     return cardTerminal; } 

... and I always get the following exception:

java.lang.IllegalStateException: no terminals at javax.smartcardio.TerminalFactory$NoneCardTerminals.waitForChange(TerminalFactory.java:145) 

On Windows Vista/7 everything works fine, but I can't get it to work on Linux. I'm using Ubuntu 12.04 64 bits.

I installed the pcscd service using the following command:

sudo apt-get install libccid pcscd libpcsclite-dev libpcsclite1 sudo service pcscd start 

And the pcsc_scan command prints this:

PC/SC device scanner V 1.4.18 (c) 2001-2011, Ludovic Rousseau <[email protected]> Compiled with PC/SC lite version: 1.7.4 Using reader plug'n play mechanism Scanning present readers... 0: OMNIKEY CardMan 3x21 00 00  Tue Sep 11 15:44:49 2012 Reader 0: OMNIKEY CardMan 3x21 00 00   Card state: Card inserted,    ATR: <some hexa codes>   ... 

So everything looks ok, but the smartcardio just doesn't work. I'm trying with both Oracle and OpenJDK 1.7.0_05, 32 and 64 bits.

The code runs ok with OpenJDK (but not with Oracle JDK, don't know really why) on a Ubuntu 32 bits environment. So I think it is a problem with the 64 bits bridge from Java to the PC/SC library.

Any ideas?

Thanks.

like image 798
Gilberto Torrezan Avatar asked Sep 11 '12 19:09

Gilberto Torrezan


2 Answers

I think I found a workaround for this as I just had a similar problem. In a bugreport from ubuntu it says that the javax.smartcardio library searches for the PC/SC library in the wrong directory.

By specifying the path to the PC/SC library on my machine, like the bugreport mentions, I got it working.

The paths in the bugreport are wrong for me, I'm on 64 bit fedora, where the pc/sc library are installed at /usr/lib64/libpcsclite.so.1

So the workaround for me is to specify the library path to java like this:

java -Dsun.security.smartcardio.library=/usr/lib64/libpcsclite.so.1 

Depending on your Linux distribution, the location of libpcsclite.so.1 actually might differ, it could also be at /lib/x86_64-linux-gnu/libpcsclite.so.1 (i.e. Kubuntu 15.04). In that case, call it like this:

java -Dsun.security.smartcardio.library=/lib/x86_64-linux-gnu/libpcsclite.so.1 
like image 170
Jostein Stuhaug Avatar answered Sep 19 '22 20:09

Jostein Stuhaug


i'm using raspberry with debian arm version

find the location of libpcsclite first with:

$ ldd -r /usr/bin/pcsc_scan 

and then use the libpcsclite location with:

java -Dsun.security.smartcardio.library=/usr/lib/arm-linux-gnueabihf/libpcsclite.so.1 
like image 29
Ian Agung Avatar answered Sep 18 '22 20:09

Ian Agung