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

Я пытаюсь прочитать некоторую информацию из ISO / IEC 14443 Тип A карта.

после анализа карты с android app 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). Я уже погуглил много и нашел разные документы (например:http://bit.ly/180b6tB), но я просто не мог понять, как я могу реализовать правильные значения для P1 и P2.


редактировать

тип тега карты с помощью NFC TagInfo: ИСО/МЭК 14443-4 Смарт Карта, Mifare desfire и EV1 с (MF3ICD81)

команда SELECT, используемая в исходном коде, фактически не завершилась ошибкой, но вместо этого он вернул ответ 9000. Вот почему я предположил, что все работает нормально.

Вы упомянули об этом NFC TagInfo не дает правильно значения для DF-имен и т. д. Значение 0x313538343546 правильно, и как вы это узнали?

можете ли вы предоставить мне short описание, как я могу получить данные, которые мне нужны? Есть ли другие программы, которые я могу использовать для чтения справа DF-имена, СПИД и т. д.? Мне в основном нужно получить один из один приложение. Я также могу предоставить некоторые скриншоты информации, собранной с помощью 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/mifare-desfire-ev1-and-android.html

этот учебник предоставляет аутентификацию карты, которую я отключил, а также использует передачи метод, который для моего понимания не является правильным способом выполнения собственных команд? Какой метод, purhaps даже фрагмент кода, используется для выполнения собственных команд? Какой Android-класс я должен использовать?

я переписал класс, указанный в учебнике, и загрузил его в сайт Pastebin. После выполнения класса у меня есть следующие результаты.

Select APPLICATION: 9100
Read DATA: 91AE

в этот момент я довольно застрял и не знаю, какие шаги я должен сделать дальше. Была на самом деле ошибка или, скорее, какие изменения в запросах я должен выполнить, чтобы получить данные, которые я хочешь?

1 ответов


учитывая информацию, которую вы извлекли из NFC TagInfo и команды, которые вы пытаетесь использовать, я предполагаю, что карта MIFARE DESFire EV1. Правильно?

Что касается вашей команды выбора: NFC TagInfo в настоящее время не читает значение имени DF, используемое в наборе команд ISO для DESFire EV1. Таким образом, я предполагаю, что DF-name, настроенное для этого приложения, на самом деле 0x313538343546, иначе команда SELECT должна завершиться ошибкой. Однако заметим, что это значение не получается из помощи DESFire, показанной в NFC TagInfo! Фактически DF-name-это отдельное значение, определенное во время создания приложения. (Это отличается от предыдущей версии DESFire.)

Что касается вашей двоичной команды чтения: команда, которую вы использовали, будет означать, что вы ранее выбрали файл. Однако вы выбрали только приложение. Таким образом, вам нужно будет либо выполнить команду SELECT для файла данных, либо использовать короткий идентификатор файла в двоичном файле чтения команда:

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
};

однако, когда дело доходит до DESFire (EV1), я предлагаю вам придерживаться собственного набора команд DESFire (прямого или обернутого) вместо использования ISO 7816-4 APDUs.

С помощью собственного набора команд вы получаете полную функциональность Mifare DESFire. Перенос команд выполняется путем встраивания собственных команд DESFire в структуру APDU ISO 7816-4. Команда обертывания выглядит следующим образом:

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

где CMD является собственные команды DESFire и CMD-PARAM являются параметрами команд. Ответ:

[DATA] 0x91 STATUS

где status-собственный код состояния DESFire. Если состояние равно 0xAF, вы можете получить оставшиеся данные ответа, выполнив следующую команду:

0x90 0xAF 0x00 0x00 0x00

таким образом, в вашем случае вы бы выдали команду select application для вашего приложения 0x15845F (обратите внимание на другой порядок байтов!):

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

затем вы хотите прочитать файл данных 0x01 (весь файл, начиная с смещение 0):

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

Что касается вашего вопроса, Как получить имена ISO DF и ISO FIDs для вашего приложения, вы можете попробовать следующие команды:

выберите мастер применение:

905A00000300000000

получить приложения, включая их имена DF:

906D000000

выбрать приложение:

905A0000035F841500

Получить DESFire FIDs:

906F000000

получить ISO FIDs:

9061000000

вы всегда можете использовать передачи() метод объекта IsoDep. IsoDep (т. е. ISO / IEC 14443-4) используется в любом случае (для собственных команд DESFire, для обернутых собственных команд и для команд ISO 7816-4).

код ошибки, полученный от карты (0xAE), указывает на ошибку аутентификации (см. эту таблицу для получения дополнительной информации: DESFire). Таким образом, файл позволяет аутентифицироваться только для чтения (см. условия доступа, показанные в NFC TagInfo).

таким образом, чтобы прочитать это файл, вам нужно будет реализовать процедуру аутентификации.