使用 CNG 的密碼編譯組態功能

CNG API 提供函式來列舉及取得已註冊提供者的相關資訊。

列舉提供者

您可以使用 BCryptEnumRegisteredProviders 函式來列舉已註冊的提供者。 BCryptEnumRegisteredProviders函式可以下列兩種方式之一呼叫:

  1. 第一個是讓 BCryptEnumRegisteredProviders 函 式配置記憶體。 這可藉由傳遞ppBuffer參數的Null指標位址來完成。 此程式碼會配置 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. 第二種方法是自行配置所需的記憶體。 這可藉由針對ppBuffer參數呼叫具有NullBCryptEnumRegisteredProviders函式來完成。 BCryptEnumRegisteredProviders函式會放在由CRYPT_PROVIDERS結構和所有字串CRYPT_PROVIDERS所需的大小,以位元組為單位的值中。 接著,您會配置必要的記憶體,並在第二次呼叫BCryptEnumRegisteredProviders函式中傳遞ppBuffer參數的這個緩衝區指標位址。

    下列範例示範如何使用 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 函式可以為您配置記憶體,也可以自行配置記憶體。 這兩個函式的程式相同。