Kommunikation mit der Karte

Werbung
Kapitel 3: Kommunikation mit der Karte
Relevanter Standard: ISO 7816-4
Kartenleser/Terminal: Master, Smartcard: Slave
APDU = Application Protocol Data Unit: Folge von Bytes
Terminal → Karte: Command APDU
Karte → Terminal: Response APDU
Protokolle:
•
T=0 asynchronous half duplex character transmission protocol
•
T=1 asynchronous half duplex block transmission protocol
•
direkte/inverse Konvention
Java SmartCards, Kap. 3 (1/14)
Command APDU:
CLA
INS
P1
P2
Lc
90
02
00
00
02
Daten
01
2C
Le
8
CLA. Class-Byte: ISO/proprietär/verschlüsselt
INS. Instruction-Byte: Was tun? (gerade, 6= 6x, 9x)
P1, P2. 2 beliebige Parameter-Bytes
Lc. Length-Byte: Anzahl Datenbytes
Le. Length-Byte: Anzahl erwartete Antwortbytes
Response APDU:
Daten
01
2C
SW1
SW2
90
00
Java SmartCards, Kap. 3 (2/14)
Statuswort SW = SW1+SW2
ISO: SW1 = 90 (ok), SW1 = 6x (Fehler), SW1 = 60 (Wait Extension)
90 00
No Error
SW NO ERROR, SW OK
67 00
Wrong length
SW WRONG LENGTH
69 82
Security condition not satisfied
SW PIN REQUIRED
69 84
Data invalid
SW DATA INVALID
69 85
Conditions not satisfied
SW CONDITIONS NOT. . .
6A 82
File not found
SW FILE NOT FOUND
6D 00
INS value not supported
SW INS NOT SUPPORTED
6E 00
CLA value not supported
SW CLA NOT SUPPORTED
6F 00
No precise diagnosis
SW UNKNOWN
Java SmartCards, Kap. 3 (3/14)
Das Protokoll (1)
1. Kein Input, kein Output
CLA
INS
P1
P2
0
SW1
SW2
Java SmartCards, Kap. 3 (4/14)
Das Protokoll (2)
2. Kein Input, aber Output bekannter Länge
CLA
INS
P1
P2
Le
Ack
Daten
90
00
Le = Anzahl erwartete Antwort-Bytes, 0 = 256!
oder
CLA
INS
P1
P2
Le
SW1
SW2
Java SmartCards, Kap. 3 (5/14)
Das Protokoll (3)
3. Input, kein Output
CLA
INS
P1
P2
Lc
Lc = Anzahl Datenbytes
Ack
Daten
SW1
SW2
SW1
SW2
oder
CLA
INS
P1
P2
Lc
Java SmartCards, Kap. 3 (6/14)
Das Protokoll (4)
4. Input und Output
CLA
INS
P1
P2
Lc
Ack
Daten
Le
Daten
90
00
Java SmartCards, Kap. 3 (7/14)
Das Protokoll (4’)
4’. Input und Output (= Input/kein Output, kein Input/Output)
CLA
INS
P1
P2
Lc
Ack
Daten
61
00
C0
00
00
xx
xx
Ack
Daten
90
00
Java SmartCards, Kap. 3 (8/14)
Ack und Timeout
•
Ack = Ins ⇒ Alle Daten auf einmal übertragen
•
Ack = ! Ins ⇒ Daten einzeln übertragen
•
Ack für Programmierer transparent, aber:
setIncomingAndReceive() in JavaCard!
•
Spezialfall: Wait Extension 0x60 statt Ack oder SW
•
Timeout: Abhängig von (berechnet aus) ATR und Taktrate
•
Behandlung Le und Fehler: Abhängig von Middleware
Bei uns: Le wird nicht an die Karte geschickt!
Java SmartCards, Kap. 3 (9/14)
Das Class-Byte
•
CLA = 0x0X (APDU-Struktur und Bedeutung laut ISO)
•
CLA = 0x8X, 0x9X (Struktur wie ISO, Bedeutung proprietär)
•
CLA = 0xAX: Wie ISO, wenn nicht anders definiert
•
CLA = 0xB0 – 0xCF: ISO, 0xD0 – 0xFE: Proprietär
•
CLA = 0xFF: Wahl des Protokolls (T=0, T=1)
•
X = b4 b3 b2 b1 :
00xx:
01xx:
10xx:
11xx:
keine Security
proprietäre Security
secure messaging, ohne Header
secure messaging, mit Header
•
xx: Logischer Kanal/Art des SM: MAC, Verschlüsselt, . . .
•
Wir: CLA = 0x90
Java SmartCards, Kap. 3 (10/14)
INS-Byte und SW
•
Einschränkungen an INS: 6= 00, 6= 6x, 6= 9x, nicht ungerade!
•
ISO definiert 18 Instruktionen, z.B.
0x82: External Authenticate
0xA4: Select File, P1 = 04: Selection by name
0xC0: Get Response
Andere für Daten: put/get data/binary/record . . .
•
Select APDU: 00
•
SW = 0x9000 ok, SW = 0x6XYY, X 6= 0: Fehler
•
Eigene Fehler: 0x62YY, 0x63YY, 0x64YY, 0x65YY
A4
04
00
Lc
AID
Java SmartCards, Kap. 3 (11/14)
Der Kartenleser
Quasi-Standard: PC/SC
De-Facto: Beliebig viele Implementierungsunterschiede
Unsere Schnittstelle:
swt = new SWTTerminalInterface()
String[] swt.getReaderNames()
SWTReader swt.getReader(String readerName)
class SWTReader:
void connect()
boolean isPresent()
byte[] transmit(byte[] data)
Auch möglich: Direkte Benutzung der PC/SC API
Java SmartCards, Kap. 3 (12/14)
Zugriff auf den Kartenleser
1. Kartenleser-Objekt holen: r = swt.getReader();
2. Verbindung herstellen: r.connect();
(Exception, falls keine Karte im Leser)
3. Selektion des Applet per select-APDU:
00
A4
04
00
Lc
Applet-AID
4. Kommunikation mit der Karte:
byte[] transmit(byte[] to send)
Eingabe: Vollständiges Command-APDU als Byte Array
(≥ 5 Byte, nicht zu lang!)
Ausgabe: Response-APDU als Byte Array (genauso lang wie
Antwort, mind. 2 Bytes)
Java SmartCards, Kap. 3 (13/14)
Umgang mit Stromunterbrechungen
•
Einlegen/Herausziehen der Karte wird nicht automatisch bemerkt.
•
Exception beim nächsten transmit.
•
Nach Exception: Verhalten abhängig von Kartenleser
•
Einlegen/Herausziehen der Karte durch Aufforderung des Benutzers, oder: separater Thread mit isPresent().
Hilfsklassen
•
swt.util.ByteArray: Umgang mit Byte Arrays: setShort, getShort,
append, subarray, . . .
•
swt.util.HexString: Pretty-printing von Byte Arrays in Hex-Format:
dump, hexify, printReadable, hex to byte . . .
•
swt.util.ISO7816: Statuswörter
Java SmartCards, Kap. 3 (14/14)
Herunterladen