javax.smartcardio: wie sendet man native befehle zur desfire karte?

Ich erstelle eine Java-Anwendung, die mit einer Mifare DESFire-Karte über ein kontaktloses PC / SC-Lesegerät und die javax.smartcardio-API kommuniziert. Ich schaffe es, reguläre ISO 7816-APDUs (CLA, INS, P1-P2, Lc, Befehlsdaten, Le) zu senden.

Ich habe weiter gelesenRidrix's Blog DESFire-Karten (mindestens die EV1-Version, die ich verwende) unterstützen sowohl APDUs als auchNative Befehle wobei die meisten Befehle nur 1 Byte lang sind.

Zum Beispiel die "Version abrufen" Befehl:

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

Ich habe diesen Befehl mit dem getestetPC / SC Diag Programm vonSpringCard (hier verfügbar) und ich bekomme eine korrekte Antwort.

Ich kann diesen Befehl jedoch nicht mit javax.smartcardio senden: Diese API wurde anscheinend für erstelltecht APDUs und lassen daher keine 1 Byte langen Befehle zu.

Folgendes habe ich getan:

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

Es gibt mir den folgenden Fehler:

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)

Ich habe die einzige (AFAIK) andere Möglichkeit ausprobiert, einen Befehl zu senden:

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

        ByteBuffer response = ByteBuffer.allocate(512);

        channel.transmit(command, response);

und erhalte einen ähnlichen Fehler:

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)

Kennen Sie eine Möglichkeit, einen solchen Befehl mit javax.smartcardio oder einem anderen Befehl zu senden?

Ich weiß, dass es möglich istwickeln diese befehle würde ich aber lieber mit den (einfacheren) nativen befehlen benutzen.

Vielen Dank.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage