Nach etwas Arbeit habe ich den JPCSC Wrapper in der Version 0.8.0 für PCSC unter Ubuntu Jaunty 9.04 zum laufen gebracht. Dafür waren diverse Änderungen am Quellcode von JPCSC notwendig, die ich zuerst beschreibe.
Die folgenden Pakete müssen zuerst auf dem System installiert werden:
[code]
sudo aptitude install sun-java6-jdk libpcsclite-dev libpcsclite1
[/code]
Danach muss JPCSC von der Linuxnet.com Seite runtergeladen und entpackt werden. Das Erstellen mit dem Befehl „make“ wird nicht funktionieren, weil diverse Header-Dateien von PCSC nicht in dem Standard-Pfad /usr/include/ liegen, sondern in dem Pfad /usr/include/PCSC/.
Die folgenden Header-Dateien sind davon betroffen:
[code]
ifdhandler.h
pcsclite.h
reader.h
winscard.h
wintypes.h
[/code]
Um dieses Problem zu lösen, ist es am Einfachsten die Bibliotheken in dem Pfad /usr/include zu verlinken. Dazu sollten die folgenden Befehle reichen:
[code]
cd /usr/include
sudo ln -s PCSC/ifdhandler.h ifdhandler.h
sudo ln -s PCSC/pcsclite.h pcsclite.h
sudo ln -s PCSC/reader.h reader.h
sudo ln -s PCSC/winscard.h winscard.h
sudo ln -s PCSC/wintypes.h wintypes.h
[/code]
Zusätzlich muss die Zeile 769 in der Datei jpcsc/src/jpcsc/jpcsc.c angepasst werden, weil sie nicht mehr dem Aufruf aus der pcsc-Bibliothek passt:
[code]
< rv = SCardControl(card, cin + joff, jlen, cout, &clen);
---
> rv = SCardControl(card, SCARD_CTL_CODE(jcc), cin + joff, jlen, cout, clen, &clen);
[/code]
Also „SCardControl(card, cin + joff, jlen, cout, &clen);“ ersetzen durch „SCardControl(card, SCARD_CTL_CODE(jcc), cin + joff, jlen, cout, clen, &clen);“.
Danach sollte es möglich sein den Code zu erstellen.
Um über den Wrapper auf die Bibliothek zuzugreifen, muss die Bibliothek jpcsc.so und jpcsc.jar über den folgenden Parameter verlinkt werden. Der folgenden Parameter muss dem Aufruf vor der Ausführung als Parameter direkt übergeben werden:
[code]
java -Djava.library.path=lib/ Test
[/code]
In dem von mir gezeigten Beispiel müssen die beiden Dateien „jpcsc.so“ und „jpcsc.jar“ in den Ordner „lib/“ gelegt werden, damit sie angesteuert werden.
Unter Eclipse muss unter „Run as “ unter Configurations nur der Parameter bei VM-Arguments eingetragen werden:
[code]
-Djava.library.path=lib/
[/code]
Beispielcode:
[code]
import com.linuxnet.jpcsc.*;
public class JPCSCUsecase {
public JPCSCUsecase() {
try {
Context context = new Context();
context.EstablishContext(PCSC.SCOPE_GLOBAL, null, null);
String[] readers = context.ListReaders();
if (readers.length <= 0) {
System.err.println("No readers found...");
return;
}
//Talk to the first reader = 0
String reader = readers[0];
System.out.println("Using reader " + reader);
Card card = context.Connect(reader);
card.BeginTransaction();
//Do something with APDUS
System.out.println("APDU: "+ readApduInfo(card));
card.EndTransaction(PCSC.RESET_CARD);
card.Disconnect();
context.ReleaseContext();
} catch (Exception e) {
e.printStackTrace();
}
}
private String readApduInfo(Card card) {
Apdu apdu = new Apdu((byte) 0x20, (byte) 0x13, (byte) 0x00, (byte) 0x81, 0, null, 0, 5);
byte[] data = card.Transmit(apdu);
return bytesToString(data);
}
private String bytesToString(byte[] bytes) {
String output = "";
for (int i = 0; i < bytes.length; i++) {
output += "0x"+bytes[i]+ " ";
}
return output;
}
public static void main(String[] arg) {
new JPCSCUsecase();
}
}
[/code]
Eigentlich ist es besser und vor allem einfacher über die Implementierung von javax.smartcardio.* zuzugreifen. Weitere Informationen folgen noch.