来自智能卡的响应状态字 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
。从无符号 byte
到 short
的正确转换是 (short) (DataLength & 0xFF)
- 尽可能使用
setOutgoingAndSend
。就简单多了。
- 当您不复制到持久数组时,请使用
arrayCopyNonAtomic
而不是 arrayCopy
。 arrayCopyNonAtomic
的性能要好得多。
我写了一个 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
。从无符号byte
到short
的正确转换是(short) (DataLength & 0xFF)
- 尽可能使用
setOutgoingAndSend
。就简单多了。 - 当您不复制到持久数组时,请使用
arrayCopyNonAtomic
而不是arrayCopy
。arrayCopyNonAtomic
的性能要好得多。