
Questa pagina fornisce una panoramica del framework DRM (Digital Rights Management) di Android e introduce le interfacce che un plug-in DRM deve implementare. Questa pagina non descrive le regole di robustezza o conformità che potrebbero essere definite da uno schema DRM.
Framework
La piattaforma Android fornisce un framework DRM estensibile che consente alle app di gestire i contenuti protetti da diritti in base alle limitazioni della licenza associate ai contenuti. Il framework DRM supporta molti schemi DRM. È il produttore del dispositivo a determinare quali schemi DRM sono supportati dal dispositivo. Il framework DRM fornisce un'interfaccia unificata per gli sviluppatori di app e nasconde la complessità delle operazioni DRM. Il framework DRM fornisce una modalità di funzionamento coerente per i contenuti protetti e non protetti. Gli schemi DRM possono definire modelli di utilizzo complessi in base ai metadati della licenza. Il framework DRM fornisce l'associazione tra i contenuti DRM e la licenza e gestisce la gestione dei diritti. In questo modo, il media player può essere astratto dai contenuti protetti o non protetti da DRM. Consulta MediaDrm per informazioni su come la classe ottiene le chiavi per decriptare gli stream multimediali protetti.
La Figura 1 mostra il livello di estrazione hardware DRM prima di Android 11, mentre la Figura 2 mostra il livello in Android 11 e versioni successive:
Figura 1. Hardware Abstraction Layer (HAL) DRM prima di Android 11.
Figura 2. Hardware Abstraction Layer (HAL) DRM a partire da Android 11.
La disponibilità di contenuti digitali avanzati è importante per gli utenti che utilizzano dispositivi mobili. Per mettere i propri contenuti a disposizione di un pubblico più ampio, gli sviluppatori Android e i publisher di contenuti digitali hanno bisogno di un'implementazione DRM coerente supportata nell'intero ecosistema Android. Per rendere disponibili questi contenuti digitali sui dispositivi Android e per garantire che sia disponibile almeno un DRM coerente su tutti i dispositivi, Google fornisce il DRM senza costi di licenza sui dispositivi Android compatibili. Il plug-in DRM è integrato con il framework DRM di Android e può utilizzare la protezione basata su hardware per proteggere i contenuti premium e le credenziali utente.
La protezione dei contenuti fornita dal plug-in DRM dipende dalle funzionalità di sicurezza e protezione dei contenuti della piattaforma hardware di base. Le funzionalità hardware del dispositivo devono includere l'avvio protetto hardware per stabilire una catena di attendibilità della sicurezza e della protezione delle chiavi crittografiche. Le funzionalità di protezione dei contenuti del dispositivo devono includere la protezione dei frame decriptati nel dispositivo e la protezione dei contenuti tramite un meccanismo di protezione dell'output attendibile. Non tutte le piattaforme hardware supportano tutte le funzionalità di sicurezza e protezione dei contenuti sopra indicate. La sicurezza non viene mai implementata in un unico punto della pila, ma si basa sull'integrazione di hardware, software e servizi. La combinazione di funzioni di sicurezza hardware, un meccanismo di avvio attendibile e un sistema operativo sicuro isolato per la gestione delle funzioni di sicurezza è fondamentale per fornire un dispositivo sicuro.
Architettura
Il framework DRM è progettato per essere indipendente dall'implementazione e astrae i dettagli dell'implementazione dello schema DRM specifico in un plug-in DRM specifico per lo schema. Il framework DRM include API semplici per gestire operazioni DRM complesse, acquisire licenze, eseguire il provisioning del dispositivo, associare i contenuti DRM e la relativa licenza e infine decriptare i contenuti DRM.
Il framework DRM di Android è implementato in due livelli di architettura:
- Un'API framework DRM, esposta alle app tramite il framework app Android
- Un framework DRM in codice nativo che espone un'interfaccia per i plug-in DRM (agent) per gestire la gestione dei diritti e la decrittografia per vari schemi DRM
La Figura 3 mostra il framework DRM prima di Android 11, mentre la Figura 4 mostra il framework in Android 11 e versioni successive:
Figura 3. Framework DRM precedente ad Android 11.
Figura 4. Framework DRM a partire da Android 11.
Per ulteriori dettagli, consulta MediaDrm e MediaCrypto.
Plug-in DRM
All'avvio del sistema, il framework DRM esegue la ricerca di istanze e servizi HAL (descritti nei file .rc
) e scopre i plug-in. Media DRM Server (mediadrmserver
) crea sia gli oggetti CryptoHal
che DrmHal
.
CryptoHal
e DrmHal
chiamano poi i plug-in con implementazioni specifiche del fornitore.
I plug-in devono implementare HAL con binder. Le HAL con binder utilizzano il linguaggio Android Interface Definition Language (AIDL), che consente di sostituire il framework senza dover ricostruire le HAL.
I plug-in vengono creati da fornitori o produttori di SoC e inseriti in una partizione /vendor
sul dispositivo. Tutti i dispositivi lanciati con Android 13 o versioni successive devono supportare HAL con binderizzazione scritte
nel linguaggio AIDL.
Implementazione
Per implementare nuove API di framework DRM tramite un plug-in:
- Aggiungi il servizio del plug-in ai file di build del dispositivo.
- Aggiorna il file manifest del dispositivo.
- Aggiungi le autorizzazioni SELinux.
- Crea un file
.rc
in/vendor
. - Implementa il plug-in.
Le API sono definite in ogni versione di IDrmPlugin.aidl
,
ICryptoPlugin.aidl
, IDrmFactory.aidl
e ICryptoFactory.aidl
.
aidl/PLATFORM_ROOT/hardware/interfaces/drm/
Aggiungere il servizio del plug-in ai file di build del dispositivo
Ad esempio, per aggiungere il supporto dell'interfaccia AIDL, il file VENDOR DEVICE/device.mk
deve includere i pacchetti android.hardware.drm-service.*
:
PRODUCT_PACKAGES += \ android.hardware.drm-service.clearkey \ android.hardware.drm-service.widevine
Aggiorna il file manifest del dispositivo
Il file vendor manifest.xml
per il dispositivo deve includere le seguenti voci:
<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 versione stabile di AIDL è il numero di versione di ogni release dell'API AIDL (ad esempio 1, 2).
In alternativa, ti consigliamo di utilizzare vintf_fragments
.
Aggiungi le autorizzazioni SELinux
- Aggiungi le autorizzazioni a
VENDOR DEVICE/sepolicy/vendor/file.te
:
type mediadrm_vendor_data_file, file_type, data_file_type;
- Aggiungi le autorizzazioni a
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 - Aggiungi le autorizzazioni a
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)
Crea un file RC in /vendor
Il file .rc
specifica le azioni da intraprendere quando viene lanciato un servizio.
Per maggiori dettagli, consulta Android Init Language.
Implementare il plug-in
- Implementa il punto di contatto
main()
inservice.cpp
del servizio del plug-in. - Implementa
ICryptoPlugin
,IDrmPlugin
,ICryptoFactory
eIDrmFactory
. - Implementa le nuove API nel plug-in.
Dettagli del plug-in DRM
I fornitori di plug-in DRM implementano DrmFactory
, CryptoFactory
e il plug-in DRM.
Classe DrmFactory
La classe DrmHal
cerca i servizi dei plug-in DRM registrati e costruisce i plug-in corrispondenti che supportano un determinato schema di crittografia tramite la classe DrmFactory
.
IDrmFactory
è il punto di contatto principale per interagire con l'HAL DRM di un fornitore tramite il metodo createPlugin
. Utilizza questo metodo per creare
istanze IDrmPlugin
.
::ndk::ScopedAStatus getSupportedCryptoSchemes( std::vector<::aidl::android::hardware::drm::Uuid>* _aidl_return);
getSupportedCryptoSchemes
restituisce un elenco di schemi di crittografia supportati per l'istanza HAL DRM AIDL. Questa sequenza determina se la fabbrica di plug-in può creare plug-in DRM che supportano un determinato schema di crittografia, specificato da 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);
Questa sequenza determina se la factory dei plug-in può creare plug-in DRM che supportano un determinato formato del contenitore multimediale specificato da mimeType
:
::ndk::ScopedAStatus isContentTypeSupported(const std::string& in_mimeType, bool* _aidl_return);
Questa sequenza crea un plug-in DRM per lo schema di crittografia specificato dall'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
cerca i servizi dei plug-in DRM registrati e costruisce i plug-in corrispondenti che supportano un determinato schema di crittografia tramite la classe CryptoFactory
.
Questa sequenza determina se la crypto factory può creare plug-in di crittografia che supportano un determinato schema di crittografia, specificato da un UUID:
::ndk::ScopedAStatus isCryptoSchemeSupported( const ::aidl::android::hardware::drm::Uuid& in_uuid, bool* _aidl_return);
Questa sequenza determina se la factory dei plug-in può creare plug-in di crittografia che supportano un determinato schema di crittografia, specificato da 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 dei plug-in DRM
Le API sono definite inhardware/interfaces/drm/aidl/aidl_api/android.hardware.drm/
VERSION/android/hardware/drm/IDrmPlugin.aidl
. Il file IDrmPlugin.h
corrispondente si trova in out/Soong
dopo la compilazione.