DRM

Icône HAL DRM Android

Ce document présente le framework de gestion des droits numériques (DRM) Android et présente les interfaces qu'un plug-in DRM doit implémenter. Ce document ne décrit pas les règles de robustesse ni les règles de conformité qui peuvent être définies par un schéma DRM.

Framework

La plate-forme Android fournit un framework DRM extensible qui permet aux applications de gérer le contenu protégé par des droits en fonction des contraintes de licence associées au contenu. Le framework DRM est compatible avec de nombreux schémas DRM. Le fabricant de l'appareil détermine les schémas DRM qu'il prend en charge. Le framework DRM fournit une interface unifiée aux développeurs d'applications et masque la complexité des opérations DRM. Le framework DRM fournit un mode de fonctionnement cohérent pour les contenus protégés et non protégés. Les schémas DRM peuvent définir des modèles d'utilisation complexes par métadonnées de licence. Le framework DRM établit l'association entre le contenu DRM et la licence, et gère la gestion des droits. Cela permet au lecteur multimédia d'être abstrait du contenu protégé ou non par DRM. Consultez MediaDrm pour que la classe obtienne des clés permettant de déchiffrer les flux multimédias protégés.

HAL DRM Android
Figure 1a. Couche d'abstraction matérielle DRM avant Android 11
Android DRM HAL post R
Figure 1b. Couche d'abstraction matérielle DRM à partir d'Android 11

La disponibilité de contenus numériques riches est importante pour les utilisateurs d'appareils mobiles. Pour rendre leurs contenus largement disponibles, les développeurs Android et les éditeurs de contenus numériques ont besoin d'une implémentation DRM cohérente compatible avec l'écosystème Android. Pour rendre ces contenus numériques disponibles sur les appareils Android et s'assurer qu'au moins un DRM cohérent est disponible sur tous les appareils, Google fournit des DRM sans frais de licence sur les appareils Android compatibles. Le plug-in DRM est intégré au framework DRM Android et peut utiliser une protection basée sur le matériel pour sécuriser le contenu premium et les identifiants utilisateur.

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

Architecture

Le framework DRM est conçu pour être indépendant de l'implémentation et effectue une abstraction des détails de l'implémentation du schéma DRM spécifique dans un plug-in DRM spécifique au schéma. Le framework DRM inclut des API simples pour gérer les opérations DRM complexes, acquérir des licences, provisionner l'appareil, associer le contenu DRM et sa licence, et enfin déchiffrer le contenu DRM.

Le framework DRM Android est implémenté en deux couches architecturales:

  • API de framework DRM, exposée aux applications via le framework d'applications Android.
  • Framework DRM en code natif, qui expose une interface permettant aux plug-ins DRM (agents) de gérer la gestion des droits et le déchiffrement pour divers schémas DRM.
Framework DRM Android
Figure 2a. Framework DRM antérieur à Android 11
Framework DRM d'Android
Figure 2b : Framework DRM à partir d'Android 11

Pour en savoir plus, consultez Android Media DRM et Android Media Crypto.

Plug-ins DRM

Au démarrage du système, le framework DRM analyse les instances/services HAL (décrits dans les fichiers .rc ), et des plug-ins sont détectés. Le serveur Media DRM (mediadrmserver) crée à la fois des objets CryptoHal et DrmHal. CryptoHal et DrmHal appellent ensuite les plug-ins avec des implémentations spécifiques au fournisseur.

Les plug-ins doivent implémenter des HAL liés. Les HAL liées utilisent le langage de définition d'interface Android (AIDL), ce qui permet de remplacer le framework sans avoir à recompiler les HAL.

Les plug-ins sont créés par les fournisseurs ou les fabricants de SoC, et placés dans une partition /vendor sur l'appareil. Tous les appareils lancés avec Android 13 ou version ultérieure doivent prendre en charge les HAL liées écrites dans le langage AIDL.

Implémentation

La version des appareils GMS et AOSP pour Android 13 doit utiliser l'interface AIDL.

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

  1. Ajoutez le 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 les 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 AIDL STABLE 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 à effectuer lorsqu'un service est lancé.

Pour en savoir plus, consultez la section Langage d'initialisation Android.

Implémenter le plug-in

  1. Implémentez le point d'entrée main() dans le fichier service.cpp du service de plug-in.
  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 le plug-in DRM.

DrmFactory

La classe DrmHal recherche les services de plug-in DRM enregistrés et crée les plug-ins correspondants compatibles avec un schéma de cryptographie donné via la classe 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 permet de 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 cryptographie compatibles pour l'instance HAL drm AIDL.

::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 avec 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 peut créer des plug-ins DRM compatibles avec un format de conteneur multimédia donné 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.

CryptoFactory

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

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

Détermine si la fabrique de cryptographie peut créer des plug-ins de cryptographie compatibles avec un schéma de cryptographie 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. Le fichier IDrmPlugin.h correspondant se trouve dans out/Soong après la compilation.