Java Card APDU错误

时间:2016-04-09 00:30:56

标签: javacard apdu

我正在尝试将一个简单的APDU发送到Java卡(我在下面添加了applet的简单代码)。我已经在Eclipse模拟器中测试了applet但是当我想向applet发送APDU时它失败了以下错误:send_APDU() returns 0x80206E00 (6E00: Wrong CLA byte.) .Applet已安装到卡中(我使用GpShell执行此操作)。这是我用来发送APDU的脚本的完整输出。

D:\GPShell-1.4.4>GPShell.exe send_APDU.txt
establish_context
enable_trace
enable_timer
card_connect
command time: 15 ms
send_apdu -sc 0 -APDU b0000000010000
Command --> B0000000010000
Wrapped command --> B0000000010000
Response <-- 6E00
send_APDU() returns 0x80206E00 (6E00: Wrong CLA byte.)
command time: 860 ms
card_disconnect
command time: 31 ms
release_context
command time: 0 ms

以下是applet的完整代码。

public class Contor extends Applet {

private byte contor = 0;
private final static byte CLS=(byte)0xB0;
private final static byte INC=(byte)0x00;
private final static byte DEC=(byte)0x01;
private final static byte GET=(byte)0x02;
private final static byte INIT=(byte)0x03;

private Contor() {
}

public static void install(byte bArray[], short bOffset, byte bLength) throws ISOException {
    new Contor().register();
}

public void process(APDU apdu) throws ISOException {
    if(this.selectingApplet())return;
    byte[] buffer = apdu.getBuffer();
    if(buffer[ISO7816.OFFSET_CLA] != CLS)
        ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
    switch(buffer[ISO7816.OFFSET_INS])
    {
        case INC:contor++;  break;
        case DEC:contor--;  break;
        case GET:
            buffer[0] = contor;
            apdu.setOutgoingAndSend((short)0,(short)1);
            break;
        case INIT:
            apdu.setIncomingAndReceive();
            contor = buffer[ISO7816.OFFSET_CDATA];
            break;
    }

}

1 个答案:

答案 0 :(得分:2)

要与您的小程序进行通信,您必须先选择小程序。

要做到这一点,你有两个选择。第一个选项是在applet安装阶段使applet 默认选择,并在每次启动后隐式选择applet。第二个选项是在发送其他命令之前发送与您的applet AUD连接的SELECT APDU命令。

SELECT APDU Command = 00A40400 <AID Length> <AID>

另外,响应命令的实体不是你的applet,很可能是默认的Default-Selected applet,即Card Manager。