DRM

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 zapewnia 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 zabezpieczeń i możliwości 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 za pomocą zaufanego mechanizmu 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 platformy 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 wtyczki są wykrywane przez rejestr HIDL. 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. Zbindowane warstwy HAL korzystają z języka definicji interfejsu HAL (HIDL) , który umożliwia zastąpienie struktury bez konieczności przebudowywania 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 8.0 lub nowszym muszą obsługiwać zbinderyzowane warstwy HAL napisane w języku HIDL.

Realizacja

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.hal , ICryptoPlugin.hal , IDrmFactory.hal i ICryptoFactory.hal

PLATFORM_ROOT/hardware/interfaces/drm/VERSION/

Dodawanie usługi wtyczek 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. Urządzenia aktualizowane do R mogą nadal uruchamiać wersje 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

Aktualizacja manifestu 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.

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

    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 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ą wtyczki 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. 1.3 IDrmFactory musi zawsze tworzyć interfejsy 1.2 IDrmPlugin, które są zwracane za pomocą metody 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 HAL HIDL drm.

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

Określa, czy fabryka wtyczek jest w stanie skonstruować 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 konstruować 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.

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 .

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

Określa, czy fabryka krypto jest w stanie skonstruować wtyczki krypto, które obsługują dany schemat krypto, który jest 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 skonstruować wtyczki kryptograficzne, które obsługują 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/Song po kompilacji.