Utilisation des fonctionnalités de configuration du chiffrement de CNG

L’API CNG fournit des fonctions permettant d’énumérer et d’obtenir des informations sur les fournisseurs inscrits.

Énumération des fournisseurs

Vous utilisez la fonction BCryptEnumRegisteredProviders pour énumérer les fournisseurs inscrits. La fonction BCryptEnumRegisteredProviders peut être appelée de deux façons :

  1. La première consiste à affecter la mémoire à la fonction BCryptEnumRegisteredProviders . Pour ce faire, transmettez l’adresse d’un pointeur NULL pour le paramètre ppBuffer . Ce code alloue la mémoire requise pour la structure CRYPT_PROVIDERS et les chaînes associées. Lorsque la fonction BCryptEnumRegisteredProviders est utilisée de cette manière, vous devez libérer la mémoire quand elle n’est plus nécessaire en passant ppBuffer à la fonction BCryptFreeBuffer .

    L’exemple suivant montre comment utiliser la fonction BCryptEnumRegisteredProviders pour allouer la mémoire tampon pour vous.

    #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. La deuxième méthode consiste à allouer vous-même la mémoire requise. Pour ce faire, appelez la fonction BCryptEnumRegisteredProviders avec NULL pour le paramètre ppBuffer . La fonction BCryptEnumRegisteredProviders place dans la valeur pointée par le paramètre pcbBuffer , la taille requise, en octets, de la structure CRYPT_PROVIDERS et de toutes les chaînes. Vous allouez ensuite la mémoire requise et transmettez l’adresse de ce pointeur de mémoire tampon pour le paramètre ppBuffer dans un deuxième appel à la fonction BCryptEnumRegisteredProviders .

    L’exemple suivant montre comment utiliser la fonction BCryptEnumRegisteredProviders pour allouer et utiliser votre propre mémoire tampon.

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

Obtention des informations d’inscription du fournisseur

La fonction BCryptQueryProviderRegistration permet d’obtenir des informations supplémentaires spécifiques à l’inscription sur un fournisseur. Cette fonction prend le nom du fournisseur pour lequel vous souhaitez obtenir des informations, le mode fournisseur souhaité (mode noyau, mode utilisateur ou les deux) et l’identificateur de l’interface du fournisseur pour laquelle récupérer les informations d’inscription. Par exemple, pour obtenir les informations d’inscription en mode utilisateur pour l’interface de chiffrement du fournisseur « Fournisseur primitif Microsoft », vous devez effectuer un appel similaire à ce qui suit.

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

Comme la fonction BCryptEnumRegisteredProviders , la fonction BCryptQueryProviderRegistration peut allouer de la mémoire pour vous ou vous-même. Le processus est le même pour les deux fonctions.