Programavimas

Kaip parašyti „Java Card“ programėlę: kūrėjo vadovas

Šiame straipsnyje aprašoma paprasto elektroninės piniginės programėlės kūrimo procesas ir pateikiamos instrukcijos, kaip kurti programėlę ir susikurti jos kodą. Jei jums reikia atnaujinti „Java Card“ technologijos pagrindus, skaitykite 1998 m. Kovo mėn „Java“ kūrėjas stulpelis „Suprasti„ Java Card 2.0 ““, kuriame pateikiama intelektualiųjų kortelių apžvalga ir aprašoma sistemos architektūra, API ir „Java Card“ technologijos vykdymo aplinka. Siekiant nuoseklumo, šiame straipsnyje naudojamas tas pats piniginės programėlės pavyzdys, kuris buvo naudojamas 1998 m. Kovo mėn. Stulpelyje. Tačiau piniginės programėlė, kurią naudosime šiame straipsnyje, buvo atnaujinta, kad atspindėtų API pakeitimus „Java Card 2.1“. Be to, nors ankstesnis straipsnis buvo bendras „Java Card“ technologijos įvadas, šiame straipsnyje pagrindinis dėmesys skiriamas „Java Card 2.1“ programėlių rašymui.

„Java Card“ pagrindai

Šiame straipsnyje terminas

„Java“ kortelė

žymi „Java Card“ technologiją naudojančią intelektualiąją kortelę. „Java Card“ technologija leidžia programėlėse, parašytose „Java“, vykdyti lustinėje kortelėje. Tai apibrėžia a

„Java Card Runtime Environment“

(JCRE) ir teikia

klasės ir metodai

padėti kūrėjams kurti programėles. Appletai veikia JCRE. JCRE ir API modeliuojami pagal lustinės kortelės specifikaciją

ISO 7816

.

Kai „Java“ kortelė įdėta į a kortelės priėmimo įrenginys (CAD), CAD parenka programėlę kortelėje ir nusiunčia komandai vykdyti. Kiekvieną programėlę atpažįsta ir parenka pagal ją programos identifikatorius (PAGALBA). Tokios komandos kaip pasirinkimo komanda yra suformatuotos ir perduodamos programos protokolo duomenų vienetai (APDU). Appletai atsako į kiekvieną APDU komandą naudodami a būsenos žodis (SW), nurodantis operacijos rezultatą. Programėlė gali pasirinktinai atsakyti į APDU komandą su kitais duomenimis.

Architektuokite programėlę

Kaip ir bet kuriant programinės įrangos programas, prieš atsisėdant ir rašant „Java Card“ programėlę, pirmiausia turėtumėte pereiti a projektavimo etapas. Šiame etape apibrėžiate programėlės architektūrą.

Keturis žingsnius sudaro programėlės kūrimo etapas:

  1. Nurodykite programėlės funkcijas
  2. Paprašykite ir priskirkite AID programėlei ir paketui, kuriame yra programėlių klasė
  3. Sukurkite programėlių klasių struktūrą
  4. Apibrėžkite programėlės ir terminalo programos sąsają

Tolesniuose skyriuose naudosime piniginės programėlės pavyzdį, kad išsamiai apžvelgtume kiekvieną programėlės kūrimo proceso etapą.

Programėlės funkcijų nurodymas

Mūsų pavyzdinėje piniginės programėlėje bus saugomi elektroniniai pinigai ir palaikomos kredito, debeto ir čekio balanso funkcijos.

Kad būtų išvengta neteisėto kortelės naudojimo, joje yra saugos algoritmas. Šis algoritmas reikalauja, kad vartotojas įvestų PIN kodą, daugiausia aštuonių skaitmenų eilutę. Kortelės vartotojas įveda savo PIN kodą, prijungtą prie CAD klaviatūroje. Saugos algoritmas sukelia kortelės užraktą po trijų nesėkmingų bandymų įvesti PIN kodą. PIN yra inicijuojamas pagal diegimo parametrus, kai įdiegiama ir sukuriama programėlė.

PIN kodas turi būti patikrintas prieš vykdant bet kokią kredito ar debeto operaciją.

Paprastumo dėlei tarkime, kad didžiausias kortelės likutis yra 2767 ir kad jokia kredito ar debeto operacija negali viršyti 27. Taigi, „Java“ tipo kintamieji trumpas ir baitas gali atitinkamai atspindėti piniginės likutį ir kiekvienos operacijos sumą.

* Norint išvengti neteisėtos prieigos prie piniginės, realaus pasaulio piniginės programėlei reikės daug tobulesnio saugumo mechanizmo.

Nurodoma pagalba

Daugelis jums žinomų programų yra pavadintos ir identifikuojamos pagal eilutės pavadinimą. Taikant „Java Card“ technologiją, kiekvieną programėlę atpažįsta ir parenka AID. Taip pat kiekvienam „Java“ paketui priskiriamas AID. Taip yra todėl, kad paketas, įkeltas į kortelę, yra susietas su kitais paketais, kurie jau buvo įdėti į kortelę per jų AID. Ši vardų suteikimo tvarka atitinka intelektualiosios kortelės specifikaciją, kaip apibrėžta ISO 7816.

AID yra 5–16 baitų ilgio baitų seka. Jo formatas pavaizduotas 1 lentelėje.

Programos identifikatorius (AID)

Nacionalinis registruotų programų teikėjas (RID)

Nuosavos programos identifikatoriaus plėtinys (PIX)

5 baitai

Nuo 0 iki 11 baitų

1 lentelė. PAGALBOS formatas

ISO kontroliuoja RID priskyrimą įmonėms, kiekvienai įmonei įsigyjant savo unikalų RID iš ISO. Įmonės valdo PIX skyrimą pagalbai.

Piniginės programėlės „Java“ klasės yra apibrėžtos „Java“ pakete. Fiktyvūs piniginės programėlės ir programėlės paketo AID yra apibrėžti taip, kaip parodyta 2 lentelėje.

Paketo pagalba
LaukasVertėIlgis
RID0xF2, 0x34, 0x12, 0x34, 0x565 baitai
PIX0x10, 0x00, 0x003 baitai
Applet PAGALBA
LaukasVertėIlgis
RID0xF2, 0x34, 0x12, 0x34, 0x565 baitai
PIX0x10, 0x00, 0x013 baitai
2 lentelė. Fiktyvios piniginės programėlės ir programėlės paketo pagalba

AID paketo ir programėlės AID vertė yra ta pati; jų PIX reikšmės skiriasi paskutiniuoju bitu.

Apleto klasės struktūros ir metodo funkcijų apibrėžimas

„Java Card“ programėlių klasė turi prasidėti nuo javacard.framework.Applet klasė. Ši klasė yra visų „Java“ kortelėje esančių programėlių superklasė. Jis apibrėžia bendrus metodus, kuriuos programėlė turi palaikyti, kad galėtų sąveikauti su JCRE per visą jo gyvenimą.

3 lentelėje pateikiami klasėje apibrėžti viešieji ir saugomi metodai javacard.framework.Applet:

Metodo santrauka

panaikinti pasirinkimą ()

Paskambino JCRE, kad informuotų šiuo metu pasirinktą programėlę, kad bus pasirinkta kita (arba ta pati) programėlė.
viešai dalijamasi

getShareableInterfaceObject (AID kliento AID, baito parametras)

Paskambino JCRE, kad gautų bendrinamo sąsajos objektą iš šio serverio programėlės kliento programėlės užklausos vardu.
viešoji statinė tuštuma

diegti (baitas [] bArray, trumpas bOffset, baitas bLength)

JCRE vadina šį statinį metodą, kad sukurtumėte Applet poklasis.
viešas abstraktus niekinis

procesas (APDU apdu)

JCRE iškvietė apdoroti gaunamą APDU komandą.

saugoma galutinė negaliojimas

Registruotis ()

Šį metodą programėlė naudoja užregistruodama šį programėlių egzempliorių JCRE ir priskirdama numatytąjį AID CAD faile programėlių egzemplioriui.

saugoma galutinė negaliojimas

registruoti (baitas [] bArray, trumpas bofetas, baitas bLength)

Šį metodą programėlė naudoja registruodama šį programėlių egzempliorių JCRE ir priskirdama nurodytą AID masyve bArray į programėlių egzempliorių.
viešasis loginis

pasirinkti ()

Paskambino JCRE, kad informuotų šią programėlę, kad ji pasirinkta.

saugomas galutinis loginis

pasirinkdami „Applet“ ()

Šį metodą naudoja programėlė

procesas ()

metodas atskirti

PASIRINKITE APDU

komanda, pasirinkusi šią programėlę iš visų kitų

PASIRINKITE APDU

APDU komandos, kurios gali būti susijusios su failo ar vidinės programėlės būsenos pasirinkimu.

3 lentelė. Viešieji ir saugomi metodai, apibrėžti klasėje javacard.framework.Applet

Klasė javacard.framework.Applet pateikia programėlių vykdymo pagrindą. Šioje klasėje apibrėžtus metodus JCRE iškviečia, kai JCRE gauna APDU komandas iš CAD.

Kai programėlės kodas tinkamai įkeltas į „Java“ kortelę ir susietas su kitais kortelėje esančiais paketais, programėlės gyvenimas prasideda, kai sukuriama programėlių egzempliorius ir užregistruojama JCRE registro lentelėje. Programėlė turi įgyvendinti statinį metodą diegti() sukurti programėlių egzempliorių ir užregistruoti egzempliorių JCRE, iškviečiant vieną iš dviejų Registruotis() metodai. diegti()metodas ima baitų masyvą kaip parametrą. Šiame masyve yra diegimo parametrai, skirti inicijuoti arba suasmeninti programėlių egzempliorių.

„Java“ kortelės programėlė yra neaktyvi, kol ji nėra aiškiai pasirinkta. Kai JCRE gauna a PASIRINKTI APDU komanda ieško vidinės lentelės programėlės, kurios AID atitinka komandoje nurodytą. Jei randama atitiktis, JCRE paruošia naują programėlę, kurią reikia pasirinkti. Šis paruošimo procesas susideda iš dviejų etapų: Pirma, jei yra šiuo metu pasirinkta programėlė, JCRE ją panaikina, iškviesdamas panaikinti pasirinkimą () metodas. Programėlė atlieka bet kokius valymo ar buhalterinės apskaitos darbus panaikinti pasirinkimą () metodas, kol jis pereina į neaktyvią stadiją. Tada JCRE iškviečia pasirinkti () būdas informuoti naują programėlę, kad ji pasirinkta. Nauja programėlė atlieka visus būtinus inicijavimus, kol ji iš tikrųjų tampa pasirinkta. Grįžta programėlė tiesa į pasirinkti () metodas, jei jis yra pasirengęs tapti aktyvus ir apdoroti paskesnes APDU komandas. Priešingu atveju programėlė grįžta melagingas atsisakyti savo dalyvavimo, ir jei taip, nebus pasirinkta jokia programėlė. javacard.framework.Applet klasėje numatytasis įgyvendinimas tiek pasirinkti () ir panaikinti pasirinkimą () metodai. Pogrupis Applet klasė gali nepaisyti šių dviejų metodų, kad apibrėžtų programėlės elgesį pasirinkimo ir pasirinkimo metu.

Pasirinkus programėlę, JCRE persiunčia visas paskesnes APDU komandas (įskaitant PASIRINKTI komandą) į programėlę procesas () metodas. Viduje konors procesas () metodas, programėlė interpretuoja kiekvieną APDU komandą ir atlieka komandoje nurodytą užduotį. Kiekvienai komandai APDU programėlė reaguoja į CAD atsiųsdama atsakymą APDU, kuris informuoja CAD apie komandos APDU apdorojimo rezultatą. procesas () metodas klasėje javacard.framework.Applet yra abstraktus metodas: Applet klasė turi nepaisyti šio metodo, kad būtų galima įgyvendinti programėlės funkcijas.

Šis komandų ir atsakymų dialogas tęsiasi tol, kol bus pasirinkta nauja programėlė arba kortelė bus pašalinta iš CAD. Atšaukus pasirinkimą, programėlė tampa neaktyvi iki kito pasirinkimo.

getShareableInterfaceObject metodas skirtas interappletiniam ryšiui. Kliento programėlė kreipiasi norėdama paprašyti bendrinamo sąsajos objekto iš serverio programėlės. Numatytasis šio metodo įgyvendinimas grąžina nulį. Deja, išsami dalijimosi objektais ir interappletinio ryšio aptarimas nepatektų į šio straipsnio taikymo sritį.

Kadangi PASIRINKTI APDU komanda taip pat persiunčiama procesas () metodas pasirinkdami „Applet“ () metodą naudoja programėlės procesas () metodas atskirti PASIRINKTI APDU komanda, pasirinkdama šią programėlę iš visų kitų PASIRINKTI APDU komandos, kurios gali būti susijusios su failo ar vidinės programėlės būsenos pasirinkimu.

Sąsajos tarp programėlės ir jos terminalo programos apibrėžimas

Programėlėje, veikiančioje lustinėje kortelėje, bendraujama su terminalo programa CAD naudojant programos protokolo duomenų vienetus. Iš esmės sąsaja tarp programėlės ir jos terminalo programos yra APDU komandų rinkinys, dėl kurio susitaria ir palaiko tiek programėlė, tiek terminalo programa.

APDU gruntas

Šiame skyriuje pateikiama APDU komandų santrauka, kad galėtumėte pradėti apibrėžti APDU komandas piniginės programėlei. (APDU protokolo duomenys nurodyti ISO 7816.)

APDU komandos visada yra porų rinkiniai. Kiekvienoje poroje yra a komanda APDU, kuriame nurodoma komanda, ir a atsakas APDU, kuris atsiunčia komandos vykdymo rezultatą. Kortelių pasaulyje išmaniosios kortelės yra reaktyvus komunikatoriai - tai yra, jie niekada neinicijuoja ryšio, jie atsako tik į APDU iš išorinio pasaulio. Terminalo programa per CAD siunčia komandą APDU. JCRE gauna komandą ir pasirenka naują programėlę arba perduoda komandą šiuo metu pasirinktai programėlei. Šiuo metu pasirinkta programėlė apdoroja komandą ir grąžina atsakymo APDU į terminalo programą. Komandos APDU ir atsako APDU keičiamos pakaitomis tarp kortelės ir CAD.

4 lentelėje aprašomi komandos ir atsako APDU formatai.

Komanda APDU

Privaloma antraštėPasirenkamas korpusas
CLAINSP1P2LcDuomenų laukasLe
  • CLA (1 baitas): Nurodymų klasė --- nurodo komandos ir atsako APDU kategorijos struktūrą ir formatą
  • INS (1 baitas): instrukcijos kodas: nurodo komandos nurodymą
  • P1 (1 baitas) ir P2 (1 baitas): Instrukcijos parametrai - toliau suteikia instrukcijos kvalifikaciją
  • Lc (1 baitas): baitų, esančių komandos duomenų lauke, skaičius
  • Duomenų laukas (baitai lygūs Lc vertei): baitų seka komandos duomenų lauke
  • Le (1 baitas): maksimalus baitų skaičius, kurio laukiama atsakymo į komandą duomenų lauke

Atsakymas APDU

Pasirenkamas korpusasPrivaloma priekaba
Duomenų laukasSW1SW2
  • Duomenų laukas (kintamas ilgis): baitų seka, gauta atsakymo duomenų lauke
  • SW1 (1 baitas) ir SW2 (1 baitas): būsenos žodžiai - žymi apdorojimo būseną kortelėje
4 lentelė. Komandų ir atsakų APDU formatai

APDU komandų apibrėžimas

„Java Card“ programėlė turėtų palaikyti APDU komandų rinkinį, kurį sudaro: PASIRINKTI APDU komanda ir viena ar daugiau proceso APDU komandų.

  • PASIRINKTI komanda nurodo JCRE pasirinkti programėlę kortelėje.
  • Proceso komandų rinkinys apibrėžia komandas, kurias palaiko programėlė. Jie apibrėžiami atsižvelgiant į programėlės funkcijas.

„Java Card“ technologija nurodo PASIRINKTI APDU komanda. Appletų kūrėjai gali laisvai apibrėžti savo proceso komandų kodavimą. Tačiau proceso komandos turi atitikti aukščiau išdėstytą struktūrą.

Struktūriškai PASIRINKTI komandų ir procesų komandos yra komandų ir atsakų APDU poros.

Kiekvienai komandai APDU programėlė pirmiausia turėtų iššifruoti kiekvieno lauko lauką komandoje. Jei įtraukiami neprivalomi duomenų laukai, programėlė taip pat turėtų nustatyti jų formatą ir struktūrą. Naudodama šiuos apibrėžimus, programėlė žino, kaip interpretuoti kiekvieną komandą ir skaityti duomenis. Tada jis gali atlikti komandoje nurodytą užduotį.

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