
Na tej stronie znajdziesz omówienie platformy zarządzania prawami cyfrowymi (DRM) na Androidzie oraz interfejsów, które musi implementować wtyczka DRM. Ta strona nie zawiera opisu reguł dotyczących odporności ani reguł zgodności, które mogą być zdefiniowane przez system DRM.
Framework
Platforma Android udostępnia rozszerzalną strukturę DRM, która umożliwia aplikacjom zarządzanie treściami chronionymi prawami zgodnie z ograniczeniami licencji powiązanymi z tymi treściami. Platforma DRM obsługuje wiele schematów DRM. Producent urządzenia określa, które schematy DRM są obsługiwane przez urządzenie. Platforma DRM udostępnia ujednolicony interfejs dla deweloperów aplikacji i ukrywa złożoność operacji DRM. Platforma DRM zapewnia spójny tryb działania w przypadku treści chronionych i niechronionych. Schematy DRM mogą definiować złożone modele użytkowania za pomocą metadanych licencji. Platforma DRM zapewnia powiązanie między treściami DRM a licencją i zarządza prawami. Dzięki temu odtwarzacz multimediów może być niezależny od treści chronionych lub niechronionych za pomocą DRM. Więcej informacji o klasie, która umożliwia uzyskiwanie kluczy do odszyfrowywania chronionych strumieni multimediów, znajdziesz w artykule MediaDrm.
Rysunek 1 przedstawia warstwę wyodrębniania sprzętu DRM przed Androidem 11, a rysunek 2 przedstawia tę warstwę w Androidzie 11 i nowszych wersjach:
Rysunek 1. Warstwa abstrakcji sprzętowej DRM przed Androidem 11.
Rysunek 2. Warstwa abstrakcji sprzętowej DRM od Androida 11.
Dostępność bogatych treści cyfrowych jest ważna dla użytkowników urządzeń mobilnych. Aby udostępniać swoje treści na szeroką skalę, deweloperzy aplikacji na Androida i wydawcy treści cyfrowych potrzebują spójnego wdrożenia DRM obsługiwanego w całym ekosystemie Androida. Aby udostępnić treści cyfrowe na urządzeniach z Androidem i zapewnić, że na wszystkich urządzeniach będzie dostępny co najmniej jeden spójny system DRM, Google udostępnia DRM bez opłat licencyjnych na zgodnych urządzeniach z Androidem. Wtyczka DRM jest zintegrowana z platformą DRM Androida i może korzystać z ochrony sprzętowej, aby zabezpieczać treści premium i dane logowania użytkownika.
Ochrona treści zapewniana przez wtyczkę DRM zależy od zabezpieczeń i funkcji ochrony treści na platformie sprzętowej. Możliwości sprzętowe urządzenia powinny obejmować bezpieczne uruchamianie sprzętu, aby utworzyć łańcuch zaufania zabezpieczeń i ochrony kluczy kryptograficznych. Funkcje ochrony treści na urządzeniu powinny obejmować ochronę odszyfrowanych klatek na urządzeniu oraz ochronę treści za pomocą zaufanego mechanizmu ochrony wyjścia. Nie wszystkie platformy sprzętowe obsługują wszystkie wymienione wyżej funkcje zabezpieczeń i ochrony treści. Zabezpieczenia nigdy nie są wdrażane w jednym miejscu w stosie, ale opierają się na integracji sprzętu, oprogramowania i usług. Połączenie funkcji zabezpieczeń sprzętu, mechanizmu zaufanego uruchamiania i odizolowanego bezpiecznego systemu operacyjnego do obsługi funkcji zabezpieczeń ma kluczowe znaczenie dla zapewnienia bezpieczeństwa urządzenia.
Architektura
Platforma DRM jest niezależna od implementacji i ukrywa szczegóły implementacji konkretnego schematu DRM w odpowiedniej wtyczce DRM. Platforma DRM zawiera proste interfejsy API do obsługi złożonych operacji DRM, uzyskiwania licencji, udostępniania urządzenia, kojarzenia treści DRM i licencji oraz odszyfrowywania treści DRM.
Platforma DRM na Androida jest zaimplementowana w 2 warstwach architektury:
- Interfejs API platformy DRM, który jest udostępniany aplikacjom za pomocą platformy aplikacji Androida
- Platforma DRM w kodzie natywnym, która udostępnia interfejs wtyczek DRM (agentów) do obsługi zarządzania prawami i odszyfrowywania w przypadku różnych schematów DRM.
Na rysunku 3 przedstawiono strukturę DRM przed Androidem 11, a na rysunku 4 – strukturę w Androidzie 11 i nowszych wersjach:
Rysunek 3. Platforma DRM przed Androidem 11.
Rysunek 4. Platforma DRM od Androida 11.
Więcej informacji znajdziesz w sekcjach MediaDrm i MediaCrypto.
Wtyczki DRM
Podczas uruchamiania systemu platforma DRM skanuje instancje i usługi HAL (opisane w .rc
) i wykrywa wtyczki. Serwer Media DRM (mediadrmserver
) tworzy obiekty CryptoHal
i DrmHal
.
CryptoHal
i DrmHal
, a następnie wywołuje wtyczki z implementacjami specyficznymi dla dostawcy.
Wtyczki powinny implementować interfejsy HAL z użyciem mechanizmu Binder. HAL-e z interfejsem Binder korzystają z języka definiowania interfejsu Androida (AIDL), dzięki czemu można zastąpić platformę bez konieczności ponownego tworzenia HAL-i.
Wtyczki są tworzone przez dostawców lub producentów układów SOC i umieszczane w /vendor
na urządzeniu. Wszystkie urządzenia wprowadzane na rynek z Androidem 13 lub nowszym muszą obsługiwać interfejsy HAL z użyciem mechanizmu Binder napisane w języku AIDL.
Implementacja
Aby wdrożyć nowe interfejsy API platform DRM za pomocą wtyczki:
- Dodaj usługę wtyczki do plików kompilacji urządzenia.
- Zaktualizuj plik manifestu urządzenia.
- Dodaj uprawnienia SELinux.
- Utwórz plik
.rc
w sekcji/vendor
. - Zaimplementuj wtyczkę.
Interfejsy API są zdefiniowane w każdej wersji IDrmPlugin.aidl
, ICryptoPlugin.aidl
, IDrmFactory.aidl
i ICryptoFactory.aidl
.
aidl/PLATFORM_ROOT/hardware/interfaces/drm/
Dodawanie usługi wtyczki do plików kompilacji urządzenia
Aby na przykład dodać obsługę interfejsu AIDL, plik VENDOR DEVICE/device.mk
musi zawierać pakiety android.hardware.drm-service.*
:
PRODUCT_PACKAGES += \ android.hardware.drm-service.clearkey \ android.hardware.drm-service.widevine
Aktualizowanie pliku manifestu urządzenia
Plik vendor manifest.xml
na urządzeniu musi zawierać te wpisy:
<hal format="aidl"> <name>android.hardware.drm</name> <version>STABLE AIDL VERSION</version> <fqname>ICryptoFactory/clearkey</fqname> <fqname>IDrmFactory/clearkey</fqname> <fqname>ICryptoFactory/widevine</fqname> <fqname>IDrmFactory/widevine</fqname> </hal>
Stabilna wersja AIDL to numer wersji każdego wydania interfejsu AIDL API (np. 1, 2).
Zamiast tego zalecamy użycie vintf_fragments
.
Dodawanie uprawnień SELinux
- Dodawanie uprawnień do
VENDOR DEVICE/sepolicy/vendor/file.te
:
type mediadrm_vendor_data_file, file_type, data_file_type;
- Dodawanie uprawnień do
VENDOR DEVICE/sepolicy/vendor/file_contexts
:
/vendor/bin/hw/android\.hardware\.drm-service\.clearkey u:object_r:hal_drm_clearkey_exec:s0
/data/vendor/mediadrm(/.*)? u:object_r:mediadrm_vendor_data_file:s0 - Dodawanie uprawnień do
device/sepolicy/vendor/hal_drm_clearkey.te
:
vndbinder_use(hal_drm_clearkey) allow hal_drm_clearkey servicemanager:binder { call transfer }; allow hal_drm_clearkey hal_drm_service:service_manager add; allow hal_drm_clearkey { appdomain -isolated_app }:fd use; get_prop(ramdump, public_vendor_default_prop)
Utwórz plik RC w folderze /vendor
Plik .rc
określa działania, które mają zostać podjęte po uruchomieniu usługi.
Więcej informacji znajdziesz w artykule Język inicjowania Androida.
Wdrażanie wtyczki
- Zaimplementuj punkt wejścia
main()
wservice.cpp
usługi wtyczki. - Wdróż
ICryptoPlugin
,IDrmPlugin
,ICryptoFactory
iIDrmFactory
. - Wdróż nowe interfejsy API w wtyczce.
Szczegóły wtyczki DRM
Dostawcy wtyczek DRM wdrażają DrmFactory
, CryptoFactory
i wtyczkę DRM.
Klasa DrmFactory
Klasa DrmHal
wyszukuje zarejestrowane usługi wtyczek DRM i tworzy odpowiednie wtyczki, które obsługują dany schemat kryptograficzny za pomocą klasy DrmFactory
.
IDrmFactory
to główny punkt wejścia do interakcji z interfejsem HAL DRM dostawcycreatePlugin
. Użyj tej metody, aby utworzyć instancje IDrmPlugin
.
::ndk::ScopedAStatus getSupportedCryptoSchemes( std::vector<::aidl::android::hardware::drm::Uuid>* _aidl_return);
getSupportedCryptoSchemes
zwraca listę obsługiwanych schematów kryptograficznych
dla instancji AIDL DRM HAL. Ta sekwencja określa, czy fabryka wtyczek może tworzyć wtyczki DRM obsługujące dany schemat kryptograficzny, który jest określony przez identyfikator UUID:
::ndk::ScopedAStatus isCryptoSchemeSupported( const ::aidl::android::hardware::drm::Uuid& in_uuid, const std::string& in_mimeType, ::aidl::android::hardware::drm::SecurityLevel in_securityLevel, bool* _aidl_return);
Ta sekwencja określa, czy fabryka wtyczek może tworzyć wtyczki DRM obsługujące dany format kontenera multimediów określony przez mimeType
:
::ndk::ScopedAStatus isContentTypeSupported(const std::string& in_mimeType, bool* _aidl_return);
Ta sekwencja tworzy wtyczkę DRM dla schematu kryptograficznego określonego przez identyfikator UUID:
::ndk::ScopedAStatus createPlugin( const ::aidl::android::hardware::drm::Uuid& in_uuid, const std::string& in_appPackageName, std::shared_ptr<::aidl::android::hardware::drm::IDrmPlugin>* _aidl_return);
Klasa CryptoFactory
Klasa CryptoHal
wyszukuje zarejestrowane usługi wtyczek DRM i tworzy odpowiednie wtyczki, które obsługują dany schemat kryptograficzny za pomocą klasy CryptoFactory
.
Ta sekwencja określa, czy fabryka kryptograficzna może tworzyć wtyczki kryptograficzne obsługujące dany schemat kryptograficzny, który jest określony przez identyfikator UUID:
::ndk::ScopedAStatus isCryptoSchemeSupported( const ::aidl::android::hardware::drm::Uuid& in_uuid, bool* _aidl_return);
Ta sekwencja określa, czy fabryka wtyczek może tworzyć wtyczki kryptograficzne obsługujące dany schemat kryptograficzny, który jest określony przez identyfikator UUID:
::ndk::ScopedAStatus createPlugin( const ::aidl::android::hardware::drm::Uuid& in_uuid, const std::vector<uint8_t>& in_initData, std::shared_ptr<::aidl::android::hardware::drm::ICryptoPlugin>* _aidl_return);
Interfejsy API wtyczki DRM
Interfejsy API są zdefiniowane whardware/interfaces/drm/aidl/aidl_api/android.hardware.drm/
VERSION/android/hardware/drm/IDrmPlugin.aidl
. Odpowiedni plik IDrmPlugin.h
znajdziesz w folderze out/Soong
po kompilacji.