DRM

Android DRM HAL-Symbol

Dieses Dokument bietet einen Überblick über das Android Digital Rights Management (DRM)-Framework und stellt die Schnittstellen vor, die ein DRM-Plugin implementieren muss. Dieses Dokument beschreibt keine Robustheitsregeln oder Compliance-Regeln, die durch ein DRM-Schema definiert werden können.

Rahmen

Die Android-Plattform bietet ein erweiterbares DRM-Framework, mit dem Apps rechtegeschützte Inhalte entsprechend den mit den Inhalten verbundenen Lizenzbeschränkungen verwalten können. Das DRM-Framework unterstützt viele DRM-Schemata; Welche DRM-Schemata ein Gerät unterstützt, liegt beim Gerätehersteller. Das DRM-Framework bietet eine einheitliche Schnittstelle für Anwendungsentwickler und verbirgt die Komplexität von DRM-Vorgängen. Das DRM-Framework bietet einen konsistenten Betriebsmodus für geschützte und nicht geschützte Inhalte. DRM-Systeme können anhand von Lizenzmetadaten komplexe Nutzungsmodelle definieren. Das DRM-Framework stellt die Verknüpfung zwischen DRM-Inhalt und Lizenz 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 Medienströme finden Sie unter MediaDrm .

Android DRM HAL
Abbildung 1a. DRM-Hardware-Abstraktionsschicht vor Android 11
Android DRM HAL nach R
Abbildung 1b. DRM-Hardware-Abstraktionsschicht ab Android 11

Die Verfügbarkeit umfangreicher digitaler Inhalte ist für Benutzer mobiler Geräte wichtig. Um ihre Inhalte allgemein verfügbar zu machen, benötigen Android-Entwickler und Herausgeber digitaler Inhalte eine konsistente DRM-Implementierung, die im gesamten Android-Ökosystem unterstützt wird. Um diese digitalen Inhalte auf Android-Geräten verfügbar zu machen und sicherzustellen, dass auf allen Geräten mindestens ein konsistentes DRM verfügbar ist, stellt Google DRM ohne Lizenzgebühren auf kompatiblen Android-Geräten bereit. Das DRM-Plugin ist in das Android DRM-Framework integriert und kann einen hardwaregestützten Schutz nutzen, um Premium-Inhalte und Benutzeranmeldeinformationen zu schützen.

Der vom DRM-Plugin bereitgestellte Inhaltsschutz hängt von den Sicherheits- und Inhaltsschutzfunktionen der zugrunde liegenden Hardwareplattform ab. Zu den Hardwarefunktionen des Geräts sollte ein Hardware-Secure-Boot gehören, um eine Vertrauenskette für Sicherheit und Schutz kryptografischer Schlüssel aufzubauen. Zu den Inhaltsschutzfunktionen des Geräts sollten der Schutz entschlüsselter Frames im Gerät und der Inhaltsschutz durch einen vertrauenswürdigen Ausgabeschutzmechanismus gehören. Nicht alle Hardwareplattformen unterstützen alle oben genannten Sicherheits- und Inhaltsschutzfunktionen. 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 zur Handhabung von Sicherheitsfunktionen ist entscheidend für die Bereitstellung eines sicheren Geräts.

Die Architektur

Das DRM-Framework ist implementiertungsunabhängig und abstrahiert die Details der spezifischen DRM-Schema-Implementierung in einem schemaspezifischen DRM-Plugin. Das DRM-Framework umfasst einfache APIs zur Abwicklung komplexer DRM-Vorgänge, zum Erwerb von Lizenzen, zur Bereitstellung des Geräts, zur Zuordnung von DRM-Inhalten und seiner Lizenz und schließlich zur Entschlüsselung von DRM-Inhalten.

Das Android DRM-Framework ist in zwei Architekturschichten implementiert:

  • Eine DRM-Framework-API, die über das Android-Anwendungsframework für Apps verfügbar gemacht wird.
  • Ein DRM-Framework mit nativem Code, das eine Schnittstelle für DRM-Plugins (Agenten) bereitstellt, um die Rechteverwaltung und Entschlüsselung für verschiedene DRM-Schemata zu übernehmen.
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-Plugins

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

Plugins sollten binderisierte HALs implementieren. Binderisierte HALs verwenden die Android Interface Definition Language (AIDL) , wodurch das Framework ersetzt werden kann, ohne dass HALs neu erstellt werden müssen.

Plugins werden von Anbietern oder SOC-Herstellern erstellt und in einer /vendor Partition auf dem Gerät abgelegt. Alle Geräte, die mit Android 13 oder höher gestartet werden, müssen binderisierte HALs unterstützen, die in der AIDL-Sprache geschrieben sind.

Implementierung

GMS- und AOSP-Geräte, die für Android 13 veröffentlicht werden, müssen die AIDL-Schnittstelle verwenden.

So implementieren Sie neue DRM-Frameworks-APIs durch ein Plugin:

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

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

aidl/PLATFORM_ROOT/hardware/interfaces/drm/

Plugin-Dienst zu Geräte-Build-Dateien hinzufügen

Um beispielsweise AIDL-Schnittstellenunterstützung hinzuzufügen, muss die Datei VENDOR DEVICE /device.mk die Pakete android.hardware.drm-service.* enthalten:


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

Aktualisieren Sie das Gerätemanifest

Die vendor manifest.xml 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 jeder AIDL-API-Version (z. B. 1, 2). Alternativ empfehlen wir die Verwendung von vintf_fragments.

Fügen Sie SELinux-Berechtigungen hinzu

  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

Die .rc Datei gibt die Aktionen an, die beim Start eines Dienstes ausgeführt werden sollen.

Weitere Informationen finden Sie unter Android Init Language .

Implementieren Sie das Plugin

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

Details zum DRM-Plugin

DRM-Plugin-Anbieter implementieren DrmFactory , CryptoFactory und DRM-Plugin.

DrmFactory

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

IDrmFactory ist der Haupteinstiegspunkt für die Interaktion mit dem DRM-HAL eines Anbieters über die createPlugin-API. Die createPlugin-API wird zum Erstellen von IDrmPlugin-Instanzen verwendet.

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

getSupportedCryptoSchemes gibt eine Liste der unterstützten Kryptoschemata 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 Plugin-Factory DRM-Plugins erstellen kann, die ein bestimmtes Kryptoschema unterstützen, das durch eine UUID angegeben wird.

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

Bestimmt, ob die Plugin-Factory DRM-Plugins 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);

Konstruiert ein DRM-Plugin für das durch die UUID angegebene Kryptoschema.

CryptoFactory

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

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

Bestimmt, ob die Kryptofabrik Krypto-Plugins erstellen kann, die ein bestimmtes Kryptoschema 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 Plugin-Factory in der Lage ist, Krypto-Plugins zu erstellen, die ein bestimmtes Krypto-Schema unterstützen, das durch eine UUID angegeben wird.

DRM-Plugin-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 in out/Soong.