DRM

Ikona Androida DRM HAL

Ten dokument zawiera przegląd struktury zarządzania prawami cyfrowymi (DRM) w systemie Android i przedstawia interfejsy, które musi implementować wtyczka DRM. Ten dokument nie opisuje zasad solidności ani zasad 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ściami chronionymi prawami zgodnie z ograniczeniami licencyjnymi zwią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 treści chronionych i niechronionych. Schematy DRM mogą definiować złożone modele użytkowania na podstawie metadanych licencji. Struktura DRM zapewnia powiązanie pomiędzy zawartością DRM i licencją oraz obsługuje zarządzanie prawami. Umożliwia to wyodrębnienie odtwarzacza multimedialnego z treści chronionych lub niechronionych DRM. Zobacz MediaDrm, aby zapoznać się z klasą, 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, post 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 zapewnić szeroką dostępność treści, 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ć dostępność 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 ze strukturą Android DRM i może korzystać z ochrony sprzętowej w celu zabezpieczenia treści premium i danych uwierzytelniających użytkownika.

Ochrona treści zapewniana przez wtyczkę DRM zależy od możliwości bezpieczeństwa i ochrony treści podstawowej platformy sprzętowej. Możliwości sprzętowe urządzenia powinny obejmować sprzętowy bezpieczny rozruch w celu ustanowienia łańcucha zaufania bezpieczeństwa i ochrony kluczy kryptograficznych. Możliwości ochrony treści urządzenia powinny obejmować ochronę odszyfrowanych ramek w urządzeniu oraz ochronę treści poprzez zaufany mechanizm ochrony danych wyjściowych. Nie wszystkie platformy sprzętowe obsługują wszystkie powyższe funkcje zabezpieczeń i ochrony treści. Bezpieczeństwo nigdy nie jest wdrażane w jednym miejscu stosu, lecz opiera się na integracji sprzętu, oprogramowania i usług. Połączenie funkcji zabezpieczeń sprzętowych, zaufanego mechanizmu rozruchowego 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 streszczała 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, nabywania licencji, udostępniania urządzenia, kojarzenia treści DRM z licencją i wreszcie odszyfrowywania treści DRM.

Struktura 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.
  • Natywny kod DRM, który udostępnia interfejs dla wtyczek DRM (agentów) do obsługi zarządzania prawami i deszyfrowania dla różnych schematów DRM.
Struktura DRM dla Androida
Rysunek 2a. Struktura DRM przed Androidem 11
Struktura DRM dla Androida
Rysunek 2b. Struktura DRM począwszy od Androida 11

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

Wtyczki DRM

Podczas uruchamiania systemu środowisko DRM skanuje instancje/usługi HAL (opisane w plikach .rc ) i wykrywa wtyczki. Serwer Media DRM ( mediadrmserver ) tworzy obiekty CryptoHal i DrmHal . Następnie CryptoHal i DrmHal wywołują wtyczki z implementacjami specyficznymi dla dostawcy.

Wtyczki powinny implementować powiązane warstwy HAL. Powiązane warstwy HAL korzystają z języka definicji interfejsu systemu Android (AIDL) , który umożliwia wymianę struktury bez konieczności odbudowywania 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 13 lub nowszym muszą obsługiwać powiązane warstwy HAL zapisane w języku AIDL.

Realizacja

Wersja urządzeń GMS i AOSP dla systemu Android 13 musi korzystać z interfejsu AIDL.

Aby zaimplementować nowe interfejsy 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/

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

Zaktualizuj manifest urządzenia

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

Dodaj uprawnienia 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 należy podjąć po uruchomieniu usługi.

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

Zaimplementuj wtyczkę

  1. Zaimplementuj punkt wejścia main() w service.cpp usługi wtyczki.
  2. Zaimplementuj ICryptoPlugin , IDrmPlugin , ICryptoFactory i IDrmFactory .
  3. Zaimplementuj nowe 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 obsługujące dany schemat kryptograficzny poprzez klasę DrmFactory .

IDrmFactory to główny punkt wejścia do interakcji z warstwą HAL drm dostawcy poprzez 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 obsługujące dany schemat kryptograficzny określony przez UUID.

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

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

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

Fabryka Krypto

Klasa CryptoHal wyszukuje zarejestrowane usługi wtyczek DRM i konstruuje odpowiednie wtyczki obsługujące dany schemat kryptograficzny poprzez klasę CryptoFactory .

::ndk::ScopedAStatus isCryptoSchemeSupported(
    const ::aidl::android::hardware::drm::Uuid& in_uuid,
    bool* _aidl_return);

Określa, czy fabryka kryptowalut jest w stanie skonstruować wtyczki kryptograficzne obsługujące dany schemat kryptograficzny określony przez 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 obsługujące dany schemat kryptograficzny określony przez 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/wkrótce po kompilacji.