BOOL WINAPI CPAcquireContext( HCRYPTPROV * phProv, CHAR * pszContainer, DWORD dwFlags, PVTABLEPROVSTRUC pVTable );
Значение dwFlags | Описание |
---|---|
CRYPT_VERIFYCONTEXT | Приложение не имеет доступа к закрытым ключам ключевого контейнера. Флаг используется в приложениях, в которых требуется только проверка цифровой подписи. Операции, обычно необходимые в этом случае, – получение дескрипторов открытых ключей, хэширование и проверка подписи. При вызове функции CryptAcquireContext в MS CryptoAPI 2.0 с этим флагом криптопровайдер не требует от пользователя ввода ключевой информации. Параметр pszContainer игнорируется, но рекомендуется устанавливать его значение в NULL. |
CRYPT_NEWKEYSET | Если флаг установлен, то будет создан новый ключевой контейнер с именем, соответствующим pszContainer. Если pszContainer - NULL, то в качестве имени контейнера используется имя пользователя, вошедшего в систему. |
CRYPT_MACHINE_KEYSET | Флаг может использоваться при вызове функции CryptAcquireContext в MS CryptoAPI 2.0 c CRYPT_NEW_KEYSET или флагом CRYPT_DELETE_KEYSET. В этом случае ключи будут сохранены в ключе HKEY_LOCAL_MACHINE системного реестра. Флаг предназначен для использования криптопровайдера в составе приложений, не имеющих доступа к пользовательскому разделу реестра (сервис, драйвер и т.д.). В случае работы со смарт-картой флаг запрещает хранение аутентификационной информации в памяти криптопровайдера. |
CRYPT_DELETEKEYSET | Ключевой контейнер, соответствующий pszContainer, удаляется. Если pszContainer - NULL, то удаляется ключевой контейнер, заданный по умолчанию (см. Дополнительные параметры и определения ). Все ключевые пары в ключевом контейнере также уничтожаются. Когда флаг CRYPT_DELETEKEYSET установлен, значение, возвращённое в phProv, не определено и повторный вызов функции CPReleaseContext() с тем же дескриптором phProv также не определён. |
CRYPT_SILENT | Флаг, запрещающий криптопровайдеру "КриптоПро CSP 5.0" использовать какой-либо пользовательский интерфейс (UI) при выполнении операций с данным контекстом. Можно задать этот флаг глобально для всех операций: на 32-х битной Windows выполнить в коммандной строке с правами администратора: reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Crypto Pro\Cryptography\CurrentVersion\Parameters" /v force_silent /t REG_DWORD /d 1 /f на 64-х битной Windows выполнить в коммандной строке с правами администратора: reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Crypto Pro\Cryptography\CurrentVersion\Parameters" /v force_silent /t REG_DWORD /d 1 /f для остальных ОС выполнить в консоли с правами администратора из папки, содержащей утилиту cpconfig: ./cpconfig -ini '' -add long force_silent 1 Если дальнейшие вызовы функций криптопровайдера требуют отображения графического интерфейса, то криптопровайдер возвратит ошибку NTE_SILENT_CONTEXT. |
CRYPT_NOSERIALIZE | Флаг, запрещающий криптопровайдеру "КриптоПро CSP 5.0" использовать ждущие блокировки при операциях создания/удаления объектов в данном контексте. При этом ответственность за недопущение параллельного вызова таких функций берёт на себя приложение. Параллельные обращения к таким функциям над одним и тем же контекстом возвращают ошибку. |
CRYPT_TOKEN_SHARED | Флаг контекста взаимодействия с ключевым носителем в режиме разделения секрета, флаг предназначен для взаимодействия с функциональными ключевыми носителями по протоколам, разработанным ООО "КРИПТО-ПРО". |
CRYPT_PROMT_INSERT_MEDIA | Используется совместно с CRYPT_NEWKEYSET. Если флаг установлен, то при создании контейнера будет показан диалог выбора считывателя, даже если считыватель один. |
CRYPT_LOCAL_PASSWORD_CACHE | Если флаг установлен, то аутентификационная информация сохраняется в контексте контейнера, если по умолчанию она сохранялась в глобальном кэше. |
CRYPT_NO_CONTAINER_CACHE | Если флаг установлен, то контекст не использует сохраненную в кэше криптопровайдера информацию о контейнере, создавая соответствующий объект специально для данного контекста. Это позволяет запретить использование закрытых ключей, доступ к которым получен в одном контексте, из других контекстов. Также в настройках криптопровайдера можно установить значение ContainerCacheDisable в 1 ("\\config\\parameters\\ContainerCacheDisable" - универсальное имя параметра, "HKLM\\SOFTWARE\\Crypto Pro\\Cryptography\\CurrentVersion\\Parameters\\ContainerCacheDisable" в 32-битной ветке SOFTWARE - для Windows). Тогда все контексты, которые открываются криптопровайдером, не будут использовать кэш с информацией о контейнерах. Установка параметра в 0 или отсутствие параметра указывает, что по умолчанию кэш используется. |
CRYPT_DEFAULT_CONTAINER_OPTIONAL | Используется только в именованных контекстах. Установленный флаг игнорируется всегда, когда есть возможность выбрать контейнер по умолчанию на носителе. Если контейнер по умолчанию не задан на носителе, то при обращении к данному носителю без указания имени контейнера и с флагом CRYPT_DEFAULT_CONTAINER_OPTIONAL будет открыт контекст, соответствующий данном носителю. В таком контексте доступны операции с носителем: установка pin-кода носителя (сохранение его в кеше), смена pin-кода, перечисление контейнеров, получение свойств носителя. Недоступны операции с закрытым ключом, так как такой контекст не связан ни с одним контейнером. Флаг игнорируется в сочетании с CRYPT_NEWKEYSET. Флаг нельзя использовать вместе с CRYPT_DELETEKEYSET. |
Коды возврата | Описание |
---|---|
ERROR_BUSY | Ключевой контейнер с данным именем был создан иным процессом и в настоящее время не может использоваться данным поцессом. Если эта ошибка возникает при обработке контейнера в одном процессе, разрешить коллизию можно вызвав функцию CPReleaseContext(). |
NTE_BAD_FLAGS | Некорректное значение параметра dwFlags. |
NTE_BAD_KEYSET | Ключевой контейнер не был открыт или не существует. |
NTE_BAD_KEYSET_PARAM | Используется некорректное значение параметра pszContainer. Ошибка также может возникнуть при открытии с флагом CRYPT_SILENT и неоднозначности в выборе носителя. |
NTE_BAD_SIGNATURE | Не прошла проверка цифровой подписи DLL криптопровайдера. DLL или цифровая подпись искажены. |
NTE_EXISTS | Параметр dwFlags установлен в CRYPT_NEWKEYSET, а ключевой контейнер уже существует. |
NTE_KEYSET_ENTRY_BAD | Ключевой контейнер, соответствующий pszContainer найден, но искажён. |
NTE_KEYSET_NOT_DEF | Ключевой контейнер, соответствующий pszContainer, не существует. |
NTE_NO_MEMORY | Криптопровайдер во время операции исчерпал память. |
NTE_TOKEN_KEYSET_STORAGE_FULL | Недостаточно места на носителе для сохранения информации. |
NTE_SILENT_CONTEXT | Операция не может быть выполнена без пользовательского интерфейса. |
SCARD_W_REMOVED_CARD | Носитель контейнера был удалён из считывателя. |
SCARD_W_CANCELLED_BY_USER | Пользователь прервал операцию. |
Внимание! Полученный дескриптор криптопровайдера должен быть в обязательном порядке освобождён с помощью вызова функции CPReleaseContext() (за исключением вызовов с флагом CRYPT_DELETEKEYSET).
AIX: 6/7.
FreeBSD: 11/12, pfSense 2.x.
Linux: LSB 4.x (RHEL 5/6/7/8, SuSE 11SP4/12/15, Oracle Linux 5/6/7/8, CentOS 6/7/8, Ubuntu 14.04/16.04/18.04/19.10, Linux Mint 18/19, Fedora 28/29/30/31, Debian 8/9/10 и др.).
Solaris: 10/11.
Mac OS X: 10.9/10.10/10.11/10.12/10.13/10.14/10.15.
iOS: 8/9/10/11/12/13.
Sailfish: 2/3.
Windows: 7/8/8.1/10, Server 2008/2008R2/2012/2012R2/2016/2019.
Файл описания: Прототип описан в файле wincsp.h.
Ядро ОС: Вместо неё используется аналогичная функция CPCAcquireContext .
CPReleaseContext() ,CPAcquireContext в MS CSP ,CryptAcquireContext в MS CryptoAPI 2.0 ,CryptSetProvParam в MS CryptoAPI 2.0