SW1: 6e SW2:00 选择卡时出错
SW1: 6e SW2:00 error on selecting card
我正在尝试实现我的第一个 Javacard 小程序示例,并且在通过 运行 CREF 模拟器选择卡时,我收到错误 sw1: 6e sw2:00
我正在使用的工具是:
- Eclipse
- JDK 7
- JCDK 2.2.2
- Eclipse JCDE
这是我的小程序的定义:
public class Card extends Applet {
/******************** Constants ************************/
public static final byte CLA_CARDAPPLET = (byte) 0xB0;
public static final byte INS_INCREMENT_COUNTER = 0x00;
public static final byte INS_DECREMENT_COUNTER = 0x01;
public static final byte INS_CHECK_COUNTER = 0x02;
public static final byte INS_INITIALIZE_COUNTER = 0x03;
/*********************** Variables ***************************/
private byte counter;
/************ Constructor **************/
private Card() {
counter = 0;
}
public static void install(byte bArray[], short bOffset, byte bLength) throws ISOException {
new Card().register();
}
public void process(APDU apdu) throws ISOException {
byte[] buffer = apdu.getBuffer();
if (buffer[ISO7816.OFFSET_CLA] != CLA_CARDAPPLET) {
ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
}
switch (buffer[ISO7816.OFFSET_INS]) {
case INS_INCREMENT_COUNTER:
counter++;
break;
case INS_DECREMENT_COUNTER:
counter--;
break;
case INS_CHECK_COUNTER:
buffer[0] = counter;
apdu.setOutgoingAndSend((short) 0, (short) 1);
break;
case INS_INITIALIZE_COUNTER:
apdu.setIncomingAndReceive();
counter = buffer[ISO7816.OFFSET_CDATA];
break;
default:
break;
}
}
}
为了模拟 javacard,我按照以下步骤操作:
- 执行
cref -o card.eeprom
- 上传小程序:
myPackage> Java Card Tools > Deploy
- 执行
cref -i card.eeprom -o card.eeprom
- 通过运行
create-Card.script
初始化卡片
- 执行
cref -i card.eeprom -o card.eeprom
- Select 卡片由 运行
select-Card.script
脚本select-Card.script
自动生成的内容是:
powerup;
// select Card applet
0x00 0xA4 0x04 0x00 0xb 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x00 0x01 0x7F;
powerdown;
其中0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x00 0x01
是Card
小程序的AID
选择returnssw1: 6e sw2:00
,根据scard.org,代码6e, 00
表示class不存在或不支持,但是哪个class?以及如何让它变得可识别?
你得到 0x6E00
因为下面提到的行..
if (buffer[ISO7816.OFFSET_CLA] != CLA_CARDAPPLET) {
ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
}
当您 select applet 时,apdu 到达您的 applet 并检查 class 字节,在 select applet 命令的情况下,它是 0x00
。
在 process(APDU apdu)
方法之上添加下面提到的行..
if (selectingApplet()) {
return;
}
当您发送 select applet 命令时,此行将 return 0x9000
作为 SW。
我正在尝试实现我的第一个 Javacard 小程序示例,并且在通过 运行 CREF 模拟器选择卡时,我收到错误 sw1: 6e sw2:00
我正在使用的工具是:
- Eclipse
- JDK 7
- JCDK 2.2.2
- Eclipse JCDE
这是我的小程序的定义:
public class Card extends Applet {
/******************** Constants ************************/
public static final byte CLA_CARDAPPLET = (byte) 0xB0;
public static final byte INS_INCREMENT_COUNTER = 0x00;
public static final byte INS_DECREMENT_COUNTER = 0x01;
public static final byte INS_CHECK_COUNTER = 0x02;
public static final byte INS_INITIALIZE_COUNTER = 0x03;
/*********************** Variables ***************************/
private byte counter;
/************ Constructor **************/
private Card() {
counter = 0;
}
public static void install(byte bArray[], short bOffset, byte bLength) throws ISOException {
new Card().register();
}
public void process(APDU apdu) throws ISOException {
byte[] buffer = apdu.getBuffer();
if (buffer[ISO7816.OFFSET_CLA] != CLA_CARDAPPLET) {
ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
}
switch (buffer[ISO7816.OFFSET_INS]) {
case INS_INCREMENT_COUNTER:
counter++;
break;
case INS_DECREMENT_COUNTER:
counter--;
break;
case INS_CHECK_COUNTER:
buffer[0] = counter;
apdu.setOutgoingAndSend((short) 0, (short) 1);
break;
case INS_INITIALIZE_COUNTER:
apdu.setIncomingAndReceive();
counter = buffer[ISO7816.OFFSET_CDATA];
break;
default:
break;
}
}
}
为了模拟 javacard,我按照以下步骤操作:
- 执行
cref -o card.eeprom
- 上传小程序:
myPackage> Java Card Tools > Deploy
- 执行
cref -i card.eeprom -o card.eeprom
- 通过运行
create-Card.script
初始化卡片
- 执行
cref -i card.eeprom -o card.eeprom
- Select 卡片由 运行
select-Card.script
脚本select-Card.script
自动生成的内容是:
powerup;
// select Card applet
0x00 0xA4 0x04 0x00 0xb 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x00 0x01 0x7F;
powerdown;
其中0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x00 0x01
是Card
小程序的AID
选择returnssw1: 6e sw2:00
,根据scard.org,代码6e, 00
表示class不存在或不支持,但是哪个class?以及如何让它变得可识别?
你得到 0x6E00
因为下面提到的行..
if (buffer[ISO7816.OFFSET_CLA] != CLA_CARDAPPLET) {
ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
}
当您 select applet 时,apdu 到达您的 applet 并检查 class 字节,在 select applet 命令的情况下,它是 0x00
。
在 process(APDU apdu)
方法之上添加下面提到的行..
if (selectingApplet()) {
return;
}
当您发送 select applet 命令时,此行将 return 0x9000
作为 SW。