Compartilhar via


Como gerar um cabeçalho PlayReady

O empacotador precisa incluir um Cabeçalho PlayReady no conteúdo criptografado.

Para obter uma descrição detalhada do Cabeçalho PlayReady e do Objeto PlayReady, consulte a Especificação de Cabeçalho PlayReady.

O Cabeçalho PlayReady contém informações sobre o conteúdo que está sendo reproduzido, incluindo os KIDs (identificadores de chave) que identificam as chaves usadas para criptografar os dados, a URL de aquisição de licença padrão do Servidor de Licenças PlayReady e todos os dados personalizados que você deseja incluir. A chave e o KID usados para criptografar o conteúdo devem ser compartilhados com o Servidor de Licença do PlayReady que emitirá as licenças para esse conteúdo específico, normalmente por meio de um sistema de gerenciamento de chaves (KMS).

Observação

A Microsoft não fornece um sistema de gerenciamento de chaves com o PlayReady.

O código XML a seguir fornece um exemplo de um Cabeçalho PlayReady, que pode ser inserido no cabeçalho de um arquivo MP4 segmentado, normalmente para conteúdo sob demanda. Ele inclui a lista de KIDs (as IDs das chaves de criptografia de conteúdo) necessárias para um cliente descriptografar o conteúdo. É a maneira mais comum de sinalizar esses KIDs para um arquivo ou fluxo sob demanda.

<WRMHEADER xmlns="http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader" version="4.3.0.0">
  <DATA>
    <PROTECTINFO>
      <KIDS>
        <KID ALGID="AESCTR" VALUE="PV1LM/VEVk+kEOB8qqcWDg=="></KID>
        <KID ALGID="AESCTR" VALUE="tuhDoKUN7EyxDPtMRNmhyA=="></KID>
      </KIDS>
    </PROTECTINFO>
    <LA_URL>http://rm.contoso.com/rightsmanager.asmx</LA_URL>
    <DS_ID>AH+03juKbUGbHl1V/QIwRA==</DS_ID>
  </DATA>
</WRMHEADER>

O código XML a seguir fornece um exemplo de um cabeçalho PlayReady para conteúdo linear dinâmico. Ele não inclui nenhuma KID porque as chaves de criptografia de conteúdo (e seus KIDs associados) serão alteradas ocasionalmente (por exemplo, com muita frequência ou no limite do programa, ou a cada hora ou todos os dias). Os KIDs usados para o fluxo de conteúdo serão sinalizados nos cabeçalhos do segmento e não é necessário incluir nenhum deles no cabeçalho PlayReady de nível superior do fluxo. A propriedade DECRYPTORSETUP é definida como ONDEMAND, o que significa que o Cabeçalho PlayReady e o Descriptografia serão definidos sob demanda, ou seja, quando o cliente realmente precisar começar a descriptografar um segmento — e, neste ponto, o cliente terá acesso a outro Cabeçalho PlayReady no cabeçalho do segmento para descobrir o que o KID está envolvido.

Observação

DECRYPTORSETUP = ONDEMAND não significa que o conteúdo seja servido sob demanda, na verdade é o oposto.

<WRMHEADER version="4.2.0.0" xmlns="http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader">
  <DATA>
    <DECRYPTORSETUP>ONDEMAND</DECRYPTORSETUP>
  </DATA>
</WRMHEADER>

Há várias maneiras de criar um gerador de cabeçalho PlayReady no empacotador. As seções a seguir descrevem, em geral, como você pode gerar um Cabeçalho PlayReady.

Método 1 – Criar seu próprio código com base na especificação de cabeçalho PlayReady

A Especificação de Objeto e Cabeçalho PlayReady é pública, portanto, é possível, e muito simples, escrever código em seu dispositivo ou serviço que gera um objeto PlayReady e um cabeçalho PlayReady, para empacotar conteúdo.

O gerador de cabeçalho PlayReady precisa ter parâmetros de entrada, como:

  • Conteúdo sob demanda ou conteúdo Linear Dinâmico.
  • KID ou lista de KIDs que são usados para proteger todo o ativo.
  • Tipo de criptografia usado (AESCTR ou AESCBC).
  • DEsfigurar a URL la — a URL padrão do Servidor de Licenças PlayReady que emitirá licenças, se conhecidas no momento da empacotamento.
  • Identificador padrão do Serviço de Domínio, se o serviço estiver usando domínios.

Agora você pode criar o Objeto PlayReady e seu Cabeçalho PlayReady associado. O exemplo de código a seguir demonstra como criar um objeto PlayReady que contém um cabeçalho PlayReady usado para conteúdo sob demanda.

// This function gets values from the key management system and your specified encryption mode
// (and optionally the domainID), creates a PlayReady Header, adds the header to a 
// PlayReady Object, and stores them in a file in UTF-16 little endian format

void buildRMObject(string KeyID1, string KeyID2, string encryptMode, string domainID)
{
	// The string parameters include the following:
	// KeyID1, KeyID2 - The key identifiers - these values are returned from the key management system or
	//                                        the KeySeed mechanism
	// encryptMode - the encryption mode used to encrypt content, can be AESCTR or AESCBC
	// domainID - the optional domain service identifier (only used for domains)

	string xmlString = "<WRMHEADER xmlns=\"http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader\" version=\"4.3.0.0\"><DATA><PROTECTINFO><KIDS><KID ALGID=\"";
	xmlString.append(encryptMode);
	xmlString.append("\" VALUE=\"");
	xmlString.append(KeyID1);
	xmlString.append("\"></KID><KID ALGID=\"");
	xmlString.append(encryptMode);
	xmlString.append("\" VALUE=\"");
	xmlString.append(KeyID2);
	xmlString.append("\"></KID></KIDS></PROTECTINFO><LA_URL>http://rm.contoso.com/rightsmanager.asmx</LA_URL><DS_ID>");
	xmlString.append(domainID);
	xmlString.append("</DS_ID></DATA></WRMHEADER>");

	// Convert the PlayReady header to UFT-16 format
	wstring_convert<codecvt_utf8_utf16<wchar_t>> convert;
	wstring utf16XML = convert.from_bytes(xmlString);

	// Calculate the length of the PlayReady Header
	int32_t headerLength = (utf16XML.size() * sizeof(wchar_t));
	// Calculate the length of the PlayReady Object
	int32_t objectLength = headerLength + 10;
	// Set the number of PlayReady object records (in this case, 1)
	int16_t recordCount = 1;
	// Set the record type (in this case, a PlayReady Header)
	// If this was an embedded license store, this value would be 3
	int16_t recordType = 1;

	// Write the PlayReady Object and PlayReady Header to a file
	wofstream wofs("C:\\Temp\\PRObject.txt", ios::binary);
	wofs.imbue(locale(wofs.getloc(),
			  new codecvt_utf16<wchar_t, 0x10ffff, little_endian>));
	wofs.write(reinterpret_cast<const wchar_t *>(&objectLength), 2);
	wofs.write(reinterpret_cast<const wchar_t *>(&recordCount), 1);
	wofs.write(reinterpret_cast<const wchar_t *>(&recordType), 1);
	wofs.write(reinterpret_cast<const wchar_t *>(&headerLength), 1);
	wofs <<  utf16XML;
}

Método 2 – Usar a API do Servidor PlayReady

Se você for um licenciado do SDK do PlayReady Server, o SDK do servidor conterá a classe PlayReadyHeader que pode ser usada para construir um Cabeçalho PlayReady. Ele inclui métodos que você pode usar e propriedades que você pode preencher com as informações necessárias para um cabeçalho PlayReady.

A classe PlayReadyHeader é descrita em detalhes na documentação do PlayReady recebida com sua licença do SDK do PlayReady Server. O SDK do PlayReady Server também inclui um empacotador de exemplo (AESPackaging) que demonstra como criar um cabeçalho PlayReady.

Como no Método 1, você precisará das KeyIDs geradas pelo sistema de gerenciamento de chaves, o tipo de criptografia (AESCTR ou AESCBC), a URL do servidor de licenças PlayReady e, opcionalmente, o identificador do serviço de domínio.

Método 3 – Usar um aplicativo Windows

Coisas que você precisa antes de começar.

  1. Você deve ter as KeyID(s) que foram geradas pelo sistema de gerenciamento de chaves.
  2. Você deve conhecer o tipo de criptografia (AESCTR ou AESCBC).
  3. Crie o cabeçalho PlayReady dentro do objeto PlayReady usando a classe Windows 10 PlayReadyContentHeader.

Como nos métodos anteriores, você precisará das KeyIDs geradas pelo sistema de gerenciamento de chaves, o tipo de criptografia (AESCTR ou AESCBC), a URL do servidor de licenças PlayReady e, opcionalmente, o identificador do serviço de domínio.