JWn*_*nxp 2 java apdu smartcard
使用javax.smartcardio类进行智能卡编程,我遇到了持久性错误 - 当代码看起来很好时,从卡中获取6700(无效长度)和类似的错误代码.示例代码:
req = new CommandAPDU(0x00, 0xA4, 0x04, 0x00, aid, 0x00);
Run Code Online (Sandbox Code Playgroud)
这应该构造一个案例4 APDU.为什么卡片会像我丢失的东西一样回应?
Run Code Online (Sandbox Code Playgroud)req = new CommandAPDU(0x00, 0xA4, 0x04, 0x00, aid, 0x00);这应该构造一个案例4 APDU.为什么卡片会像我丢失的东西一样回应?
用aid, 0x100而不是aid, 0x00.
这是因为之间的混乱Ne和Le.Ne是可以返回到终端的最大字节数.Ne是一个没有具体表示的数字.Le然而,是以字节为单位的编码或表示Ne.
现在对于ISO/IEC 7816-4,有一个小技巧:Le在没有响应数据(RDATA)的ISO情况1或3命令的情况下不存在(没有字节).所以定义Le = 00为"无响应数据"是虚假的.相反,7816-4 Le = 00用来表示Ne = 256.类似地,Le = 0000(或Le = 000000)表示Ne = 65536,即2 ^ 16.双字节和三字节编码仅用于扩展长度APDU.
正如您在CommandAPDU构造函数中看到的那样,您必须指定Ne,而不是Le.因此,您指定的内容与没有响应数据的说法相同.因此APDU将不会被正确解释为ISO案例4并且命令将失败(在这种情况下正确地说,6700正是您应该期望的).
所以只需指定您期望的字节数.如果该值大于256,则需要扩展长度的APDU(或命令链接,但这本身就是一个主题).Ne < 0或者Ne > 64Ki当然不受支持.
请注意,许多协议描述(包括Java Card API)都有区别Ne和Le错误(顺便说一下,这已在Java Card API v3.0.5中修复).这有点奇怪,因为7816-4 有很多问题,但这不是其中之一.它的指定非常清楚.
| 归档时间: |
|
| 查看次数: |
702 次 |
| 最近记录: |