Ohjelmointi

Älykortit ja OpenCard Framework

Edellinen Java-kehittäjä sarake "Älykortit: aluke" antoi yleiskuvan älykorteista ja niiden toiminnasta. Se sisälsi älykorttistandardeja käsittelevän osan, jossa esiteltiin OpenCard-konsepti. Kuten ensimmäisessä artikkelissa kuvataan, OpenCard on avoin standardi, joka tarjoaa älykorttisovellusten yhteentoimivuuden NC: n, POS-päätelaitteiden, pöytätietokoneiden, kannettavien tietokoneiden, asetettujen yläosien ja PDA-laitteiden välillä. OpenCard voi tarjota 100% puhtaita Java-älykorttisovelluksia. Älykorttisovellukset eivät useinkaan ole puhtaita, koska ne kommunikoivat ulkoisen laitteen kanssa tai käyttävät asiakkaan kirjastoja. Tässä artikkelissa tarjoamme kaksi toteutusta kahdelle erilaiselle kortinlukijalle, osoittaen, kuinka lisäät kortinlukijoiden tuen OpenCardiin. Toivomme, että Litronicin, Gempluksen, Schlumbergerin, Bullin, Toshiban ja SCM: n portit ovat pian saatavilla, kiitoksia OpenCardista ja JavaWorld.

Johdanto

Älykortin käyttämiseksi sinun on pystyttävä lukemaan kortti ja kommunikoimaan sen kanssa sovelluksen avulla. OpenCard tarjoaa puitteet tälle määrittelemällä liitännät, jotka on toteutettava. OpenCard-kehys määrittelee useita näistä rajapinnoista. Kun nämä rajapinnat on otettu käyttöön, voit käyttää muita palveluja API: n ylemmissä kerroksissa. Esimerkiksi oikein liitetyllä lukijalla OpenCard voi käynnistää Java-korttiagentin aina kun kortti asetetaan paikalleen. Korttiagentti voi sitten kommunikoida älykortin sovellusten kanssa korttipäätteen kautta istunnon yhteydessä.

Tämä artikkeli opettaa sinulle, kuinka liittää korttipäätteet OpenCardiin. Tulevissa artikkeleissa keskustellaan agentin kirjoittamisesta. Mukana on pieni testisovellus, joka saa ATR (Answer to Reset) -merkkijonon. ATR on älykorttien perustekijä. Otamme OpenCard-kehityspaketin ja selitämme kahden eri älykortinlukijan toteutukset korttiterminaalin käyttöliittymän avulla. Artikkelissa käsitellyt tekniikat lukijoiden virran kytkemiseksi, korttiistuntojen aloittamiseksi ja Protokollatietoyksiköiden ja Sovellusprotokollatietoyksiköiden käyttämiseksi voidaan käyttää uudelleen useimmille markkinoilla oleville lukijoille.

Vaikka OpenCardia ei tarvitse käyttää 100% puhtaiden Java-älykorttisovellusten luomiseen, ilman sitä kehittäjät joutuvat käyttämään kotikasvatettuja käyttöliittymiä älykortteihin. (Yksityiskohtaisen selvityksen siitä, mitä 100-prosenttinen puhdas todella tarkoittaa, katso Resurssit-osiosta.) OpenCard tarjoaa kehittäjille myös käyttöliittymän PC / SC: hen (älykorttisovellusliittymä, jonka Microsoft ja muut ovat kehittäneet kommunikoimaan Win32-pohjaisten älykorttien kanssa alustoja tietokoneille) olemassa olevien laitteiden käyttöä varten Win32-alustoilla. Lue ja opi käyttämään älykortteja selaimesi kanssa.

OpenCard-arkkitehtuuri: Yleiskatsaus

OpenCard tarjoaa arkkitehtuurin sellaisten Java-sovellusten kehittämiseen, jotka käyttävät älykortteja tai muita ISO 7816 -yhteensopivia laitteita eri kohdealustoilla, kuten Windows, verkkotietokoneet, Unix-työasemat, Webtops, set topit ja niin edelleen. OpenCard Framework tarjoaa sovellusohjelmointirajapinnan (API), jonka avulla voit rekisteröidä kortteja, etsiä kortteja lukijoista ja saada Java-agentit käynnistymään, kun kortit asetetaan lukijaan. OpenCard-arkkitehtuuri on esitetty kuvassa 1.

OpenCard Frameworkin arkkitehtuuri koostuu CardTerminal, CardAgent, agentit ja / tai sovellukset, jotka ovat vuorovaikutuksessa näiden komponenttien kanssa. OpenCard koostuu neljästä Java-paketista, joissa on etuliite avokortti:

  1. sovellus
  2. io
  3. agentti
  4. terminaali

OpenCardin päätelaite

Paketit avokortti.sovellus ja opencard.io tarjota sovelluskehittäjän käyttämä korkean tason sovellusliittymä. Korkean tason sovellusliittymän tarvitsemat palvelut suoritetaan luokissa avokortti.agentti ja opencard.terminal paketteja. avokortti.agentti paketti tiivistää älykortin toiminnallisuuden CardAgent. Paketti opencard.terminal tiivistää korttipäätteet (tunnetaan myös nimellä kortinlukijat). Ymmärtäminen opencard.terminal Paketti vaaditaan tässä artikkelissa esitettyjen korttipäätteiden esimerkkitoteutusten ymmärtämiseksi.

Kortin pääte imee laitteen, jota käytetään tietokonejärjestelmässä kommunikointiin älykortin kanssa. opencard.terminal paketti sisältää luokkia, jotka edustavat korttipäätelaitteistoa, ovat vuorovaikutuksessa käyttäjän kanssa ja hallitsevat korttipäätteen resursseja. Kaikilla lukijoilla ei ole näitä kykyjä. Kun toteutamme lukijan, jolla ei ole näppäimistön merkintää, käytämme UserInteractionHandler.

Korttipäätteen edustus

Kutakin korttipäätettä edustaa luokan esiintymä CardTerminal joka määrittelee abstraktin OpenCard-yhteensopivan korttipäätteen. Korttipäätteessä voi olla yksi tai useampi paikka älykortteja varten ja valinnaisesti näyttö ja näppäimistö tai PIN-tyyny. Korttipäätelaitteen aukot ovat abstraktin luokan esiintymiä Aukko, joka tarjoaa tapoja odottaa kortin asettamista, kommunikoida kortin kanssa ja poistaa se (jos mahdollista).

Käyttäjän vuorovaikutus

Älykortin käyttäminen edellyttää vuorovaikutusta käyttäjän kanssa - kortinhaltijan vahvistamiseksi. Käyttöliittymä Käyttäjän vuorovaikutus tarjoaa tämän toiminnon. Se tarjoaa tapoja kirjoittaa viesti näyttöön ja vastaanottaa syötettä käyttäjältä. Korttipäätteet, jotka eivät tue kaikkia käyttäjän vuorovaikutustoimintoja, voivat käyttää tätä UserInteractionHandler, joka toteuttaa a Käyttäjän vuorovaikutus graafisena käyttöliittymänä, joka perustuu abstraktiin ikkunointityökaluun (AWT).

Resurssienhallinta

Kortit ja kortinlukijat vaativat resurssien hallintaa, jotta agenteille voidaan antaa tarvitsemansa pääsynvalvonnan taso. Resurssien hallinta tarjoaa korttipäätteiden ja niihin asetettujen korttien jakamisen järjestelmän edustajien kesken. Oletetaan esimerkiksi, että käytät älykorttiasi allekirjoittamalla asiakirja samalla, kun saapuu tärkeän postin viesti, joka on dekoodattava älykortillasi. Resurssien hallinta välittää pääsyn CardTerminal ja oikea portti.

Korttipäätteiden resurssien hallinta saavutetaan CardTerminalRegistry luokan OpenCard. On vain yksi esimerkki CardTerminalRegistry: koko järjestelmän kattava päätelaiterekisteri. Koko järjestelmän kattava korttiterminaalirekisteri seuraa järjestelmään asennettuja korttipäätteitä. Korttiterminaalirekisteri voidaan määrittää ominaisuuksista järjestelmän käynnistyessä tai dynaamisesti läpi rekisteröidy ja poista rekisteröinti menetelmiä korttiterminaalien lisäämiseksi tai poistamiseksi rekisteristä dynaamisesti.

Korttipäätteen rekisteröinnin aikana a CardTerminalFactory tarvitaan luomaan vastaavan toteutusluokan esiintymä korttipäätteelle. Korttiterminaalitehdas käyttää korttipäätteen tyypin nimeä ja liittimen tyyppiä KorttiTerminaali luokka. Korttiterminaalitehtaan käsite antaa korttipäätelaitteen valmistajalle mahdollisuuden määritellä kartoitus käyttäjäystävällisten tyyppinimien ja luokan nimen välillä.

Esimerkkitoteutus: IBM-korttiterminaali

Tässä osassa kuvataan IBM 5948 -korttiterminaalin integrointi OpenCard-korttiin. IBM 5948 -korttiterminaalissa on yksi korttipaikka älykortteja varten, LCD-näyttö ja PIN-tyyny. Se on kytketty työasemaan tai tietokoneeseen sarjaportin kautta. Lisätietoja tästä lukijasta on saatavilla

Resurssit

-osiossa.

Korttiterminaaliin pääsemiseksi OpenCardissa on toteutus molemmille abstrakteille luokille CardTerminal ja Aukko on toimitettava. Nämä on nimetty IBM5948CardTerminal ja IBM5948Slotvastaavasti. Lisäksi sopiva CardTerminalFactory nimetty IBMCardTerminalFactory tarvitaan. Terminaalin toteutus koostuu paketista com.ibm.zurich.smartcard.terminal.ibm5948. Kuva 2 kuvaa perintösuhteita luokkien välillä opencard.terminal, Java-luokat ja päätelaitteen toteutus. Luokkakaavio sisältää myös luokan IBM5948Driver, joka ei toteuta mitään abstraktia OpenCard-luokkaa, mutta toimii Java-käyttöliittymänä pääteohjaimen kirjastoon, joka on kirjoitettu C.

Oletetaan, että pääte on jo kytketty työasemaan tai tietokoneeseen ja että sarjaportti on määritetty toimimaan päätelaitteen kanssa. Seuraavassa osassa kuvataan ohjaimen, päätelaitteen, korttipaikan ja korttiterminaalitehtaan suunnittelu ja toteutus. Tarjolla on myös korttipäätteen rekisterin kokoonpano.

Korttipääteajuri

Korttipäätteen mukana toimitetaan ohjain, joka on saatavana dynaamisena linkkikirjastona (DLL). DLL: llä on C-sovellusliittymä, joka tarjoaa toiminnot CT_init, CT_dataja CT_sulje:

  • Toiminto CT_init käytetään avaamaan yhteys korttipäätteeseen, joka on kytketty tiettyyn sarjaporttiin. Kun yhteys on muodostettu, protokolladatayksiköt (PDU) voidaan vaihtaa korttipäätteen kanssa ja APU: t älykortin kanssa, joka on kytketty päätelaitteen aukkoon liitännän kautta. CT_tiedot toiminto.

  • CT_tiedot puhelua käytetään yhden PDU: n lähettämiseen ja vastauksen hakemiseen päätelaitteelta tai älykortilta.

  • CT_sulje toimintoa käytetään sulkemaan yhteys korttipäätteeseen ja vapauttamaan kaikki resurssit.

Kaikkien kolmen API-kutsun onnistuminen tai epäonnistuminen ilmoitetaan palautuskoodilla.

Java-sovellusliittymä

Samoin kuin C-sovellusliittymä, määritämme korttipääteajurille Java-sovellusliittymän. Korttiterminaalin Java-sovellusliittymä koostuu luokasta IBM5948Driver, jolla on alkuperäiset menetelmät, jotka kutsuvat C-sovellusliittymää. Päätimme ottaa käyttöön mahdollisimman paljon toiminnallisuutta Java-sovelluksessa ja meillä on vain joitain "liimakoodeja" kirjoitettu C: hen. Itse asiassa ctInit ja ctSulje menetelmä vain välitetään vastaavalle C API -toiminnolle. Koska taulukot on järjestetty eri tavalla C: ssä ja Java: ssa, ne on käsiteltävä kutsumalla virtuaalikoneen Java Native Interface (JNI) -sovellusliittymään. Natiivimetodit palauttavat C-sovellusliittymän palautuskoodin. Ohjelman täytäntöönpano ctData menetelmä on esitetty alla:

JNIEXPORT jint JNICALL Java_com_ibm_zurich_smartcard_terminal_ibm5948_IBM5948Driver_ctData (JNIEnv * env, työobjekti, jbyte-kohde, jbyteArray-komento, jint-komentoLength, jbyteArray-vastaus, jint responseMax) allekirjoittamaton merkki surullinen = HOST; allekirjoittamaton char isä = kohde; unsigned short responseLength = (allekirjoittamaton lyhyt) responseMax; allekirjoittamaton char * commandArray; allekirjoittamaton merkki * responseArray; jclass cls = (* env) -> GetObjectClass (env, tuo); jfieldID fid; jint ctn; fid = (* env) -> GetFieldID (env, cls, "ctNumber", "I"); if (fid == NULL) {paluu (CT_ERR_HTSI); } ctn = (* env) -> GetIntField (env, tuo, fid); commandArray = (allekirjoittamaton merkki *) (* env) -> GetByteArrayElements (env, komento, 0); responseArray = (allekirjoittamaton merkki *) (* env) -> GetByteArrayElements (env, vastaus, 0); rc = CT_DATA (ctn, & isä, & surullinen, commandLength, commandArray, & responseLength, responseArray); (* env) -> ReleaseByteArrayElements (env, komento, (signeerattu char *) commandArray, 0); (* env) -> ReleaseByteArrayElements (env, vastaus, (signeerattu char *) responseArray, 0); fid = (* env) -> GetFieldID (env, cls, "responseLength", "I"); if (fid == NULL) {paluu (CT_ERR_HTSI); } (* env) -> SetIntField (env, that, fid, responseLength); paluu rc; } 

Edellä kuvatut alkuperäiset menetelmät jäljittelevät Java-sovellusliittymää. Syynä tähän oli saada mahdollisimman vähän C-koodia ylläpitää. Natiivien, yksityisten menetelmien lisäksi menetelmät sen sisällä, tiedotja kiinni toteutetaan. He kutsuvat alkuperäisiä menetelmiä ja heittävät poikkeuksen, jos palautuskoodi osoittaa virheen. Datamenetelmän tapauksessa vastetavuryhmä palautetaan, kun natiivimenetelmäkutsu on saatu onnistuneesti päätökseen. Alla olevassa esimerkissä on esitetty datamenetelmä:

synkronoidun tavun [] data (tavun kohde, tavu [] pdu) heittää CardTerminalException {int rc = ctData (kohde, pdu, pdu.length, vastaus, vastaus.length); if (rc == CT_OK) {tavu [] tulos = uusi tavu [vastauspituus]; System.arraycopy (vastaus, 0, tulos, 0, vastauspituus); paluutulos; } muuta heittää uusi CardTerminalException (rc2String (rc)); } 

Muistinhallinnan pitämiseksi Java-tilassa puskurivaste päätelaitteen vastaukselle allokoidaan kerran ja siirretään natiivikoodille. Koska C-sovellusliittymä ei ole uudelleentulija, menetelmät IBM5948Driver on ilmoitettava synkronoituna.

Korttiterminaalin käyttöönotto

Korttipäätettä ohjataan lähettämällä ohjauksen PDU: t datamenetelmälle IBM5948Driver. Ohjaus-PDU: iden muoto on ISO 7816-4 -yhteensopiva. Tämän avulla voimme ottaa luokan käyttöön opencard.agent.CommandPDU rakentaa PDU: t ja opencard.agent.ResponsePDU käsittelemään vastauksia.

IBM5948CardTerminal luokka laajentaa luokkaa KorttiTerminaali. Rakentaja alustaa superluokan ja saa kuljettajan ilmentymään. Sitten se instantisoi matriisin pitämään paikkoja ja instantisoi yhden esiintymän IBM5948Slot edustamaan IBM 5948 -korttiterminaalin ainoaa paikkaa.

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