Die Kommunikation zwischen Terminal und Chipkarte läuft im Rahmen eines Transportprotokolls ab. Dieses ermöglicht es, Daten vollständig transparent zur Übertragungsschicht von der Chipkarte zu empfangen und wieder zurückzusenden. In Anwendungen für Chipkarten und für die Transportprotokolle wurde ein optimierter Befehlssatz entwickelt, der nur im Chipkartenbereich Verwendung findet. Aufgrund des stark beschränkten Speicherplatzes der Chipkarten, wird der Befehlssatz üblicherweise auf eine bestimmte Anwendung zugeschnitten, das heißt, alle Befehle, die innerhalb einer Anwendung nicht gebraucht werden, fallen rigoros der Optimierung zum Opfer.
Bei den Befehlssätzen für Chipkarten tritt zusätzlich der Effekt auf, daß viele Firmen eigene, für ihre Anwendung maßgeschneiderte Befehle, verwenden. Es kann also nicht von einem typischen Befehlssatz für eine elektronische Geldbörse gesprochen werden, da dieser von Hersteller zu Hersteller unterschiedlich sein kann. Trotzdem soll in diesem Kapitel ein Überblick über unverzichtbare Befehle gegeben werden.
Es gibt vier internationale Normen bzw. Normenentwürfe, die Befehlssätze vorschlagen. In diesen Normen gibt es mehr als 50 Befehle, und alle Normen unterscheiden sich voneinander. Die Grundlagen für diese Auswahl waren die GSM 11.11, prEN 726-3, prEN1546 und ISO 7816-4.
Die einzelnen Befehle in den Normen lassen sich aufgrund ihrer Funktionalität grob in gemeinsame Klassen einordnen:
Auswahl von Dateien
Lesen und Schreiben von Informationen in
Dateien
Operationen auf
Dateien
Identifizierungsbefehle
Authentisierungsbefehle
Befehle für
kryptographische Algorithmen
Verwaltung von Dateien
Die Dateiverwaltungen aller neuen Chipkartenbetriebssysteme sind ausnahmslos objektorientiert aufgebaut. Das bedeutet, daß vor einer Aktion an einer Datei, diese zuerst ausgewählt werden muß. Erst dann ist dem Betriebssystem bekannt, welche Datei gemeint ist, und alle nachfolgenden dateispezifischen Befehle betreffen nur diese Datei. Es kann immer nur eine Datei gleichzeitig ausgewählt sein.
Nach einem Reset ist immer das Master File selektiert. Die anschließende Auswahl von Dateien wird mit dem Befehl SELECT FILE durchgeführt. Die Adressierung findet entweder mit dem Namen der Datei oder dem Applikationsnamen statt. In der ISO-Norm kann auch ein ganzer Pfad angegeben werden.
Nur eine erfolgreiche Auswahl einer neuen Datei bewirkt die Deselektion der vorherigen. Nach erfolgreicher Selektion können Informationen über diese Datei abgerufen werden, z.B. Struktur, Größe oder noch vorhandener Speicher der neu ausgewählten Datei.
| SELECT FILE = 'E2' | |
|---|---|
| Parameter: | Name der Datei oder Name der Anwendung oder Pfad zur Datei |
| Antwort: | Informationen über die ausgewählte Datei (falls gewünscht), Returncode |
Die Klasse der Schreib- und Lesebefehle unterstützt vor allem die Verwendung einer Chipkarte als sicheren Datenspeicher. Mit diesen Befehlen lassen sich Informationen in die betreffenden Dateien schreiben und später auch wieder auslesen. Sofern die Dateien bestimmte Zugriffsbedingungen haben, ist das Lesen dieser Dateien nur noch autorisierten Benutzern möglich. Da Dateien unterschiedlich aufgebaut sein können, gibt es hier auch unterschiedliche Befehle. Dateien können ohne oder aber mit Struktur aufgebaut sein, d.h. die Daten sind dann als Datensätze hintereinander abgelegt. Dateien ohne Struktur werden auch als transparent bezeichnet. Sie stellen einen linear adressierbaren Speicher dar, auf den byteweise zugegriffen werden kann. Dabei werden die Befehle READ BINARY, WRITE BINARY und UPDATE BINARY verwendet. Wie der Name schon sagt, ist READ BINARY ein Lesebefehl, während WRITE BINARY und UPDATE BINARY Schreibbefehle sind. Der Unterschied zwischen beiden Befehlen liegt im sicheren Zustand des EEPROMs der Chipkarte. Ein WRITE- Befehl kann einzelne Bits nur vom unsicheren Zustand in den sicheren Zustand bringen, das heißt sie von einer logischen '1' auf den energieärmeren Zustand einer logischen '0' umwandeln. Der Befehl UPDATE hingegen ist ein echtes Schreiben auf den Dateiinhalt. Er kann als vorheriges Löschen mit anschließendem Schreiben betrachtet werden. Bevor ein Schreib- oder Lesebefehl ausgeführt werden kann, muß zunächst die richtige Datei selektiert werden. Der Zugriff auf die entsprechenden Daten der Datei wird dabei durch eine Längenangabe und einen Offset bis zum ersten anzusprechenden Byte realisiert.
| READ BINARY = 'B0' | |
|---|---|
| Parameter: | Anzahl der zu lesenden Bytes, Offset zum ersten Byte, das gelesen werden soll |
| Antwort: | gelesene Daten aus der Datei, Returncode |
| WRITE BINARY = 'D0' | |
|---|---|
| Parameter: | Anzahl der zu schreibenden Bytes, zu schreibende Bytes, Offset zum ersten Byte, das geschrieben werden soll |
| Antwort: | Returncode |
| UPDATE BINARY = 'D6' | |
|---|---|
| Parameter: | Anzahl der zu schreibenden Bytes, zu schreibende Bytes, Offset zum ersten Byte, das geschrieben werden soll |
| Antwort: | Returncode |
Bei Dateien mit einer Struktur, ist die kleinste ansprechbare Einheit ein einzelner Datensatz und stellt damit die Grundlage für alle Zugriffsbefehle dar. Durch diese Dateistruktur wird der Speicher von einem linearen eindimensionalen in einen zweidimensionalen Speicher verwandelt. Die Zugriffsarten sind dadurch komplizierter, können aber durch transparente Dateien nachgebildet werden.
Auf einen Datensatz kann direkt über eine absolute Datensatznummer zugegriffen werden oder über ein indirektes System:
Nach Auswahl einer Datei mit Datensätzen erzeugt das Chipkartenbetriebssystem einen Zeiger für den aktuellen Datensatz, der zunächst auf einen undefinierten Wert zeigt. Sobald einer der Befehle READ/WRITE/UPDATE RECORD ausgeführt wurde, zeigt dieser auf den aktuellen Datensatz. Nun kann anhand des aktuellen Zeigers auf den vorhergehenden oder den nächsten Datensatz zugegriffen werden. Außerdem besteht die Möglichkeit auf den ersten und letzten Datensatz zuzugreifen. Dabei wird der Zeiger immer auf den aktuellen Datensatz umgesetzt. Auf den ersten Datensatz kann aber nur direkt über die absolute Nummer des Datensatzes zugegriffen werden.
| READ RECORD = 'B2' | |
|---|---|
| Parameter: | Nummer des zu lesenden Records oder Modus (erster, letzter, nächster, vorhergehender Datensatz) |
| Antwort: | gelesene Daten aus der Datei, Returncode |
| WRITE RECORD = 'D2' | |
|---|---|
| Parameter: | zu schreibender Record, Nummer des zu lesenden Records oder Modus (erster, letzter, nächster, vorhergehender Datensatz) |
| Antwort: | Returncode |
| UPDATE RECORD = 'DC' | |
|---|---|
| Parameter: | zu schreibender Record, Nummer des zu lesenden Records oder Modus (erster, letzter, nächster, vorhergehender Datensatz) |
| Antwort: | Returncode |
Es existiert eine Reihe von Befehlen mit denen Dateiinhalte nicht nur durch bloßes Schreiben verändert werden können. Die beiden Hauptvertreter dieser Klasse sind die Befehle INCREASE und DECREASE. Sie erhöhen bzw. verringern den als Zähler aufgebauten Dateiinhalt um einen zu übergebenden Wert.
| INCREASE = '32' | |
|---|---|
| Parameter: | zu addierender Wert |
| Antwort: | neuer Wert, Returncode |
| DECREASE = '30' | |
|---|---|
| Parameter: | zu subtrahierender Wert |
| Antwort: | neuer Wert, Returncode |
Ein Befehl der gewissermaßen auch eine Operation auf einer Datei ausführt, ist der Befehl EXECUTE. Mit ihm kann ein ablauffähiges Programm gestartet werden. Dieses Programm ist vom Hersteller für eine individuelle Anwendung geschrieben und kann bei seinem Ablauf sowohl Daten vom Terminal, als auch erzeugte Daten zum Terminal senden.
Dieser Befehl ist äußerst umstritten, weil damit unter Umständen das gesamte Sicherheitssystem einer Chipkarte umgangen werden kann.
| EXECUTE = 'AE' | |
|---|---|
| Parameter: | der executable-Datei zu übergebende Daten |
| Antwort: | von der executable-Datei zurückerhaltene Daten, Returncode |
Neben der Verwendung von Chipkarten als geschützten Datenträgern nutzt man sie auch zur Identifizierung von Personen. Das dazu übliche Verfahren ist die Identifizierung durch Abfrage eines Geheimnisses vom Benutzer, wie zum Beispiel der PIN. Bei manchen Anwendungen ist die PIN auf der Chipkarte gespeichert. Die Abkürzung PIN nennt man im Bereich der Telekommunikation oft auch CHV. Um eine PIN zu überprüfen, gibt es den Befehl VERIFY CHV. Da es in vielen Chipkarten möglich ist mehrere Anwendungen und damit unterschiedliche PINs zu speichern, sind die PINs durchnumeriert.
| VERIFY CHV = '20' | |
|---|---|
| Parameter: | PIN, Nummer der PIN |
| Antwort: | Returncode |
Seit Einführung von PINs als Identifizierungsmerkmal für Kartenbenutzer nimmt deren Anzahl immer mehr zu. Im Durchschnitt müßte sich jeder Mensch in Deutschland sechs verschiedene PINs für seine diversen Karten merken. Die Verwendung von Chipkarten ermöglicht es dem Benutzer seine PIN frei auszuwählen und eine einheitliche PIN für alle seine Karten zu verwenden.
| CHANGE CHV = '24' | |
|---|---|
| Parameter: | alte PIN, neue PIN, Nummer der PIN |
| Antwort: | Returncode |
Zusätzlich zur Identifizierung des Kartenbesitzers existieren noch eine Reihe von Befehlen zur Authentisierung von Terminal und Chipkarte. Zur Authentisierung sollten aus Sicherheitsgründen nur kartenindividuelle Schlüssel verwendet werden. Die Erzeugung dieser Schlüssel kann auf der Grundlage eines einzigartigen Merkmals der Chipkarte erfolgen. Eine Serien- oder Fabrikationsnummer der Chipkarte eignet sich sehr gut dafür. Momentan gibt es für diesen Befehl noch keine Norm, er ist hier als GET CHIP NUMBER aufgeführt. Dieser Name ist von Betriebssystem zu Betriebssystem unterschiedlich, aber die Funktionalität ist die gleiche.
| GET CHIP NUMBER | |
|---|---|
| Parameter: | --- |
| Antwort: | Chipnummer, Returncode |
Es ist noch ein weiterer Befehl für eine Authentisierung notwendig. GET CHALLENGE wird benutzt, um eine Zufallszahl von der Chipkarte anzufordern.
| GET CHALLENGE = '84' | |
|---|---|
| Parameter: | --- |
| Antwort: | Zufallszahl, Returncode |
Es sind zwei unterschiedliche Befehle für die einseitige Authentisierung vorgesehen. Der Befehl INTERNAL AUTHENTICATE fungiert zur Authentisierung der Karte durch das Terminal, wogegen EXTERNAL AUTHENTICATE ein Terminal gegenüber einer Chipkarte authentisiert.
Für eine gegenseitige Authentisierung gibt es den Befehl MUTUAL AUTHENTICATE. Er ist bisher in keiner spezifischen Norm verankert, jedoch für die nahe Zukunft vorgesehen.
| INTERNAL AUTHENTICATE = '88' | |
|---|---|
| Parameter: | Zufallszahl, Nummer des zu verwendenden Schlüssels |
| Antwort: | Schlüsseltext, Returncode |
| EXTERNAL AUTHENTICATE= '82' | |
|---|---|
| Parameter: | Schlüsseltext, Nummer des zu verwendenden Schlüssels |
| Antwort: | Returncode |
| MUTUAL AUTHENTICATE | |
|---|---|
| Parameter: | 1. Schlüsseltext, Nummer des zu verwendenden Schlüssels |
| Antwort: | 2. Schlüsseltext, Returncode |