2013-10-10 29 views
6

Ich versuche, einige Informationen aus einer ISO/IEC 14443 Typ A Karte zu lesen.Android NFC IsoDep lesen Datei Inhalt

Nach der Analyse der Karte mit der Android-App NFC TagInfo, fand ich heraus, dass die Anwendung (AID: 15845F) die bestimmte Datei (File ID: 01), die ich brauche.

Ich habe es bereits geschafft, eine Verbindung zur Karte herzustellen und die Anwendung auszuwählen.

String action = getIntent().getAction(); 
if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) 
{ 
    Tag tagFromIntent = getIntent().getParcelableExtra(NfcAdapter.EXTRA_TAG); 
    Log.i(TAG, Arrays.toString(tagFromIntent.getTechList())); 

    IsoDep isoDep = IsoDep.get(tagFromIntent); 
    try 
    { 
     isoDep.connect(); 

     byte[] SELECT = { 
      (byte) 0x00, // CLA = 00 (first interindustry command set) 
      (byte) 0xA4, // INS = A4 (SELECT) 
      (byte) 0x04, // P1 = 04 (select file by DF name) 
      (byte) 0x0C, // P2 = 0C (first or only file; no FCI) 
      (byte) 0x06, // Lc = 6 (data/AID has 6 bytes) 
      (byte) 0x31, (byte) 0x35,(byte) 0x38,(byte) 0x34,(byte) 0x35,(byte) 0x46 // AID = 15845F 
     }; 

     byte[] result = isoDep.transceive(SELECT); 
     Log.i(TAG, "SELECT: " + bin2hex(result)); 

     if (!(result[0] == (byte) 0x90 && result[1] == (byte) 0x00)) 
      throw new IOException("could not select application"); 

     byte[] GET_STRING = { 
      (byte) 0x00, // CLA Class 
      (byte) 0xB0, // INS Instruction 
      (byte) 0x00, // P1 Parameter 1 
      (byte) 0x00, // P2 Parameter 2 
      (byte) 0x04 // LE maximal number of bytes expected in result 
     }; 

     result = isoDep.transceive(GET_STRING); 
     Log.i(TAG, "GET_STRING: " + bin2hex(result)); 
    } 
} 

Aber meine zweite Abfrage schlägt mit dem Fehlercode: 6A86 (falsche Parameter P1-P2). Ich habe schon viel gegoogelt und verschiedene Dokumentationen gefunden (zB: http://bit.ly/180b6tB), aber ich konnte einfach nicht verstehen, wie ich die richtigen Werte für P1 und P2 implementieren kann.


EDIT

Tag-Typ der Karte unter Verwendung NFC taginfo: ISO/IEC 14443-4 Smart Card, Mifare DESFire EV1 (MF3ICD81)

Der Befehl SELECT wie verwendet in Der Quellcode ist tatsächlich nicht ausgefallen, stattdessen hat er eine Antwort von 9000 zurückgegeben. Deshalb habe ich angenommen, dass alles gut funktioniert.

Sie haben erwähnt, dass NFC taginfo nicht die richtigen Werte für DF-Namen bereitstellt usw. Ist der Wert 0x313538343546 korrekt und wie Sie es haben herausgefunden?

Können Sie mir eine kurze Beschreibung zur Verfügung stellen, wie ich die Daten bekommen könnte, die ich will? Gibt es noch andere Android-Apps, mit denen ich die richtigen DF-Namen, AIDs usw. lesen kann? Ich muss im Grunde ONE Datei aus ONE Anwendung erhalten. Ich könnte auch einige Screenshots der mit NFC TagInfo gesammelten Informationen bereitstellen, falls erforderlich.


EDIT 2

ich die Befehle neu geschrieben haben, aber sie in der APDU-Wrapper (wie Sie vorgeschlagen) gehalten. Daher hatte ich am Ende zwei verschiedene Befehle, einen für die Auswahl der Anwendung und den anderen für die Auswahl der Datei.

private final byte[] NATIVE_SELECT_APP_COMMAND = new byte[] 
{ 
    (byte) 0x90, (byte) 0x5A, (byte) 0x00, (byte) 0x00, 3, // SELECT 
    (byte) 0x5F, (byte) 0x84, (byte) 0x15, (byte) 0x00  // APPLICATION ID 
}; 
private final byte[] NATIVE_SELECT_FILE_COMMAND = new byte[] 
{ 
    (byte) 0x90, (byte) 0xBD, (byte) 0x00, (byte) 0x00, 7, // READ 
    (byte) 0x01,           // FILE ID 
    (byte) 0x00, (byte) 0x00, (byte) 0x00,     // OFFSET 
    (byte) 0x00, (byte) 0x00, (byte) 0x00,     // LENGTH 
    (byte) 0x00 
}; 

Die Suche nach einem Tutorial für native Mifire-Desfire Befehle nicht erfolgreich war, so halte ich mich an die folgende Anleitung: http://noobstah.blogspot.de/2013/04/mifare-desfire-ev1-and-android.html

Dieses Tutorial eine Karte Authentifizierung bietet, die ich deaktiviert und verwendet auch die transmittive Methode, die für mein Verständnis ist keine ordnungsgemäße Möglichkeit zum Ausführen nativer Befehle? Mit welcher Methode, vielleicht sogar Code-Snippit, werden native Befehle ausgeführt? Welche Android-Klasse sollte ich verwenden?

Ich habe die im Tutorial bereitgestellte Klasse umgeschrieben und auf pastebin hochgeladen. Nach dem Ausführen der Klasse habe ich folgende Ergebnisse.

Select APPLICATION: 9100 
Read DATA: 91AE 

An diesem Punkt bin ich ziemlich fest und weiß nicht, welche Schritte ich als nächstes tun sollte. Was ist eigentlich der Fehler bzw. welche Änderungen in den Abfragen soll ich durchführen, um die Daten zu bekommen, die ich möchte?

Antwort

8

Angesichts der Informationen, die Sie aus NFC TagInfo extrahiert und die Befehle, die Sie versuchen zu verwenden, nehme ich an, die Karte ist MIFARE DESFire EV1. Richtig?

In Bezug auf Ihren Auswahlbefehl: NFC TagInfo liest derzeit nicht den DF-Namenwert, der im ISO-Befehlssatz für DESFire EV1 verwendet wird. Daher nehme ich an, dass der DF-Name, der für diese Anwendung eingerichtet wird, tatsächlich 0x313538343546 ist, andernfalls sollte der SELECT-Befehl fehlschlagen. Beachten Sie jedoch, dass dieser Wert keinesfalls von der in NFC TagInfo angezeigten DESFire AID abgeleitet werden kann! Tatsächlich ist der DF-Name ein separater Wert, der während der Erstellung der Anwendung definiert wird. (Dies unterscheidet sich von der vorherigen DESFire-Version.)

In Bezug auf Ihren READ BINARY-Befehl: Der Befehl, den Sie verwendeten, würde bedeuten, dass Sie zuvor eine Datei ausgewählt haben. Sie haben jedoch nur die Anwendung ausgewählt. Somit würden benötigen Sie entweder einen SELECT-Befehl für die Datendatei zu erteilen oder eine kurze Datei-ID im Befehl READ BINARY verwenden:

byte[] READ_BINARY = { 
     (byte) 0x00, // CLA Class 
     (byte) 0xB0, // INS Instruction 
     (byte) 0x80, // P1 (indicate use of SFI) 
     (byte) 0x01, // P2 (SFI = 0x01) 
     (byte) 0x04 // LE maximal number of bytes expected in result 
}; 

Wenn es jedoch darum geht, DESFire (EV1) Ich schlage vor, dass Sie bleiben lieber beim nativen Befehlssatz von DESFire (entweder direkt oder eingebunden), anstatt ISO 7816-4 APDUs zu verwenden.

Mit dem nativen Befehlssatz erhalten Sie die volle Funktionalität von MIFARE DESFire. Das Umbrechen von Befehlen erfolgt durch Einbetten systemeigener DESFire-Befehle in eine ISO 7816-4-APDU-Struktur. Der Wickel Befehl sieht wie folgt aus:

0x90 CMD 0x00 0x00 LEN CMD-PARAM 0x00 

Wo CMD ist das native DESFire Befehl und CMD-PARAM sind die Befehle, Parameter. Die Antwort lautet:

[DATA] 0x91 STATUS 

In diesem Status ist der native DESFire-Statuscode. Wenn STATUS 0xAF ist, können Sie die verbleibenden Antwortdaten erhalten, indem Sie diesen Befehl ausgeben:

0x90 0xAF 0x00 0x00 0x00 

Also in Ihrem Fall würden Sie einen ausgewählten Anwendungsbefehl für Ihre Anwendung Ausgabe 0x15845F (die verschiedene Byte-Reihenfolge etwas dagegen!):

0x90 0x5A 0x00 0x00 3 0x5F 0x84 0x15 0x00 
    |SELECT|   |APPLICATION ID| 

Dann Sie die Datendatei 0x01 (gesamte Datei, die bei 0 beginnend) lesen mögen:

0x90 0xBD 0x00 0x00 7 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
    |READ|   |FILE| OFFSET | LENGTH | 

In Bezug auf Ihre Frage, wie man den ISO-DF-Namen und ISO FIDs für Ihre Anwendung können Sie die folgenden Befehle versuchen:

Select-Master-Anwendung:

905A00000300000000 

Erhalten Anwendungen einschließlich ihrer DF-Namen:

906D000000 

Wählen Sie Ihre Anwendung:

905A0000035F841500 

DESFire FIDs Erhalten:

906F000000 

ISO FIDs Erhalten:

9061000000 

Sie können immer die transceive() - Methode des IsoDep-Objekts verwenden. IsoDep (d.h. ISO/IEC 14443-4) wird sowieso verwendet (für native DESFire-Befehle, für umgebrochene native Befehle und für ISO 7816-4-Befehle).

Der von der Karte empfangene Fehlercode (0xAE) weist auf einen Authentifizierungsfehler hin (weitere Informationen finden Sie in diesem Datenblatt: DESFire). Daher ermöglicht die Datei authentifizierte Lesezugriffe (siehe Zugriffsbedingungen in NFC TagInfo).

Um diese Datei zu lesen, müssen Sie das Authentifizierungsverfahren implementieren.

+0

Danke für die schnelle Antwort! Ich habe gerade meinen Beitrag bearbeitet und ganz unten gibt es zusätzliche Informationen. – Vilius

+0

Danke für Ihre Hilfe, aber ich bin immer noch fest und ich habe gerade meinen Beitrag bearbeitet und ein paar weitere Informationen geliefert. – Vilius

+0

Ich habe die Antwort aktualisiert. Leider kann ich Ihnen bei der Implementierung des Authentifizierungsverfahrens nicht helfen. –