尝试使用VMWare Player虚拟机(Windows 8.1 AMD64)中的智能卡读卡器。该卡是美国政府发行的PIV卡,如相应的NIST标准所述。主机是Windows 7 AMD64。
我正在使用WinSCard API。 VERIFY和GET DATA命令按预期工作。但是,当我执行GENERAL AUTHENTICATE生成数字签名时,SCardTransmit()返回错误代码1,并在调试输出中有消息:
First-chance exception at 0x77675B68 (KernelBase.dll) in PIVTool.exe: 0x00000001: Incorrect function.
First-chance exception at 0x77675B68 (KernelBase.dll) in PIVTool.exe: 0x0000071A: The remote procedure call was canceled, or if a call time-out was specified, the call timed out.
First-chance exception at 0x77675B68 in PIVTool.exe: Microsoft C++ exception: unsigned long at memory location 0x0113E48C.
在系统日志中,也有一些消息可以解决这个问题:
智能卡服务,ID 610:智能卡读卡器'VMware Virtual USB CCID 0'拒绝IOCTL TRANSMIT:功能不正确。如果此错误仍然存在,则您的智能卡或读卡器可能无法正常运行。
命令标题:00 87 07 9c
命令头匹配我传输的内容。
WudfUsbccidDrv ID 11:请求已返回失败。 MsgType:0x80 ICCStatus:0x0 CmdStatus:0x1 错误:0x0 SW1:0x0 SW2:0x0
然后
WudfUsbccidDrv ID 1:操作失败(0x0,0x0,0x0,0x0)。 ScT1Transmit:发送请求失败。 HResult:指定的请求不是目标设备的有效操作。
以及
再次,这正是我的要求。WudfUsbccidDrv ID 10:请求[0](CLS = 0x0,INS = 0x87,P1 = 0x7,P2 = 0x9C,Lc = 266,Le = 0,.NETServiceMethod = 0x0)
主机上的代码按预期工作。相同的卡,相同的物理读卡器,相同的命令。卡驱动程序可能不同。
我尝试过针对SunPCSC安全提供程序的等效Java代码,只是为了检查细微的协议故障;它在VM上失败并显示类似消息:
javax.smartcardio.CardException:sun.security.smartcardio.PCSCException:未知错误0x1
看起来VMWare的智能卡虚拟化层不喜欢这个特定的命令。有什么想法吗?