Использование функций конфигурации шифрования CNG
API CNG предоставляет функции для перечисления и получения сведений о зарегистрированных поставщиках.
Перечисление поставщиков
Для перечисления зарегистрированных поставщиков используется функция BCryptEnumRegisteredProviders . Функцию BCryptEnumRegisteredProviders можно вызвать одним из двух способов:
Во-первых, функция BCryptEnumRegisteredProviders выделяет память. Для этого передайте адрес указателя NULL для параметра ppBuffer . Этот код выделяет память, необходимую для структуры CRYPT_PROVIDERS и связанных строк. Если функция BCryptEnumRegisteredProviders используется таким образом, необходимо освободить память, если она больше не нужна, передав ppBuffer функции BCryptFreeBuffer .
В следующем примере показано, как использовать функцию BCryptEnumRegisteredProviders для выделения буфера.
#include <windows.h> #ifndef NT_SUCCESS #define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0) #endif void EnumProviders1() { NTSTATUS status; ULONG cbBuffer = 0; PCRYPT_PROVIDERS pBuffer = NULL; /* Get the providers, letting the BCryptEnumRegisteredProviders function allocate the memory. */ status = BCryptEnumRegisteredProviders(&cbBuffer, &pBuffer); if (NT_SUCCESS(status)) { if (pBuffer != NULL) { // Enumerate the providers. for (ULONG i = 0; i < pBuffer->cProviders; i++) { printf("%S\n", pBuffer->rgpszProviders[i]); } } } else { printf("BCryptEnumRegisteredProviders failed with error " "code 0x%08x\n", status); } if (NULL != pBuffer) { /* Free the memory allocated by the BCryptEnumRegisteredProviders function. */ BCryptFreeBuffer(pBuffer); } }
Второй метод — выделить необходимую память самостоятельно. Для этого вызовите функцию BCryptEnumRegisteredProviders со значением NULL для параметра ppBuffer . Функция BCryptEnumRegisteredProviders будет размещаться в значении, на которое указывает параметр pcbBuffer ( требуемый размер в байтах) структуры CRYPT_PROVIDERS и всех строк. Затем вы выделяете необходимую память и передаете адрес этого указателя буфера для параметра ppBuffer во втором вызове функции BCryptEnumRegisteredProviders .
В следующем примере показано, как использовать функцию BCryptEnumRegisteredProviders для выделения и использования собственного буфера.
#include <windows.h> #include <stdio.h> #ifndef NT_SUCCESS #define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0) #endif void EnumProviders2() { NTSTATUS status; ULONG cbBuffer = 0; // Get the required size of the buffer. status = BCryptEnumRegisteredProviders(&cbBuffer, NULL); if (STATUS_BUFFER_TOO_SMALL == status) { // Allocate the buffer. PCRYPT_PROVIDERS pBuffer = (PCRYPT_PROVIDERS)LocalAlloc(LPTR, cbBuffer); if (NULL != pBuffer) { // Get the providers in the buffer that was allocated. status = BCryptEnumRegisteredProviders( &cbBuffer, &pBuffer); if (NT_SUCCESS(status)) { for (ULONG i = 0; i < pBuffer->cProviders; i++) { // Enumerate the providers. printf("%S\n", pBuffer->rgpszProviders[i]); } } // Free the memory that was allocated. LocalFree(pBuffer); } } }
Получение сведений о регистрации поставщика
Функция BCryptQueryProviderRegistration используется для получения дополнительных сведений о поставщике, относящихся к регистрации. Эта функция принимает имя поставщика, для которого требуется получить сведения, требуемый режим поставщика (режим ядра, пользовательский режим или оба) и идентификатор интерфейса поставщика для получения сведений о регистрации. Например, чтобы получить сведения о регистрации в пользовательском режиме для интерфейса шифра для поставщика Microsoft Primitive Provider, выполните вызов, аналогичный приведенному ниже.
BCryptQueryProviderRegistration(
MS_PRIMITIVE_PROVIDER,
CRYPT_UM,
BCRYPT_CIPHER_INTERFACE,
//...
);
Как и функция BCryptEnumRegisteredProviders , функция BCryptQueryProviderRegistration может выделить память для вас или выделить память самостоятельно. Процесс одинаков для двух функций.