使用不同SC系列探测智能卡:清除SC状态的命令
我希望从不同供应商,不同用途,不同APDU的一堆智能卡中读取一些基本信息。 例如:国家识别智能卡,EMV(支付),手机SIM,javacard等……
我写了一个Java应用程序。 让我用SC系列ABCDE和相同名称调用5个子程序,每个子程序都有正确的APDU来读取一个特定SC系列的基本信息。
不幸的是,我发布例程的顺序会影响成功的结果。
示例:使用子程序ABCDE,我可以读取ABCD类型的SC,而不是E.
如果我将执行顺序更改为EABCD,我可以读取E但现在我的C类型的SC失败了。
我理解:一些SC丢弃外国APDU ……其他SC“挂起”。
是否有基本命令来清理智能卡(和读卡器)的状态?
那么子程序的执行顺序不会改变输出?
复位B复位C复位D复位等…
是ATR吗? 它对每种SC都是强制性的吗?
您可以使用Card.disconnect()方法重置卡(请注意这一点 )。
但是(恕我直言)最好的方法是使用卡ATR(由Card.getATR()给出)来猜测正确的卡片系列(如果可能的话)。 这种方式也快得多。 我使用这种方法处理几种不同的非接触式卡产品的演示,并且它运行良好。
一些额外的(随机)笔记:
-
研究所有家庭的文件 – 肯定必须有这种行为的原因。 尝试跳过一些子程序和/或它们的APDU命令来固定它。
-
此外,一些APDU可能在意外发送时导致问题(例如,锁定的密码或锁定的认证尝试)。 你应该知道你在做什么。
-
大多数产品系列都有一些可靠的检测方法 – 如果有的话,请参阅文档。
-
如果任何先前调用的子例程使用
SELECT
来更改所选应用程序/文件并成功,则它将保持选中状态。 考虑在每个子例程的开头使用显式SELECT
(例如,选择预期的AID或主文件)。 -
DESFire卡离开本机模式并在接收到非本机命令APDU时进入包装模式(这可能与您使用javax.smartcardio时通常的ISO包装命令不同)。
祝你好运!
您描述的行为听起来很奇怪,因为智能卡读卡器不应该在不同的智能卡之间保持状态。
但是,我不知道重启智能卡读卡器的任何通用命令。 例如HID OMNIKEY
阅读器,您可以使用专有APDU FF 70 07 6B 08 A2 06 A1 04 A9 02 83 00 00
重新启动(参见此处 [7.6.3],虽然本指南说它适用于OMNIKEY 5022阅读器,但它适用于许多人更多OMNIKEY读者)。 因此,对于您的读者,您将不得不研究类似的专有APDU的互联网。
请记住,读取器重启也很可能会导致USB读取器重新枚举。