Čipové karty Lekařská informatika



Podobné dokumenty
Úvod do programovacích jazyků (Java)

Čipové karty úvod, Ing. Jiří Buček. Katedra počítačových systémů Fakulta informačních technologií České vysoké učení technické v Praze

Java a XML. 10/26/09 1/7 Java a XML

1. Téma 12 - Textové soubory a výjimky

20. Projekt Domácí mediotéka

George J. Klir. State University of New York (SUNY) Binghamton, New York 13902, USA

Distribuované systémy a výpočty

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Projekty pro výuku programování v jazyce Java

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Semestrální práce z předmětu. Jan Bařtipán / A03043 bartipan@studentes.zcu.cz

Teoretické minimum z PJV

Pear - hruška Systém pro implementaci a distribuci znovupoužitelných komponent (v PHP) Strukturovaná knihovna open-source (PHP) skriptů Systém pro dis

Postřehová hra. Zadání projektu. 1 Moje cíle

Abstraktní datové typy: zásobník

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Programování v Javě I. Leden 2008

Principy objektově orientovaného programování

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

Programování v Javě I. Únor 2009

Datové typy v Javě. Tomáš Pitner, upravil Marek Šabo

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

KTE / ZPE Informační technologie

Algoritmizace a programování

Příklad aplikace Klient/Server s Boss/Worker modelem (informativní)

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

Typický prvek kolekce pro české řazení

RMI Remote Method Invocation

Car Agent. Struktura chování:

Robert Haken [MVP ASP.NET/IIS, MCT] software architect, HAVIT, Perly code-review z praxe

5 Rekurze a zásobník. Rekurzivní volání metody

CMS LARS VIVO VERZE 1.2 Z POHLEDU VIVOJÁŘE

Cvičení 9 - Monitory. monitor m; var proměnné... procedure p; begin... end; begin inicializace; end;

2011 Jan Janoušek BI-PJP. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

Přehled probírané látky

NIO. Aplikační programování v Javě (BI-APJ) - 12 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

PREPROCESOR POKRAČOVÁNÍ

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Java Cvičení 05. CHARLES UNIVERSITY IN PRAGUE faculty of mathematics and physics

Iterator & for cyklus

public class Karel { private int position; public boolean issmiling; public int getposition() { return position;

Jazyk C# (seminář 3)

Algoritmizace a programování

typová konverze typová inference

Webové služby a XML. Obsah přednášky. Co jsou to webové služby. Co jsou to webové služby. Webové služby a XML

public static void main(string[] args) { System.out.println(new Main().getClass().getAnnotation(Greet.class).text());

KIV/PIA 2013 Jan Tichava

Neměnné objekty. Tomáš Pitner, upravil Marek Šabo

Distribuované systémy a výpočty

Enterprise Java (BI-EJA) Technologie programování v jazyku Java (X36TJV)

Transportation Problem

Arduino Data Logger Shield

Úvod do programovacích jazyků (Java)

Třídy a objekty -příklady

kontrola povinnosti údajů kontrola rozsahu čísel kontrola ové adresy, telefonního čísla nutná součást každého software

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni!

Seminář Java IV p.1/38

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

9. přednáška - třídy, objekty

Seminář Java II p.1/43

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Zapouzdření. Tomáš Pitner, upravil Marek Šabo

Chapter 7: Process Synchronization

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Java - výjimky. private void vstup() throws IOException {... }

Enterprise Java (BI-EJA) Technologie programování v jazyku Java (X36TJV)

UJO Framework. revoluční architektura beans. verze

11. Dědičnost. Dědičnost strana 103

Fingerprint Verification Control

Compression of a Dictionary

User manual SŘHV Online WEB interface for CUSTOMERS June 2017 version 14 VÍTKOVICE STEEL, a.s. vitkovicesteel.com

Databáze I. Přednáška 7

Semin aˇr Java V yjimky Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Unor 2008 Radek Koˇc ı Semin aˇr Java V yjimky 1/ 25

Michal Podzimek

boolean hasnext() Object next() void remove() Kolekce

NA CO SI DÁT POZOR V JAVASCRIPTU? Angular.cz

Jazyk C++ I. Šablony 3

Vláknové programování část V

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

Výjimky. Tomáš Pitner, upravil Marek Šabo

Generické programování

OOPR_05. Případové studie

Vytvoření pokročilé Fotogalerie v Drupalu - Views

7. Datové typy v Javě

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Postup objednávky Microsoft Action Pack Subscription

2 Axiomatic Definition of Object 2. 3 UML Unified Modelling Language Classes in UML Tools for System Design in UML 5

Knihovna DataBoxLib TXV první vydání prosinec 2010 změny vyhrazeny

Návrhové vzory OMO, LS 2014/2015

Tvorba informačních systémů

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

1. Programování proti rozhraní

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Třídy, polymorfismus. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

Modularita. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Transkript:

Čipové karty Lekařská informatika Následující kód je jednoduchou aplikací pro čipové karty, která po překladu vytváří prostor na kartě, nad kterým jsou prováděny jednotlivé operace a do kterého jsou ukládány jednotlivé údaje. Po překladu takto hotového java souboru do souboru typu class se tento pomocí speciálního softwaru přeloží na soubor typu ijc. Tento soubor je už možné nahrát na kartu a vytvořit k němu příslušnou instanci nad níž budou vykonávány jednotlivé operace. Pro přístup ke kartě je vytvořen aplet obsahující funkce, které byly kartě přiděleny Konkrétní příklad apletu pro naši práci: - připojení ke kartě - ověření pinu - Jméno uložené na kartu - Rodné číslo uložené na kartu - Nastavení účtu - Načtení jména - Načtení rodného čísla - Odečtení z účtu - Aktuální stav účtu - Uložení data - Načtení data - Informační rámec Funkce karty je uložení a následná možnost načtení jména, rodného čísla, data a případné nastavení (přidání) bodů na uživatelův účet. Tyto body lze odečítat a sledovat stav účtu. Následujících několik stran obsahuje ukázku kódu java souboru určeného k překladu a uložení na kartu, pro vytvoření pracovního prostoru karty.

package com.slb.javacard.simpleli; import javacard.framework.*; import javacard.security.*; public class SimpleLI extends javacard.framework.applet { Hlavní adresa prostoru karty final static byte SimpleLI_CLA =(byte)0x80; Adresy pro jednotlivé metody implementované na kartě final static byte SET = (byte) 0x10; - metoda pro ukládání jména final static byte GET = (byte)0x20; - metoda pro ukládání jména final static byte SETRC = (byte)0x25; - metoda pro uložení RČ final static byte GETRC = (byte)0x30; - metoda pro načtení RČ final static byte Deposit = (byte) 0x35; - metoda pro nastavení účtu final static byte Debit = (byte) 0x40; - metoda pro odečtení z účtu final static byte Balance = (byte) 0x45; - metoda pro zjištění aktuálního final static byte Validate = (byte) 0x50; - metoda validace final static byte SetDate = (byte) 0x70; - metoda pro uložení data final static byte GetDate = (byte) 0x75; - metoda pro načtení data final static byte Encrypt = (byte) 0x60; final static byte PinChange = (byte) 0x42; // maximum number of incorrect tries before the PIN is blocked final static byte PinTryLimit =(byte)0x30; // maximum size PIN final static byte MaxPinSize =(byte)0x04; // status word (SW1-SW2) to signal that the balance becomes negative; final static short SW_NEGATIVE_BALANCE = (short) 0x6910; final static short SW_WRONG_PIN = (short) 0x6300; /* instance variables declaration */ OwnerPIN pin; static byte base_balance = (byte) 0x40; byte balance; DESKey key; Signature signature; byte TheBuffer[]; byte RC[]; byte adds[]; private SimpleLI(byte buffer[],short offset,byte length) { // It is good programming practice to allocate // all the memory that an applet needs during its // lifetime inside the constructor

TheBuffer = new byte[100]; RC = new byte[80]; adds = new byte[500]; byte defpin[] = {(byte)00,(byte)00,(byte)00,(byte)00; pin = new OwnerPIN(PinTryLimit, MaxPinSize); pin.update(defpin,(short)0,(byte)4); balance = (byte) 0; key = (DESKey)KeyBuilder.buildKey(KeyBuilder.TYPE_DES_TRANSIENT_RESET,KeyBuilder. LENGTH_DES,false); signature = Signature.getInstance(Signature.ALG_DES_MAC8_ISO9797_M1,false); signature.init(key,signature.mode_sign); if (buffer[offset] == (byte)0) { register(); else { register(buffer, (short)(offset+1),(byte)(buffer[offset])); // end of the constructor public static void install(byte buffer[],short offset,byte length) { // create a Wallet applet instance (card) *!* new SimpleLI(buffer, offset, length); // create a Wallet applet instance (Simulator) *!* // userapplet = new Wallet(); // end of install method Označení karty public boolean select() { // reset validation flag in the PIN object to false pin.reset(); // returns true to JCRE to indicate that the applet // is ready to accept incoming APDUs. return true; // end of select method Přidělení funkcí jednotlivým metodám public void process(apdu apdu) { // APDU buffer // APDU object carries a byte array (buffer) to // transfer incoming and outgoing APDU header

// and data bytes between card and CAD // Implement a select handler if (selectingapplet()) { ISOException.throwIt(ISO7816.SW_NO_ERROR); // verify that if the applet can accept this // APDU message if (buffer[iso7816.offset_cla]!= SimpleLI_CLA) ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED); byte ins = buffer[iso7816.offset_ins]; if (ins == SET) SetName(apdu); else if (ins == GET) GetName(apdu); else if (ins == SETRC) setrc(apdu); else if (ins == GETRC) getrc(apdu); else if (ins == Deposit) deposit(apdu); else if (ins == Debit) debit(apdu); else if (ins == Balance) getbalance(apdu); else if (ins == Validate) validate(apdu); else if (ins == SetDate) setdate(apdu); else if (ins == GetDate) getdate(apdu); else if (ins == Encrypt) encrypt(apdu); else if (ins == PinChange) PinChange(apdu); else ISOException.throwIt (ISO7816.SW_INS_NOT_SUPPORTED); // end of process method Metoda pro nastavení účtu private void deposit(apdu apdu) { // access authentication if (! pin.isvalidated() ) ISOException.throwIt (ISO7816.SW_SECURITY_STATUS_NOT_SATISFIED); // indicate that this APDU has incoming data and // receive data starting from the offset // ISO7816.OFFSET_CDATA byte byteread = (byte)(apdu.setincomingandreceive()); // it is an error if the number of data bytes read does not // match the number in Lc byte if (byteread!= (byte) 1) ISOException.throwIt(ISO7816.SW_WRONG_LENGTH); // increase the balance by the amount specified in the // data field of the command APDU. balance = (byte)(balance + buffer[iso7816.offset_cdata]); // return successfully

// end of deposit method Metoda pro odečítání z účtu private void debit(apdu apdu) { // access authentication if (! pin.isvalidated() ) ISOException.throwIt(ISO7816.SW_SECURITY_STATUS_NOT_SATISFIED); byte byteread = (byte)(apdu.setincomingandreceive()); if (byteread!= (byte)1) ISOException.throwIt(ISO7816.SW_WRONG_LENGTH); // balance can not be negative if ( (byte)( (byte) balance - (byte) buffer[iso7816.offset_cdata]) < (byte) 0 ) ISOException.throwIt(SW_NEGATIVE_BALANCE); balance = (byte) (balance - buffer[iso7816.offset_cdata]); // end of debit method Metoda pro zjištění aktuálního stavu účtu private void getbalance(apdu apdu) { // access authentication if (! pin.isvalidated() ) ISOException.throwIt(ISO7816.SW_SECURITY_STATUS_NOT_SATISFIED); // inform system that the applet has finished processing // the command and the system should now prepare to // construct a response APDU which contains data field apdu.setoutgoing(); // indicate the number of bytes in the data field apdu.setoutgoinglength((byte)1); // move the data into the APDU buffer starting at offset 0 buffer[0] = (byte) balance; // send 1 byte of data at offset 0 in the APDU buffer apdu.sendbytes((short)0, (short)1); // end of getbalance method Metoda pro uložení rodného čísla private void setrc(apdu apdu) { byte size = (byte)(apdu.setincomingandreceive()); // Store the length of the string and the string itself RC[0] = size; for (index = 0; index < size; index++) RC[(byte)(index + 1)] = buffer[(byte)(iso7816.offset_cdata + index)];

// end of deposit method Metoda pro načtení rodného čísla private void getrc(apdu apdu) { byte numbytes = buffer[iso7816.offset_lc]; if (numbytes == (byte)0) { ISOException.throwIt((short)(0x6200 + RC[0])); apdu.setoutgoing(); apdu.setoutgoinglength(numbytes); for (index = 0; index <= numbytes; index++) buffer[index] = RC[(byte)(index + 1)]; apdu.sendbytes((short)0,(short)numbytes); // end of getbalance method Metoda pro uložení jména private void SetName(APDU apdu) { byte size = (byte)(apdu.setincomingandreceive()); // Store the length of the string and the string itself TheBuffer[0] = size; for (index = 0; index < size; index++) TheBuffer[(byte)(index + 1)] = buffer[(byte)(iso7816.offset_cdata + index)]; Metoda pro načtení jména private void GetName(APDU apdu) { byte numbytes = buffer[iso7816.offset_lc]; if (numbytes == (byte)0) { ISOException.throwIt((short)(0x6200 + TheBuffer[0])); apdu.setoutgoing(); apdu.setoutgoinglength(numbytes); for (index = 0; index <= numbytes; index++) buffer[index] = TheBuffer[(byte)(index + 1)]; apdu.sendbytes((short)0,(short)numbytes); Metoda pro uložení data

private void setdate(apdu apdu) { byte size = (byte)(apdu.setincomingandreceive()); adds[0] = size; for (index = 0; index < size; index++) adds[(byte)(index + 1)] = buffer[(byte)(iso7816.offset_cdata + index)]; Metoda pro načtení data private void getdate(apdu apdu) { byte numbytes = buffer[iso7816.offset_lc]; if (numbytes == (byte)0) { ISOException.throwIt((short)(0x6200 + adds[0])); apdu.setoutgoing(); apdu.setoutgoinglength(numbytes); for (index = 0; index <= numbytes; index++) buffer[index] = adds[(byte)(index + 1)]; apdu.sendbytes((short)0,(short)numbytes); Metoda pro ověření pinu private void validate(apdu apdu) { // retrieve the PIN data which requires to be valid ated // the user interface data is stored in the data field of the APDU byte byteread = (byte)(apdu.setincomingandreceive()); // validate user interface and set the validation flag in the user interface // object to be true if the validation succeeds. // if user interface validation fails, PinException would be // thrown from pin.check() method. if (!pin.check(buffer, ISO7816.OFFSET_CDATA, byteread)) ISOException.throwIt(SW_WRONG_PIN); key.setkey(buffer,(short)0); // end of validate method Metoda pro kódování private void encrypt(apdu apdu) { // get 4 bytes of data and return the encrypted result. // access authentication if (! pin.isvalidated() ISOException.throwIt(ISO7816.SW_SECURITY_STATUS_NOT_SATISFIED);

short byteread = apdu.setincomingandreceive(); signature.sign(buffer,(short)6,byteread,buffer,(short)0); apdu.setoutgoingandsend((short)0,(short)8); Metoda pro změnu pinu private void PinChange(APDU apdu) { if (! pin.isvalidated() ) ISOException.throwIt (ISO7816.SW_SECURITY_STATUS_NOT_SATISFIED); byte byteread = (byte)(apdu.setincomingandreceive()); //provede se nastaveni PIN pin.update(buffer,iso7816.offset_cdata, byteread); //nastaveny PIN ihned overim if (!pin.check(buffer, ISO7816.OFFSET_CDATA, byteread)) ISOException.throwIt(SW_WRONG_PIN); // end of class SimpleLI