Verwenden der Kryptografiekonfigurationsfeatures von CNG

Die CNG-API bietet Funktionen zum Aufzählen und Abrufen von Informationen zu registrierten Anbietern.

Auflisten von Anbietern

Sie verwenden die Funktion BCryptEnumRegisteredProviders , um die registrierten Anbieter aufzulisten. Die BCryptEnumRegisteredProviders-Funktion kann auf eine von zwei Arten aufgerufen werden:

  1. Die erste besteht darin, dass die Funktion BCryptEnumRegisteredProviders den Arbeitsspeicher ordnet. Dies wird erreicht, indem die Adresse eines NULL-Zeigers für den ppBuffer-Parameter übergeben wird. Mit diesem Code wird der für die CRYPT_PROVIDERS-Struktur erforderliche Arbeitsspeicher und die zugehörigen Zeichenfolgen zugeordnet. Wenn die Funktion BCryptEnumRegisteredProviders auf diese Weise verwendet wird, müssen Sie den Arbeitsspeicher freigeben, wenn er nicht mehr benötigt wird, indem Sie ppBuffer an die Funktion BCryptFreeBuffer übergeben.

    Das folgende Beispiel zeigt, wie Sie die BCryptEnumRegisteredProviders-Funktion verwenden, um den Puffer für Sie zuzuweisen.

    #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. Die zweite Methode besteht darin, den erforderlichen Arbeitsspeicher selbst zuzuweisen. Dies wird erreicht, indem die BCryptEnumRegisteredProviders-Funktion mit NULL für den ppBuffer-Parameter aufgerufen wird. Die BCryptEnumRegisteredProviders-Funktion platziert den Wert, auf den der parameter pcbBuffer verweist, die erforderliche Größe der CRYPT_PROVIDERS-Struktur und alle Zeichenfolgen in Bytes. Anschließend ordnen Sie den erforderlichen Arbeitsspeicher zu und übergeben die Adresse dieses Pufferzeigers für den ppBuffer-Parameter in einem zweiten Aufruf der BCryptEnumRegisteredProviders-Funktion .

    Das folgende Beispiel zeigt, wie Sie die BCryptEnumRegisteredProviders-Funktion verwenden, um Ihren eigenen Puffer zuzuordnen und zu verwenden.

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

Abrufen von Informationen zur Anbieterregistrierung

Die Funktion BCryptQueryProviderRegistration wird verwendet, um zusätzliche registrierungsspezifische Informationen zu einem Anbieter abzurufen. Diese Funktion verwendet den Namen des Anbieters, für den Sie Informationen abrufen möchten, den gewünschten Anbietermodus (Kernelmodus, Benutzermodus oder beides) und den Bezeichner der Anbieterschnittstelle, für die die Registrierungsinformationen abgerufen werden sollen. Wenn Sie beispielsweise die Registrierungsinformationen für den Benutzermodus für die Verschlüsselungsschnittstelle für den Anbieter "Microsoft Primitive Provider" abrufen möchten, führen Sie einen Aufruf ähnlich dem folgenden aus.

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

Wie die BCryptEnumRegisteredProviders-Funktion kann die Funktion BCryptQueryProviderRegistration Entweder Arbeitsspeicher für Sie zuweisen oder Sie können den Speicher selbst zuordnen. Der Prozess ist für die beiden Funktionen identisch.