Share via


Uso de las características de configuración de criptografía de CNG

La API de CNG proporciona funciones para enumerar y obtener información sobre los proveedores registrados.

Enumeración de proveedores

La función BCryptEnumRegisteredProviders se usa para enumerar los proveedores registrados. La función BCryptEnumRegisteredProviders se puede llamar de una de estas dos maneras:

  1. La primera consiste en que la función BCryptEnumRegisteredProviders asigne la memoria. Esto se logra pasando la dirección de un puntero NULL para el parámetro ppBuffer . Este código asignará la memoria necesaria para la estructura de CRYPT_PROVIDERS y las cadenas asociadas. Cuando la función BCryptEnumRegisteredProviders se usa de esta manera, debe liberar la memoria cuando ya no sea necesaria pasando ppBuffer a la función BCryptFreeBuffer .

    En el ejemplo siguiente se muestra cómo usar la función BCryptEnumRegisteredProviders para asignar automáticamente el búfer.

    #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. El segundo método es asignar la memoria necesaria usted mismo. Esto se logra mediante una llamada a la función BCryptEnumRegisteredProviders con NULL para el parámetro ppBuffer . La función BCryptEnumRegisteredProviders colocará en el valor al que apunta el parámetro pcbBuffer , el tamaño necesario, en bytes, de la estructura CRYPT_PROVIDERS y todas las cadenas. A continuación, asigne la memoria necesaria y pase la dirección de este puntero de búfer para el parámetro ppBuffer en una segunda llamada a la función BCryptEnumRegisteredProviders .

    En el ejemplo siguiente se muestra cómo usar la función BCryptEnumRegisteredProviders para asignar y usar su propio búfer.

    #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);
            }
        }
    }
    
    

Obtención de información de registro del proveedor

La función BCryptQueryProviderRegistration se usa para obtener información adicional específica del registro sobre un proveedor. Esta función toma el nombre del proveedor para el que desea obtener información, el modo de proveedor deseado (modo kernel, modo de usuario o ambos) y el identificador de la interfaz del proveedor para recuperar la información de registro. Por ejemplo, para obtener la información de registro del modo de usuario para la interfaz de cifrado del proveedor "Proveedor primitivo de Microsoft", realizaría una llamada similar a la siguiente.

BCryptQueryProviderRegistration(
    MS_PRIMITIVE_PROVIDER,
    CRYPT_UM,
    BCRYPT_CIPHER_INTERFACE,
    //...
    );

Al igual que la función BCryptEnumRegisteredProviders , la función BCryptQueryProviderRegistration puede asignar memoria automáticamente o puede asignar la memoria usted mismo. El proceso es el mismo para las dos funciones.