DRM

Icône Android DRM HAL

Ce document fournit une vue d'ensemble du cadre 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 ou les règles de conformité qui peuvent être définies par un schéma DRM.

Cadre

La plate-forme Android fournit un cadre 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 cadre DRM prend en charge de nombreux schémas DRM; les schémas DRM pris en charge par un périphérique dépendent du fabricant du périphérique. Le framework DRM fournit une interface unifiée pour les développeurs d'applications et masque la complexité des opérations DRM. La structure DRM fournit un mode de fonctionnement cohérent pour le contenu protégé et non protégé. Les schémas DRM peuvent définir des modèles d'utilisation complexes par des métadonnées de licence. La structure DRM fournit l'association entre le contenu DRM et la licence, et gère la gestion des droits. Cela permet au lecteur multimédia d'être extrait du contenu protégé par DRM ou non protégé. Voir MediaDrm pour la classe pour obtenir des clés pour déchiffrer les flux multimédias protégés.

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

La disponibilité d'un contenu numérique riche est importante pour les utilisateurs d'appareils mobiles. Pour rendre leur contenu largement disponible, les développeurs Android et les éditeurs de contenu numérique ont besoin d'une implémentation DRM cohérente prise en charge dans tout l'écosystème Android. Pour rendre ce contenu numérique disponible sur les appareils Android et pour garantir 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é à la structure Android DRM et peut utiliser une protection matérielle pour sécuriser le contenu premium et les informations d'identification des utilisateurs.

La protection du contenu fournie par le plug-in DRM dépend des capacités de sécurité et de protection du contenu de la plate-forme matérielle sous-jacente. Les capacités matérielles de l'appareil doivent inclure un démarrage sécurisé matériel pour établir une chaîne de confiance de sécurité et de protection des clés cryptographiques. Les capacités de protection du contenu de l'appareil doivent inclure la protection des trames décrypté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 prennent pas en charge toutes les fonctionnalités de sécurité et de protection du contenu ci-dessus. La sécurité n'est jamais mise en œuvre à 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 fiable et d'un système d'exploitation sécurisé isolé pour gérer les fonctions de sécurité est essentielle pour fournir un périphérique sécurisé.

Architecture

Le framework DRM est conçu pour être indépendant de l'implémentation et résume les détails de l'implémentation du schéma DRM spécifique dans un plugin DRM spécifique au schéma. La structure DRM comprend des API simples pour gérer des opérations DRM complexes, acquérir des licences, provisionner l'appareil, associer le contenu DRM et sa licence, et enfin décrypter le contenu DRM.

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

  • Une API de framework DRM, qui est exposée aux applications via le framework d'application Android.
  • Un framework DRM de code natif, qui expose une interface pour les plugins DRM (agents) pour gérer la gestion des droits et le décryptage pour divers schémas DRM.
Framework DRM Android
Figure 2a. Framework DRM avant Android 11
Framework DRM Android
Graphique 2b. Framework DRM à partir d'Android 11

Voir Android Media DRM et Android Media Crypto pour plus de détails.

Plugins DRM

Au démarrage du système, l'infrastructure DRM recherche les instances / services HAL (décrits dans les fichiers .rc ) et les plugins sont découverts via le registre HIDL. Media DRM Server ( mediadrmserver ) crée à la fois des objets CryptoHal et DrmHal . CryptoHal et DrmHal appellent ensuite les plugins avec des implémentations spécifiques au fournisseur.

Les plugins doivent implémenter des HAL en liasse. Les HAL liés utilisent le langage de définition d'interface HAL (HIDL) , qui permet de remplacer l' infrastructure sans avoir à reconstruire les HAL.

Les plugins sont créés par des fournisseurs ou des fabricants de SOC et placés dans une partition /vendor sur l'appareil. Tous les appareils lancés avec Android 8.0 ou version ultérieure doivent prendre en charge les HAL binderized écrits dans le langage HIDL.

Mise en œuvre

Pour implémenter de nouvelles API de frameworks DRM par un plugin:

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

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

PLATFORM_ROOT/hardware/interfaces/drm/VERSION/

Ajout d'un service de plug-in aux fichiers de construction de l'appareil

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

Les versions 1.0 à 1.2 sont obsolètes dans R / Android 11. Les appareils mis à niveau vers R sont toujours autorisés à exécuter les versions 1.0 à 1.2. Cependant, les nouveaux appareils lancés avec R ne doivent exécuter que la version 1.3.


  PRODUCT_PACKAGES += \
    android.hardware.drm@1.0-impl \
    android.hardware.drm@1.0-service \
    android.hardware.drm@1.3-service.clearkey \
    android.hardware.drm@1.3-service.widevine

Mettre à jour le manifeste de l'appareil

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


  <hal format="hidl">
    <name>android.hardware.drm</name>
      <transport>hwbinder</transport>
      <fqname>@1.3::ICryptoFactory/clearkey</fqname>
      <fqname>@1.3::IDrmFactory/clearkey</fqname>
      <fqname>@1.3::ICryptoFactory/widevine</fqname>
      <fqname>@1.3::IDrmFactory/widevine</fqname>
  </hal>

Alternativement, nous vous recommandons d'utiliser vintf_fragments.

Ajout d'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

    Nous vous recommandons d'utiliser des expressions régulières pour spécifier les numéros de version afin d'éviter d'effectuer des mises à jour pour les nouvelles versions, par exemple:

    /vendor/bin/hw/android\.hardware\.drm@\[0-9]+\.[0-9]+-service\.clearkey
          u:object_r:hal_drm_clearkey_exec:s0
    /data/vendor/mediadrm(/.*)? u:object_r:mediadrm_vendor_data_file:s0

    Vous pouvez également mettre à jour les numéros de version comme indiqué ci-dessous.

    /vendor/bin/hw/android\.hardware\.drm@1\.3-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
    allow hal_drm_clearkey mediadrm_vendor_data_file:dir create_dir_perms;
        allow hal_drm_clearkey mediadrm_vendor_data_file:file create_file_perms;
        

Créer un fichier .rc sous / vendor

Le fichier .rc spécifie les actions à entreprendre lors du lancement d'un service.

Voir Langue d'initialisation Android pour plus de détails.

Implémentation du plugin

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

Détails du plugin DRM

Les fournisseurs de plugins DRM implémentent DrmFactory , CryptoFactory et DRM.

DrmFactory

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

IDrmFactory est le principal point d'entrée pour interagir avec le drm HAL d'un fournisseur via l'API createPlugin. L'API createPlugin est utilisée pour créer des instances IDrmPlugin. La 1.3 IDrmFactory doit toujours créer des interfaces 1.2 IDrmPlugin, qui sont renvoyées via la méthode 1.0 createPlugin.

Return<void> getSupportedCryptoSchemes(getSupportedCryptoSchemes_cb _hidl_cb);

Nouveau dans 1.3 IDrmFactory, getSupportedCryptoSchemes renvoie une liste des schémas de chiffrement pris en charge pour l'instance HIDL drm HAL.

Return<bool> isCryptoSchemeSupported(const hidl_array<uint8_t, 16>uuid);

Détermine si la fabrique de plugins est capable de construire des plugins DRM qui prennent en charge un schéma de chiffrement donné, qui est spécifié par un UUID.

Return<bool> isContentTypeSupported(const hidl_string &mimeType);

Détermine si la fabrique de plugins est capable de construire des plugins DRM qui prennent en charge un format de conteneur multimédia donné spécifié par mimeType .

Return<void> createPlugin(const hidl_array<uint8_t, 16>uuid,
        const hidl_string& appPackageName, createPlugin_cb _hidl_cb);

Construit un plugin DRM pour le schéma de chiffrement spécifié par UUID.

CryptoFactory

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

Return<bool> isCryptoSchemeSupported(const hidl_array<uint8_t, 16>uuid);

Détermine si la fabrique de chiffrement est capable de construire des plugins de chiffrement qui prennent en charge un schéma de chiffrement donné, qui est spécifié par un UUID.

Return<void> createPlugin(const hidl_array<uint8_t, 16>uuid,
        const hidl_vec<uint8_t>initData, createPlugin_cb _hidl_cb)

Détermine si la fabrique de plugins est capable de construire des plugins de chiffrement qui prennent en charge un schéma de chiffrement donné, qui est spécifié par un UUID.

Plug-in DRM

Les API sont définies dans hardware/interfaces/drm/ VERSION /IDrmPlugin.hal . Le fichier IDrmPlugin.h correspondant peut être trouvé dans out / Soong après la construction.