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

Ftm*_*Ftm 3 protocols error-code apdu smartcard javacard

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

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));
Run Code Online (Sandbox Code Playgroud)

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

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

voj*_*jta 6

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

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

怎么收到它们?好吧,有一个特殊的APDU命令叫GET RESPONSE.每次获得61XX状态字时都应该调用它.使用XXLe您的字节GET RESPONSEAPDU

APDU -> 61 XX
00 C0 00 00 XX -> your data 90 00
Run Code Online (Sandbox Code Playgroud)

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

  • Datalengthvs DataLength
  • 将输出数据复制到0而不是ISO7816.OFFSET_CDATA
  • 为什么你投DataLengthshort每次?是short吗?那时候不要施放.是byte吗?然后你以错误的方式抛出它,因为无符号字节值> 0x80将被强制转换为负数short.从一个无符号的正确施放byteshortIS(short) (DataLength & 0xFF)
  • setOutgoingAndSend尽可能使用.它简单得多.
  • 使用arrayCopyNonAtomic的,而不是arrayCopy只要您不将复制到一个持久阵列.表现arrayCopyNonAtomic要好得多.