使用 javax.smartcardio 类进行智能卡编程时,我遇到了一个持续错误 - 当代码看起来正常时,从卡中返回 6700(无效长度)和类似的错误代码。示例代码:
req = new CommandAPDU(0x00, 0xA4, 0x04, 0x00, aid, 0x00);
这应该构造一个 case 4 APDU。为什么卡的 react 就像我遗漏了什么一样?
最佳答案
req = new CommandAPDU(0x00, 0xA4, 0x04, 0x00, aid, 0x00);
This is supposed to construct a case 4 APDU. Why does the card respond as if I were missing something?
简短回答
使用aid, 0x100
而不是aid, 0x00
.
长答案(最好喝点咖啡):
这是因为 Ne
之间的混淆和Le
。 Ne
是可以返回到终端的最大字节数。 Ne
是一个没有具体表示的数字。 Le
然而 Ne
的编码或以字节为单位的表示 .
现在对于 ISO/IEC 7816-4 有一个小技巧:Le
如果 ISO 情况 1 或 3 命令没有响应数据 (RDATA),则不存在(无字节)。所以定义Le = 00
表示“无响应数据”是虚假的。相反,7816-4 使用 Le = 00
意思是Ne = 256
。同样,Le = 0000
(或 Le = 000000
)意味着 Ne = 65536
,即 2^16。双字节和三字节编码仅用于扩展长度的 APDU。
正如您在 CommandAPDU
constructor 中看到的那样但是你必须指定 Ne
,不是Le
。因此,您指定的内容与表示没有响应数据相同。因此,APDU 将不会被正确解释为 ISO 情况 4,并且命令将失败(在本例中,6700
正是您所期望的)。
因此只需指定您期望的字节数即可。如果该值大于 256,则需要扩展长度的 APDU(或命令链,但这本身就是一个主题)。 Ne < 0
或Ne > 64Ki
当然不支持。
请注意,许多协议(protocol)描述包括 Java Card API 都区分了 Ne
和Le
错误(顺便说一句,这已在 the Java Card API v3.0.5 中修复)。这有点奇怪,因为 7816-4 有很多很多问题,但这不是其中之一。已经说的很清楚了。
关于javax.smartcardio 案例 4 APDU 消失 - 6700 响应 - 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31052297/