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. To, które schematy DRM obsługuje urządzenie, zależy od jego producenta. 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.

HAL DRM Androida
Rys. 1a. Abstrakcja dotycząca sprzętu DRM Warstwa przed Androidem 11
Android DRM HAL po R
Rys. 1b. Abstrakcja dotycząca sprzętu DRM Warstwa od Androida 11

Dostępność bogatych treści cyfrowych jest ważna dla użytkowników urządzeń mobilnych. Aby udostępnić swoje treści, deweloperzy aplikacji na Androida i wydawcy treści cyfrowych muszą wdrożyć spójne wdrożenie DRM 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ć sprzętowy bezpieczny rozruch, który zapewnia łańcuch zaufania 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. Połączenie sprzętowych funkcji zabezpieczeń, zaufanego mechanizmu uruchamiania i odizolowanego, bezpiecznego systemu operacyjnego do obsługi funkcji zabezpieczeń ma kluczowe znaczenie dla zapewnienia bezpiecznego urządzenia.

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 obejmuje proste interfejsy API do obsługi złożonych operacji DRM, pozyskiwania licencji, udostępniania urządzenia, przypisywania w nich treści DRM i 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.
Platforma DRM Androida
Rysunek 2a. Struktura DRM przed Androidem 11
Platforma DRM Androida
Rys. 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 danego dostawcy: CryptoHalDrmHal.

Wtyczki powinny stosować binderized HAL. Binderized HALs używa języka definiowania interfejsu Androida (AIDL), który umożliwia zastąpienie frameworku bez konieczności ponownego kompilowania HAL-ów.

Wtyczki są tworzone przez dostawców lub producentów SOC i przechowywane na partycji /vendor urządzenia. 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. Utwórz plik .rc w folderze /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/

Dodaj usługę wtyczek 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

Zaktualizuj plik 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.

Więcej informacji znajdziesz w artykule Język Androida Init.

Wdrożenie wtyczki

  1. Zaimplementuj punkt wejścia main() w service.cpp usługi wtyczki.
  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 interfejsem DRM HAL dostawcy za pomocą interfejsu API createPlugin. Interfejs API createPlugin służy do tworzenia instancji IDrmPlugin.

::ndk::ScopedAStatus getSupportedCryptoSchemes(
    std::vector<::aidl::android::hardware::drm::Uuid>* _aidl_return);

Metoda 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 szyfrowania, 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 może tworzyć wtyczki kryptograficzne obsługujące dany schemat kryptograficzny, który jest określany za pomocą identyfikatora UUID.

Interfejsy API wtyczki DRM

Interfejsy API są zdefiniowane w pliku 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.