Поделиться через


Использование функций конфигурации шифрования CNG

API CNG предоставляет функции для перечисления и получения сведений о зарегистрированных поставщиках.

Перечисление поставщиков

Для перечисления зарегистрированных поставщиков используется функция BCryptEnumRegisteredProviders . Функцию BCryptEnumRegisteredProviders можно вызвать одним из двух способов:

  1. Во-первых, функция 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);
        }
    }
    
    
  2. Второй метод — выделить необходимую память самостоятельно. Для этого вызовите функцию 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 может выделить память для вас или выделить память самостоятельно. Процесс одинаков для двух функций.