Quick Start Guide: Using in CLI mode

Лучший способ начать использовать 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