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:
- žiadosť
- io
- agent
- 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_data
a 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 cezCT_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
, údaje
a 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.