PC/SC 非接触リーダーと javax.smartcardio API を介して Mifare DESFire カードと通信する Java アプリケーションを作成しています。通常の ISO 7816 APDU (CLA、INS、P1-P2、Lc、コマンド データ、Le) を送信することができました。
Ridrix のブログで、DESFire カード (少なくとも私が使用している EV1 バージョン) は APDU とネイティブ コマンドの両方をサポートし、コマンドのほとんどが 1 バイト長しかないことを読みました。
たとえば、「バージョンの取得」コマンド:
Command: 60
Response: af 04 01 01 00 02 18 05
このコマンドを SpringCard のPC /SC Diagプログラム(ここから入手可能) でテストしたところ、正しい応答が得られました。
しかし、javax.smartcardio でこのコマンドを送信することはできません。この API は実際の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 などを使用してこの種のコマンドを送信する方法を知っていますか?
これらのコマンドをラップできることはわかっていますが、(より単純な) ネイティブ コマンドを使用することをお勧めします。
ありがとう。