
Na tej stronie znajdziesz omówienie mechanizmu zarządzania prawami cyfrowymi (DRM) w Androidzie oraz interfejsy, które musi implementować wtyczka DRM. Ta strona nie opisuje reguł dotyczących odporności ani reguł zgodności, które mogą być zdefiniowane przez schemat DRM.
Framework
Platforma Android udostępnia rozszerzalne środowisko DRM, które umożliwia aplikacjom zarządzanie treściami chronionymi prawami autorskimi zgodnie z ograniczeniami licencji powiązanej 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 na podstawie metadanych licencji. Ramy DRM zapewniają powiązanie treści DRM z licencją i zarządzają prawami. Dzięki temu odtwarzacz multimediów może być abstrakcją dla treści chronionych i niechronionych DRM. Aby uzyskać klucze do odszyfrowywania chronionych strumieni multimediów, zobacz klasę MediaDrm.
Na rysunku 1 widać warstwę wyodrębniania DRM na poziomie sprzętu przed Androidem 11, a na rysunku 2 – warstwę na Androidzie 11 i nowszych:
Rysunek 1. warstwa abstrakcji sprzętowej DRM w wersjach Androida starszych niż 11.
Rysunek 2. warstwa abstrakcji sprzętowej DRM, która jest dostępna od Androida 11.
Dostępność bogatych treści cyfrowych jest ważna dla użytkowników urządzeń mobilnych. Aby udostępniać treści szerokiej publiczności, deweloperzy Androida i wydawcy treści cyfrowych muszą stosować spójne rozwiązanie DRM obsługiwane w całym ekosystemie Androida. Aby udostępnić treści cyfrowe na urządzeniach z Androidem i zapewnić co najmniej 1 system DRM dostępny na wszystkich urządzeniach, Google udostępnia system 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 chronić treści premium oraz dane logowania użytkownika.
Ochrona treści zapewniana przez wtyczkę DRM zależy od zabezpieczeń i funkcji ochrony treści dostępnych na podstawowej platformie sprzętowej. Funkcje sprzętowe urządzenia powinny obejmować bezpieczne uruchamianie sprzętowe, aby ustanowić łańcuch zaufania w zakresie bezpieczeństwa 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ą zaufanych mechanizmów 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 zestawie, ale polegają na integracji sprzętu, oprogramowania i usług. Kluczowe znaczenie dla zapewnienia bezpieczeństwa urządzenia ma połączenie funkcji zabezpieczeń sprzętowych, mechanizmu zaufanego uruchamiania i odizolowanego, bezpiecznego systemu operacyjnego do obsługi funkcji zabezpieczeń.
Architektura
Platforma DRM została zaprojektowana tak, aby nie zależeć od implementacji, a szczegóły implementacji konkretnego schematu DRM są abstrakcyjne w przypadku wtyczki DRM dla danego schematu. Platforma DRM zawiera proste interfejsy API do obsługi złożonych operacji DRM, pozyskiwania licencji, konfigurowania urządzenia, kojarzenia treści DRM i ich licencji oraz odszyfrowywania treści DRM.
Platforma DRM na Androida jest implementowana na 2 poziomach architektury:
- interfejs API platformy DRM, który jest udostępniany aplikacjom za pomocą platformy aplikacji Androida;
- Natywna platforma DRM, która udostępnia interfejs dla wtyczek DRM (agentów) do zarządzania prawami i odszyfrowywania w przypadku różnych schematów DRM.
Na rysunku 3 widać platformę DRM przed Androidem 11, a na rysunku 4 – na Androidzie 11 i nowszych:
Rysunek 3. Platforma DRM w wersjach Androida starszych niż 11.
Rysunek 4. System DRM w wersji Android 11.
Więcej informacji znajdziesz w MediaDrm i MediaCrypto.
Wtyczki DRM
Podczas uruchamiania systemu platforma DRM przeszukuje instancje HAL i usługi (opisane w plikach .rc
) oraz wykrywa wtyczki. Serwer DRM multimediów (mediadrmserver
) tworzy obiekty CryptoHal
i DrmHal
.
CryptoHal
i DrmHal
, a następnie wywołują wtyczki z implementacjami konkretnych dostawców.
Wtyczki powinny stosować binderized HAL. Binderized HALs używają języka definiowania interfejsu Androida (AIDL), co umożliwia zastąpienie platformy bez konieczności ponownego kompilowania HAL-i.
Wtyczki są tworzone przez dostawców lub producentów SOC i przechowywane na partycji /vendor
na urządzeniu. Wszystkie urządzenia z Androidem 13 lub nowszym muszą obsługiwać Binderized HALs napisane w języku AIDL.
Implementacja
Aby zaimplementować nowe interfejsy API mechanizmów DRM za pomocą wtyczki:
- Dodaj usługę wtyczki do plików kompilacji urządzenia.
- Zaktualizuj plik manifestu urządzenia.
- Dodaj uprawnienia SELinux.
- W sekcji
/vendor
utwórz plik.rc
. - 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ć te 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żdej wersji interfejsu AIDL API (np. 1, 2).
Możesz też użyć vintf_fragments
.
Dodawanie uprawnień SELinux
- Dodaj uprawnienia do
VENDOR DEVICE/sepolicy/vendor/file.te
:
type mediadrm_vendor_data_file, file_type, data_file_type;
- Dodaj uprawnienia 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 - Dodaj uprawnienia 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 katalogu /vendor.
Plik .rc
określa działania, które mają być wykonywane po uruchomieniu usługi.
Więcej informacji znajdziesz w artykule Język Androida Init.
Wdrożenie wtyczki
- Zaimplementuj punkt wejścia
main()
w komponencie usługiservice.cpp
. - Wdróż
ICryptoPlugin
,IDrmPlugin
,ICryptoFactory
iIDrmFactory
. - Wdroż nowe interfejsy API w pluginie.
Szczegóły wtyczki DRM
Dostawcy wtyczek DRM implementują DrmFactory
, CryptoFactory
oraz wtyczkę DRM.
Klasa DrmFactory
Klasa DrmHal
wyszukuje zarejestrowane usługi wtyczki DRM i tworzy odpowiednie wtyczki, które obsługują dany schemat szyfrowania za pomocą klasy DrmFactory
.
IDrmFactory
to główny punkt wejścia do interakcji z biblioteką HAL DRM dostawcy za pomocą metody createPlugin
. 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 szyfrowania dla instancji AIDL DRM HAL. Ta sekwencja określa, czy fabryka wtyczek może tworzyć wtyczki DRM obsługujące dany schemat szyfrowania, który jest określony za pomocą identyfikatora 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 szyfrowania określonego za pomocą identyfikatora 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 wtyczki DRM i tworzy odpowiednie wtyczki obsługujące dany schemat szyfrowania 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 za pomocą identyfikatora 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 szyfrowania, które obsługują dany schemat szyfrowania określony za pomocą identyfikatora 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ą wersję pliku IDrmPlugin.h
znajdziesz w out/Soong
po kompilacji.