Команда APDU возвращает 6985 (условия использования не выполнены) в результате - PullRequest
0 голосов
/ 13 ноября 2018

Я работаю над чтением смарт-карты на 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 Ответ

0 голосов
/ 30 ноября 2018
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   | DATA | Le   |
| 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   | DATA      | Le   |
| 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   | DATA      | Le   |
| 0x00 | 0xA4 | 0x00 | 0x0C | 0x02 | 0x00 0x02 | ---  |
+------+------+------+------+------+-----------+------+
...