Команда APDU возвращает 6985 (условия использования не выполнены) в результате
Я работаю над чтением смарт-карты на Java. Когда я выполняю следующий код, указанный ниже, карта возвращает 6985 (Условия использования не выполнены).
TerminalFactory factory = TerminalFactory.getDefault();
List<CardTerminal> terminals = factory.terminals().list();
System.out.println("Terminals: " + terminals);
if (terminals != null && !terminals.isEmpty()) {
// Use the first terminal
CardTerminal terminal = terminals.get(0);
// Connect with the card
Card card = terminal.connect("*");
System.out.println("card: " + card);
CardChannel channel = card.getBasicChannel();
CommandAPDU commandAPDU = new CommandAPDU(0x00, 0xA4, 0x00, 0x0C,
new byte[]{0002},0,0x01);
ResponseAPDU responseCheck = channel.transmit(commandApdu);
System.out.println(responseCheck.getSW1()+":"+responseCheck.getSW2()+":"+
commandApdu.toString());
Параметры, предоставляемые клиентом:
- CLA = 00
- INS = A4
- P1 = 00
- P2 = 0C
- LC = 02
- Данные = XXXX (Переданные здесь данные - это Идентификатор файла), поскольку я хочу выбрать файл EF, поэтому EFID для файла, заданного клиентом, составляет 0002
1 ответ
CommandAPDU commandAPDU = new CommandAPDU(0x00, 0xA4, 0x00, 0x0C, new byte[]{0002},0,0x01);
не будет делать то, что вы ожидаете.
new byte[]{0002}
даст вам байтовый массив с одним байтом значения 2. Кроме того, ,0,0x01);
(последние два параметра) заставит конструктор выбрать только один байт из массива DATA. Так что ваш APDU будет выглядеть так:
+ ------ + ------ + ------ + ------ + ------ + ------ + ------+ | CLA | INS | P1 | P2 | Lc | ДАННЫЕ | Ле | | 0x00 | 0xA4 | 0x00 | 0x0C | 0x01 | 0x02 | --- | +------+------+------+------+------+------+------+
Это, вероятно, не то, что вы ожидали. Ты хотел new byte[]{0, 2}
вместо? С помощью
CommandAPDU commandAPDU = new CommandAPDU(0x00, 0xA4, 0x00, 0x0C, new byte[]{0, 2}, 256)
приведет к следующему APDU (обратите внимание, что Le присутствует и установлен в 0 (Ne = 256); Lc автоматически выводится из размера массива DATA):
+ ------ + ------ + ------ + ------ + ------ + ----------- + - ---- + | CLA | INS | P1 | P2 | Lc | ДАННЫЕ | Ле | | 0x00 | 0xA4 | 0x00 | 0x0C | 0x02 | 0x00 0x02 | 0x00 | +------+------+------+------+------+-----------+----- +
Или используя
CommandAPDU commandAPDU = new CommandAPDU(0x00, 0xA4, 0x00, 0x0C, new byte[]{0, 2})
приведет к следующему APDU (обратите внимание, что Le отсутствует (Ne = 0); Lc автоматически выводится из размера массива DATA):
+ ------ + ------ + ------ + ------ + ------ + ----------- + - ---- + | CLA | INS | P1 | P2 | Lc | ДАННЫЕ | Ле | | 0x00 | 0xA4 | 0x00 | 0x0C | 0x02 | 0x00 0x02 | --- | +------+------+------+------+------+-----------+----- +