Лучший способ начать использовать jCardSim - написать тестовый APDU-скрипт и выполнить его.
Загрузка jCardSim
Скачайте jar-архив c jCardSim по ссылке: https://github.com/licel/jcardsim/raw/master/jcardsim-2.2.1-all.jar
Запуск симулятора jCardSim в консольном режиме
Для упрощения процесса разработки и отладки Java Card приложений, jCardSim умеет работать с class-файлами непосредственно, и вам не нужно конвертировать ваше приложение в cap-файл, для того чтобы выполнить его на симуляторе.
Симулятор можно запускать в консольном режиме, или использовать его API в своих программах или unit-тестах.
Подробнее об использовании API jCardSim во второй части Quick Start Guide: Simulator API.
Для запуска приложений и взаимодействия с ними через APDU-скрипты, необходимо использовать класс com.licel.jcardsim.utils.APDUScriptTool
.
Формат его запуска
java -cp jcardsim-2.2.1-all.jar com.licel.jcardsim.utils.APDUScriptTool <jcardsim.cfg> <apdu script> [out file]
jcardsim.cfg
- файл с настройками симулятора, в нем указывается информация о предустановленных на виртуальную Java Card апплетах. Он имеет следующий формат:
com.licel.jcardsim.card.applet.{index}.AID=<Applet AID>
com.licel.jcardsim.card.applet.{index}.Class=<Applet ClassName>
где {index} число от 0 до 10.
Внимание. Классы апплетов и их зависимости должны находиться в classpath при запуске симулятора.
В нашем случае, этот файл будет иметь следующий вид:
com.licel.jcardsim.card.applet.0.AID=010203040506070809
com.licel.jcardsim.card.applet.0.Class=com.licel.jcardsim.samples.HelloWorldApplet
<apdu script>
- файл с APDU-командами в формате C-APDU, совместим с форматом скриптов для apdutool из Java Card Development Kit.
C-APDUs завершаются символом (;). Для комментариев используются //.
APDU могут быть представлены десятичными или шестнадцатиричными символами, шестнадцатиричные символы должны начинаться с 0x. Одна C-APDU команда может занимать несколько строчек.
C-APDU команда имеет следующий формат:
<CLA> <INS> <P1> <P2> <LC> [<byte 0> <byte 1> ... <byte LC-1>] <LE> ;
где:
<CLA> :: ISO 7816-4 class byte.
<INS> :: ISO 7816-4 instruction byte.
<P1> :: ISO 7816-4 P1 parameter byte.
<P2> :: ISO 7816-4 P2 parameter byte.
<LC> :: ISO 7816-4 input byte count. 1 byte
<byte 0> ... <byte LC-1> :: input data bytes.
<LE> :: ISO 7816- 4 expected output length. 1 byte
В качестве примера Java Card Applet'a возьмем com.licel.jcardsim.samples.HelloWorld
. Этот простой апплет умеет обрабатывать следующие APDU команды:
- Ничего не делать
CLA=0x01 INS=0x02 P1=0x00 P2=0x00 LC=0x00
- Вернуть байты "Hello world !"
CLA=0x01 INS=0x01 P1=0x00 P2=0x00 LC=0x00
- Вернуть присланные данные (эхо)
CLA=0x01 INS=0x01 P1=0x01 P2=0x00 LC=<длина данных> DATA=<данные>
Напишем C-APDU скрипт для взаимодействия с апплетом:
// CREATE APPLET CMD
0x80 0xb8 0x00 0x00 0x10 0x9 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x8 0x09 0x05 0x00 0x00 0x02 0xF 0xF 0x7f;
// SELECT APPLET CMD
0x00 0xa4 0x00 0x00 0x09 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x8 0x09 0x2;
// TEST NOP
0x01 0x02 0x00 0x00 0x00 0x2;
// test hello world from card
0x01 0x01 0x00 0x00 0x00 0x0d;
// test echo
0x01 0x01 0x01 0x00 0x0d 0x48 0x65 0x6c 0x6c 0x6f 0x20 0x77 0x6f 0x72 0x6c 0x64 0x20 0x21 0x0d;
Сохраним конфиграцию jCardSim в файл jcardsim.cfg и C-APDU скрипт в helloworld.apdu и запустим cимулятор, если мы не укажем 3-параметр при запуске, результат работы напечатается на консоли:
java -cp jcardsim-2.2.1-all.jar com.licel.jcardsim.utils.APDUScriptTool jcardsim.cfg helloworld.apdu
Результат на консоли:
CLA: 80, INS: b8, P1: 00, P2: 00, Lc: 10, 09, 01, 02, 03, 04, 05, 06, 07, 08, 09, 05, 00, 00, 02, 0f, 0f, Le: 09, 01, 02, 03, 04, 05, 06, 07, 08, 09, SW1: 90, SW2: 00
CLA: 00, INS: a4, P1: 00, P2: 00, Lc: 09, 01, 02, 03, 04, 05, 06, 07, 08, 09, Le: 00, SW1: 90, SW2: 00
CLA: 01, INS: 02, P1: 00, P2: 00, Lc: 00, Le: 00, SW1: 90, SW2: 00
CLA: 01, INS: 01, P1: 00, P2: 00, Lc: 00, Le: 0d, 48, 65, 6c, 6c, 6f, 20, 77, 6f, 72, 6c, 64, 20, 21, SW1: 90, SW2: 00
CLA: 01, INS: 01, P1: 01, P2: 00, Lc: 0d, 48, 65, 6c, 6c, 6f, 20, 77, 6f, 72, 6c, 64, 20, 21, Le: 0d, 48, 65, 6c, 6c, 6f, 20, 77, 6f, 72, 6c, 64, 20, 21, SW1: 90, SW2: 00
Вывод результатов исполнения команд, тоже соответствует apdutool из Java Card Development Kit.
Следующая часть: Quick Start Guide: Simulator API