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

时间:2016-09-01 11:35:50

标签: protocols smartcard javacard apdu error-code

我编写了一个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));

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

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

1 个答案:

答案 0 :(得分:6)

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

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

如何接收它们?好吧,有一个名为GET RESPONSE的特殊APDU命令。每次获得61XX状态字时,都应该调用它。使用XX作为Le APDU

GET RESPONSE字节
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而不是arrayCopyarrayCopyNonAtomic的效果要好得多。