DRM

Ikona Android DRM HAL

Ten dokument zawiera przegląd struktury zarządzania prawami cyfrowymi w systemie Android (DRM) i przedstawia interfejsy, które musi implementować wtyczka DRM. Ten dokument nie opisuje reguł niezawodnoś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 zawartością chronioną prawami zgodnie z ograniczeniami licencyjnymi związanymi z zawartoś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 programistów aplikacji i ukrywa złożoność operacji DRM. Struktura DRM zapewnia spójny tryb działania dla treści chronionych i niechronionych. Schematy DRM mogą definiować złożone modele użytkowania na podstawie metadanych licencji. Struktura DRM zapewnia powiązanie między treścią DRM a licencją oraz obsługuje zarządzanie prawami. Umożliwia to wyodrębnienie odtwarzacza multimedialnego z zawartości chronionej przez DRM lub niezabezpieczonej. Zobacz MediaDrm dla klasy, aby uzyskać klucze do odszyfrowywania chronionych strumieni multimediów.

Android DRM HAL
Rysunek 1a. Warstwa abstrakcji sprzętu DRM przed Androidem 11
Android DRM HAL po R.
Rysunek 1b. Warstwa abstrakcji sprzętu DRM począwszy od Androida 11

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

Ochrona treści zapewniana przez wtyczkę DRM zależy od zabezpieczeń i możliwości ochrony zawartości podstawowej platformy sprzętowej. Możliwości sprzętowe urządzenia powinny obejmować bezpieczne uruchamianie sprzętu w celu ustanowienia łańcucha zaufania w zakresie 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 wdrażane w jednym miejscu na stosie, 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 wyodrębnia szczegóły implementacji konkretnego 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 końcu odszyfrowywania zawartości DRM.

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

  • Interfejs API struktury DRM, który jest udostępniany aplikacjom za pośrednictwem struktury aplikacji systemu Android.
  • Struktura DRM z natywnym kodem, która udostępnia interfejs dla wtyczek DRM (agentów) do zarządzania prawami i deszyfrowania dla różnych schematów DRM.
Struktura DRM systemu Android
Rysunek 2a. Framework DRM przed Androidem 11
Struktura DRM systemu Android
Rysunek 2b. Framework DRM począwszy od Androida 11

Aby uzyskać więcej informacji, zobacz Android Media DRM i Android Media Crypto .

Wtyczki DRM

Przy uruchamianiu systemu, skanuje DRM ramowe HAL wystąpień / usług (opisane w .rc plików) i wtyczki są odkryte poprzez rejestr HIDL. Media DRM Server ( mediadrmserver ) tworzy zarówno obiekty CryptoHal jak i DrmHal . CryptoHal i DrmHal wywołują wtyczki z implementacjami specyficznymi dla dostawcy.

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

Wtyczki są tworzone przez dostawców lub twórców SOC i umieszczane w partycji /vendor na urządzeniu. Wszystkie urządzenia uruchamiane z systemem Android 8.0 lub nowszym muszą obsługiwać zindeksowane warstwy HAL napisane w języku HIDL.

Realizacja

Aby zaimplementować nowe interfejsy API struktur 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 katalogu /vendor .
  5. Zaimplementuj wtyczkę.

Interfejsy API są zdefiniowane w każdej wersji IDrmPlugin.hal , ICryptoPlugin.hal , IDrmFactory.hal i ICryptoFactory.hal

PLATFORM_ROOT/hardware/interfaces/drm/VERSION/

Dodanie usługi wtyczki do plików kompilacji urządzenia

Na przykład, aby dodać obsługę interfejsu 1.3, plik VENDOR DEVICE /device.mk musi zawierać pakiety android.hardware.drm@1.3-service.* :

Wersje 1.0 do 1.2 są przestarzałe w R / Android 11. Na urządzeniach aktualizowanych do R nadal można uruchamiać wersje od 1.0 do 1.2. Jednak nowe urządzenia uruchamiane z R muszą działać tylko w wersji 1.3.


  PRODUCT_PACKAGES += \
    android.hardware.drm@1.0-impl \
    android.hardware.drm@1.0-service \
    android.hardware.drm@1.3-service.clearkey \
    android.hardware.drm@1.3-service.widevine

Aktualizuję manifest urządzenia

Plik vendor manifest.xml dla urządzenia musi zawierać następujące wpisy:


  <hal format="hidl">
    <name>android.hardware.drm</name>
      <transport>hwbinder</transport>
      <fqname>@1.3::ICryptoFactory/clearkey</fqname>
      <fqname>@1.3::IDrmFactory/clearkey</fqname>
      <fqname>@1.3::ICryptoFactory/widevine</fqname>
      <fqname>@1.3::IDrmFactory/widevine</fqname>
  </hal>

Alternatywnie zalecamy użycie vintf_fragments.

Dodanie 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

    Zalecamy używanie wyrażeń regularnych do określania numerów wersji, aby uniknąć aktualizacji dla nowych wydań, na przykład:

    /vendor/bin/hw/android\.hardware\.drm@\[0-9]+\.[0-9]+-service\.clearkey
          u:object_r:hal_drm_clearkey_exec:s0
    /data/vendor/mediadrm(/.*)? u:object_r:mediadrm_vendor_data_file:s0

    Alternatywnie zaktualizuj numery wersji, jak pokazano poniżej.

    /vendor/bin/hw/android\.hardware\.drm@1\.3-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
    allow hal_drm_clearkey mediadrm_vendor_data_file:dir create_dir_perms;
        allow hal_drm_clearkey mediadrm_vendor_data_file:file create_file_perms;
        

Tworzenie pliku .rc w katalogu / vendor

Plik .rc określa działania, które mają zostać podjęte po uruchomieniu usługi.

Aby uzyskać szczegółowe informacje, zobacz Język uruchamiania systemu Android .

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 wdrażają wtyczki DrmFactory , CryptoFactory i DRM.

DrmFactory

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

IDrmFactory jest głównym punktem wejścia do interakcji z warstwą HAL drm dostawcy za pośrednictwem interfejsu API createPlugin. Interfejs API createPlugin służy do tworzenia instancji IDrmPlugin. 1.3 IDrmFactory musi zawsze tworzyć interfejsy 1.2 IDrmPlugin, które są zwracane przez metodę 1.0 createPlugin.

Return<void> getSupportedCryptoSchemes(getSupportedCryptoSchemes_cb _hidl_cb);

Nowość w 1.3 IDrmFactory, getSupportedCryptoSchemes zwraca listę obsługiwanych schematów kryptograficznych dla instancji HIDL drm HAL.

Return<bool> isCryptoSchemeSupported(const hidl_array<uint8_t, 16>uuid);

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

Return<bool> isContentTypeSupported(const hidl_string &mimeType);

Określa, czy fabryka wtyczek jest w stanie tworzyć wtyczki DRM, które obsługują dany format kontenera multimediów określony przez mimeType .

Return<void> createPlugin(const hidl_array<uint8_t, 16>uuid,
        const hidl_string& appPackageName, createPlugin_cb _hidl_cb);

Konstruuje wtyczkę DRM dla schematu kryptograficznego określonego przez UUID.

CryptoFactory

Klasa CryptoHal wyszukuje zarejestrowane usługi wtyczek DRM i konstruuje odpowiednie wtyczki, które obsługują dany schemat kryptograficzny za CryptoFactory klasy CryptoFactory .

Return<bool> isCryptoSchemeSupported(const hidl_array<uint8_t, 16>uuid);

Określa, czy fabryka kryptograficzna jest w stanie konstruować wtyczki kryptograficzne obsługujące dany schemat kryptograficzny określony przez identyfikator UUID.

Return<void> createPlugin(const hidl_array<uint8_t, 16>uuid,
        const hidl_vec<uint8_t>initData, createPlugin_cb _hidl_cb)

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

Wtyczka DRM

Interfejsy API są zdefiniowane w hardware/interfaces/drm/ VERSION /IDrmPlugin.hal . Odpowiedni plik IDrmPlugin.h można znaleźć w out / Soong po kompilacji.