首页 文章

智能卡的响应状态字0x61xx的含义是什么?

提问于
浏览
2

我编写了一个Java Card小程序,它将一些数据保存到偏移 ISO7816.OFFSET_CDATA 的APDU缓冲区中,并将这些字节作为响应发送 .

Util.arrayCopy(Input_Data, (short)0, buffer, (short) ISO7816.OFFSET_CDATA, (short)Datalength);
apdu.setOutgoing();
apdu.setOutgoingLength((short)(DataLength) );

apdu.sendBytesLong(buffer, ISO7816.OFFSET_CDATA, (short)(DataLength));

我在模拟器中测试了这个没有任何问题 . 但是当我在真正的智能卡(由金雅拓制造的Java Card v2.2.1)上测试时,我得到状态字 0x6180 作为响应 .

我的命令APDU是 00 40 00 00 80 Data ,其中数据长度为128个字节,因此缓冲区中有4个128字节,(260-(4 128))字节为空 .

1 回答

  • 5

    您的模拟器可能使用 T=1 传输协议,但您的真实卡不会 . 它使用 T=0 协议,这意味着它可以接收数据,也可以在单个APDU中发送数据 .

    状态字 0x6180 表示从卡接收 0x80 个字节 . 通常, 61XX 表示要接收 XX 个字节 .

    怎么收到它们?好吧,有一个名为 GET RESPONSE 的特殊APDU命令 . 每次收到 61XX 状态字时都应该调用它 . 使用 XX 作为 GET RESPONSE APDU的 Le 字节

    APDU -> 61 XX
    00 C0 00 00 XX -> your data 90 00
    

    关于您的代码的一些其他说明:

    • Datalength vs DataLength

    • 将输出数据复制到 0 而不是 ISO7816.OFFSET_CDATA

    • 为什么每次都将 DataLength 投射到 short ?是 short ?不要施放然后 . 是 byte ?然后你以错误的方式抛出它,因为无符号字节值 > 0x80 将被强制转换为负 short . 从无符号 byteshort 的正确转换是 (short) (DataLength & 0xFF)

    • 尽可能使用 setOutgoingAndSend . 它简单得多 .

    • 只要不复制到持久数组,就使用 arrayCopyNonAtomic 而不是 arrayCopy . arrayCopyNonAtomic 的表现要好得多 .

相关问题