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