Карты Java внезапно перестали отвечать - PullRequest
2 голосов
/ 29 марта 2019

Я занимаюсь разработкой приложения для Java-карт, и вдруг две карты перестали работать, обе одновременно.

Карты представляют собой карты Java J3H081 (Java Card 3.0.4, Global Platform 2.2.1), и я использую как ACR122U, так и ACR1222L.

Я успешно записывал CAP-файлы, используя GlobalPlatformPro, на карту во время тестирования, но в одном случае он возвращал ошибку на этапе выбора приложения по умолчанию (к сожалению, у меня больше нет ошибки).

Я сделал еще несколько попыток написать CAP, затем переключился на другую карту, которую мне пришлось (к сожалению, у меня только две на данный момент), чтобы посмотреть, была ли это проблема с картой; GlobalPlatformPro сообщил о той же проблеме и для этой карты.

Я вернулся к коду приложения карты и сделал несколько изменений, чтобы посмотреть, поможет ли это, и когда я вернулся, чтобы загрузить приложение обратно на карту, карта вообще не отвечала (т.е. GlobalPlatformPro сообщил, что карты нет). ).

Затем я попробовал другую карту и получил тот же результат.

Я попробовал два разных считывателя (как выше), и каждый на двух разных машинах, и получил один и тот же результат.

На ACR1222L карты регистрируются только по RF (т. Е. Я слышу звуковой сигнал), но ОС не видит карты.

При установке на ACR122U карта подает звуковой сигнал, и светодиод на мгновение загорается зеленым, но затем снова становится красным, и ОС не видит карту. Если я оставляю карту на ридере, она делает это каждые ~ 20 секунд (как будто она обнаруживает, что карта не работает). Если я коснусь карты, затем заберу ее, а затем попробую снова коснуться, она не издаст звуковой сигнал, если не будет оставлена ​​на ~ 20 секунд.

Карты MIFARE 1K и 4K продолжают работать, как и ожидалось, с обоими считывателями.

В этот момент я бы предположил, что вышли из строя карты, но, как это случилось с обеими картами одновременно, мне интересно, что-то я сделал.

Мое приложение могло так сильно сломать карты?

EDIT

После некоторой помощи и указаний от @MaartenBodewes я обнаружил, что карты, похоже, "заглушаются".

Я попытался прочитать карты из встроенного считывателя PN5180 в системе Linux, и получил немного дальше; Карта обнаружит, и я могу прочитать ATR, используя библиотеку NFC, поставляемую с PN5180 (которая, как я предполагаю, использует APDU под капотом?). Однако, как только я пытаюсь отправить APDU на карту, я получаю сообщение об ошибке, и затем карта снова становится необнаружимой в течение> 20 секунд.

Согласно Sun "Руководство разработчика Java Card Applet":

Есть несколько условий, которые приводят к блокировке карты (или отключено), предотвращая дальнейшее использование карты. Например, карта может блокироваться при обнаружении попытки нарушения безопасности карты (возможно, персональный идентификационный номер (ПИН) кода введено неправильно более пяти раз подряд). В этом случае, необходимо связаться с эмитентом (и, возможно, возвращено) для сброса ВМ из такого заблокированного состояния.

Другая информация, которую я нашел, в то время как Гуглинг предполагает, что приглушение карты может быть временным явлением, якобы для предотвращения атак грубой силой на карту. Это временное отключение звука является частью того, что, по моему мнению, я испытываю.

В Windows я подозреваю, что что-то вроде Smart Card Plug and Play пытается выдать APDU на карту, которая вызывает отключение звука, поэтому карта не появится в Windows (хотя отключение SCPNP, похоже, не помогает).

На данный момент я даже не могу связаться с GlobalPlatform, чтобы выбрать приложение, которое предшествует выполнению какого-либо кода моего приложения.

Я делал довольно много итераций, загружая приложение на карту.Версия приложения, загруженная непосредственно перед сбоем, работала, и следующая итерация установила ОК, но GP не смог пометить его как значение по умолчанию, и после этого он так и не был выполнен.На второй карточке, где возникла эта проблема, никогда не было предыдущего приложения, так что это не могло быть причиной ее возникновения.

Основываясь на некоторых комментариях @MichaelRoland, я немного прочел о разрыве карточки, иобратите внимание, что одна из вещей, упомянутых в контексте сбоя питания во время транзакций, - это метод arrayCopyNonAtomic, который я впервые представил в последней версии моего приложения.Однако я не верю, что в этом случае произошел сбой питания.

Несмотря на то, что эта версия приложения никогда не запускалась на карте, возможно, что простая установка CAP с этим методом могла бывызвать что-то подобное в GlobalPlatform?

EDIT 2

Я обнаружил ошибку, которую я сделал в методе install () для приложения, которое было загружено на карту,При просмотре у меня был массив размером 32768, который, как я понимаю (сейчас), будет обрезан до нуля.

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

Это приводит к вопросу: могло ли это приложение загрузиться,все же не удалось установить (что более или менее засвидетельствовано с GP), и, поскольку он еще не «установлен», каждый раз, когда я пытаюсь получить доступ к карте, он пытается установить приложение, не удается и вызывает нарушение безопасности?

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

...