javax.smartcardio: как отправлять собственные команды на карту Desfire?
Я создаю Java-приложение, которое связывается с картой Mifare DESFire через бесконтактный ридер для ПК / SC и API javax.smartcardio. Мне удается отправлять обычные APDU ISO 7816 (CLA, INS, P1-P2, Lc, данные команд, Le).
Я читал дальшеБлог Ridrix что карты DESFire (по крайней мере, версия EV1, которую я использую) поддерживают как APDU, так иNative commands где большинство команд имеют длину только 1 байт.
Например, & quot;Get Version& Quot; команда:
Command: 60
Response: af 04 01 01 00 02 18 05
Я проверил эту команду сPC/SC Diag программа отSpringCard (доступно здесь) и я получаю правильный ответ.
Но я не могу отправить эту команду с javax.smartcardio: этот API, кажется, был создан дляreal APDU и, следовательно, не разрешает команды длиной 1 байт.
Вот что я сделал:
public static void main(String[] args){
TerminalFactory factory = TerminalFactory.getDefault();
CardTerminals terminalList = factory.terminals();
try {
CardTerminal ct = terminalList.list().get(0);
ct.waitForCardPresent(0);
Card card = ct.connect("*");
CardChannel channel = card.getBasicChannel();
byte[] command = { 0x60 };
channel.transmit(new CommandAPDU(command));
} catch (CardException e) {
e.printStackTrace();
}
}
Это дает мне следующую ошибку:
Exception in thread "main" java.lang.IllegalArgumentException: apdu must be at least 4 bytes long
at javax.smartcardio.CommandAPDU.parse(Unknown Source)
at javax.smartcardio.CommandAPDU.<init>(Unknown Source)
Я попробовал единственный (AFAIK) другой способ отправить команду:
ByteBuffer command = ByteBuffer.allocate(1);
command.put((byte) 0x60);
ByteBuffer response = ByteBuffer.allocate(512);
channel.transmit(command, response);
и получите похожую ошибку:
Exception in thread "main" java.lang.IllegalArgumentException: Command APDU must be at least 4 bytes long
at sun.security.smartcardio.ChannelImpl.checkManageChannel(Unknown Source)
at sun.security.smartcardio.ChannelImpl.doTransmit(Unknown Source)
at sun.security.smartcardio.ChannelImpl.transmit(Unknown Source)
Знаете ли вы какой-либо способ отправки такого рода команды с помощью javax.smartcardio или что-то еще?
Я знаю, что это возможноwrap эти команды, но я бы предпочел использовать (более простые) собственные команды.
Благодарю.