DRM

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.
Ikona HAL systemu Android DRM

Ten dokument zawiera omówienie struktury zarządzania prawami cyfrowymi (DRM) systemu Android i przedstawia interfejsy, które musi zaimplementować wtyczka DRM. Ten dokument nie opisuje reguł odporności ani reguł 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ścią chronioną prawami zgodnie z ograniczeniami licencji powią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 zawartości chronionej i niechronionej. Schematy DRM mogą definiować złożone modele użytkowania na podstawie metadanych licencji. Struktura DRM zapewnia powiązanie treści DRM z licencją oraz obsługuje zarządzanie prawami. Umożliwia to wyodrębnienie odtwarzacza multimedialnego z zawartości chronionej lub niechronionej przez DRM. Zobacz MediaDrm dla klasy, aby uzyskać klucze do odszyfrowywania chronionych strumieni multimediów.

Połącz system Android DRM
Rysunek 1a. Warstwa abstrakcji sprzętu DRM przed Androidem 11
Post HAL DRM dla Androida R
Rysunek 1b. Warstwa abstrakcji sprzętu DRM rozpoczynająca się w systemie Android 11

Dostępność bogatych treści cyfrowych jest ważna dla użytkowników urządzeń mobilnych. Aby ich treści były szeroko dostępne, programiści Androida i wydawcy treści cyfrowych potrzebują spójnej implementacji DRM obsługiwanej w całym ekosystemie Androida. Aby te treści cyfrowe były dostępne na urządzeniach z Androidem i aby zapewnić dostęp do co najmniej jednego spójnego DRM na wszystkich urządzeniach, Google udostępnia DRM bez opłat licencyjnych na zgodnych urządzeniach z Androidem. Wtyczka DRM jest zintegrowana z platformą Android DRM i może korzystać ze sprzętowej ochrony w celu zabezpieczenia treści premium i poświadczeń użytkownika.

Ochrona zawartości zapewniana przez wtyczkę DRM zależy od możliwości zabezpieczeń i ochrony zawartości bazowej platformy sprzętowej. Możliwości sprzętowe urządzenia powinny obejmować sprzętowe bezpieczne uruchamianie w celu ustanowienia łańcucha zaufania bezpieczeństwa i ochrony kluczy kryptograficznych. Możliwości ochrony zawartości urządzenia powinny obejmować ochronę odszyfrowanych ramek w urządzeniu oraz ochronę zawartości poprzez zaufany mechanizm ochrony danych wyjściowych. Nie wszystkie platformy sprzętowe obsługują wszystkie powyższe funkcje zabezpieczeń i ochrony zawartości. Bezpieczeństwo nigdy nie jest implementowane w jednym miejscu stosu, ale opiera się na integracji sprzętu, oprogramowania i usług. Połączenie funkcji zabezpieczeń sprzętowych, zaufanego mechanizmu rozruchu 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 abstrahowała szczegóły konkretnej implementacji schematu DRM we wtyczce DRM specyficznej dla schematu. Struktura DRM obejmuje proste interfejsy API do obsługi złożonych operacji DRM, uzyskiwania licencji, udostępniania urządzenia, kojarzenia zawartości DRM i jej licencji, a na koniec odszyfrowywania zawartości DRM.

Platforma Android DRM jest zaimplementowana w dwóch warstwach architektonicznych:

  • Interfejs API platformy DRM, który jest udostępniany aplikacjom za pośrednictwem struktury aplikacji systemu Android.
  • Natywna struktura kodu DRM, która udostępnia interfejs dla wtyczek DRM (agentów) do obsługi zarządzania prawami i odszyfrowywania dla różnych schematów DRM.
Platforma Android DRM
Rysunek 2a. Framework DRM przed Androidem 11
Platforma Android DRM
Rysunek 2b. Framework DRM od Androida 11

Zobacz Android Media DRM i Android Media Crypto , aby uzyskać więcej informacji.

Wtyczki DRM

Podczas uruchamiania systemu struktura DRM skanuje instancje/usługi HAL (opisane w plikach .rc ) i wykrywane są wtyczki. Media DRM Server ( mediadrmserver ) tworzy obiekty CryptoHal i DrmHal . CryptoHal i DrmHal następnie wywołują wtyczki z implementacjami specyficznymi dla dostawcy.

Wtyczki powinny implementować zbindowane warstwy HAL. Powiązane warstwy HAL używają języka definicji interfejsu systemu Android (AIDL) , który umożliwia zastąpienie struktury bez konieczności ponownego kompilowania warstw HAL.

Wtyczki są budowane 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ć zbinderyzowane warstwy HAL napisane w języku AIDL.

Realizacja

Urządzenia GMS i AOSP wydane na Androida 13 muszą korzystać z interfejsu AIDL.

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

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

Dodawanie usługi wtyczek 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

Aktualizacja manifestu urządzenia

Plik vendor manifest.xml 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 interfejsu API AIDL (np. 1, 2). Alternatywnie zalecamy używanie 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)
        

Tworzenie pliku .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 Android Init .

Implementacja wtyczki

  1. Zaimplementuj punkt wejścia main() w service.cpp usługi wtyczki.
  2. Zaimplementuj ICryptoPlugin , IDrmPlugin , ICryptoFactory i IDrmFactory .
  3. Zaimplementuj nowe interfejsy API we wtyczce.

Szczegóły wtyczki DRM

Dostawcy wtyczek DRM implementują DrmFactory , CryptoFactory i DRM .

DrmFabryka

Klasa DrmHal wyszukuje zarejestrowane usługi wtyczek DRM i tworzy odpowiednie wtyczki, które obsługują dany schemat kryptograficzny za pośrednictwem klasy DrmFactory .

IDrmFactory jest głównym punktem wejścia do interakcji z warstwą HAL drm dostawcy za pośrednictwem interfejsu 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, które obsługują dany schemat kryptograficzny, który jest określony przez identyfikator UUID.

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

Określa, czy fabryka wtyczek jest w stanie konstruować wtyczki DRM, które obsługują 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.

Kryptowaluta

Klasa CryptoHal wyszukuje zarejestrowane usługi wtyczek DRM i tworzy odpowiednie wtyczki, które obsługują 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 krypto jest w stanie skonstruować wtyczki kryptograficzne, które obsługują 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);

Określa, czy fabryka wtyczek jest w stanie skonstruować wtyczki kryptograficzne, które obsługują dany schemat kryptograficzny, który jest określony przez identyfikator UUID.

Interfejsy API wtyczek 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 można znaleźć w out/Song po kompilacji.