Usando os recursos de configuração de criptografia do CNG
A API CNG fornece funções para enumerar e obter informações sobre provedores registrados.
Enumerar provedores
Use a função BCryptEnumRegisteredProviders para enumerar os provedores registrados. A função BCryptEnumRegisteredProviders pode ser chamada de uma das duas maneiras:
A primeira é fazer com que a função BCryptEnumRegisteredProviders aloque a memória. Isso é feito passando o endereço de um ponteiro NULL para o parâmetro ppBuffer . Esse código alocará a memória necessária para a estrutura de CRYPT_PROVIDERS e as cadeias de caracteres associadas. Quando a função BCryptEnumRegisteredProviders for usada dessa maneira, você deverá liberar a memória quando ela não for mais necessária passando ppBuffer para a função BCryptFreeBuffer .
O exemplo a seguir mostra como usar a função BCryptEnumRegisteredProviders para alocar o buffer para você.
#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); } }
O segundo método é alocar a memória necessária por conta própria. Isso é feito chamando a função BCryptEnumRegisteredProviders com NULL para o parâmetro ppBuffer . A função BCryptEnumRegisteredProviders será colocada no valor apontado pelo parâmetro pcbBuffer , o tamanho necessário, em bytes, da estrutura CRYPT_PROVIDERS e todas as cadeias de caracteres. Em seguida, você aloca a memória necessária e passa o endereço desse ponteiro de buffer para o parâmetro ppBuffer em uma segunda chamada para a função BCryptEnumRegisteredProviders .
O exemplo a seguir mostra como usar a função BCryptEnumRegisteredProviders para alocar e usar seu próprio buffer.
#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); } } }
Obtendo informações de registro do provedor
A função BCryptQueryProviderRegistration é usada para obter informações adicionais específicas de registro sobre um provedor. Essa função usa o nome do provedor para o qual você deseja obter informações, o modo de provedor desejado (modo kernel, modo de usuário ou ambos) e o identificador da interface do provedor para o qual recuperar as informações de registro. Por exemplo, para obter as informações de registro do modo de usuário para a interface de criptografia do provedor "Provedor Primitivo da Microsoft", você faria uma chamada semelhante à seguinte.
BCryptQueryProviderRegistration(
MS_PRIMITIVE_PROVIDER,
CRYPT_UM,
BCRYPT_CIPHER_INTERFACE,
//...
);
Assim como a função BCryptEnumRegisteredProviders , a função BCryptQueryProviderRegistration pode alocar memória para você ou alocar a memória por conta própria. O processo é o mesmo para as duas funções.