Programavimas

Išmaniosios kortelės ir „OpenCard Framework“

Ankstesnis „Java“ kūrėjas stulpelyje „Išmaniosios kortelės: pradžiamokslis“ buvo pateikta bendra pažangiųjų kortelių ir jų veikimo apžvalga. Jame buvo skyrius apie lustinių kortelių standartus, pristatantis „OpenCard“ koncepciją. Kaip aprašyta pirmajame straipsnyje, „OpenCard“ yra atviras standartas, užtikrinantis intelektualiųjų kortelių programų sąveikumą visose NC, POS terminaluose, darbalaukiuose, nešiojamuosiuose kompiuteriuose, rinkiniuose ir PDA. „OpenCard“ gali suteikti 100% grynos „Java“ intelektualiosios kortelės programas. Lustinių kortelių programos dažnai nėra grynos, nes jos bendrauja su išoriniu įrenginiu arba naudoja kliento bibliotekas. Šiame straipsnyje mes pateiksime dvi versijas dviem skirtingiems kortelių skaitytuvams, parodydami, kaip prie „OpenCard“ pridėtumėte palaikymą kortelių skaitytuvams. Mes tikimės, kad netrukus bus galima įsigyti „Litronic“, „Gemplus“, „Schlumberger“, „Bull“, „Toshiba“ ir SCM prievadus, „OpenCard“ ir „JavaWorld“.

Įvadas

Norėdami naudoti intelektualiąją kortelę, turite mokėti ją perskaityti ir bendrauti su ja naudodamiesi programa. „OpenCard“ suteikia tam pagrindą apibrėždama sąsajas, kurios turi būti įgyvendintos. „OpenCard“ sistema apibrėžia keletą šių sąsajų. Įdiegę šias sąsajas, galite naudoti kitas paslaugas viršutiniuose API sluoksniuose. Pavyzdžiui, naudodamas tinkamai susietą skaitytuvą, „OpenCard“ gali paleisti „Java“ kortelių agentą, kai tik įdėsite kortelę. Tada kortelės agentas sesijos metu gali bendrauti su programomis intelektualiojoje kortelėje per kortelės terminalą.

Šis straipsnis išmokys jus susieti kortelių terminalus su „OpenCard“. Ateities straipsniuose bus diskutuojama, kaip parašyti agentą. Pateikiama nedidelė bandomoji programa, gaunanti ATR (Answer to Reset) eilutę. ATR yra labai svarbus lustinėms kortelėms. Paimsime „OpenCard“ kūrimo rinkinį ir paaiškinsime dviejų skirtingų intelektualiųjų kortelių skaitytuvų diegimus naudodami „Card Terminal Interface“. Straipsnyje aptartos skaitytojų įjungimo, kortelių sesijų pradžios ir protokolo duomenų rinkinių bei programų protokolo duomenų rinkinių naudojimo metodikos gali būti pakartotinai naudojamos daugumai rinkoje esančių skaitytojų.

Nors nebūtina naudoti „OpenCard“ kuriant 100% gryną „Java“ intelektualiųjų kortelių programą, be jos kūrėjai yra priversti naudoti namuose išaugusias sąsajas su išmaniosiomis kortelėmis. (Išsamų paaiškinimą, ką iš tikrųjų reiškia 100% grynas, rasite skyriuje „Ištekliai“.) „OpenCard“ taip pat pateikia kūrėjams sąsają su PC / SC („Microsoft“ ir kitų sukurta „smart card“ programos sąsaja, skirta bendrauti su „Win32“ pagrindu veikiančiomis išmaniosiomis kortelėmis. asmeniniams kompiuteriams skirtos platformos), skirtą naudoti esamiems įrenginiams „Win32“ platformose. Skaitykite toliau ir sužinokite, kaip naudoti intelektualias korteles savo naršyklėje.

„OpenCard“ architektūra: apžvalga

„OpenCard“ suteikia architektūrą, skirtą „Java“ programoms kurti, kurios naudoja intelektualias korteles ar kitus su ISO 7816 suderinamus įrenginius skirtingose ​​tikslinėse platformose, tokiose kaip „Windows“, tinklo kompiuteriai, „Unix“ darbo vietos, „Webtops“, nustatytos viršūnės ir pan. „OpenCard Framework“ suteikia programų programavimo sąsają (API), kuri leidžia registruoti korteles, ieškoti kortelių skaitytuvuose ir pasirinktinai paleisti „Java“ agentus, kai kortelės įterpiamos į skaitytuvą. „OpenCard“ architektūra pavaizduota 1 paveiksle.

„OpenCard Framework“ architektūrą sudaro „CardTerminal“, „CardAgent“, agentai ir (arba) programos, kurios sąveikauja su šiais komponentais. „OpenCard“ sudaro keturi „Java“ paketai su priešdėliu atvira kortelė:

  1. taikymas
  2. t
  3. agentas
  4. terminalas

„OpenCard“ terminalo paketas

Paketai atvira kortelė.taikymas ir opencard.io pateikti aukšto lygio API, kurią naudoja programų kūrėjas. Paslaugas, reikalingas aukšto lygio API, teikia grupės atvira kortelė.agentas ir atvira.galinis pakuotės. atvira kortelė.agentas paketas pateikia intelektualiosios kortelės funkcionalumą per „CardAgent“. Pakuotė atvira.galinis santrauka kortelių terminalus (taip pat žinomus kaip kortelių skaitytuvai). Suprasti. Struktūrą atvira.galinis paketas reikalingas norint suprasti šiame straipsnyje pateiktus pavyzdinius kortelių terminalų diegimus.

Kortelės terminalas išgauna įrenginį, kuris naudojamas kompiuterinėje sistemoje bendraujant su lustine kortele. atvira.galinis pakete yra klasės, skirtos kortelės terminalo aparatinei įrangai atstovauti, bendrauti su vartotoju ir valdyti kortelės terminalo išteklius. Ne visi skaitytojai turi tokių sugebėjimų. Diegdami skaitytuvą, kuriame nėra klaviatūros, naudosime „UserInteractionHandler“.

Kortelės terminalo atstovavimas

Kiekvieną kortelių terminalą žymi klasės egzempliorius „CardTerminal“ tai apibrėžia abstraktų „OpenCard“ suderinamą kortelių terminalą. Kortelių terminalas gali turėti vieną ar daugiau lizdų intelektualioms kortelėms ir pasirinktinai ekraną bei klaviatūrą arba PIN kodą. Kortelių terminalo lizdus vaizduoja abstrakčios klasės egzemplioriai Lizdas, kuriame siūlomi būdai laukti kortelės įdėjimo, bendrauti su kortele ir ją išimti (jei įmanoma).

Vartotojo sąveika

Norint naudoti intelektinę kortelę, reikia sąveikos su vartotoju - norint patikrinti kortelės turėtoją. Sąsaja „UserInteraction“ numato šią funkciją. Jame pateikiami būdai, kaip rašyti pranešimą ekrane ir gauti įvestį iš vartotojo. Kortelių terminalai, kurie nepalaiko visų vartotojo sąveikos funkcijų, gali naudotis „UserInteractionHandler“, kuris įgyvendina a „UserInteraction“ kaip grafinė vartotojo sąsaja, pagrįsta abstrakčiu langavimo įrankių rinkiniu (AWT).

Resursu valdymas

Kortelėms ir kortelių skaitytuvams reikalingas išteklių valdymas, kad agentams būtų suteiktas reikalingas prieigos kontrolės lygis. Išteklių valdymas numato dalijimąsi kortelių terminalais ir į juos įdėtomis kortelėmis tarp sistemos agentų. Pavyzdžiui, tarkime, kad naudodamiesi savo išmaniąja kortele pasirašote dokumentą tuo pačiu metu, kai gaunamas aukšto prioriteto pašto pranešimas, kurį reikia iššifruoti naudojant jūsų intelektualiąją kortelę. Išteklių valdymas priima prieigą prie „CardTerminal“ ir teisingas uostas.

Kortelių terminalų išteklius valdo „CardTerminalRegistry“ klasės „OpenCard“. Yra tik vienas atvejis „CardTerminalRegistry“: visos sistemos kortelių terminalų registras. Visoje sistemoje veikiantis kortelių terminalų registras stebi sistemoje įdiegtus kortelių terminalus. Kortelių terminalų registrą galima sukonfigūruoti iš savybių paleidus sistemą arba dinamiškai Registruotis ir išregistruoti metodai, kaip dinamiškai pridėti arba pašalinti kortelių terminalus iš registro.

Registruojant kortelių terminalą, a „CardTerminalFactory“ yra reikalingas norint sukurti atitinkamos kortelių terminalo įgyvendinimo klasės egzempliorių. Kortelių terminalų gamykla naudoja kortelės terminalo tipo pavadinimą ir jungties tipą „CardTerminal“ klasę kurti. Kortelių terminalų gamyklos koncepcija leidžia kortelių terminalų gamintojams apibrėžti patogių tipų pavadinimų ir klasės pavadinimų susiejimą.

Pavyzdinis įgyvendinimas: IBM kortelių terminalas

Šiame skyriuje aprašysime „IBM 5948“ kortelių terminalo integravimą į „OpenCard“. „IBM 5948“ kortelių terminalas turi vieną lizdą lustinėms kortelėms, LCD ekraną ir PIN bloknotą. Jis prijungtas prie darbo vietos arba kompiuterio per nuoseklųjį prievadą. Daugiau informacijos apie šį skaitytuvą galite rasti

Ištekliai

skyrius.

Norint patekti į kortelių terminalą iš „OpenCard“, abiejų abstrakčių klasių įgyvendinimas „CardTerminal“ ir Lizdas turi būti pateikta. Jie buvo įvardyti „IBM5948CardTerminal“ ir „IBM5948Slot“, atitinkamai. Be to, tinkamas „CardTerminalFactory“ pavadintas „IBMCardTerminalFactory“ yra reikalingas. Terminalo įgyvendinimas susideda iš paketo 5948. „com.ibm.zurich.smartcard.terminal.ibm“. 2 paveiksle pavaizduoti paveldėjimo santykiai tarp klasių atvira.galinis, „Java“ klases ir terminalo įgyvendinimą. Klasių diagramoje taip pat yra klasė „IBM5948Driver“, kuri neįdiegia jokios abstrakčios „OpenCard“ klasės, tačiau tarnauja kaip „Java“ sąsaja terminalo tvarkyklių bibliotekai, parašytai C.

Manome, kad terminalas jau prijungtas prie darbo vietos ar kompiuterio ir kad nuoseklusis prievadas sukonfigūruotas veikti su terminalu. Kitame skyriuje aprašome tvarkyklės, terminalo, lizdo ir kortelių terminalų gamyklos dizainą ir įgyvendinimą. Taip pat pateikiama kortelių terminalų registro konfigūracija.

Kortelės terminalo tvarkyklė

Kortelių terminalas pristatomas su tvarkykle, kurią galima įsigyti kaip dinaminių nuorodų biblioteką (DLL). DLL turi C API, kuri siūlo funkcijas CT_init, CT_datair CT_close:

  • Funkcija CT_init yra naudojamas atidaryti ryšį su kortelių terminalu, kuris yra prijungtas prie tam tikro serijinio prievado. Užmezgus ryšį, protokolo duomenų vienetais (PDU) galima keistis su kortelės terminalu, o APU - su išmaniąja kortele, kuri yra prijungta prie terminalo lizdo per CT_data funkcija.

  • CT_data skambutis naudojamas vienam PDU išsiųsti ir atsakymui gauti atitinkamai iš terminalo ar intelektualiosios kortelės.

  • CT_close funkcija naudojama norint uždaryti ryšį su kortelės terminalu ir išlaisvinti visus išteklius.

Visų trijų API iškvietimų sėkmę ar nesėkmę nurodo grąžinimo kodas.

„Java“ API

Panašiai kaip C API, mes nustatome „Java“ API kortelių terminalų tvarkyklėms. „Java“ kortelių terminalo API sudaro klasė „IBM5948Driver“, kuris turi įprastus metodus, paskambinančius C API. Mes nusprendėme įdiegti kuo daugiau „Java“ funkcionalumo ir turėti tik „klijų“ kodą, parašytą C. Tiesą sakant, ctInit ir ctUždaryti metodas yra tiesiog perduodami atitinkamai C API funkcijai. Kadangi masyvai C ir „Java“ organizuojami skirtingai, juos reikia tvarkyti skambinant į virtualiosios mašinos „Java Native Interface“ (JNI) API. Savieji metodai grąžina C API grąžinimo kodą. Programos įgyvendinimas ctData metodas parodytas žemiau:

JNIEXPORT jint JNICALL Java_com_ibm_zurich_smartcard_terminal_ibm5948_IBM5948Driver_ctData (JNIEnv * env, jobject that, jbyte destination, jbyteArray komanda, jint commandLength, jbyteArray atsakymas, jint responseMax) {trumpas atsakymasMax) nepasirašyta char sad = HOST; nepasirašytas char tėtis = paskirtis; unsigned short responseLength = (nepasirašytas trumpas) responseMax; nepasirašyta char * commandArray; nepasirašyta char * responseArray; jclass cls = (* env) -> GetObjectClass (env, tas); jfieldID fid; jint ctn; fid = (* env) -> GetFieldID (env, cls, "ctNumber", "I"); if (fid == NULL) {grįžti (CT_ERR_HTSI); } ctn = (* env) -> GetIntField (env, tas, fid); commandArray = (nepasirašyta char *) (* env) -> GetByteArrayElements (env, komanda, 0); responseArray = (nepasirašyta char *) (* env) -> GetByteArrayElements (env, response, 0); rc = CT_DATA (ctn, & tėtis, & liūdna, commandLength, commandArray, & responseLength, responseArray); (* env) -> ReleaseByteArrayElements (env, komanda, (pasirašyta char *) commandArray, 0); (* env) -> ReleaseByteArrayElements (env, response, (pasirašyta char *) responseArray, 0); fid = (* env) -> GetFieldID (env, cls, "responseLength", "I"); if (fid == NULL) {grįžti (CT_ERR_HTSI); } (* env) -> SetIntField (env, that, fid, responseLength); grįžti rc; } 

Pirmiau aprašyti vietiniai metodai imituoja „Java“ C API. To priežastis buvo turėti kuo mažiau C kodo, kurį būtų galima išlaikyti. Be pagrindinių metodų, kurie yra privatūs, metodai inic, duomenisir Uždaryti yra įgyvendinami. Jie vadina vietinius metodus ir išmeta išimtį, jei grąžinimo kodas rodo klaidą. Duomenų metodo atveju atsakymo baitų masyvas grąžinamas sėkmingai baigus vietinio metodo iškvietimą. Toliau pateiktame pavyzdyje parodytas duomenų metodas:

sinchronizuoti baitų [] duomenys (baitų paskirties vieta, baitų [] pdu) išmeta „CardTerminalException“ {int rc = ctData (paskirties vieta, pdu, pdu.length, response, response.length); if (rc == CT_OK) {baitas [] rezultatas = naujas baitas [atsakymo ilgis]; System.arraycopy (atsakas, 0, rezultatas, 0, atsako ilgis); grąžinimo rezultatas; } dar išmesti naują „CardTerminalException“ (rc2String (rc)); } 

Siekiant išlaikyti atminties valdymą „Java“ viduje, buferinis atsakymas į atsakymą iš terminalo skiriamas vieną kartą ir perduodamas gimtajam kodui. Kadangi C API nėra pakartotinis dalyvis, metodai „IBM5948Driver“ turi būti paskelbta sinchronizuota.

Kortelių terminalo diegimas

Kortelių terminalas valdomas pateikiant valdymo PDU duomenų metodui „IBM5948Driver“. Valdymo PDU formatas atitinka ISO 7816-4. Tai leidžia mums dislokuoti klasę opencard.agent.CommandPDU sukonstruoti PDU ir opencard.agent.ResponsePDU tvarkyti atsakymus.

„IBM5948CardTerminal“ klasė pratęsia klasę „CardTerminal“. Konstruktorius inicijuoja superklasę ir iš karto sukuria vairuotoją. Tada jis momentuoja masyvą laiko tarpsniams laikyti ir vienu momentu „IBM5948Slot“ kad būtų vienintelis kortelių terminalo „IBM 5948“ lizdas.

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