У меня есть карта JavaCard, и я могу вызвать JCSystem.getAvailableMemory(MEMORY_TYPE_PERSISTENT) и вернуть ее из своего апплета, но мне нужно точное значение, если оно превышает 32767 байт.
Можно ли запросить у смарт-карты GlobalPlatform оставшуюся постоянную память?
Ответы (2)
Javacard с поддержкой GP 2.2 + ETSI
Если ваша карта поддерживает Global Platform 2.2 и ETSI, вы можете использовать команду GET DATA.
В разделе 11.3 спецификации карты GP 2.2 говорится, что
Tag ‘FF21’: Extended Card Resources Information available for Card Content Management, as defined in ETSI TS 102 226.
А в ETSI 102.226, раздел 8.2.1.7.2:
После успешного выполнения команды поле данных ответа GET DATA должно быть закодировано, как определено в GlobalPlatform [4]. Значение объекта закодированных данных TLV, упомянутого в опорных параметрах управления P1 и P2 командного сообщения, равно:
Length Description Value
1 Number of installed application tag '81'
1 Number of installed application length X
X Number of installed application
1 Free non volatile memory tag '82'
1 Free non volatile memory length Y
Y Free non volatile memory
1 Free volatile memory tag '83'
1 Free volatile memory length Z
Z Free volatile memory
Ответ этой команды не ограничен значением short
, потому что он использует формат TLV, что означает, что вы можете проверить свободную память, размер которой превышает 32767 байт.
Вообще нет возможности получить точное количество свободной памяти с карты с помощью стандартного Java Card API. Поскольку большинство карт Java не поддерживают даже целочисленные значения, максимальное значение, которое можно получить с помощью метода API, равно 32767 (верхняя граница короткого числа со знаком).
Если вам повезет, может быть какой-то проприетарный метод API от производителя карты/ОС. Я видел некоторые проприетарные API-интерфейсы карт NXP JCOP, но ни один из них не способен получить объем свободной памяти, если он превышает верхнюю границу короткого со знаком.