DRM

Ikona Android DRM HAL

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:

Android DRM HAL

Rysunek 1. Warstwa abstrakcji sprzętowej DRM przed Androidem 11.

Uruchamianie interfejsu HAL DRM w Androidzie od wersji 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:

Platforma DRM na Androidzie

Rysunek 3. Platforma DRM przed Androidem 11.

Platforma DRM na Androidzie od wersji 11

Rysunek 4. Platforma DRM od Androida 11.

Więcej informacji znajdziesz w sekcjach MediaDrmMediaCrypto.

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 CryptoHalDrmHal. CryptoHalDrmHal, 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:

  1. Dodaj usługę wtyczki do plików kompilacji urządzenia.
  2. Zaktualizuj plik manifestu urządzenia.
  3. Dodaj uprawnienia SELinux.
  4. Utwórz plik .rc w sekcji /vendor.
  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ć 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

  1. Dodawanie uprawnień do VENDOR DEVICE/sepolicy/vendor/file.te:
    type mediadrm_vendor_data_file, file_type, data_file_type;
  2. 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
  3. 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

  1. Zaimplementuj punkt wejścia main()service.cpp usługi wtyczki.
  2. Wdróż ICryptoPlugin, IDrmPlugin, ICryptoFactoryIDrmFactory.
  3. 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 w hardware/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.