我是 Java Card 开发的新手,所以我的陈述可能不正确,但我至少尝试过进行研究。
我正在尝试使用自定义程序将小程序安装到我的智能卡上,该程序使用 WinSCard 进行 APDU 通信(SCardTransmit 函数)。该程序成功地为我使用的前一张卡(JavaCOS A22)安装小程序,但在我的新卡(NXP J3H145)上安装小程序失败。错误发生在 INITIALIZE UPDATE 命令中,该命令返回错误代码 67 00 或“长度错误”。
顺序如下:
这些命令之前没有任何命令。
现在,“错误的长度”听起来可能是在谈论 Lc 或 Le,您可能会注意到我的两个命令中都不存在它们。
Lc 我已经三重检查是否正确。它的值直接使用作为数据发送的字节数组的长度来设置。
Le 我尝试在 APDU 的数据字段(我理解它应该去的地方)附加几个不同的值:00(如 GlobalPlatform 卡规范 2.2.1 所说,它应该是(E.5.1.2)), 20(十进制32,根据SCP03规范(7.1.1.6)的INITIALIZE UPDATE响应的最大长度(以字节为单位))和FF(最大值),但错误消息仍然相同(67 00,“长度错误” ”)。
我也碰巧有另一张新卡,所以我也测试了它,它的行为方式是一样的。
我还尝试发送两次 SELECT 命令,看看第二个 APDU 是否总是失败(我听说有时会发生这种情况),但它成功了,而之后的 INITIALIZE UPDATE 命令仍然以同样的方式不成功。
我还发送了不同长度的主机质询,以防质询不应该是 GlobalPlatform 卡规范指定的 8 个字节。我尝试的长度是 16、32、64、4、6、7、9、10 和 12,但它们都导致了相同的“长度错误”错误。
希望对此有某种答案。我已经从事这个工作有一段时间了。谢谢您的宝贵时间。
我设法弄清楚了!事实证明,缺少 Le 字节确实是问题所在,但我尝试错误地添加了它。我以这样的方式添加它,使其包含在赋予 Lc 的长度中,这意味着 Lc 成为错误值和 67 00 背后的新原因,我错误地认为这仍然是由同一问题引起的。
对于“没有”Le 的 SELECT 命令,它似乎这样做是因为它将我的 Lc(值 00)读取为 Le,因为它假设没有 Lc,因为数据字段为空。
在弄清楚这一点后,我确实遇到了另一个问题,但它似乎与此无关,所以我现在将关闭它,并在需要时提出另一个问题。感谢大家的关注和耐心。