Ошибка Javacard APDU, если размер буфера >7

Я пытаюсь установить буфер CommandAPDU с массивом байтов. Однако, если длина > 7, выдается следующая ошибка:

Исключение в потоке «основной» java.lang.IllegalArgumentException: недопустимый APDU: длина = 8, b1 = 1 в javax.smartcardio.CommandAPDU.parse(CommandAPDU.java:318) в javax.smartcardio.CommandAPDU.(CommandAPDU.java:98 ) в терминале.Main.main(Main.java:78)

Мой код:

byte terminal = 0x00;
byte instruction = 0x01;
byte [] msg = {0x01,0x00,0x01,0x00};
byte [] fullmsg = new byte[msg.length + 4];
System.arraycopy(new byte []{terminal}, 0, fullmsg, 0, 1);
System.arraycopy(new byte [] {instruction}, 0, fullmsg, 1, 1);
System.arraycopy(new byte [] {0,0}, 0, fullmsg, 2, 2);
System.arraycopy(msg, 0, fullmsg, 4, msg.length);
CommandAPDU cmdapdu = new CommandAPDU(fullmsg);

Кто-нибудь может мне помочь?


person Cees Mandjes    schedule 02.07.2018    source источник
comment
Этот код плохо читается. vlp уже опубликовал идеальный ответ для этого, но если вы когда-нибудь напишете такой код, то 1. используйте переменную offset++ или += 2) 2. используйте константы для определенных значений байтов (также для использования в ответе vlp) и 3. пожалуйста напишите комментарий о том, что делает строка кода, потому что в настоящее время непросто извлечь какой-либо смысл из кода. И код не удался, потому что вы забыли записать пятый байт Lc, который кодирует длину данных команды, известный как Nc.   -  person Maarten Bodewes    schedule 04.07.2018
comment
Да, и байт перед байтом INStruction называется байтом CLAss, а не байтом terminal.   -  person Maarten Bodewes    schedule 04.07.2018


Ответы (1)


Рассмотрите возможность использования CommandAPDU(int cla, int ins, int p1, int p2, byte[] data) (если вы не ожидаете никаких данных в ответ от карты -- т. е. команда соответствует стандарту ISO-7816, случай 3) или CommandAPDU(int cla, int ins, int p1, int p2, byte[] data, int ne) ( если вы ожидаете, что какие-то данные будут возвращены с карты, т. е. команда — это случай ISO-7816 4), чтобы создать ваш объект CommandAPDU.

Дополнительные сведения о форматах командных APDU см. в ISO 7816-3, раздел 12.1 "Единицы данных прикладного протокола" (частично доступны здесь).

E.g.:

CommandAPDU cmdapdu = new CommandAPDU(terminal, instruction, 0, 0, msg);

или (не стесняйтесь заменить 256 любой другой ожидаемой длиной данных ответа):

CommandAPDU cmdapdu = new CommandAPDU(terminal, instruction, 0, 0, msg, 256);

Удачи!

person vlp    schedule 02.07.2018