COPP 状態要求の送信
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]
認定出力保護プロトコル (COPP) 状態要求を送信するには、 AMCOPPStatusInput 構造体に要求データを入力します。 構造体のメンバーは次のとおりです。
- rApp。 GUID として入力された 128 ビットの乱数。 ドライバーの応答で同じ数値が返されます。 ヒープに乱数を割り当ててから、構造体にコピーする必要があります。 これにより、攻撃者が AMCOPPStatusInput 構造体の内容を変更する攻撃から保護されます。
- guidStatusRequestID。 要求を識別する GUID。 「COPP クエリ リファレンス」を参照してください。
- dwSequence。 状態シーケンス番号。 各状態要求の後にこの値をインクリメントします。 (「 COPP セッションの開始」セクションでは、この値はコード例の uStatusSeq として表示されます)。
- cbSizeData。 要求に必要な追加データのサイズ (バイト単位)。
- StatusData。 状態要求のデータ。
AMCOPPStatusInput 構造体を IAMCertifiedOutputProtection::P rotectionStatus メソッドに渡します。 たとえば、次のコードは、使用可能な保護メカニズムを照会する状態要求を送信します。
AMCOPPStatusInput input;
AMCOPPStatusOutput output;
// Create a 128-bit random number.
GUID *pGuid = new GUID();
if (pGuid == NULL)
{
// Handle out-of-memory condition.
}
CryptGenRandom(hCSP, sizeof(GUID), (BYTE*)pGuid);
// Copy the random number into the command structure.
memcpy(&input.rApp, pGuid, sizeof(GUID));
// Fill in the other data.
input.guidStatusRequestID = DXVA_COPPQueryProtectionType; // Request type.
input.dwSequence = uStatusSeq; // Status sequence number.
input.cbSizeData = 0 // No other data for this query.
// Send the request.
hr = pCOPP->ProtectionStatus(&input, &output);
// Increment the sequence number each time.
++uStatusSeq;
応答は、 AMCOPPStatusOutput 構造体の COPPStatus メンバーに書き込まれます。 応答内の有効なデータのサイズは、 cbSizeData メンバーで指定されます。 メッセージの整合性を確保するために、ドライバーは OMAC 1 アルゴリズムを使用してメッセージ認証コード (MAC) を計算し、構造体の macKDI メンバーでこの値を返します。 アプリケーションでは、次のようにこの値を確認する必要があります。
- AMCOPPStatusOutput 構造体の macKDI メンバーの後に表示されるデータ ブロックの OMAC タグを計算します (つまり、cbSizeData と COPPStatus)。
- ストレート memcmp を使用して、このタグを macKDI の値と比較します。
OMAC 1 アルゴリズムの詳細については、 を参照 https://www.nuee.nagoya-u.ac.jp/labs/tiwata/omac/omac.htmlしてください。 COPP では、次の OMAC-1 パラメーターが使用されます。
- E = AES
- t = 128 ビット
状態要求から返されるデータは、常に 2 つの項目で始まります。
- アプリケーションによって渡された rApp の値と同じです。 この値がヒープに格納されている元の値と一致することを確認する必要があります。
- 出力保護の状態が変更されたかどうかを示す COPP_StatusFlags 値。
接続が失われたり再構成されたりする可能性があるため、アプリケーションはドライバーの現在の状態を定期的にポーリングする必要があります。 COPP_RenegotiationRequired フラグが設定されている場合、アプリケーションは保護レベルのリセットを試みる必要があります。 COPP_LinkLost フラグが設定されている場合、アプリケーションはコンテンツの再生を停止する必要があります。 たとえば、ユーザーが出力コネクタを切断したため、COPP_LinkLost フラグを返すことができます。 アプリケーションは、VMR の現在のインスタンスを解放し、VMR の新しいインスタンスを作成し、新しい COPP セッション (キー交換と証明書の検証を含む) を確立する必要があります。
関連トピック