Cómo generar un encabezado de PlayReady
El empaquetador debe incluir un encabezado playReady en el contenido cifrado.
Para obtener una descripción detallada del encabezado PlayReady y el objeto PlayReady, consulte la especificación del encabezado PlayReady.
El encabezado PlayReady contiene información sobre el contenido que se reproduce, incluidos los identificadores clave (KID) que identifican las claves usadas para cifrar los datos, la dirección URL de adquisición de licencias predeterminada del servidor de licencias de PlayReady y los datos personalizados que quiera incluir. La clave y KID que se usa para cifrar el contenido deben compartirse con el servidor de licencias de PlayReady que emitirá las licencias para ese contenido específico, normalmente a través de un sistema de administración de claves (KMS).
Nota
Microsoft no proporciona un sistema de administración de claves con PlayReady.
El código XML siguiente proporciona un ejemplo de un encabezado PlayReady, que se puede insertar en el encabezado de un archivo MP4 segmentado, normalmente para el contenido a petición. Incluye la lista de KID (los identificadores de las claves de cifrado de contenido) necesarios para que un cliente descifre el contenido. Es la forma más común de señalar estos KID para un archivo o una secuencia a petición.
<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>
El código XML siguiente proporciona un ejemplo de un encabezado PlayReady para el contenido lineal dinámico. No incluye ningún KID porque las claves de cifrado de contenido (y sus KID asociados) cambiarán ocasionalmente (por ejemplo, con mucha frecuencia, o en el límite del programa, o cada hora o cada día). Los KID que se usan para la secuencia de contenido se señalizarán en los encabezados de segmento y no es necesario incluir ninguno de ellos en el encabezado playReady de nivel superior de la secuencia. La propiedad DECRYPTORSETUP se establece en ONDEMAND, lo que significa que el encabezado y el descifrador de PlayReady se establecerán a petición, lo que significa que cuando el cliente tenga que empezar a descifrar un segmento y, en este momento, el cliente tendrá acceso a otro encabezado playReady en el encabezado de segmento para averiguar qué implica KID.
Nota
DECRYPTORSETUP = ONDEMAND no significa que el contenido se sirva a petición, en realidad es lo contrario.
<WRMHEADER version="4.2.0.0" xmlns="http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader">
<DATA>
<DECRYPTORSETUP>ONDEMAND</DECRYPTORSETUP>
</DATA>
</WRMHEADER>
Hay varias maneras de crear un generador de encabezados de PlayReady en el empaquetador. En las secciones siguientes se describe, en general, cómo se puede generar un encabezado de PlayReady.
Método 1: crear su propio código basado en la especificación de encabezado playReady
La especificación de encabezado y objeto PlayReady es pública, por lo que es posible, y bastante simple, escribir código en el dispositivo o servicio que genera un objeto PlayReady y un encabezado PlayReady, para empaquetar el contenido.
El generador de encabezados playReady debe tener parámetros de entrada como:
- Contenido a petición o Contenido lineal dinámico.
- KID o lista de KID que se usan para proteger todo el recurso.
- Tipo de cifrado usado (AESCTR o AESCBC).
- Dirección URL de DEfaut LA: la dirección URL predeterminada del servidor de licencias de PlayReady que emitirá licencias, si se conoce en el momento del empaquetado.
- Identificador de servicio de dominio predeterminado, si el servicio usa dominios.
Ahora puede crear el objeto PlayReady y su encabezado de PlayReady asociado. En el ejemplo de código siguiente se muestra cómo crear un objeto PlayReady que contiene un encabezado playReady que se usa para el contenido a petición.
// 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: uso de la API del servidor PlayReady
Si es un licensee del SDK de PlayReady Server, el SDK de servidor contiene la clase PlayReadyHeader que se puede usar para construir un encabezado playReady. Incluye métodos que puede usar y propiedades que puede rellenar con la información necesaria para un encabezado de PlayReady.
La clase PlayReadyHeader se describe en detalle en la documentación de PlayReady que recibe con la licencia del SDK de PlayReady Server. El SDK de Servidor de PlayReady también incluye un empaquetador de ejemplo (AESPackaging) que muestra cómo crear un encabezado de PlayReady.
Como en el método 1, necesitará los identificadores clave generados por el sistema de administración de claves, el tipo de cifrado (AESCTR o AESCBC), la dirección URL del servidor de licencias de PlayReady y, opcionalmente, el identificador del servicio de dominio.
Método 3: uso de una aplicación de Windows
Cosas que necesitas antes de comenzar.
- Debe tener los identificadores clave generados por el sistema de administración de claves.
- Debe conocer el tipo de cifrado (AESCTR o AESCBC).
- Cree el encabezado PlayReady dentro del objeto PlayReady mediante la clase Windows 10 PlayReadyContentHeader.
Como en los métodos anteriores, necesitará los identificadores clave generados por el sistema de administración de claves, el tipo de cifrado (AESCTR o AESCBC), la dirección URL del servidor de licencias de PlayReady y, opcionalmente, el identificador del servicio de dominio.