
Ten dokument zawiera omówienie struktury zarządzania prawami cyfrowymi (DRM) systemu Android i przedstawia interfejsy, które musi zaimplementować wtyczka DRM. Ten dokument nie opisuje reguł odporności ani reguł zgodności, które mogą być zdefiniowane przez schemat DRM.
Struktura
Platforma Android zapewnia rozszerzalną strukturę DRM, która umożliwia aplikacjom zarządzanie treścią chronioną prawami zgodnie z ograniczeniami licencji powiązanymi z treścią. Struktura DRM obsługuje wiele schematów DRM; to, które schematy DRM obsługuje urządzenie, zależy od producenta urządzenia. Struktura DRM zapewnia ujednolicony interfejs dla twórców aplikacji i ukrywa złożoność operacji DRM. Struktura DRM zapewnia spójny tryb działania dla zawartości chronionej i niechronionej. Schematy DRM mogą definiować złożone modele użytkowania na podstawie metadanych licencji. Struktura DRM zapewnia powiązanie treści DRM z licencją oraz obsługuje zarządzanie prawami. Umożliwia to wyodrębnienie odtwarzacza multimedialnego z zawartości chronionej lub niechronionej przez DRM. Zobacz MediaDrm dla klasy, aby uzyskać klucze do odszyfrowywania chronionych strumieni multimediów.


Dostępność bogatych treści cyfrowych jest ważna dla użytkowników urządzeń mobilnych. Aby ich treści były szeroko dostępne, programiści Androida i wydawcy treści cyfrowych potrzebują spójnej implementacji DRM obsługiwanej w całym ekosystemie Androida. Aby te treści cyfrowe były dostępne na urządzeniach z Androidem i aby zapewnić dostęp do co najmniej jednego spójnego DRM na wszystkich urządzeniach, Google zapewnia DRM bez opłat licencyjnych na zgodnych urządzeniach z Androidem. Wtyczka DRM jest zintegrowana z platformą Android DRM i może korzystać ze sprzętowej ochrony w celu zabezpieczenia treści premium i poświadczeń użytkownika.
Ochrona zawartości zapewniana przez wtyczkę DRM zależy od zabezpieczeń i możliwości ochrony zawartości bazowej platformy sprzętowej. Możliwości sprzętowe urządzenia powinny obejmować sprzętowe bezpieczne uruchamianie w celu ustanowienia łańcucha zaufania bezpieczeństwa i ochrony kluczy kryptograficznych. Możliwości ochrony zawartości urządzenia powinny obejmować ochronę odszyfrowanych ramek w urządzeniu oraz ochronę zawartości za pomocą zaufanego mechanizmu ochrony danych wyjściowych. Nie wszystkie platformy sprzętowe obsługują wszystkie powyższe funkcje zabezpieczeń i ochrony zawartości. Bezpieczeństwo nigdy nie jest implementowane w jednym miejscu stosu, ale opiera się na integracji sprzętu, oprogramowania i usług. Połączenie funkcji zabezpieczeń sprzętowych, zaufanego mechanizmu rozruchu i izolowanego bezpiecznego systemu operacyjnego do obsługi funkcji zabezpieczeń ma kluczowe znaczenie dla zapewnienia bezpiecznego urządzenia.
Architektura
Struktura DRM została zaprojektowana tak, aby była niezależna od implementacji i abstrahowała szczegóły konkretnej implementacji schematu DRM we wtyczce DRM specyficznej dla schematu. Struktura DRM obejmuje proste interfejsy API do obsługi złożonych operacji DRM, uzyskiwania licencji, udostępniania urządzenia, kojarzenia zawartości DRM i jej licencji, a na koniec odszyfrowywania zawartości DRM.
Platforma Android DRM jest zaimplementowana w dwóch warstwach architektonicznych:
- Interfejs API platformy DRM, który jest udostępniany aplikacjom za pośrednictwem platformy aplikacji systemu Android.
- Natywna struktura kodu DRM, która udostępnia interfejs dla wtyczek DRM (agentów) do obsługi zarządzania prawami i odszyfrowywania dla różnych schematów DRM.


Zobacz Android Media DRM i Android Media Crypto , aby uzyskać więcej informacji.
Wtyczki DRM
Podczas uruchamiania systemu struktura DRM skanuje instancje/usługi HAL (opisane w plikach .rc
) i wtyczki są wykrywane przez rejestr HIDL. Media DRM Server ( mediadrmserver
) tworzy obiekty CryptoHal
i DrmHal
. CryptoHal
i DrmHal
następnie wywołują wtyczki z implementacjami specyficznymi dla dostawcy.
Wtyczki powinny implementować zbindowane warstwy HAL. Zbindowane warstwy HAL korzystają z języka definicji interfejsu HAL (HIDL) , który umożliwia zastąpienie struktury bez konieczności przebudowywania warstw HAL.
Wtyczki są budowane przez dostawców lub twórców SOC i umieszczane w partycji /vendor
na urządzeniu. Wszystkie urządzenia uruchamiane z systemem Android 8.0 lub nowszym muszą obsługiwać zbinderyzowane warstwy HAL napisane w języku HIDL.
Realizacja
Aby zaimplementować nowe API frameworków DRM za pomocą wtyczki:
- Dodaj usługę wtyczki do plików kompilacji urządzenia.
- Zaktualizuj manifest urządzenia.
- Dodaj uprawnienia SELinux.
- Utwórz plik
.rc
w katalogu/vendor
. - Zaimplementuj wtyczkę.
Interfejsy API są zdefiniowane w każdej wersji IDrmPlugin.hal
, ICryptoPlugin.hal
, IDrmFactory.hal
i ICryptoFactory.hal
PLATFORM_ROOT/hardware/interfaces/drm/VERSION/
Dodawanie usługi wtyczek do plików kompilacji urządzenia
Na przykład, aby dodać obsługę interfejsu 1.3, plik VENDOR DEVICE /device.mk
musi zawierać pakiety android.hardware.drm@1.3-service.*
:
Wersje 1.0 do 1.2 są przestarzałe w R / Android 11. Urządzenia aktualizowane do R mogą nadal uruchamiać wersje 1.0 do 1.2. Jednak nowe urządzenia uruchamiane z R muszą działać tylko w wersji 1.3.
PRODUCT_PACKAGES += \ android.hardware.drm@1.0-impl \ android.hardware.drm@1.0-service \ android.hardware.drm@1.3-service.clearkey \ android.hardware.drm@1.3-service.widevine
Aktualizacja manifestu urządzenia
Plik vendor manifest.xml
dla urządzenia musi zawierać następujące wpisy:
android.hardware.drm hwbinder @1.3::ICryptoFactory/clearkey @1.3::IDrmFactory/clearkey @1.3::ICryptoFactory/widevine @1.3::IDrmFactory/widevine
Alternatywnie zalecamy użycie vintf_fragments.
Dodawanie uprawnień SELinux
- Dodaj do
VENDOR DEVICE /sepolicy/vendor/file.te
type mediadrm_vendor_data_file, file_type, data_file_type;
- Dodaj do
VENDOR DEVICE /sepolicy/vendor/file_contexts
Zalecamy używanie wyrażeń regularnych do określania numerów wersji, aby uniknąć aktualizacji dla nowych wydań, na przykład:
/vendor/bin/hw/android\.hardware\.drm@\[0-9]+\.[0-9]+-service\.clearkey u:object_r:hal_drm_clearkey_exec:s0
/data/vendor/mediadrm(/.*)? u:object_r:mediadrm_vendor_data_file:s0Alternatywnie zaktualizuj numery wersji, jak pokazano poniżej.
/vendor/bin/hw/android\.hardware\.drm@1\.3-service\.clearkey u:object_r:hal_drm_clearkey_exec:s0
/data/vendor/mediadrm(/.*)? u:object_r:mediadrm_vendor_data_file:s0 - Dodaj do
device/sepolicy/vendor/hal_drm_clearkey.te
allow hal_drm_clearkey mediadrm_vendor_data_file:dir create_dir_perms; allow hal_drm_clearkey mediadrm_vendor_data_file:file create_file_perms;
Tworzenie pliku .rc w katalogu /vendor
Plik .rc
określa działania, które należy podjąć po uruchomieniu usługi.
Aby uzyskać szczegółowe informacje, zobacz Język Android Init .
Implementacja wtyczki
- Zaimplementuj punkt wejścia
main()
wservice.cpp
usługi wtyczki. - Zaimplementuj
ICryptoPlugin
,IDrmPlugin
,ICryptoFactory
iIDrmFactory
. - Zaimplementuj nowe interfejsy API we wtyczce.
Szczegóły wtyczki DRM
Dostawcy wtyczek DRM implementują wtyczki DrmFactory
, CryptoFactory
i DRM .
DrmFabryka
Klasa DrmHal
wyszukuje zarejestrowane usługi wtyczek DRM i tworzy odpowiednie wtyczki, które obsługują dany schemat kryptograficzny za pośrednictwem klasy DrmFactory
.
IDrmFactory jest głównym punktem wejścia do interakcji z warstwą HAL drm dostawcy za pośrednictwem interfejsu API createPlugin. API createPlugin służy do tworzenia instancji IDrmPlugin. 1.3 IDrmFactory musi zawsze tworzyć interfejsy 1.2 IDrmPlugin, które są zwracane za pomocą metody 1.0 createPlugin.
Return<void> getSupportedCryptoSchemes(getSupportedCryptoSchemes_cb _hidl_cb);
Nowość w 1.3 IDrmFactory, getSupportedCryptoSchemes zwraca listę obsługiwanych schematów kryptograficznych dla instancji HAL HIDL drm.
Return<bool> isCryptoSchemeSupported(const hidl_array<uint8_t, 16>uuid);
Określa, czy fabryka wtyczek jest w stanie skonstruować wtyczki DRM obsługujące dany schemat kryptograficzny, który jest określony przez identyfikator UUID.
Return<bool> isContentTypeSupported(const hidl_string &mimeType);
Określa, czy fabryka wtyczek jest w stanie konstruować wtyczki DRM, które obsługują dany format kontenera multimediów określony przez mimeType
.
Return<void> createPlugin(const hidl_array<uint8_t, 16>uuid, const hidl_string& appPackageName, createPlugin_cb _hidl_cb);
Konstruuje wtyczkę DRM dla schematu kryptograficznego określonego przez UUID.
Kryptowaluta
Klasa CryptoHal
wyszukuje zarejestrowane usługi wtyczek DRM i tworzy odpowiednie wtyczki, które obsługują dany schemat kryptograficzny za pośrednictwem klasy CryptoFactory
.
Return<bool> isCryptoSchemeSupported(const hidl_array<uint8_t, 16>uuid);
Określa, czy fabryka krypto jest w stanie skonstruować wtyczki krypto, które obsługują dany schemat krypto, który jest określony przez identyfikator UUID.
Return<void> createPlugin(const hidl_array<uint8_t, 16>uuid, const hidl_vec<uint8_t>initData, createPlugin_cb _hidl_cb)
Określa, czy fabryka wtyczek jest w stanie skonstruować wtyczki kryptograficzne, które obsługują dany schemat kryptograficzny, który jest określony przez identyfikator UUID.
Wtyczka DRM
Interfejsy API są zdefiniowane whardware/interfaces/drm/ VERSION /IDrmPlugin.hal
. Odpowiedni plik IDrmPlugin.h
można znaleźć w out/Song po kompilacji.