Konstantin Filtschew WebLog

Der tägliche IT-Wahnsinn

Unter Eclipse über Java auf zugriffsbeschränkte (not accessible) Pakete am Beispiel von javax.smartcardio.*) im Java Projekt zugreifen

Die Nutzung von bestimmten Paketen ist unter Eclipse mit Java mit Access Rules beschränkt (standardmäßig nicht erlaubt). Das gilt insbesondere für “javax.*” Pakete. In meinem Fall bestand die Schwierigkeit auf die Klassen “javax.smartcardio.*” zuzugreifen. Das Problem kann auf die folgende Art und Weise (auch für andere Pakete) in Eclipse festgelegt werden:

  1. Java Projekt erstellen oder ein bestehendes Projekt öffnen
  2. Mit rechter Maustaste auf das Projekt gehen und dann die Eigenschaften (Properties) öffnen.
  3. Unter “Java Build Path” und dann “Libraries” den “JRE System Library” Baum aufschlagen.
  4. Den Punkt “Access Rules” auswählen und rechts auf den Knopf “Edit” drücken.
  5. Dort mit “Add” eine neue Regel anlegen; auf “Accessible” setzen und für mich den Wert “javax/smartcardio/**” eintragen, um auf alle Klassen von “javax.smartcardio” zugreifen zu können.

Das Problem besteht unter Eclipse und gilt nicht für ein Programm, welches unter der Kommandozeile erstellt und kompiliert wird.

So jetzt gehts für mich an die Programmierung von APDUs zur Steuerung von Smartcards.

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.

Fehlende Umsatzsteuer-ID im Impressum ist abmahnfähig

Damit hat das Oberlandesgericht Hamm entschieden,  dass die Umsatzsteuer-Identifikationsnummer Pflichtangabe für das Impressum gewerblicher Webseiten ist.

Jeder gewerbliche Seitenbetreiber sollte bei Gelegenheit alle Punkte aus § 5 Allgemeine Informationspflichten prüfen. Es wird bestimmt wieder abmahnfreudige Anwälte geben, die sich damit schnell Geld verdienen wollen.

Quellen und weitere Hinweise

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