I am trying to read some information from an ISO / IEC 14443 Type A card.
After analyzing the map using the Android NFC TagInfo application , I found out that the application (AID: 15845F) has the specific file (File ID: 01) that I need.
I have already managed to connect to the map and select the application.
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)); } }
But my second request is not with error code: 6A86 (invalid parameters P1-P2). I already googled a lot and found different documents (for example: http://bit.ly/180b6tB ), but I just could not understand how I can implement the right value for P1 and P2 .
EDIT
Card Tag Type Using NFC TagInfo : ISO / IEC 14443-4 Smart Card, Mifare DESFire EV1 (MF3ICD81)
The SELECT command used in the source code didnβt really work, but instead it returned the answer 9000. Therefore, I assumed that everything was working fine.
You mentioned that NFC TagInfo does not contain the correct values ββfor DF names, etc. Is the value 0x313538343546 correct and how did you recognize it?
Can you give me a brief description of how I can get the data I need? Are there other Android apps that I can use to read the correct DF, AID, etc. names? I basically need to get ONE file from the ONE application. I could also provide some screenshots of the information collected using NFC TagInfo , if necessary.
EDIT 2
I rewrote the commands, but (as you suggested) saved them in the APDU wrapper. Therefore, I had two different commands: one to select the application , and the other to select the file .
private final byte[] NATIVE_SELECT_APP_COMMAND = new byte[] { (byte) 0x90, (byte) 0x5A, (byte) 0x00, (byte) 0x00, 3,
Finding a tutorial for your own Mifire-Desfire teams was not successful, so I stick to the following tutorial: http://noobstah.blogspot.de/2013/04/mifare-desfire-ev1-and-android.html p>
This tutorial introduces the authentication of a card that I turned off, as well as the transceive method, which for my understanding is not the right way to execute my own commands? Which method, possibly even snippit code, is used to execute its own commands? Which Android class should I use?
I rewrote the class specified in the tutorial and loaded it into pastebin . After running the class, I have the following results.
Select APPLICATION: 9100 Read DATA: 91AE
At this moment, I am pretty stuck and do not know what steps I should take next. Was it really a mistake, or rather, what changes in the queries should I make in order to get the necessary data?