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:

  1. Geben Sie die Funktionen des Applets an
  2. Fordern Sie AIDs an und weisen Sie sie sowohl dem Applet als auch dem Paket zu, das die Applet-Klasse enthält
  3. Entwerfen Sie die Klassenstruktur der Applet-Programme
  4. 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 shortund bytekö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

Tabelle 1. AID-Format

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
Tabelle 2. Fiktive AIDs für das Brieftaschen-Applet und das Applet-Paket

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

deselect ()

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

getShareableInterfaceObject (AID client AID, byte parameter)

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

install (byte[] bArray, short bOffset, byte bLength)

Die JCRE ruft diese statische Methode auf, um eine Instanz der AppletUnterklasse zu erstellen .
public abstract void

process (APDU apdu)

Wird von der JCRE aufgerufen, um einen eingehenden APDU-Befehl zu verarbeiten.

protected final void

register ()

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

register (byte[] bArray, short bOffset, byte bLength)

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

select ()

Wird von der JCRE aufgerufen, um dieses Applet darüber zu informieren, dass es ausgewählt wurde.

protected final boolean

selectingApplet ()

Diese Methode wird vom Applet verwendet

process()

Methode zur Unterscheidung der

SELECT APDU

Befehl, der dieses Applet aus allen anderen ausgewählt hat

SELECT APDU

APDU-Befehle, die sich auf die Auswahl des Datei- oder internen Applet-Status beziehen können.

Tabelle 3. Öffentliche und geschützte Methoden, die in der Klasse javacard.framework.Applet definiert sind

Die Klasse javacard.framework.Appletbietet 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 SELECTAPDU-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 truezum zurückselect()Methode, wenn es jetzt bereit ist, aktiv zu werden und nachfolgende APDU-Befehle zu verarbeiten. Andernfalls kehrt das Applet zurück, falseum seine Teilnahme abzulehnen. In diesem Fall wird kein Applet ausgewählt. Die javacard.framework.AppletKlasse bietet eine Standardimplementierung für die Methoden select()und deselect(). Eine Unterklasse der AppletKlasse 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 SELECTBefehls) 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.Appletist eine abstrakte Methode: Eine Unterklasse der AppletKlasse 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 getShareableInterfaceObjectVerfahren 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 SELECTAPDU-Befehl auch an die process()Methode weitergeleitet wird, wird die selectingApplet()Methode von der Applet- process()Methode verwendet, um den SELECTAPDU-Befehl, der dieses Applet auswählt, von allen anderen SELECTAPDU-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
  • CLA (1 byte): Class of instruction --- indicates the structure and format for a category of command and response APDUs
  • INS (1 byte): Instruction code: specifies the instruction of the command
  • P1 (1 byte) and P2 (1 byte): Instruction parameters -- further provide qualifications to the instruction
  • Lc (1 byte): Number of bytes present in the data field of the command
  • Data field (bytes equal to the value of Lc): A sequence of bytes in the data field of the command
  • Le (1 byte): Maximum of bytes expected in the data field of the response to the command

Response APDU

Optional body Mandatory trailer
Data field SW1 SW2
  • Data field (variable length): A sequence of bytes received in the data field of the response
  • SW1 (1 byte) and SW2 (1 byte): Status words -- denote the processing state in the card
Table 4. Command and response APDU formats

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.