首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SW1: 6e SW2:00卡选择错误

SW1: 6e SW2:00卡选择错误
EN

Stack Overflow用户
提问于 2018-02-05 22:09:49
回答 1查看 503关注 0票数 1

我正在尝试实现我的第一个Javacard示例,在通过运行CREF模拟器选择卡时,我得到了错误sw1: 6e sw2:00

我正在使用的工具是:

这是我的applet的定义:

代码语言:javascript
复制
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,我遵循以下步骤:

  1. 执行cref -o card.eeprom
  2. 上传applet:myPackage> Java Card Tools > Deploy
  3. 执行cref -i card.eeprom -o card.eeprom
  4. 通过运行create-Card.script初始化卡
  5. 执行cref -i card.eeprom -o card.eeprom
  6. 通过运行select-Card.script选择卡

脚本select-Card.script的自动生成内容是:

代码语言:javascript
复制
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 0x01Card小程序的辅助AID。

选择返回sw1: 6e sw2:00,根据scard.org,代码6e, 00意味着类不存在或不受支持,但是哪个类?怎样才能让人认出来?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-06 05:21:39

你得到0x6E00是因为下面提到的行..

代码语言:javascript
复制
if (buffer[ISO7816.OFFSET_CLA] != CLA_CARDAPPLET) {
       ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
   }

当您选择applet时,apdu会到达您的applet,它检查类字节,如果选择applet命令,它就是0x00

process(APDU apdu)方法的顶部添加下面提到的行。

代码语言:javascript
复制
if (selectingApplet()) {
      return;
}

当您发送选择applet命令时,这一行将作为SW返回0x9000

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48632319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档