Comment générer un en-tête PlayReady
Le packager doit inclure un en-tête PlayReady dans le contenu chiffré.
Pour obtenir une description détaillée de l’en-tête PlayReady et de l’objet PlayReady, consultez la spécification de l’en-tête PlayReady.
L’en-tête PlayReady contient des informations sur le contenu en cours de lecture, y compris les identificateurs de clé (KID) qui identifient les clés utilisées pour chiffrer les données, l’URL d’acquisition de licence par défaut du serveur de licences PlayReady et toutes les données personnalisées que vous souhaitez inclure. La clé et le KID utilisés pour chiffrer le contenu doivent être partagés avec le serveur de licences PlayReady qui émettra les licences pour ce contenu spécifique, généralement via un système de gestion des clés (KMS).
Remarque
Microsoft ne fournit pas de système de gestion des clés avec PlayReady.
Le code XML suivant fournit un exemple d’en-tête PlayReady, qui peut être inséré dans l’en-tête d’un fichier MP4 segmenté, généralement pour le contenu à la demande. Il inclut la liste des KID (ID des clés de chiffrement de contenu) nécessaires pour qu’un client déchiffre le contenu. Il est le moyen le plus courant de signaler ces KID pour un fichier ou un flux à la demande.
<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>
Le code XML suivant fournit un exemple d’en-tête PlayReady pour le contenu linéaire en direct. Il n’inclut aucun KID, car les clés de chiffrement de contenu (et leurs KID associés) changent occasionnellement (par exemple, très fréquemment, ou à la limite du programme, ou toutes les heures, ou tous les jours). Les KID utilisés pour le flux de contenu seront signalés dans les en-têtes de segment, et il n’est pas nécessaire d’inclure l’un d’eux dans l’en-tête PlayReady de niveau supérieur du flux. La propriété DECRYPTORSETUP est définie sur ONDEMAND, ce qui signifie que l’en-tête PlayReady et le déchiffreur sont définis à la demande, ce qui signifie que lorsque le client doit réellement commencer à déchiffrer un segment — et à ce stade, le client a accès à un autre en-tête PlayReady dans l’en-tête de segment pour déterminer ce que KID est impliqué.
Remarque
DECRYPTORSETUP = ONDEMAND ne signifie pas que le contenu est servi à la demande, il s’agit en fait de l’inverse.
<WRMHEADER version="4.2.0.0" xmlns="http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader">
<DATA>
<DECRYPTORSETUP>ONDEMAND</DECRYPTORSETUP>
</DATA>
</WRMHEADER>
Il existe plusieurs façons de créer un générateur d’en-tête PlayReady dans votre packager. Les sections suivantes décrivent, en général, comment générer un en-tête PlayReady.
Méthode 1 : créer votre propre code en fonction de la spécification de l’en-tête PlayReady
La spécification d’objet et d’en-tête PlayReady est publique afin qu’il soit possible, et tout à fait simple, d’écrire du code dans votre appliance ou service qui génère un objet PlayReady et un en-tête PlayReady, pour empaqueter du contenu.
Le générateur d’en-têtes PlayReady doit avoir des paramètres d’entrée tels que :
- Contenu à la demande ou contenu linéaire en direct.
- KID ou liste des KID utilisés pour protéger l’ensemble de la ressource.
- Type de chiffrement utilisé (AESCTR ou AESCBC).
- URL DEFAUT LA : URL par défaut du serveur de licences PlayReady qui émettra des licences, si elle est connue au moment de l’empaquetage.
- Identificateur de service de domaine par défaut, si le service utilise des domaines.
Vous pouvez maintenant créer l’objet PlayReady et son en-tête PlayReady associé. L’exemple de code suivant montre comment créer un objet PlayReady qui contient un en-tête PlayReady utilisé pour le contenu à la demande.
// 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éthode 2 - Utiliser l’API du serveur PlayReady
Si vous êtes titulaire d’une licence du SDK PlayReady Server, le KIT DE développement logiciel (SDK) du serveur contient la classe PlayReadyHeader qui peut être utilisée pour construire un en-tête PlayReady. Il inclut des méthodes que vous pouvez utiliser et des propriétés que vous pouvez remplir avec les informations requises pour un en-tête PlayReady.
La classe PlayReadyHeader est décrite en détail dans la documentation PlayReady que vous recevez avec votre licence sdk PlayReady Server. Le Kit de développement logiciel (SDK) PlayReady Server inclut également un exemple de packageur (AESPackaging) qui montre comment créer un en-tête PlayReady.
Comme dans la méthode 1, vous aurez besoin des keyID(s) qui ont été générés par le système de gestion des clés, du type de chiffrement (AESCTR ou AESCBC), de l’URL du serveur de licence PlayReady, et éventuellement, de l’identificateur de service de domaine.
Méthode 3 - Utiliser une application Windows
Les choses dont vous avez besoin avant de commencer.
- Vous devez disposer du ou des keyID générés par le système de gestion des clés.
- Vous devez connaître le type de chiffrement (AESCTR ou AESCBC).
- Créez l’en-tête PlayReady à l’intérieur de l’objet PlayReady à l’aide de la classe PlayReadyContentHeader Windows 10.
Comme dans les méthodes précédentes, vous aurez besoin des KeyID(s) générés par le système de gestion des clés, du type de chiffrement (AESCTR ou AESCBC), de l’URL du serveur de licence PlayReady et éventuellement de l’identificateur de service de domaine.