我有一个 C# 应用程序,它充当智能卡的通信器,用于身份验证。
基本上,智能卡身份验证发生在服务器上,服务器只需将 APDU 数据包发送到客户端计算机上运行的应用程序即可。该应用程序又通过
Winscard
API (SCardTransmit
) 将这些 APDU 数据包传输到读卡器,并将响应返回到服务器。
服务器向应用程序发送原始字节数组(实际上是完整的 APDU 命令),应用程序只需将该字节数组发送到
SCardTransmit
函数即可。
当卡和服务器都在同一协议上工作时,一切都会很好。但是,如果连接的卡采用
T1
协议,而特定服务器使用 T0
- 它最终会在身份验证过程中中断。不过,如果我手动将协议更改为正在使用的一台服务器,它会起作用。
现在的问题是,有多个服务器使用此应用程序,并且每个服务器可以决定使用不同的协议(
T0
或T1
)。
有没有办法纯粹从APDU数据包的内容动态检测所需的协议?如果是这样,是否还有一种方法,使用 Windows API 来动态更改卡所使用的协议?
附注为了使开发更容易,作为 Winscard API 的包装器,我使用 GemCard (https://github.com/orouit/SmartcardFramework/tree/master/Smartcard_API/GemCard)。
身份验证过程实际上是这样中断的:
经过大量谷歌搜索后,我发现一些开发人员在收到 6700 时将 APDU 缓冲区长度扩展一(空字节)。这就是我尝试过的。然后结果变成了6982(安全状态不满足)。