Smart Cards durch die in Java eingebaute Java Smartcard I/O javax.smartcardio.* ansprechen

Zuerst mache ich eine kleine Einführung in das Thema Java und Smartcads und beschreibe danach wichtige Punkte für Linux und Windows.

Java hat seit Version 1.5 (5.0) eine Unterstützung für Smartcards bereits eingebaut. Es nutzt dafür die eigene Provider Technik und greift über PC/SC auf die Smartcard zu. Das bedeutet es sind keine weiteren Module für Java notwendig (früher JPCSC für Linux) und die Nutzung erfolgt unabhängig vom Betriebssystem. Zumindest kann ich das für Windows XP/Vista und Linux bestätigen. FreeBSD und Sun Solaris sollten genau so gut funktionieren. Weitere Informationen zu Betriebssystemen in den nächsten Absätzen.

Unter Windows ist die Verwendung denkbar einfach. Für die Nutzung ist ein installierter Treiber für das Lesegerät (Terminal) und natürlich Java notwendig. Windows bringt eine eigene PC/SC Implementierung mit, die Java über den eingebauten Provider nutzt. Dadurch ist die Installation und Einrichtung sehr einfach.

Für Linux ist die Installation fast genau so einfach. Durch die verschiedenen pcsclite-Versionen (PC/SC Implementierung unter Linux) sind aber die Header-Datei (.h) für die Bibliothek notwendig, damit Java die PC/SC Bibliothek richtig ansprechen kann. Dafür reicht meistens die Installation der folgenden Pakete:

  • libpcsclite1
  • pcscd
  • libccid
  • libpcsclite-dev  (WICHTIG: Hier sind die notwendigen Header-Dateien)

Fehlt das Paket libpcsclite-dev bzw. die Header Dateien, so kann Java die PC/SC Bibliothek nicht nutzen und findet deswegen kein Lesegerät (Terminal).

Für Debian/Ubuntu und weitere Debian-Derivate ist die Installation denkbar einfach:

[code]
sudo aptitude install libpcsclite1 pcscd libccid libpcsclite-dev
[/code]

Die Nutzung der JPCSC Middleware, welcher veraltet ist, habe ich bereits früher hier beschreiben.

Um die Verwendung der Java Smartcard I/O zu testen, habe ich ein paar kleine Testprogramme geschrieben, die ich hier veröffentliche. Sie sind auf Englisch kommentiert, so dass keine weitere Erklärungen erfolgen. Ich denke die paar Worte Englisch wird wohl jeder verstehen können. Sie sind extra kurz und einfach gehalten.

[code]
import java.util.List;
import javax.smartcardio.*;

/*
* Look in rt.jar for „javax.smartcardio“ to get further information
* Defined in: JSR 268
*/
public class ListSmartcardReaders {

public static int listCounted() {

/* we use the default TerminalFactory */
TerminalFactory factory = TerminalFactory.getDefault();

try {
/* We can have multiple terminals on one System, so we get a list */
List terminals = factory.terminals().list();

for (CardTerminal terminal : terminals) {
System.out.println(„Card_Terminal_Name: „+ terminal.getName());
System.out.println(„Card_in_Terminal_present: „+terminal.isCardPresent());
System.out.println(„——————————————–„);
}
return terminals.size();

} catch (CardException e) {
e.printStackTrace();
}
return 0;
}

public static void main(String[] args) {
listCounted();
}
}
[/code]

[code]
import java.util.List;
import javax.smartcardio.*;

/*
* Look in rt.jar for „javax.smartcardio“ to get further information
* Defined in: JSR 268
*/
public class ConnectReader {

/**
*
* @param index is the array index of the terminal list (0..x)
* @throws CardException if there are problems accessing the smartcard
*/
public static void connectCard(int index) throws CardException {

/* Is a Reader connected we can access? */
if (TerminalFactory.getDefault().terminals().list().size() == 0) {
System.err.println(„No reader present“);
return;
}

/* Terminal we are working on */
CardTerminal terminal = TerminalFactory.getDefault().terminals().list().get(index);

/* Is a card present? */
if (!terminal.isCardPresent()) {
System.err.println(„No Card present!“);
return;
}

/* Here you have to choose „T=0″,“T=1“, „T=2“, check documentation of your smart card */
//Mostly it’s „T=1“, for older cards its „T=0“
Card card = terminal.connect(„T=1“);

System.out.println(„Card_Info: „+card.toString());
System.out.println(„Card Protocol: „+ card.getProtocol());

//Reset the card for use
ATR atr = card.getATR();

System.out.println(„ATR: “ + atr.getBytes());
System.out.println(„ATR historical bytes: „+ atr.getHistoricalBytes());

/* Get the basic channel. This one can’t be closed */
CardChannel channel = card.getBasicChannel();

/* Try to send a command. This one won’t work! */
byte[] command = { 0, 0, 0, 0};

CommandAPDU someApdu = new CommandAPDU(command);

ResponseAPDU r = channel.transmit(someApdu);
/* Response encoded in bytes */
byte[] response = r.getBytes();

System.out.println(„response: „+ response);

card.disconnect(false);
}

public static void main(String[] args) {
try {
//First Terminal = 0
connectCard(0);
} catch (Exception e) {
e.printStackTrace();
}
}
}
[/code]

Für weitere Information über APDUs und die Nutzung der Smartcards empfehle ich das Lesen des Buches Handbuch der Chipkarten oder direkt die dazugehörigen ISO-Normen ISO-7816 und im Speziellen die ISO-Normen ISO7816-4, ISO7816-8 und ISO7816-9.

Auf die Frage „Kommt man ohne das Buch bzw. die Normen aus?“, muss ich leider mit „definitiv nein!“ beantworten, da die Informationen sehr komplex sind und schwer zu verstehen. Im Internet ist bis Heute fast gar nichts vorhanden.
Ich rate aber nach Diplom-, Master- und Bachelorarbeiten zu dem Thema zu suchen. Da gibt es bestimmt Auszüge aus den Normen, um wenigstens die Zusammehänge und die Anfänge zu verstehen.

Kinder lernt gut Fremdsprachen, damit es euch nicht passiert!

Guasto ungleich Schadhaft :)Eine Sprache kennen bedeutet nicht, dass man sie auch wirklich gut beherrscht. Jetzt stellt euch mal vor, ihr zeigt euer Werk ganz stolz einem Muttersprachler und es ist falsch. Der Italiener der dieses Schild gemacht hat, hat es hoffentlich versucht.

Das war allerdings einer der harmlosesten Übersetzungsfehler, die ich mitbekommen hatte. Mir wurden Geschichten von sterbenden (übersetzt von „ausgefallen“) Maschinen erzählt. Hier hatte ich gerade mein Mobiltelefon parat, um diese Werk für die Nachwelt festzuhalten.

In Eclipse Galileo (3.5.X) Plugins installieren/nachinstallieren Probleme

Das Eclipse Update System ist leider sehr complex und damit für Fehler anfällig. Unter bestimmten Bedingungen bekommt man bei der Installation von neuen Plugins folgende Fehler: „No repository found containing: …..“

Dieser Fehler trat bei mir auf und deutet auf die Galileo Update Site direkt von Eclipse:

[code]
An error occurred while collecting items to be installed
session context was:(profile=epp.package.jee, phase=org.eclipse.equinox.internal.provisional.p2.engine.phases.Collect, operand=, action=).
No repository found containing: osgi.bundle,net.sf.cglib,2.1.3.v200906051230
No repository found containing: osgi.bundle,org.eclipse.hyades.probekit,4.2.500.v200906041936
No repository found containing: osgi.bundle,org.eclipse.mylyn.commons.soap,3.2.0.v20090617-0100-e3x
No repository found containing: osgi.bundle,org.eclipse.mylyn.jira.core,3.2.0.v20090617-0100-e3x
No repository found containing: osgi.bundle,org.eclipse.mylyn.jira.ui,3.2.0.v20090617-0100-e3x
[/code]

Eclipse versucht alle Update Sites zu kontaktieren und dort Versionen zu erfragen, damit es Abhängigkeiten zwischen den Biblioetheken richtig auflösen kann. Treten dabei Probleme auf, weil die Seite z.B. überlastet oder gerade nicht erreichbar ist, dann misslingt die Installation.

Eine mögliche Lösung besteht darin, die betroffene Seite unter „Window -> Preferences -> Install/Update -> Available Software Sites“ zu deaktivieren.

Das ist meistens die Haupt-Updateseite von Eclipse:

[code]
Galileo        http://download.eclipse.org/releases/galileo Enabled <-- auf Disabled setzen [/code] Hilft das nicht weiter, so müssen am besten weitere Seiten deaktiviert werden, bis die Installation funktioniert.

Nina Conti and Monkey, Jeff Dunham und Mark Faje: Watch on YouTube!

Heute bin ich über ein wirklich gutes Video von Nina Conti and Monkey gestolpert. Schaut es euch an – britischer Humor hat was:

http://www.youtube.com/watch?v=IjHOCSRRoxM

Wem Bauchredner gefallen, der sollte auf jeden Fall Jeff Dunham kennen. Auf Youtube sind sehr viele Videos von ihm zu finden. Jeff Dunham und Achmed the Dead Terrorist ist noch immer das Beste:

http://www.youtube.com/watch?v=1uwOL4rB-go

Etwas skuriler treibt es Mark Faje und nennt sich „the worlds most dangerous comic“ – hat auf jeden Fall was:

http://www.youtube.com/watch?v=XgDuH2bA1iw&NR=1

… und das zweite Video braucht ihr jetzt nicht erst bei youtube zu suchen. Hier ist es:

http://www.youtube.com/watch?v=ZpNcCVP8e6c

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]
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.

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

Zensursula Promotion Video

Für meinen Geschmack zu „poppig“, hätte es etwas rockiger gestaltet. Aber dafür habe ich wohl nicht den „Geschmack der Massen“. Schaut selber:

Es ist nur traurig, wie wenig Personen Ursula von der Leyen direkt kontaktieren: http://www.direktzu.de/vonderleyen

„Lobbyarbeit“ können auch auf diesem Weg Personen ohne Millionenbudget betreiben. Werden die Fragen gelöscht, so kann das wiederrum publik gemacht werden. Aber bitte sachlich bleiben, sonst wird es mehr schaden als bringen!

Aktualisierung des Intel Graphikkartentreibers unter Ubuntu 9.04 Jaunty löst viele Probleme

Heute habe ich mich nach längeren Problemen mit dem Intel Graphikkarten Treiber dazu entschieden diesen zu aktualisieren. Die Ubuntu 9.04 (Jaunty) Version kam zu einem denkbar schlechten Zeitpunkt aus Sicht des Kernels und der Intel Treiber raus. Intel hat kurz vorher begonnen die Treiber komplett auf die neue Kernel Architektur umzubauen.

Mit dem Kernel 2.6.28 und den in Jaunty enthaltenen Treibern enstand eine schlecht funktionierende Version.

Seit wenigen Minuten habe ich jetzt eine Lösung für das Problem und ja meine riesigen VertexArrays funktionieren wieder.

Die Lösung war relativ einfach. Ich habe zuerst von http://kernel.ubuntu.com/~kernel-ppa/mainline/ den neuesten Kernel (derzeit 2.6.30) installiert, damit der Treiber die UXA Graphikbeschleunigung Architektur nutzen kann.

Im nächsten Schritt habe ich die Quellen von X-Updates in die sources.list von apt aufgenommen und die Treiber aktualisiert. Siehe alle Informationen hier: https://launchpad.net/~ubuntu-x-swat/+archive/x-updates.

Zusätzlich müssen noch die neuesten X.org Pakete mit den folgenden Befehlen aktualisiert werden:

[code]
sudo aptitude update
sudo aptitude upgrade
[/code]

Im letzten Schritt musste ich die xorg.conf anpassen, damit UXA genutzt wird. Dafür muss  unter AccelMethod UXA aktiviert werden Der Abschnitt sieht so aus:

[code]
Section „Device“
Identifier „Configured Video Device“
Driver „intel“
# this one is important
Option „AccelMethod“ „UXA“
EndSection
[/code]

In vielen Anleitungen fehlen die Anführungszeichen um „AccelMethod“ was zu einer Fehlermeldung bei mir führt. Generell müssen Optionnen und die Optionen in Anführungszeichen gesetzt werden.

Quellen und weitere Hinweise:

http://www.ubuntugeek.com/new-intel-graphics-drivers-for-ubuntu-9-04-jaunty.html