
Cette page présente le framework Android de gestion des droits numériques (DRM) et les interfaces qu'un plug-in DRM doit implémenter. Cette page ne décrit pas les règles de robustesse ni les règles de conformité qui peuvent être définies par un système de gestion des droits numériques.
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'un appareil 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 systèmes DRM peuvent définir des modèles d'utilisation complexes à l'aide de métadonnées de licence. Le framework DRM fournit l'association entre le contenu et la licence DRM, et gère la gestion des droits. Cela permet d'abstraire le lecteur multimédia du contenu protégé ou non par DRM. Consultez MediaDrm pour obtenir la classe permettant d'obtenir les clés de déchiffrement des flux multimédias protégés.
La figure 1 montre la couche d'extraction matérielle DRM avant Android 11, et la figure 2 montre la couche dans Android 11 et versions ultérieures :
Figure 1 : Couche d'abstraction matérielle DRM avant Android 11.
Figure 2. Couche d'abstraction matérielle DRM à partir d'Android 11.
La disponibilité de contenus numériques enrichis est importante pour les utilisateurs d'appareils mobiles. Pour que leur contenu soit largement disponible, les développeurs Android et les éditeurs de contenu numérique ont besoin d'une implémentation DRM cohérente et compatible avec l'écosystème Android. Pour rendre ce contenu numérique disponible sur les appareils Android et s'assurer qu'au moins un DRM cohérent est disponible sur tous les appareils, Google fournit un DRM sans frais de licence sur les appareils Android compatibles. Le plug-in DRM est intégré au framework Android DRM et peut utiliser une protection matérielle pour sécuriser les contenus 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 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 fonctionnalités de protection du contenu de l'appareil doivent inclure la protection des frames décryptés 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 toutes les fonctionnalités de sécurité et de protection du contenu mentionnées 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érielles, d'un mécanisme de démarrage sécurisé et d'un OS sécurisé isolé pour la gestion des 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 abstrait les 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 Android DRM est implémenté dans deux couches architecturales :
- Une API de framework DRM, qui est exposée aux applications via le framework d'application Android
- Framework DRM de code natif, qui expose une interface pour les plug-ins (agents) DRM afin de gérer la gestion des droits et le déchiffrement pour différents schémas DRM
La figure 3 montre le framework DRM avant Android 11, et la figure 4 montre le framework dans Android 11 et versions ultérieures :
Figure 3. Framework DRM avant Android 11.
Figure 4. Framework DRM à partir d'Android 11.
Pour en savoir plus, consultez MediaDrm et MediaCrypto.
Plug-ins DRM
Au démarrage du système, le framework DRM recherche les instances et les services HAL (décrits dans les fichiers .rc
) et découvre les plug-ins. Le serveur Media DRM (mediadrmserver
) crée 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 binderisées. Les HAL binderisés utilisent le langage de définition d'interface Android (AIDL), qui permet de remplacer le framework sans avoir à reconstruire les HAL.
Les plug-ins 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 13 ou version ultérieure doivent être compatibles avec les HAL binderisés écrits en langage AIDL.
Implémentation
Pour implémenter de nouvelles API de frameworks DRM par un plug-in :
- Ajoutez le service de plug-in aux fichiers de compilation de l'appareil.
- Mettez à jour le fichier manifeste de l'appareil.
- Ajoutez les autorisations SELinux.
- Créez un fichier
.rc
sous/vendor
. - 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 le 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 ou 2).
Vous pouvez également utiliser vintf_fragments
.
Ajouter des autorisations SELinux
- Ajoutez des autorisations à
VENDOR DEVICE/sepolicy/vendor/file.te
:
type mediadrm_vendor_data_file, file_type, data_file_type;
- Ajoutez des autorisations à
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 - Ajoutez des autorisations à
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 Langage d'initialisation Android.
Implémenter le plug-in
- Implémentez le point d'entrée
main()
dansservice.cpp
du service de plug-in. - Implémentez
ICryptoPlugin
,IDrmPlugin
,ICryptoFactory
etIDrmFactory
. - 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.
Classe 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 chiffrement donné via la classe DrmFactory
.
IDrmFactory
est le principal point d'entrée pour interagir avec le HAL DRM d'un fournisseur via la méthode createPlugin
. Utilisez cette méthode 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. Cette séquence détermine si la fabrique de plug-ins peut construire des plug-ins DRM compatibles avec un schéma de chiffrement donné, spécifié par un UUID :
::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);
Cette séquence détermine si la fabrique de plug-ins peut construire des plug-ins DRM compatibles avec un format de conteneur multimédia donné spécifié par mimeType
:
::ndk::ScopedAStatus isContentTypeSupported(const std::string& in_mimeType, bool* _aidl_return);
Cette séquence construit un plug-in DRM pour le schéma de chiffrement spécifié par l'UUID :
::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);
Classe 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 chiffrement donné via la classe CryptoFactory
.
Cette séquence détermine si la fabrique de chiffrement peut construire des plug-ins de chiffrement compatibles avec un schéma de chiffrement donné, spécifié par un UUID :
::ndk::ScopedAStatus isCryptoSchemeSupported( const ::aidl::android::hardware::drm::Uuid& in_uuid, bool* _aidl_return);
Cette séquence détermine si la fabrique de plug-ins peut construire 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);
API du plug-in DRM
Les API sont définies danshardware/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.