DRM

Ikona Android DRM HAL

Ten dokument zawiera omówienie mechanizmu zarządzania prawami cyfrowymi (DRM) w Androidzie oraz przedstawia interfejsy, które musi implementować wtyczka DRM. Ten dokument nie opisuje reguł dotyczących odporności ani reguł zgodności, które mogą być zdefiniowane przez schemat DRM.

Platforma

Platforma Android zapewnia 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 decyduje, które schematy DRM będą obsługiwane na urządzeniu. 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.

Android DRM HAL
Rysunek 1a. Warstwy abstrakcji sprzętu DRM przed Androidem 11
Android DRM HAL po R
Rysunek 1b. DRM hardware abstraction layer (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 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 możliwości ochrony treści na 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. Możliwości urządzenia w zakresie ochrony treści 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 opisane wyżej funkcje zabezpieczeń i ochrony treści. Zabezpieczenia nigdy nie są wdrażane w jednym miejscu w steku, 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 zaufanych funkcji 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 dotyczące konkretnej implementacji 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 Android.
  • 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.
Platforma DRM Androida
Rysunek 2a. Platforma DRM przed Androidem 11
Platforma DRM Androida
Rysunek 2b. Platforma DRM w Androidzie 11

Więcej informacji znajdziesz w artykule Android Media DRM Android Media Crypto.

Wtyczki DRM

Podczas uruchamiania systemu framework DRM przeszukuje instancje HAL lub usługi (opisane w plikach .rc ) i wykrywanie wtyczek. Serwer DRM multimediów (mediadrmserver) tworzy obiekty CryptoHal i DrmHal. Następnie wywołuj wtyczki za pomocą implementacji specyficznych dla dostawcy: CryptoHalDrmHal.

Wtyczki powinny stosować binderized HAL. Binderized HALs używają języka definiowania interfejsu Androida (AIDL), co pozwala zastąpić platformę 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

Urządzenia GMS i AOSP w wersji na Androida 13 muszą używać interfejsu AIDL.

Aby zaimplementować nowe interfejsy API mechanizmów DRM za pomocą wtyczki:

  1. Dodaj usługę wtyczki do plików kompilacji urządzenia.
  2. Zaktualizuj plik manifestu urządzenia.
  3. Dodaj uprawnienia SELinux.
  4. W sekcji /vendor utwórz plik .rc.
  5. Zaimplementuj wtyczkę.

Interfejsy API są zdefiniowane w każdej wersji IDrmPlugin.aidl, ICryptoPlugin.aidl, IDrmFactory.aidlICryptoFactory.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). Jako alternatywę zalecamy użycie vintf_fragments.

Dodawanie uprawnień SELinux

  1. Dodaj do VENDOR DEVICE/sepolicy/vendor/file.te
    type mediadrm_vendor_data_file, file_type, data_file_type;
  2. 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
  3. 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 mają być wykonywane po uruchomieniu usługi.

Szczegółowe informacje znajdziesz w artykule Język Androida Init.

Wdrożenie wtyczki

  1. W pluginie zaimplementuj punkt wejścia main() w komponencie service.cpp.
  2. Wdróż ICryptoPlugin, IDrmPlugin, ICryptoFactory i IDrmFactory.
  3. Wdroż nowe interfejsy API w pluginie.

Szczegóły wtyczki DRM

Dostawcy wtyczek DRM implementują DrmFactory, CryptoFactory i wtyczkę DRM.

DrmFactory

Klasa DrmHal wyszukuje zarejestrowane usługi wtyczki DRM i tworzy odpowiednie wtyczki obsługujące dany schemat szyfrowania za pomocą klasy DrmFactory.

IDrmFactory to główny punkt wejścia do interakcji z DRM HAL dostawcy za pomocą interfejsu createPlugin API. Interfejs 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 szyfrowania 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 tworzyć wtyczki DRM obsługujące dany schemat szyfrowania, który jest określony za pomocą identyfikatora UUID.

::ndk::ScopedAStatus isContentTypeSupported(const std::string& in_mimeType,
    bool* _aidl_return);

Określa, czy fabryka wtyczek jest w stanie tworzyć 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);

Tworzy wtyczkę DRM dla schematu szyfrowania określonego przez identyfikator UUID.

CryptoFactory

Klasa CryptoHal wyszukuje zarejestrowane usługi wtyczki DRM i tworzy odpowiednie wtyczki obsługujące dany schemat szyfrowania za pomocą klasy CryptoFactory.

::ndk::ScopedAStatus isCryptoSchemeSupported(
    const ::aidl::android::hardware::drm::Uuid& in_uuid,
    bool* _aidl_return);

Określa, czy fabryka kryptograficzna jest w stanie tworzyć wtyczki kryptograficzne obsługujące dany schemat kryptograficzny, który jest 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);

Określa, czy fabryka wtyczek jest w stanie tworzyć wtyczki szyfrowania, które obsługują dany schemat szyfrowania określony za pomocą identyfikatora UUID.

Interfejsy API wtyczki DRM

Interfejsy API są zdefiniowane w hardware/interfaces/drm/aidl/aidl_api/android.hardware.drm/ VERSION/android/hardware/drm/IDrmPlugin.aidl. Odpowiadający mu plik IDrmPlugin.h znajdziesz w folderze out/Soong po kompilacji.