Programovanie

Čipové karty a rámec OpenCard

Predchádzajúci Vývojár Java stĺpec „Čipové karty: základný náter“ priniesol všeobecný prehľad o čipových kartách a o tom, ako fungujú. Zahŕňala časť o štandardoch inteligentných kariet, ktorá predstavila koncept OpenCard. Ako je popísané v prvom článku, OpenCard je otvorený štandard, ktorý poskytuje interoperabilitu aplikácií inteligentných kariet medzi NC, POS terminálmi, stolnými počítačmi, notebookmi, set topmi a PDA. OpenCard môže poskytovať 100% čisté aplikácie inteligentných kariet Java. Aplikácie inteligentných kariet často nie sú čisté, pretože komunikujú s externým zariadením alebo používajú knižnice na klientovi. V tomto článku ponúkneme dve implementácie pre dve rôzne čítačky kariet, ktoré ukazujú, ako by ste na kartu OpenCard pridali podporu čítačiek kariet. Dúfame, že čoskoro budú k dispozícii porty pre Litronic, Gemplus, Schlumberger, Bull, Toshiba a SCM, komplimenty OpenCard a JavaWorld.

Úvod

Aby ste mohli používať čipovú kartu, musíte byť schopní kartu prečítať a komunikovať s ňou pomocou aplikácie. OpenCard poskytuje rámec pre to definovaním rozhraní, ktoré musia byť implementované. Rámec OpenCard definuje niekoľko týchto rozhraní. Po implementácii týchto rozhraní môžete v horných vrstvách API používať ďalšie služby. Napríklad so správne prepojenou čítačkou môže OpenCard spustiť agenta Java kariet vždy, keď je karta vložená. Kartový agent potom môže komunikovať s aplikáciami na inteligentnej karte cez terminál karty v rámci relácie.

Tento článok vás naučí, ako prepojiť terminály kariet s kartou OpenCard. V ďalších článkoch sa bude diskutovať o tom, ako napísať agenta. K dispozícii je malá testovacia aplikácia, ktorá získa reťazec ATR (Answer to Reset). ATR je základom čipových kariet. Vezmeme si vývojovú súpravu OpenCard a vysvetlíme implementácie pre dve rôzne čítačky čipových kariet pomocou rozhrania Card Terminal Interface. Techniky diskutované v článku na napájanie čítačiek, spúšťanie relácií kariet a používanie dátových jednotiek protokolu a aplikačných dátových jednotiek protokolu možno opakovane použiť pre väčšinu čítačiek na trhu.

Aj keď nie je potrebné používať OpenCard pri vytváraní 100% čistých aplikácií inteligentných kariet Java, vývojári sú bez toho nútení používať na inteligentné karty domáce rozhrania. (Podrobné vysvetlenie toho, čo skutočne znamená 100% čistota, nájdete v časti Zdroje.) OpenCard tiež poskytuje vývojárom rozhranie k PC / SC (aplikačné rozhranie čipovej karty vyvinuté spoločnosťou Microsoft a ďalšími pre komunikáciu s čipovými kartami založenými na systéme Win32) platformy pre PC) na použitie existujúcich zariadení na platformách Win32. Čítajte ďalej a dozviete sa, ako používať čipové karty vo vašom prehliadači.

Architektúra OpenCard: Prehľad

OpenCard poskytuje architektúru pre vývoj aplikácií v prostredí Java, ktoré využívajú čipové karty alebo iné zariadenia kompatibilné s normou ISO 7816 na rôznych cieľových platformách, ako sú Windows, sieťové počítače, pracovné stanice Unix, webové servery, základné dosky atď. OpenCard Framework poskytuje aplikačné programovacie rozhranie (API), ktoré vám umožňuje registrovať karty, hľadať karty v čítačkách a voliteľne spúšťať agentov Java, keď sú karty vložené do čítačky. Architektúra OpenCard je znázornená na obrázku 1.

Architektúru rámca OpenCard tvoria: CardTerminal, CardAgent, zástupcovia a / alebo aplikácie, ktoré interagujú s týmito komponentmi. OpenCard sa skladá zo štyroch balíkov Java s predponou otvorená karta:

  1. žiadosť
  2. io
  3. agent
  4. terminál

Balík terminálov v OpenCard

Balíky opencard.aplikácia a opencard.io poskytujú vysokoúrovňové API používané vývojárom aplikácií. Služby potrebné na vysokej úrovni API vykonávajú triedy v opencard.agent a otvorená karta.terminál balíkov. The opencard.agent Balíček abstrahuje funkčnosť čipovej karty cez internet CardAgent. Balíček otvorená karta.terminál abstrahuje terminály kariet (tiež známe ako čítačky kariet). Pochopenie štruktúry otvorená karta.terminál balík je potrebný na pochopenie vzorových implementácií kartových terminálov uvedených v tomto článku.

Terminál karty abstrahuje zariadenie, ktoré sa používa v počítačovom systéme na komunikáciu s čipovou kartou. The otvorená karta.terminál balík obsahuje triedy na zastupovanie hardvéru karty-terminálu, na interakciu s používateľom a na správu zdrojov karty-terminálu. Nie všetci čitatelia majú tieto schopnosti. Pri implementácii čítačky, ktorá nemá vstup z klávesnice, použijeme UserInteractionHandler.

Reprezentácia terminálu karty

Každý terminál karty je reprezentovaný inštanciou triedy CardTerminal ktorý definuje abstraktný terminál karty kompatibilný s OpenCard. Terminál pre kartu môže mať jeden alebo viac slotov pre čipové karty a voliteľne displej a klávesnicu alebo podložku PIN. Sloty terminálu karty sú reprezentované inštanciami abstraktnej triedy Slot, ktorá ponúka spôsoby čakania na vloženie karty, komunikácie s kartou a jej vysunutia (ak je to možné).

Interakcia používateľa

Používanie čipovej karty si vyžaduje interakciu s používateľom - na overenie držiteľa karty. Rozhranie Interakcia používateľa poskytuje túto funkcionalitu. Poskytuje metódy na napísanie správy na displej a na príjem vstupu od používateľa. Kartové terminály, ktoré nepodporujú všetky funkcie interakcie používateľa, môžu využívať UserInteractionHandler, ktorou sa realizuje a Interakcia používateľa ako grafické užívateľské rozhranie založené na súbore nástrojov abstraktných okien (AWT).

Riadenie zdrojov

Karty a čítačky kariet vyžadujú správu zdrojov, aby agentom mohla byť poskytnutá požadovaná úroveň kontroly prístupu. Správa zdrojov umožňuje zdieľanie kartových terminálov a kariet v nich vložených medzi agentmi v systéme. Povedzme napríklad, že používate svoju inteligentnú kartu na podpisovanie dokumentu súčasne s prijímaním poštových správ s vysokou prioritou, ktoré je potrebné pomocou inteligentnej karty dekódovať. Správa zdrojov rozhoduje o prístupe k CardTerminal a správny port.

Riadenie zdrojov pre terminály kariet sa dosahuje pomocou CardTerminalRegistry trieda OpenCard. Existuje iba jeden príklad CardTerminalRegistry: celosystémový register terminálov kariet. Register celého terminálu kariet v systéme udržuje informácie o kartových termináloch nainštalovaných v systéme. Register terminálu karty je možné konfigurovať z vlastností pri štarte systému alebo dynamicky po ňom Registrovať a zrušiť registráciu metódy dynamického pridávania alebo odstraňovania terminálov kariet z registra.

Počas registrácie kartového terminálu, a CardTerminalFactory je potrebný na vytvorenie inštancie zodpovedajúcej implementačnej triedy pre terminál karty. Továreň na výrobu kariet kariet používa na určenie názvu typu a typu konektora terminálu karty CardTerminal triedy na vytvorenie. Koncept továrne na kartové terminály umožňuje výrobcovi terminálu na karty definovať mapovanie medzi užívateľsky prívetivými názvami typov a názvami tried.

Vzorová implementácia: terminál karty IBM

V tejto časti si popíšeme integráciu kartového terminálu IBM 5948 do OpenCard. Terminál na karty IBM 5948 má jeden slot pre čipové karty, LCD displej a PIN. Je pripojený k pracovnej stanici alebo PC cez sériový port. Viac informácií o tejto čítačke je k dispozícii na serveri

Zdroje

oddiel.

Pre prístup k terminálu kariet z OpenCard je implementácia pre obe abstraktné triedy CardTerminal a Slot musia byť poskytnuté. Tieto boli pomenované Terminál IBM5948Card a IBM5948Slot, resp. Okrem toho vhodný CardTerminalFactory menovaný IBMCardTerminalFactory je potrebné. Terminálová implementácia pozostáva z balíka com.ibm.zurich.smartcard.terminál.ibm5948. Obrázok 2 zobrazuje dedičské vzťahy medzi triedami otvorená karta.terminál, triedy Java a implementácia terminálu. Diagram triedy obsahuje aj triedu Ovládač IBM5948, ktorá neimplementuje žiadnu abstraktnú triedu OpenCard, ale slúži ako rozhranie Java pre knižnicu ovládača terminálu napísanú v C.

Predpokladáme, že terminál je už pripojený k pracovnej stanici alebo PC a že sériový port je nakonfigurovaný na prácu s terminálom. V nasledujúcej časti popisujeme návrh a implementáciu ovládača, terminálu, slotu a továrne na terminály kariet. Poskytuje sa tiež konfigurácia registra terminálov kariet.

Ovládač terminálu karty

Terminál na kartu sa dodáva s ovládačom, ktorý je k dispozícii ako knižnica dynamických odkazov (DLL). DLL má C API, ktoré ponúka funkcie CT_init, CT_dataa CT_close:

  • Funkcia CT_init sa používa na otvorenie spojenia s terminálom karty, ktorý je pripojený k určitému sériovému portu. Po nadviazaní spojenia je možné vymieňať dátové jednotky protokolu (PDU) s terminálom karty a APU vymieňať pomocou inteligentnej karty, ktorá je zapojená do slotu terminálu cez CT_data funkcia.

  • The CT_data Volanie sa používa na odoslanie jednej PDU a na získanie odpovede z terminálu alebo čipovej karty.

  • The CT_close funkcia slúži na ukončenie spojenia s terminálom karty a na uvoľnenie akýchkoľvek prostriedkov.

Úspech alebo neúspech všetkých troch volaní API je označený návratovým kódom.

Rozhranie Java API

Podobne ako v C API, aj pre ovládač terminálu karty definujeme Java API. Rozhranie Java API pre terminál karty pozostáva z triedy Ovládač IBM5948, ktorá má natívne metódy volajúce na C API. Rozhodli sme sa implementovať čo najviac funkcionalít do Javy a mať v C. napísaný iba nejaký „lepiaci“ kód. V skutočnosti boli parametre ctInit a ctClose metóda sa práve odovzdáva príslušnej funkcii C API. Keďže polia sú v C a Java organizované odlišne, je potrebné s nimi pracovať pomocou volaní rozhrania API virtuálneho stroja Java Native Interface (JNI). Natívne metódy vracajú návratový kód rozhrania C API. Vykonávanie ctData metóda je uvedená nižšie:

JNIEXPORT jint JNICALL Java_com_ibm_zurich_smartcard_terminal_ibm5948_IBM5948Driver_ctData (JNIEnv * env, jobject that, jbyte destination, jbyteArray príkaz, jint commandLength, jbyteArray odpoveď, jint responseMax) {short rc; nepodpísaný znak smutný = HOST; nepodpísaný char otec = cieľ; nepodpísaná krátka responseLength = (nepodpísaná krátka) responseMax; nepodpísaný znak * commandArray; nepodpísaný znak * 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 = (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, príkaz, (podpísaný znak *) 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); návrat rc; } 

Natívne metódy opísané vyššie napodobňujú C API v Jave. Dôvodom bolo mať čo najmenšie množstvo kódu C na údržbu. Okrem natívnych metód, ktoré sú súkromné, sú to metódy init, údajea Zavrieť sú implementované. Zavolajú natívne metódy a vyvolajú výnimku, ak návratový kód naznačuje chybu. V prípade dátovej metódy sa pole bajtov odpovedí vráti po úspešnom dokončení volania natívnej metódy. Nasledujúci príklad ukazuje metódu údajov:

synchronizované dáta bajtu [] (cieľ bajtu, bajt [] pdu) hodí CardTerminalException {int rc = ctData (cieľ, pdu, pdu.length, response, response.length); if (rc == CT_OK) {byte [] result = new byte [responseLength]; System.arraycopy (response, 0, result, 0, responseLength); návratový výsledok; } else throw new CardTerminalException (rc2String (rc)); } 

Aby sa správa pamäte udržala v prostredí Java, je odpoveď buffra pre odpoveď z terminálu pridelená raz a odovzdaná natívnemu kódu. Pretože C API nie je znovu prihlásený, je možné použiť metódy Ovládač IBM5948 musia byť deklarované ako synchronizované.

Implementácia terminálu karty

Kartový terminál sa ovláda odovzdaním riadiacich PDU do dátovej metódy zariadenia Ovládač IBM5948. Formát riadiacich jednotiek PDU je v súlade s normou ISO 7816-4. To nám umožňuje nasadiť triedu opencard.agent.CommandPDU postaviť PDU a opencard.agent.ResponsePDU vybavovať odpovede.

The Terminál IBM5948Card trieda rozširuje triedu CardTerminal. Konštruktér inicializuje super triedu a vytvorí inštanciu vodiča. Potom vytvorí inštanciu poľa tak, aby držalo sloty, a vytvorí inštanciu jednej inštancie IBM5948Slot predstavovať jediný slot terminálu karty IBM 5948.

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