Pametne kartice i OpenCard Framework

Prethodni programer Javastupac, "Pametne kartice: osnovni priručnik", dao je općeniti pregled pametnih kartica i njihova rada. Sadržao je odjeljak o standardima pametnih kartica, uvodeći koncept OpenCard-a. Kao što je opisano u prvom članku, OpenCard je otvoreni standard koji pruža interoperabilnost aplikacija pametnih kartica na NC-ima, POS terminalima, stolnim računalima, prijenosnim računalima, postavljenim vrhovima i PDA-ima. OpenCard može pružiti 100% čiste Java aplikacije za pametne kartice. Aplikacije pametnih kartica često nisu čiste jer komuniciraju s vanjskim uređajem ili koriste knjižnice na klijentu. U ovom ćemo članku pružiti dvije implementacije za dva različita čitača kartica, pokazujući kako biste dodali podršku za čitače kartica na OpenCard. Nadamo se da će uskoro biti dostupni priključci za Litronic, Gemplus, Schlumberger, Bull, Toshiba i SCM, komplimenti OpenCarda iJavaWorld .

Uvod

Da biste koristili pametnu karticu, morate biti sposobni čitati je i komunicirati s njom pomoću aplikacije. OpenCard pruža okvir za to definirajući sučelja koja se moraju implementirati. Okvir OpenCard definira nekoliko ovih sučelja. Nakon što se ta sučelja implementiraju, možete koristiti druge usluge u gornjim slojevima API-ja. Na primjer, s pravilno povezanim čitačem, OpenCard može pokrenuti agent Java kartice kad god je kartica umetnuta. Tada agent kartice može komunicirati s aplikacijama na pametnoj kartici putem terminala za kartice u kontekstu sesije.

Ovaj će vas članak naučiti kako povezati terminale kartica s OpenCardom. Budući članci raspravljat će o tome kako napisati agenta. Osigurana je mala testna aplikacija koja dobiva ATR (Odgovor na poništavanje) niz. ATR je ključan za pametne kartice. Uzet ćemo OpenCard razvojni komplet i objasniti implementacije za dva različita čitača pametnih kartica pomoću sučelja Card Terminal. Tehnike o kojima se raspravlja u članku za pokretanje čitača, pokretanje sesija karata i upotrebu jedinica podataka protokola i jedinica podataka protokola aplikacije mogu se ponovno koristiti za većinu čitača na tržištu.

Iako nije potrebno koristiti OpenCard za stvaranje 100% čistih Java aplikacija za pametne kartice, bez toga programeri su prisiljeni koristiti domaća sučelja za pametne kartice. (Za detaljno objašnjenje što zapravo znači 100% čistoća pogledajte odjeljak Resursi.) OpenCard programerima također nudi sučelje za PC / SC (sučelje aplikacije za pametne kartice koje su razvili Microsoft i drugi za komunikaciju sa pametnim karticama iz Win32-a platforme za osobna računala) za upotrebu postojećih uređaja na Win32 platformama. Pročitajte i naučite kako koristiti pametne kartice s preglednikom.

OpenCard arhitektura: pregled

OpenCard pruža arhitekturu za razvoj aplikacija na Javi koje koriste pametne kartice ili druge uređaje koji su u skladu s ISO 7816 na različitim ciljnim platformama kao što su Windows, mrežna računala, Unix radne stanice, Webtops, postavljeni vrhovi i tako dalje. OpenCard Framework nudi sučelje za programiranje aplikacija (API), koje vam omogućuje registraciju kartica, traženje kartica u čitačima i po želji pokretanje Java agenata kada se kartice umetnu u čitač. Arhitektura OpenCarda prikazana je na slici 1.

Arhitektura OpenCard okvira sastoji se od CardTerminal, u CardAgent, agenti i / ili aplikacije koje su u interakciji s tim komponentama. OpenCard se sastoji od četiri Java paketa s prefiksom opencard :

  1. primjena
  2. io
  3. agent
  4. terminal

Terminalni paket u OpenCard-u

Paketi opencard.application i opencard.io pružaju API na visokoj razini koji koristi programer aplikacije. Usluge potrebne za API visoke razine provode se po klasama u paketima opencard.agent i opencard.terminal . Paket opencard.agent apstrahira funkcionalnost pametne kartice putem CardAgent. Paket opencard.terminal apstrahira terminale kartica (poznati i kao čitači kartica ). Razumijevanje strukture paketa opencard.terminal potrebno je da bi se razumjeli primjeri implementacija terminala kartica danih u ovom članku.

Terminal kartice apstrahira uređaj koji se koristi u računalnom sustavu za komunikaciju s pametnom karticom. Paket opencard.terminal sadrži klase koje predstavljaju hardver terminala kartice, interakciju s korisnikom i upravljanje resursima kartice-terminala. Nemaju svi čitatelji ove sposobnosti. Kada implementiramo čitač koji nema unos na tipkovnici, koristit ćemo UserInteractionHandler.

Prikaz terminala na kartici

Svaki terminal kartice predstavljen je instancom klase CardTerminalkoja definira apstraktni terminal kartice usklađen s OpenCardom. Terminal za kartice može imati jedan ili više utora za pametne kartice, a po želji i zaslon te tipkovnicu ili PIN podlogu. Prorezi terminala za kartice predstavljeni su primjerima apstraktne klase Slotkoja nudi metode čekanja da se kartica ubaci, komunikacije s karticom i izbacivanja (ako je moguće).

Interakcija korisnika

Korištenje pametne kartice zahtijeva interakciju s korisnikom - za provjeru vlasnika kartice. Sučelje UserInteractionomogućuje ovu funkcionalnost. Pruža metode za pisanje poruke na zaslon i primanje podataka od korisnika. Terminali za kartice koji ne podržavaju sve značajke korisničke interakcije mogu se koristiti sustavom UserInteractionHandler, koji implementira UserInteractionkao grafičko korisničko sučelje na temelju apstraktnog alata za prozore (AWT).

Upravljanje resursima

Kartice i čitači kartica zahtijevaju upravljanje resursima kako bi agenti mogli dobiti potrebnu razinu kontrole pristupa. Upravljanje resursima omogućava dijeljenje terminala za kartice i kartica umetnutih u njih među agentima u sustavu. Na primjer, recimo da pametnu karticu koristite za potpisivanje dokumenta istodobno kada stigne pošta s visokim prioritetom koju treba dekodirati pomoću vaše pametne kartice. Upravljanje resursima arbitrira pristup CardTerminali ispravnom portu.

Upravljanje resursima za terminale kartica postiže se CardTerminalRegistryklasom OpenCard. Postoji samo jedan primjer CardTerminalRegistry: sistemski registar terminala za kartice. Sistemski registar terminala za kartice prati evidenciju terminala za kartice instalirane u sustavu. Registar terminala kartice može se konfigurirati iz svojstava nakon pokretanja ili dinamičkog pokretanja sustava registeri unregistermetoda za dinamičko dodavanje ili uklanjanje terminala kartice iz registra.

Tijekom registracije terminala za kartice CardTerminalFactorypotreban je a za stvaranje instance odgovarajuće klase implementacije za terminal kartice. Tvornica terminala za kartice koristi naziv tipa i tip konektora terminala za karticu kako bi odredila CardTerminalklasu koju će stvoriti. Koncept tvornice terminala za kartice omogućuje proizvođaču terminala za kartice da definira mapiranje između korisničkih naziva tipova i naziva klase.

Primjer implementacije: terminal IBM kartice

U ovom ćemo odjeljku opisati integraciju terminala kartice IBM 5948 u OpenCard. Terminal za karticu IBM 5948 ima jedan utor za pametne kartice, LCD zaslon i PIN podlogu. Povezan je s radnom stanicom ili računalom putem serijskog porta. Više informacija o ovom čitaču dostupno je u

Resursi

odjeljak.

Kako bi pristupili terminal kartice iz OpenCard, implementacija i za apstraktne klase CardTerminali Slotmora biti osigurana. To se zove IBM5948CardTerminali IBM5948Slot, respektivno. Uz to je potreban i odgovarajući CardTerminalFactoryimenovani IBMCardTerminalFactory. Implementacija terminala sastoji se od paketa com.ibm.zurich.smartcard.terminal.ibm5948 . Slika 2 prikazuje odnose nasljeđivanja između klasa opencard.terminal , Java klasa i implementacije terminala. Dijagram klasa također sadrži klasu IBM5948Driverkoja ne implementira nijednu apstraktnu klasu OpenCard-a, ali služi kao Java sučelje knjižnici upravljačkih programa terminala napisanoj na C.

Pretpostavljamo da je terminal već povezan s radnom stanicom ili računalom i da je serijski port konfiguriran za rad s terminalom. U sljedećem odjeljku opisujemo dizajn i izvedbu upravljačkog programa, terminala, utora i tvornice terminala za kartice. Također je osigurana konfiguracija registra terminala za kartice.

Upravljački program terminala kartice

Terminal kartice isporučuje se s upravljačkim programom koji je dostupan kao knjižnica dinamičkih veza (DLL). DLL je C API koji nudi funkcije CT_init, CT_datai CT_close:

  • The function CT_init is used to open a connection to a card terminal that is connected to a certain serial port. After the connection has been established, protocol data units (PDU) can be exchanged with the card terminal and APUs can be exchanged with the smart card that is plugged into the slot of the terminal via the CT_data function.

  • The CT_data call is used to send one PDU and retrieve the response from the terminal or the smart card, respectively.

  • The CT_close function is used to close the connection to the card terminal and release any resources.

Success or failure of all three API calls is indicated by the return code.

The Java API

Similar to the C API, we define a Java API for the card terminal driver. The Java API for the card terminal consists of class IBM5948Driver, which has native methods calling the C API. We decided to implement as much functionality as possible in Java and have only some "glue" code written in C. In fact, the parameters of the ctInit and ctClose method are just passed on to the respective C API function. Since arrays are organized differently in C and Java, they need to be handled by calls to the Java Native Interface (JNI) API of the virtual machine. The native methods return the return code of the C API. The implementation of the ctData method is shown below:

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 responseMax) { short rc; unsigned char sad = HOST; unsigned char dad = destination; unsigned short responseLength = (unsigned short)responseMax; unsigned char *commandArray; unsigned char *responseArray; jclass cls = (*env)->GetObjectClass(env, that); 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 = (unsigned char *) (*env)->GetByteArrayElements(env, command, 0); responseArray = (unsigned char *) (*env)->GetByteArrayElements(env, response, 0); rc = CT_DATA(ctn, &dad, &sad, commandLength, commandArray, &responseLength, responseArray); (*env)->ReleaseByteArrayElements(env, command, (signed char *)commandArray, 0); (*env)->ReleaseByteArrayElements(env, response, (signed char *)responseArray, 0); fid = (*env)->GetFieldID(env, cls, "responseLength", "I"); if(fid == NULL) { return(CT_ERR_HTSI); } (*env)->SetIntField(env, that, fid, responseLength); return rc; } 

The native methods described above mimic the C API in Java. The reason for this was to have as little C code to maintain as possible. On top of the native methods, which are private, the methods init, data, and close are implemented. They call the native methods and throw an exception if the return code indicates an error. In the case of the data method, the response byte array is returned upon a successful completion of the native method call. The example below shows the data method:

synchronized byte[] data(byte destination, byte[] pdu) throws CardTerminalException { int rc = ctData(destination, pdu, pdu.length, response, response.length); if (rc == CT_OK) { byte[] result = new byte[responseLength]; System.arraycopy(response, 0, result, 0, responseLength); return result; } else throw new CardTerminalException(rc2String(rc)); } 

In order to keep memory management inside Java, a buffer response for the answer from the terminal is allocated once and passed on to the native code. Since the C API is not re-entrant, the methods of IBM5948Driver must be declared synchronized.

Implementing the card terminal

Terminal kartice kontrolira se predajom kontrolnih PDU-ova podatkovnoj metodi IBM5948Driver. Format kontrolnih PDU-a je u skladu s ISO 7816-4. To nam omogućuje razmještanje klase opencard.agent.CommandPDUza konstrukciju PDU-ova i opencard.agent.ResponsePDUobradu odgovora.

IBM5948CardTerminalKlasa proširuje klasu CardTerminal. Konstruktor inicijalizira super klasu i pokreće pokretački program. Zatim instancira niz za zadržavanje utora i instancira jedan primjerak IBM5948Slotda predstavlja jedini utor terminala kartice IBM 5948.