ochrana obsahu GPU-Based
Toto téma popisuje možnosti ochrany obsahu videa, které může grafický ovladač poskytnout.
- Úvod
- přehled procesu dekódování
-
šifrování komprimovaných vyrovnávacích pamětí videa pro dekodéru
- 1. Dotazování na možnosti ochrany obsahu ovladače
- 2. Konfigurace ověřeného kanálu
- 3. Konfigurace kryptografické relace
- 4. Získání úchytu k dekodéru DXVA
- 5. Přidružení dekodéru DXVA k kryptografické relaci
- odesílání příkazů ověřeného kanálu
- odesílání dotazů ověřených kanálů
- související témata
Ú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.
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.
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í:
Softwarový dekodér přijímá datový proud šifrovaných dat ze zdroje videa. Dekodér dešifruje tento datový proud.
Softwarový dekodér vyjedná klíč relace s kryptografickou relací.
Softwarový dekodér používá ověřený kanál k přidružení kryptografické relace k dekodéru DXVA zařízení.
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ý.
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. Dotazování na možnosti ochrany obsahu ovladače
- 2. Konfigurace ověřeného kanálu
- 3. Konfigurace kryptografické relace
- 4. Získání úchytu k dekodéru DXVA
- 5. Přidružení dekodéru DXVA k kryptografické relaci
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.
- Získejte ukazatel na zařízení Direct3D 9.
- Volání QueryInterface pro rozhraní IDirect3DDevice9Video.
- 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.
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.
Volání IDirect3DAuthenticatedChannel9::GetCertificateSize získat velikost certifikátu X.509 ovladače. Přidělte vyrovnávací paměť požadované velikosti.
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.
Ověřte, že certifikát ovladače byl podepsán společností Microsoft a nebyl odvolán.
Získejte veřejný klíč z certifikátu.
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.
Volání IDirect3DAuthenticatedChannel9::NegotiateKeyExchange pro odeslání šifrovaného klíče relace ovladači.
Inicializace zabezpečeného kanálu následujícím způsobem:
- Vyplňte strukturu D3DAUTHENTICATEDCHANNEL_CONFIGUREINITIALIZE, jak je popsáno v dokumentaci.
- 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.
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.
- Volání IDirect3DDevice9Video::CreateCryptoSession vytvořit kryptografickou relaci. Tato metoda vrátí ukazatel na rozhraní IDirect3DCryptoSession9 a spolu s popisovačem kryptografické relace.
- Volání IDirect3DCryptoSession9::GetCertificateSize získat velikost certifikátu X.509 ovladače. Přidělte vyrovnávací paměť požadované velikosti.
- 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.
- Ověřte, že certifikát ovladače byl podepsán společností Microsoft a nebyl odvolán.
- Získejte veřejný klíč z certifikátu.
- 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.
- Volání IDirect3DCryptoSession9::NegotiateKeyExchange k odeslání šifrovaného klíče relace ovladači.
- 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:
- Získejte popisovač k dekodéru DXVA, jak je popsáno v předchozí části.
- Získejte popisovač zařízení Direct3D odesláním dotazu D3DAUTHENTICATEDQUERY_DEVICEHANDLE do ověřeného kanálu.
- 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.
- 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čů:
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.
- 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. |
- 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.
- Volání IDirect3DAuthenticatedChannel9::Konfigurace.
- Ovladač umístí výstup příkazu do struktury D3DAUTHENTICATEDCHANNEL_CONFIGURE_OUTPUT.
- 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.
- Porovnejte hodnoty ConfigureType, hChannela SequenceNumber členů ve výstupní struktuře s hodnotami pro tyto členy. Pokud se neshodují, nezdaří se.
- 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.
- 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. |
- Volání IDirect3DAuthenticatedChannel9::Query.
- 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.
- 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.
- Porovnejte hodnoty ConfigureType, hChannela SequenceNumber členů ve výstupní struktuře s hodnotami pro tyto členy. Pokud se neshodují, nezdaří se.
- Zvýší pořadové číslo pro další dotaz.