Устройство чтения смарт-карт Android через USB Ошибка: ПРОЦЕДУРА БАЙТОВОГО КОНФЛИКТА

Я использую GEMALTO IDBRIDGE K30, подключенный через USB к устройству Android.

Сначала я отправляю сообщение PC_to_RDR_IccPowerOff вот так.

byte[] data= new byte[]{
                    (byte) 0x62,
                    (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
                    (byte) 0x00,
                    (byte) 0x00,
                    (byte) 0x00,
                    (byte) 0x00, (byte) 0x00};


            UsbInterface intf = _usbDevice.getInterface(0);
            UsbEndpoint outputEndpoint = intf.getEndpoint(1);
            UsbEndpoint inputEndpoint = intf.getEndpoint(0);
            intf.getEndpointCount();
            UsbDeviceConnection connection = _usbManager.openDevice(_usbDevice);

            connection.claimInterface(intf, forceClaim);

            //activate card for apdu
            final int dataTransferred = connection.bulkTransfer(inputEndpoint, data, data.length, TIMEOUT);

            Log.e(SIGNATURE_LOG, String.format("Written %s bytes to the dongle. Data written: %s", data.length, byteArrayToHexArrayString(data)));

В ответ я получаю

Получено сообщение длиной 64 и содержанием: [80, 18, 00, 00, 00, 00, 00, 00, 00, 00, 3B, DF, 18, 00, 81, 31, FE, 58, 80, 31, 90, 52, 41, 01, 64, 05, C9, 03, AC, 73, B7, B1, D4, 44, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]

После этого я жду 5 секунд, а затем пытаюсь отправить команду APDU Select с помощью PC_to_RDR_XfrBlock.

byte[] data2= new byte[]{
                        (byte) 0x6F,
                        (byte) 0x10, (byte) 0x00, (byte) 0x00, (byte) 0x00,
                        (byte) 0x00,
                        (byte) 0x01,
                        (byte) 0x00,
                        (byte) 0x00, (byte) 0x00,
                        (byte) 0x00,
                        (byte) 0x00,
                        (byte) 0x0C,
                        (byte) 0x00, (byte) 0xA4, (byte) 0x04, (byte) 0x00,
                        (byte) 0x07, (byte) 0xA0, (byte) 0x00, (byte) 0x00,
                        (byte) 0x01, (byte) 0x18, (byte) 0x45, (byte) 0x4E,
                        (byte) 0x15,};

В ответ я получаю следующее: ошибка F4 с описанием PROFEDURE BYTE CONFLICT:

Получено сообщение длиной 64 и содержанием: [80, 00, 00, 00, 00, 00, 01, 40, F4, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]

Кто-нибудь может мне помочь? Я не понимаю, что я делаю неправильно.

2 ответа

Решение

PROCEDURE BYTE CONFLICT Ошибка немного хитрая, потому что это происходит внутри прошивки считывателя и передается вам через CCID. По сути, это означает, что считыватель обращается к смарт-карте по протоколу T=1, а некоторые байты процедуры T=1 не были получены или отправлены правильно между устройством чтения и смарт-картой. На мой взгляд, вы ничего не можете сделать в своем приложении. Что ты можешь сделать:

  • Если ваша смарт-карта поддерживает протокол T=0, попробуйте применить его
  • Обновите ваш ридер до последней прошивки
  • Возможно, ваша смарт-карта сломана, попробуйте другую карту идентичного типа (или более новую ее версию)

  • Также здесь говорится, что иногда могут быть проблемы с некоторыми портами USB. Попробуйте подключить ридер к USB-концентратору на устройстве Android.

Обновить

Ваш считыватель смарт-карт GEMALTO IDBRIDGE K30 сообщает об уровне обмена TPDU (см. здесь). Так как на уровне обмена TPDU все данные, отправляемые считывателю, перенаправляются на смарт-карту как есть, вы должны обрабатывать протокол T=1 внутри вашего программного обеспечения. Обычно драйвер позаботится об этой задаче, но в вашем случае вы общаетесь напрямую со считывателем смарт-карт на уровне USB. Так что между ними нет водителя. Таким образом, вам придется самостоятельно реализовать и обработать протокол T=1 в своем коде или найти существующую реализацию Java. ISO-7816-3 является стандартом, который определяет протокол T=1. К сожалению, он не доступен бесплатно, поэтому я не могу предоставить ссылки на него (попробуйте поиск в Google). Вы можете найти существующую реализацию протокола T=1 на языке C в драйвере CCID с открытым исходным кодом для Linux.

Если вы не связаны с GEMALTO IDBRIDGE K30 читатель, вы можете получить другой читатель, который имеет расширенный APDU или короткий уровень обмена APDU. В этих случаях вам не нужно заботиться о протоколе в вашем программном обеспечении.

Другие вопросы по тегам