So schreiben Sie ein Java Card-Applet: Ein Entwicklerhandbuch
Dieser Artikel führt Sie durch den Prozess des Erstellens eines einfachen Applets für elektronische Brieftaschen und enthält Anweisungen zum Erstellen eines Applets und zum Erstellen seines Codes. Wenn Sie eine Auffrischung der Grundlagen der Java Card-Technologie benötigen, wenden Sie sich an den Java-Entwickler vom März 1998Die Spalte "Grundlegendes zu Java Card 2.0" bietet einen Überblick über Smartcards und beschreibt die Systemarchitektur, die APIs und die Laufzeitumgebung der Java Card-Technologie. Aus Gründen der Konsistenz verwendet dieser Artikel dasselbe Wallet-Applet-Beispiel wie in der Spalte vom März 1998. Das in diesem Artikel verwendete Wallet-Applet wurde jedoch aktualisiert, um Änderungen an den APIs in Java Card 2.1 widerzuspiegeln. Während der vorherige Artikel als allgemeine Einführung in die Java Card-Technologie diente, konzentriert sich dieser Artikel auf das Schreiben von Applets für Java Card 2.1.
Grundlagen der Java-Karte |
Für den Zweck dieses Artikels wird der Begriff Java-Karte bezeichnet eine Smartcard mit Java Card-Technologie. Mit der Java Card-Technologie können in Java geschriebene Applets auf einer Smartcard ausgeführt werden. Es definiert a Java Card Runtime-Umgebung (JCRE) und bietet Klassen und Methoden um Entwicklern beim Erstellen von Applets zu helfen. Applets werden innerhalb der JCRE ausgeführt. Die JCRE und APIs werden nach der Smartcard-Spezifikation modelliert ISO 7816 . Wenn eine Java-Karte in ein Kartenakzeptanzgerät (CAD) eingesetzt wird, wählt der CAD ein Applet auf der Karte aus und sendet ihm eine Reihe von Befehlen zur Ausführung. Jedes Applet wird anhand seiner Anwendungskennung (AID) identifiziert und ausgewählt . Befehle wie der Auswahlbefehl werden formatiert und in Form von Anwendungsprotokolldateneinheiten (APDUs) übertragen. Applets antworten auf jeden APDU-Befehl mit einem Statuswort (SW), das das Ergebnis der Operation angibt. Ein Applet kann optional auf einen APDU-Befehl mit anderen Daten antworten. |
Architekt das Applet
Wie bei jeder Entwicklung von Softwareanwendungen sollten Sie zunächst eine Entwurfsphase durchlaufen, bevor Sie sich hinsetzen und ein Java Card-Applet schreiben . In dieser Phase definieren Sie die Architektur des Applets.
Vier Schritte umfassen die Applet-Entwurfsphase:
- Geben Sie die Funktionen des Applets an
- Fordern Sie AIDs an und weisen Sie sie sowohl dem Applet als auch dem Paket zu, das die Applet-Klasse enthält
- Entwerfen Sie die Klassenstruktur der Applet-Programme
- Definieren Sie die Schnittstelle zwischen dem Applet und der Terminalanwendung
In den folgenden Abschnitten verwenden wir das Beispiel eines Brieftaschen-Applets, um einen detaillierten Überblick über die einzelnen Schritte im Applet-Design-Prozess zu erhalten.
Festlegen der Funktionen des Applets
Unser Beispiel-Brieftaschen-Applet speichert elektronisches Geld und unterstützt Kredit-, Debit- und Scheckausgleichsfunktionen.
Um die unbefugte Verwendung der Karte zu verhindern, enthält sie einen Sicherheitsalgorithmus. Bei diesem Algorithmus muss der Benutzer eine PIN eingeben, die aus höchstens acht Ziffern besteht. Der Kartenbenutzer gibt seine PIN über eine mit dem CAD verbundene Tastatur ein. Der Sicherheitsalgorithmus bewirkt, dass die Karte nach drei erfolglosen Versuchen, die PIN einzugeben, gesperrt wird. Die PIN wird gemäß den Installationsparametern initialisiert, wenn das Applet installiert und erstellt wird.
Die PIN muss überprüft werden, bevor eine Kredit- oder Lastschrifttransaktion ausgeführt werden kann.
Nehmen wir zur Vereinfachung an, das maximale Guthaben der Karte beträgt 2.767 und keine Kredit- oder Debittransaktion darf 27 überschreiten. Somit sind Java-Variablen vom Typ short
und byte
können das Brieftaschenguthaben bzw. den Betrag jeder Transaktion darstellen.
* Ein echtes Brieftaschen-Applet würde einen viel ausgefeilteren Sicherheitsmechanismus erfordern, um den unbefugten Zugriff auf die Brieftasche zu verhindern.
Angeben von AIDs
Die meisten Anwendungen, mit denen Sie vertraut sind, werden durch einen Zeichenfolgennamen benannt und identifiziert. In der Java Card-Technologie wird jedoch jedes Applet durch eine AID identifiziert und ausgewählt. Außerdem wird jedem Java-Paket eine AID zugewiesen. Dies liegt daran, dass ein Paket beim Laden auf eine Karte mit anderen Paketen verknüpft ist, die bereits über ihre AIDs auf der Karte platziert wurden. Diese Namenskonvention entspricht der Smartcard-Spezifikation gemäß ISO 7816.
Eine AID ist eine Folge von Bytes mit einer Länge zwischen 5 und 16 Bytes. Sein Format ist in Tabelle 1 dargestellt.
Anwendungskennung (AID) | |
Nationaler registrierter Anwendungsanbieter (RID) |
Proprietary Application Identifier Extension (PIX) |
5 Bytes |
0 bis 11 Bytes |
ISO kontrolliert die Zuordnung von RIDs zu Unternehmen, wobei jedes Unternehmen sein eigenes eindeutiges RID von der ISO erhält. Unternehmen verwalten die Zuweisung von PIXs für AIDs.
Die Java-Klassen des Wallet-Applets werden in einem Java-Paket definiert. Die fiktiven AIDs für das Brieftaschen-Applet und das Applet-Paket sind wie in Tabelle 2 dargestellt definiert.
Pakethilfe | ||
Feld | Wert | Länge |
LOSWERDEN | 0xF2, 0x34, 0x12, 0x34, 0x56 | 5 Bytes |
PIX | 0x10, 0x00, 0x00 | 3 Bytes |
Applet AID | ||
Feld | Wert | Länge |
LOSWERDEN | 0xF2, 0x34, 0x12, 0x34, 0x56 | 5 Bytes |
PIX | 0x10, 0x00, 0x01 | 3 Bytes |
Die Paket-AID und die Applet-AID haben denselben RID-Wert. Ihre PIX-Werte unterscheiden sich beim letzten Bit.
Definieren der Klassenstruktur und der Methodenfunktionen des Applets
Eine Java Card-Applet-Klasse muss sich von der javacard.framework.Applet
Klasse erstrecken. Diese Klasse ist die Oberklasse für alle Applets, die sich auf einer Java-Karte befinden. Es definiert die allgemeinen Methoden, die ein Applet unterstützen muss, um während seiner Lebensdauer mit der JCRE zu interagieren.
In Tabelle 3 sind die in der Klasse definierten öffentlichen und geschützten Methoden aufgeführt javacard.framework.Applet
:
Methodenübersicht | |
|
Wird von der JCRE aufgerufen, um das aktuell ausgewählte Applet darüber zu informieren, dass ein anderes (oder dasselbe) Applet ausgewählt wird. |
public Shareable |
Wird von der JCRE aufgerufen, um im Auftrag einer Anforderung von einem Client-Applet ein gemeinsam nutzbares Schnittstellenobjekt von diesem Server-Applet abzurufen. |
public static void |
Die JCRE ruft diese statische Methode auf, um eine Instanz der Applet Unterklasse zu erstellen . |
public abstract void |
Wird von der JCRE aufgerufen, um einen eingehenden APDU-Befehl zu verarbeiten. |
protected final void |
Diese Methode wird vom Applet verwendet, um diese Applet-Instanz bei der JCRE zu registrieren und der Applet-Instanz die Standard-AID in der CAD-Datei zuzuweisen. |
protected final void |
Diese Methode wird vom Applet verwendet, um diese Applet-Instanz bei der JCRE zu registrieren und der Applet-Instanz die angegebene AID im Array zuzuweisen bArray . |
public boolean |
Wird von der JCRE aufgerufen, um dieses Applet darüber zu informieren, dass es ausgewählt wurde. |
protected final boolean |
Diese Methode wird vom Applet verwendet
Methode zur Unterscheidung der
Befehl, der dieses Applet aus allen anderen ausgewählt hat
APDU-Befehle, die sich auf die Auswahl des Datei- oder internen Applet-Status beziehen können. |
Die Klasse javacard.framework.Applet
bietet ein Framework für die Applet-Ausführung. In dieser Klasse definierte Methoden werden von der JCRE aufgerufen, wenn die JCRE APDU-Befehle vom CAD empfängt.
Nachdem der Applet-Code ordnungsgemäß auf eine Java-Karte geladen und mit anderen Paketen auf der Karte verknüpft wurde, beginnt die Lebensdauer eines Applets, wenn eine Applet-Instanz erstellt und in der Registrierungstabelle des JCRE registriert wird. Ein Applet muss die statische Methode implementieren install()
, um eine Applet-Instanz zu erstellen und die Instanz bei der JCRE zu registrieren, indem eine der beiden register()
Methoden aufgerufen wird . Die install()
Methode verwendet ein Byte-Array als Parameter. Dieses Array enthält die Installationsparameter zum Initialisieren oder Personalisieren der Applet-Instanz.
Ein Applet auf einer Java-Karte befindet sich in einer inaktiven Phase, bis es explizit ausgewählt wird. Wenn die JCRE einen SELECT
APDU-Befehl empfängt , durchsucht sie ihre interne Tabelle nach dem Applet, dessen AID mit der im Befehl angegebenen übereinstimmt. Wenn eine Übereinstimmung gefunden wird, bereitet die JCRE das neue Applet zur Auswahl vor. Dieser Vorbereitungsprozess besteht aus zwei Schritten: Erstens, wenn ein aktuell ausgewähltes Applet vorhanden ist, hebt die JCRE die Auswahl auf, indem sie die deselect()
Methode aufruft . Das Applet führt alle Bereinigungs- oder Buchhaltungsarbeiten in der deselect()
Methode durch, bevor es in die inaktive Phase übergeht. Anschließend ruft die JCRE die select()
Methode auf, um das neue Applet darüber zu informieren, dass es ausgewählt wurde. Das neue Applet führt alle erforderlichen Initialisierungen durch, bevor es tatsächlich ausgewählt wird. Das Applet kehrt true
zum zurückselect()
Methode, wenn es jetzt bereit ist, aktiv zu werden und nachfolgende APDU-Befehle zu verarbeiten. Andernfalls kehrt das Applet zurück, false
um seine Teilnahme abzulehnen. In diesem Fall wird kein Applet ausgewählt. Die javacard.framework.Applet
Klasse bietet eine Standardimplementierung für die Methoden select()
und deselect()
. Eine Unterklasse der Applet
Klasse kann diese beiden Methoden überschreiben, um das Verhalten des Applets während der Auswahl und Abwahl zu definieren.
Sobald ein Applet ausgewählt ist, leitet die JCRE alle nachfolgenden APDU-Befehle (einschließlich des SELECT
Befehls) an die Applet- process()
Methode weiter. In der process()
Methode interpretiert das Applet jeden APDU-Befehl und führt die durch den Befehl angegebene Aufgabe aus. Für jede Befehls-APDU antwortet das Applet auf den CAD, indem es eine Antwort-APDU zurücksendet, die den CAD über das Ergebnis der Verarbeitung der Befehls-APDU informiert. Die process()
Methode in der Klasse javacard.framework.Applet
ist eine abstrakte Methode: Eine Unterklasse der Applet
Klasse muss diese Methode überschreiben, um die Funktionen eines Applets zu implementieren.
Dieser Befehls- und Antwortdialog wird fortgesetzt, bis ein neues Applet ausgewählt oder die Karte aus dem CAD entfernt wird. Wenn die Auswahl aufgehoben wird, wird ein Applet bis zur nächsten Auswahl inaktiv.
Das getShareableInterfaceObject
Verfahren ist für die Interapplet-Kommunikation vorgesehen. Es wird von einem Client-Applet aufgerufen, um ein gemeinsam nutzbares Schnittstellenobjekt vom Server-Applet anzufordern. Die Standardimplementierung dieser Methode gibt null zurück. Leider würde eine ausführliche Erörterung der Objektfreigabe und der Interapplet-Kommunikation den Rahmen dieses Artikels sprengen.
Da der SELECT
APDU-Befehl auch an die process()
Methode weitergeleitet wird, wird die selectingApplet()
Methode von der Applet- process()
Methode verwendet, um den SELECT
APDU-Befehl, der dieses Applet auswählt, von allen anderen SELECT
APDU-Befehlen zu unterscheiden, die sich auf die Auswahl des Datei- oder internen Applet-Status beziehen können.
Definieren der Schnittstelle zwischen einem Applet und seiner Terminalanwendung
Ein Applet, das auf einer Smartcard ausgeführt wird, kommuniziert mit der Terminalanwendung am CAD über Anwendungsprotokolldateneinheiten. Im Wesentlichen besteht die Schnittstelle zwischen einem Applet und seiner Terminalanwendung aus einer Reihe von APDU-Befehlen, die sowohl vom Applet als auch von der Terminalanwendung vereinbart und unterstützt werden.
Ein APDU-Primer
Dieser Abschnitt enthält eine Zusammenfassung der APDU-Befehle, mit denen Sie beginnen können, APDU-Befehle für das Wallet-Applet zu definieren. (Die Details des APDU-Protokolls sind in ISO 7816 angegeben.)
APDU-Befehle sind immer Sätze von Paaren. Jedes Paar enthält eine Befehls-APDU, die einen Befehl angibt, und eine Antwort-APDU, die das Ausführungsergebnis des Befehls zurücksendet. In der Kartenwelt sind Smartcards reaktive Kommunikatoren - das heißt, sie initiieren niemals Kommunikation, sie reagieren nur auf APDUs von außen. Die Terminalanwendung sendet einen Befehl APDU über den CAD. Die JCRE empfängt den Befehl und wählt entweder ein neues Applet aus oder übergibt den Befehl an das aktuell ausgewählte Applet. Das aktuell ausgewählte Applet verarbeitet den Befehl und gibt eine Antwort-APDU an die Terminalanwendung zurück. Befehls-APDUs und Antwort-APDUs werden abwechselnd zwischen einer Karte und einem CAD ausgetauscht.
Tabelle 4 beschreibt die Befehls- und Antwort-APDU-Formate.
Befehl APDU |
||||||
Mandatory header | Optional body | |||||
CLA | INS | P1 | P2 | Lc | Data field | Le |
|
||||||
Response APDU |
||||||
Optional body | Mandatory trailer | |||||
Data field | SW1 | SW2 | ||||
|
Defining APDU commands
A Java Card applet should support a set of APDU commands, comprising a SELECT
APDU command and one or more process APDU commands.
- The
SELECT
command instructs the JCRE to select the applet on the card. - The set of process commands defines the commands the applet supports. These are defined in accordance with the functions of the applet.
Java Card technology specifies the encoding of the SELECT
APDU command. Applet developers are free to define the encoding of their process commands. However, process commands must comply with the structure outlined above.
Structurally, the SELECT
command and process commands are pairs of command and response APDUs.
Für jede Befehls-APDU sollte das Applet zuerst den Wert jedes Felds im Befehl dekodieren. Wenn die optionalen Datenfelder enthalten sind, sollte das Applet auch deren Format und Struktur bestimmen. Mit diesen Definitionen kann das Applet jeden Befehl interpretieren und die Daten lesen. Es kann dann die durch den Befehl angegebene Aufgabe ausführen.