来自智能卡的响应状态字 0x61xx 是什么意思?

What is meaning of the response status word 0x61xx from a smart card?

我写了一个 Java 卡片小程序,它将一些数据保存到偏移量 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 由 Gemalto 制造)上测试时,我得到状态字 0x6180 作为响应。

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

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

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

如何接收?嗯,有一个特殊的 APDU 命令叫做 GET RESPONSE。每次获得 61XX 状态词时都应该调用它。使用 XX 作为 GET RESPONSE APDU

Le 字节
APDU -> 61 XX
00 C0 00 00 XX -> your data 90 00

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

  • Datalength 对比 DataLength?
  • 将您的输出数据复制到 0 而不是 ISO7816.OFFSET_CDATA
  • 为什么每次都把DataLength转换成short?是short吗?那就不要投了。是byte吗?那么你以错误的方式转换它,因为无符号字节值 > 0x80 将被转换为负值 short。从无符号 byteshort 的正确转换是 (short) (DataLength & 0xFF)
  • 尽可能使用 setOutgoingAndSend。就简单多了。
  • 当您不复制到持久数组时,请使用 arrayCopyNonAtomic 而不是 arrayCopyarrayCopyNonAtomic 的性能要好得多。