digitale Rechteverwaltung

Symbol für Android-DRM-HAL

Auf dieser Seite finden Sie einen Überblick über das Android-Framework für die digitale Rechteverwaltung (Digital Rights Management, DRM) und die Schnittstellen, die ein DRM-Plug-in implementieren muss. Auf dieser Seite werden keine Robustheitsregeln oder Compliance-Regeln beschrieben, die möglicherweise durch ein DRM-Schema definiert werden.

Framework

Die Android-Plattform bietet ein erweiterbares DRM-Framework, mit dem Apps urheberrechtlich geschützte Inhalte gemäß den mit den Inhalten verknüpften Lizenzbeschränkungen verwalten können. Das DRM-Framework unterstützt viele DRM-Schemata. Der Gerätehersteller legt fest, welche DRM-Schemata ein Gerät unterstützt. Das DRM-Framework bietet eine einheitliche Schnittstelle für App-Entwickler und verbirgt die Komplexität von DRM-Vorgängen. Das DRM-Framework bietet einen einheitlichen Betriebsmodus für geschützte und nicht geschützte Inhalte. DRM-Schemata können komplexe Nutzungsmodelle anhand von Lizenzmetadaten definieren. Das DRM-Framework stellt die Verknüpfung zwischen DRM-Inhalten und Lizenzen her und übernimmt die Rechteverwaltung. Dadurch kann der Media-Player von DRM-geschützten oder nicht geschützten Inhalten abstrahiert werden. Informationen zur Klasse zum Abrufen von Schlüsseln zum Entschlüsseln geschützter Media-Streams finden Sie unter MediaDrm.

Abbildung 1 zeigt die DRM-Hardware-Extraktionsebene vor Android 11 und Abbildung 2 die Ebene in Android 11 und höher:

Android DRM HAL

Abbildung 1: DRM-Hardwareabstraktionsschicht vor Android 11.

Android DRM HAL ab Android 11

Abbildung 2: DRM-Hardwareabstraktionsschicht ab Android 11.

Die Verfügbarkeit umfangreicher digitaler Inhalte ist für Nutzer auf Mobilgeräten wichtig. Damit ihre Inhalte weit verbreitet werden können, benötigen Android-Entwickler und Verlage digitaler Inhalte eine einheitliche DRM-Implementierung, die im gesamten Android-Ökosystem unterstützt wird. Damit diese digitalen Inhalte auf Android-Geräten verfügbar sind und mindestens ein einheitliches DRM auf allen Geräten verfügbar ist, bietet Google auf kompatiblen Android-Geräten DRM ohne Lizenzgebühren an. Das DRM-Plug-in ist in das Android-DRM-Framework eingebunden und kann hardwaregestützten Schutz verwenden, um Premium-Inhalte und Anmeldedaten von Nutzern zu schützen.

Der durch das 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 Hardware-Bootvorgang umfassen, um eine Vertrauenskette für Sicherheit und 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 Ausgabeschutzmechanismus umfassen. Nicht alle Hardwareplattformen unterstützen alle oben genannten Sicherheits- und Inhaltsschutzfunktionen. Sicherheit wird nie an einer einzelnen Stelle im Stack implementiert, sondern beruht 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 die Bereitstellung eines sicheren Geräts.

Architektur

Das DRM-Framework ist so konzipiert, dass es unabhängig von der Implementierung ist. Die Details der Implementierung des jeweiligen DRM-Schemas werden in einem schemaspezifischen DRM-Plug-in abstrahiert. Das DRM-Framework umfasst einfache APIs für komplexe DRM-Vorgänge, zum Abrufen von Lizenzen, zum Bereitstellen des Geräts, zum Verknüpfen von DRM-Inhalten und der zugehörigen Lizenz und zum Entschlüsseln von DRM-Inhalten.

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

  • Eine DRM-Framework-API, die Apps über das Android-App-Framework zur Verfügung gestellt wird
  • Ein DRM-Framework für nativen Code, das eine Schnittstelle für DRM-Plug-ins (Agents) bereitstellt, um die Rechteverwaltung und Entschlüsselung für verschiedene DRM-Schemata zu verarbeiten

Abbildung 3 zeigt das DRM-Framework vor Android 11 und Abbildung 4 das Framework in Android 11 und höher:

Android-DRM-Framework

Abbildung 3: DRM-Framework vor Android 11.

Android-DRM-Framework ab Android 11

Abbildung 4: DRM-Framework ab Android 11

Weitere Informationen finden Sie unter MediaDrm und MediaCrypto.

DRM-Plug-ins

Beim Systemstart sucht das DRM-Framework nach HAL-Instanzen und ‑Diensten (die in .rc -Dateien beschrieben sind) und erkennt Plug-ins. 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. Binderized-HALs verwenden die Android Interface Definition Language (AIDL). Dadurch kann das Framework ersetzt werden, ohne dass HALs neu erstellt werden müssen.

Plug-ins werden von Anbietern oder SoC-Herstellern entwickelt und auf dem Gerät in einer /vendor-Partition abgelegt. Alle Geräte, die mit Android 13 oder höher auf den Markt kommen, müssen Binderized-HALs unterstützen, die in der AIDL-Sprache geschrieben sind.

Implementierung

So implementieren Sie neue DRM-Frameworks-APIs über ein Plug-in:

  1. Fügen Sie den Build-Dateien des Geräts den Plug-in-Dienst hinzu.
  2. Gerätemanifest aktualisieren.
  3. Fügen Sie SELinux-Berechtigungen hinzu.
  4. Erstellen Sie eine .rc-Datei unter /vendor.
  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 Geräte-Build-Dateien hinzufügen

Wenn Sie beispielsweise Unterstützung für AIDL-Schnittstellen hinzufügen möchten, muss die Datei VENDOR DEVICE/device.mk die folgenden 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 stabile 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. Berechtigungen für VENDOR DEVICE/sepolicy/vendor/file.te hinzufügen:
    type mediadrm_vendor_data_file, file_type, data_file_type;
  2. Berechtigungen für 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. Berechtigungen für 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)
        

RC-Datei unter /vendor erstellen

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

Weitere Informationen finden Sie unter Android Init Language.

Plug-in implementieren

  1. Implementieren Sie den Einstiegspunkt main() 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

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

Klasse 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 Methode createPlugin. Mit dieser Methode können Sie IDrmPlugin-Instanzen erstellen.

::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. Diese Sequenz bestimmt, ob die Plugin-Factory DRM-Plugins erstellen kann, die ein bestimmtes Kryptoschema unterstützen, das durch eine UUID angegeben wird:

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

Diese Sequenz bestimmt, ob die Plug-in-Factory DRM-Plug-ins erstellen kann, die ein bestimmtes, durch mimeType angegebenes Media-Containerformat unterstützen:

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

Mit dieser Sequenz wird ein DRM-Plug-in für das durch die UUID angegebene Kryptoschema erstellt:

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

Klasse CryptoFactory

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

Diese Sequenz 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 isCryptoSchemeSupported(
    const ::aidl::android::hardware::drm::Uuid& in_uuid,
    bool* _aidl_return);

Diese Sequenz bestimmt, ob die Plugin-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);

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 Datei IDrmPlugin.h finden Sie nach dem Build in out/Soong.