다음을 통해 공유


CNG의 암호화 구성 기능 사용

CNG API는 등록된 공급자에 대한 정보를 열거하고 가져오는 함수를 제공합니다.

공급자 열거

BCryptEnumRegisteredProviders 함수를 사용하여 등록된 공급자를 열거합니다. BCryptEnumRegisteredProviders 함수는 다음 두 가지 방법 중 하나로 호출할 수 있습니다.

  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. 두 번째 방법은 필요한 메모리를 직접 할당하는 것입니다. 이 작업은 ppBuffer 매개 변수에 대해 NULL을 사용하여 BCryptEnumRegisteredProviders 함수를 호출하여 수행됩니다. BCryptEnumRegisteredProviders 함수는 CRYPT_PROVIDERS 구조체 및 모든 문자열의 pcbBuffer 매개 변수, 필요한 크기(바이트)가 가리키는 값에 배치됩니다. 그런 다음 필요한 메모리를 할당하고 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 기본 공급자" 공급자의 암호 인터페이스에 대한 사용자 모드 등록 정보를 얻으려면 다음과 유사한 호출을 수행합니다.

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

BCryptEnumRegisteredProviders 함수와 마찬가지로 BCryptQueryProviderRegistration 함수는 메모리를 할당하거나 직접 메모리를 할당할 수 있습니다. 프로세스는 두 함수에 대해 동일합니다.