Попытка работы со считывателем смарт-карт с виртуальной машины 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: Неверная функция. Если эта ошибка повторяется, ваша смарт-карта или устройство чтения могут работать неправильно.
Заголовок команды: 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)
опять же, это именно моя просьба.
Тот же код работает как положено на хост-машине. Та же карта, тот же физический читатель, та же команда. Драйвер карты может быть другим.
Я пробовал эквивалентный фрагмент кода Java против поставщика безопасности SunPCSC, просто чтобы проверить наличие незначительных сбоев протокола; это терпит неудачу на VM с подобным сообщением:
javax.smartcardio.CardException: sun.security.smartcardio.PCSCException: неизвестная ошибка 0x1
Похоже, что слой виртуализации VMWare для смарт-карт не любит эту конкретную команду. Есть идеи, пожалуйста?
Задача ещё не решена.
Других решений пока нет …