Tag Archive : APDU

/ APDU

Pametne kartice (Smart Card)

December 1, 2019 | SECURITY | No Comments

U Njemackoj 1968 godine, Helmut Gröttrup je patentirao prvu pametnu karticu, dok je prvi prototip napravio Roland Moreno 1975 godine. Prva masovna upotreba ovih kartica bila je kao telefonska kartica za plaćanje u francuskim telefonskim govornicama, počevši od 1983. godine.

Sve kartice se mogu podijeliti na kartice bez čipova i kartice sa čipovima. Kartice sa čipovima ili čip kartice su poznate kao pametne kartice. Čip može biti memorijski, u tom slučaju se kartica naziva memorijska kartica (memory card), ili mikrokontrolerski, u kojem se slučaju kartica naziva procesorska kartica (processor card). Procesorske kartice se mogu dalje podijeliti na procesorske kartice sa ili bez koprocesora za izvršavanje asimetričnih kriptografskih algoritama.

Dimenzije

Svi tipovi kartica u trenutnoj upotrebi imaju jednu zajedničku karakteristiku, a to je debljina 0.76 mm (ISO/IEC 7810). Dimenzije mogu biti različite ali je najpoznatiji format ID-1. Razlog za široku primjenu ID-1 formata je taj što se praktično sve kreditne kartice i drugi oblici platnih kartica izrađuju u ovom formatu. ID-3 je iskorišten za pasoše, a ID-000 je postao standardni format za kartice koje se koriste u mobilnim telefonima.

Format Širina (mm) Visina (mm)
ID-312588
ID-210574
ID-185.654
ID-000 (miniSIM)2515
Mini-UICC (microSIM)1512

Čip

Modul čipa može imati šest ili osam vidljivih kontakata na vanjskoj strani. Novije pametne kartice koriste samo pet kontakata, ostali kontakti su rezervisani za buduće primjene. Čip mikrokontrolera je postavljen iza modula i povezan je na njegove pinove.

Karakteristike pametne kartice u velikoj mjeri određuje njen mikrokontroler. Obično se koriste mikrokontroleri sa jednim čipom, koji je posebno prilagođen za upotrebu u pametnim karticama. To obuhvata električne i fizičke parametre, kao što su maksimalna potrošnja struje, raspon dozvoljenih frekvencija takta i dozvoljeni raspon temperature.

Kartice kod kojih je čip memorijski i imaju samo mogućnost pisanja i brisanja podataka iz memorije ćemo nazvati “glupim” karticama. Pamtnim karticama ćemo zvati samo kartice kod kojih čip može biti programirani da izvršava razne operacije.

“Glupe” kartice

Pametne kartice

Pored svih ovih funkcionalnih parametara, postoji još jedna suštinska stavka: Mikrokontroler pametne kartice je posebno ojačani protiv napada. Ovo uključuje detekciju podnaponskih i prenaponskih uslova i otkrivanje taktnih frekvencija izvan navedenog raspona. Ovi mikrokontroleri takođe sadrže senzore svijetlosti i temperature koji im omogućavaju da prepoznaju napade kroz ove rute i na odgovarajući način reaguju.

Mikrokontoleri imaju procesor, memoriju i dodatni hardver. U suštini to je mali računar koji nema svoje napajenje već se napaja i komunicira preko pinova – jedan od razloga zašto mobilni telefoni troše više bateriju kada u sebi imaju funkcionalnu sim kartiu.

Prenos podataka

Terminal uvijek pokreće komunikaciju, što znači da je master, a pametna kartica odgovara, pa je slave. Nakon pokretanja mikrokontrolera pametne kartice, terminal šalje signal reseta pametnoj kartici, koja reaguje na ovaj signal sa ATR (eng. Answer To Reset). Nakon toga, pametna kartica ulazi u stanje mirovanja (low-power sleep). U ovom stanju ostaje sve dok terminal ne pošalje komandu pa je vrati u aktivni režim. Komanda se prima i obrađuje, a odgovor se vraća na terminal. Zatim pametna kartica ponovno ulazi u stanje mirovanja i čeka sljedeću komandu. Alternativno, terminal može u tom trenutku pokrenuti sekvencu isključivanja kako bi isključio pametnu karticu.
ATR se uvijek prenosi s razdjelnom vrijednošću (eng. divider value) od 372, brzinom prenosa podataka od 9600 bps i taktnom frekvencijom 3,55712 MHz.

Zapis podataka na nivou prenosa naziva se TPDU (Transport Protocol Data Unit), dok se zapis podataka na nivou aplikacije naziva APDU (Application Protocol Data Unit). APDU komanda se sastoji se od zaglavlja (head) i tijela (body). Zaglavlje je obavezno, ali tijelo nije obavezno. APDU odgovor se sastoji od body-a i trailer-a. U APDU odgovoru obavezan je samo trailer.

Komanda

Head (4 bytes) Body
CLA | INS | P1 | P2Lc | DATA | Le
  • CLA – Klasa (podrazumijevana vrijednost 00)
  • INS – Instrukcija/komanda
  • P1 – Parametar 1
  • P2 – Parametar 2 (00 – podrazumijevani, 80 – lokalni kod)
  • Lc – Dužina podataka u komandi
  • DATA – Dolazni podaci (između 0 i 255 bajtova)
  • Le – Dužina traženih podataka

Primjer za odabir datoteke ili appleta s ID-jem = A0000002471001

00 A4 0400 07 A0000002471001 00
[ CLA:00| INS:A4 | P1P2:0400 | Lc:07 | DATA:A0000002471001 | Le:00 ]


Komande (INS) definisane u ISO 7816-4
  '0E'	Erase binary
  '20'  Verify
  '70'	Manage channel
  '82'	External authenticate
  '84'	Get challenge
  '88'	Internal authenticate
  'A4'	Select file
    P1P2:'0100' DF selection (Lc:02|DATA:DFID)
    P1P2:'0200' EF selection (Lc:02|DATA:EFID)
  'B0'	Read binary
    P1:'1000 0000'  P2 is the offset of the first byte
    P1:'0xxx xxxx'  P1||P2 is the offset of the first byte to be read
    P1:'---- -xxx'  xxx -Short EF (Elementary File) identifier
  'B2'	Read record(s)
  'C0'	Get response
  'C2'	Envelope
  'CA'	Get data
    P1P2:'0000'-'003F' RFU
    P1P2:'0040'-'00FF' BER-TLV tag (1 byte) in P2
    P1P2:'0100'-'01FF' Application data (proprietary coding)
    P1P2:'0200'-'02FF' SIMPLE-TLV tag in P2
    P1P2:'0300'-'3FFF' RFU
    P1P2:'4000'-'FFFF' BER-TLV tag (2 bytes) in P1-P2
  'D0'	Write binary
  'D2'	Write record
    P1:'00' Designates the current record
    P1:'XX' Specified record
      P2:'0000 0---'  Currently selected EF
      P2:'xxxx x---'  (xxxxx - Short EF identifier)
      P2:'1111 1---'  RFU
      P2:'---- -000'  First record
      P2:'---- -001'  Last record
      P2:'---- -010'  Next record
      P2:'---- -011'  Previous record
      P2:'---- -100'  Record number given in P1
  'D6'	Update binary
  'DA'	Put data
  'DC'	Update data
    P1:'00' Designates the current record
    P1:'XX' Specified record
      P2:'0000 0---'  Currently selected EF
      P2:'xxxx x---'  (xxxxx - Short EF identifier)
      P2:'1111 1---'  RFU
      P2:'---- -000'  First record
      P2:'---- -001'  Last record
      P2:'---- -010'  Next record
      P2:'---- -011'  Previous record
      P2:'---- -100'  Record number given in P1
  'E2'	Append record
    P1:'00' Valid
      P2:'0000 0000'	Currently selected EF
      P2:'xxxx x000'	Short EF identifier
      P2:'1111 1000'	RFU

Odgovor

BodyTrailer
DATASW1 | SW2
  • DATA – Odlazni podaci (između 0 i 255 bajtova)
  • SW – Status riječi (Status Words)

Primjer odgovora
Terminal Smart Card
CLA:FF|INS:CA|P1:00
|P2:00|Lc:00 (Max)
—>processing…
processing… <—DATA:04 26 3E CA 83 22 80| SW:9000

Status riječi definisane u ISO 7816-4
The variable 'xx' can take on values in the range of '00' to 'FF'.

Normal processing
  '9000' Process executed successfully
  '61xx' Processing completed successfully. xx data bytes are available in
  response and can be retrieved using GET RESPONSE

Warning processing
  '62xx' Data in nonvolatile memory not modified. See SW2 for details
    '6200'	No information given
    '6281'	Part of returned data may be corrupted
    '6282'	End of file/record reached before reading Le bytes
    '6283'	Selected file invalidated
    '6284'	FCI not formatted according to 1.1.5
  '63xx' Data in nonvolatile memory modified; see SW2 for details
    '6300'	No information given
    '6381'	File filled up by the last write
    '63Cx'	Password verification failed (x - remaining tries)

Execution error
  '64xx' Data in nonvolatile memory not modified; see SW2 for details
  '65xx' Data in nonvolatile memory modified; see SW2 for details
    '6500'	No information given
    '6581'	Memory failure
  '66xx' Security-relevant result

Checking error
  '6700' Incorrect length (no additional information)
  '68xx' Functions in class byte not supported; see SW2 for details
    '6800'	No information given
    '6881'	Logical channel not supported
    '6882'	Secure messaging not supported
  '69xx' Illegal command; see SW2 for details
    '6900'	No information given
    '6981'	Command incompatible with file structure
    '6982'	Security conditions not satisfied
    '6983'	Authentication method blocked
    '6984'	Referenced data invalidated (Password is blocked)
    '6985'	Current state is unknown
    '6986'	Command not allowed (no current EF)
    '6987'	Expected SM data objects missing
    '6988'	SM data objects incorrect
  '6Axx' Incorrect P1/P2 parameters; see SW2 for details
    '6A80'	Incorrect parameters in the data field (Password is too long)
    '6A81'	Function not supported
    '6A82'	File not found
    '6A83'	Record not found
    '6A84'	Not enough memory space in the file
    '6A85'	Lc inconsistent with TLV structure
    '6A86'	Incorrect parameters P1-P2 (Incorrect parameters)
    '6A87'	Lc inconsistent with P1-P2
    '6A88'	Referenced data not found
  '6B00' Incorrect P1 or P2 parameter
  '6Cxx' Bad Le value; see SW2 for correct number of available data bytes
  '6D00' Command code invalid or not supported
  '6E00' Class not supported
  '6F00' No specific diagnosis

Operativn sistem (Java Card)

Operativni sistemi pametnih kartica se mogu podijeliti na nativne operativne sisteme i operativne sisteme zasnovane na prevodiocu. Nativni operativni sistemi i aplikacije koje se pokreću na njima izvršavaju se na mašinskom jeziku ciljnog procesora. Obično je to C i nemaju prevodioca koji bi prevodio programe na mašinski jezik ciljnog procesora.

Većina operativnih sistema zasnovanih na prevodiocu takođe je napisana u C-u. Aplikativni programi koji se pokreću na njima ne moraju da se generišu na mašinskom jeziku, mogu biti napisani na jeziku kao što je Java. Ovi operativni sistem pomoću prevodioca vrše prevođenje programa na mašinski jezik ciljnog procesora. Neki poznati primeri ovakvih operativnih sistema su Java Card, BasicCard i Multos.

Primjer Java Card aplikacije

HelloApplet.java

package com.dxdev.javacard.hello;

import javacard.framework.*;
import javacard.framework.service.*;

public class HelloApplet extends Applet {
   HelloWorld hello;
   Dispatcher disp;
   Service svc;

   private HelloApplet() {
     hello = new HelloWorld();
     svc = new RMIService(hello);
     disp = new Dispatcher((short) 1);
     disp.addService(svc, Dispatcher.PROCESS_COMMAND);
   }

   public static void install(byte[] buf, short ofs, short len) {
     (new HelloApplet()).register();
   }

   public void process(APDU apdu) {
     byte[] buf = apdu.getBuffer();
     switch(buf[ISO7816.OFFSET_INS])
     {
       case 0x40:
         Util.arrayCopy(hello,(byte)0,buf,ISO7816.OFFSET_CDATA,(byte)5);
         apdu.setOutgoingAndSend(ISO7816.OFFSET_CDATA,(byte)5);
         break;
       default:
         ISOException.throwIt(ISO7816.SW_WRONG_INS);
     }
   }
}

HelloWorld.java [RMI]

package com.dxdev.javacard.hello;

import java.rmi.RemoteException;

public class HelloWorld implements IHelloWorld {
    private static final byte[] message = {0x48, 0x65, 0x6c, 0x6c, 0x6f };
                                          // H, e, l, l, o
    public byte[] hello() throws RemoteException {
     return message;
   }
}

IHelloWorld.java [INTERFACE]

package com.dxdev.javacard.hello;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface IHelloWorld extends Remote {
   public byte[] hello() throws RemoteException;
}

ISO7816 Interface

ISO7816.OFFSET_CLA       // 0
ISO7816.OFFSET_INS       // 1
ISO7816.OFFSET_P1        // 2
ISO7816.OFFSET_P2        // 3
ISO7816.OFFSET_LC        // 4
ISO7816.OFFSET_CDATA     // 5
ISO7816.OFFSET_EXT_CDATA // 7
ISO7816.SW_NO_ERROR           // 0x9000
ISO7816.SW_INS_NOT_SUPPORTED  // 0x6E00

Aplikacija je krajnje jednostavna, ako se posalje APDU komanda 00 40 00 00 00, odgovor će biti 48 65 6C 6C 6F 90 00. Što je heksadecimalno za Hello i SW_NO_ERROR.

Čitaj dalje: RFID