| FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA |
Vlatka Antončić |
| Zavod za elektroniku,
mikroelektroniku, računalne i inteligentne sustave |
0036381525 |
DIPLOMSKI RAD br. 1545
U ovom diplomskom radu ukratko su opisane pametne kartice i njihova svojstva. Opisan je način komunikacije između pametnih kartica i računala. Implementiran je sloj za razmjenu APDU poruka, sloj kartične aplikacije, sloj aplikacije terminala i sloj za pristup kartičnim aplikacijama.
Pametna zdravstvena iskaznica služi kao zamjena za postojeću zdravstvenu iskaznicu osnovnog osiguranja, dopunskog osiguranja, oslobođenja od participacije, recepte, uputnice te kao dokument o važnijim (ne)preboljenim bolestima i alergijama.
Pametna zdravstvena iskaznica je implementirana u dva dijela. Prvi dio je terminal pametne zdravstvene iskaznice. Terminal je grafičko korisničko sučelje pisano u programskom jeziku Java što ga čini neovisnim o platformi. Može se pokrenuti na bilo kojem operacijskom sustavu koje ima podršku za Javu. Drugi dio pametne zdravstvene iskaznice je sam Java Card applet, koji se izvodi na Java Card 2.1.1. kompatibilnoj pametnoj kartici, na kojemu se nalaze svi podaci.
U poglavlju 3 opisane su Java pametne kartice. Poglavlje 4 opisuje OpenCard Framework arhitekturu, pakete OpenCard Framework-a koji su korišteni u implementaciji terminala pametne zdravstvene iskaznice i način komunikacije pametne kartice i terminala uz pomoć OpenCard Framework-a. U poglavlju 5 opisan je način implementacije terminala pametne zdravstvene iskaznice i pametne zdravstvene iskaznice i svi razredi i sučelja potrebni za izgradnju vlastite pametne zdravstvene iskaznice. Poglavlje 6 opisuje korištenje terminala pametne zdravstvene iskaznice.
Pametna kartica je prijenosno, na napade relativno otporno računalo. Neke pametne kartice imaju mali ekran od tekućih kristala (engl. liquid crystal display - LCD) i tipkovnicu za npr. unos zaporke. Te kartice nazivaju se “super pametne kartice” (engl. super smart card).
Pametne kartice se mogu razvrstati u nekoliko grupa. Ovisno o čipu razlikujemo memorijske kartice i mikroprocesorske kartice. Uzimajući u obzir prijenos podataka i mehanizam pristupa razlikujemo kontaktne, bezkontaktne i kombinirane kartice.

Slika 2.1. Podjela
kartica
Pasivne
kartice ne sadrže čip, te ih ne svrstavamo u pametne kartice.
Najpoznatije pasivne kartice su magnetske kartice s magnetskom trakom na
stražnjoj strani (npr. bankovne kartice, zdravstvene iskaznice).

Slika 2.2.
Magnetska kartica
Memorijske kartice su kartice koje nemaju vlastiti procesor te ne mogu samostalno obrađivati podatke. Uvrštavamo ih u pametne kartice samo iz povijesnih razloga. S obzirom na vrstu memorije razlikujemo tri tipa memorijskih kartica: kartice s običnom memorijom koje su obično namijenjene samo za pohranjivanje podataka, kartice s zaštićenom ili dijeljenom memorijom koje sadrže jednostavne logičke veze s kojima nadziru pristup podacima i upotrebljavaju se tamo gdje nije potrebna visoka razina sigurnost podataka i kartice s pohranjenom vrijednošću kao npr. telefonske kartice.
Iako u pametne kartice ubrajamo i memorijske i mikroprocesorske kartice, pod pojmom pametne kartice uglavnom se misli na mikroprocesorske kartice zbog “inteligencije” koju pruža ugrađeni čip. Te su kartice sposobne same obrađivati podatke. Mikroprocesorske kartice koriste se u aplikacijama koje zahtijevaju sigurnost i privatnost podataka.

Kontaktne kartice komuniciraju s vanjskim svijetom preko fizičkog komunikacijskog sučelja. Sučelje ostvaruje fizički i električni kontakt s uređajem za prihvat kartice – CAD uređajem (engl. Card Acceptance Device). Kartica ne posjeduje unutrašnje napajanje te ne može generirati signal vremenskog vođenja (engl. clock). Kontaktna kartica prikazana je na slici 2.4.

Bezkontaktne kartice komuniciraju s vanjskim svijetom preko antene ugrađene u tijelo kartice. Napajanje se izvodi pomoću baterije ugrađene u karticu ili elektromagnetske indukcije preko antene. Podaci se do CAD uređaja prenose elektromagnetskim poljem (slika 2.5.).

Slika 2.5.
Komunikacija bezkontaktne pametne kartice sa okolinom
Bezkontaktna kartica prikazana je na slici 2.6.

Slika 2.6. Bezkontaktna pametna kartica
Prednost kontaktnih kartica u odnosu na bezkontaktne kartice je ta što su kontaktne kartice manje osjetljive na torzije i savijanja. Također, kod bezkontaktne kartice, postoji potencijalna opasnost da se bez znanja vlasnika izvedu neke kartične transakcije. Zbog sigurnosnih razloga transakcije bezkontaktnih pametnih kartica traju kraće nego transakcije kontaktnih kartica, pa se zbog toga pri transakciji s bezkontaktnim karticama prenesu manje količine podataka.
U daljnjem tekstu pod pojmom pametna kartica podrazumijevati će se kontaktne mikroprocesorske kartice.
Veličina kartice
prema ISO 7810 standardu prikazana je na slici 2.7.
Sastoji se od procesora, ulazno-izlazne jedinice i memorije (ROM – engl.
Read Only Memory, RAM – engl. Random Access Memory, EEPROM –
engl. Electrically Erasable Programmable Read
Only Memory ). Današnje pametne kartice uglavnom sadrže i kripto-koprocesor koji služi za stvaranje i provjeru
digitalnih potpisa te za kriptiranje podataka simetričnim i asimetričnim kriptografskim algoritmima.

Slika 2.7. Pametna kartica prema standardu ISO 7810
Osnovno obilježje pametnih kartica je čip. Čip
je krhak i podložan vanjskim uvjetima kao što su torzija
i savijanje. Zbog toga je čip ograničen na veličinu od 25 mm2.

Slika 2.8. Čip kontaktne pametne kartice
Pametna kartica ima 8 kontaktnih točaka:
na Vcc kontakt dovodi se napajanje; naponska razina je 3V ili 5V s maksimalnim odstupanjem od 10%,
GND (engl. ground) kontakt se koristi kao referentna naponska razina; najčešće je to nulta razina,
RST (engl. reset) kontakt služi za resetiranje mikroprocesora,
Vpp kontakt je opcionalan i koristi se samo kod starih tipova kartica koje su zahtijevale korištenje dvije programske razine; niža razina označavala je pasivno stanje, viša razina se koristila za pisanje u EEPROM; današnji mikrokontroleri koriste ugrađenu strujnu pumpu,
I/O (engl. Input/Output) kontakt služi za komunikaciju između kartice i vanjskog svijeta i obratno,
RFU (engl. Reserved for Future Use) kontakti su rezervirani za buduća proširenja,
CLK (engl. clock) je signal vremenskog vođenja.
Pametna kartica komunicira s okolinom preko CAD uređaja. Postoje dvije vrste CAD uređaja: terminal i čitač kartica.

Slika 2.9. Čitač pametnih kartica
Pametna kartica komunicira s računalom putem čitača kartica (slika 2.9). Čitač je povezan s računalom putem USB (engl. Universal Serial Bus), serijskog, paralelnog ili PCMCIA (engl. Personal Computer Memory Card International Asociation) sučelja.
Terminali su računala koja čitač kartica imaju ugrađen kao vlastitu komponentu. Primjer terminala je bankomat. Osim funkcije čitača terminali posjeduju i mogućnost obrade podataka.
Aplikacije koje komuniciraju s pametnom karticom, neovisno o tome da li se radi o računalu ili terminalu nazivaju se aplikacije terminala.
Pošto između terminala i računala s čitačem kartica funkcijski nema nikakve razlike u daljnjem tekstu terminal i računalo s čitačem koristiti će se kao sinonimi.
Komunikacijski kanal između pametne kartice i računala podržava dvosmjernu komunikaciju, tj. prijenos podataka u oba smjera, no ne istovremeno (engl. half duplex).
Dva računala međusobno komuniciraju razmjenjujući podatkovne pakete. Podatkovni paketi su inspirirani protokolima kao što su TCP (engl. Transmission Control Protocol) i UDP (engl. User Datagram Protocol). Pametna kartica komunicira s računalom na sličan način koristeći vlastiti format podatkovnih paketa – APDU protokol (engl. Aplication Protocol Data Unit). Razlikujemo dva oblika APDU paketa: APDU naredba i APDU odgovor. Kartična komunikacija temelji se na sluga-gospodar organizaciji (engl. slave-master organization). Kartica uvijek preuzima ulogu sluge, čeka APDU naredbu od računala te šalje APDU odgovor.


Kada se kartica ubaci u čitač njeni se kontakti mehanički povežu s čitačem. Nakon toga kartica automatski obavlja “power on reset” i šalje ATR (engl. Answer To Reset) poruku. Obavljanje “power on reset” i slanje ATR-a zove se “topli reset”. Tom porukom kartica šalje vrijednosti parametara potrebnih za uspostavljanje međusobne komunikacije. Terminal obradi ATR i počinje sa slanjem naredbi. Kartica prima naredbe i šalje odgovore. Terminal izdaje naredbe, a kartica ih izvodi sve dok se ne izvadi iz čitača. Nakon primitka ATR-a terminal, ako želi promijeniti neki od parametara, kartici šalje PTS (engl. Protocol Type Select) naredbu.Na taj način terminal može promijeniti parametre komunikacijskog protokola, ali samo one koje dotična kartica dozvoljava. PTS naredba može se poslati samo nakon primitka ATR poruke. Inicijalni prijenos podataka između kartice i terminala prikazan je na slici 2.11.


APDU protokol je komunikacijski protokol namijenjen za komunikaciju pametnih kartica i vankartičnih aplikacija. APDU format je definiran standardom ISO 7816-4. APDU poruke definirane u ISO 7816-4 standardu obuhvaćene su u dvije strukture: jednu strukturu koristi računalo za slanje naredbi kartici, a drugu kartica za slanje odgovora računalu.
Računalo kartici šalje APDU naredbu. Zaglavlje APDU naredbe sastoji se od 4 okteta: oznake razreda kojoj pripada naredba (CLA – engl. class), oznaka naredbe (INS – engl. instruction) i parametri naredbe (P1 i P2). Nakon zaglavlja APDU naredbe slijedi tijelo APDU naredbe. Prvi oktet tijela APDU naredbe je Lc polje koje predstavlja veličina podatkovnog dijela poruke u oktetima. Nakon podatkovnog polja slijedi neobvezno Le polje koje pokazuje maksimalan broj okteta koji očekuje od aplikacije u sljedećem odgovoru.
Kartica šalje APDU odgovor koji se sastoji od neobveznog tijela i obaveznog zaglavlja. Zaglavlje se sastoji od polja SW1 i SW2 koji zajedno tvore statusnu riječ (engl. status word ) te opisuju u kojem se stanju kartica trenutno nalazi. Ta dva okteta označavaju da li je naredba izvedena ili je došlo do pogreške. Npr. statusna riječ 0x9000 označava da je naredba prošla bez pogreške, 0x6E00 označava da razred APDU naredbe nije podržan, 0x6B00 označava grešku u parametrima P1 i P2 itd. Tijelo je podatkovno polje čija je duljina određena Le poljem APDU naredbe i označava se sa Lr.

Slika 2.12. Struktura APDU naredbe

Slika 2.13. Struktura APDU odgovora
Iz činjenice da APDU naredba i APDU odgovor uvijek dolaze u paru i da je podatkovno polje opcionalne veličine, proizlaze četiri moguća slučaja APDU komunikacije (slika 2.14.):
APDU naredba APDU odgovor

Slika
2.14. Mogući slučajevi APDU komunikacije
TPDU protokol (engl. Transmission Protocol Data Unit) je prijenosni protokol niže razine definiran standardom ISO 7816-3. Podatkovne strukture koje izmjenjuju kartica i računalo nazivaju se TPDU jedinice. Trenutačno su u kartičnim sustavima najraširenija dva tipa prijenosnih protokola: T=0 protokol i T=1 protokol. Oba protokola su asinkroni i dvosmjerni.
T=0 protokol je oktetno orijentiran, što znači da je najmanja prenesena jedinica jedan oktet. Zahvaljujući oktet orijentaciji protokola, prilikom otkrivanja pogreške u prijenosu odmah se zahtjeva ponovni prijenos netočnog okteta. Detekcija pogreške se zasniva na paritetnom bitu koji se dodaje svakom poslanom oktetu.
T=1 protokol je blokovski orijentiran. T=0 protokol smatra se zastarjelim jer nejasno odvaja aplikacijski i prijenosni sloj, dok T=1 protokol odvaja ta dva sloja ukalupljujući APDU poruke u TPDU jedinice.
T=2 protokol se temelji na T=1 protokolu. Također je blokovski orijentiran. Razlika je u tome što T=2 protokol omogućuje istovremeni prijenos podataka u oba smjera (engl. full duplex).
Za razliku od operacijskih sustava na osobnim računalima, operacijski sustav kartice ne uključuje korisničko sučelje i nema mogućnost pristupa vanjskim jedinicama za pohranu podataka. Danas najpoznatiji operacijski sustavi za pametne kartice su Java Card, Multos, Zeit Control Basic Card i Smart Card for Windows.
Osnovna namjena operacijskog sustava kartice je prijenos podataka, kontrola izvođenja naredbi, upravljanje datotekama, izvođenje kriptografskih algoritama, provjera i stvaranje digitalnih potpisa. Standard ISO 7816-4 predstavlja temelj za većinu današnjih operacijskih sustava kartica. Zbog sve većih zahtjeva za pametnim karticama razvila se potreba za bržim razvojem kartičnih aplikacija. Brži razvoj kartičnih aplikacija ne smije ugroziti glavni razlog upotrebe pametnih kartica, njihovu sigurnost. Java Card tehnologija omogućuje da se programi pisani u Java programskom jeziku izvode na računalima ograničenih sredstava s jednakom sigurnošću kao i na računalima “neograničenih” sredstava.
Razlika između Java kartica i ostalih kartica je podjela na razine s jasno određenim pravilima među njima (slika 2.15.).


Slika 2.15. Podjela na razine kod Java kartica (gore) i ostalih kartica (dolje)
Java Card tehnologija omogućuje da se programi pisani u Java programskom jeziku izvode na pametnim karticama i drugim uređajima ograničenih sredstava. Nasljeđuje sigurnosne osobine Java programskog jezika. Java pametne kartice ili kraće Java kartice omogućuju izvođenje kartičnih aplikacija na svakoj pametnoj kartici koja ima Java Card stogovni stroj (engl. Java Card Virtual Machine - JCVM). Java Card stogovni stroj podijeljen je na dva djela: prvi dio koji se izvodi na kartici i drugi koji se izvodi izvan kartice.
Kako bi se omogućila podrška za Java programski jezik Java Card tehnologija definira Java Card izvršnu okolinu (engl. Java Card Runtime Enviroment - JCRE). Ona podržava komunikacijski model, sigurnost, kartični model i aplikacijski izvršni model. Najznačajnije obilježje JCRE-a je da omogućuje neovisnost kartičnih aplikacija od operacijskog sustava pametne kartice.
Aplikacije pisane za Java Card platformu nazivaju se appleti. Zbog podijeljene arhitekture stogovnog stroja Java Card platforma je podijeljena između pametne kartice i ostatka kartičnog sustava. Sastoji se od tri dijela:
Java Card stogovni stroj (engl. Java Card Virtual Machine, JCVM)
Java Card izvršna okolina (engl. Java Card Runtime Enviroment, JCRE)
Java Card programsko sučelje (engl. Application Programming Interface, API)
Java Card stogovni
stroj podijeljen je na dva dijela: prvi dio koji se izvodi na kartici i
drugi koji se izvodi izvan kartice.

Slika
3.1. Java Card stogovni stroj
Osnovna razlika između Java stogovnog stroja (engl. Java Virtual Machine, JVM) i Java Card stogovnog stroja je u tome što je JCVM implementiran u dva dijela, Java Card prevoditelj i Java Card interpreter.
Kartični dio JCVM je Java bytecode interpreter. Java Card prevoditelj izvodi se na računalu. Java Card prevoditelj i Java Card interpreter implementiraju sve funkcije stogovnog stroja. Java Card prevoditelj učitava i procesira “class” datoteke i proizvodi CAP datoteke (engl. converted applet). CAP datoteka se učitava u pametnu karticu i izvodi od strane Java Card interpretera.
Java Card interpreter, budući da se nalazi na samoj kartici, omogućuje neovisnost appleta o platformi. Java Card interpreter izvodi sljedeće:
Java Card interpreter je ključan za sigurnost prilikom izvođenja kartične aplikacije.
Java prevoditelj iz izvornog koda stvara class datoteke. Prilikom prevođenja izvodi se sljedeće:
Osnovna funkcija JCRE je uloga operacijskog sustava kartice. JCRE je odgovoran za mrežnu komunikaciju, upravljanje kartičnim sredstvima, izvođenje appleta i za sigurnost kartičnih programa. Sastoji se od Java Card stogovnog stroja, Java Card osnovnih aplikacijskih razreda (engl. Java Card Application Framework Classes), JCRE razreda sustava i industrijskih proširenja.
JCVM izvodi bytecode, nadgleda zauzeće memorije, upravlja objektima i sigurnosnim mehanizmima za vrijeme izvođenja.
Razredi sustava su analogni jezgri operacijskih sustava. Oni upravljaju transakcijama.
JVM se izvodi na osobnom računalu kao proces operacijskog sustava. Podaci i objekti stvaraju se u RAM-u. Na Java pametnoj kartici JCVM se izvodi unutar Java Card izvršne okoline. JCRE se inicijalizira za vrijeme inicijalizacije kartice. Inicijalizacija kartice odvija se samo jednom u životu pametne kartice. Za vrijeme tog procesa JCRE inicijalizira stogovni stroj i stvara objekte koji omogućuju JCRE usluge i upravljanje appletima. Nakon učitavanja appleta JCRE stvara njihove primjerke (engl. instance), a appleti stvaraju svoje objekte za pohranu podataka.
Java Card programsko sučelje sastoji se od skupa prilagođenih razreda za programiranje kartičnih aplikacija prema ISO 7816 modelu. Definira standardizirano sučelje za programiranje appleta. JavaCard 2.1.1. platforma sadrži četiri osnovna paketa:
Java Card java.lang paket je podskup odgovarajućeg java.lang paketa Java platforme. Sadrži razrede Object i Throwable i iznimke vezane uz JCRE. Razred Object je korijen (engl. root) u hijerarhiji Java Card razreda. Razred Throwable jenadrazred (engl. superclass) svih pogrešaka Java Card platforme.
Java Card javacard.framework paket je središnji paket koji omogućuje osnovnu funkcionalnost svojim razredima i sučeljima. Ovaj paket definira osnovni razred Applet koji za vrijeme života appleta predstavlja sučelje za komunikaciju appleta s JCRE-om. Sljedeći važniji razred koji ovaj paket sadrži je APDU razred. Taj razred pruža metode bitne za kontrolu ulaznih i izlaznih podataka kartice. Razred JCSystem sadrži skup metoda koje nadgledaju izvođenje appleta, zauzeće sredstava, transakcije i djeljenje sredstava unutar appleta.
Paket sadrži i sljedeće razrede: AID (engl. Application Identifier) koji služi za identificiranje aplikacija, OwnerPIN za identifikaciju korisnika i Util koji sadrži uslužne funkcije.
Osim razreda ovaj paket sadrži i sučelja. Sučelje ISO7816 ukalupljuje konstante vezane uz ISO 7816-3 i ISO 7816-4. Sučelje Shereable služi za identificiranje svih djeljenih objekata. Najvažnije sučelje koje podržava ovaj paket je sučelje PIN.To sučelje predstavlja PIN (engl. Personal Identification Number). Razredi koji implementiraju ovo sučelje moraju sadržavati vrijednost PIN-a, maksimalni dozvoljeni broj unosa pogrešnog PIN-a (engl. try limit), maksimalnu dozvoljenu duljinu PIN-a, brojač maksimalno dozvoljenog broja unosa pogrešnog PIN-a prije nego što se PIN blokira (engl. try counter) i zastavicu koja označava da li je PIN unesen.
Paket javacard.framework definira osam iznimki: PINException koja se javlja u slučaju pogreške vezane uz PIN npr. ako je kartica zaključana zbog višestrukog pogrešnog unosa PIN-a, ako se kartica želi inicijalizirati sa predugačkim PIN-om, APDUException koja se javlja u slučaju pogreške vezane uz APDU npr. ako je međuspremnik u koji želimo spremiti APDU naredbu ili odgovor prekratak, CardException koja se javlja ako je nastala greška pri komunikaciji s karticom, CardRuntimeException koja se javlja ako je nastala greška prilikom rada s karticom, ISOException koja statusne riječi sadržane u ISO 7816-4 predstavlja kao razlog iznimke, UserException koja se javlja u slučaju pogreške definirane npr. od strane programera, SystemException koja predstavlja iznimku JCSystem razreda i TransactionException koja se javlja ako je nastala iznimka prilikom transakcije.
Java Card javacard.security paket pruža razrede i sučelja koji sadrže javno dostupne kriptografske funkcije podržane na Java Card platformi. Zasniva se na paketu java.security.
Paket definira razrede za izgradnju simetričnih ključeva KeyBuilder, generiranje para ključeva KeyPair, računanje sažetka poruke MessageDigest, generiranje pseudo slučajnih brojeva RandomData i potpisivanje Signature.
Osim razreda ovaj paket podržava i veliku količinu sučelja: DESKey, DSAKey, DSAPrivateKey, DSAPublicKey, Key, PrivateKey, PublicKey, RSAPrivateCrtKey, RSAPrivateKey, RSAPublicKey i SecretKey.
Paket definira iznimku CryptoException koja se javlja ako je nastala iznimka tijekom izvođenja kriptografskih funkcija.
Java Card javax.crypto paket dodatni je paket koji sadrži kriptografske razrede i podliježe izvoznim zakonima SAD-a. Definira osnovni razred Cipher koja podržava funkcije kriptiranja i dekriptiranja i sučelje KeyEncryption koje definira metode koje omogućuju pristup kriptiranim ključevima.
Zbog malog memorijskog kapaciteta i ograničenih sredstava, Java Card platforma podržava samo mali podskup osobina programskog jezika Java. Taj podskup prilagođen je pisanju programa za pametne kartice i sačuvao je objektno orijentirane osobine programskog jezika Java.
Java Card platforma podržava primitivne tipove podataka kao što su boolean,byte i short, dok ne podržava long, float, char i string tipove podataka. Neke kartice podržavaju int tip podataka. Također nisu podržana višedimenzijska polja, dok su jednodimenzijska polja podržana. Podržani su Java paketi, razredi, sučelja i iznimke. Od objektno orijentiranih osobina podržano je nasljeđivanje, virtualne osobine, nadjačavanje, dinamičko stvaranje objekata i pravila povezivanja.
Nije podržano
dinamičko učitavanje razreda, sakupljanje smeća, dretve, te
serijalizacija i kloniranje objekata.
Kako bi sustav temeljen na pametnim karticama radio ispravno potrebno je osim implementacije funkcionalnosti poznavati sklopovlje pametne kartice, čitača pametne kartice i APDU protokol. Razvijanje sustava na takav način bilo bi dugotrajno i skupo. Raslojavanjem se dio napravljen na “višem” sloju može implementirati neovisno o “nižim” slojevima. Također jednom napravljen “niži” sloj može raditi neovisno o “višim” slojevima.
OpenCard Framework arhitektura (u daljnjem tekstu OCF) omogućuje raslojavanje pri izradi sustava temeljenih na pametnim karticama. OCF jasno definira dva bitna sloja: sloj terminala i sloj kartične usluge.
Sloj terminala omogućuje da se za jednom napravljeni čitač pametnih kartica izradi određeni CardTerminal razred koji “višim” slojevima pruža standardizirano programsko sučelje. CardTerminal je neka vrsta upravljačkog programa za čitače kartica. CardTerminal-i mogu ostvariti pristup prema čitaču preko standardnih Java razreda za komunikaciju preko serijskog sučelja (paket javax.comm) ili uz pomoć JNI-a (engl. Java Native Interface) sa nekim platformsko-ovisnim upravljačkim programom “niske” razine.
OCF je skup Java paketa i razreda napravljen da olakša i ubrza izradu sustava koji se temelje na pametnim karticama. OCF arhitektura omogućuje da
rade zajedno.
Davatelj aplikacijskih usluga stvara vankartične i kartične aplikacije koje vidi krajnji korisnik pametne kartice. Vankartična aplikacija koristi sučelja i kartične usluge OCF-a da bi komunicirala sa kartičnim aplikacijama. Izdavač kartičnog operacijskog sustava izrađuje osnovni operacijski sustav na kojemu će se izvoditi kartične aplikacije. Izdavač kartice odgovoran je za inicijalizaciju, personalizaciju i izdavanje kartice. Izdavač je odgovoran za sloj upravljanja kartičnim aplikacijama (engl. application management layer). Taj sloj omogućuje da više različitih aplikacija i aplikacijskih podatka istovremeno postoji na jednoj kartici. Proizvođač čitača kartica doprinosi uređajem koji komunicira izravno s karticom. Sloj koji se nalazi na kartici pruža osnovnu infrastrukturu za pristup podacima i za korištenje usluga koje se nalaze na kartici.
OCF arhitektura prikazana je na slici 4.1.

Slika 4.1. OCF arhitektura
Razred CardService predstavlja sloj kartične usluge i ukalupljuje posebnosti operacijskog sustava kartice i kartične aplikacije. On predstavlja programsko sučelje “visoke” razine prema aplikaciji i brine se o svim komunikacijskim detaljima APDU veze. Primjer CardService razreda bio bi način pristupu datotekama na ISO kartičnom datotečnom sustavu. Taj način koristio bi osnovne usluge izdavača kartice. Svi podaci o CardService razredima nalaze se u razredu CardServiceFactory.RazredCardServiceRegistry sadrži podatke o svim registriranim CardServiceFactory objektima.
CardService objekt komunicira s pametnom karticom putem razreda CardServiceScheduler. Taj razred sinkronizira konkurentne pristupe jednoj kartici od strane više različitih aplikacija. Za svaki SmartCard objekt postoji točno jedan CardServiceScheduler objekt. Razred SmartCard je osnovni razred koji koristi aplikacija. Da bi kartica dohvatila CardService module, potreban je objekt SmartCard razreda. Svaki objekt ofc razreda ima CardID koji sadrži informacije o kartici.
Svaki čitač kartice ima vlastiti komunikacijski protokol. CardTerminal predstavlja sučelje za različite čitače kartica. Proizvođač čitača kartica obično pruža i implementaciju tog sučelja. CardTerminal ima jedan ili više objekata tipa Slot. Ti objekti koriste se samo u terminalima koji imaju više utora. CardTerminalFactory odgovoran je za stvaranje CardTerminal objekata. Razred koji sadrži podatke o CardTerminal objektima je razred CardTerminalRegistry.
Razredi OCF-a podijeljeni su na osnovne (engl. base) i dodatne. Osnovni razredi podijeljeni su u dva paketa: opencard.core i opencard.opt.
Paket opencard.core.service sadrži razrede i sučelja za rad s pametnim karticama.
Svaka pametna kartica ima vlastiti identifikator. Sučelje CardIDFilter služi za filtriranje kartičnih identifikatora. Koristi se samo ako želimo koristiti karticu koja ima specifičan ATR. Za izbor takve kartice sučelje se koristi u kombinaciji sa razredom CardService. Sučelje CHVDialog mora biti implementirano za sve dijaloge koje će koristiti kartične usluge (razred CardService) za CHV (engl. Card Holder Verification) unose. CHV je broj kojim provjeravamo korisnika (npr. PIN). Za jednu karticu može biti registrirano više od jedne kartične usluge (razred CardService). Jedna od tih usluga mora biti osnovna. Za to se brine sučelje PrimaryCardServiceFactory.
Osim sučelja opencard.core.service paket implementira i razrede. RazredCardChannel predstavlja komunikacijski kanal prema kartici. Služi za razmjenu APDU paketa. Može se koristiti i za pristup nekim drugim sredstvima koje kartica koristi, kao npr. terminalu. Razred koji pruža povjerljiv put (engl. trusted path) prema OCF-u je CardHolderVerificationGUI.RazredCardRequest se koristi za “čekanje” da se kartica ubaci u terminal. On određuje koju vrstu pametne kartice aplikacija očekuje. Razred DefaultCHVDialog implementira sučelje CHVDialog. On implementira inicijalni dijalog koji će koristiti kartične usluge (razred CardService). Razred CardType predstavlja tip kartice koji je odredio razred CardServiceFactory. Identifikator kartice je određen ATR-om kartice, dok je tip kartice određen pripadnošću kartice nekom razredu (karticu klasificira razred CardServiceFactory ovisno o vlastitim pravilima za određivanje pripadnosti). Razredi CardService, CardServiceFactory, SmartCard, CardServiceRegistry i CardServiceScheduler opisani su o poglavlju 4.1.
Paket definira i devet iznimki. CardServiceException je korijen svih provjerenih iznimki koje su nastale u kartičnim uslugama prije izvođenja. CardServiceRuntimeException je korijen svih iznimki nastalih u kartičnim uslugama tijekom izvođenja. CardServiceImplementationException je korijen svih iznimki nastalih zbog grešaka (engl. bug) ili ograničenja dotične implementacije. Iznimka CardServiceInabilityException ukazuje da tražena operacija nije dozvoljena. Kada ponuđena isprava o identitetu (npr. CHV) nije ispravna javlja se CardServiceInvalidCredentialException. U slučaju prosljeđivanja pogrešnih parametara kartičnoj usluzi javlja se CardServiceInvalidParameterException. U slučaju da se tražena operacija ne može izvesti na kartici javlja se iznimka CardServiceOperationFailedException. Ako se kartica koristi na krivi način javlja se CardServiceUsageException. U slučaju da kanal prema kartici nije slobodan javlja se iznimka InvalidCardChannelException.
Paket opencard.core.terminal pruža razrede i sučelja za rad s čitačima pametnih kartica.
Sučelje CardTerminalFactory i razredi CardTerminal,CardTerminalRegistry opisni su u poglavlju 4.1. Sučelje CHVEncoder dekodira niz za provjeru vlasnika kartice (CHV). Postoje dvije vrste dekodiranja: STRING_ENCODING koji ulazni niz samo pretvara u niz okteta (koristi metodu String.getBytes()) i BCD_ENCODING kod kojeg je ulazni niz PIN korisnika kartice u binarnom kodiranom formatu (BCD). Sučelje Observer razdvaja paket opencard.core.event od paketa opencard.core.terminal i omogućuje da se opencard.core.terminal paket koristi bez opencard.core.event paketa. Također omogućuje programerima da implementiraju vlastite mehanizme događaja (engl. event mechanism). Sučelje Pollable moraju implementirati implementacije razreda CardTerminal ako ne stvaraju događaje kada je kartica umetnuta ili izvađena iz uređaja za prihvat kartice. Samo ako razred CardTerminal implementira sučelje VerifiedAPDUInterface može tražiti korisnika da unese CHV podatke.
APDU razred predstavlja APDU protokol za komunikaciju s karticom. Podržava APDU pakete definirane standardom ISO 7816-4. Razred CardID predstavlja kartični ATR. Osim ATR-a može čuvati i podatke o utoru u kojem se kartica nalazi. Razred CHVControl određuje svojstva provjere vlasnika kartice, kao npr. identifikator aplikacije, CHV broj, kontrolne parametre... . Razred CommandAPDU predstavlja razred za korištenje APDU naredbi. Razred ResponseAPDU predstavlja razred za korištenje APDU odgovora dobivenih sa kartice. Razred SlotChannel služi kao “vrata” prema pametnoj kartici. Koristi se i za slanje i primanje APDU paketa i interakciju s karticom.
Paket implementira i šest iznimki. Iznimka CardTerminalException je korijen svih iznimki u ovom paketu. CardNotPresentException se javlja kada bi kartica trebala biti u jednom od utora, ali nije. Ako je nastala greška prilikom komunikacije javlja se CommunicationErrorException. Iznimka InvalidSlotChannelException se javlja ako je traženi SlotChannel kriv. Iznimke TerminalInitException i TerminalTimeoutException nastaju kada dođe do isteka vremena prilikom komunikacije (engl. timeout).
Paket opencard.core.event sadrži razrede i sučelja za rad s događajima (engl. event). Događaj je ubacivanje ili vađenje kartice iz uređaja za prihvat kartice.
Sučelje CTListener služi za primanje CardTerminalEvent-ova. Sučelje TracerListener služi za provjeravanje TraceEvent-ova.
Razred OpenCardEvent je nadrazred za sve događaje unutar OCF-a. Razred CardTerminalEvent signalizira ubacivanje ili vađenje kartice iz uređaja za prihvat kartice. Razred EventGenerator se ponaša kao generator događaja. On periodički provjerava uređaje za prihvat kartica i ako je detektirao da je kartica ubačena ili izvađena stvara događaj kojeg ”šalje” primjerku razreda CardTerminalEvent. Može generirati CARD_INSERTED i CARD_REMOVED događaje. Razred TracerEvent signalizira sve događaje vezane uz praćenje kartice.
Kako bi kartica mogla komunicirati s terminalom potrebno je inicijalizirati OCF. Jedan od načina inicijalizacije je korištenje opencard.properties datoteke. OCF se inicijalizira naredbom SmartCard.start(). Ta naredba pomoću opencard.properties datoteke popunjava CardTerminalRegistry i CardServiceRegistry. Datoteka korištena u implementaciji pametne zdravstvene iskaznice prikazana je na slici 4.2.
###############################
Slika 4.2. Opencard.properties datoteka korištena za
implementaciju pametne zdravstvene iskaznice
Uz pomoć razreda CardRequest() specificiramo koju karticu aplikacija treba čekati i na kojem terminalu se nalazi. Objekt tipa CardRequest() instanciramo na sljedeći način:
Kartica koju čekamo može biti nova kartica koju tek treba umetnuti u čitač (CardRequest.NEWCARD) ili kartica koja je već u čitaču (CardRequest.ANYCARD). Terminal na kojem čekamo karticu može biti bilo koji od terminala koji su priključeni na računalo (null) ili neki određeni terminal. Kako bi se specificirao neki određeni terminal koristi se razred CardTerminalRegistry. Registrirane terminale dobivamo pozivom metode CardTerminalRegistry.getRegistry().
U slučaju komunikacije s pametnom zdravstvenom iskaznicom kao razred koji čeka karticu korišten je PassThruCardService. Nakon što smo stvorili zahtjev za karticom na terminalu pomoću naredbe
SmartCard kartica = SmartCard.waitForCard(cr)
čekamo da se kartica ubaci u terminal.
Kada se kartica ubaci u terminal može se stvoriti usluga za pristup kartici npr. na sljedeći način:
kartica.getCardService(PassThruCardService.class,true)
gdje prvi parametar označava razred koji će objekt tipa CardService implementirati, a drugi parametar označava da li će CardService raditi u blokirajućem (true) ili neblokirajućem načinu rada (false).
Kada je usluga stvorena otvara se veza prema kartici i odabire kartični applet.
Pametna zdravstvena iskaznica je Java pametna kartica koja služi kao zamjena za zdravstvenu iskaznicu, iskaznicu dodatnog osiguranja, potvrdu o oslobođenju od participacije te pruža mogućnost pamćenja recepta, uputnica i važnijih (ne)preboljenih bolesti i alergija .
Pametna zdravstvena iskaznica kompatibilna je sa Java Card platformom 2.1.1. Na kartici se nalazi Java Card applet i primjerak razreda ImplementacijaPZI.Applet sprema podatke o osnovnom osiguranju korisnika, dopunskom osiguranju, oslobođenju od participacije, recepte, uputnice i važnije bolesti i alergije. Kartica može spremiti do 10 uputnica, 10 recepata i 20 bolesti ili alergija, iako fizički na nju stane puno više. Za potrebe pametne zdravstvene iskaznice iskorišteno je samo 11KiB EEPROM-a od raspoloživih 60KiB EEPROM-a (korištene kartice imaju 64KiB EEPROM-a).
Pametna zdravstvena iskaznica je zasnovana na poslužitelj-klijent odnosu (engl. server-client). U našem slučaju terminal preuzima ulogu poslužitelja. On započinje i završava sve transakcije. Kartica preuzima ulogu klijenta, te obavlja naredbe terminala.
Implementacija pametne zdravstvene iskaznice sastoji se od Java aplikacije koja se izvodi unutar Java stogovnog stroja računala (JVM). To računalo naziva se “terminal pametne zdravstvene iskaznice”. Implementacija se sastoji i od Java Card appleta koji se izvodi na Java Card stogovnom stroju kartice (JCVM). Taj applet nazivamo “applet pametne zdravstvene iskaznice”.
Terminal pametne zdravstvene iskaznice je GUI (engl. Graphical User Interface) aplikacija pisana u programskom jeziku Java. S karticom komunicira putem dva CAD (engl. Card Acceptance Device) uređaja. Jedan CAD uređaj namijenjen je liječnikovoj, ljekarnikovoj ili izdavačevoj kartici (u daljnjem tekstu vlasniku terminala), a drugi CAD uređaj namijenjen je osiguraniku (vlasniku kartice). Omogućuje pregled, dodavanje i poništavanje recepata, uputnica, bolesti i alergija, te pregled i dodavanje podataka o osnovnom, dopunskom osiguranju i oslobođenju od participacije.
Podaci na kartici zaštićeni su sa tri osmeroznamenkasta PIN-a (engl. Personal Identification Number). Postoje korisnički PIN (engl. cardholder PIN), PIN izdavača kartice (engl. card issuer PIN) i PIN izdavača kartične aplikacije (engl. application provider PIN). PIN najviše razine je PIN izdavača kartične aplikacije. Sljedeći je PIN izdavača kartice dok je korisnički PIN PIN najniže razine. To znači da onaj tko se autorizira pomoću PIN-a izdavača kartične aplikacije ima sve ovlasti kao izdavač kartične aplikacije, izdavač kartice i korisnik kartice, dok onaj tko se autorizira pomoću PIN-a korisničke kartice ima samo ovlasti korisnika kartice.
Podaci se prije slanja s kartice na terminal i obratno, s terminala na karticu, kriptiraju i digitalno potpisuju. Prilikom primanja podaci se dekriptiraju, te se provjerava digitalni potpis.
Na karticu se osim podataka o receptu i uputnici sprema i digitalni potpis tih podataka koje je potpisao liječnik.
Implementirani razredi i sučelja
prikazani su na slici 5.1.

Slika 5.1. UML dijagram programske implementacije pametne zdravstvene
iskaznice i terminala pametne zdravstvena iskaznice
Terminal
i pametna zdravstvena iskaznica komuniciraju putem dva CAD uređaja.
Nakon pokretanja programa, prije nego se podaci sa kartice mogu
pregledavati liječnik ili ljekarnik se treba prijaviti na sustav. To
obavlja ubacivanjem svoje kartice u jedan od CAD uređaja priključenih na
terminal i unosom PIN-a (slika 5.2.).

Slika 5.2. Prozor za unos PIN-a
PIN se smije pogriješiti dva puta (slika 5.3.).
Nakon toga kartica se zaključava (slika 5.4.),
a može je otključati izdavač kartične aplikacije ili izdavač kartice
unosom svog PIN-a.

Slika 5.3. Unos krivog PIN-a

Nakon uspješne prijave vlasnika terminala mogu se početi pregledavati podaci sa osiguranikove kartice, naravno nakon unosa osiguranikova PIN-a. PIN se također smije pogriješti dva puta, nakon čega se kartica zaključava. Tek sada se podaci osiguranika mogu pregledavati, mijenjati ili unositi.
Terminal i pametna zdravstvena iskaznica komuniciraju putem APDU protokola. Terminal šalje APDU naredbe kartici, a kartica obavlja naredbe i šalje APDU odgovor. Formati APDU naredbe i APDU odgovora opisani su u poglavlju 2.5.
Prije nego terminal i kartica počnu razmjenjivati podatke potrebno je odabrati applet na kartici koji će podatke koje je terminal poslao obraditi. Odabiranje appleta obavlja se samo jednom i to prije početka razmjene podataka. Identifikator appleta (AID) pametne zdravstvene iskaznice je 0x11223344556677. Taj niz šalje se kao parametar funkciji odaberiApplet() prikazanoj u poglavlju 5.4.3.
Java Card 2.1.1. platforma sadrži razred APDU. Razred podržava samo poruke definirane standardom ISO 7816-4. Razred sadrži međuspremnik koji služi za slanje i primanje podataka. Veličina međuspremnika mora biti barem 37 okteta (5 okteta za zaglavlje i 32 okteta za podatke). APDU međuspremnik je statički objekt kojeg stvara JCRE. Prije primanja nove poruke od kartice JCRE mora međuspremnik popuniti nulama.
APDU objekt je privremen objekt u vlasništvu JCRE-a. Metodom getBuffer() dobivamo referencu na trenutni sadržaj APDU međuspremnika. JCRE međuspremnik označava kao globalnu varijablu pa mu se može pristupiti iz bilo kojeg dijela appleta.
Prilikom slanja naredbe na karticu terminal postavlja četiri okteta zaglavlja. Kartica odgovara s odgovarajućim zaglavljem dugim dva okteta. Zaglavlje odgovora se još naziva i statusna riječ (engl. status word). Npr. 0x9000 znači da je naredba provedena bez greške.
U slučaju da su odlazni podaci preveliki da bi stali u APDU međuspremnik oni se šalju u dijelovima. Pri tome se koristi metoda sendBytesLong().Obrnuto, ako su dolazni podaci preveliki da stanu u APDU međuspremnik oni se primaju u dijelovima koristeći metodu receiveBytes().
APDU razred definira i konstante stanja koje označavaju stanje u kojem se APDU nalazi. Pozivom metode getCurrentState() saznajemo u kojem se stanju APDU objekt nalazi. Neka od stanja prikazana su u tablici 5.1. Redoslijed stanja u slučaju da nema pogreške prikazan je u tablici 5.2.
|
STANJE |
OPIS |
|
STATE_INITIAL |
početno stanje |
|
STATE_ERROR_IO |
stanje u kojem se nalazi kada se dogodi iznimka |
|
STATE_PARTIAL_INCOMING |
stanje u kojem se nalazi ako je dio podataka primljen |
|
STATE_FULL_INCOMING |
stanje u kojem se nalazi ako su svi podaci primljeni |
|
STATE_OUTGOING |
stanje u kojem se ukazuje da će se podaci slati |
|
STATE_OUTGOING_LENGTH_KNOWN |
stanje u kojem se zna duljina podataka koje šaljemo |
|
STATE_PARTIAL_OUTGOING |
stanje u kojem se nalazi ako je dio podataka poslan |
|
STATE_FULL_OUTGOING |
stanje u kojem se nalazi ako su svi podaci poslani |
Tablica 5.1. Neka stanja APDU razreda
|
STANJE |
|
STATE_INITIAL |
|
STATE_PARTIAL_INCOMING |
|
STATE_FULL_INCOMING |
|
STATE_OUTGOING |
|
STATE_OUTGOING_LENGTH_KNOWN |
|
STATE_PARTIAL_OUTGOING |
|
STATE_FULL_OUTGOING |
Tablica 5.2. Redoslijed stanja ADPU razreda u slučaju da nije bilo pogreške
APDU razred API je dizajniran da bude neovisan o protokolu tako da se mogu koristiti sve metode neovisno da li se radi o protokolu T=0 ili T=1. Pozivom metode getProtocol() saznajemo o kojem protokolu se radi.
Metoda setIncomingAndReceive() je glavna metoda APDU razreda. Pozivom te metode ukazuje se da se podaci primaju. Ta metoda prima dolazne podatke i kopira ih u međuspremnik pazeći da podaci stanu u međuspremnik. Nakon toga pozivom metode getBuffer() podaci su spremni za daljnju uporabu. Metoda setOutgoingAndSend() pruža najučinkovitiji način slanja kratkih poruka. Ta metoda je kombinacija metoda setOutgoing() koja postavlja tok podataka na izlazni, setOutgoingLength() koja postavlja veličinu poruke koja se šalje i sendBytes() koja šalje podatke.
Razredi i sučelja
koja čine implementaciju kartične aplikacije pametne zdravstvene
iskaznice nalaze se u paketu
hr.fer.zemris.diplomski.pametnaZdravstvenaIskaznica.
Paket sadrži sučelja SuceljePZI i SuceljeSigurnosti,
te razrede AppletPZI,UslugaSigurnosti
i ImplementacijaPZI.
Paket
sadrži sučelje SuceljePZI
koje predstavlja zajedničko sučelje za terminal i karticu. Ono sadrži
niz zajedničkih konstanti kao npr. konstante zaglavlja APDU naredbi.
Neke od konstanti prikazane su na slici 5.5.
Razred ImplementacijaPZI
implementira metode pametne zdravstvene iskaznice. Sadrži šest ugnježđenih razreda koji služe za spremanje
podataka. To su razredi Bolest u
kojem se čuvaju podaci o bolestima i alergijama, Oslobodenje
u kojem se čuvaju podaci o oslobođenju od participacije, Dopunsko u
kojem se čuvaju podaci o dopunskom osiguranju, Osnovno u
kojem se čuvaju podaci o osnovnom osiguranju, Recept u
kojem se čuvaju podaci o receptu i digitalni potpis recepta i Uputnica u
kojem se čuvaju podaci o uputnici i digitalni potpis uputnice. Podaci
koji se čuvaju prikazani su na slikama 5.6 – 5.11.
Podaci o oslobođenju od participacije,
dopunskom i osnovnom osiguranju parsiraju se i spremaju u
lokalne varijable, dok se podaci o bolesti, receptu i uputnici ne
parsiraju nego se čuvaju kao niz okteta.
Slika 5.6. Razred Bolest
Slika 5.7. Razred Dopunsko
Slika 5.8. Razred Oslobodenje
Slika 5.9. Razred Osnovno
Slika 5.10. Razred Recept
Slika 5.11. Razred Uputnica
Podaci
o bolestima, uputnicama i receptima se pamte u primjercima ugnježđenog razreda OgranicenaLista. Pošto JCVM ne implementira sakupljanje smeća (engl.
garbage collection) svaki alocirani oktet
memorije ostaje trajno zauzet, a brisanjem npr. uputnice briše se samo
referenca na alociranu memoriju i taj dio
ostaje trajno neupotrebljiv. Zato se koristi razred OgranicenaLista koji pri
brisanju objekta ne briše referencu na memoriju već pri sljedećem unosu
“obrisane” podatke zamjeni novim podacima. Brisanje elemenata iz razreda OgranicenaLista
prikazano je na slici 5.12. Prije brisanja elementa iz liste sačuva se
referenca na taj element. Nakon toga sve elemente liste, koji se nalaze
iza elementa kojeg brišemo, pomaknemo za jedno mjesto niže (tj. ako je
element bio sačuvan na i-tom mjestu u listi pomaknemo ga na (i-1)-vo
mjesto). Element kojeg brišemo stavimo na kraj liste, a broj elemenata
smanjimo za jedan. Na taj način nije izgubljena referenca na obrisani
element i njegovo mjesto može se iskoristiti za umetanje novog elementa.
Slika 5.12. Brisanje elementa iz razreda OgranicenaLista
Unos elementa u razred OgranicenaLista prikazan je na slici 5.13. Varijabla brElem označava broj postojećih elemenata u listi.
Slika 5.13. Dodavanje elementa u razreda OgranicenaLista
U razredu ImplementacijaPZI implementirano je i nekoliko metoda. Metoda broj() je univerzalna metoda koja vraća broj zapamćenih uputnica, bolesti ili recepata. Za dohvaćanje broja zapamćenih uputnica, recepata ili bolesti mora se autorizirati barem sa korisničkim PIN-om. Metoda je prikazana na slici 5.14.
protected byte broj(byte CLA) throws ISOException,UserException{
Slika 5.14. Dohvat broja uputnica, recepata ili bolesti sa kartice i potrebna autorizacija
Za dohvat podataka sa kartice brine se metoda dohvatiPodatke(). Podatke može dohvatiti svatko tko se autorizirao barem sa korisničkim PIN-om. Provjera autorizacije za dohvat podataka prikazana je na slici 5.15. Metoda iotext() je privatna pomoćna metoda koja parsira dolazne podatke i sprema ih u lokalne varijable na kartici.
Slika 5.15. Dohvat podataka osnovnog osiguranja i potrebna autorizacija
Metoda ponisti() briše uputnicu, recept, bolest, dopunsko osiguranje ili oslobođenje od participacije sa kartice. Za brisanje uputnice, recepta ili bolesti potrebno se autorizirati barem korisničkim PIN-om, dok se za brisanje dopunskog osiguranja ili oslobođenja od participacije potrebno autorizirati barem sa PIN-om izdavača kartice. Poništavanje podataka i provjera autorizacije za poništavanje prikazana je na slici 5.16.
Slika 5.16. Brisanje podataka sa kartice i potrebna autorizacija
Za unos novih podataka na karticu brine se metoda unesi(). Za unos podataka o osnovnom i dopunskom osiguranju, te oslobođenju od participacije potrebno se autorizirati pomoću PIN-a koji nije niže razine od PIN-a izdavača kartice. Potrebna autorizacija prikazana je na slici 5.17.
Za unos podataka o receptima, uputnicama i bolestima potrebno se autorizirati barem PIN-om korisnika kartice. Unos tih podataka i pripadna autorizacija prikazani su na slici 5.18.
Slika 5.17. Potrebna
autorizacija za unos podataka o osiguranjima i unos podataka o osnovnom
osiguranju
//recept
Slika
5.18. Potrebna autorizacija za unos podataka o receptima, uputnicama i
bolestima i unos podataka o receptu
Metoda procesiraj() procesira ulazni niz podatka. Ulazni parametar metode procesiraj() je APDU međuspremnik. U ovisnosti o instrukciji (drugi oktet zaglavlja APDU naredbe) pozivaju se tražene metode i šalje odgovor. Metoda je prikazana na slici 5.19.
public void procesiraj(byte [] apduBuffer) throws UserException, ISOException {Slika 5.19. Metoda procesiraj()
Razred AppletPZI je osnovni applet razred u kojem se stvara primjerak sigurnosne usluge za pristup appletu, primjerak same implementacije funkcionalnosti appleta pametne zdravstvene iskaznice, te registrira i instalira sam applet.
Da bi JCRE javio appletu da će biti izabran za procesiranje APDU naredbi poziva se metoda select(). Razred sadrži i metodu deselect(). Tu metodu poziva JCRE kako bi dotičnom appletu javio da više neće biti izabran. Prilikom instalacije appleta na karticu poziva se metoda install(). Metoda kao ulazne parametre prima niz, odmak u nizu od kojeg počinju korisnički instalacijski parametri i duljinu korisničkih instalacijskih parametara. U slučaju pametne zdravstvene iskaznice korisnički instalacijski parametri biti će osmeroznamenkasti PIN. Npr. ako je PIN 12345678 ulazni niz izgledati će: 0x0102030405060708.
Najvažnija metoda ovog razreda je metoda process(). Tu metodu poziva JCRE da procesira dolazeću APDU naredbu. Metoda prvo dohvati cijelu ADPU naredbu, potom predprocesira i procesira pomoću primjeraka UslugaSigurnosti, procesira pomoću same implementacije pametne zdravstvene iskaznice (tj. poziva opisanu metodu procesiraj()), te potom postprocesira pomoću primjeraka UslugaSigurnosti. Tok obrade APDU naredbe prikazan je na slici 5.20, a metoda process() je prikazana na slici 5.21.

Slika 5.20. Tok obrade APDU naredbe
Slika 5.21. Metoda process()
Dohvaćanje APDU naredbe obavlja se privatnom metodom dohvatiAPDU() prikazanom na slici 5.22. Prvo se metodom getBuffer() prima dio APDU naredbe. Iz tijela (prvi oktet) saznajemo veličinu APDU naredbe. Pozivom metode setIncomingAndReceive() doznajemo duljinu podataka APDU naredbe u oktetima koju možemo pročitati (tj. koja stane u APDU međuspremnik). Zatim u petlji metodom receiveBytes() primamo ostatak APDU naredbe i kopiramo je u lokalni međuspremnik.
Slika 5.22. Metoda dohvatiAPDU()
Slanje APDU naredbe obavlja se privatnom metodom posaljiAPDU() prikazanom na slici 5.23. Metodom setOutgoing() preusmjerimo tok na izlazni i provjerimo duljinu odgovora koji terminal očekuje (zadnji oktet APDU naredbe). Nakon toga postavljamo veličinu odgovora metodom setOutgoingLength(). U petlji šaljemo podatke iz lokalnog međuspremnika uz pomoć metode sendBytes(). Šaljemo poruke duljine 32 okteta, jer je to maksimalna duljina koja stane u APDU međuspremnik. Na kraju se postavlja statusna riječ ovisno o tome da li se dogodila neka pogreška ili je sve prošlo kako je trebalo (0x9000).
Slika 5.23. Metoda posaljiAPDU()
Razredi i sučelja
koja čine implementaciju pametne zdravstvene iskaznice nalaze se u
paketu hr.fer.zemris.diplomski.terminalPZI.
Paket sadrži razrede APDUVeza, DatotecniDohvacCertifikata,SigurnaAPDUVeza,SigurnaAPDUVezaPZI
i Terminal,
te sučelje DohvatacCertifikata.
Sučelje PZIPodaci je sučelje koje predstavlja tip podataka (engl. type safety). Implementiraju ga razredi Bolest koji sadrži podatke o bolestima, Dopunsko koji sadrži podatke o dopunskom osiguranju, Oslobodenje koji sadrži podatke o oslobođenju od participacije, Osnovno koji sadrži podatke o osnovnom osiguranju, Recept koji sadrži podatke o receptu i Uputnica koji sadrži podatke o uputnici.
Razred SigurnaAPDUVezaPZI služi za aplikacijsku, visoko-razinsku sigurnu komunikaciju s karticom. SigurnaAPDUVezaPZI se zasniva na sigurnoj vezi koju pruža razred SigurnaAPDUVeza.
Razred ima dva
konstruktora. Prvi konstruktor prima primjerak razreda CardService
kojem se pri komunikaciji s pametnom karticom prosljeđuje APDU naredba i
prima povratni APDU odgovor. Drugi konstruktor prima primjerak razreda CardService
kojem se pri komunikaciji s pametnom karticom prosljeđuje APDU naredba,
prima povratni APDU odgovor i prosljeđuje primjerak razreda SigurnaAPDUVeza
koji predstavlja vezu prema kartici koja će digitalno potpisati recepte
i uputnice.
Pomoću metode broj() dohvaća se broj uputnica, recepata ili bolesti koje
se nalaze na kartici. Metoda je prikazana na slici 5.24.
Slika 5.24. Metoda broj()
Metodom dohvatiPodatke() dohvaćaju se podaci s kartice. Slanje zahtjeva za dohvat podataka sa kartice prikazan je na slici 5.25. Dohvaćeni podaci nalaze se u lokalnoj varijabli buffer.
Slika 5.25. Slanje zahtjeva za dohvat podataka sa kartice
Metodom unesi() šalju se podaci na karticu. Podaci se pretvaraju u niz okteta pogodan za prijenos APDU protokolom i spremaju u APDU međuspremnik. Tek pozivom metode izmijeniAPDU() iz SigurnaAPDUVeza podaci se šalju na karticu.
Metodom ponisti() kartici se šalje zahtjev za poništavanjem uputnice, recepta ili bolesti. U slučaju poništavanja uputnice i recepta treba se provjeriti i digitalni potpis liječnika koji je izdao dotičnu uputnicu ili recept. Od kartice tražimo digitalni potpis i podatke. Iz podataka saznajemo šifru doktora, koja u slučaju pametne zdravstvene iskaznice odgovara serijskom broju liječnikovog digitalnog certifikata. Zatim pozivamo funkciju provjeriPotpis() iz razreda SigurnaAPDUVeza. Provjera digitalnog potpisa prikazana je na slici 5.26.
U slučaju poništavanja bolesti ne provjeravamo digitalni potpis (on na kartici ne postoji).
Slika 5.26. Provjera
digitalnog potpisa uputnice i recepta
Razred APDUVeza je razred koji omogućuje jednostavno komuniciranje sa pametnom karticom i odabiranje kartičnog appleta, a nalazi se u paketu hr.fer.zemris.diplomski.terminalPZI.
Konstruktor razreda prima primjerak razreda CardService kojem se pri komunikaciji s pametnom karticom prosljeđuje APDU naredba i prima povratni APDU odgovor.
Metoda izmijeniAPDU() kao ulazni parametar prima APDU naredbu i vraća APDU odgovor u obliku niza okteta. U slučaju da poslani primjerak razreda CardService nije podržan javlja se iznimka CardServiceImplementationException. Podržani CardService primjerak je PassThruCardService. Naredba sendCommandADPU() je metoda razreda PassThruCardService. Ona šalje APDU naredbu na karticu. Parametar joj je primjerak razreda CommandAPDU. Njegov konstruktor prima ulazni međuspremnik s podacima i duljinu podataka koji se šalju. Odgovor s kartice sprema se u lokalnu varijablu koja je primjerak razreda ResponseAPDU. Iz primjerka tog razreda dohvaćamo niz okteta pozivom metode data(). Ako podaci postoje (tj. ako je poslano nešto više od statusne riječi) oni se spremaju u lokalni međuspremnik.
Ako je prvi oktet statusne riječi 0x61 onda drugi oktet statusne riječi govori koliko ne primljenih okteta APDU odgovora još postoji. U petlji šaljemo zahtjev za ne primljenim podacima APDU odgovora.
Na kraju kada primimo sve podatke provjeravamo statusnu riječ. Ako je ona 0x9000 komunikacija je prošla bez greške. Metoda je prikazana na slici 5.27.
Slika 5.27. Komunikacija APDU protokolom
Još jedna važnija metoda ovog razreda je metoda odaberiApplet() koja odabire željeni kartični applet na temelju poslanog identifikatora appleta (AID). Zaglavlje zahtjeva za odabiranje appleta je: 00 A4 04 00. Metoda je prikazana na slici 5.28.
Slika 5.28. Metoda odaberiApplet()
Razred Terminal predstavlja aplikaciju za rad s pametnom zdravstvenom iskaznicom sa grafičkim korisničkim sučeljem.
Jedna od važnijih metoda je metoda cekajKarticu(). Ta metoda čeka da se ubaci liječnikova kartica, inicijalizira OCF pomoću opencard.properties datoteke, stvara zahtjev za karticom na terminalu, stvara uslugu za pristup kartici i otvara vezu prema kartici. Metoda je prikazana na slici 5.29.
Slika 5.29. Metoda cekajKarticu()
Metoda koja čeka da se ubaci osiguranikova kartica, inicijalizira OCF pomoću opencard.properties datoteke, stvara zahtjev za karticom na terminalu, stvara “slušača” (engl. listener) pacijentove kartice, stvara uslugu za pristup kartici i otvara vezu prema kartici je metoda cekajPacijenta(). Metoda koja čeka da se ubaci pacijentova kartica prikazana je na slici 5.30. Od metode cekajKarticu() razlikuje se u tome što ima “slušača” kartice.
Slika 5.30. Metoda cekajPacijenta()
Komunikacija terminala i kartice uz pomoć OCF-a opisana je u poglavlju 4.3.
Kada se kartica ubaci u čitač unosi se PIN i obavlja identifikacija. Za identificiranje putem PIN-a brine se metoda identifikacija() koja kao parametar prima primjerak razreda SigurnaAPDUVezaPZI prema kojem zna koju karticu treba identificirati. Za provjeru PIN-a metoda poziva metodu identificirajKorisnika() iz razreda SigurnaAPDUVeza.
Sustav pametne zdravstvene iskaznice namijenjen je za upotrebu u sustavu zdravstva. Sastoji se od terminala pametne zdravstvene iskaznice i pametne zdravstvene iskaznice. Međudjelovanje sustava prikazano je na slici 6.1.





Slika 6.1. Međudjelovanje sustava pametne zdravstvene iskaznice
Prije nego li se pametna zdravstvena iskaznica može koristiti ona se mora personalizirati, tj. postaviti PIN. To prilikom učitavanja programa na karticu obavlja isključivo osiguravajuće društvo (izdavač kartice). Nakon toga kartica se treba inicijalizirati, tj. treba joj se poslati njen javni i privatni ključ. Na karticu se ne šalje cijeli certifikat jer Java Card 2.1.1. platforma nema podršku za certifikate, te ih kartica ne zna koristiti. Inicijalizaciju također obavlja isključivo osiguravajuće društvo. U glavnom izborniku “Opcije” nalazi se opcija “Spremi certifikat”. Tu se zadaje put do javnog ključa kartice i certifikata kartice, nakon čega terminal inicijalizira karticu šaljući joj te podatke. Ključ kartice mora biti u binarnom nekriptiranom PKCS#8 formatu, a certifikat mora biti u “ASN.1 DER (PKCS#10) Base64” kodiranom formatu.
Nakon
personalizacije i inicijalizacije kartica je spremna za upotrebu.
Inicijalizacija i personalizacija obavljaju se samo jednom u životu
kartice.

Slika
6.2. Inicijalizacija kartice
Prije nego li se liječnik ili ljekarnik prijavi na sustav sve opcije osim prijave su onemogućene (slika 6.3.). Tek nakon uspješne prijave opcije su omogućene (slika 6.4.).

Slika 6.3. Opcije prije prijave na sustav

Slika 6.4. Opcije nakon prijave na sustav
Nakon prijave liječnika ili ljekarnika na sustav, prijaviti se može i osiguranik. Izborom opcije “Podaci o korisniku” sa kartice se dohvaćaju podaci i unose u formular prikazan na slici 6.5. Novi podaci se unose ili mijenjaju izborom opcije “Promjeni/unesi podatke”.
Terminal
ne dopušta unos praznog niza podataka, osim u slučaju kada je
osiguranje ili oslobođenje od participacije u potpunosti izostavljeno. Također u slučaju krivog unosa
podataka javiti će se pogreška i podaci se neće poslati na karticu dok
ne budu pravilno popunjeni.

Slika
6.5. Podaci o korisniku
Izborom
opcije “Bolesti i alergije” sa kartice se dohvaćaju podaci o bolestima
i alergijama. Formular je prikazan na slici 6.6. U gornjem dijelu
prikazan je popis bolesti i alergija koje se nalaze na kartici. Izborom
bolesti ili alergije i klikom na “Poništi” bolest se poništava s
kartice. Unosom teksta u donji dio formulara i pritiskom na “Unesi”
bolest ili alergija se unosi na karticu.

Slika
6.6. Bolesti i alergije
Izborom opcije “Uputnica” ili “Recept” sa kartice se dohvaća broj uputnica i recepata i stvara izbornik s popisom podataka. Formulari za unos uputnice i recepta prikazani su na slikama 6.7. i 6.8. Recept i uputnica spremaju se na karticu pritiskom na “Unesi”.
U slučaju da želimo poništiti uputnicu ili recept u lijevom dijelu prozora izaberemo uputnicu ili recept koji želimo poništiti (slika 6.9. i 6.10.). Pritiskom na “Poništi” uputnica ili recept se briše sa kartice. Prije brisanja provjerava se digitalni potpis liječnika. Ako je digitalni potpis kriv javlja se greška, a uputnica ili recept se briše sa kartice.
Terminal ne dopušta unos praznog ili neispravnog niza podataka. U slučaju pokušaja javlja pogrešku kao što je prikazano na slikama 6.11. i 6.12.

Slika 6.7. Nova uputnica

Slika 6.8. Novi recept

Slika 6.9. Uputnica pod rednim brojem 2

Slika 6.10. Recept pod rednim brojem 2

Slika 6.11. Nepotpuni podaci

Slika 6.12. Neispravni podaci
U ovom radu pokazano je kako je Java platforma pogodna za izgradnju kartičnih aplikacija. Osim visoke razine sigurnosti, Java platforma omogućuje i rad na različitim operacijskim sustavima, što aplikacije čini prenosivima.
Za potrebe razvijanja i testiranja pametne zdravstvene iskaznice korištene su “Cyberflex Access 64k” pametne kartice. Iskorišteno je samo 11 KiB EEPROM-a od mogućeg 60 KiB, kako bi se, ako je potrebno, moglo pohraniti više recepata, uputnica i bolesti. Također na karticu bi se mogli pohranjivati rezultati laboratorijskih pretraga i podaci o hospitalizaciji.
Kartična aplikacija pametne zdravstvene iskaznice ne koristi ništa specifično za “Cyberflex Access 64k” pametne kartice i u potpunosti je kompatibilna sa Java Card platformom 2.1.1. Zbog toga se bilo koja Java pametna kartica, koja podržava Java Card paltformu 2.1.1. i posjeduje 11 KiB EEPROM-a, može koristiti kao pametna zdravstvena iskaznica.
Ostvarena kartična aplikacija i aplikacija terminala čine cjelinu koja obuhvaća sve radnje potrebne za korištenje u sustavu zdravstva. Primjenom ovakvog sustava olakšan je posao liječnicima, ljekarnicima, bolnicama, ambulantama i korisnicima (pacijentima). Korisnici više ne bi trebali sa sobom nositi zdravstvenu iskaznicu, iskaznicu dopunskog zdravstvenog osiguranja, potvrdu o oslobođenju od participacije, papire o potvrdi neke teške bolesti ili alergije (npr. dijabetes, alergija na lijekove...).
Nadalje, pametna zdravstvena iskaznica mogla bi postati i kartica koja ne služi samo kao zdravstvena iskaznica, nego i kao osobna iskaznica, bankovna kartica, putovnica i slično.
Sun Microsystems ,Java Card Development Kit v2.1.1., dostupno na Internet adresi: http://java.sun.com
Sun Microsystems, Java CardTM 2.1.1 Virtual Machine Specification, 2000.
Sun Microsystems, Java CardTM 2.1.1 Runtime Enviroment (JCRE) Specification Collection, 2000.
Sun Microsystems, Java CardTM 2.1.1 Specifications, 2000.
Sun Microsystems, Java CardTM 2.1.1 Application Programming Interface, 2000.
OpenCard Consortium, OpenCard Framework 1.2 – Programmer's guide, 1999.
OpenCard consortium, http://www.opencard.com
ISO/IEC 7816 Part 4: Interindustry command for interchange
Aidia inžinjering, http://www.aidia-i.ba
Smartex, http://www.smartex.com
U.HANSMANN, M.S.NICKLOUS, Smart Card Application Developement Using Java, Springer, 1999.
JavaTM 2 Platform, Standard Edition, v 1.4.1, API Specification
JavaTM Tutorial Third Edition, http://java.sun.com/docs/books/tutorial
APDU – Application Protocol Data Unit
API – Application Programming Interface
ASN.1 – Abstract Syntax Notation One
CHV – Card Holder Verification
CLA – class (prvi oktet APDU naredbe)
DER – Distinguished Encoding Rules
EEPROM – Ellectronically Eraseable Read Only Memory
GUI – Graphical User Interface
IJC – Interoperable JavaCard CAP
INS – instruction (drugi oktet APDU naredbe)
ISO – International Standardization Organization
JCRE – Java Card Runtime Enviroment
JCRMI – Java Card Remote Method Invocation
JCVM – Java Card Virtual Machine
Lc – duljina podatkovnog polja APDU naredbe
Le – največa očekivana duljina APDU odgovora
P – parametar (treći i četvrti oktet APDU naredbe)
PCMCIA – Personal Computer Memory Card International Asociation
PIN – Personal Identification Number
PKCS – Public–Key Cryptography Standards
PKCS#8 – Private-Key Information Syntax Standard
PKCS#10 – Certification Request Syntax Standard
PZI – Pametna Zdravstvena Iskaznica
SDK – Software Development Kit
TCP – Transmission Control Protocol
TPDU – Transfer Protocol Data Unit