我编写了一个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))字节为空。
答案 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
。从未签名的byte
到short
的正确广告投放是(short) (DataLength & 0xFF)
setOutgoingAndSend
。它简单得多。arrayCopyNonAtomic
而不是arrayCopy
。 arrayCopyNonAtomic
的效果要好得多。