21.02.2006 11:14:57подобрать правильное ATR Ответов: 6
Дмитрий
Я написал драйвер считывателя смарткарт 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. Клсассная штука, надо сказать :)
 
Ответы:
21.02.2006 15:33:20maxdm
Насколько я знаю - ATR - произвольная строка байт. Регистрируется с помощью SCardIntroduceCardType, CSP для карточки - SCardSetCardTypeProviderName (c smart card's primary service provider не знаком).
22.02.2006 12:31:33Дмитрий
Я воспользовался советом и написал код, который отработал без ошибок. Он выглядит так:

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 ридера и во время его работы тоже пробовал. ХЗ, он как раньше не видел , так и сейчас.
22.02.2006 12:55:40maxdm
Что значит система не видит карту? С каким криптопровайдером планируется работать? Все карточные настройки верхнего уровня лежат здесь: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Calais
22.02.2006 13:28:16Дмитрий
Планируется работать только с КриптоПро 3.0. В данном разделе реестра карта есть. Для успешного ее определения необходимо еще проипсать первичного криптопровайдера?
22.02.2006 16:36:37maxdm
Для КриптоПро CSP там карта вообще может быть не указана. Смотрите настройки в RDK. А вот для КриптПро Winlogon, карта должна быть зарегистрирована с провайдером CryptoPro SmartCard CSP.
22.02.2006 18:22:24Дмитрий
Спасибо большое за ответы. Приятно сотрудничать с профи. С праздником.