КриптоПро CSP  

CPAcquireContext

Функция CPAcquireContext() используется для создания дескриптора криптопровайдера с именем ключевого контейнера, определённым параметром pszContainer.

BOOL WINAPI CPAcquireContext(
  HCRYPTPROV * phProv,
  CHAR * pszContainer,
  DWORD dwFlags,
  PVTABLEPROVSTRUC pVTable
);

Аргументы

phProv
[out] Адрес, по которому функция копирует дескриптор криптопровайдера.
pszContainer
[in] Имя ключевого контейнера. Это указатель на строку, длиной не больше, чем MAX_PATH знаков, включая признак конца строки. Если данный параметр - NULL, то криптопровайдер будет использовать в качестве имени контейнера имя пользователя, вошедшего в систему. Пользователь может получить имя используемого контейнера функцией CPGetProvParam(). Подробнее см. Дополнительные параметры и определения .
dwFlags
[in] Параметр имеет нулевое или одно из следующих значений:
Значение dwFlags Описание
CRYPT_VERIFYCONTEXT Приложение не имеет доступа к закрытым ключам ключевого контейнера. Флаг используется в приложениях, в которых требуется только проверка цифровой подписи. Операции, обычно необходимые в этом случае, – получение дескрипторов открытых ключей, хэширование и проверка подписи. При вызове функции CryptAcquireContext в MS CryptoAPI 2.0 World Wide Web link с этим флагом криптопровайдер не требует от пользователя ввода ключевой информации. Параметр pszContainer игнорируется, но рекомендуется устанавливать его значение в NULL.
CRYPT_NEWKEYSET Если флаг установлен, то будет создан новый ключевой контейнер с именем, соответствующим pszContainer. Если pszContainer - NULL, то в качестве имени контейнера используется имя пользователя, вошедшего в систему.
CRYPT_MACHINE_KEYSET Флаг может использоваться при вызове функции CryptAcquireContext в MS CryptoAPI 2.0 World Wide Web link 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.
pVTable
[in] Указатель на структуру _VTABLEPROVSTRUC , которая содержит список callback функций, представляемых операционной системой для использования криптопровайдером.

Возвращаемые значения

При успешном завершении функция возвращает TRUE, в противном случае возвращается FALSE. Если возвращается FALSE, соответствующий код ошибки (см. таблицу) может быть получен через функцию GetLastError().
Коды возвратаОписание
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 World Wide Web link ,CryptAcquireContext в MS CryptoAPI 2.0 World Wide Web link ,CryptSetProvParam в MS CryptoAPI 2.0 World Wide Web link