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?
Danke für die schnelle Antwort! Ich habe gerade meinen Beitrag bearbeitet und ganz unten gibt es zusätzliche Informationen. – Vilius
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
Ich habe die Antwort aktualisiert. Leider kann ich Ihnen bei der Implementierung des Authentifizierungsverfahrens nicht helfen. –