|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
CryptGetProvParam
[New - Windows NT]
[New - Windows 95, OEM Service Release 2] The CryptGetProvParam function lets applications retrieve parameters that govern the operations of a CSP.
BOOL CRYPTFUNC CryptGetProvParam(
HCRYPTPROV hProv, DWORD dwParam, BYTE *pbData, DWORD *pdwDataLen, DWORD dwFlags );
Parameters
hProv
[in] A handle to the CSP on which to query parameters.
dwParam
[in] The parameter number. See the "Remarks" section for a list of valid parameters.
pbData
[out] The parameter data buffer. The function will copy the specified parameter data to this buffer. The form of this data will vary, depending on the parameter number. This parameter can be NULL if all you are doing is determining the number of bytes required for the returned parameter data.
pdwDataLen
[in/out] The address of the parameter data length. Before calling this function, the caller should set this parameter to the length, in bytes, of the pbData buffer. Upon return, this address will contain the number of bytes of parameter data copied to the buffer. If the buffer specified by pbData is not large enough to hold the data, the function returns the ERROR_MORE_DATA error code through the GetLastError function, and stores the required buffer size in bytes into the variable pointed to by pdwDataLen.
If pbData is NULL, then no error is returned and the function stores the size of the data in bytes in the variable pointed to by pdwDataLen. Note When one of the enumeration parameters (PP_ENUMALGS or PP_ENUMCONTAINERS) is being read, the pdwDataLen parameter works somewhat differently. If pbData is NULL or the value pointed to pdwDataLen is too small, the value returned in this parameter is the size of the largest item in the enumeration list instead of the size of the item currently being read.
When one of the enumeration parameters is read and the pbData parameter is NULL, the CRYPT_FIRST flag must be specified in order for the size information to be correctly retrieved.
dwFlags
[in] The flag values. This parameter is normally set to zero. When one of the enumeration parameters (PP_ENUMALGS or PP_ENUMCONTAINERS) is being read, then the CRYPT_FIRST flag can be specified. When this flag is set, the first item in the enumeration list is returned. If this flag is not set, then the next item in the list is returned.
Remarks
Parameter Numbers
The dwParam parameter can be set to one of the following values:
PP_CONTAINER
The key container name. When this parameter is specified, the function fills the pbData buffer with the name of the current key container. This name is in the form of a zero-terminated CHAR string. This string is exactly the same as the one passed in the pszContainer parameter of the CryptAcquireContext function in order to specify that the current key container be used. This parameter is often read in order to determine the name of the default key container.
PP_ENUMALGS
The algorithm information. When this parameter is specified, the function fills the pbData buffer with information about one of the algorithms supported by the CSP. The PP_ENUMALGS parameter must be read repeatedly to enumerate all the supported algorithms. The algorithms are not enumerated in any particular order. The first time that the PP_ENUMALGS parameter is read, the CRYPT_FIRST flag should be specified. This will ensure that information about the "first" algorithm in the enumeration list is returned. The PP_ENUMALGS parameter can then be repeatedly read in order to retrieve the information about the rest of the algorithms. When the CryptGetProvParam function fails with the ERROR_NO_MORE_ITEMS, then the end of the enumeration list has been reached. A code sample illustrating this is located in the "Example" section.
The following code fragment indicates the format of the data that the function returns in the pbData buffer.
ALG_ID aiAlgid; DWORD dwBits; DWORD dwNameLen; CHAR szName[dwNameLen];
The following table defines each of these fields.
Field Description aiAlgid The algorithm identifier. This is the value that is passed to the CryptGenKey, CryptDeriveKey, or CryptCreateHash functions in order to specify that a particular algorithm be used. dwBits The number of bits in the keys used by the algorithm. If this is a hash algorithm, this value indicates the number of bits in the hash values generated by this algorithm. dwNameLen The number of characters in the algorithm name, including the terminating zero. szName The zero-terminated name of the algorithm.
PP_ENUMCONTAINERS
The key container names. When this parameter is specified, the function fills the pbData buffer with the name of one of the key containers maintained by the CSP. This name is in the form of a zero-terminated CHAR string. The PP_ENUMCONTAINERS parameter must be read repeatedly to enumerate all the container names. These container names are enumerated in the same way as are the CSP's supported algorithms. Refer to the PP_ENUMALGS for more information.
PP_IMPTYPE
The CSP implementation type. The pbData buffer will contain a DWORD value that indicates how the CSP is implemented. Possible values are:
· CRYPT_IMPL_HARDWARE · CRYPT_IMPL_SOFTWARE · CRYPT_IMPL_MIXED · CRYPT_IMPL_UNKNOWN (the CSP isn't telling)
PP_NAME
The CSP name. When this parameter is specified, the function fills the pbData buffer with the name of the CSP. This name is in the form of a zero-terminated CHAR string. This string is identical to the one passed in the pszProvider parameter of the CryptAcquireContext function in order to specify that the current CSP be used. For example, the Microsoft RSA Base Provider will return "Microsoft Base Cryptographic Provider v1.0" when this parameter is read.
PP_VERSION
The CSP version number. The pbData buffer will contain a DWORD value that indicates the version number of the CSP. The least significant byte contains the minor version number and the next most significant byte the major version number. For example, version 1.0 would be represented here as 0x00000100.
Algorithm Identifiers
When enumerating algorithms, your application may need to determine the class of a particular algorithm. For example, you may want to display a list of encryption algorithms to the user and disregard the rest. This can be done with the GET_ALG_CLASS(x) macro. This macro takes an algorithm identifier as an argument and returns a code indicating the general class of algorithm that the identifier belongs to. Possible return values include:
· ALG_CLASS_DATA_ENCRYPT · ALG_CLASS_HASH · ALG_CLASS_KEY_EXCHANGE · ALG_CLASS_SIGNATURE
The following table lists the algorithms supported by the Microsoft RSA Base Provider along with the class of each algorithm.
Name Identifier Class "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
If your application does not recognize an algorithm identifier, it is not recommended that it use the algorithm. Making use of an unknown cryptographic algorithm can sometimes produce unpredictable results.
Return Values
If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. To retrieve extended error information, use the GetLastError function. The following table lists the error codes most commonly returned by the GetLastError function. The error codes prefaced by "NTE" are generated by the particular CSP you are using.
Error Description ERROR_INVALID_HANDLE One of the parameters specifies an invalid handle. ERROR_INVALID_PARAMETER One of the parameters contains an invalid value. This is most often an illegal pointer. ERROR_NO_MORE_ITEMS The end of the enumeration list has been reached. No valid data has been placed in the pbData buffer. This error is only returned when dwParam equals PP_ENUMALGS or PP_ENUMCONTAINERS. NTE_BAD_FLAGS The dwFlags parameter is nonzero. NTE_BAD_TYPE The dwParam parameter specifies an unknown parameter number. NTE_BAD_UID The CSP context specified by hProv is invalid.
Example
This example shows how the list of algorithms supported by a particular CSP is accessed by an application.
HCRYPTPROV hProv; // Handle to CSP DWORD dwAlgCount; BYTE *ptr = NULL; DWORD i; ALG_ID aiAlgid; DWORD dwBits; DWORD dwNameLen; CHAR szName[100]; // Often allocated dynamically. BYTE pbData[1000]; // Often allocated dynamically. DWORD dwDataLen; DWORD dwFlags; CHAR *pszAlgType = NULL; // Enumerate the supported algorithms. for(i=0 ; ; i++) { // Set the CRYPT_FIRST flag the first time through the loop. if(i == 0) { dwFlags = CRYPT_FIRST;
} else { dwFlags = 0; }
// Retrieve information about an algorithm. dwDataLen = 1000; if(!CryptGetProvParam(hProv, PP_ENUMALGS, pbData, &dwDataLen, 0)) { if(GetLastError() == ERROR_NO_MORE_ITEMS) { // Exit the loop. break; } else { printf("Error %x reading algorithm!\n", GetLastError()); return; } } // Extract algorithm information from 'pbData' buffer.
ptr = pbData; aiAlgid = *(ALG_ID *)ptr; ptr += sizeof(ALG_ID); dwBits = *(DWORD *)ptr; ptr += sizeof(DWORD); dwNameLen = *(DWORD *)ptr; ptr += sizeof(DWORD); strncpy(szName, ptr,dwNameLen); // Determine algorithm type. switch(GET_ALG_CLASS(aiAlgid)) { case ALG_CLASS_DATA_ENCRYPT: pszAlgType = "Encrypt "; break; case ALG_CLASS_HASH: pszAlgType = "Hash ";
break; case ALG_CLASS_KEY_EXCHANGE: pszAlgType = "Exchange "; break; case ALG_CLASS_SIGNATURE: pszAlgType = "Signature"; break; default: pszAlgType = "Unknown "; } // Print information about algorithm. printf("Algid:%8.8xh, Bits:%-4d, Type:%s, NameLen:%-2d, Name:%s\n", aiAlgid, dwBits, pszAlgType, dwNameLen, szName
); }
See Also
CryptAcquireContext, CryptCreateHash, CryptDeriveKey, CryptGenKey, CryptGetKeyParam, CryptSetProvParam
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
CryptGetProvParam
[Новый - Windows NT]
[Новый - Окно 95, Выпуск Услуги OEM 2] Функция CryptGetProvParam позволяет, приложения извлекают параметры, которые управляют действиями CSP.
BOOL CRYPTFUNC CryptGetProvParam(
HCRYPTPROV hProv, DWORD dwParam, БАЙТ *pbData, DWORD *pdwDataLen, DWORD dwFlags );
Параметры
hProv
[in] ручка на CSP к чему параметры запроса.
dwParam
[in] номер параметра. Смотри секцию "Замечаний" для списка правильных параметров.
pbData
[out] буфер данных параметра. Функция скопирует определенные данные параметра в этот буфер. Форма этих данных поменяет, в зависимости от номера параметра. Этот параметр может быть НЕДЕЙСТВИТЕЛЕН если все Вы - занятие определяет количество байтов необходимое для возвращанных данных параметра.
pdwDataLen
[в/] адрес длины данных параметра. Перед вызовом этой функции, вызывающий оператор должен устанавливать этот параметр на длину, в байтах, буфера pbData. В возврате, этот адрес будет содержать количество байтов данных параметра скопированного в буфер. Если буфер определенный pbData - не большой достаточно, чтобы держать данные, функция возвращает код ошибки ERROR_MORE_DATA через функцию GetLastError и загружает необходимый буферный размер в байты в переменную указанную, чтобы pdwDataLen.
Если pbData НЕДЕЙСТВИТЕЛЕН, тогда никакая ошибка не возвращана и функция загружает размер данных в байты в переменной указанной, чтобы pdwDataLen. Примечание Когда один из параметров перечисления (PP_ENUMALGS или PP_ENUMCONTAINERS) прочитанн, работы параметра pdwDataLen отчасти иначе. Если pbData НЕДЕЙСТВИТЕЛЕН или величина указанная на pdwDataLen слишком небольшая, величина возвращанная в этот параметр - размер самого большого пункта в списке перечисления вместо размера пункта к настоящему времени прочитать.
Когда один из параметров перечисления прочитаны и параметр pbData НЕДЕЙСТВИТЕЛЕН, флаг CRYPT_FIRST должен быть определен для того, чтобы размер информации, который нужно правильно извлекаться.
dwFlags
[in] величины флага. Этот параметр нормально установлен в нуль. Когда один из параметров перечисления (PP_ENUMALGS или PP_ENUMCONTAINERS) прочитанн, затем флаг CRYPT_FIRST может быть определен. Когда этот флаг установлен, первый пункт в списке перечисления возвращан. Если этот флаг не установлен, тогда следующий пункт в списке возвращан.
Замечания
Номера Параметра
Параметр dwParam может быть установлен в одно из следующего величин:
PP_CONTAINER
Ключевое контейнерное имя. Когда этот параметр определен, функция заполняет буфер pbData именем текущего ключевого контейнера. Это зовут в форме расторгнутой нулевой строки СИМВОЛА. Эта строка точно такая же как и один пройденное в параметр pszContainer функции CryptAcquireContext для того, чтобы определять, что текущий ключевой контейнер использован. Этот параметр часто прочитан для того, чтобы определять имя по умолчанию ключевого контейнера.
PP_ENUMALGS
Информация алгоритма. Когда этот параметр определен, функция заполняет буфер pbData информацией о одном из алгоритмов поддерживанных CSP. Параметр PP_ENUMALGS по-видимому читается многократно, чтобы перечислять все предусмотренные алгоритмы. Алгоритмы не перечислены в любом конкретном порядке. Сначала, что параметр PP_ENUMALGS прочитан, флаг CRYPT_FIRST должен быть определен. Это гарантирует, что информация об алгоритме "первый" в списке перечисления возвращана. Параметр PP_ENUMALGS может затем многократно прочитан для того, чтобы извлекать информацию об остальной части алгоритмов. Когда функция CryptGetProvParam терпит неудачу с ERROR_NO_MORE_ITEMS, затем конец списка перечисления достигнут. Кодовый образец, иллюстрирующий это расположен в секции "Примера".
Кодовый фрагмент следующего указывает формат данных, что функция возвращается в буфер pbData.
ALG_ID aiAlgid; DWORD dwBits; DWORD dwNameLen; СИМВОЛ szName[dwNameLen];
Следующая таблица определяет каждую из этих областей.
Описание Области aiAlgid Идентификатор алгоритма. Это - величина, которая пройдена в CryptGenKey, CryptDeriveKey, или функции CryptCreateHash для того, чтобы определять, что конкретный алгоритм использован. dwBits Количество битов на клавишах использовалось алгоритмом. Если это - алгоритм хэша, эта величина указывает количество битов в величинах хэша сгенерированных этим алгоритмом. dwNameLen КОЛИЧЕСТВО символов в имени алгоритма, включая завершающий нуль. szName Расторгнутое нулевое имя алгоритма.
PP_ENUMCONTAINERS
Ключевой контейнер называется. Когда этот параметр определен, функция заполняет буфер pbData именем одного из ключевых контейнеров поддержанных CSP. Это зовут в форме расторгнутой нулевой строки СИМВОЛА. Параметр PP_ENUMCONTAINERS по-видимому читается многократно, чтобы перечислять все контейнерные имена. Эти контейнерные имена перечисляются так же что - предусмотренные алгоритмы CSP's. Посмотрите PP_ENUMALGS более подробно.
PP_IMPTYPE
Тип реализации CSP. Буфер pbData будет содержать величину DWORD, которая указывает как CSP осуществлен. Возможные величины:
CRYPT_IMPL_HARDWARE CRYPT_IMPL_SOFTWARE CRYPT_IMPL_MIXED CRYPT_IMPL_UNKNOWN ( CSP не сообщает)
PP_NAME
Имя CSP. Когда этот параметр определен, функция заполняет буфер pbData именем CSP. Это зовут в форме расторгнутой нулевой строки СИМВОЛА. Эта строка идентична один пройденное в параметр pszProvider функции CryptAcquireContext для того, чтобы определять, что течение CSP использовано. Например, Базовый Поставщик Микрософт RSA возвращает "Базового Шифровального Поставщика Микрософт v1.0" когда этот параметр прочитан.
PP_VERSION
Номер версии CSP. Буфер pbData будет содержать величину DWORD, которая указывает номер версии CSP. Наименее значимый байт содержит незначительный номер версии и следующий наиболее значимый байт основной номер версии. Например, версия 1.0 должна представляться здесь как 0x00000100.
Идентификаторы Алгоритма
Перечисляя алгоритмы, ваше приложение возможно нужно определять класс конкретного алгоритма. Например, Вы можете захотеть отобразить список шифровальных алгоритмов пользователю и игнорировать остальные. Это может быть удовлетвориться GET_ALG_CLASS макро(x). Это макро берет идентификатор алгоритма как аргумент и возвращает код указывая общий класс алгоритма, что идентификатор принадлежит. Возможные обратные величины включают:
ALG_CLASS_DATA_ENCRYPT ALG_CLASS_HASH ALG_CLASS_KEY_EXCHANGE ALG_CLASS_SIGNATURE
Следующая таблица включает алгоритмы поддерживанные Базовым Поставщиком Микрософт RSA вместе с классом каждого алгоритма.
Класс Идентификатора Имени "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
Если ваше приложение не признает идентификатор алгоритма, это не рекомендовано, чтобы это использовало алгоритм. Использующий неизвестный шифровальный алгоритм может иногда произвести непредсказуемые результаты.
Обратные Величины
Если функция добивается успеха, обратная величина ненулевая. Если функция терпит неудачу, обратная величина нулевая. Для того, чтобы извлекать расширенную информацию ошибки, используйте функцию GetLastError. Следующая таблица включает коды наиболее общей ошибки возвращанные функцией GetLastError. Ошибка кодирует prefaced "NTE" сгенерированы конкретным CSP, которое Вы используете.
Описание Ошибки ERROR_INVALID_HANDLE Один из параметров определяет неправильную ручку. ERROR_INVALID_PARAMETER Один из параметров содержит неправильную величину. Это - чаще всего незаконный указатель. ERROR_NO_MORE_ITEMS конец списка перечисления достигнут. Неправильные данные установлены в буфере pbData. Эта ошибка только возвращана когда dwParam равные PP_ENUMALGS или PP_ENUMCONTAINERS. NTE_BAD_FLAGS параметр dwFlags ненулевой. NTE_BAD_TYPE параметр dwParam определяет неизвестный номер параметра. NTE_BAD_UID контекст CSP определенный hProv недействителен.
Пример
Этот пример показывает как список алгоритмов поддерживанных конкретным CSP доступен приложением.
HCRYPTPROV hProv; // Ручка на CSP DWORD dwAlgCount; БАЙТ *ptr = НЕДЕЙСТВИТЕЛЬНЫЙ; i DWORD; ALG_ID aiAlgid; DWORD dwBits; DWORD dwNameLen; СИМВОЛ szName[100]; // Часто распределенное динамически. БАЙТ pbData[1000]; // Часто распределенное динамически. DWORD dwDataLen; DWORD dwFlags; СИМВОЛ *pszAlgType = НЕДЕЙСТВИТЕЛЬНЫЙ; // Перечислите предусмотренные алгоритмы. для(i=0; ; я++) { // Установившее CRYPT_FIRST сигнализирует сначала через цикл. если(i == 0) { dwFlags = CRYPT_FIRST;
} еще { dwFlags = 0; }
// Извлеките информацию об алгоритме. dwDataLen = 1000; если(!CryptGetProvParam(hProv, PP_ENUMALGS, pbData, &dwDataLen, 0)) { ЕСЛИ(GetLastError() == ERROR_NO_MORE_ITEMS) { // Выход цикл. прерывание; } еще { printf("Error %x читая algorithm!\n", GetLastError()); возврат; } } // Информация алгоритма Экстрата из 'буфера pbData.
ptr = pbData; aiAlgid = * ptr(ALG_ID *); ptr += sizeof(ALG_ID); dwBits = * ptr(DWORD *); ptr += sizeof(DWORD); dwNameLen = * ptr(DWORD *); ptr += sizeof(DWORD); strncpy(szName, ptr,dwNameLen); // Определите тип алгоритма. ключ(GET_ALG_CLASS(aiAlgid)) { случай ALG_CLASS_DATA_ENCRYPT: pszAlgType = "Кодируется "; прерывание; случай ALG_CLASS_HASH: pszAlgType = "Хэш ";
прерывание; случай ALG_CLASS_KEY_EXCHANGE: pszAlgType = "Обмен "; прерывание; случай ALG_CLASS_SIGNATURE: pszAlgType = "Сигнатура"; прерывание; умолчание: pszAlgType = "Неизвестный "; } // Напечатайте информацию об алгоритме. printf("Algid:%8.8xh, Биты:%-4d, Тип:%s, NameLen:%-2d, Имя:%s\n", aiAlgid, dwBits, pszAlgType, dwNameLen, szName
); }
Смотри Также
CryptAcquireContext, CryptCreateHash, CryptDeriveKey, CryptGenKey, CryptGetKeyParam, CryptSetProvParam
|
|
|
|
| |