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 aufzählen zu können. Die Funktion BCryptEnumRegisteredProviders kann auf zwei Arten aufgerufen werden:

  1. Der erste besteht darin, dass die Funktion BCryptEnumRegisteredProviders den Speicher zugewiesen hat. Dadurch wird die Adresse eines NULL-Zeigers für den ppBuffer-Parameter übergeben. Dieser Code weist den Arbeitsspeicher zu, der für die CRYPT_PROVIDERS Struktur und die zugeordneten Zeichenfolgen erforderlich ist. Wenn die BCryptEnumRegisteredProviders-Funktion auf diese Weise verwendet wird, müssen Sie den Speicher freizugeben, wenn sie nicht mehr benötigt wird, indem Sie ppBuffer an die BCryptFreeBuffer-Funktion übergeben.

    Im folgenden Beispiel wird gezeigt, wie Sie die Funktion BCryptEnumRegisteredProviders 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 Sie die Funktion BCryptEnumRegisteredProviders mit NULL für den ppBuffer-Parameter aufrufen. Die Funktion BCryptEnumRegisteredProviders wird im Wert platziert, der durch den PcbBuffer-Parameter , die erforderliche Größe in Bytes der CRYPT_PROVIDERS Struktur und aller Zeichenfolgen verweist. Anschließend weisen Sie den erforderlichen Arbeitsspeicher zu und übergeben die Adresse dieses Pufferzeigers für den ppBuffer-Parameter in einem zweiten Aufruf der Funktion BCryptEnumRegisteredProviders .

    Im folgenden Beispiel wird gezeigt, wie Sie die Funktion BCryptEnumRegisteredProviders verwenden, um Ihren eigenen Puffer zuzuweisen 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 Anbieterregistrierungsinformationen

Die Funktion BCryptQueryProviderRegistration wird verwendet, um zusätzliche, registrierungsspezifische Informationen zu einem Anbieter zu erhalten. 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, um die Registrierungsinformationen abzurufen. Um beispielsweise die Registrierungsinformationen für den Benutzermodus für die Verschlüsselungsschnittstelle für den Anbieter "Microsoft Primitive Provider" abzurufen, würden Sie einen Aufruf ähnlich wie folgt vornehmen.

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

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