c++ - 智能卡获取响应返回状态 6D00

标签 c++ smartcard apdu smartcard-reader pcsc

我正在开发一个 C++ 应用程序(在 Windows 7 上),它与 PC/SC 读卡器连接以执行一些身份验证操作。此应用程序是另一个应用程序的子进程(我不知道这是否相关,但可能相关)。

我还有一个简单的独立测试应用程序,它执行我需要并成功执行的与智能卡的所有交互。但是,在将该实用程序的代码集成到我的主应用程序中时,我遇到了一些奇怪的行为。

特别是我发送到卡的第一个命令是 SELECT FILE 命令:

0x00 0xa4 0x04 0x00 ...

对此命令的响应与我的独立测试实用程序相同:

0x61 0x13

因为这表明有更多响应字节可用,所以我发送了一个 GET RESPONSE 命令:

0x00 0xc0 0x00 0x00 0x13

此命令失败,并出现指示指令无效的错误:

0x6d 0x00

但是我的测试实用程序(使用相同的读卡器和相同的卡运行)收到了成功的响应(例如以 ... 0x90 0x00 结尾)。然而,测试应用程序要求智能卡在启动时位于读卡器中(它是一个简单的应用程序,它会启动,执行所需的操作,然后存在)。如果卡在启动时位于读卡器中(就像我的测试读卡器一样),则不会发生我为实际应用描述的错误。

有没有人知道这个问题的根源是什么?该卡确实支持给定的指令代码,事实证明在某些情况下它会成功响应它。该卡是好的(它按预期响应初始的 SELECT FILE 命令)。我不认为这是一个权限问题(同样,它在启动时有效)。我的主要应用程序是多线程的,但所有卡片交互都发生在单个线程上。我很茫然。任何建议将不胜感激。

我注意到的另一件事是,在成功的场景中(例如,当应用程序启动时,读卡器中有卡),GET RESPONSE 需要大约 0.05 秒,而在不成功的场景中(例如,卡在应用程序启动)大约需要 2 秒。

最佳答案

您的体验可能与 Windows 7 智能卡即插即用有关。这种即插即用功能会在卡插入读卡器后立即自动向卡发送一大堆命令。如果您的应用此时也开始发送命令,这可能会导致您的命令与即插即用的命令交错。

因此,您可能希望在将卡插入读卡器后等待几秒钟,然后再开始发送命令,或者打开读卡器进行独占访问。

对于独占访问,为 SCardConnect 的参数 dwShareMode 使用值 SCARD_SHARE_EXCLUSIVE

关于c++ - 智能卡获取响应返回状态 6D00,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35582950/

相关文章:

android - 如何在 SIM 卡上的 Android 和 Java Card Applet 之间进行通信(有或没有 RIL 库)?

python - 在 python 中使用智能卡在网站上进行身份验证

c++ - CFStringCompareWithOptions 的奇怪行为

smartcard - 为什么真正的 POS 终端不使用 PSE(2PAY 或 1PAY)?

smartcard - DESFire 写入数据命令失败,出现 917E(长度错误)

Java 卡 : How to load SIM applet to real smart card?

android - 如何使用基于主机的卡仿真 (HCE) 将手机设置为 NFC 标签

具有冲突处理的 C++ 哈希表实现

c++ - std::transform 一元操作签名

c++ - 试图理解模板