动态检测所需的智能卡协议(T0或T1)并在C#中更改为它

问题描述 投票:0回答:1

情况:

我有一个 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)。

已尝试过的:

身份验证过程实际上是这样中断的:

  • 服务器请求卡的 ATR
  • App提供ATR;
  • 服务器发送APDU;
  • App发送APDU到SCard,接收响应并将该响应转发到服务器;
  • ....以上成功发生多次....
  • 服务器发送APDU;
  • App发送APDU到SCard并收到6700状态(长度不正确);

经过大量谷歌搜索后,我发现一些开发人员在收到 6700 时将 APDU 缓冲区长度扩展一(空字节)。这就是我尝试过的。然后结果变成了6982(安全状态不满足)。

c# smartcard smartcard-reader winscard
1个回答
0
投票

我不知道如何使用您链接到的包装器,但您想访问

dwPreferredProtocols
pdwActiveProtocol
SCardConnect
参数,请参阅 here。包装器 API 在here导入它。如果您强制
dwPreferredProtocols
成为您想要使用的单一协议,那么您应该已准备就绪。

© www.soinside.com 2019 - 2024. All rights reserved.