Android NFC IsoDep читает содержимое файлаAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Android NFC IsoDep читает содержимое файла

Сообщение Anonymous »

Я пытаюсь считать некоторую информацию с карты ISO/IEC 14443 типа A.
После анализа карты с помощью приложения для Android NFC TagInfo я обнаружил, что в приложении (AID: 15845F) есть конкретный файл (идентификатор файла: 01), который мне нужен.
Мне уже удалось подключиться на карту и выбрать приложение.

Код: Выделить всё

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));
}
}
Но мой второй запрос завершается с ошибкой с кодом: 6A86 (Неправильные параметры P1-P2). Я уже много гуглил и нашел разную документацию, но просто не мог понять, как можно реализовать правильные значения для P1 и P2.

EDIT
Тип тега карты с использованием NFC TagInfo: ISO/IEC Смарт-карта 14443-4, Mifare DESFire EV1 (MF3ICD81)
Команда SELECT, использованная в исходном коде, на самом деле не привела к ошибке, а вместо этого вернула ответ 9000. Вот почему я предположил, что все работает нормально.
Вы упомянули, что NFC TagInfo не предоставляет правильные значения для DF-имен и т. д. Правильно ли значение 0x313538343546 и как вы его узнали?
Можете ли вы предоставить мне короткое описание, как я могу получить нужные мне данные? Есть ли какие-либо другие приложения для Android, которые я могу использовать для чтения правильных имен DF, AID и т. д.? По сути, мне нужно получить ONE файл из ONE приложения. При необходимости я также мог бы предоставить несколько снимков экрана с информацией, собранной с помощью NFC TagInfo.

РЕДАКТИРОВАНИЕ 2
Я переписал команды, но (как вы предложили) сохранил их в оболочке APDU. Поэтому у меня получилось две разные команды: одна для выбора приложения, а другая для выбора файла.

Код: Выделить всё

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
};
Поиск руководства по собственным командам Mifire-Desfire не увенчался успехом, поэтому я придерживаюсь следующего руководства: http://noobstah.blogspot.de/2013/04/mif ... droid.html
Это руководство предоставляет аутентификацию по карте, которую я отключил, а также использует transceive, который, насколько я понимаю, не является подходящим способом выполнения собственных команд? Какой метод, возможно даже фрагмент кода, используется для выполнения собственных команд? Какой класс Android мне следует использовать?
Я переписал класс, представленный в руководстве, и загрузил его в Pastebin. После выполнения класса я получил следующие результаты.

Код: Выделить всё

Select APPLICATION: 9100
Read DATA: 91AE
На этом этапе я застрял и не знаю, какие шаги мне следует делать дальше. Была ли на самом деле ошибка или, скорее, какие изменения в запросах мне следует выполнить, чтобы получить нужные данные?

Подробнее здесь: https://stackoverflow.com/questions/192 ... le-content
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»