DirectX ビデオ アクセラレータ 2.0 デコーダーでの暗号化セッションの使用
このセクションは、Windows 7 以降、および Windows Server 2008 R2 以降のバージョンの Windows オペレーティング システムのみを対象としています。
ユーザー モード ディスプレイ ドライバーは、暗号化セッションを DirectX ビデオ アクセラレータ (VA) 2.0 デコード デバイスに関連付けて、DirectX VA 2.0 デコード デバイスが暗号化セッションのセッション キーを使用するようにすることができます。 Direct3D ランタイムがドライバーの CreateCryptoSession 関数を呼び出して暗号化セッションを作成するときに、DecodeProfile (D3DDDIARG_CREATECRYPTOSESSION 構造体のメンバー) で有効なデコード GUID を指定した場合、ランタイムは後でドライバーの CreateCryptoSession 関数を呼び出して暗号化セッションを作成でき、それ以降は 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 にゼロを指定します。
ランタイムが、ドライバーの CreateCryptoSession 関数を (CryptoType メンバー (D3DDDIARG_CREATECRYPTOSESSION 構造体のメンバー) を D3DCRYPTOTYPE_AES128_CTR に設定して) 呼び出して暗号化セッションを作成した後、pPVPSetKey メンバー (D3DDDIARG_DECODEBEGINFRAME 構造体のメンバー) の設定は、フレームをデコードするためのドライバーの DecodeBeginFrame 関数の呼び出しは、次の意味を示します。
pPVPSetKey が NULL に設定されている場合、フレームのバッファーには暗号化されたデータが含まれていないため、暗号化解除は必要ありません。
pPVPSetKey がNULL_GUID (すべてゼロ) を指している場合、フレームのバッファーはセッション キーで暗号化されます。
pPVPSetKey がコンテンツ キーを指している場合は、アプリケーションがセッション キーを使用してコンテンツ キーを暗号化したことを示します。 ドライバーは、このフレームに関連付けられているすべての暗号化されたバッファーの暗号化を解除するには、このコンテンツ キーを使用する必要があります。
暗号化された各バッファーの初期化ベクトルは、ドライバーの pCipherCounter メンバー (DXVADDI_DECODEBUFFERDESC 構造体のメンバー) に (ドライバーの DecodeExecute 関数が呼び出されたときに) 表示されます。 ドライバーは、初期化ベクターが以前に同じコンテンツ キー (またはコンテンツ キーが使用されていない場合はセッション キー) に使用されていたと判断した場合、DecodeExecute 関数の呼び出しを失敗させる必要があります。 アプリケーションは、アプリケーションが暗号化するバッファーごとに、IV メンバー (DXVADDI_PVP_HW_IV のメンバー) をインクリメントする必要があります。 そのため、ドライバーの DecodeExecute 関数は、IV メンバーが前の 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;