Sdílet prostřednictvím


ochrana obsahu GPU-Based

Toto téma popisuje možnosti ochrany obsahu videa, které může grafický ovladač poskytnout.

Úvod

Následující diagram znázorňuje zjednodušené zobrazení toho, jak chráněný obsah videa prochází kanálem, který se má vykreslit.

diagram, který zobrazuje chráněný obsah videa.

Poznámka

Cesta k chráněnému médiu (PMP) není v tomto diagramu znázorněna. Tok dat, který je zde uvedený, může nastat v rámci procesu PMP nebo v rámci procesu aplikace.

Dekodér přijímá šifrovaná komprimovaná data videa z externího zdroje. Předpokládá se také, že dekodér přijímá kryptografický klíč k dešifrování těchto dat. Toto téma nepopisuje výměnu klíčů mezi zdrojem videa a dekodérem, ale PMP definuje jeden možný mechanismus. GPU není v této fázi zapojeno.

Pro hardwarově akcelerované dekódování předává softwarový dekodér komprimovaný obsah videa do GPU. Kvůli ochraně tohoto obsahu dekodér před předáním do hardwarového akcelerátoru přešifruje data, obvykle pomocí AES-CTR. Mechanismus výměny klíčů je definován mezi dekodérem a grafickým ovladačem.

Dekódované snímky videa jsou uložené v paměti videa, obecně v jasné podobě. V tomto okamžiku se rámce zpracovávají a pak zobrazují. Prezentace má dvě hlavní možnosti.

  • Snímky lze prezentovat pomocí překrytí hardwaru. Další informace naleznete v tématu Podpora překrytí hardwaru.
  • Snímky můžou prezentovat správa okna plochy (DWM) pomocí sdíleného povrchu.

Posledním krokem je zobrazení rámce na monitoru, který může vyžadovat ochranu propojení mezi grafickou kartou a zobrazovacím zařízením. Příkladem ochrany odkazů je High-Bandwidth ochrana digitálního obsahu (HDCP). Ochrana propojení se konfiguruje pomocí nástroje Output Protection Manager (OPM). Toto téma nepopisuje OPM; Další informace naleznete v tématu Použití nástroje Output Protection Manager.

Přehled procesu dekódování

Během hardwarového akcelerovaného dekódování musí softwarový dekodér předat komprimovaná video data grafické karty. U prémiového obsahu musí být tato data obvykle šifrovaná pomocí šifrování symetrického klíče před odesláním do GPU.

K šifrování videa pro dekódování používá softwarový dekodér následující rozhraní:

  • IDirectXVideoDecoder . Představuje dekodér DXVA zařízení, označované také jako akcelerátor.
  • IDirect3DCryptoSession9. Představuje kryptografickou relaci, která poskytuje šifrovací klíč.
  • IDirect3DAuthenticatedChannel9. Představuje ověřený kanál, který umožňuje softwarovému dekodéru přidružit kryptografickou relaci k dekodéru DXVA.

diagramu znázorňující rozhraní dekódování direct3d9

Všechna tato rozhraní jsou získána ze zařízení Direct3D následujícím způsobem:

Rozhraní Vytvoření
IDirectXVideoDecoder Volání IDirectXVideoDecoderService::CreateVideoDecoder. Dekodér DXVA zařízení je identifikován identifikátorem GUID profilu DXVA.
IDirect3DCryptoSession9 Volání IDirect3DDevice9Video::CreateCryptoSession.
IDirect3DAuthenticatedChannel9 Volání IDirect3DDevice9Video::CreateAuthenticatedChannel.

Poznámka

Pokud chcete získat ukazatel na rozhraní IDirect3DDevice9Video, zavolejte QueryInterface na zařízení D3D9Ex.

Ověřený kanál poskytuje důvěryhodný komunikační kanál mezi dekodérem softwaru a ovladačem. Komunikační kanál funguje takto:

  • Ovladač poskytuje řetěz certifikátů X.509, jehož kořenový certifikát podepsal Microsoft.
  • Certifikát obsahuje veřejný klíč RSA pro ovladač.
  • Softwarový dekodér používá veřejný klíč k odeslání 128bitového klíče relace AES ovladače.
  • Softwarový dekodér odesílá dotazy a příkazy do ověřeného kanálu.
  • Klíč relace slouží k výpočtu kódů ověřování zpráv (MAC) pro dotazy a příkazy. Ovladač pomocí řadičů MAC ověřuje integritu dat dotazu nebo příkazů a softwarový dekodér je používá k ověření integrity dat odpovědi z ovladače.

Šifrování komprimovaných vyrovnávacích pamětí videa pro dekodér

Tady je základní přehled procesu šifrování a dekódování:

  1. Softwarový dekodér přijímá datový proud šifrovaných dat ze zdroje videa. Dekodér dešifruje tento datový proud.

  2. Softwarový dekodér vyjedná klíč relace s kryptografickou relací.

  3. Softwarový dekodér používá ověřený kanál k přidružení kryptografické relace k dekodéru DXVA zařízení.

  4. Softwarový dekodér umístí komprimovaná data do vyrovnávacích pamětí DXVA, které získá z dekodéru DXVA zařízení (akcelerátor). Kodér softwaru pro chráněný obsah šifruje data, která se zařadí do vyrovnávacích pamětí DXVA, pomocí klíče relace pro šifrování.

    Poznámka

    Některé ovladače k šifrování používají klíč obsahu místo klíče relace. Klíč obsahu se může změnit z jednoho rámce na druhý.

  5. Dekodér odešle šifrované komprimované vyrovnávací paměti do akcelerátoru. Pro AES-CTR dekodér také předává inicializační vektor. Pokud se použije klíč obsahu, dekodér předá klíč obsahu zašifrovaný pomocí klíče relace.

Direct3D má standardní podporu 128bitového AES-CTR, ale je navržená tak, aby se rozšířila na další typy šifrování.

V následujících pěti částech najdete podrobnější kroky.

1. Dotaz na možnosti ochrany obsahu řidiče

Než se pokusíte použít šifrování, získejte možnosti ochrany obsahu ovladače.

  1. Získejte ukazatel na zařízení Direct3D 9.
  2. Volání QueryInterface pro rozhraní IDirect3DDevice9Video.
  3. Volání IDirect3DDevice9Video::GetContentProtectionCaps. Tato metoda vyplní strukturu D3DCONTENTPROTECTIONCAPS schopnostmi ochrany obsahu ovladače.

Podívejte se zejména na následující možnosti:

  • Pokud člen Caps obsahuje příznak D3DCPCAPS_SOFTWARE nebo D3DCPCAPS_HARDWARE, může ovladač provést šifrování.
  • Člen KeyExchangeType určuje, jak provést výměnu klíčů pro klíč relace.
  • Pokud člen Caps obsahuje příznak D3DCPCAPS_CONTENTKEY, ovladač k šifrování použije samostatný klíč obsahu. To je důležité při generování klíče relace.

Další možnosti jsou uvedené v členu Caps.

2. Konfigurace ověřeného kanálu

Dalším krokem je konfigurace ověřeného kanálu.

  1. Volání IDirect3DDevice9Video::CreateAuthenticatedChannel vytvoření ověřeného kanálu. U parametru ChannelType zadejte typ kanálu, který odpovídá schopnostem ovladače.

    • Typ D3DAUTHENTICATEDCHANNEL_DRIVER_SOFTWARE kanálu odpovídá D3DCPCAPS_SOFTWARE.
    • Typ D3DAUTHENTICATEDCHANNEL_DRIVER_HARDWARE kanálu odpovídá D3DCPCAPS_HARDWARE.

    Metoda CreateAuthenticatedChannel vrátí ukazatel na rozhraní IDirect3DAuthenticatedChannel9 spolu s popisovačem kanálu. Popisovač se použije později k přidružení kryptografické relace k ověřenému kanálu.

  2. Volání IDirect3DAuthenticatedChannel9::GetCertificateSize získat velikost certifikátu X.509 ovladače. Přidělte vyrovnávací paměť požadované velikosti.

  3. Zavolejte IDirect3DAuthenticatedChannel9::GetCertificate získat certifikát. Metoda zkopíruje certifikát do vyrovnávací paměti, která byla přidělena v předchozím kroku.

  4. Ověřte, že certifikát ovladače byl podepsán společností Microsoft a nebyl odvolán.

  5. Získejte veřejný klíč z certifikátu.

  6. Vygenerujte náhodný klíč relace RSA. Tento klíč relace slouží k podepisování dat odesílaných do ověřeného kanálu. Zašifrujte klíč relace pomocí veřejného klíče ovladače.

  7. Volání IDirect3DAuthenticatedChannel9::NegotiateKeyExchange pro odeslání šifrovaného klíče relace ovladači.

  8. Inicializace zabezpečeného kanálu následujícím způsobem:

    1. Vyplňte strukturu D3DAUTHENTICATEDCHANNEL_CONFIGUREINITIALIZE, jak je popsáno v dokumentaci.
    2. Odešle D3DAUTHENTICATEDCONFIGURE_INITIALIZE příkaz voláním IDirect3DAuthenticatedChannel9::Configure, jak je popsáno v části Odesílání příkazů ověřeného kanálu. Tento příkaz obsahuje počáteční pořadová čísla pro příkazy a dotazy odeslané do ověřeného kanálu.
  9. Ověřte typ kanálu odesláním dotazu D3DAUTHENTICATEDQUERY_CHANNELTYPE do ověřeného kanálu, jak je popsáno v části Odesílání dotazů ověřených kanálů. Zkontrolujte, že typ kanálu odpovídá tomu, co jste zadali v metodě CreateAuthenticatedChannel.

3. Konfigurace kryptografické relace

Dále nakonfigurujte kryptografickou relaci a vytvořte klíč relace.

  1. Volání IDirect3DDevice9Video::CreateCryptoSession vytvořit kryptografickou relaci. Tato metoda vrátí ukazatel na rozhraní IDirect3DCryptoSession9 a spolu s popisovačem kryptografické relace.
  2. Volání IDirect3DCryptoSession9::GetCertificateSize získat velikost certifikátu X.509 ovladače. Přidělte vyrovnávací paměť požadované velikosti.
  3. Zavolejte IDirect3DCryptoSession9::GetCertificate získat certifikát. Metoda zkopíruje certifikát do vyrovnávací paměti, která byla přidělena v předchozím kroku.
  4. Ověřte, že certifikát ovladače byl podepsán společností Microsoft a nebyl odvolán.
  5. Získejte veřejný klíč z certifikátu.
  6. Vygenerujte náhodný klíč relace RSA. Jedná se o samostatný klíč relace od klíče relace ověřeného kanálu. Zašifrujte klíč relace pomocí veřejného klíče ovladače.
  7. Volání IDirect3DCryptoSession9::NegotiateKeyExchange k odeslání šifrovaného klíče relace ovladači.
  8. Pokud možnosti ochrany obsahu zahrnují D3DCPCAPS_CONTENTKEY, vytvořte náhodný klíč obsahu RSA. Použije se později v procesu dekódování.

4. Získání úchytu k dekodéru DXVA zařízení

V dalším kroku budete potřebovat popisovač zařízení dekodéru DXVA. Pokud chcete tento popisovač získat, vyplňte strukturu DXVA2_DecodeExecuteParams následujícím způsobem:

HANDLE hDecodeDeviceHandle;

DXVA2_DecodeExecuteParams execParams = {0};
DXVA2_DecodeExtensionData ExtensionExecute = {0};
    
execParams.NumCompBuffers = 0;
execParams.pCompressedBuffers = NULL;
execParams.pExtensionData = &ExtensionExecute;

ExtensionExecute.Function = DXVA2_DECODE_GET_DRIVER_HANDLE;
ExtensionExecute.pPrivateInputData = NULL;
ExtensionExecute.PrivateInputDataSize = 0;
ExtensionExecute.pPrivateOutputData = &hDecodeDeviceHandle;
ExtensionExecute.PrivateOutputDataSize = sizeof(HANDLE);

Nastavte pExtensionData člen struktury DXVA2_DecodeExecuteParams na adresu struktury DXVA2_DecodeExtensionData.

Ve struktuře DXVA2_DecodeExtensionData nastavte DXVA2_DECODE_GET_DRIVER_HANDLEčlen funkce . Nastavte pPrivateOutputData na adresu vyrovnávací paměti, která je dostatečně velká k uložení hodnoty HANDLE. (V předchozím příkladu je tato vyrovnávací paměť hDecodeDeviceHandle proměnnou.)

Potom zavolejte IDirectXVideoDecoder::Execute a předejte adresu struktury DXVA2_DecodeExecuteParams. Popisovač dekodéru DXVA se vrátí v pPrivateOutputData.

5. Přidružení dekodéru DXVA k kryptografické relaci

Dále přidružte dekódovací zařízení DXVA k zařízení Direct3D a kryptografické relaci následujícím způsobem:

  1. Získejte popisovač k dekodéru DXVA, jak je popsáno v předchozí části.
  2. Získejte popisovač zařízení Direct3D odesláním dotazu D3DAUTHENTICATEDQUERY_DEVICEHANDLE do ověřeného kanálu.
  3. Do struktury D3DAUTHENTICATEDCHANNEL_CONFIGURECRYPTOSESSION zadejte následující informace:
    • Nastavte DXVA2DecodeHandle člen na popisovač zařízení dekodéru DXVA.
    • Nastavte CryptoSessionHandle člen na popisovač kryptografické relace. Tento popisovač je vrácen IDirect3DDevice9Video::CreateCryptoSession metoda.
    • Nastavte DeviceHandle člen na popisovač zařízení Direct3D.
  4. Volání IDirect3DAuthenticatedChannel9::Configure odeslat D3DAUTHENTICATEDCONFIGURE_CRYPTOSESSION příkaz do ověřeného kanálu.

Následující diagram znázorňuje výměnu popisovačů:

diagramu, který ukazuje, jak je dekodér dxva přidružený k kryptografické relaci.

Softwarový dekodér teď může použít kryptografický klíč relace k šifrování komprimovaných vyrovnávacích pamětí videa. Každá komprimovaná vyrovnávací paměť bude mít vlastní inicializační vektor (IV) zadaný v pvPVPState člen struktury DXVA2_DecodeBufferDesc.

Odesílání příkazů ověřeného kanálu

Sada příkazů je definována pro konfiguraci ověřeného kanálu a nastavení různých ochrany obsahu. Seznam příkazů najdete v tématu Příkazy ochrany obsahu.

Pokud chcete odeslat příkaz do ověřeného kanálu, proveďte následující kroky.

  1. Vyplňte vstupní datovou strukturu. Tato datová struktura je vždy D3DAUTHENTICATEDCHANNEL_CONFIGURE_INPUT struktura následovaná dalšími poli. Vyplňte strukturu D3DAUTHENTICATEDCHANNEL_CONFIGURE_INPUT, jak je znázorněno v následující tabulce.
Člen Popis
omac Prozatím toto pole přeskočte.
ConfigureType IDENTIFIKÁTOR GUID, který identifikuje příkaz. Seznam příkazů najdete v tématu Příkazy ochrany obsahu.
hChannel Popisovač ověřeného kanálu.
SequenceNumber Pořadové číslo. První pořadové číslo je určeno odesláním příkazu D3DAUTHENTICATEDCONFIGURE_INITIALIZE. Pokaždé, když odešlete jiný příkaz, navyšte toto číslo o 1. Pořadové číslo chrání před útoky přehrávanými útoky. Poznámka: se používají dvě samostatná pořadová čísla, jedna pro příkazy a jedna pro dotazy.
  1. Vypočítat značku OMAC pro blok dat, která se zobrazí za omac člen vstupní struktury. Potom tuto hodnotu značky zkopírujte do člena omac.
  2. Volání IDirect3DAuthenticatedChannel9::Konfigurace.
  3. Ovladač umístí výstup příkazu do struktury D3DAUTHENTICATEDCHANNEL_CONFIGURE_OUTPUT.
  4. Vypočítat značku OMAC pro blok dat, která se zobrazí za omac člen výstupní struktury. Porovnejte to s hodnotou člena omac. Pokud se neshodují, nezdaří se.
  5. Porovnejte hodnoty ConfigureType, hChannela SequenceNumber členů ve výstupní struktuře s hodnotami pro tyto členy. Pokud se neshodují, nezdaří se.
  6. Zvýší pořadové číslo pro další příkaz.

Odesílání dotazů ověřených kanálů

Sada dotazů je definována pro načtení informací o ověřeném kanálu. Seznam dotazů najdete v tématu Dotazy ochrany obsahu.

Pokud chcete odeslat příkaz do ověřeného kanálu, proveďte následující kroky.

  1. Vyplňte vstupní datovou strukturu. Tato datová struktura je vždy D3DAUTHENTICATEDCHANNEL_QUERY_INPUT strukturou, za kterou může následovat další pole. Vyplňte strukturu D3DAUTHENTICATEDCHANNEL_QUERY_INPUT, jak je znázorněno v následující tabulce.
Člen Popis
QueryType IDENTIFIKÁTOR GUID, který identifikuje dotaz. Seznam dotazů najdete v tématu Dotazy ochrany obsahu.
hChannel Popisovač ověřeného kanálu.
SequenceNumber Pořadové číslo. První pořadové číslo je určeno odesláním příkazu D3DAUTHENTICATEDCONFIGURE_INITIALIZE. Pokaždé, když odešlete jiný dotaz, navyšte toto číslo o 1. Pořadové číslo chrání před útoky přehrávanými útoky. Poznámka: se používají dvě samostatná pořadová čísla, jedna pro příkazy a jedna pro dotazy.
  1. Volání IDirect3DAuthenticatedChannel9::Query.
  2. Ovladač umístí výstup z dotazu do struktury D3DAUTHENTICATEDCHANNEL_QUERY_OUTPUT. Za touto strukturou následují další pole v závislosti na typu dotazu.
  3. Vypočítat značku OMAC pro blok dat, která se zobrazí za omac člen výstupní struktury. Porovnejte to s hodnotou člena omac. Pokud se neshodují, nezdaří se.
  4. Porovnejte hodnoty ConfigureType, hChannela SequenceNumber členů ve výstupní struktuře s hodnotami pro tyto členy. Pokud se neshodují, nezdaří se.
  5. Zvýší pořadové číslo pro další dotaz.

rozhraní API videa Direct3D 9