RPDU апплета Javacard не содержит никаких данных при обращении к поиску для Android
У меня есть сложный апплет Javacard, который разработан и протестирован для обычной смарт-карты (например, NXP J3E145, T=1). Теперь я должен использовать его в UICC на мобильном телефоне и получить доступ к нему из моего приложения для Android. UICC использует протокол T=0.
Когда я общаюсь с SIM-картой из обычного кард-ридера (Omnikey 5321), апплет работает нормально.
Однако, когда я перемещаю его в свой мобильный телефон (Sony Xperia S) и отправляю APDU через API для поиска Android, некоторые RPDU не содержат какой-либо части данных, остается только слово состояния 0x9000, а часть данных отсутствует!
Эти APDU не работают:
80 04 00 00 00 --> 90 00 (although there should be some data, 200 bytes approx.)
80 01 00 00 00 --> 90 00 (although I expect 18 bytes)
Эти APDU в порядке:
80 05 00 00 00 --> 00 90 00 (one byte as I expected)
80 06 00 00 00 --> <... data of length 20 ...> 90 00 (as I expected)
Может ли это быть проблема тайм-аута (время обработки всегда < 1 с)? Или какая-то странность Т = 0?
Код моего приложения для Android действительно прост:
Channel channel = session.openLogicalChannel(aid);
byte[] resp = channel.transmit(new byte[] {(byte) 0x80, 0x04, 0x00, 0x00, 0x00});
Open Mobile API, 4.4.2 (19).
Любая помощь была бы хороша, я потратил два дня на решение этой проблемы. Пожалуйста спаси меня.
Войта
РЕДАКТИРОВАТЬ мои правила доступа:
AID: A000000018308005006563686F00 ___ AllApps:Never
AID: A0000000183080055A6563686F5A ___ Hash:ABFF7159B0530044CD71C6561B0F9D55CBAE8984:Always
AID: A000000018308005596563686F59 ___ Hash: ABFF7159B0530044CD71C6561B0F9D55CBAE8984:Always
AID: A000000018308005586563686F58 ___ AllApps:Always
AID: NO_AID ___ AllApps:Always
AID: A000000018308005006563686F00 ___ AllApps:Never
AID: A0000000183080055A6563686F5A ___ Hash: ABFF7159B0530044CD71C6561B0F9D55CBAE8984:Always
AID: A000000018308005596563686F59 ___ Hash: ABFF7159B0530044CD71C6561B0F9D55CBAE8984:Always
AID: A000000018308005586563686F58 ___ AllApps:Always
AID: NO_AID ___ AllApps:Always
В приведенном выше списке я фильтровал только правила APDU (а правила NFC вообще не записывали).
Мой апплет имеет AID F06D617073616D2E617070 Мой домен безопасности эмитента A0000000871002FF33FFFF8901010100.
Я не думаю, что эти правила могут повлиять на мои APDU, нет реальных фильтров с заголовком и маской...
2 ответа
Я обнаружил ошибку в своем апплете, которая действительно вызвала всю проблему. Мой апплет ответил со словом состояния 0x911C и без данных. Однако SEEK всегда возвращал 0x9000 вместо 0x911C, поскольку слова состояния 0x91XX не могут использоваться при доступе через SEEK. Следующий абзац написан EduardEtc с форума SEEK, и он объясняет все:
"ETSI определяет (в TS 102 221) слово состояния 91XX для использования с приложениями SIMToolKit (CAT). Любое карточное приложение, которое в противном случае отправило бы 9000 как SW1SW2, может вернуть 91xx вместо этого, что телефон должен интерпретировать для обработки APDU CAT. Таким образом, приложение телефона будет никогда не видеть 91xx, он заменен уровнем обработки CAT телефона на 9000. ИСО / МЭК 7816-4 определяет SW1SW2=61xx для аналогичной цели. В то время, когда это включено в стандарт, чтобы удовлетворить потребность ETSI, ETSI не дождался завершения процесса ISO и указал другую кодировку."
Думаю, главная проблема с каналом Open Logical. может быть карта не поддерживает логический канал. Попробуйте открыть базовый канал.
и вы не получаете никаких данных ответа, потому что, часть Le не установлена. CLA, INS, P1, P2, (Le), Data . Если вы устанавливаете в поле Le значение 00, вы должны получить полный обратный ответ как общее количество доступных байтов. Опять же, если вы отправите нужное количество байтов, предположим, что XX, а затем передайте его, и вы сможете получить этот ответ, если его больше 256, то это будет 61 XX, XX, указывая количество байтов ответа.