DRM

Ikona interfejsu HAL DRM na Androida

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

Framework

Platforma Android udostępnia 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 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 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.

Na rysunku 1 widać warstwę wyodrębniania DRM na poziomie sprzętu przed Androidem 11, a na rysunku 2 – warstwę na Androidzie 11 i nowszych:

Android DRM HAL

Rysunek 1. warstwa abstrakcji sprzętowej DRM w wersjach Androida starszych niż 11.

Android DRM HAL w Androidzie 11

Rysunek 2. warstwa abstrakcji sprzętowej DRM, która jest dostępna 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 system 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 funkcji ochrony treści dostępnych na podstawowej 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. 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. Kluczowe znaczenie dla zapewnienia bezpieczeństwa urządzenia ma połączenie funkcji zabezpieczeń sprzętowych, mechanizmu zaufanego 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 implementacji konkretnego 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 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.

Na rysunku 3 widać platformę DRM przed Androidem 11, a na rysunku 4 – na Androidzie 11 i nowszych:

Platforma DRM Androida

Rysunek 3. Platforma DRM w wersjach Androida starszych niż 11.

Platforma DRM Androida od Androida 11

Rysunek 4. System DRM w wersji Android 11.

Więcej informacji znajdziesz w MediaDrm i MediaCrypto.

Wtyczki DRM

Podczas uruchamiania systemu platforma DRM przeszukuje instancje HAL i usługi (opisane w plikach .rc ) oraz wykrywa wtyczki. Serwer DRM multimediów (mediadrmserver) tworzy obiekty CryptoHal i DrmHal. CryptoHalDrmHal, a następnie wywołują wtyczki z implementacjami konkretnych dostawców.

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

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). Możesz też użyć vintf_fragments.

Dodawanie uprawnień SELinux

  1. Dodaj uprawnienia do VENDOR DEVICE/sepolicy/vendor/file.te:
    type mediadrm_vendor_data_file, file_type, data_file_type;
  2. Dodaj uprawnienia 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 uprawnienia 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 komponencie usługi 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 oraz wtyczkę DRM.

Klasa DrmFactory

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

IDrmFactory to główny punkt wejścia do interakcji z biblioteką HAL DRM dostawcy za pomocą metody createPlugin. 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 szyfrowania dla instancji AIDL DRM HAL. Ta sekwencja określa, czy fabryka wtyczek może tworzyć wtyczki DRM obsługujące dany schemat szyfrowania, który jest określony za pomocą identyfikatora 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 szyfrowania określonego za pomocą identyfikatora 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 wtyczki DRM i tworzy odpowiednie wtyczki obsługujące dany schemat szyfrowania 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 za pomocą identyfikatora 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 szyfrowania, które obsługują dany schemat szyfrowania 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);

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ą wersję pliku IDrmPlugin.h znajdziesz w out/Soong po kompilacji.