4. Norma ISO 7816
Struktura karty
Na obrázku můžeme vidět, že tato norma popisující protokol nám v podstatě
tvoří stykové rozhraní mezi terminálem a danou kartou. Terminálem rozumíme
jakékoliv zařízení pracující s čipovými kartami (např. GSM telefon se SIM
kartou, bankomaty atd.). Dále zde najdeme na ní jak paměť RAM, tak i paměti
ROM a EEPROM. Hlavně ale procesor, který řídí veškeré operace s kartou.
Nejoblíbenějšími procesory pro tyto aplikace jsou dnes výrobky řady HC05
a HC11 od firmy Motorola. tyto procesory jsou řízeny vlastním operačním
systémem, který je většinou velmi sofistikovaný. Mezi jeho základní funkce
patří kromě autentizace karty terminálu (a obráceně) též správa jednoduchého
souborového systému uloženého v paměti EEPROM. Uživatel si tedy neukládá
na kartu svá data stylem jak chce, ale pěkně si je řadí do souborů, tak
jak je zvyklý třeba ze svého počítače. Tento model má jistá omezení, mezi
něž patří zejména to, že jednotlivé soubory nejsou rozlišovány jménem,
ale jednobajtovým až dvoubajtovým číslem, a také to, že maximální úroveň
vnoření adresářů bývá obvykle dva. Na rozdíl od běžných souborů jsou ovšem
vybaveny obstojným bezpečnostním mechanismem, který většinou umožňuje definovat
několik klíčů, které je třeba pro konkrétní operace se soubory znát.
Řada karet je v poslední době vybavena i šifrováním, které je možné
použít buď zcela samostatně (karta pracuje jako šifrovací procesor), nebo
operační systém při výpočtu do šifrovacího algoritmu „přidá" nějaké tajné
číslo uložené na kartě. Tak potom lze vytvářet nejrůznější autentizační
schémata. Nejlepší karty tohoto typu dovolují uživateli, aby si napsal
vlastní příkazy, které budou připojeny k operačnímu systému jako jeho rozšíření.
Vše samozřejmě probíhá za přísných bezpečnostních pravidel, která zamezují
tomu, aby na danou kartu pronikl nějaký virus.
Popis ISO 7816
Nyní se dostáváme k vlastnímu popisu normy. Ta se skládá ze tří částí a
to norem 7816-1, 7816-2, 7816-3.
7816-1 definuje fyzikální vlastnosti karty, k nimž patří zejména
její odolnost proti mechanickým elektromagnetickým vlivům.
7816-2 popisuje rozměry a umístění konektoru, takže jeho
dodržení je základní podmínkou pro univerzálnost terminálů a karet od
různých výrobců.
7816-3 popisuje konkrétní význam a použití jednotlivých
vývodů. Touto částí se budeme zabývat
Popis kontaktů
Vcc, Vpp napájení karty, přičemž Vpp obecně nemusí být konstatní
jako u telefonních karet a terminál by měl být na to připraven. Některé
karty si Vpp vyrábějí samy a tak tento hrot konektoru nepotřebují
GND uzemnění
I/O vstupně/výstupní hrot určený pro přenos dat mezi terminálem
a kartou. Tento přenos bývá nejčastěji asynchronní sériový, pracující v
poloduplexním režimu.
CLK vstup a slouží k přívodu hodinového signálu z terminálu.
Od tohoto signálu se potom odvozuje rychlost komunikace na špičce I/O.
Některé karty mohou pro tyto účely využívat interní hodinový zdroj, a potom
je tento pin nevyužit.
RES slouží podobně jako u telefonních karet ke generování
události RESET, i když zde v poněkud odlišné podobě.
Událost RESET
Vzhledem k tomu, že v případě normy ISO 7816 je definováno poměrně široké
spektrum možností, jak se může daná karta chovat, je třeba, aby měl univerzální
terminál nějakou šanci zjistit, jaký typ a od jakého výrobce do něj byl
právě zasunut. K tomuto účelu je definována poměrně propracovaná událost
RESET, jejíž součástí je generování bloku dat označovaného jako Answer-to-Reset,
který dopodrobna popisuje charakteristiky příslušné karty a to především
komunikačního kanálu. Vzhledem k tomu, že oblast operačního systému (dále
OS) není obecně normována, nejsou zde obsaženy informace o OS. => u neznámé
karty tedy není možné určit používané příkazy a jejich sémantiku.
Jediné, co musí terminál o zasunuté kartě vědět, je, zda půjde o synchronní
či asynchronní druh přenosu. Synchronní přenos je jednoduchý a není to
hlavní směr používání karet, popíšu jen asynchronní přenos. Způsob resetování
takové karty je následující: poté, co je karta zasunuta do terminálu, je
připojeno napájecí napětí a na vstup CLK je přiveden stabilní hodinový
signál v rozsahu jednoho až pěti megahertzů. Signál RES je udržován v
úrovni logické nuly. Asynchronní karta, reagující na nulovou úroveň na
špičce RES, by jako reakci na tento stav měla začít nejpozději do 40 000
hodinových cyklů s vysíláním dat Answer-to-Reset. Pokud se tak nestane,
pak terminál začne předpokládat, že karta resetuje na úroveň H, takže nastaví
RES= H a znovu "dá" kartě 40 000 hodinových cyklů na to, aby něco předvedla.
Pokud se ani potom nic nestane, předpokládá se, že karta neodpovídá asynchronnímu
ISO 7816 a terminál ji vrátí jako neplatnou. Pro případ úspěšného resetu
platí, že pin RES by měl v průběhu další komunikace zůstat v takovém stavu,
v jakém došlo k události RESET.
Asynchronní přenos
Stejně jako v případě ostatních sériových přenosů definuje norma
dva základní stavy na vedení, a to značku (Z) a mezeru (A). Pokud je vedení
v klidovém stavu, potom je na něm signál značka. V případě, že na vedení
právě někdo vysílá, potom na něm může být buď mezera, nebo značka podle
toho, jaký bit zprávy je právě vysílán. Komunikace je obousměrná, avšak
vždy platí pravidlo, že karta vysílá data teprve v okamžiku, kdy
ji k tomu terminál nějakým způsobem vyzve (reset, příkaz pro OS, apod.).
Platí pravidlo, že jak terminál, tak i karta jednoznačně vědí, kdo bude
vysílat následující datové slovo.
Základní charakteristikou všech sériových přenosů je rychlost vlastní
komunikace. Označme si proto délku trvání jednoho znaku (značka nebo mezera)
jako etu (Elementary Time Unit). Během vysílání dat Answer-to-Reset (dále
už jen ATR) platí, že etu je rovno 1/9600 s, pro karty s interním zdrojem
hodin nebo 372/fi pro karty využívající externí synchronizace pomocí frekvence
fi, přiváděné na pin CLK. Pro univerzální terminál z toho tedy vyplývá,
že by měl předpokládat přenosovou frekvenci 9600 b/s a fi nastavit na 372*9600
Hz. Tím bychom měli dosáhnout toho, že karta jak s interním, tak i s externím
časováním zahájí vysílání ATR na stejné frekvenci –9600 b/s.
Formát slov tvoří posloupnost deseti stavů, přičemž první z nich je
vždy mezera označující začátek vysílání. Potom následuje osm datových bitů,
které jsou při začátku ATR v pořadí nižší-vyšší. Poslední bit zabezpečuje
celou posloupnost sudou paritou. Mapování stavů Z a A na logické hodnoty
je přitom následující: Z = 1, A = 0. Důležité však je uvědomit si, že tato
konvence platí pouze pro začátek ATR – po prvním znaku (TS) se může změnit.
Přesněji řečeno: může se změnit pořadí přenášených bitů a význam stavů
Z a A (jejich mapování na úrovně H nebo L). Co se naopak nikdy nezmění,
je tvar slova, takže vždy bude přenášeno osm datových bitů uvozených jedním
start-bitem a končících sudou paritou.
Posledním důležitým parametrem komunikace na fyzické úrovni je minimální
časová vzdálenost mezi dvěma slovy, označovaná jako tzv. Guardtime. Její
hodnotu je možné odvodit z toho, že vzdálenost spádových hran startovacích
impulzů uvozujících dvě bezprostředně po sobě jdoucí slova je minimálně
12*etu. Vzhledem k tomu, že délka trvání n bitové posloupnosti by měla
být (n±0,2) *etu, potom můžeme zhruba říci, že tg (Guardtime) by se měl
pohybovat kolem dvou etu jednotek. Rád bych ale připomněl, že zde nejde
o to, čemu jsme ze sériové komunikace v oblasti PC zvyklí říkat stop-bity.
Ačkoliv je možné zaručit korektní tg právě pomocí dvou stop-bitů, nelze
tyto dva pojmy ztotožnit. Jak ukazuje obrázek, protokol 7816 totiž v "druhé
polovině" tg vyhrazuje prostor pro hlášení chyb na straně příjemce. Celá
situace funguje zhruba takto: Po odvysílání daného slova monitoruje vysílající
stav linky během dvanáctého bitu, a pokud zde najde stav mezera, znamená
to, že příjemce hlásí chybu. Na to vysílající zareaguje tak, že po uplynutí
tg zahájí opakované vysílání předchozího slova. Dlužno ovšem podotknout,
že takovéto chování je povinné pouze pro fázi ATR a dále pak jen pro některé
komunikační protokoly. Naštěstí pro nás dále popsaný protokol T=0 tento
způsob hlášení chyb podporuje, takže je jistě dobré o něm vědět.
Struktura ATR
Vlastní posloupnost ATR začíná znakem (dále se budeme bavit pouze o datové
části přenášených slov, jimž budeme říkat znaky) TS, který říká, jakým
způsobem bude prováděno kódování následujících znaků ATR. Slovo nesoucí
znak TS začíná posloupností (Z) AZZA. Ta slouží k synchronizaci a může
se též použít pro zjištění etu (nejvyšší čas). Následující tři stavy jsou
buď AAA, nebo ZZZ a popisují způsob kódování dále přenášených znaků. Posloupnost
AAA definuje takzvanou inverzní konvenci, kdy stav A odpovídá logické hodnotě
1 a jednotlivé bity znaků jsou přenášeny v pořadí vyšší-nižší. Opakem je
potom přímá konvence signalizovaná posloupností ZZZ, která předepisuje
stejný způsob kódovaní, jaký platil pro začátek ATR (A = 0, pořadí nižší-vyšší).
Celé toto slovo končí vždy stejnou posloupností AAZ, nastavující korektní
stav paritního bitu.
Po odvysílání TS už terminál ví, jakým způsobem má z přicházejících
slov dekódovat informace. Následujícím znakem je T0, který říká, jaká bude
struktura ATR. Typický vzhled každé ATR je možné vidět na obrázku. Z něho
je zřejmé, že znaky TS a T0 jsou odvysílány vždy. Po znaku T0 potom následuje
"první sada" globálních znaků TA1, TB1, TC1 a TD1. Informaci o tom, které
znaky z této posloupnosti budou vysílány a které nikoliv, podávají horní
čtyři bity znaku T0. Je-li bit 5 nastaven na hodnotu jedna, potom je přenášen
znak TA1, analogicky bit 6 určuje přítomnost TB1 atd. až po TD1. Jak je
z obrázku vidět, posloupnost TAi, TBi, TCi, TDi se může několikrát opakovat.
Pro tento účel nese znak TDi (je-li přítomen) ve svých horních čtyřech
bitech stejnou informaci jako T0, s tím rozdílem, že nyní se rozhoduje
o přítomnosti znaků TAi+1 až TDi+1. To, že tato série je už poslední, poznáme
podle toho, že příslušný TDi+1 buď není vůbec vysílán (určeno maskou v
TDi), nebo obsahuje v horních čtyřech bitech samé nuly.
Podrobně význam jednotlivých znaků z ATR rozebírat nebudeme, neboť
jde daleko za rámec tohoto článku. Jen se ještě podíváme na dolní čtyři
bity znaků T0 a TDi. V případě T0 je zde uložen počet tzv. historářových
znaků T1 až Tk, které následují za poslední posloupností TAi až TDi. Zatímco
TAi až TDi popisují spíše protokolové charakteristiky karty, jsou v bajtech
T1 až Tk uloženy informace o tom, kdo kartu vyrobil, jaký má operační systém
a procesor, jaký je její stav atd. Spodní čtveřice bitů v TDi zase určuje
typ použitého protokolu, kterým je karta schopna komunikovat. Z toho, že
bitů TDi zde může být více, je ihned patrno, že chytré karty mohou komunikovat
i více protokoly najednou. Pro jednoduchost se dále omezíme pouze na protokol
označovaný jako T=0 (to proto, že má v TDi číslo 0). Tento protokol by
měl být podporován většinou karet a vždy by měl být ohlášen jako první
(tedy v TD1).
Protokol T=0
Představuje nadstavbu pro výše popsaný sériový kanál tak, že definuje jednotný
formát zadávání příkazů a zasílání odpovědí. Připomínám ale, že vlastní
typy příkazů a jejich data už na této úrovni normovány nejsou. V protokolu
T = 0 je karta vedena jednoznačně jako pasivní prvek – příkazy vždy zasílá
terminál kartě, nikdy ne obráceně. Vlastní hlavička příkazu se skládá z
posloupnosti znaků CLA, INS, P1, P2 a P3.
CLA definuje takzvanou třídu instrukce.
INS je vlastní kód dané instrukce a je platný pouze tehdy,
obsahuje-li nejnižší bit hodnotu nula a nejvyšší čtyři bity nenesou ani
jednu z hodnot 6 nebo 9.
P1, P2 jsou referenční data závislá na typu konkrétní instrukce
(slouží pro adresaci).
P3 říká, kolik dat bude pro daný příkaz přenášeno. V případě
P3 = 0 závisí jejich počet na tom, v jakém směru se přenos očekává.
V případě směru karta –>terminál to znamená přenos 256 znaků, přičemž
obráceně P3 = 0 říká, že příkaz nemá žádná další data.
Po odeslání této hlavičky čeká terminál na odpověď od karty. Možné
jsou tyto odpovědi:
Typ odpovědi |
Hodnota |
Popis |
ACK |
INS |
Vpp neaktivní, přenos všech zbývajících dat následuje |
INS+1 |
Vpp aktivní, přenos všech zbývajících dat následuje |
|
not(INS) |
Vpp neaktivní, následuje přenos jednoho znaku |
|
not(INS+1) |
Vpp aktivní, následuje přenos jednoho znaku |
|
NULL |
0x60 |
Vpp beze změny, zatím žádný přenos dat |
SW1 |
SW1 |
Vpp neaktivní, přenos znaku SW2 následuje |
Rozdíl mezi jednotlivými ACK reakcemi je jednak v tom, zda karta nadále
potřebuje napětí Vpp, a jednak v tom, zda bude následovat přenos všech
dat najednou, či po slabikách potvrzovaných dalšími ACK odpověďmi. Konec
zpracování každého příkazu je oznámen dvojicí znaků SW1 a SW2, které určují
stav výsledku operace. Kromě hodnot uvedených v tabulce pro SW1 opět neplatí
žádné normativní omezení, takže každá karta může reagovat v zásadě po svém.
Platí jen, že "normální" správné ukončení by mělo být signalizováno sekvencí
SW1 - SW2 = 0x90-00.
Normované chybové kódy pro SW1:
Hodnota SW1 |
Význam |
0x6e |
Chybná instrukce (CLA) |
0x6d |
Instrukce není podporována nebo nepracuje |
0x6b |
Špatná reference (P1, P2) |
0x67 |
Chybná délka (P3) |
0x6f |
Blíže nespecifikovaná chyba |
Semestrální projekt z Číslicových počítačů II.
Autoři: Lumír Návrat,
Jakub
Konštacký, Zdeněk Šmíd,
Pavel
Oplatek