DRM

Icône HAL des DRM Android

Ce document présente le framework de gestion des droits numériques (DRM, Digital Rights Management) et présente les interfaces qu'un plug-in DRM doit implémenter. Ce document ne décrivent des règles de robustesse ou de conformité pouvant être définies par une DRM. d'un schéma.

Framework

La plate-forme Android fournit un framework DRM extensible qui permet applications gèrent les contenus protégés par des droits conformément à la licence associées au contenu. Le cadre DRM est compatible avec de nombreuses systèmes ; Les schémas DRM compatibles avec un appareil dépendent du fabricant de l'appareil. Le cadre DRM offre une interface unifiée pour les développeurs d'applications et qui masque la complexité des opérations DRM. Le cadre DRM offre une interface pour les contenus protégés et non protégés. Les systèmes DRM peuvent définir des modèles d'utilisation complexes par métadonnées de licence. Le cadre DRM fournit association entre le contenu DRM et la licence, et gère la gestion des droits. Ainsi, le lecteur multimédia n'est pas protégé par DRM les contenus non protégés. Voir MediaDrm pour que la classe obtienne des clés permettant de déchiffrer des flux multimédias protégés.

HAL DRM Android
Figure 1a : Abstraction matérielle DRM couche antérieure à Android 11
HAL pour les DRM Android après R
Figure 1b : Abstraction matérielle DRM Calque à partir d'Android 11

La disponibilité de contenus numériques enrichis est importante pour les utilisateurs d'appareils mobiles. À rendre leurs contenus accessibles au plus grand nombre, aux développeurs Android et aux contenus numériques les éditeurs ont besoin d'une mise en œuvre DRM cohérente et compatible avec l'ensemble des plates-formes Android dans l'écosystème Google. Pour rendre ce contenu numérique disponible sur les appareils Android et pour s'assure qu'au moins une DRM cohérente est disponible sur tous les appareils, Google fournit DRM sans frais de licence sur les appareils Android compatibles. Le plug-in DRM est sont intégrés au framework DRM d'Android et peuvent utiliser une protection intégrée au matériel. pour sécuriser le contenu premium et les identifiants utilisateur.

La protection du contenu fournie par le plug-in DRM dépend du niveau de sécurité et de protection du contenu de la plate-forme matérielle sous-jacente. La les fonctionnalités matérielles de l'appareil doivent inclure le démarrage sécurisé établir une chaîne de confiance pour la sécurité et la protection des clés cryptographiques. Les fonctionnalités de protection du contenu de l'appareil doivent inclure la protection les trames déchiffrées sur l'appareil et la protection du contenu via une sortie fiable mécanisme de protection. Toutes les plates-formes matérielles ne sont pas compatibles avec toutes les fonctionnalités ci-dessus de sécurité et de protection du contenu. La sécurité n'est jamais mise en œuvre dans un un seul endroit dans la pile, mais repose plutôt sur l'intégration du matériel, logiciels et services. La combinaison de fonctions de sécurité matérielle, un mécanisme de démarrage fiable et un système d'exploitation isolé et sécurisé pour gérer la sécurité. est essentiel pour fournir un appareil sécurisé.

Architecture

Le cadre DRM est conçu pour être indépendant de toute implémentation extrait les détails de la mise en œuvre spécifique du schéma DRM dans une plug-in DRM spécifique au schéma. Le framework DRM inclut des API simples à gérer des opérations DRM complexes, l'acquisition de licences, le provisionnement de l'appareil, associer le contenu DRM et sa licence, et enfin déchiffrer le contenu DRM.

Le framework DRM d'Android est implémenté dans deux couches architecturales:

  • Une API de framework DRM, exposée aux applications via l'application Android un framework d'application.
  • Framework DRM de code natif, qui propose une interface pour les plug-ins DRM (agents) pour gérer la gestion et le déchiffrement des droits pour divers systèmes de DRM.
Framework DRM d'Android
Figure 2a : framework DRM antérieur à Android 11
Framework DRM d'Android
Figure 2b : Framework DRM à partir d'Android 11

Voir Android Media DRM et <ph type="x-smartling-placeholder"></ph> Android Media Crypto pour en savoir plus.

Plug-ins DRM

Au démarrage du système, le framework DRM recherche les instances/services HAL (décrits dans les fichiers .rc ). et des plug-ins sont découverts. Le serveur DRM multimédia (mediadrmserver) crée les objets CryptoHal et DrmHal. CryptoHal et DrmHal, puis appellent les plug-ins avec le paramètre "provider-" des implémentations spécifiques.

Les plug-ins doivent implémenter les HAL liées. Les HAL avec liaison utilisent Langage de définition d'interface Android (AIDL) ce qui permet de remplacer le framework sans avoir à reconstruire les HAL.

Les plug-ins sont créés par les fournisseurs ou les fabricants de SOC et sont placés dans une partition /vendor sur l'appareil. Tous les appareils équipés d'Android 13 ou version ultérieure doivent être compatibles avec les HAL liées écrites en langage AIDL.

Implémentation

Les versions GMS et AOSP pour Android 13 doivent utiliser l'interface AIDL.

Pour implémenter de nouvelles API liées aux frameworks DRM à l'aide d'un plug-in:

  1. Ajoutez un service de plug-in aux fichiers de compilation de l'appareil.
  2. Mettez à jour le fichier manifeste de l'appareil.
  3. Ajoutez des autorisations SELinux.
  4. Créez un fichier .rc sous /vendor.
  5. Implémentez le plug-in.

Les API sont définies dans chaque version de IDrmPlugin.aidl, ICryptoPlugin.aidl, IDrmFactory.aidl, et ICryptoFactory.aidl

aidl/PLATFORM_ROOT/hardware/interfaces/drm/

Ajouter un service de plug-in aux fichiers de compilation de l'appareil

Par exemple, pour ajouter la prise en charge de l'interface AIDL, le fichier VENDOR DEVICE/device.mk doit inclure Packages android.hardware.drm-service.*:


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

Mettre à jour le fichier manifeste de l'appareil

Le fichier vendor manifest.xml de l'appareil doit inclure les entrées suivantes:

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

La VERSION STABLE AIDL correspond au numéro de version de chaque version de l'API AIDL (par exemple, 1, 2). Nous vous recommandons également d'utiliser vintf_fragments.

Ajouter des autorisations SELinux

  1. Ajouter à VENDOR DEVICE/sepolicy/vendor/file.te
    type mediadrm_vendor_data_file, file_type, data_file_type;
  2. Ajouter à 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. Ajouter à 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)
        

Créez un fichier RC sous /vendor.

Le fichier .rc spécifie les actions à entreprendre lorsqu'un service est lancé.

Voir Langue d'initialisation Android.

Implémenter le plug-in

  1. Implémentez le point d'entrée main() dans service.cpp du plug-in Google Cloud.
  2. Implémentez ICryptoPlugin, IDrmPlugin, ICryptoFactory et IDrmFactory.
  3. Implémentez les nouvelles API dans le plug-in.

Détails du plug-in DRM

Les fournisseurs de plug-ins DRM implémentent DrmFactory, CryptoFactory et Plug-in DRM.

DrmFactory

La classe DrmHal recherche les services de plug-ins DRM enregistrés et les crée les plug-ins correspondants qui prennent en charge un schéma de chiffrement donné via DrmFactory .

IDrmFactory est le principal point d'entrée pour interagir avec le HAL drm d'un fournisseur via l'API createPlugin. L'API createPlugin est utilisée pour créer des instances IDrmPlugin.

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

getsupportedCryptoSchemes renvoie une liste des schémas de chiffrement compatibles pour l'instance 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);

Détermine si la fabrique de plug-ins est capable de créer des plug-ins DRM compatibles un schéma de chiffrement donné, spécifié par un UUID.

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

Détermine si la fabrique de plug-ins est capable de créer des plug-ins DRM compatibles avec un format de conteneur multimédia spécifié par 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);

Construit un plug-in DRM pour le schéma de chiffrement spécifié par l'UUID.

Fabrique de chiffrement

La classe CryptoHal recherche les services de plug-ins DRM enregistrés et les crée les plug-ins correspondants qui prennent en charge un schéma de chiffrement donné via CryptoFactory .

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

Détermine si la fabrique de chiffrement est capable de créer des plug-ins de chiffrement compatibles avec un schéma de chiffrement donné, spécifié par un 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);

Détermine si la fabrique de plug-ins est capable de créer des plug-ins de chiffrement compatibles avec un schéma de chiffrement donné, spécifié par un UUID.

API de plug-in DRM

Les API sont définies dans hardware/interfaces/drm/aidl/aidl_api/android.hardware.drm/ VERSION/android/hardware/drm/IDrmPlugin.aidl. L'erreur correspondante Le fichier IDrmPlugin.h est disponible dans out/Soong après la compilation.