proteção de conteúdo GPU-Based com vídeo D3D11

Este tópico descreve os recursos de proteção de conteúdo de vídeo que um driver gráfico pode fornecer.

Introdução

O diagrama a seguir mostra uma exibição simplificada de como o conteúdo de vídeo protegido viaja pelo pipeline a ser renderizado.

um diagrama que mostra o conteúdo de vídeo protegido.

Observação

O PMP ( Caminho de Mídia Protegida ) não é descrito neste diagrama. O fluxo de dados mostrado aqui pode ocorrer em um processo PMP ou em um processo de aplicativo.

 

O decodificador recebe dados de vídeo criptografados e compactados de uma fonte externa. Supõe-se também que o decodificador também recebe uma chave criptográfica para descriptografar esses dados. Este tópico não descreve a troca de chaves entre a fonte de vídeo e o decodificador, mas o PMP define um mecanismo possível. A GPU não está envolvida neste estágio.

Para a decodificação acelerada por hardware, o decodificador de software passa o conteúdo de vídeo compactado para a GPU. Para proteger esse conteúdo, o decodificador criptografa novamente os dados, normalmente usando AES-CTR, antes de passá-los para o acelerador de hardware. Um mecanismo de troca de chaves é definido entre o decodificador e o driver gráfico.

Quadros de vídeo decodificados são armazenados na memória de vídeo, geralmente na limpeza. Neste ponto, os quadros são processados e, em seguida, apresentados. Há duas opções de main para apresentação.

  • Ao usar a API D3D9, os quadros podem ser apresentados usando uma sobreposição de hardware. Não há suporte para hardware excessivamente em D3D11. Para obter mais informações, consulte Suporte à sobreposição de hardware.
  • Os quadros podem ser apresentados pelo DWM (Gerenciador de Janelas da Área de Trabalho) usando uma superfície compartilhada.

A última etapa é exibir o quadro no monitor, o que pode exigir proteção de vínculo entre os elementos gráficos cartão e o dispositivo de exibição. Um exemplo de proteção de link é High-Bandwidth HDCP (Proteção de Conteúdo Digital). A proteção de link é configurada usando o OPM ( Gerenciador de Proteção de Saída ). Este tópico não descreve o OPM; para obter mais informações, consulte Usando o Gerenciador de Proteção de Saída.

Visão geral do processo de decodificação

Durante a decodificação acelerada por hardware, o decodificador de software deve passar dados de vídeo compactados para os gráficos cartão. Para conteúdo premium, esses dados normalmente devem ser criptografados, usando criptografia de chave simétrica, antes de serem enviados para a GPU.

Para criptografar o vídeo para decodificação, o decodificador de software usa as seguintes interfaces:

  • ID3D11VideoDecoder. Representa o dispositivo de decodificador, também chamado de acelerador.
  • ID3D11CryptoSession. Representa uma sessão criptográfica, que fornece a chave de criptografia.
  • ID3D11AuthenticatedChannel. Representa um canal autenticado, que permite que o decodificador de software associe a sessão criptográfica ao decodificador.

um diagrama que mostra as interfaces de decodificação direct3d9.

Todas essas interfaces são obtidas do dispositivo Direct3D11, da seguinte maneira:

Interface Criação
ID3D11VideoDecoder Chame ID3D11VideoDevice::CreateVideoDecoder. O tipo de decodificador é identificado por um GUID de perfil.
ID3D11CryptoSession Chame ID3D11VideoDevice::CreateCryptoSession.
ID3D11AuthenticatedChannel Chame ID3D11VideoDevice::CreateAuthenticatedChannel.

 

Observação

Para obter um ponteiro para a interface ID3D11VideoDevice , chame QueryInterface na interface ID3D11Device .

 

O canal autenticado fornece um canal de comunicação confiável entre o decodificador de software e o driver. O canal de comunicação funciona da seguinte maneira:

  • O driver fornece uma cadeia de certificados X.509 cujo certificado raiz é assinado pela Microsoft.
  • O certificado contém uma chave pública RSA para o driver.
  • O decodificador de software usa a chave pública para enviar ao driver uma chave de sessão AES de 128 bits.
  • O decodificador de software envia consultas e comandos para o canal autenticado.
  • A chave de sessão é usada para computar macs (códigos de autenticação de mensagem) para as consultas e comandos. O driver usa os MACs para verificar a integridade dos dados de consulta/comando e o decodificador de software os usa para verificar a integridade dos dados de resposta do driver.

Criptografando buffers de vídeo compactados para o decodificador

Aqui está uma visão geral de alto nível do processo de criptografia e decodificação:

  1. O decodificador de software recebe um fluxo de dados criptografados da fonte de vídeo. O decodificador descriptografa esse fluxo.

  2. O decodificador de software negocia uma chave de sessão com a sessão criptográfica.

  3. O decodificador de software usa o canal autenticado para associar a sessão criptográfica ao dispositivo decodificador.

  4. O decodificador de software coloca dados compactados em buffers que obtém do dispositivo decodificador (acelerador). Para conteúdo protegido, o codificador de software criptografa os dados que são colocados nos buffers, usando a chave de sessão para a criptografia.

    Observação

    Alguns drivers usam uma chave de conteúdo, em vez da chave de sessão, para criptografia. A chave de conteúdo pode mudar de um quadro para outro.

     

  5. O decodificador envia os buffers compactados criptografados para o acelerador. Para AES-CTR, o decodificador também passa o vetor de inicialização. Se uma chave de conteúdo for usada, o decodificador passará a chave de conteúdo, criptografada usando a chave de sessão.

O Direct3D11 tem suporte padrão para AES-CTR de 128 bits, mas foi projetado para se estender a tipos de criptografia adicionais.

As próximas cinco seções fornecem etapas mais detalhadas.

1. Consultar os recursos de proteção de conteúdo do driver

Antes de tentar aplicar a criptografia, obtenha os recursos de proteção de conteúdo do driver.

  1. Obtenha um ponteiro para a interface ID3D11Device.
  2. Chame QueryInterface para a interface ID3D11VideoDevice .
  3. Chame ID3D11VideoDevice::GetContentProtectionCaps. Esse método preenche uma estrutura D3D11_VIDEO_CONTENT_PROTECTION_CAPS com os recursos de proteção de conteúdo do driver.

Em particular, procure os seguintes recursos:

  • Se o membro Caps contiver o sinalizador D3D11_CONTENT_PROTECTION_CAPS_SOFTWARE ou D3D11_CONTENT_PROTECTION_CAPS_HARDWARE , o driver poderá executar a criptografia.
  • Se o membro Caps contiver o sinalizador D3D11_CONTENT_PROTECTION_CAPS_CONTENT_KEY , o driver usará uma chave de conteúdo separada para descriptografia.
  • Chame ID3D11VideoDevice::CheckCryptoKeyExchange para determinar quais tipos de chave o driver dá suporte para gerar a chave de sessão.

Recursos adicionais são indicados no membro Caps .

2. Configurar o Canal Autenticado

A próxima etapa é configurar o canal autenticado.

  1. Chame ID3D11VideoDevice::CreateAuthenticatedChannel para criar o canal autenticado. Para o parâmetro ChannelType , especifique um tipo de canal que corresponda aos recursos do driver.

    • O tipo de canal D3D11_AUTHENTICATED_CHANNEL_DRIVER_SOFTWARE corresponde a D3D11_CONTENT_PROTECTION_CAPS_SOFTWARE.
    • O tipo de canal D3D11_AUTHENTICATED_CHANNEL_DRIVER_HARDWARE corresponde a D3D11_CONTENT_PROTECTION_CAPS_HARDWARE.

    O método CreateAuthenticatedChannel retorna um ponteiro para a interface ID3D11AuthenticatedChannel .

  2. Chame ID3D11AuthenticatedChannel::GetCertificateSize para obter o tamanho do certificado X.509 do driver. Aloque um buffer do tamanho necessário.

  3. Chame ID3D11AuthenticatedChannel::GetCertificate para obter o certificado. O método copia o certificado para o buffer alocado na etapa anterior.

  4. Verifique se o certificado do driver foi assinado pela Microsoft e se não foi revogado.

  5. Obtenha a chave pública do certificado.

  6. Gere uma chave de sessão RSA aleatória. Essa chave de sessão é usada para assinar dados enviados para o canal autenticado. Criptografe a chave de sessão usando a chave pública do driver.

  7. Chame ID3D11VideoContext::NegotiateAuthenticatedChannelKeyExchange para enviar a chave de sessão criptografada para o driver.

  8. Inicialize o canal seguro da seguinte maneira:

    1. Preencha uma estrutura D3D11_AUTHENTICATED_CONFIGURE_INITIALIZE_INPUT conforme descrito na documentação.
    2. Envie o comando D3D11_AUTHENTICATED_CONFIGURE_INITIALIZE_INPUT chamando ID3D11VideoContext::ConfigureAuthenticatedChannel conforme descrito na seção Enviando comandos de canal autenticado. Esse comando contém os números de sequência inicial para os comandos e consultas que são enviados para o canal autenticado.
  9. Verifique o tipo de canal enviando uma consulta D3D11_AUTHENTICATED_QUERY_CHANNEL_TYPE para o canal autenticado, conforme descrito na seção Enviando consultas de canal autenticado. Verifique se o tipo de canal corresponde ao que você especificou no método CreateAuthenticatedChannel .

3. Configurar a sessão criptográfica

Em seguida, configure a sessão criptográfica e estabeleça a chave de sessão.

  1. Chame ID3D11VideoDevice::CreateCryptoSession para criar a sessão criptográfica. Esse método retorna um ponteiro para a interface ID3D11CryptoSession .
  2. Chame ID3D11CryptoSession::GetCertificateSize para obter o tamanho do certificado X.509 do driver. Aloque um buffer do tamanho necessário.
  3. Chame ID3D11CryptoSession::GetCertificate para obter o certificado. O método copia o certificado para o buffer alocado na etapa anterior.
  4. Verifique se o certificado do driver foi assinado pela Microsoft e se não foi revogado.
  5. Obtenha a chave pública do certificado.
  6. Gere uma chave de sessão RSA aleatória. Essa é uma chave de sessão separada da chave de sessão do canal autenticado. Criptografe a chave de sessão usando a chave pública do driver.
  7. Chame ID3D11VideoContext::NegotiateCryptoSessionKeyExchange para enviar a chave de sessão criptografada para o driver.
  8. Se os recursos de proteção de conteúdo incluírem 3D11_CONTENT_PROTECTION_CAPS_CONTENT_KEY, crie uma chave de conteúdo RSA aleatória. Isso será usado posteriormente no processo de decodificação.

4. Associar o decodificador à Sessão Criptográfica

Em seguida, associe o dispositivo de decodificador ao dispositivo Direct3D11 e à sessão criptográfica, da seguinte maneira:

  1. Obtenha um identificador para o dispositivo Direct3D11 enviando uma consulta D3D11_AUTHENTICATED_QUERY_DEVICE_HANDLE para o canal autenticado.
  2. Preencha uma estrutura D3D11_AUTHENTICATED_CONFIGURE_CRYPTO_SESSION_INPUT com as seguintes informações:
  3. Chame ID3D11VideoContext::ConfigureAuthenticatedChannel para enviar um comando D3D11_AUTHENTICATED_CONFIGURE_CRYPTO_SESSION para o canal autenticado.

O diagrama a seguir ilustra a troca de identificadores:

um diagrama que mostra como o decodificador dxva está associado à sessão criptográfica.

O decodificador de software agora pode usar a chave de sessão criptográfica para criptografar os buffers de vídeo compactados. Cada buffer compactado terá seu próprio iv (vetor de inicialização) especificado no membro pIV da estrutura D3D11_VIDEO_DECODER_BUFFER_DESC .

Enviando comandos de canal autenticado

Um conjunto de comandos é definido para configurar o canal autenticado e definir várias proteções de conteúdo. Para obter uma lista de comandos, consulte Comandos de Proteção de Conteúdo.

Para enviar um comando para o canal autenticado, execute as etapas a seguir.

  1. Preencha a estrutura de dados de entrada. Essa estrutura de dados é sempre uma estrutura D3D11_AUTHENTICATED_CONFIGURE_INPUT seguida por campos adicionais. Preencha a estrutura D3D11_AUTHENTICATED_CONFIGURE_INPUT conforme mostrado na tabela a seguir.
Membro Descrição
omac Ignore este campo por enquanto.
ConfigureType GUID que identifica o comando. Para obter uma lista de comandos, consulte Comandos de Proteção de Conteúdo.
hChannel O identificador para o canal autenticado.
SequenceNumber O número de sequência. O primeiro número de sequência é especificado enviando um comando D3D11_AUTHENTICATED_CONFIGURE_INITIALIZE . Cada vez que você enviar outro comando, incremente esse número em 1. O número de sequência protege contra ataques de repetição. Nota: Dois números de sequência separados são usados, um para comandos e outro para consultas.
  1. Calcule a marca OMAC para o bloco de dados que aparece após o membro omac da estrutura de entrada. Em seguida, copie esse valor de marca para o membro omac .
  2. Chame ID3D11VideoContext::ConfigureAuthenticatedChannel.
  3. O driver coloca a saída do comando na estrutura D3D11_AUTHENTICATED_CONFIGURE_OUTPUT .
  4. Calcule a marca OMAC para o bloco de dados que aparece após o membro omac da estrutura de saída. Compare isso com o valor do membro omac . Falhar se eles não corresponderem.
  5. Compare os valores dos membros ConfigureType, hChannel e SequenceNumber na estrutura de saída com os valores desses membros. Falhar se eles não corresponderem.
  6. Incremente o número de sequência para o próximo comando.

Enviando consultas de canal autenticado

Um conjunto de consultas é definido para recuperar informações sobre o canal autenticado. Para obter uma lista de consultas, consulte Consultas de Proteção de Conteúdo.

Para enviar um comando para o canal autenticado, execute as etapas a seguir.

  1. Preencha a estrutura de dados de entrada. Essa estrutura de dados é sempre uma estrutura D3D11_AUTHENTICATED_QUERY_INPUT , possivelmente seguida por campos adicionais. Preencha a estrutura D3D11_AUTHENTICATED_QUERY_INPUT conforme mostrado na tabela a seguir.
Membro Descrição
QueryType GUID que identifica a consulta. Para obter uma lista de consultas, consulte Consultas de Proteção de Conteúdo.
hChannel O identificador para o canal autenticado.
SequenceNumber O número de sequência. O primeiro número de sequência é especificado enviando um comando D3D11_AUTHENTICATED_CONFIGURE_INITIALIZE . Sempre que você enviar outra consulta, incremente esse número em 1. O número de sequência protege contra ataques de repetição. Nota: Dois números de sequência separados são usados, um para comandos e outro para consultas.
  1. Chame ID3D11VideoContext::QueryAuthenticatedChannel.
  2. O driver coloca a saída da consulta em uma estrutura D3D11_AUTHENTICATED_QUERY_OUTPUT . Essa estrutura é seguida por campos adicionais, dependendo do tipo de consulta.
  3. Calcule a marca OMAC para o bloco de dados que aparece após o membro omac da estrutura de saída. Compare isso com o valor do membro omac . Falhar se eles não corresponderem.
  4. Compare os valores dos membros ConfigureType, hChannel e SequenceNumber na estrutura de saída com os valores desses membros. Falhar se eles não corresponderem.
  5. Incremente o número da sequência para a próxima consulta.

APIs de vídeo do Direct3D 11