
Ten dokument zawiera przegląd struktury zarządzania prawami cyfrowymi (DRM) w systemie Android i przedstawia interfejsy, które musi implementować wtyczka DRM. Ten dokument nie opisuje zasad solidności ani zasad 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ściami chronionymi prawami zgodnie z ograniczeniami licencyjnymi zwią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 treści chronionych i niechronionych. Schematy DRM mogą definiować złożone modele użytkowania na podstawie metadanych licencji. Struktura DRM zapewnia powiązanie pomiędzy zawartością DRM i licencją oraz obsługuje zarządzanie prawami. Umożliwia to wyodrębnienie odtwarzacza multimedialnego z treści chronionych lub niechronionych DRM. Zobacz MediaDrm, aby zapoznać się z klasą, 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 zapewnić szeroką dostępność treści, programiści Androida i wydawcy treści cyfrowych potrzebują spójnej implementacji DRM obsługiwanej w całym ekosystemie Androida. Aby udostępnić te treści cyfrowe na urządzeniach z Androidem i zapewnić dostępność 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 ze strukturą Android DRM i może korzystać z ochrony sprzętowej w celu zabezpieczenia treści premium i danych uwierzytelniających użytkownika.
Ochrona treści zapewniana przez wtyczkę DRM zależy od możliwości bezpieczeństwa i ochrony treści podstawowej platformy sprzętowej. Możliwości sprzętowe urządzenia powinny obejmować sprzętowy bezpieczny rozruch w celu ustanowienia łańcucha zaufania bezpieczeństwa i ochrony kluczy kryptograficznych. Możliwości ochrony treści urządzenia powinny obejmować ochronę odszyfrowanych ramek w urządzeniu oraz ochronę treści poprzez zaufany mechanizm ochrony danych wyjściowych. Nie wszystkie platformy sprzętowe obsługują wszystkie powyższe funkcje zabezpieczeń i ochrony treści. Bezpieczeństwo nigdy nie jest wdrażane w jednym miejscu stosu, lecz opiera się na integracji sprzętu, oprogramowania i usług. Połączenie funkcji zabezpieczeń sprzętowych, zaufanego mechanizmu rozruchowego 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 streszczała szczegóły implementacji konkretnego schematu DRM we wtyczce DRM specyficznej dla schematu. Struktura DRM obejmuje proste interfejsy API do obsługi złożonych operacji DRM, nabywania licencji, udostępniania urządzenia, kojarzenia treści DRM z licencją i wreszcie odszyfrowywania treści DRM.
Struktura 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.
- Natywny kod DRM, który udostępnia interfejs dla wtyczek DRM (agentów) do obsługi zarządzania prawami i deszyfrowania dla różnych schematów DRM.


Aby uzyskać więcej informacji, zobacz Android Media DRM i Android Media Crypto .
Wtyczki DRM
Podczas uruchamiania systemu środowisko DRM skanuje instancje/usługi HAL (opisane w plikach .rc
) i wykrywa wtyczki. Serwer Media DRM ( mediadrmserver
) tworzy obiekty CryptoHal
i DrmHal
. Następnie CryptoHal
i DrmHal
wywołują wtyczki z implementacjami specyficznymi dla dostawcy.
Wtyczki powinny implementować powiązane warstwy HAL. Powiązane warstwy HAL korzystają z języka definicji interfejsu systemu Android (AIDL) , który umożliwia wymianę struktury bez konieczności odbudowywania warstw HAL.
Wtyczki są tworzone 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ć powiązane warstwy HAL zapisane w języku AIDL.
Realizacja
Wersja urządzeń GMS i AOSP dla systemu Android 13 musi korzystać z interfejsu AIDL.
Aby zaimplementować nowe interfejsy 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/
Dodaj usługę wtyczki 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
Zaktualizuj manifest urządzenia
Plik vendor manifest.xml
dla 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 API AIDL (np. 1, 2). Alternatywnie zalecamy użycie Vintf_fragments.
Dodaj uprawnienia 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)
Utwórz plik 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 początkowy systemu Android .
Zaimplementuj wtyczkę
- Zaimplementuj punkt wejścia
main()
wservice.cpp
usługi wtyczki. - Zaimplementuj
ICryptoPlugin
,IDrmPlugin
,ICryptoFactory
iIDrmFactory
. - Zaimplementuj nowe API we wtyczce.
Szczegóły wtyczki DRM
Dostawcy wtyczek DRM wdrażają wtyczki DrmFactory
, CryptoFactory
i DRM.
DrmFactory
Klasa DrmHal
wyszukuje zarejestrowane usługi wtyczek DRM i konstruuje odpowiednie wtyczki obsługujące dany schemat kryptograficzny poprzez klasę DrmFactory
.
IDrmFactory to główny punkt wejścia do interakcji z warstwą HAL drm dostawcy poprzez 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 obsługujące dany schemat kryptograficzny określony przez UUID.
::ndk::ScopedAStatus isContentTypeSupported(const std::string& in_mimeType, bool* _aidl_return);
Określa, czy fabryka wtyczek jest w stanie skonstruować wtyczki DRM obsługujące 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.
Fabryka Krypto
Klasa CryptoHal
wyszukuje zarejestrowane usługi wtyczek DRM i konstruuje odpowiednie wtyczki obsługujące 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 kryptowalut jest w stanie skonstruować wtyczki kryptograficzne obsługujące dany schemat kryptograficzny określony przez 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 obsługujące dany schemat kryptograficzny określony przez 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/wkrótce po kompilacji.