Share via


CNG の暗号化構成機能の使用

CNG API には、登録済みプロバイダーに関する情報を列挙して取得する関数が用意されています。

プロバイダーの列挙

BCryptEnumRegisteredProviders 関数を使用して、登録済みプロバイダーを列挙します。 BCryptEnumRegisteredProviders 関数は、次の 2 つの方法のいずれかで呼び出すことができます。

  1. 1 つ目は、 BCryptEnumRegisteredProviders 関数に メモリを割り当てることです。 これは、ppBuffer パラメーターの NULL ポインターのアドレスを渡すことによって実現されます。 このコードは、 CRYPT_PROVIDERS 構造体と関連付けられた文字列に必要なメモリを割り当てます。 この方法で BCryptEnumRegisteredProviders 関数を使用する場合は、 ppBufferBCryptFreeBuffer 関数に渡すことによって不要になったときにメモリを解放する必要があります。

    次の例は、 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. 2 つ目の方法は、必要なメモリを自分で割り当てることです。 これを行うには、ppBuffer パラメーターに NULL を指定して BCryptEnumRegisteredProviders 関数を呼び出します。 BCryptEnumRegisteredProviders 関数は、pcbBuffer パラメーターによって指される値、必要なサイズ (バイト単位) のCRYPT_PROVIDERS構造体とすべての文字列に配置されます。 次に、BCryptEnumRegisteredProviders 関数の 2 回目の呼び出しで、必要なメモリを割り当て、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 関数はメモリを割り当てることも、自分でメモリを割り当てることもできます。 このプロセスは、2 つの関数で同じです。