Можно ли выполнить команду APDU * внутри * Java Card Applet?
Мы знаем, что метод Applet.process() вызывает "между" запросом APDU и его ответом APDU, то есть он может считывать некоторый неподтвержденный APDU и отправлять некоторый исходящий в качестве ответа.
Но может ли апплет отправить свою собственную команду APDU и получить ответ? То есть:
public void process(APDU apdu)
{
...
APDU resp = SomeAPI.someMethod("00A40101FF...");
...
}
3 ответа
Но может ли апплет отправить свою собственную команду APDU и получить ответ?
Простой ответ - НЕТ, вы не можете отправить APDU для другого апплета, поскольку у вас нет доступа к диспетчеру команд. Но есть способ сделать это, читайте ниже.
public void process(APDU apdu) { ... APDU resp = SomeAPI.someMethod("00A40101FF..."); ... }
Ничего подобного не возможно в апплете Java-карты (до последней версии 3.0.5u), потому что здесь вы храните ссылку на объект APDU, который не может быть сохранен в объектах временных точек входа JCRE и его ссылка.
Теперь для достижения желаемой функциональности. Используйте совместно используемый объект интерфейса. Очевидно, вам нужно изменить целевой апплет (который вы хотите вызвать) здесь. Вызов апплета через разделяемый объект сделает переключение контекста для вас, и вы можете вернуться к своему апплету после него.
См. http://www.oracle.com/technetwork/java/javacard/specs-jsp-136430.html
Я предполагаю, что вы не собираетесь связываться с целевым апплетом через последовательный интерфейс, но ищите "выполнить ту же функциональность, что и при получении этого APDU".
У меня есть некоторые сомнения, существует ли такой интерфейс, и я не вижу варианта использования по этим причинам:
- В среде javacard апплеты являются автономными строительными блоками.
- Если вы намереваетесь звонить в одном и том же апплете, должны быть гораздо более удобные возможности.
- Если нацелен другой апплет: подразумеваемое переключение в сторону и назад просто не соответствует концепции APDU одного в настоящий момент выбранного апплета.