Wprowadzenie Karty tłoczone Karty magnetyczne Karty elektroniczne (inteligentne smart card) –Pamięciowe, mikroprocesorowe –Stykowe, bezstykowe (contactless)

1 Wprowadzenie Karty tłoczone Karty magnetyczne Karty ele...
Author: Halina Kalinowska
0 downloads 0 Views

1 Wprowadzenie Karty tłoczone Karty magnetyczne Karty elektroniczne (inteligentne smart card) –Pamięciowe, mikroprocesorowe –Stykowe, bezstykowe (contactless)

2 Historia 1968 (Jürgen Dethloff i Helmut Grötrupp, Niemcy) – idea karty opartej na układzie elektronicznym, 1970 (Kunitaka Arimura, Japonia) 1974 (Roland Moreno, Francja) – zastosowanie karty w systemie płatniczym 1979 – pierwsza karta procesorowa 1995 – szerokie wykorzystanie kart procesorowych

3 Obszary zastosowań Transakcje płatnicze Programy lojalnościowe Zapis danych biometrycznych (elektroniczny dowód osobisty) Infrastruktura klucza publicznego (podpis cyfrowy) System GSM

4 Budowa karty

5 Rodzaje kart inteligentnych Natywne COS (Card OS) –EMV (EN1546) –JavaCard (ISO 7816) – MPCOS, Cryptoflex, GemClub –GSM (GSM 11.11) – small OS

6 Polecenia systemu operacyjnego — READ BINARY – odczyt pliku, — WRITE BINARY – zapis do pliku, — UPDATE BINARY – modyfikacja pliku, — ERASE BINARY – czyszczenie pliku, — READ RECORD – odczyt rekordu, — WRITE RECORD – zapis rekordu, — APPEND RECORD – dodanie rekordu, — UPDATE RECORD – modyfikacja rekordu, — GET DATA – odczyt danych z pliku, — PUT DATA – zapis danych do pliku, — SELECT FILE – wybór pliku, — VERIFY – weryfikacja np. hasła, — INTERNAL AUTHENTICATE – uwierzytelnienie karty, — EXTERNAL AUTHENTICATE – uwierzytelnienie terminala, — GET CHALLENGE – generacja liczby pseudolosowej, — MANAGE CHANNEL – zarządzanie kanałami logicznymi, — GET RESPONSE – pobranie odpowiedzi od karty związanej z ostatnio wydanym poleceniem, — ENVELOPE – umożliwia np. przesyłanie danych, które będą interpretowane jako komenda

7 Architektura aplikacji z SC Aplikacja kliencka Aplikacja karty Interfejs współpracy z czytnikiem CT-API PC/SC OCF SATSA API SO Czytnik

8 Czytniki i terminale Czytniki – transmisja szeregowa z terminalem (np. PC) –Pasywne –Aktywne Firmy –Phoenix –GemPlus

9 Komunikacja system-karta Transmisja szeregowa –asynchroniczna –Synchroniczna Protokoły –T0 – T15 – norma ISO 7816-3

10 ATR i APDU CLA 0x – rozkazy zgodne z ISO 7816 80 – elektroniczna portmonetka 8x – rozkazy specyficzne dla aplikacji A0 – aplikacja GSM

11 RAPDU Status (sw1) 61- OK. 62, 63 – rozkaz zakończony ostrzeżeniem 64, 65 – błąd wykonania rozkazu 67, 6F – błąd sprawdzenia rozkazu

12 Architektura JavaCard

13 Ograniczenia JCVM brak typów danych: long, double, float, char, brak klasy java.lang.System (została zastąpiona przez javacard.framework.JCSystem), brak procesu garbage collection (ponadto w rzeczywistych kartach nie ma możliwości defragmentacji użytej pamięci), brak Security Manager, nie ma możliwości stosowania wątków, dynamicznego ładowania klas, klonowania obiektów oraz używania wielowymiarowych struktur danych,

14 JCDK java.sun.com/javacard – JavaCard Development Kit (JCDK) J2SE OpenCard Framework (dla aplikacji klienckich)

15 JavaCard API java.lang zawiera podzbiór podstawowych klas języka Java przeznaczonych dla kart, java.io podzbiór tego pakietu związany z wyjątkami, java.rmi pakiet używany do definiowania zdalnego interfejsu karty czyli metod wywoływanych przez CAD (chip accepting device); pozwala to na tworzenie aplikacji terminalowej w architekturze RMI, javacard.framework dostarcza strukturę klas i interfejsów używanych przy tworzeniu i komunikowaniu się z apletami kartowymi, javacard.security zestaw klas i interfejsów związanych z bezpieczeństwem, javacardx.crypto zestaw dodatkowych funkcji kryptograficznych. javacard.framework.Applet jest to abstrakcyjna klasa bazowa dla wszystkich apletów, javacard.framework.JCSystem zawiera szereg statycznych metod przeznaczonych do obsługi wykonywanego apletu, zarządzania zasobami, współdzielenia obiektów pomiędzy aplikacjami, usuwania obiektów oraz realizacji transakcji atomowych, javacard.framework.AID używana jest do przechowywania AID (application identifier) aplikacji; JCRE tworzy instancję tej klasy w celu zarządzania i identyfikacji apletu, javacard.framework.APDU wykorzystywana do przechowywania rozkazu albo odpowiedzi APDU; klasa zaprojektowana jest do obsługi APDU niezależnie od stosowanego protokołu, javacard.framework.Util klasa zawiera zestaw przydatnych statycznych metod (kopiowanie i porównywanie tablic, konkatenacja i rozdzielanie bajtów), javacard.framework.OwnerPIN klasa przeznaczona do przechowywania i zarządzania kodem PIN właściciela karty javacard.framework.ISO7816 zawiera zestaw predefiniowanych stałych javacard.security.Key bazowy interfejs dla wszystkich klas reprezentujących klucze,

16 Architektura kardletu import javacard.framework.*; public class Purse extends Applet { protected Purse () { … } public static void install(byte[] bArray, short bOffset, byte bLength) throws ISOException {Purse applet = new Purse(); … } public void process(APDU apdu) throws ISOException {byte buffer[] = apdu.getBuffer();… } public void select() { } public void deselect() { } }

17 Projekt

18 Implementacja package frst; import javacard.framework.*; public class Purse extends Applet { private final static byte PURSE_CLA = (byte)0x80; private final static byte CREDIT_INS = (byte)0x50; private final static byte BALANCE_INS = (byte)0x52; private final static byte DEBIT_INS = (byte)0x54; private final static byte VERIFY_PIN_INS = (byte)0x56; private final static byte UPDATE_PIN_INS = (byte)0x58; private final static short SW_DEBIT_VALUE_TOO_HIGH = (short)0x9101; private final static short SW_CREDIT_VALUE_TOO_HIGH = (short)0x9102; private final static short SW_WRONG_PIN = (short)0x69C0; private OwnerPIN userPIN; private final static byte USER_PIN_P2 = (byte)0x01; private OwnerPIN ownerPIN; private final static byte OWNER_PIN_P2 = (byte)0x02; private short balance; private static final short maximumBalance = (short)30000;

19 Implementacja public static void install(byte[] bArray, short bOffset, byte bLength) throws ISOException { // dlugosc AID byte aidLen = bArray[bOffset]; short aidOffset=(short)(bOffset+1); bOffset = (short)(bOffset+aidLen+1); // dlugosc danych kontrolnych byte cLen=bArray[bOffset]; bOffset=(short)(bOffset+cLen+1); // dlugosc danych dla apletu byte aLen=bArray[bOffset]; // stworzenie instancji apletu Purse applet = new Purse(bArray, (short)(bOffset+(short)2), bArray[(short)(bOffset+(short)1)], (short)(bOffset+(short)3+(short)bArray[(short)(bOffset+(short)1)]), bArray[(short)(bOffset+(short)2+(short)bArray[(short)(bOffset+(short)1)])]);... return; }

20 Implementacja public void deselect() { ownerPIN.reset(); userPIN.reset(); }

21 Implementacja public void process(APDU apdu) throws ISOException {byte buffer[] = apdu.getBuffer(); if (buffer[ISO7816.OFFSET_CLA] == ISO7816.CLA_ISO7816) { if (buffer[ISO7816.OFFSET_INS] == ISO7816.INS_SELECT) { if (selectingApplet()) { apdu.setOutgoingAndSend((short)0, (short)0);} else { ISOException.throwIt(ISO7816.SW_FUNC_NOT_SUPPORTED); } } else if (buffer[ISO7816.OFFSET_CLA] == PURSE_CLA) { switch (buffer[ISO7816.OFFSET_INS]) {case CREDIT_INS : processCredit(apdu); break; case BALANCE_INS : {...} case DEBIT_INS : {...} case VERIFY_PIN_INS : {...} case UPDATE_PIN_INS : {...} default: ISOException.throwIt(ISO7816.SW_FUNC_NOT_SUPPORTED); break; } else { ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);} }

22 Implementacja [PURSE_CLA] [CREDIT_INS] 0x00 0x00 0x02 [CREDIT_VAL_1] [CREDIT_VAL_2] 0x02 0x80 0x50 0x00 0x00 0x02 0x00 0x01 0x02 private void processCredit(APDU apdu) { if (!ownerPIN.isValidated()) ISOException.throwIt(ISO7816.SW_SECURITY_STATUS_NOT_SATISFIED); // odebranie danych przeslanych w komendzie APDU byte[] buffer = apdu.getBuffer(); byte dataLength = buffer[ISO7816.OFFSET_LC]; //0x02 if (dataLength!=2 || dataLength!=apdu.setIncomingAndReceive()) { ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);} short amount = (short)(((buffer[ISO7816.OFFSET_CDATA+1] ) & (short)0x00FF) | ((buffer[ISO7816.OFFSET_CDATA] maximumBalance) || (amount > 8); buffer[1] = (byte)balance; apdu.setOutgoing(); apdu.setOutgoingLength((short)2); apdu.sendBytes((short)0, (short)2); }

23 Kompilacja Przykład App/kardlet.java javac –g –classpath -target 1.1 App/kardlet.java kardlet.class

24 Konwersja out EXP JCA CAP exportpath. applet 0xa0:0x0:0x0:0x0:0x62:0x0:0x0:0x0:0x2:0x1 App.kardlet App 0xa0:0x0:0x0:0x0:0x62:0x0:0x0:0x0:0x2 1.0 converter –config plik.opt weryfikacja

25 Emulacja App 0xa0:0x0:0x0:0x0:0x62:0x0:0x0:0x0:0x2 com.sun.javacard.samples.wallet.Wallet \ 0xa0:0x0:0x0:0x0:0x62:0x3:0x1:0xc:0x6:0x1 JCDWE cref

26 Architektura aplikacji z SC Aplikacja kliencka Aplikacja karty Interfejs współpracy z czytnikiem CT-API PC/SC OCF SATSA API SO Czytnik

27 OpenCard Framework W odróżnieniu od innych API, podstawowym celem OCF było uniezależnienie się od –Producentów czytników kart (CardTerminal) –SO karty (CardService) –Dostawców aplikacji kartowych (ApplicationManagementCardService)

28 Architektura aplikacji z OFC

29 Konfiguracja #wysylanie APDU OpenCard.services = opencard.opt.util.PassThruCardServiceFactory # wirtualny terminal cref OpenCard.terminals=com.ibm.opencard.terminal.ibm5948.IBMCardTerminalFactory|cref|CREF|localhost:9025 #com.isun.javacard.crefterminal.CrefCardTerminalFactory|cref|CREF|localhost:9025 # sledzenie przebiegu aplikacji OpenCard.trace = opencard:3 com.sun:3 OpenCard.services.override = true OpenCard.terminals.override = true OpenCard.trace.override = true opencard.properties

30 Aplikacja OCF // uruchomienie uslugi SmartCard.start(); // oczekiwanie na karte CardRequest cr = new CardRequest(); cr.setWaitBehavior(CardRequest.ANYCARD); SmartCard sc = SmartCard.waitForCard(cr); // identyfikator karty System.out.println(sc.getCardID()); ptcs=(PassThruCardService)sc.getCardService(PassThruCardService.class, true); // wybranie apletu elektronicznej portmonetki final byte[] SELECT_PURSE={ (byte)0x00, (byte)0xA4, (byte)0x04, (byte)0x00, (byte)0x0A,(byte)0xD2, (byte)0x76, (byte)0x00, (byte)0x01, (byte)0x25, (byte)0x00, (byte)0x01,(byte)0x00, (byte)0x05, (byte)0x01, (byte)0x00}; // przeslanie komendy CommandAPDU apdu = new CommandAPDU(SELECT_PURSE); ResponseAPDU rapdu = ptcs.sendCommandAPDU(apdu); if (rapdu.sw1()!=(byte)0x90)throw new Exception("Brak apletu PURSE w karcie!");

31 Podsumowanie Karty współpracujące z.NET JavaCard Next Nowa generacja kart (z serwerem www) PEDENTYCZNE KODOWANIE i TESTOWANIE!

32 Literatura i Linki W. Effing, W. Rankl. Smart Card Handbook, 2000, John Wiley & Sons M. Molski, M. Glinkowska, Karta elektroniczna - bezpieczny nośnik informacji, 2002, Mikom home.elka.pw.edu.pl/~pnazimek alt.technology.smartcards alt.satellite.tv.europe