Java卡APDU错误
Java Card APDU Error
我正在尝试将一个简单的 APDU 发送到 Java 卡(我在下面附上了小程序的简单代码)。我已经在 Eclipse 模拟器中测试了该小程序,但是当我想发送一个 APDU 时对于小程序,它失败并出现以下错误:send_APDU() returns 0x80206E00 (6E00: Wrong CLA byte.)
。小程序已经安装到卡中(我使用 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
这里是小程序的完整代码。
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;
}
}
为了与您的小程序进行通信,您必须先select您的小程序。
为此,您有两种选择。第一个选项是在小程序安装阶段使您的小程序 默认选择 并在每次启动后隐式 selected 小程序。第二个选项是在发送其他命令之前发送 SELECT
APDU 命令与您的小程序 AUD 连接。
SELECT APDU 命令=00A40400 <AID Length> <AID>
否则,响应您的命令的实体不是您的小程序,很可能是默认的默认选择小程序,即卡片管理器。
我正在尝试将一个简单的 APDU 发送到 Java 卡(我在下面附上了小程序的简单代码)。我已经在 Eclipse 模拟器中测试了该小程序,但是当我想发送一个 APDU 时对于小程序,它失败并出现以下错误:send_APDU() returns 0x80206E00 (6E00: Wrong CLA byte.)
。小程序已经安装到卡中(我使用 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
这里是小程序的完整代码。
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;
}
}
为了与您的小程序进行通信,您必须先select您的小程序。
为此,您有两种选择。第一个选项是在小程序安装阶段使您的小程序 默认选择 并在每次启动后隐式 selected 小程序。第二个选项是在发送其他命令之前发送 SELECT
APDU 命令与您的小程序 AUD 连接。
SELECT APDU 命令=00A40400 <AID Length> <AID>
否则,响应您的命令的实体不是您的小程序,很可能是默认的默认选择小程序,即卡片管理器。