Konstantin Filtschew WebLog

Der tägliche IT-Wahnsinn

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:
  1. sudo aptitude install sun-java6-jdk libpcsclite-dev libpcsclite1

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:
  1. ifdhandler.h
  2. pcsclite.h
  3. reader.h
  4. winscard.h
  5. wintypes.h

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:
  1. cd /usr/include
  2. sudo ln -s PCSC/ifdhandler.h ifdhandler.h
  3. sudo ln -s PCSC/pcsclite.h pcsclite.h
  4. sudo ln -s PCSC/reader.h reader.h
  5. sudo ln -s PCSC/winscard.h winscard.h
  6. sudo ln -s PCSC/wintypes.h wintypes.h

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:
  1. <     rv =  SCardControl(card, cin + joff, jlen, cout, &clen);
  2. ---
  3. >     rv =  SCardControl(card, SCARD_CTL_CODE(jcc), cin + joff, jlen, cout, clen, &clen);

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:
  1. java -Djava.library.path=lib/ Test

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:
  1. -Djava.library.path=lib/

Beispielcode:

CODE:
  1. import com.linuxnet.jpcsc.*;
  2.  
  3. public class JPCSCUsecase {
  4.  
  5.     public JPCSCUsecase() {
  6.         try {
  7.             Context context = new Context();
  8.             context.EstablishContext(PCSC.SCOPE_GLOBAL, null, null);
  9.            
  10.             String[] readers = context.ListReaders();
  11.             if (readers.length <= 0) {
  12.                 System.err.println("No readers found...");
  13.                 return;
  14.             }
  15.            
  16.             //Talk to the first reader = 0
  17.             String reader = readers[0];
  18.             System.out.println("Using reader " + reader);
  19.            
  20.             Card card = context.Connect(reader);
  21.             card.BeginTransaction();
  22.  
  23.             //Do something with APDUS
  24.             System.out.println("APDU: "+ readApduInfo(card));
  25.            
  26.             card.EndTransaction(PCSC.RESET_CARD);
  27.             card.Disconnect();
  28.            
  29.             context.ReleaseContext();
  30.         } catch (Exception e) {
  31.             e.printStackTrace();
  32.         }
  33.     }
  34.    
  35.     private String readApduInfo(Card card) {
  36.         Apdu apdu = new Apdu((byte) 0x20, (byte) 0x13, (byte) 0x00, (byte) 0x81, 0, null, 0, 5);
  37.         byte[] data = card.Transmit(apdu);
  38.         return bytesToString(data);
  39.     }
  40.  
  41.     private String bytesToString(byte[] bytes) {
  42.         String output = "";
  43.        
  44.         for (int i = 0; i <bytes.length; i++) {
  45.             output += "0x"+bytes[i]+ " ";
  46.         }
  47.         return output;
  48.     }
  49.    
  50.     public static void main(String[] arg) {
  51.         new JPCSCUsecase();
  52.     }
  53. }

Eigentlich ist es besser und vor allem einfacher über die Implementierung von javax.smartcardio.* zuzugreifen. Weitere Informationen folgen noch.

Ähnliche Beiträge:

  1. Java Plugin unter Debian (Linux) / Ubuntu in Firefox und Iceweasel aktivieren
  2. Mit ThreadPoolExecutor Arbeit unter Java effizient parallelisieren
  3. Java Virtual Machine JRE oder JDK unter Debian (Lenny / Sid) ändern
  4. Anzahl Prozessoren bestimmen welche für die Java Virtual Machine (JVM) vom System zur Verfügung stehen
  5. Von Windows auf Linux (ext2, ext3, ext4) Partitionen zugreifen

6 Reaktionen zu “Mit Java über JPCSC auf den Smartcardreader und die Smartcard unter Linux zugreifen”

  1. d.najjarzade

    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. Konstantin Filtschew

    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. d.najjarzade

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

    ps.
    spitzen response time:) 1kilo thnx

  4. d.najjarzade

    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

  5. Konstantin Filtschew

    Hi,

    dannke für den Tipp. Ich habe zu viele Sachen parallel gemacht.

    Sollte jetzt stimmen.

    Gruß, Konstantin

  6. Mit Java Smart Cards durch die in Java eingebaute Java Smartcard I/O javax.smartcardio.* ansprechen | Konstantin Filtschew WebLog

    [...] Nutzung des JPCSC Treibers, welcher veraltet ist, habe ich bereits früher hier [...]

Einen Kommentar schreiben

Copyright © 2012 by: Konstantin Filtschew WebLog • Template by: BlogPimp Lizenz: Creative Commons BY-NC-SA.