GlobalPlatform Java 卡上的初始化更新收到 67 00(“错误长度”)

问题描述 投票:0回答:1

我是 Java Card 开发的新手,所以我的陈述可能不正确,但我至少尝试过进行研究。

我正在尝试使用自定义程序将小程序安装到我的智能卡上,该程序使用 WinSCard 进行 APDU 通信(SCardTransmit 函数)。该程序成功地为我使用的前一张卡(JavaCOS A22)安装小程序,但在我的新卡(NXP J3H145)上安装小程序失败。错误发生在 INITIALIZE UPDATE 命令中,该命令返回错误代码 67 00 或“长度错误”。

顺序如下:

  1. 我使用 SELECT 命令选择卡管理器。 APDU: (CLA) 00 (INS) A4 (P1) 04 (P2) 00 (Lc) 00。(注意:我知道数据字段为空而不是指定 AID,但由于某种原因,这似乎能够默认选择卡管理器(响应中突出显示正确的 AID),同时指定卡管理器会特别导致代码为 90 00 但没有数据的奇怪响应。)
  2. 我收到卡的回复,表明已选择卡管理员。 APDU:(数据)6F 10 84 08 A0 00 00 01 51 00 00 00 A5 04 9F 65 01 FF (SW1) 90 (SW2) 00.
  3. 我向卡发送初始化更新命令。主机质询是随机生成的,长度为 8 个字节。 APDU:(CLA)80(INS)50(PI)00(P2)00(Lc)08(数据)FE 6E CE 4A 85 55 C3 DE。
  4. 我收到卡的响应,这是一个错误。 APDU:(SW1)67(SW2)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,但它们都导致了相同的“长度错误”错误。

希望对此有某种答案。我已经从事这个工作有一段时间了。谢谢您的宝贵时间。

smartcard javacard apdu error-code globalplatform
1个回答
0
投票

我设法弄清楚了!事实证明,缺少 Le 字节确实是问题所在,但我尝试错误地添加了它。我以这样的方式添加它,使其包含在赋予 Lc 的长度中,这意味着 Lc 成为错误值和 67 00 背后的新原因,我错误地认为这仍然是由同一问题引起的。

对于“没有”Le 的 SELECT 命令,它似乎这样做是因为它将我的 Lc(值 00)读取为 Le,因为它假设没有 Lc,因为数据字段为空。

在弄清楚这一点后,我确实遇到了另一个问题,但它似乎与此无关,所以我现在将关闭它,并在需要时提出另一个问题。感谢大家的关注和耐心。

© www.soinside.com 2019 - 2024. All rights reserved.