CryptGetProvParam function (wincrypt.h)
Синтаксис
BOOL CryptGetProvParam(
[in] HCRYPTPROV hProv,
[in] DWORD dwParam,
[out] BYTE *pbData,
[in, out] DWORD *pdwDataLen,
[in] DWORD dwFlags
);
Параметры
[in] hProv
Дескриптор целевого объекта CSP запроса. Этот дескриптор должен быть создан с помощью функции CryptAcquireContext .
[in] dwParam
Характер запроса. Определены следующие запросы.
Значение | Значение |
---|---|
|
Возвращает личный идентификационный номер администратора (ПИН-код) в параметре pbData в виде LPSTR. |
|
Эта константа не используется. |
|
Эта константа не используется. |
|
Возвращает цепочку сертификатов, связанную с дескриптором hProv . Возвращаемая цепочка сертификатов X509_ASN_ENCODING кодируется. |
|
Имя текущего контейнера ключей в виде строки CHAR с пустым завершением. Эта строка в точности совпадает с той, которая передается в параметре pszContainer функции CryptAcquireContext для указания используемого контейнера ключей. Параметр pszContainer можно прочитать, чтобы определить имя контейнера ключей по умолчанию. |
|
Не реализовано поставщиками служб конфигурации Майкрософт. Это поведение может быть реализовано другими поставщиками служб конфигурации.
Windows XP: Этот параметр не поддерживается. |
|
Структура PROV_ENUMALGS , содержащая сведения об одном алгоритме, поддерживаемом запрашиваемым поставщиком служб CSP.
При первом чтении этого значения параметр dwFlags должен содержать флаг CRYPT_FIRST . Это приводит к тому, что эта функция извлекает первый элемент в перечислении. Последующие элементы можно получить, установив флаг CRYPT_NEXT в параметре dwFlags . Если эта функция завершается сбоем с кодом ошибки ERROR_NO_MORE_ITEMS , то достигается конец перечисления. Эта функция не является потокобезопасной, и все доступные алгоритмы могут не перечисляться, если эта функция используется в многопотоковом контексте. |
|
Структура PROV_ENUMALGS_EX , содержащая сведения об одном алгоритме, поддерживаемом запрашиваемым поставщиком служб CSP. Возвращаемая структура содержит больше сведений об алгоритме, чем структура, возвращаемая для PP_ENUMALGS.
При первом чтении этого значения параметр dwFlags должен содержать флаг CRYPT_FIRST . Это приводит к тому, что эта функция извлекает первый элемент в перечислении. Последующие элементы можно получить, установив флаг CRYPT_NEXT в параметре dwFlags . Если эта функция завершается сбоем с кодом ошибки ERROR_NO_MORE_ITEMS , то достигается конец перечисления. Эта функция не является потокобезопасной, и все доступные алгоритмы могут не перечисляться, если эта функция используется в многопотоковом контексте. |
|
Имя одного из контейнеров ключей, поддерживаемых CSP, в виде строки CHAR, завершаемой null.
При первом чтении этого значения параметр dwFlags должен содержать флаг CRYPT_FIRST . Это приводит к тому, что эта функция извлекает первый элемент в перечислении. Последующие элементы можно получить, установив флаг CRYPT_NEXT в параметре dwFlags . Если эта функция завершается сбоем с кодом ошибки ERROR_NO_MORE_ITEMS , то достигается конец перечисления. Чтобы перечислить контейнеры ключей, связанные с компьютером, сначала вызовите CryptAcquireContext с помощью флага CRYPT_MACHINE_KEYSET , а затем используйте дескриптор, возвращенный из CryptAcquireContext в качестве параметра hProv в вызове CryptGetProvParam. Эта функция не является потокобезопасной, и все доступные алгоритмы могут не перечисляться, если эта функция используется в многопотоковом контексте. |
|
Эта константа не используется. |
|
Указывает, что текущий поставщик служб CSP поддерживает член dwProtocolsструктуры PROV_ENUMALGS_EX . Если эта функция выполняется успешно, поставщик служб CSP поддерживает член dwProtocolsструктуры PROV_ENUMALGS_EX . Если эта функция завершается сбоем с кодом ошибки NTE_BAD_TYPE , CSP не поддерживает член dwProtocols . |
|
Эта константа не используется. |
|
Значение DWORD , указывающее, как реализуется CSP. Таблицу возможных значений см. в разделе Примечания. |
|
Этот запрос не используется. |
|
Указывает, что ПИН-код обмена ключами содержится в pbData. ПИН-код представлен в виде строки ASCII, завершаемой null. |
|
Извлекает дескриптор безопасности для контейнера хранилища ключей. Параметр pbData — это адрес структуры SECURITY_DESCRIPTOR , которая получает дескриптор безопасности для контейнера хранилища ключей. Дескриптор безопасности возвращается в само относительном формате. |
|
Определяет, является ли параметр hProv набором ключей компьютера. Параметр pbData должен быть DWORD; параметрУ DWORD будет присвоен флаг CRYPT_MACHINE_KEYSET, если этот флаг был передан в функцию CryptAcquireContext . |
|
Возвращает сведения о значениях описателя ключа, поддерживаемых CSP. Значения описателя ключа объединяются в логическом ИЛИ и возвращаются в параметре pbData вызова в виде DWORD. Например, базовый поставщик шифрования Майкрософт версии 1.0 возвращает значение DWORD AT_SIGNATURE | AT_KEYEXCHANGE. |
|
Возвращает значение DWORD CRYPT_SEC_DESCR. |
|
Число битов для длины приращения AT_KEYEXCHANGE. Эти сведения используются со сведениями, возвращаемыми в PP_ENUMALGS_EX значении. С помощью сведений, возвращаемых при использовании PP_ENUMALGS_EX и PP_KEYX_KEYSIZE_INC, можно определить допустимую длину ключей для AT_KEYEXCHANGE. Затем эти длины ключей можно использовать с CryptGenKey. Например, если CSP перечисляет CALG_RSA_KEYX (AT_KEYEXCHANGE) с минимальной длиной ключа 512 бит и максимальной длиной 1024 бита и возвращает длину приращения в 64 бита, то допустимые длины ключей: 512, 576, 640,... 1024. |
|
Имя поставщика служб конфигурации в виде строки CHAR, завершаемой null. Эта строка идентична той, которая передается в параметре pszProvider функции CryptAcquireContext для указания того, что будет использоваться текущий CSP. |
|
Значение DWORD , указывающее тип поставщика поставщика CSP. |
|
Получает корневое хранилище сертификатов для смарт-карта. Это хранилище сертификатов содержит все корневые сертификаты, хранящиеся в смарт-карта.
Параметр pbData — это адрес переменной HCERTSTORE , которая получает дескриптор хранилища сертификатов. Если этот дескриптор больше не нужен, вызывающий объект должен закрыть его с помощью функции CertCloseStore . Windows Server 2003 и Windows XP: Этот параметр не поддерживается. |
|
Размер сеансового ключа в битах. |
|
Используется с шифрованием с серверным шлюзом. |
|
Число битов для длины приращения AT_SIGNATURE. Эти сведения используются со сведениями, возвращаемыми в PP_ENUMALGS_EX значении. С помощью сведений, возвращаемых при использовании PP_ENUMALGS_EX и PP_SIG_KEYSIZE_INC, можно определить допустимую длину ключей для AT_SIGNATURE. Затем эти длины ключей можно использовать с CryptGenKey.
Например, если CSP перечисляет CALG_RSA_SIGN (AT_SIGNATURE) с минимальной длиной ключа 512 бит и максимальным значением 1024 бита и возвращает длину приращения в 64 бита, то допустимыми длинами ключей являются 512, 576, 640,... 1024. |
|
Указывает, что ПИН-код сигнатуры ключа содержится в pbData. ПИН-код представляется в виде строки ASCII, заканчивающейся нулевым значением. |
|
Получает идентификатор смарт-карта. Параметр pbData — это адрес структуры GUID, которая получает идентификатор смарт-карта.
Windows Server 2003 и Windows XP: Этот параметр не поддерживается. |
|
Получает имя средства чтения смарт-карта. Параметр pbData — это адрес массива символов ANSI, который получает строку ANSI, завершающуюся null, которая содержит имя средства чтения смарт-карта. Размер этого буфера, содержащегося в переменной, на которую указывает параметр pdwDataLen , должен включать признак конца NULL .
Windows Server 2003 и Windows XP: Этот параметр не поддерживается. |
|
Размер симметричного ключа. |
|
Этот запрос не используется. |
|
Уникальное имя контейнера текущего контейнера ключей в виде строки CHAR, завершаемой null. Для многих поставщиков служб конфигурации это имя совпадает с именем, возвращаемым при использовании значения PP_CONTAINER. Функция CryptAcquireContext должна работать с этим именем контейнера. |
|
Указывает, поддерживается ли аппаратный генератор случайных чисел (RNG). Если указан PP_USE_HARDWARE_RNG , функция выполняется успешно и возвращает значение TRUE , если поддерживается аппаратный RNG. Функция завершается сбоем и возвращает значение FALSE , если аппаратный RNG не поддерживается. Если RNG поддерживается, PP_USE_HARDWARE_RNG можно задать в CryptSetProvParam , чтобы указать, что CSP должен использовать исключительно аппаратный RNG для этого контекста поставщика. При использовании PP_USE_HARDWARE_RNG параметр pbData должен иметь значение NULL , а dwFlags — ноль.
Ни один из поставщиков служб конфигурации Майкрософт в настоящее время не поддерживает использование аппаратного RNG. |
|
Получает хранилище сертификатов пользователя для смарт-карта. Это хранилище сертификатов содержит все пользовательские сертификаты, хранящиеся в смарт-карта. Сертификаты в этом хранилище кодируются с помощью кодировки PKCS_7_ASN_ENCODING или X509_ASN_ENCODING и должны содержать свойство CERT_KEY_PROV_INFO_PROP_ID .
Параметр pbData — это адрес переменной HCERTSTORE , которая получает дескриптор хранилища сертификатов в памяти. Если этот дескриптор больше не нужен, вызывающий объект должен закрыть его с помощью функции CertCloseStore . Windows Server 2003 и Windows XP: Этот параметр не поддерживается. |
|
Номер версии поставщика служб конфигурации. Наименьший значимый байт содержит дополнительный номер версии, а следующий наиболее значимый байт — основной номер версии. Версия 2.0 представлена как 0x00000200. Для обеспечения обратной совместимости с более ранними версиями базового поставщика шифрования Майкрософт и поставщика расширенного шифрования Майкрософт имена поставщиков сохраняют обозначение "версия 1.0" в более поздних версиях. |
[out] pbData
Указатель на буфер для получения данных. Форма этих данных зависит от значения dwParam. Если параметру dwParam присвоено значение PP_USE_HARDWARE_RNG, pbData должно иметь значение NULL.
Этот параметр может иметь значение NULL , чтобы задать размер этих сведений для целей выделения памяти. Дополнительные сведения см. в разделе Извлечение данных неизвестной длины.
[in, out] pdwDataLen
Указатель на значение DWORD , указывающее размер (в байтах) буфера, на который указывает параметр pbData . При возврате функции значение DWORD содержит количество байтов, хранящихся или хранимых в буфере.
Если PP_ENUMALGS или PP_ENUMALGS_EX задано, параметр pdwDataLen работает несколько иначе. Если pbData имеет значение NULL или значение, на которое указывает pdwDataLen , слишком мало, то значение, возвращаемое в этом параметре, представляет собой размер самого большого элемента в списке перечисления, а не размер считываемого в данный момент элемента.
Если задано PP_ENUMCONTAINERS, первый вызов функции возвращает максимальный размер контейнера ключей, разрешенный текущим поставщиком. Это отличается от других возможных вариантов поведения, таких как возврат длины самого длинного существующего контейнера или длины текущего контейнера. Последующие вызовы перечисления не изменяют параметр dwLen . Для каждого перечисляемого контейнера вызывающий объект может программно определить длину строки, завершаемой значением NULL, при необходимости. Если одно из значений перечисления считывается, а параметр pbData имеет значение NULL, для правильного извлечения сведений о размере необходимо указать флаг CRYPT_FIRST.
[in] dwFlags
Если параметр dwParamPP_KEYSET_SEC_DESCR, извлекается дескриптор безопасности в контейнере ключей , в котором хранятся ключи. В этом случае dwFlags используется для передачи SECURITY_INFORMATION битовых флагов, которые указывают запрошенные сведения о безопасности, как определено в пакете SDK для платформы. SECURITY_INFORMATION битовые флаги можно объединить с побитовой операцией ИЛИ .
Для использования с PP_KEYSET_SEC_DESCR определены следующие значения.
Следующие значения определяются для использования с PP_ENUMALGS, PP_ENUMALGS_EX и PP_ENUMCONTAINERS.
Значение | Значение |
---|---|
|
Получение первого элемента в перечислении. Это имеет тот же эффект, что и сброс перечислителя. |
|
Получение следующего элемента в перечислении. Если элементов для извлечения больше нет, эта функция завершится ошибкой и присвоит последней ошибке значение ERROR_NO_MORE_ITEMS. |
|
Получение сертификатов с поддержкой шифрования с серверным шлюзом (SGC). Сертификаты с поддержкой SGC больше не поддерживаются. |
|
Этот флаг не используется. |
|
Этот флаг не используется. |
Возвращаемое значение
Если функция выполнена успешно, возвращается ненулевое значение (TRUE).
Если функция завершается сбоем, возвращаемое значение равно нулю (FALSE). Чтобы получить дополнительные сведения об ошибке, вызовите Метод GetLastError.
Коды ошибок, предваряемые NTE, создаются конкретным поставщиком служб CSP. Ниже приведены некоторые возможные коды ошибок.
Код возврата | Описание |
---|---|
|
Один из параметров указывает недопустимый дескриптор. |
|
Один из параметров содержит недопустимое значение. Чаще всего это недопустимый указатель. |
|
Если буфер, заданный параметром pbData , недостаточно велик для хранения возвращаемых данных, функция задает код ERROR_MORE_DATA и сохраняет требуемый размер буфера в байтах в переменной, на которую указывает pdwDataLen. |
|
Достигнут конец списка перечисления. Допустимые данные не были помещены в буфер pbData . Этот код ошибки возвращается, только если значение dwParam равно PP_ENUMALGS или PP_ENUMCONTAINERS. |
|
Параметр dwFlags указывает недопустимый флаг. |
|
Параметр dwParam указывает неизвестное число значений. |
|
Контекст CSP, заданный hProv, недопустим. |
Комментарии
Эта функция не должна использоваться в потоке многопоточной программы.
Следующие значения возвращаются в pbData , если dwParam PP_IMPTYPE.
Значение | Значение |
---|---|
CRYPT_IMPL_HARDWARE 0x01 |
Реализация выполняется на оборудовании. |
CRYPT_IMPL_SOFTWARE 0x02 |
Реализация осуществляется в программном обеспечении. |
CRYPT_IMPL_MIXED 0x03 |
Реализация включает в себя как оборудование, так и программное обеспечение. |
CRYPT_IMPL_UNKNOWN 0x04 |
Тип реализации неизвестен. |
CRYPT_IMPL_REMOVABLE 0x08 |
Реализация находится на съемном носителе. |
Параметр dwFlags используется для передачи SECURITY_INFORMATION битовых флагов, указывающих запрошенные сведения о безопасности. Указатель на дескриптор безопасности возвращается в параметре pbData , а длина дескриптора безопасности возвращается в параметре pdwDataLen . Безопасность контейнера ключей обрабатывается с помощью SetFileSecurity и GetFileSecurity.
Можно определить класс алгоритма, перечисляемого с параметром dwParam , PP_ENUMALGS или PP_ENUMALGS_EX. Это можно сделать, чтобы отобразить список поддерживаемых алгоритмов шифрования и игнорировать остальные. Макрос GET_ALG_CLASS(x) принимает идентификатор алгоритма в качестве аргумента и возвращает код, указывающий общий класс этого алгоритма. Возможные возвращаемые значения:
- ALG_CLASS_DATA_ENCRYPT
- ALG_CLASS_HASH
- ALG_CLASS_KEY_EXCHANGE
- ALG_CLASS_SIGNATURE
В следующей таблице перечислены алгоритмы, поддерживаемые базовым поставщиком шифрования Майкрософт, а также класс каждого алгоритма.
Имя | Идентификатор | Класс |
---|---|---|
"MD2" | CALG_MD2 | ALG_CLASS_HASH |
"MD5" | CALG_MD5 | ALG_CLASS_HASH |
"SHA" | CALG_SHA | ALG_CLASS_HASH |
"MAC" | CALG_MAC | ALG_CLASS_HASH |
"RSA_SIGN" | CALG_RSA_SIGN | ALG_CLASS_SIGNATURE |
"RSA_KEYX" | CALG_RSA_KEYX | ALG_CLASS_KEY_EXCHANGE |
"RC2" | CALG_RC2 | ALG_CLASS_DATA_ENCRYPT |
"RC4" | CALG_RC4 | ALG_CLASS_DATA_ENCRYPT |
Приложения не должны использовать алгоритм с идентификатором алгоритма, который не распознается. Использование неизвестного алгоритма шифрования может привести к непредсказуемым результатам.
Примеры
В следующем примере показано поиск имени CSP, связанного с дескриптором поставщика служб шифрования, и имени контейнера ключей, связанного с дескриптором. Полный контекст для этого примера см. в разделе Пример программы C: использование CryptAcquireContext.
Другой пример, в котором используется эта функция, см. в разделе Пример программы C: перечисление поставщиков И типов поставщиков CSP.
//-----------------------------------------------------------------
// Declare and initialize variables.
HCRYPTPROV hCryptProv;
BYTE pbData[1000]; // 1000 will hold the longest
// key container name.
DWORD cbData;
//-------------------------------------------------------------------
// An HCRYPTPROV must be acquired before using code like that in
// "Example C Program Using CryptAcquireContext."
//-------------------------------------------------------------------
// Read the name of the default CSP.
cbData = 1000;
if(CryptGetProvParam(
hCryptProv,
PP_NAME,
pbData,
&cbData,
0))
{
printf("CryptGetProvParam succeeded.\n");
printf("Provider name: %s\n", pbData);
}
else
{
printf("Error reading CSP name. \n");
exit(1);
}
//--------------------------------------------------------------------
// Read the name of the default key container.
cbData = 1000;
if(CryptGetProvParam(
hCryptProv,
PP_CONTAINER,
pbData,
&cbData,
0))
{
printf("CryptGetProvParam succeeded. \n");
printf("Key Container name: %s\n", pbData);
}
else
{
printf("Error reading key container name. \n");
exit(1);
}
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows XP [только классические приложения] |
Минимальная версия сервера | Windows Server 2003 [только классические приложения] |
Целевая платформа | Windows |
Header | wincrypt.h |
Библиотека | Advapi32.lib |
DLL | Advapi32.dll |