智能卡获取响应 Returns 状态 6D00

Smart Card Get Response Returns Status 6D00

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

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

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

0x00 0xa4 0x04 0x00 ...

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

0x61 0x13

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

0x00 0xc0 0x00 0x00 0x13

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

0x6d 0x00

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

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

我注意到的另一件事是,在成功的情况下(例如,当应用程序启动时,卡在 reader 中)在不成功的情况下(例如,卡在应用程序启动后的某个时间插入)大约需要 2 秒。

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

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

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