javax.smartcardio 案例 4 APDU 消失 - 6700 响应 - 警告
javax.smartcardio case 4 APDU vanishing - 6700 response - warning
使用 javax.smartcardio 类 进行智能卡编程时,我遇到了一个持续性错误 - 当代码看起来正常时,从卡中返回 6700(无效长度)和类似的错误代码。示例代码:
req = new CommandAPDU(0x00, 0xA4, 0x04, 0x00, aid, 0x00);
这应该构建案例 4 APDU。为什么卡片的反应好像我遗漏了什么?
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 有一个小技巧:在没有响应数据 (RDATA) 的 ISO case 1 或 3 命令的情况下 Le
不存在(无字节)。因此,将 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
当然不支持。
请注意,许多协议描述 包括 Java 卡 API 区分 Ne
和 Le
是错误的(顺便说一下,这已在 the Java Card API v3.0.5 中修复)。这有点奇怪,因为 7816-4 有很多 many 问题,但这不是其中之一。写的很清楚了。
使用 javax.smartcardio 类 进行智能卡编程时,我遇到了一个持续性错误 - 当代码看起来正常时,从卡中返回 6700(无效长度)和类似的错误代码。示例代码:
req = new CommandAPDU(0x00, 0xA4, 0x04, 0x00, aid, 0x00);
这应该构建案例 4 APDU。为什么卡片的反应好像我遗漏了什么?
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 有一个小技巧:在没有响应数据 (RDATA) 的 ISO case 1 或 3 命令的情况下 Le
不存在(无字节)。因此,将 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
当然不支持。
请注意,许多协议描述 包括 Java 卡 API 区分 Ne
和 Le
是错误的(顺便说一下,这已在 the Java Card API v3.0.5 中修复)。这有点奇怪,因为 7816-4 有很多 many 问题,但这不是其中之一。写的很清楚了。