我正在开发一个 Java Card 应用程序,突然有两张卡同时停止工作。
这些卡是 J3H081 Java Cards(Java Card 3.0.4,Global Platform 2.2.1),我同时使用 ACR122U 和 ACR1222L 读卡器。
在测试时,我已经使用 GlobalPlatformPro 成功地将 CAP 文件写入卡,但在一个实例中,它在默认应用程序选择阶段返回了一个错误(不幸的是我不再有错误)。
我又尝试了几次写 CAP,然后换到另一张我必须写的卡(不幸的是,我现在只有两张),看看是否是卡问题;GlobalPlatformPro 也报告了该卡的相同问题。
我回到卡应用程序代码并进行了一些更改以查看是否有帮助,当我将应用程序重新加载到卡上时,卡根本没有响应(即 GlobalPlatformPro 报告不存在卡)。
然后我尝试了另一张卡并得到了相同的结果。
我尝试了两种不同的阅读器(如上所述),每个阅读器都在两台不同的机器上,并得到相同的结果。
在 ACR1222L 上,卡只是偶尔在 RF 上注册(即我听到哔声),但操作系统看不到卡。
放置在 ACR122U 上时,卡会发出哔哔声,LED 会变绿一会儿,然后又变回红色,操作系统无法看到卡。如果我将卡留在读卡器上,它会每 20 秒执行一次(好像它检测到卡然后失败)。如果我点击卡片,然后将其拿走,然后再次尝试点击它,它不会发出哔哔声,除非离开约 20 秒。
MIFARE 1K 和 4K 卡继续按预期与两种读卡器一起工作。
在这一点上,我会假设是卡片失败了,但由于两张卡片同时发生,我想知道这是否是我做过的事情。
我的应用程序会这么严重地破坏卡片吗?
编辑
在@MaartenBodewes 的一些帮助和指导下,我发现这些卡片似乎正在“静音”。
我尝试从 Linux 系统上的嵌入式 PN5180 读卡器读取卡片,并进一步了解;该卡将检测到,我可以使用 PN5180 随附的 NFC 库读取 ATR(我假设它在引擎盖下使用 APDU?)。但是,当我尝试向卡发送 APDU 时,我收到一个错误,然后卡在超过 20 秒内再次无法检测到。
根据 Sun“Java Card Applet 开发人员指南”:
有一些情况会导致卡被阻止(或静音),从而阻止进一步使用该卡。例如,当检测到试图破坏卡的安全性时(可能是连续五次以上错误地输入个人识别码 (PIN) 码),卡可能会被阻止。在这种情况下,需要联系发卡行(并且可能需要退回卡)以将 VM 从这种阻塞状态重置。
我在谷歌搜索时发现的其他信息表明,卡片静音可能是暂时的,表面上是为了阻止对卡片的暴力攻击。这种暂时的静音是我相信我正在经历的一部分。
在 Windows 上,我怀疑诸如智能卡即插即用之类的东西会尝试向卡发出 APDU,从而触发静音,这就是该卡不会出现在 Windows 中的原因(尽管禁用 SCPNP 似乎没有帮助)。
此时,我什至无法与 GlobalPlatform 通信以选择应用程序,这在我的任何应用程序代码运行之前。
我一直在进行多次迭代,将应用程序加载到卡上。在失败之前加载的应用程序版本正在运行,并且下一次迭代安装正常,但 GP 未能将其标记为默认值,此后从未执行过。第二张有这个问题的卡上从来没有以前的应用程序,所以不可能是那个,导致它。
根据@MichaelRoland 的一些评论,我阅读了一些关于卡片撕裂的内容,并注意到在交易期间电源故障的上下文中提到的一个事情是 arrayCopyNonAtomic 方法,这是我在我的应用程序的最后一个版本中引入的新方法。但是,我不认为此案涉及电源故障。
尽管该版本的应用程序从未在卡上运行过,但是否有可能简单地在其中安装带有此方法的 CAP 可能会在 GlobalPlatform 中触发类似的事情?
编辑 2
我发现我在加载到卡上的应用程序的 install() 方法中犯了一个错误。在审查时,我有一个大小为 32768 的数组,我(现在)理解它会被截断为零。
我原以为这会失败,但是,我确实在某处读到未处理的异常可能被视为可以锁定卡的安全违规行为。虽然卡似乎只是暂时锁定,所以我不确定它是否/如何被重新触发,或者它是否足以导致这个问题。
这导致了一个问题:该应用程序是否已加载但未能安装(这或多或少是我在 GP 上看到的),并且由于它尚未“安装”,每次我尝试访问它尝试安装的卡时应用程序失败并触发安全违规?
我已经尝试找到有关应用程序安装和初始化过程内部的更详细信息,但还没有多少运气。