
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 udostępnia 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 możliwości zabezpieczeń i 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 poprzez zaufany mechanizm 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 struktury 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 wykrywane są wtyczki. 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. Powiązane warstwy HAL używają języka definicji interfejsu systemu Android (AIDL) , który umożliwia zastąpienie struktury bez konieczności ponownego kompilowania 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 13 lub nowszym muszą obsługiwać zbinderyzowane warstwy HAL napisane w języku AIDL.
Realizacja
Urządzenia GMS i AOSP wydane na Androida 13 muszą korzystać z interfejsu AIDL.
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.aidl
, ICryptoPlugin.aidl
, IDrmFactory.aidl
i ICryptoFactory.aidl
aidl/PLATFORM_ROOT/hardware/interfaces/drm/
Dodawanie usługi wtyczek do plików kompilacji urządzenia
Na przykład, aby 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
Aktualizacja manifestu urządzenia
Plik vendor manifest.xml
urządzenia musi zawierać następujące 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 API AIDL (np. 1, 2). Alternatywnie zalecamy używanie 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
/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 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)
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ą 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.
::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.
::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);
Określa, czy fabryka wtyczek jest w stanie skonstruować wtyczki DRM, które obsługują dany schemat kryptograficzny, który jest określony przez identyfikator UUID.
::ndk::ScopedAStatus isContentTypeSupported(const std::string& in_mimeType, bool* _aidl_return);
Określa, czy fabryka wtyczek jest w stanie konstruować wtyczki DRM, które obsługują dany format kontenera multimediów określony przez mimeType
.
::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);
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
.
::ndk::ScopedAStatus isCryptoSchemeSupported( const ::aidl::android::hardware::drm::Uuid& in_uuid, bool* _aidl_return);
Określa, czy fabryka krypto jest w stanie skonstruować wtyczki kryptograficzne, które obsługują 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);
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.
Interfejsy API wtyczek DRM
Interfejsy API są zdefiniowane whardware/interfaces/drm/aidl/aidl_api/android.hardware.drm/ VERSION /android/hardware/drm/IDrmPlugin.aidl
. Odpowiedni plik IDrmPlugin.h
można znaleźć w out/Song po kompilacji.