【发布时间】:2016-06-05 14:37:33
【问题描述】:
我正在开发一个 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 即插即用有关,它会自动向您的卡发送一大堆命令,并可能导致您的命令与这些即插即用命令交错。
-
@MichaelRoland 是完全正确的。通过切换到获取卡的独占句柄(并对失败进行等待并重试),一切都开始正常工作。非常感谢!
标签: c++ smartcard apdu smartcard-reader pcsc