javax.smartcardio: ¿cómo enviar comandos nativos a la tarjeta Desfire?

Estoy creando una aplicación java que se comunica con una tarjeta Mifare DESFire a través de un lector sin contacto PC / SC y la API javax.smartcardio. Me las arreglo para enviar APDU ISO 7816 regulares (CLA, INS, P1-P2, Lc, datos de comando, Le).

He leído enBlog de Ridrix que las tarjetas DESFire (al menos la versión EV1 que estoy usando) son compatibles con APDU yComandos nativos donde la mayoría de los comandos son solo 1 byte de largo.

Por ejemplo, el "Obtener versión"comando:

Command: 60
Response: af 04 01 01 00 02 18 05

Probé ese comando con elPC / SC Diag programa desdeSpringCard (disponible aquí) Y obtengo una respuesta correcta.

Pero no puedo enviar este comando con javax.smartcardio: esta API parece haber sido creada parareal APDU y, por lo tanto, no permite comandos de 1 byte de largo.

Aquí esta lo que hice:

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();
    }
}

Me da el siguiente error:

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)

Probé la única forma (AFAIK) de enviar un comando:

        ByteBuffer command = ByteBuffer.allocate(1);
        command.put((byte) 0x60);

        ByteBuffer response = ByteBuffer.allocate(512);

        channel.transmit(command, response);

y obtener un error similar:

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)

¿Conoces alguna forma de enviar este tipo de comando usando javax.smartcardio o alguna otra cosa?

Sé que es posibleenvolver estos comandos, pero preferiría usar los comandos nativos (más simples).

Gracias.

Respuestas a la pregunta(3)

Su respuesta a la pregunta