2017-05-29 21 views
0

我希望从不同供应商,不同使用情况和不同APDU的一堆智能卡中读取一些基本信息。 例如:国家鉴定智能卡,EMV(支付),手机SIM,javacard等...使用不同的SC系列进行智能卡探测:清除SC状态的命令

我写了一个Java应用程序。 让我打电话给SC家庭A B C D E,并用同样的名字命名5个子程序,每个子程序都有正确的APDU来读取SC的一个特定家庭的基本信息。

不幸的是,我发布例程的顺序偏向于成功的结果。

实施例:用子例程顺序ABCDE,我可以读取类型ABCD,不E.的SC

如果我改变执行顺序EABCD,我可以改为E但现在我失败,类型C的SC

我明白了:有些SC放弃外来APDU ......其他SC“挂起”。

是否有清除智能卡(和读卡器)状态的基本命令?

所以子程序的执行顺序不会改变输出吗?

A复位B复位C复位D复位等...

是ATR?每种类型的SC都是强制性的吗?

+0

这不应该发生。你使用哪种读卡器?你用不同的读卡器观察到了同样的行为吗? – arminb

+0

是的,两种不同的读卡器。不考虑具体的测试:这是重置读卡器和卡状态的通用方法? – Massimo

回答

1

您可以使用Card.disconnect()方法重置卡(当心为this)。

但是(恕我直言)最好的方法是使用卡片ATR(如Card.getATR()给出的)猜测正确的卡片族(如果可能的话)。这种方式也快得多。我使用这种方法进行处理几个不同的非接触式卡产品的演示,并且工作得非常好。


一些额外的(随机)注意事项:

所有家庭的文档
  • 研究 - 绝对必须有这种行为的理由。尝试跳过一些子例程和/或它们的APDU命令来固定它。

  • 另外,一些APDU在偶然发送时可能会导致问题(例如锁定的密码或锁定的验证尝试)。你应该知道你在做什么。

  • 大多数产品系列都有一些可靠的检测方法 - 如果您有它,请参阅文档。

  • 如果之前调用的子例程使用SELECT更改选定的应用程序/文件并成功保持选中状态。考虑在每个子程序的开始处使用明确的SELECT(例如,选择预期的AID或主文件)。

  • DESFire卡在接收到非本地命令APDU(这可能不是您的情况,因为您通常在使用javax.smartcardio时使用ISO wrap命令)时会离开本机模式并进入包装模式。

祝你好运!

1

您描述的行为听起来很奇怪,因为智能卡读卡器不应该在不同的智能卡之间保持状态。

但是,我不知道任何通用命令来重新启动智能卡读卡器。例如HID OMNIKEY阅读器,您可以使用专有的APDU FF 70 07 6B 08 A2 06 A1 04 A9 02 83 00 00(请参阅here [7.6.3])重新启动,尽管本指南指出它适用于OMNIKEY 5022阅读器,但它适用于更多OMNIKEY阅读器)。所以对于你的读者,你将不得不在互联网上研究类似的专有APDU。

请记住,阅读器重新启动也很可能会导致USB阅读器重新枚举。