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

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


ИЗМЕНИТЬ

Тип тега карты с использованием NFC TagInfo: смарт-карта ISO / IEC 14443-4, Mifare DESFire EV1 (MF3ICD81)

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

Вы упомянули, что NFC TagInfo не предоставляет правильных значений для DF-имен и т. Д. Правильно ли значение 0x313538343546 и как вы его узнали ?

Не могли бы вы дать мне краткое описание, как я могу получить нужные мне данные? Есть ли другие приложения для Android, которые я могу использовать для чтения правильных имен DF, AID и т. Д.? Мне в основном нужно получить ОДИН файл из ОДНОГО приложения. При необходимости я мог бы также предоставить несколько снимков экрана с информацией, собранной с помощью 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

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

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

Select APPLICATION: 9100
Read DATA: 91AE

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


person Vilius    schedule 10.10.2013    source источник


Ответы (1)


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

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

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

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 (прямого или заключенного) вместо использования APDU ISO 7816-4.

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

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

Где CMD - это собственная команда DESFire, а CMD-PARAM - параметры команд. Ответ такой:

[DATA] 0x91 STATUS

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

0x90 0xAF 0x00 0x00 0x00

Итак, в вашем случае вы должны выполнить команду выбора приложения для своего приложения 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 FID для вашего приложения, вы можете попробовать следующие команды:

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

905A00000300000000

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

906D000000

Выберите свое приложение:

905A0000035F841500

Получите FID DESFire:

906F000000

Получите ISO FID:

9061000000

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

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

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

person Michael Roland    schedule 10.10.2013
comment
Спасибо за быстрый ответ! Я только что отредактировал свой пост, и внизу есть дополнительная информация. - person Vilius; 10.10.2013
comment
Спасибо за вашу помощь, но я все еще застрял, и я только что отредактировал свой пост и предоставил дополнительную информацию. - person Vilius; 16.10.2013
comment
Я обновил ответ. К сожалению, я не могу вам помочь с реализацией процедуры аутентификации. - person Michael Roland; 16.10.2013
comment
Спасибо за ваш ответ и спасибо за ссылку на коды ошибок и успеха! Надеюсь, это приведет меня к решению. Кроме того, я не знал, что мне действительно нужно аутентифицировать себя - я прочту спецификации! - person Vilius; 16.10.2013