Mit Java über JPCSC auf den Smartcardreader und die Smartcard unter Linux zugreifen

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.

6 Gedanken zu „Mit Java über JPCSC auf den Smartcardreader und die Smartcard unter Linux zugreifen

  1. danke fuer deine hilfe allerdings komme ich nicht ganz ohne fragen aus…

    „Zusätzlich muss die Zeile 769 angepasst werden, weil sie nicht mehr dem Aufruf aus der pcsc-Bibliothek passt:
    PLAIN TEXT
    CODE:

    1.
    rv = SCardControl(card, SCARD_CTL_CODE(jcc), cin + joff, jlen, cout, clen, &clen);

    Danach sollte es möglich sein den Code zu erstellen.“

    welches file? und was muss angepasst weden?
    ich habe nur im jpcsc.c diesen eintrag gefunden und wusste nicht genau was zu tun. ich hab es noch nicht geschafft zum laufen zu bringen. ein beispiel waere super.

  2. Hallo,

    mein Fehler. Hab wohl vergessen nach der Korrektur des Artikels speichern zu drücken. Das vorher war ein Grobentwurf vor dem nochmaligen Test der endgültigen Beschreibung.

    Ich würde trotzdem raten „javax.smartcardio“ zu benutzen, da es ab Java6 in Java dabei ist und man muss nichts mehr nachinstallieren für fremde Anwendungen.

    Die von mir beschriebene Änderung ist einem normalen Benutzer nicht zuzumuten.

    Gruß, Konstantin

  3. tausend dank es lauft. werde morgen mal mit “javax.smartcardio” anschauen.

    ps.
    spitzen response time:) 1kilo thnx

  4. pps. soory habs vergesen oben zu sagen bei der sim.links muss das ganze anders herum geschrieben werden
    ln -s pfad/filename filename
    nochmal thnx

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.