使用 CNG 的加密配置功能
CNG API 提供用于枚举和获取有关已注册提供程序的信息的函数。
枚举提供程序
使用 BCryptEnumRegisteredProviders 函数枚举已注册的提供程序。 可以通过以下两种方式之一调用 BCryptEnumRegisteredProviders 函数:
第一个是让 BCryptEnumRegisteredProviders 函数分配内存。 这是通过为 ppBuffer 参数传递 NULL 指针的地址来实现的。 此代码将分配 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); } }
第二种方法是自行分配所需的内存。 这是通过为 ppBuffer 参数调用具有 NULL 的 BCryptEnumRegisteredProviders 函数来实现的。 BCryptEnumRegisteredProviders 函数将放置在CRYPT_PROVIDERS结构和所有字符串的所需大小(以字节为单位)的CRYPT_PROVIDERS参数所指向的值中。 然后,在第二次调用 BCryptEnumRegisteredProviders 函数时,分配所需的内存并将此缓冲区指针的地址传递给 ppBuffer 参数。
以下示例演示如何使用 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 函数可以为你分配内存,也可以自行分配内存。 这两个函数的过程相同。