DRM

Android DRM HAL-Symbol

In diesem Dokument erhalten Sie einen Überblick über das Android-Framework für die digitale Rechteverwaltung (Digital Rights Management, DRM) und es werden die Schnittstellen beschrieben, die ein DRM-Plug-in implementieren muss. In diesem Dokument werden keine Robustheitsregeln oder Complianceregeln beschrieben, die durch ein DRM-Schema definiert werden können.

Framework

Die Android-Plattform bietet ein erweiterbares DRM-Framework, mit dem Apps urheberrechtlich geschützte Inhalte gemäß den mit den Inhalten verbundenen Lizenzeinschränkungen verwalten können. Das DRM-Framework unterstützt viele DRM-Schemas. Welche DRM-Schemas ein Gerät unterstützt, liegt im Ermessen des Geräteherstellers. Das DRM-Framework bietet eine einheitliche Oberfläche für Anwendungsentwickler und verdeckt die Komplexität der DRM-Vorgänge. Das DRM-Framework bietet einen einheitlichen Betriebsmodus für geschützte und nicht geschützte Inhalte. Mit DRM-Schemas können komplexe Nutzungsmodelle anhand von Lizenzmetadaten definiert werden. Das DRM-Framework stellt die Verknüpfung zwischen DRM-Inhalten und Lizenz her und verwaltet die Rechte. So kann der Mediaplayer von DRM-geschützten oder nicht geschützten Inhalten abstrahiert werden. Unter MediaDrm findest du Informationen zur Klasse, mit der Schlüssel zum Entschlüsseln geschützter Medienstreams abgerufen werden.

Android DRM HAL
Abbildung 1a DRM-Hardwareabstraktionsschicht vor Android 11
Android DRM HAL nach R
Abbildung 1b. DRM-Hardwareabstraktionsebene ab Android 11

Die Verfügbarkeit von Rich-Media-Content ist für Nutzer von Mobilgeräten wichtig. Um ihre Inhalte allgemein verfügbar zu machen, benötigen Android-Entwickler und Publisher von digitalen Inhalten eine einheitliche Implementierung der digitalen Rechteverwaltung, die im gesamten Android-Ökosystem unterstützt wird. Damit diese digitalen Inhalte auf Android-Geräten verfügbar sind und es mindestens eine einheitliche digitale Rechteverwaltung für alle Geräte gibt, stellt Google auf kompatiblen Android-Geräten eine digitale Rechteverwaltung ohne Lizenzgebühren zur Verfügung. Das DRM-Plug-in ist in das Android-DRM-Framework eingebunden und kann Premiuminhalte und Nutzeranmeldedaten mit hardwaregestütztem Schutz sichern.

Der vom DRM-Plug-in bereitgestellte Inhaltsschutz hängt von den Sicherheits- und Inhaltsschutzfunktionen der zugrunde liegenden Hardwareplattform ab. Die Hardwarefunktionen des Geräts sollten einen sicheren Start umfassen, um eine Vertrauenskette für die Sicherheit und den Schutz kryptografischer Schlüssel zu schaffen. Die Funktionen zum Schutz von Inhalten des Geräts sollten den Schutz von entschlüsselten Frames auf dem Gerät und den Schutz von Inhalten durch einen vertrauenswürdigen Mechanismus zum Schutz der Ausgabe umfassen. Nicht alle Hardwareplattformen unterstützen alle oben genannten Funktionen zum Schutz von Sicherheit und Inhalten. Sicherheit wird nie an einer einzigen Stelle im Stack implementiert, sondern basiert auf der Integration von Hardware, Software und Diensten. Die Kombination aus Hardware-Sicherheitsfunktionen, einem vertrauenswürdigen Boot-Mechanismus und einem isolierten sicheren Betriebssystem für die Verarbeitung von Sicherheitsfunktionen ist entscheidend für ein sicheres Gerät.

Architektur

Das DRM-Framework ist implementierungsunabhängig und abstrahiert die Details der Implementierung des jeweiligen DRM-Schemas in einem schemaspezifischen DRM-Plug-in. Das DRM-Framework enthält einfache APIs, mit denen komplexe DRM-Vorgänge verarbeitet, Lizenzen erworben, das Gerät bereitgestellt, DRM-Inhalte und ihre Lizenz verknüpft und schließlich DRM-Inhalte entschlüsselt werden können.

Das Android-DRM-Framework ist in zwei Architekturschichten implementiert:

  • Eine DRM-Framework-API, die Apps über das Android-Anwendungsframework zur Verfügung gestellt wird.
  • Ein natives DRM-Framework, das eine Schnittstelle für DRM-Plug-ins (Agenten) bereitstellt, um die Rechteverwaltung und Entschlüsselung für verschiedene DRM-Schemata zu verarbeiten.
Android-DRM-Framework
Abbildung 2a. DRM-Framework vor Android 11
Android-DRM-Framework
Abbildung 2b. DRM-Framework ab Android 11

Weitere Informationen finden Sie unter Android Media DRM und Android Media Crypto.

DRM-Plug-ins

Beim Systemstart sucht das DRM-Framework nach HAL-Instanzen/-Diensten (in .rc -Dateien beschrieben) und Plugins werden gefunden. Der Media-DRM-Server (mediadrmserver) erstellt sowohl CryptoHal- als auch DrmHal-Objekte. CryptoHal und DrmHal rufen dann die Plug-ins mit anbieterspezifischen Implementierungen auf.

Plug-ins sollten binderisierte HALs implementieren. Für binderisierte HALs wird die Android Interface Definition Language (AIDL) verwendet. Dadurch kann das Framework ersetzt werden, ohne dass HALs neu erstellt werden müssen.

Plug-ins werden von Anbietern oder SOC-Herstellern erstellt und in eine /vendor-Partition auf dem Gerät eingefügt. Alle Geräte, die mit Android 13 oder höher auf den Markt kommen, müssen binderisierte HALs unterstützen, die in der AIDL-Sprache geschrieben sind.

Implementierung

GMS- und AOSP-Geräteversionen für Android 13 müssen die AIDL-Schnittstelle verwenden.

So implementierst du neue APIs für DRM-Frameworks über ein Plug-in:

  1. Fügen Sie den Build-Dateien des Geräts den Plug-in-Dienst hinzu.
  2. Aktualisieren Sie das Gerätemanifest.
  3. Fügen Sie SELinux-Berechtigungen hinzu.
  4. Erstellen Sie unter /vendor eine .rc-Datei.
  5. Implementieren Sie das Plug-in.

APIs werden in jeder Version von IDrmPlugin.aidl, ICryptoPlugin.aidl, IDrmFactory.aidl und ICryptoFactory.aidl definiert.

aidl/PLATFORM_ROOT/hardware/interfaces/drm/

Plug-in-Dienst zu Build-Dateien des Geräts hinzufügen

Wenn Sie beispielsweise die Unterstützung der AIDL-Schnittstelle hinzufügen möchten, muss die VENDOR DEVICE/device.mk-Datei die android.hardware.drm-service.*-Pakete enthalten:


  PRODUCT_PACKAGES += \
    android.hardware.drm-service.clearkey \
    android.hardware.drm-service.widevine

Gerätemanifest aktualisieren

Die vendor manifest.xml-Datei für das Gerät muss die folgenden Einträge enthalten:

  <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>

Die STABLE AIDL VERSION ist die Versionsnummer jedes AIDL API-Release (z.B. 1, 2). Alternativ empfehlen wir die Verwendung von vintf_fragments.

SELinux-Berechtigungen hinzufügen

  1. Zu VENDOR DEVICE/sepolicy/vendor/file.te
    hinzufügen
    type mediadrm_vendor_data_file, file_type, data_file_type;
  2. Zu VENDOR DEVICE/sepolicy/vendor/file_contexts
    hinzufügen
        /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. Zu device/sepolicy/vendor/hal_drm_clearkey.te
    hinzufügen
        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)
        

Erstellen Sie eine RC-Datei unter /vendor.

In der .rc-Datei werden die Aktionen festgelegt, die beim Starten eines Dienstes ausgeführt werden sollen.

Weitere Informationen finden Sie unter Android Init Language.

Plug-in implementieren

  1. Implementiere den main()-Einstiegspunkt in service.cpp des Plug-in-Dienstes.
  2. Implementieren Sie ICryptoPlugin, IDrmPlugin, ICryptoFactory und IDrmFactory.
  3. Implementieren Sie die neuen APIs im Plug-in.

Details zum DRM-Plug-in

Anbieter von DRM-Plug-ins implementieren DrmFactory, CryptoFactory und das DRM-Plug-in.

DrmFactory

Die Klasse DrmHal sucht nach registrierten DRM-Plug-in-Diensten und erstellt entsprechende Plug-ins, die ein bestimmtes Kryptoschema über die Klasse DrmFactory unterstützen.

IDrmFactory ist der Haupteinstiegspunkt für die Interaktion mit der drm HAL eines Anbieters über die createPlugin API. Mit der createPlugin API werden IDrmPlugin-Instanzen erstellt.

::ndk::ScopedAStatus getSupportedCryptoSchemes(
    std::vector<::aidl::android::hardware::drm::Uuid>* _aidl_return);

getSupportedCryptoSchemes gibt eine Liste der unterstützten Kryptoschemas für die AIDL drm HAL-Instanz zurück.

::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);

Bestimmt, ob die Plug-in-Fabrik DRM-Plug-ins erstellen kann, die ein bestimmtes Krypto-Schema unterstützen, das durch eine UUID angegeben wird.

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

Bestimmt, ob die Plug-in-Fabrik DRM-Plug-ins erstellen kann, die ein bestimmtes Mediencontainerformat unterstützen, das durch mimeType angegeben wird.

::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);

Erstellt ein DRM-Plug-in für das mit der UUID angegebene Kryptoschema.

CryptoFactory

Die Klasse CryptoHal sucht nach registrierten DRM-Plug-in-Diensten und erstellt entsprechende Plug-ins, die über die Klasse CryptoFactory ein bestimmtes Kryptoschema unterstützen.

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

Bestimmt, ob die Krypto-Factory Krypto-Plug-ins erstellen kann, die ein bestimmtes Krypto-Schema unterstützen, das durch eine UUID angegeben wird.

::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);

Bestimmt, ob die Plug-in-Factory Krypto-Plug-ins erstellen kann, die ein bestimmtes durch eine UUID angegebenes Kryptoschema unterstützen.

DRM-Plug-in-APIs

Die APIs sind in hardware/interfaces/drm/aidl/aidl_api/android.hardware.drm/ VERSION/android/hardware/drm/IDrmPlugin.aidl definiert. Die entsprechende IDrmPlugin.h-Datei finden Sie nach dem Build unter „out/Soong“.