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)