在c#中使用WinSCard API读/写SLE4442存储卡

Mar*_*rko 14 c#

一些背景资料:

为了读/写SLE4442存储卡,我的应用程序目前正在使用Omnikey Cardman 3021 USB读卡器,一个Sumbsembly智能卡API(外部dll),能够包装CT-API调用(指向omnikey的dll),这样我就可以在我的c#app中读/写存储卡.这里唯一的问题是Omnikey只提供了32位的CT-API.我问他们是否要生产64位版本,但他们不能打扰.

现在的情况:

为了使我的应用程序具有64位功能,我必须使用Windows WinSCard API重写它.这里的问题是网上没有具体的例子如何做到这一点.获取工作的APDU命令几乎是不可能的,但我已经设法获得了两个略有不同的版本.几个月来我用谷歌搜索了一百遍,并且我已经设法吞噬了一起,我终于可以阅读SLE4442存储卡了.但是对于我的生活,我无法写作.

代码:

我不打算将整个代码发布到第一篇文章中(如果需要,我可以稍后再做,或提供源代码的链接).但我将概述基本步骤.

1)SCardEstablishContext

2)通过SCardListReaders获取读者姓名

3)SCardConnect

4)用SCardTransmit和APDU新字节[] {0xFF,0xB0,0,0,0}读取整个存储器;

5)用SCardTransmit验证引脚和APDU新字节[] {0xFF,0x20,0,0,3,0,0FF,0xFF,0xFF}; (注意,这确实返回0x90; 0x00作为响应,这意味着验证应该是成功的)

6)尝试用ScardTransmit和APDU写新的byte [] {0xFF,0xD6,0,0,50,1}; (尝试在内存位置50写入值1) - 我也尝试使用APDU,第一个参数是0x00和/或第二个字节是0xD0.响应从未是0x90; 0x00因此我假设在写入期间出现错误,但我无法找到返回的错误代码的任何含义.

可能的原因:

因为我可以使用WinSCard API读取存储卡,所以必须也可以写入一个(侧面注释 - 我尝试写入的存储卡处于工作状态,我没有将它们锁定未能验证PIN码3次).

1)也许写APDU命令是错误的.可能是指令字节(第二个字节)不正确,或者存储器位置使用某种扩展编码方案.

2)也许验证命令实际上没有验证.因为在命令本身很好,这就是为什么返回0x90,但我必须先调用或设置一些东西.

3)只是预感,但我认为这是真正的罪魁祸首.在谷歌搜索时,我确实发现一些模糊的引用,必须使用参数IOCTL_SMARTCARD_SET_CARD_TYPE调用SCardControl方法并将卡类型设置为SLE4442.但是在任何地方都没有任何工作示例,我的试错法测试导致了失败.我得到"无法正确解释一个或多个提供的参数." 还有一些其他错误信息,不记得它们都是什么.假设我从谷歌代码中复制粘贴的代码具有错误代码的正确描述.

我需要的:

我需要的是有人发布或指导我使用WinSCard API读取/写入SLE4442的c#中具有完整+工作代码的站点,它必须在32位和64位环境中工作.代码不一定是万无一失的 - 例如.很好地处理每个可能的错误情况.我应该能够自己做到这一点.但如果是(包括APDU命令结果描述 - 例如.0x90; 0x00成功,但0x6B; 0x4D是...等......)则更好.

小智 4

在您的示例中,用于写入卡的 APDU 应该是:

FF D6 00 50 01 01
Run Code Online (Sandbox Code Playgroud)