Programiranje

Pametne kartice in ogrodje OpenCard

Prejšnji Razvijalec Java stolpec »Pametne kartice: osnovni priročnik« je podal splošen pregled pametnih kartic in njihovega delovanja. Vključeval je razdelek o standardih pametnih kartic, ki je predstavil koncept OpenCard. Kot je opisano v prvem članku, je OpenCard odprt standard, ki zagotavlja interoperabilnost aplikacij pametnih kartic v NC-jih, POS-terminalih, namiznih računalnikih, prenosnih računalnikih, nadevnih vrhovih in dlančnikih. OpenCard lahko nudi 100% čiste aplikacije za pametne kartice Java. Aplikacije pametnih kartic pogosto niso čiste, ker komunicirajo z zunanjo napravo ali uporabljajo odjemalske knjižnice. V tem članku bomo predstavili dve izvedbi za dva različna čitalnika kartic, ki prikazujeta, kako bi na kartico OpenCard dodali podporo za bralnike kartic. Upamo, da bodo kmalu na voljo pristanišča za Litronic, Gemplus, Schlumberger, Bull, Toshiba in SCM, komplimenti OpenCard in JavaWorld.

Uvod

Če želite uporabljati pametno kartico, morate biti sposobni prebrati kartico in z njo komunicirati z uporabo aplikacije. OpenCard zagotavlja okvir za to z opredelitvijo vmesnikov, ki jih je treba implementirati. Okvir OpenCard opredeljuje več teh vmesnikov. Ko so ti vmesniki implementirani, lahko uporabite druge storitve v zgornjih plasteh API-ja. Na primer, s pravilno povezanim bralnikom lahko OpenCard zažene agent kartice Java, kadar koli je kartica vstavljena. Nato lahko posrednik kartice komunicira z aplikacijami na pametni kartici prek terminala za kartice v okviru seje.

Ta članek vas bo naučil, kako povezati terminale kartic z OpenCard. V prihodnjih člankih bomo razpravljali o tem, kako napisati agenta. Na voljo je majhna testna aplikacija, ki dobi niz ATR (Odgovor na ponastavitev). ATR je bistvenega pomena za pametne kartice. Vzeli bomo razvojni komplet OpenCard in razložili izvedbe za dva različna čitalnika pametnih kartic s pomočjo vmesnika Card Terminal. Tehnike, obravnavane v članku za vklop bralcev, zagon sej s kartami in uporabo protokolarnih enot podatkov in enote protokola podatkovnih enot, je mogoče ponovno uporabiti za večino bralcev na trgu.

Čeprav pri ustvarjanju 100% čistih aplikacij za pametne kartice Java ni treba uporabljati OpenCard, so brez nje razvijalci prisiljeni uporabljati domače vmesnike za pametne kartice. (Za podrobno razlago, kaj v resnici pomeni 100% čista, glejte razdelek Viri.) OpenCard razvijalcem ponuja tudi vmesnik za PC / SC (vmesnik za uporabo pametnih kartic, ki so ga razvili Microsoft in drugi za komunikacijo s pametnimi karticami iz Win32 platforme za osebne računalnike) za uporabo obstoječih naprav na platformah Win32. Preberite in se naučite uporabljati pametne kartice z brskalnikom.

Arhitektura OpenCard: pregled

OpenCard ponuja arhitekturo za razvoj aplikacij v Javi, ki uporabljajo pametne kartice ali druge naprave, skladne z ISO 7816, na različnih ciljnih platformah, kot so Windows, omrežni računalniki, delovne postaje Unix, spletni nabori, postavljeni vrhovi itd. OpenCard Framework ponuja vmesnik za programiranje aplikacij (API), ki omogoča registracijo kartic, iskanje kart v bralnikih in po želji zagon agentov Java, ko so kartice vstavljene v bralnik. Arhitektura OpenCard je prikazana na sliki 1.

Arhitektura ogrodja OpenCard je sestavljena iz CardTerminal, CardAgent, zastopniki in / ali aplikacije, ki sodelujejo s temi komponentami. OpenCard je sestavljen iz štirih paketov Java s predpono odprta kartica:

  1. aplikacijo
  2. io
  3. agent
  4. terminala

Terminalni paket v OpenCard

Paketi opencard.application in opencard.io zagotoviti API na visoki ravni, ki ga uporablja razvijalec aplikacije. Storitve, ki jih potrebuje API na visoki ravni, izvajajo razredi v opencard.agent in opencard.terminal paketov. The opencard.agent paket povzema funkcionalnost pametne kartice prek CardAgent. Paket opencard.terminal izvlečki terminalov kartic (znanih tudi kot bralniki kartic). Razumevanje strukture opencard.terminal paket, da bi razumel vzorčne izvedbe terminalov kartic, ki jih ponuja ta članek.

Terminal za kartice odvzame napravo, ki se uporablja v računalniškem sistemu za komunikacijo s pametno kartico. The opencard.terminal paket vsebuje razrede za predstavitev strojne opreme kartice, za interakcijo z uporabnikom in za upravljanje virov kartice. Te sposobnosti nimajo vsi bralci. Pri namestitvi bralnika, ki nima vnosa na tipkovnici, bomo uporabili UserInteractionHandler.

Predstavitev terminala na kartici

Vsak terminalski terminal je predstavljen s primerkom razreda CardTerminal ki definira abstraktni terminal kartice, skladen z OpenCard. Terminal za kartice ima lahko eno ali več rež za pametne kartice in po želji zaslon ter tipkovnico ali blazinico PIN. Reže na karticnem terminalu so predstavljene s primerki abstraktnega razreda Reža, ki ponuja načine, kako počakati, da se vstavi kartica, komunicirati s kartico in jo izvrči (če je mogoče).

Interakcija uporabnika

Uporaba pametne kartice zahteva interakcijo z uporabnikom - za preverjanje imetnika kartice. Vmesnik Interakcija uporabnika zagotavlja to funkcionalnost. Ponuja metode za pisanje sporočila na zaslon in prejemanje vnosov uporabnika. Kartice, ki ne podpirajo vseh funkcij za interakcijo uporabnika, lahko uporabljajo UserInteractionHandler, ki izvaja a Interakcija uporabnika kot grafični uporabniški vmesnik na osnovi abstraktnega orodja za okna (AWT).

Upravljanje virov

Kartice in čitalniki kartic zahtevajo upravljanje virov, tako da lahko agenti dobijo raven nadzora dostopa, ki jo potrebujejo. Upravljanje virov omogoča izmenjavo terminalov kartic in kartic, vstavljenih vanje, med zastopnike v sistemu. Recimo na primer, da pametno kartico uporabljate za podpisovanje dokumenta hkrati z vnosom visoko prioritetnega e-poštnega sporočila, ki ga je treba dešifrirati s pametno kartico. Upravljanje virov arbitrira dostop do CardTerminal in pravilno vrata.

Upravljanje virov za terminale kartic je doseženo z CardTerminalRegistry razred OpenCard. Obstaja samo en primer CardTerminalRegistry: sistemski register terminalskih kartic. V celotnem registru kartic terminalov so shranjeni terminali kartic, nameščeni v sistemu. Register terminalskih kartic je mogoče konfigurirati iz lastnosti ob zagonu sistema ali dinamično register in odjavite metode za dinamično dodajanje ali odstranjevanje terminalov kartic iz registra.

Med registracijo kartice, a CardTerminalFactory je potreben za izdelavo primerka ustreznega izvedbenega razreda za kartico. Tovarniška kartica uporablja za določanje imena tipa in tipa priključka karticnega terminala CardTerminal razred za ustvarjanje. Koncept tovarne terminala za kartice omogoča proizvajalcu terminala za kartice, da določi preslikavo med uporabnikom prijaznimi imeni vrst in imenom razreda.

Vzorčna izvedba: terminal za kartice IBM

V tem razdelku bomo opisali integracijo terminala za kartice IBM 5948 v OpenCard. Terminal za kartice IBM 5948 ima eno režo za pametne kartice, LCD zaslon in blazinico PIN. Z delovno postajo ali računalnikom je povezan prek serijskih vrat. Več informacij o tem bralniku je na voljo v

Viri

odsek.

Za dostop do terminala za kartice znotraj OpenCard, izvedbe za oba abstraktna razreda CardTerminal in Reža je treba zagotoviti. Ti so bili poimenovani IBM5948CardTerminal in IBM5948Slotoziroma. Poleg tega ustrezen CardTerminalFactory imenovan IBMCardTerminalFactory je potrebno. Izvedba terminala je sestavljena iz paketa com.ibm.zurich.smartcard.terminal.ibm5948. Slika 2 prikazuje dedna razmerja med razredi opencard.terminal, razredi Java in izvedba terminala. Diagram razredov vsebuje tudi razred IBM5948Driver, ki ne izvaja nobenega abstraktnega razreda OpenCard, ampak služi kot vmesnik Java knjižnici terminalskih gonilnikov, napisani v C.

Predvidevamo, da je terminal že povezan z delovno postajo ali računalnikom in da so serijska vrata konfigurirana za delo s terminalom. V naslednjem poglavju opisujemo zasnovo in izvedbo gonilnika, terminala, reže in tovarne terminala za kartice. Zagotovljena je tudi konfiguracija registra terminala za kartice.

Gonilnik terminala za kartice

Kartica je dobavljena z gonilnikom, ki je na voljo kot knjižnica dinamičnih povezav (DLL). DLL ima C API, ki ponuja funkcije CT_init, CT_data, in CT_close:

  • Funkcija CT_init se uporablja za odpiranje povezave s terminalom kartice, ki je povezan z določenimi serijskimi vrati. Po vzpostavljeni povezavi je mogoče s terminalom za kartice izmenjati protokolarne podatkovne enote (PDU) in APU s pametno kartico, ki je prek reže priključena v režo terminala. CT_data funkcijo.

  • The CT_data klic se uporablja za pošiljanje enega PDU in pridobivanje odgovora s terminala oziroma s pametne kartice.

  • The CT_close funkcija se uporablja za zapiranje povezave s terminalom kartice in sprostitev vseh virov.

Uspeh ali neuspeh vseh treh klicev API je označen s povratno kodo.

Java API

Podobno kot API C, tudi za gonilnik terminala kartice definiramo API Java. Java API za kartico je sestavljen iz razreda IBM5948Driver, ki ima izvorne metode, ki kličejo API C. Odločili smo se, da v Java vgradimo čim več funkcionalnosti in imamo v C. napisano le nekaj "lepilne" kode. Pravzaprav so parametri ctInit in ctZaprite metoda se pravkar posredujejo ustrezni funkciji C API. Ker so polja v C in Javi organizirana drugače, jih je treba obravnavati s klici API-ja Java Native Interface (JNI) navideznega stroja. Izvorne metode vrnejo povratno kodo API-ja C. Izvajanje ctData metoda je prikazana spodaj:

JNIEXPORT jint JNICALL Java_com_ibm_zurich_smartcard_terminal_ibm5948_IBM5948Driver_ctData (JNIEnv * env, jobject that, jbyte destination, jbyteArray command, jint commandLength, jbyteArray response, jint responseMac) { nepodpisan znak sad = HOST; nepodpisani char dad = cilj; unsigned short responseLength = (nepodpisan kratek) responseMax; nepodpisan char * commandArray; nepodpisan char * responseArray; jclass cls = (* env) -> GetObjectClass (env, to); jfieldID fid; jint ctn; fid = (* env) -> GetFieldID (env, cls, "ctNumber", "I"); if (fid == NULL) {return (CT_ERR_HTSI); } ctn = (* env) -> GetIntField (env, that, fid); commandArray = (nepodpisani znak *) (* env) -> GetByteArrayElements (env, command, 0); responseArray = (nepodpisani znak *) (* env) -> GetByteArrayElements (env, response, 0); rc = CT_DATA (ctn, & dad, & sad, commandLength, commandArray in & responseLength, responseArray); (* env) -> ReleaseByteArrayElements (env, command, (podpisan znak *) commandArray, 0); (* env) -> ReleaseByteArrayElements (env, odgovor, (podpisan znak *) responseArray, 0); fid = (* env) -> GetFieldID (env, cls, "responseLength", "I"); if (fid == NULL) {return (CT_ERR_HTSI); } (* env) -> SetIntField (env, that, fid, responseLength); vrnitev rc; } 

Zgoraj opisane izvorne metode posnemajo API C v Javi. Razlog za to je bil imeti čim manj C kode, ki jo je bilo mogoče vzdrževati. Poleg naravnih metod, ki so zasebne, metode v, podatkov, in blizu se izvajajo. Pokličejo izvorne metode in vrnejo izjemo, če povratna koda kaže na napako. V primeru podatkovne metode se matrika odzivnih bajtov vrne po uspešnem zaključku klica izvorne metode. Spodnji primer prikazuje podatkovno metodo:

podatki sinhroniziranega bajta [] (cilj bajta, bajt [] pdu) vrže CardTerminalException {int rc = ctData (cilj, pdu, pdu.length, response, response.length); if (rc == CT_OK) {byte [] rezultat = nov bajt [responseLength]; System.arraycopy (response, 0, result, 0, responseLength); vrniti rezultat; } sicer vrzi novo CardTerminalException (rc2String (rc)); } 

Da bi ohranili upravljanje pomnilnika v Javi, se odziv vmesnega pomnilnika za odgovor s terminala enkrat dodeli in posreduje izvorni kodi. Ker API C ne bo ponovno prisoten, metode IBM5948Driver mora biti razglašen za sinhroniziran.

Izvajanje terminala za kartice

Terminal kartice nadzorujemo tako, da nadzorne PDU pošljemo podatkovni metodi v IBM5948Driver. Oblika krmilnih PDU je skladna z ISO 7816-4. To nam omogoča razmestitev razreda opencard.agent.CommandPDU za izdelavo PDU-jev in opencard.agent.ResponsePDU za obravnavo odzivov.

The IBM5948CardTerminal razred podaljša razred CardTerminal. Konstruktor inicializira razred super in ustvari gonilnik. Nato ustvari matriko, v kateri so reže, in ustvari en primerek IBM5948Slot predstavljati edino režo terminala za kartice IBM 5948.

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