DirectX Video Accelerator 2.0 디코더에서 암호화 세션 사용

이 섹션은 Windows 7 이상 및 Windows Server 2008 R2 이상 버전의 Windows 운영 체제에만 적용됩니다.

사용자 모드 표시 드라이버는 암호화 세션을 DIRECTX VA(Video Accelerator) 2.0 디코딩 디바이스와 연결하여 DirectX VA 2.0 디코딩 디바이스가 암호화 세션의 세션 키를 사용하도록 할 수 있습니다. 런타임이 드라이버의 CreateCryptoSession 함수를 호출하여 암호화 세션을 만들 때 Direct3D 런타임이 D3DDDIARG_CREATECRYPTOSESSION 구조체의 DecodeProfile 멤버에 유효한 디코딩 GUID를 지정하는 경우 런타임은 이후에 directX VA 2.0 디코딩 디바이스로 암호화 세션을 구성하도록 설정된 D3DAUTHETICATEDCONFIGURE_CRYPTOSESSION 사용하여 드라이버의 ConfigureAuthenticatedChannel 함수를 호출할 수 있습니다. DirectX VA 2.0 디코딩 디바이스를 사용하여 암호화 세션을 구성하기 전에 런타임은 드라이버의 DecodeExtensionExecute 함수를 호출하여 DirectX VA 2.0 디코딩 디바이스에 대한 드라이버 핸들을 검색해야 합니다. 런타임은 directX VA 2.0 디코딩 디바이스에 대한 드라이버 핸들을 검색하기 위해 D3DDDIARG_DECODEEXTENSIONEXECUTE 구조체의 멤버를 다음 값으로 설정합니다.

#define DXVA2_DECODE_GET_DRIVER_HANDLE    0x725
D3DDDIARG_DECODEEXTENSIONEXECUTE.Function = DXVA2_DECODE_GET_DRIVER_HANDLE;
D3DDDIARG_DECODEEXTENSIONEXECUTE.pPrivateInput->pData = NULL;
D3DDDIARG_DECODEEXTENSIONEXECUTE.pPrivateInput->DataSize = 0;
D3DDDIARG_DECODEEXTENSIONEXECUTE.pPrivateOutput->pData = HANDLE*;
D3DDDIARG_DECODEEXTENSIONEXECUTE.pPrivateOutput->DataSize = sizeof(HANDLE);

런타임이 드라이버의 CreateDecodeDevice 함수를 호출하여 DirectX VA 2.0 디코딩 디바이스를 만들 때 런타임은 DXVADDI_CONFIGPICTUREDECODE 구조 내의 디코드 암호화 GUID에 대해 0을 지정합니다.

런타임이 암호화 세션을 만들기 위해 D3DCRYPTOTYPE_AES128_CTR 설정된 D3DDDIARG_CREATECRYPTOSESSION 구조체의 CryptoType 멤버를 사용하여 드라이버의 CreateCryptoSession 함수를 호출한 후 프레임을 디코딩하는 드라이버의 DecodeBeginFrame 함수 호출에서 D3DDDIARG_DECODEBEGINFRAME 구조체의 pPVPSetKey 멤버 설정은 다음과 같은 의미를 나타냅니다.

  • pPVPSetKeyNULL로 설정된 경우 프레임에 대한 버퍼 중 암호화된 데이터가 포함되지 않으므로 암호 해독이 필요하지 않습니다.

  • pPVPSetKey가 NULL_GUID 가리키는 경우(모두 0) 프레임의 버퍼는 세션 키로 암호화됩니다.

  • pPVPSetKey가 콘텐츠 키를 가리키는 경우 애플리케이션이 세션 키를 사용하여 콘텐츠 키를 암호화했음을 나타냅니다. 드라이버는 이 콘텐츠 키를 사용하여 이 프레임과 연결된 모든 암호화된 버퍼의 암호를 해독해야 합니다.

암호화된 각 버퍼의 초기화 벡터는 드라이버의 DecodeExecute 함수에 대한 호출에서 DXVADDI_DECODEBUFFERDESC 구조체의 pCipherCounter 멤버에 나타납니다. 드라이버는 초기화 벡터가 이전에 동일한 콘텐츠 키(또는 콘텐츠 키를 사용하지 않는 경우 세션 키)에 사용되었다고 판단되면 DecodeExecute 함수에 대한 호출에 실패해야 합니다. 애플리케이션은 애플리케이션이 암호화하는 각 버퍼에 대해 DXVADDI_PVP_HW_IVIV 멤버를 증가시켜야 합니다. 따라서 IV 멤버가 DecodeExecute에 전달된 이전 IV 값보다 작거나 같으면 드라이버의 DecodeExecute 함수가 실패할 수 있습니다.

런타임이 버퍼를 부분적으로 암호화해야 하는 경우 드라이버의 DecodeExtensionExecute 함수를 호출하고 D3DDDIARG_DECODEEXTENSIONEXECUTE 구조체의 멤버를 다음 값으로 설정하여 드라이버가 암호화해야 하는 블록을 지정합니다.

#define DXVA2_DECODE_SPECIFY_ENCRYPTED_BLOCKS    0x724
D3DDDIARG_DECODEEXTENSIONEXECUTE.Function = DXVA2_DECODE_SPECIFY_ENCRYPTED_BLOCKS;
D3DDDIARG_DECODEEXTENSIONEXECUTE.pPrivateInput->pData = D3DENCRYPTED_BLOCK_INFO*;
D3DDDIARG_DECODEEXTENSIONEXECUTE.pPrivateInput->DataSize = sizeof(D3DENCRYPTED_BLOCK_INFO);
D3DDDIARG_DECODEEXTENSIONEXECUTE.pPrivateOutput->pData = NULL;
D3DDDIARG_DECODEEXTENSIONEXECUTE.pPrivateOutput->DataSize = 0;