Smartcards: Installing OpenCard on Linux systems, using IBM JDK
Davor Ocelic, docelic@spinlocksolutions.com
SPINLOCK - Advanced Unix-based networks for commercial and education sectors.
Jun 28, 2005.
Obtaining files
Java and Java Communications API
Obtain Java Development
Kit (JDK).
IBM Java also
offers Java Communications API for download, which is needed by OpenCard.
Following the link above, log in (using your existing or new
account) and proceed to IBM SDK download.
You need to download:
IBMJava2-SDK-142.tgz
IBMJava2-JAVACOMM-142.tgz
The IBM Java SDK package also contains the runtime environment, so you
do not need the JRE (the Java Runtime Environment) - you need JRE
instead of SDK on systems where you will only want to deploy (and not
develop) your applications.
OpenCard
Visit opencard.org (their downloads section),
then download OCF 1.2 All-in-One package, which is an installable class
file (installOCF).
The OpenCard went completely inactive somewhere in 2001, do not use it for new developments.
PC/SC
PC/SC is a "driver" for your smart card reader
(terminal). Install PC/SC from your Linux distribution.
OpenCard Framework -> PC/SC Shim (OCFPCSC)
You need the "shim" (layer) which allows OCF to utilize the PC/SC Lite
drivers. You can download it from the MUSCLE project, on their middleware download page.
Direct download link is http://linuxnet.com/middleware/files/OCFPCSC1-0.0.1.tar.gz.
Installing files
Java and Java Communications API
Since the paths are predefined in the SDK package, you need to create
the /opt/ directory on your
system and unpack the Java package to it:
mkdir /opt
cd /opt
tar zxf /path/to/IBMJava2-SDK-142.tgz
tar zxf /path/to/IBMJava2-JAVACOMM-142.tgz
Then you need to add Java bin directory
to your PATH. This can be done system- or user-wide. System-wide approach:
echo 'export PATH=$PATH:/opt/IBMJava2-142/bin:/opt/IBMJava2-142/jre/bin' >> /etc/profile
To apply changes, either completely log out and log back in, or do . /etc/profile in the current
shell to update PATH.
To test the installation, do:
java -version
The Communications API is used for opening parallel and/or serial
ports. Since we will only use serial ports (USB smart card readers will
also appear as serial), the Comm API notes mention that you need to
give proper permission to users on /dev/ttyS*
devices. On Debian, you need to add user to the 'dialout' group; on
Ubuntu, this is already done; on generic setups, either manually
prepare permissions or, for no fuss and quick setup, choose variant #3
from the below list:
Debian# adduser USERNAME dialout
Ubuntu# (nothing)
Generic-linux# chmod 666 /dev/ttyS{1,2,3,4}
Regardless of the above device permissions, you need to slightly adjust
the javax.comm.properties
file, if you use the USB smart card reader. You need to open /opt/IBMJava2-142/jre/lib/javax.comm.properties
and uncomment the last line that says:
/dev/ttyUSB=PORT_SERIAL
OpenCard
Make the root user source /etc/profile (directly, by running . /etc/profile) - to get Java in
PATH - then execute java installOCF.
For the installation path, pick /opt/OpenCard/.
The installation procedure asks to build the
basic opencard.properties
file. Towitoko ChipDrive Micro (USB) smartcard readers
(terminals) should use "PC/SC Card Terminal interface" from the menu.
The location of the opencard.properties
file should be left in JAVA_HOME/jre/lib/,
which is already the default.
At this point, you are presented with a picture of OpenCard consortium
members, and the installation begins.
In the end, you are asked to view the README file, which isn't there,
but supposedly the procedure is done.
Now you need to create symbolic links to OpenCard *.jar files from the
Java space:
cd /opt/IBMJava2-142/jre/lib/ext
for p in `find /opt/OpenCard -name '*.jar'`; do ln -s $p; done
To catch the problem before it happens, execute export | grep -E 'LANG|LC' and
see if any of the (one or two) variables shown contains "UTF-8". If it
does, simply redefine it, omitting .UTF-8:
$ export | grep -E 'LANG|LC'
declare -x LANG="en_US.UTF-8"
declare -x LANGUAGE="en_HR:en"
$ export LANG=en_US
(UTF-8 setting is re-initialized each time you open a terminal, so make
sure you modify appropriate system config files for a permanent
solution - /etc/profile for
example).
PC/SC
This is where you need to get your smart card
terminal running. If it is an USB device, you will need USB host
support, usb->serial, and a specific driver. In case of Towitoko
chipdrive micro on USB, the kernel modules to load are usbserial and pl2303. When you connect the
reader, device /dev/ttyUSB0
will be created.
On Debian GNU, pc/sc-related packages are called libpcsclite1,
libusb-0.1-4, pcscd, libccid and libtowitoko2.
When you install all of this, ending with libtowitoko2, the smart card
reader (terminal) should light its LED (if it has one) when
any smart card is inserted.
(USB card terminals do not require manual setup; for serial devices
/etc/reader.conf needs to be
adjusted).
You also need to install libpcsc-perl
and libpcsc-tools for some
very great additional tools.
OpenCard Framework -> PC/SC Shim (OCFPCSC)
You need to extract the mentioned tarball, and run make. Before that, you will need to
modify the Makefile appropriately (adjust file paths). You can download our modified and compiled
OCFPCSC1 package, that both has a Makefile that matches our setup, and
has libOCFPCSC1.so library
built. In any case, it is strongly advise
that you take at least the Makefile from our package and work from there on -
it contains small but crucial fixes.
Ideally, you would see if the Makefile suits you, and rebuild the
library yourself (by doing make
clean all). However, if you have trouble doing so, you can
just type make install and
have my precompiled version (if it matches your system - Linux x86, gcc
3).
Testing the installation
To see if pcscd is working, inserting and removing card from the chip
card reader should turn-on/turn-off the LED on the reader (if any).
Run pcsc_scan, it should
detect the terminal, notice card insertions/removals, and print card
identification information.
Run java demos.samples.GetCardID,
and when you insert the smart card, you should see a CardID displayed
through the use of OpenCard Framework!
(If you run the command and get a
message about __gxx_personality_v0 being undefined, then you need to
replace linker 'ld' in the OCFPCSC Makefile
with 'g++' - which would have been done for you if you picked my
Makefile as the base).
Enhancing the installation
findOCP tool
findOCP is an useful tool that would be nice to install - it prints the
locations where opencard.properties
files are looked for. If java
demos.tools.findOCP doesn't work, then save the following
content as findOCP.java:
import java.io.File;
import java.util.Properties;
public class findOCP {
public static void main(String[] argv) {
final String sep = File.separator;
Properties props = System.getProperties();
String JavaHome = props.getProperty("java.home");
String UserHome = props.getProperty("user.home");
String UserDir = props.getProperty("user.dir");
System.out.println("Looking for OpenCard Properties file in:\n\t"
+ JavaHome + sep + "lib" + sep
+ "opencard.properties\n\t"
+ UserHome + sep + ".opencard.properties\n\t"
+ UserDir + sep + "opencard.properties\n\t"
+ UserDir + sep + ".opencard.properties\n");
}
}
Compile and install:
javac findOCP.java
jar cvf findOCP.jar findOCP.class
cp -i findOCP.jar /opt/IBMJava2-142/java/jre/lib/ext
To run, then just run java findOCP.
That's it.
SPINLOCK - Advanced Unix-based networks for commercial and education sectors.