Programování

Jak napsat applet Java Card: Příručka pro vývojáře

Tento článek vás provede procesem vytváření jednoduchého appletu elektronické peněženky a poskytne pokyny pro sestavení appletu a konstrukci jeho kódu. Pokud potřebujete osvěžení základů technologie Java Card, přečtěte si březen 1998 Java Developer sloupec „Porozumění kartě Java Card 2.0“, který poskytuje přehled čipových karet a popisuje architekturu systému, rozhraní API a běhové prostředí technologie Java Card. Z důvodu konzistence používá tento článek stejný příklad appletu peněženky, jaký byl použit ve sloupci z března 1998. Aplet peněženky, který v tomto článku použijeme, byl však aktualizován, aby odrážel změny API v Java Card 2.1. Zatímco předchozí článek sloužil jako celkový úvod do technologie Java Card, tento článek se zaměřuje na psaní appletů pro Java Card 2.1.

Základy Java Card

Pro účely tohoto článku termín

Java karta

označuje čipovou kartu s technologií Java Card. Technologie Java Card umožňuje provádění appletů napsaných v jazyce Java na čipové kartě. Definuje a

Runtime prostředí Java Card

(JCRE) a poskytuje

třídy a metody

pomoci vývojářům vytvářet applety. Applety běží v rámci JCRE. JCRE a API jsou modelovány podle specifikace čipové karty

ISO 7816

.

Když je karta Java vložena do a zařízení pro přijímání karet (CAD), CAD vybere applet na kartě a odešle mu řadu příkazů k provedení. Každý applet je identifikován a vybrán podle svého identifikátor aplikace (POMOC). Příkazy, jako je příkaz pro výběr, jsou formátovány a přenášeny ve formě datové jednotky aplikačního protokolu (APDU). Applety odpoví na každý příkaz APDU pomocí a stavové slovo (SW), který označuje výsledek operace. Applet může volitelně odpovědět na příkaz APDU s dalšími daty.

Vytvořte applet

Stejně jako u každého vývoje softwarových aplikací byste měli nejprve projít a. Než si sednete a zapíšete applet Java Card, nejprve projděte a fáze návrhu. V této fázi definujete architekturu appletu.

Fáze návrhu appletu zahrnuje čtyři kroky:

  1. Určete funkce appletu
  2. Vyžádejte si a přiřaďte AID k appletu i balíčku obsahujícímu třídu appletů
  3. Navrhněte strukturu tříd appletových programů
  4. Definujte rozhraní mezi appletem a terminálovou aplikací

V následujících částech použijeme příklad appletu peněženky, abychom se podrobně podívali na každý z kroků v procesu návrhu appletu.

Specifikace funkcí appletu

Náš příklad appletu peněženky bude ukládat elektronické peníze a podporovat funkce kreditu, debetu a šeku.

Aby se zabránilo neoprávněnému použití karty, obsahuje bezpečnostní algoritmus. Tento algoritmus vyžaduje, aby uživatel zadal PIN, maximálně osmimístný řetězec. Uživatel karty zadá svůj PIN na klávesnici připojené k CAD. Bezpečnostní algoritmus způsobí zablokování karty po třech neúspěšných pokusech o zadání PIN. PIN je inicializován podle parametrů instalace při instalaci a vytvoření appletu.

Před provedením jakékoli kreditní nebo debetní transakce je nutné ověřit PIN.

Pro jednoduchost řekněme, že maximální zůstatek karty je 2 767, a že žádná kreditní nebo debetní transakce nesmí překročit 27. Tudíž proměnné Java typu krátký a byte může představovat zůstatek peněženky a částku každé transakce.

* Aplet peněženky v reálném světě by vyžadoval mnohem propracovanější bezpečnostní mechanismus, aby se zabránilo neoprávněnému přístupu do peněženky.

Specifikace AID

Většina aplikací, které znáte, je pojmenována a identifikována názvem řetězce. V technologii Java Card je však každý applet identifikován a vybrán pomocí AID. Každému balíčku Java je také přiřazen AID. Důvodem je, že balíček je po načtení na kartu propojen s jinými balíčky, které již byly na kartu umístěny prostřednictvím svých AID. Tato konvence pojmenování odpovídá specifikaci čipové karty definované v ISO 7816.

AID je posloupnost bajtů o délce mezi 5 a 16 bajty. Jeho formát je uveden v tabulce 1.

Identifikátor aplikace (AID)

Národní registrovaný poskytovatel aplikace (RID)

Proprietární rozšíření identifikátoru aplikace (PIX)

5 bajtů

0 až 11 bajtů

Tabulka 1. Formát AID

ISO řídí přidělování RID společnostem, přičemž každá společnost získává svůj vlastní jedinečný RID od ISO. Společnosti spravují přiřazování PIX pro AID.

Třídy Java appletu peněženky jsou definovány v balíčku Java. Fiktivní AID pro applet peněženky a balíček appletů jsou definovány, jak je znázorněno v tabulce 2.

Balíček AID
PoleHodnotaDélka
ZBAVIT0xF2, 0x34, 0x12, 0x34, 0x565 bajtů
PIX0x10, 0x00, 0x003 bajty
Applet AID
PoleHodnotaDélka
ZBAVIT0xF2, 0x34, 0x12, 0x34, 0x565 bajtů
PIX0x10, 0x00, 0x013 bajty
Tabulka 2. Fiktivní AID pro applet peněženky a balíček appletů

AID balíčku a AID appletu mají stejnou hodnotu RID; jejich hodnoty PIX se liší na posledním bitu.

Definování struktury třídy a metod metod appletu

Třída appletu Java Card musí vycházet z javacard.framework.Applet třída. Tato třída je nadtřídou pro všechny applety umístěné na kartě Java Card. Definuje běžné metody, které musí applet podporovat, aby mohl komunikovat s JCRE během jeho životnosti.

Tabulka 3 uvádí veřejné a chráněné metody definované ve třídě javacard.framework.Applet:

Shrnutí metody

zrušit výběr ()

Vyvoláno JCRE, aby informovalo aktuálně vybraný applet, že bude vybrán jiný (nebo stejný) applet.
veřejné sdílení

getShareableInterfaceObject (AID klient AID, byte parametr)

Volá se JCRE k získání sdíleného objektu rozhraní z tohoto appletu serveru jménem požadavku z klientského appletu.
veřejná statická neplatnost

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

JCRE volá tuto statickou metodu k vytvoření instance Applet podtřída.
veřejná abstraktní neplatnost

proces (APDU apdu)

Vyvoláno JCRE ke zpracování příchozího příkazu APDU.

chráněná konečná neplatnost

Registrovat ()

Tuto metodu používá applet k registraci této instance appletu u JCRE a k přiřazení výchozího AID v souboru CAD instanci appletu.

chráněná konečná neplatnost

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

Tuto metodu používá applet k registraci této instance appletu s JCRE a k přiřazení zadaného AID v poli bArray do instance appletu.
veřejná logická hodnota

vyberte ()

Zavolá JCRE, aby informoval tento applet, že byl vybrán.

chráněný poslední booleovský

výběr aplikace ()

Tuto metodu používá applet

proces()

metoda pro rozlišení

VYBERTE APDU

příkaz, který vybral tento applet ze všech ostatních

VYBERTE APDU

Příkazy APDU, které se mohou vztahovat k výběru stavu souboru nebo interního appletu.

Tabulka 3. Veřejné a chráněné metody definované ve třídě javacard.framework.Applet

Třída javacard.framework.Applet poskytuje rámec pro provádění appletu. Metody definované v této třídě volá JCRE, když JCRE přijímá příkazy APDU z CAD.

Poté, co byl kód appletu správně načten na kartu Java Card a propojen s dalšími balíčky na kartě, začne život appletu, když je vytvořena instance appletu a zaregistrována v tabulce registru JCRE. Applet musí implementovat statickou metodu Nainstalujte() vytvořit instanci appletu a zaregistrovat instanci u JCRE vyvoláním jedné ze dvou Registrovat() metody. The Nainstalujte()metoda bere bajtové pole jako parametr. Toto pole obsahuje instalační parametry pro inicializaci nebo přizpůsobení instance appletu.

Applet na kartě Java Card je v neaktivní fázi, dokud není výslovně vybrán. Když JCRE obdrží a VYBRAT Příkaz APDU prohledá interní tabulku appletu, jehož AID se shoduje s identifikátorem uvedeným v příkazu. Pokud je nalezena shoda, připraví JCRE nový applet k výběru. Tento proces přípravy se skládá ze dvou kroků: Nejprve, pokud je přítomen aktuálně vybraný applet, JCRE jej zruší vyvoláním zrušit výběr () metoda. Applet provádí jakékoli úklidové nebo účetní práce v zrušit výběr () před přechodem do neaktivní fáze. Poté JCRE vyvolá vybrat() způsob informování nového appletu, že byl vybrán. Nový applet provede veškerou potřebnou inicializaci, než bude skutečně vybrán. Applet se vrátí skutečný do vybrat() metoda, pokud je nyní připravena k aktivaci a zpracování dalších příkazů APDU. Jinak se applet vrátí Nepravdivé odmítnout jeho účast, a pokud ano, nebude vybrán žádný applet. The javacard.framework.Applet třída poskytuje výchozí implementaci pro obě vybrat() a zrušit výběr () metody. Podtřída Applet Třída může přepsat tyto dvě metody a definovat chování appletu během výběru a zrušení výběru.

Jakmile je vybrán applet, předá JCRE všechny následující příkazy APDU (včetně VYBRAT příkaz) do appletu proces() metoda. V proces() Metoda, applet interpretuje každý příkaz APDU a provádí úkol určený příkazem. Pro každý příkaz APDU reaguje applet na CAD zasláním zpět odpovědi APDU, která informuje CAD o výsledku zpracování příkazu APDU. The proces() metoda ve třídě javacard.framework.Applet je abstraktní metoda: podtřída Applet třída musí tuto metodu přepsat, aby implementovala funkce appletu.

Tento dialog na příkaz a odpověď pokračuje, dokud není vybrán nový applet nebo karta je odstraněna z CAD. Když je výběr zrušen, applet bude neaktivní až do příštího výběru.

The getShareableInterfaceObject metoda je určena pro interappletovou komunikaci. Je vyvolán klientským appletem, aby si vyžádal objekt sdíleného rozhraní z appletu serveru. Výchozí implementace této metody vrací null. Bohužel podrobná diskuse o sdílení objektů a komunikaci mezi aplikacemi by byla nad rámec tohoto článku.

Protože VYBRAT Příkaz APDU je také předán do proces() metoda, výběr aplikace () metodu používají applety proces() metoda pro rozlišení VYBRAT Příkaz APDU vybírá tento applet ze všech ostatních VYBRAT Příkazy APDU, které se mohou vztahovat k výběru stavu souboru nebo interního appletu.

Definování rozhraní mezi appletem a jeho terminálovou aplikací

Applet běžící na čipové kartě komunikuje s terminálovou aplikací na CAD pomocí datových jednotek aplikačního protokolu. V podstatě je rozhraní mezi appletem a jeho terminálovou aplikací sada příkazů APDU, které jsou dohodnuty a podporovány jak appletem, tak terminálovou aplikací.

APDU primer

Tato část poskytuje souhrn příkazů APDU, abyste mohli začít definovat příkazy APDU pro applet peněženky. (Podrobnosti protokolu APDU jsou specifikovány v ISO 7816.)

Příkazy APDU jsou vždy sady párů. Každý pár obsahuje a příkaz APDU, který určuje příkaz, a odpověď APDU, který pošle zpět výsledek provedení příkazu. Ve světě karet jsou čipové karty reaktivní komunikátoři - to znamená, že nikdy neiniciují komunikaci, reagují pouze na APDU z vnějšího světa. Terminálová aplikace odesílá příkaz APDU prostřednictvím CAD. JCRE přijme příkaz a buď vybere nový applet, nebo předá příkaz aktuálně vybranému appletu. Aktuálně vybraný applet zpracuje příkaz a vrátí odpověď APDU do aplikace terminálu. Příkazové APDU a odezvové APDU se vyměňují střídavě mezi kartou a CAD.

Tabulka 4 popisuje formáty APDU příkazů a odpovědí.

Příkaz APDU

Povinná hlavičkaVolitelné tělo
CLAINSP1P2LcDatové poleLe
  • CLA (1 byte): Class of instruction --- indicates the structure and format for a category of command and response APDUs
  • INS (1 bajt): Kód instrukce: specifikuje instrukci příkazu
  • P1 (1 bajt) a P2 (1 bajt): Parametry instrukce - dále poskytují kvalifikaci instrukce
  • Lc (1 bajt): Počet bajtů v datovém poli příkazu
  • Datové pole (bajty rovnající se hodnotě Lc): Posloupnost bajtů v datovém poli příkazu
  • Le (1 bajt): Maximum očekávaných bajtů v datovém poli odpovědi na příkaz

Odpověď APDU

Volitelné těloPovinný přívěs
Datové poleSW1SW2
  • Datové pole (proměnná délka): Posloupnost bajtů přijatých v datovém poli odpovědi
  • SW1 (1 bajt) a SW2 (1 bajt): Stavová slova - označují stav zpracování na kartě
Tabulka 4. Formáty APDU příkazů a odpovědí

Definování příkazů APDU

Applet Java Card by měl podporovat sadu příkazů APDU zahrnující a VYBRAT Příkaz APDU a jeden nebo více procesních příkazů APDU.

  • The VYBRAT příkaz dá JCRE vybrat applet na kartě.
  • Sada procesních příkazů definuje příkazy, které applet podporuje. Ty jsou definovány v souladu s funkcemi appletu.

Technologie Java Card specifikuje kódování VYBRAT Příkaz APDU. Vývojáři appletů mohou volně definovat kódování svých procesních příkazů. Příkazy procesu však musí vyhovovat struktuře uvedené výše.

Strukturálně VYBRAT příkazové a procesní příkazy jsou páry APDU příkazů a odpovědí.

U každého příkazu APDU by měl applet nejdříve dekódovat hodnotu každého pole v příkazu. Pokud jsou zahrnuta volitelná datová pole, měl by applet také určit jejich formát a strukturu. Pomocí těchto definic applet ví, jak interpretovat každý příkaz a číst data. Poté může provést úkol určený příkazem.

$config[zx-auto] not found$config[zx-overlay] not found