Как написать кросс-карточный апплет Java Card?
Обычно, когда мы пишем апплет, содержащий функцию, которую наша карта не поддерживает, встроенный верификатор предотвращает установку файла CAP.
Я хочу знать, есть ли способ написать апплет, который может быть установлен на всех картах, но возвращает уже определенную ошибку во время выполнения для тех карт, которые не поддерживают одну из своих функций при вызове этого метода.
Для большей ясности предположим, что мы знаем, что все карты поддерживают алгоритм криптографии DES, а некоторые карты также поддерживают AES в качестве дополнительного алгоритма. Теперь я хочу написать апплет, который шифрует 8-байтовые данные с помощью алгоритма AES, если этот алгоритм доступен, или с алгоритмом DES, если AES недоступен. Могу ли я сделать это?
Проблема в том, что я не могу установить апплет на те карты, которые не поддерживают AES.
1 ответ
Я думаю, что вы смешиваете две проблемы:
1. Поддержка алгоритма
Вы можете легко установить свой апплет, который использует AES, на карту без AES. Отсутствие AES вызовет исключения во время выполнения в тот момент, когда вы попытаетесь создать экземпляр криптографического объекта:
Cipher.getInstance(Cipher.ALG_AES_BLOCK_128_CBC_NOPAD, false);
или же
KeyBuilder.buildKey(KeyBuilder.TYPE_AES, KeyBuilder.LENGTH_AES_128);
и так далее... Обратите внимание, что исключение является экземпляром CryptoException
с CryptoException.NO_SUCH_ALGORITHM
в качестве кода причины (вывод getReason()
метод). Таким образом, ваш апплет может легко решить, поддерживает ли карта AES. Вы можете заключить одну из строк выше с помощью try-catch во время установки и при необходимости перейти на более базовый алгоритм:
Cipher cipher = null;
try {
//trying AES
cipher = Cipher.getInstance(Cipher.ALG_AES_BLOCK_128_CBC_NOPAD, false);
} catch (CryptoException e) {
if (e.getReason() == CryptoException.NO_SUCH_ALGORITHM) {
//AES missing, so trying DES instead
cipher = Cipher.getInstance(Cipher.ALG_DES_CBC_NOPAD, false);
}
}
Вы можете использовать аналогичный подход к хеш-функциям, сигнатурам и т. Д.
2. Библиотеки
Другая проблема, которая не может быть решена так легко, это зависимость от библиотеки. Если ваш апплет должен использовать какой-то собственный класс (как, например, com.nxp.id.jcopx.UtilX
поддерживается картами NXP), вы не сможете установить его на карты без определенной библиотеки. Единственный способ для вас - разделить проблемный код на два пакета и принять решение, какой пакет загрузить, основываясь на пакетах, уже имеющихся на карте.