Udostępnij przez


Jak wygenerować nagłówek PlayReady

Pakowacz musi uwzględnić nagłówek PlayReady w szyfrowanej zawartości.

Aby uzyskać szczegółowy opis nagłówka PlayReady i obiektu PlayReady, zobacz Specyfikację nagłówka PlayReady.

Nagłówek PlayReady zawiera informacje o odtwarzanej zawartości, w tym identyfikatory kluczy (KID), które identyfikują klucze używane do szyfrowania danych, domyślny adres URL pozyskiwania licencji serwera licencji PlayReady i wszelkie dane niestandardowe, które chcesz uwzględnić. Klucz i oprogramowanie KID używane do szyfrowania zawartości muszą być udostępniane serwerowi licencji PlayReady, który będzie wystawiał licencje dla tej konkretnej zawartości, zazwyczaj za pośrednictwem systemu zarządzania kluczami (KMS).

Uwaga / Notatka

Firma Microsoft nie udostępnia systemu zarządzania kluczami w systemie PlayReady.

Poniższy kod XML zawiera przykład nagłówka PlayReady, który może zostać wstawiony w nagłówku segmentowanego pliku MP4, zazwyczaj w przypadku zawartości na żądanie. Zawiera on listę identyfikatorów KID (identyfikatory kluczy szyfrowania zawartości), które są potrzebne klientowi do odszyfrowania zawartości. Jest to najczęstszy sposób sygnalizowania tych KID dla pliku lub strumienia na żądanie.

<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>

Poniższy kod XML zawiera przykład nagłówka PlayReady dla zawartości liniowej na żywo. Nie zawiera żadnego KID, ponieważ klucze szyfrowania zawartości (i ich powiązane identyfikatory KID) będą okresowo zmieniane (na przykład bardzo często, na granicach programu, co godzinę lub codziennie). Identyfikatory KID używane do strumienia treści będą sygnalizowane w nagłówkach segmentów i nie trzeba dołączać żadnego z nich do nagłówka PlayReady na najwyższym poziomie strumienia. Właściwość DECRYPTORSETUP jest ustawiona na ONDEMAND, co oznacza, że nagłówek PlayReady i dekryptor zostaną ustawione na żądanie, co oznacza, że gdy klient rzeczywiście będzie musiał zacząć odszyfrowywać segment — i w tym momencie klient będzie miał dostęp do innego nagłówka PlayReady w nagłówku segmentu, aby ustalić, jaki KID jest zaangażowany.

Uwaga / Notatka

DECRYPTORSETUP = ONDEMAND nie oznacza, że zawartość jest obsługiwana na żądanie, jest w rzeczywistości odwrotna.

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

Istnieje wiele sposobów tworzenia generatora nagłówka PlayReady w pakiecie. W poniższych sekcjach opisano ogólnie sposób generowania nagłówka PlayReady.

Metoda 1 — tworzenie własnego kodu na podstawie specyfikacji nagłówka PlayReady

Specyfikacja obiektu PlayReady i nagłówka jest publiczna, więc można i dość łatwo napisać kod w urządzeniu lub usłudze, który generuje obiekt PlayReady i nagłówek PlayReady, aby spakować zawartość.

Generator nagłówka PlayReady musi mieć parametry wejściowe, takie jak:

  • Zawartość na żądanie lub zawartość liniowa na żywo.
  • KID lub lista KID, które są używane do ochrony całego majątku.
  • Używany typ szyfrowania (AESCTR lub AESCBC).
  • Defaut LA URL — domyślny adres URL serwera licencji PlayReady, który będzie wydawać licencje, jeśli jest znany w czasie pakowania.
  • Domyślny identyfikator usługi domenowej, jeśli usługa korzysta z domen.

Teraz możesz utworzyć obiekt PlayReady i skojarzony z nim nagłówek PlayReady. W poniższym przykładzie kodu pokazano, jak utworzyć obiekt PlayReady zawierający nagłówek PlayReady używany do zawartości na żądanie.

// 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;
}

Metoda 2 — korzystanie z interfejsu API serwera PlayReady

Jeśli jesteś licencjonatorem zestawu SDK playReady Server, zestaw SDK serwera zawiera klasę PlayReadyHeader , która może służyć do konstruowania nagłówka PlayReady. Zawiera metody, których można użyć, i właściwości, które można wypełnić informacjami wymaganymi dla nagłówka PlayReady.

Klasa PlayReadyHeader została szczegółowo opisana w dokumentacji PlayReady otrzymanej z licencją zestawu PlayReady Server SDK. Zestaw SDK PlayReady Server zawiera również przykładowy opakowacz (AESPackaging), który pokazuje, jak utworzyć nagłówek PlayReady.

Podobnie jak w metodzie 1, będą potrzebne identyfikatory KeyID wygenerowane przez system zarządzania kluczami, typ szyfrowania (AESCTR lub AESCBC), adres URL serwera licencji PlayReady i opcjonalnie identyfikator usługi domeny.

Metoda 3 — używanie aplikacji systemu Windows

Wszystko, czego potrzebujesz przed rozpoczęciem.

  1. Musisz mieć identyfikatory KeyID, które zostały wygenerowane przez system zarządzania kluczami.
  2. Musisz znać typ szyfrowania (AESCTR lub AESCBC).
  3. Utwórz nagłówek PlayReady wewnątrz obiektu PlayReady przy użyciu klasy PlayReadyHeader systemu Windows 10 PlayReadyContentHeader .

Podobnie jak w poprzednich metodach, potrzebne będą identyfikatory KeyID wygenerowane przez system zarządzania kluczami, typ szyfrowania (AESCTR lub AESCBC), adres URL serwera licencji PlayReady i opcjonalnie identyfikator usługi domeny.