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 эти команды, но я бы предпочел использовать (более простые) собственные команды.

Благодарю.

Ответы на вопрос(3)

Ваш ответ на вопрос