CryptoAPI: Как программно установить PIN-код

Добрый день!

Как программно установить PIN-код, используемый для аутентификации пользователя на токене?
Я вызываю CryptAcquireContext и выводится диалог ввода PIN-кода.
Проблема в том, что у меня этот код есть (пользователь его вводит через мой UI).
Пробовал указывать через PP_SIGNATURE_PIN (или PP_EXCHANGE_PIN), вызывая CryptSetProvParam.
К сожалению, возвращается ошибка про неверный параметр.
В SDK ничего не нашел.

Заранее спасибо.

PS: Второй вопрос, как сделать сброс закэшированного PIN-кода?

(2009-06-29 14:43:20 отредактировано MKurskiy)

Re: CryptoAPI: Как программно установить PIN-код

Добрый день.

К сожалению, ни как. У нас не реализована программная передача PIN-кода, как и его кэширование.
В будущем, мы планируем это сделать.

Михаил Курский
Руководитель отдела разработки прикладного ПО Rutoken, Компания "Актив"

Re: CryptoAPI: Как программно установить PIN-код

Добрый день!

Спасибо за ответ. А в каком будущем этого можно ожидать?

Re: CryptoAPI: Как программно установить PIN-код

Во-первых, хотел бы извинится что так долго, только в конце прошлой недели наткнулся на это сообщение.

Во-вторых, о сроках: не могу сказать точно, эта задача не является приоритетной на данный момент.

И в-третьих, Вы можете аутентифицировать пользователя Rutoken через rtAPIlt например, которое входит в комплект поставки драйверов. Как временное решение, такой способ подойдет.
Если Rutoken не залогинен, а CSP отвечает NTE_SILENT_CONTEXT, т.е. операция не может быть выполнена в Silent Context - требуется запрос PIN-кода, то залогинте пользователя через API, повторите операцию, и потом разлогинте пользователя, так же через API. Состояние логона токена автоматически не сбрасывается.

Михаил Курский
Руководитель отдела разработки прикладного ПО Rutoken, Компания "Актив"

Re: CryptoAPI: Как программно установить PIN-код

Для получения документации по rtAPIlt, напишите пожалуйста, запрос в техническую поддержку.
Контакты здесь: http://rutoken.ru/hotline/

Михаил Курский
Руководитель отдела разработки прикладного ПО Rutoken, Компания "Актив"

Re: CryptoAPI: Как программно установить PIN-код

Спасибо за совет.

Предложенное решение мне не совсем подходит. Оно слишком сильно привязывает мой код к вашему токену.

PS: А ваш токен можно использовать аутентификации при входе в систему? Если да, то этот сценарий у вас должен быть уже поддержан.

Re: CryptoAPI: Как программно установить PIN-код

Что то поторопился...

Конечно, можно использовать Rutoken для аутентификации в локально и на терминальном сервере.

Только там используется именно параметр PP_KEYEXCHANGE_PIN в функциии CryptSetProvParam.
Вы уверены, что rtCSP отвечает на этот вызов ошибкой?
Только что посмотрел в отладчике на XP Winlogon.exe использует его корректно, и токен аутентифицируется для логона.

Михаил Курский
Руководитель отдела разработки прикладного ПО Rutoken, Компания "Актив"

Re: CryptoAPI: Как программно установить PIN-код

Пишу вот так:
    BOOL fRet = CryptAcquireContext(&hProv, 0, szProv, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
    fRet = CryptSetProvParam(hProv, PP_SIGNATURE_PIN, (const BYTE*)("123456"), 0);
    printf("%d", fRet);
    fRet = CryptSetProvParam(hProv, PP_KEYEXCHANGE_PIN, (const BYTE*)("123456"), 0);
    printf("%d", fRet);
    fRet = CryptSetProvParam(hProv, PP_ADMIN_PIN, (const BYTE*)("123456"), 0);
    printf("%d", fRet);
    CryptReleaseContext(hProv, 0);
    fRet = CryptAcquireContext(&hProv, szContainer, szProv, PROV_RSA_FULL, CRYPT_NEWKEYSET | 0);

Все 3 вызова CryptSetProvParam обламываются

(2009-06-29 17:53:26 отредактировано MKurskiy)

Re: CryptoAPI: Как программно установить PIN-код

Все в общем логично.
CryptReleaseContext сбрасывает состоние логона токена, и очищает всю информацию об этом экзепляре контекста.
Не предусмотрен режим CryptAcquireContext с флагом CRYPT_NEWKEYSET в SILENT режиме.
ОС использует PP_EXCHANGE_PIN для чтения сертификатов и выполнения аутентификации, генерация же всегда проходит с выводом окна запроса PIN-кода.
К сожалению это так.

Если не секрет, Вы из какой компании? может быть свяжемся с Вами по телефону?

Михаил Курский
Руководитель отдела разработки прикладного ПО Rutoken, Компания "Актив"

Re: CryptoAPI: Как программно установить PIN-код

Я из Competenz, IT.

Если не секрет, почему выбрано такое поведение?
И еще вопрос: в соответствии с Smartcard CSP Cookbook, CSP должен кэшировать PIN и после ReleaseContext. Т.е. в этом месте, вы делаете не так, как рекомендует MS.

Re: CryptoAPI: Как программно установить PIN-код

Дмитрий, если, быть точным, в The Smart Card CSP Cookbook (http://msdn.microsoft.com/en-us/library/ms953432.aspx) не сказано должен ли кэшироваться PIN после CryptReleaseContext.
И честно, говоря мало сказано про логику работу этой функции в принципе.
Сказано другое, что PIN должен сохраняться при вызове функции CryptSetProvParam с флагом PP_KEYEXCHANGE_PIN с параметром pbData != NULL, и сбрасываться с параметром pbData == NULL.

Дмитрий, хочу оговориться, CSP у нас был написан довольно давно, и долгое время не перерабатывался.
На данный момент есть проблема при аутентификации по сертификату на терминальном сервере на базе Windows Server 2008. И по всей видимости именно из-за некорректной работы с PIN-кодом.
У нас до этого PIN-код сохранялся только для контейнера по-умолчанию, этого хватало для локального логона и аутентификации на терминальном сервере по средствам RDP клиента версии младше, чем 6.1.

Получается, что задача с кэшированием PIN'а приоритетная. Без этого функционала не работает аутентификация на терминальном сервере. А этой проблемой мы занимаемся на данный момент.
Думаю, в ближашей бета-версии мы сможем выпустить CSP с этим функционалом.
На сколько я понимаю, на данный момент у Вас идет либо исследование перед разработкой ПО, либо разработка ПО, с использованием Aktiv Rutoken CSP v1.0. Т.е. Вы можете вести разработку, при условии того, что PIN будет запрашиваться повторно из CSP. А мы же в свою очередь, произведем доработку CSP, с тем чтобы кэширование работало корректно.

Михаил Курский
Руководитель отдела разработки прикладного ПО Rutoken, Компания "Актив"

Re: CryptoAPI: Как программно установить PIN-код

Добрый день.
На какой стадии разработка кэширования PINа? Не вышла ли еще бета-версия с этим функционалом?

Re: CryptoAPI: Как программно установить PIN-код

MKurskiy пишет:

У нас до этого PIN-код сохранялся только для контейнера по-умолчанию, этого хватало для локального логона и аутентификации на терминальном сервере по средствам RDP клиента версии младше, чем 6.1.

Усли оставить один контейнер и сделать его контейнером по умолчанию, будет кэширваться пин?

Re: CryptoAPI: Как программно установить PIN-код

Кэширование PIN-кода реализовано.
Данный функционал включен в бета-версию драйверов 2.23.07.0247.


Кэширование пина работает так как описано в MSDN:
установка пина CryptSetProvParam c флагами PP_KEYEXCHANGE_PIN, PP_SIGNATURE_PIN (с точки зрения Rutoken PIN-код всего один), сброс пина - CryptSetProvParam c pbData == NULL.
Это работает со всеми контейнерами на Rutoken, не только с контейнерами по-умолчанию.

В настоящий момент готовится релиз-кандидат версия драйверов.

Михаил Курский
Руководитель отдела разработки прикладного ПО Rutoken, Компания "Актив"

Re: CryptoAPI: Как программно установить PIN-код

Спасибо большое.
А со старыми версиями драйверов есть возможность кэширования пинов, если оставить один контейнер и сделать его контейнером по умолчанию?