| ||||
| ||||
Я написал драйвер считывателя смарткарт PC/SC. Пытаюсь сейчас подобрать правильное ATR для своей USB 1.1 -железяки. Кто знает как это делать. Прочитал много доков. SmartcardUpdateCardCapabilities возвращает STATUS_SUCCESS на значение { 0x3b, 0x84, 0x01, 0x80, 0x12, 0x64, 0x30, 0x43 }. Определяет карту вставленной (ну я еще и состоянием управляю сам, устанавливаю SCARD_NEGOTIABLE). Однако она остается неизвестной. Т.е. не может определиться. При попытке писать/читать с нее или на нее на вкладке "сервис" она постоянно пытается заново определить тип карты, посылая SCARD_COLD_RESET и SCARD_POWER_DOWN по циклу. При взаимодействии с API SCard возвращается ошибка "неизвестная карта". Тот же разультат, естественно, получается, когда я юзаю проект pcsc_test, входящий в ваш sdk. Клсассная штука, надо сказать :) | ||||
Ответы: | ||||
| ||||
Насколько я знаю - ATR - произвольная строка байт. Регистрируется с помощью SCardIntroduceCardType, CSP для карточки - SCardSetCardTypeProviderName (c smart card's primary service provider не знаком). | ||||
| ||||
Я воспользовался советом и написал код, который отработал без ошибок. Он выглядит так: SCARDCONTEXT hScardCtx = NULL; static const int ATR_LEN = 13; static BYTE ATRBuffer[ ATR_LEN ] = {0x3b, 0xa8, 0x00, 0x01, 0x80, 0x56, 0x02, 0x03, 0x05, 0x07, 0x11, 0x13, 0x7e}; static BYTE ATRMask[ ATR_LEN ] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; // {F5ACD36E-59AF-4a7b-96FB-CFA77ACD700A} static const GUID CKeyGUID = { 0xf5acd36e, 0x59af, 0x4a7b, { 0x96, 0xfb, 0xcf, 0xa7, 0x7a, 0xcd, 0x70, 0xa } }; LONG lRes = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hScardCtx); if (lRes != SCARD_S_SUCCESS) { MessageBox(_T("Unable to SCardEstablishContext with SCARD_S_SUCCESS")); hScardCtx = NULL; return FALSE; } lRes = SCardIntroduceCardType(hScardCtx, _T("C-Key"), /*&CKeyGUID*/NULL, NULL, 0, ATRBuffer, ATRMask, sizeof(ATRBuffer)); if (lResult != SCARD_S_SUCCESS) MessageBox(Error2String(lResult)); lRes = SCardReleaseContext(hScardCtx); if (lRes != SCARD_S_SUCCESS) MessageBox(Error2String(lRes)); Все вызовы возвращают SCARD_S_SUCCESS, однако система все равно не видит карту, мою виртуальныю карту. Если это критично, то выполняю этот код до инсталляции драйвера PC/SC ридера и во время его работы тоже пробовал. ХЗ, он как раньше не видел , так и сейчас. | ||||
| ||||
Что значит система не видит карту? С каким криптопровайдером планируется работать? Все карточные настройки верхнего уровня лежат здесь: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Calais | ||||
| ||||
Планируется работать только с КриптоПро 3.0. В данном разделе реестра карта есть. Для успешного ее определения необходимо еще проипсать первичного криптопровайдера? | ||||
| ||||
Для КриптоПро CSP там карта вообще может быть не указана. Смотрите настройки в RDK. А вот для КриптПро Winlogon, карта должна быть зарегистрирована с провайдером CryptoPro SmartCard CSP. | ||||
| ||||
Спасибо большое за ответы. Приятно сотрудничать с профи. С праздником. | ||||