2016-11-01 12 views
3

Я хочу отправить APDU длиной 1699 байт через NFC (класс IsoDep) на смарт-карту Java Card. Я получаю ошибкуОтправьте более 261 байт на Java-карту с Android NFC

java.io.IOException: Transceive длина превышает поддерживается максимальная

Мой телефон является Samsung Galaxy S7.

Я использую удлиненную длину в своем апплете на карте. Я подтвердил, что карта поддерживает расширенную длину. Я проверил это с помощью pyapdutool, отправив APDU с 4000 байтами на карту.

Я обнаружил, что, когда я пишу этот код, результат false:

final Tag t = (Tag) tag; 
myTag = IsoDep.get(t); 
boolean result = myTag.isExtendedLengthApduSupported(); 

У меня есть это в моем манифесте:

<activity 
     android:name=".test" 
     android:label="@string/title_test" 
     android:launchMode="singleTop" 
     android:theme="@style/AppTheme.NoActionBar" > 
    <action android:name="android.nfc.action.TAG_DISCOVERED" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
    <intent-filter> 
     <action android:name="android.nfc.action.NDEF_DISCOVERED" /> 
    </intent-filter> 
</activity> 

Как я могу отправить APDU с 1699 байт (или любая длина более 261 байт) через Android NFC?

+0

http://stackoverflow.com/questions/40173077/are-there-any-android-phones-which-support-extended-apdus –

+0

эта проблема пока не решена –

+0

Неясно, поддерживается ли карта такой длины. Вы пробовали его с настольного ПК и работали там? – guidot

ответ

3

Краткий ответ: вы не можете легко это сделать.

Вы уже выяснили, что IsoDep не «поддержка» расширенная длиной ПБДПА на устройстве (т.е. isoDep.isExtendedLengthApduSupported() возвращает false). Фактически это означает, что вы не можете отправлять APDU с расширенной длиной по объекту IsoDep. Фактически это означает только то, что объект IsoDep не будет правильно разделять APDU расширенной длины на более чем два блока ISO-DEP и, следовательно, предполагается, что APDU, длина которого превышает 261 байт, превышает размер буфера передачи. Вы все равно должны отправлять APDU с расширенной длиной с размерами < = 261 байт.

Таким образом, isoDep.isExtendedLengthApduSupported() фактически указывает, можете ли вы отправить более 261 байт в один приемопередатчик ISO-DEP.

Что вы могли бы сделать, чтобы преодолеть эту проблему, чтобы не использовать IsoDep объект на всех, и, вместо этого, вручную реализовать ISO-DEP (Протокол передачи 14443-4 ISO/IEC) в верхней части NfcA объекта (если ваш карта основана на NFC-A/ISO/IEC 14443 Type A) или объекте NfcB (если ваша карта основана на NFC-B/ISO/IEC 14443 типа B и, если ваше устройство поддерживает обмен данными по объекту NfcB) , Затем вы можете разделить APDU с расширенной длиной на блоки ISO-DEP, которые достаточно малы для трансиверовского буфера контроллера NFC (обычно 253 байта, включая байты заголовка, исключая байты CRC). Однако обработка протокола ISO-DEP сама по себе также означает, что вам необходимо позаботиться о надлежащей активации ISO-DEP, об обработке нумерации блоков, подтверждении блокировки, тайм-аутах, расширении времени ожидания и т. Д. Это довольно сложно, и особенно тайм-ауты нелегко наблюдать из-за задержек через стек Android NFC.

+0

Я хочу иметь пару ключей и сертификат на моей карте. это pki-карта? у карты pki есть сертификат? У вас есть лучшее предложение для меня? – Fatemeh

+1

@Fatemeh Я не уверен, как это относится к поддержке APDU с расширенной длиной. –

+0

Спасибо за полный ответ, но я хочу создать сертификат на java-карте с помощью приложения для Android. Я создаю пару ключей в карточке и выдаю сертификат с помощью nfc, и теперь я хочу хранить сертификат на карточке. У вас есть лучшее предложение для меня вместо класса isodep? – Fatemeh

 Смежные вопросы

  • Нет связанных вопросов^_^