
Questo documento fornisce una panoramica del framework di gestione dei diritti digitali (DRM) di Android e introduce le interfacce che un plug-in DRM deve implementare. Questo documento non descrive le regole di robustezza o le regole di conformità che possono essere definite da uno schema DRM.
Struttura
La piattaforma Android fornisce un framework DRM estensibile che consente alle app di gestire i contenuti protetti da diritti in base ai vincoli di licenza associati al contenuto. Il framework DRM supporta molti schemi DRM; quali schemi DRM supportati da un dispositivo dipende dal produttore del dispositivo. Il framework DRM fornisce un'interfaccia unificata per gli sviluppatori di applicazioni e nasconde la complessità delle operazioni DRM. Il framework DRM fornisce una modalità operativa coerente per contenuto protetto e non protetto. Gli schemi DRM possono definire modelli di utilizzo complessi in base ai metadati della licenza. Il framework DRM fornisce l'associazione tra contenuto DRM e licenza e gestisce la gestione dei diritti. Ciò consente al lettore multimediale di essere estratto dal contenuto protetto o non protetto da DRM. Vedere MediaDrm per la classe per ottenere le chiavi per la decrittografia dei flussi multimediali protetti.


La disponibilità di contenuti digitali avanzati è importante per gli utenti sui dispositivi mobili. Per rendere i loro contenuti ampiamente disponibili, gli sviluppatori Android e gli editori di contenuti digitali necessitano di un'implementazione DRM coerente supportata nell'ecosistema Android. Per rendere disponibile il contenuto digitale sui dispositivi Android e garantire che sia disponibile almeno un DRM coerente su tutti i dispositivi, Google fornisce 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 supportata dall'hardware per proteggere i contenuti premium e le credenziali dell'utente.
La protezione dei contenuti fornita dal plug-in DRM dipende dalle capacità di sicurezza e protezione dei contenuti della piattaforma hardware sottostante. Le capacità hardware del dispositivo dovrebbero includere l'avvio sicuro dell'hardware per stabilire una catena di affidabilità di sicurezza e protezione delle chiavi crittografiche. Le capacità di protezione del contenuto del dispositivo dovrebbero includere la protezione dei frame decrittografati nel dispositivo e la protezione del contenuto attraverso un meccanismo di protezione dell'output affidabile. Non tutte le piattaforme hardware supportano tutte le funzionalità di sicurezza e protezione dei contenuti di cui sopra. La sicurezza non viene mai implementata in un'unica posizione nello stack, ma si basa invece sull'integrazione di hardware, software e servizi. La combinazione di funzioni di sicurezza hardware, un meccanismo di avvio affidabile 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 dello schema. Il framework DRM include API semplici per gestire complesse operazioni DRM, acquisire licenze, eseguire il provisioning del dispositivo, associare contenuto DRM e relativa licenza e infine decrittografare il contenuto DRM.
Il framework Android DRM è implementato in due livelli architetturali:
- Un'API del framework DRM, che viene esposta alle app tramite il framework dell'applicazione Android.
- Un framework DRM di codice nativo, che espone un'interfaccia per i plug-in DRM (agenti) per gestire la gestione dei diritti e la decrittografia per vari schemi DRM.


Vedi Android Media DRM e Android Media Crypto per maggiori dettagli.
Plugin DRM
All'avvio del sistema, il framework DRM esegue la scansione di istanze/servizi HAL (descritti nei file .rc
) e vengono rilevati i plug-in. Media DRM Server ( mediadrmserver
) crea oggetti CryptoHal
e DrmHal
. CryptoHal
e DrmHal
chiamano quindi i plug-in con implementazioni specifiche del fornitore.
I plugin dovrebbero implementare HAL binderizzati. Gli HAL vincolati utilizzano l' Android Interface Definition Language (AIDL) , che consente di sostituire il framework senza dover ricostruire gli HAL.
I plugin sono creati da fornitori o produttori di SOC e inseriti in una partizione /vendor
sul dispositivo. Tutti i dispositivi avviati con Android 13 o versioni successive devono supportare HAL binderizzati scritti nel linguaggio AIDL.
Implementazione
La versione per dispositivi GMS e AOSP per Android 13 deve utilizzare l'interfaccia AIDL.
Per implementare le nuove API dei framework DRM tramite un plug-in:
- Aggiungi il servizio plug-in ai file di build del dispositivo.
- Aggiorna il manifesto del dispositivo.
- Aggiungi i permessi di SELinux.
- Crea un file
.rc
in/vendor
. - Implementa il plugin.
Le API sono definite in ogni versione di IDrmPlugin.aidl
, ICryptoPlugin.aidl
, IDrmFactory.aidl
e ICryptoFactory.aidl
aidl/PLATFORM_ROOT/hardware/interfaces/drm/
Aggiunta del servizio 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
Aggiornamento del manifesto 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 STABLE AIDL VERSION è il numero di versione di ogni rilascio dell'API AIDL (ad es. 1, 2). In alternativa, consigliamo di utilizzare vintf_fragments.
Aggiunta delle autorizzazioni SELinux
- Aggiungi a
VENDOR DEVICE /sepolicy/vendor/file.te
type mediadrm_vendor_data_file, file_type, data_file_type;
- Aggiungi 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 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)
Creazione di un file .rc in /vendor
Il file .rc
specifica le azioni da intraprendere all'avvio di un servizio.
Vedi Lingua di inizializzazione Android per i dettagli.
Implementazione del plugin
- Implementare il punto di ingresso
main()
inservice.cpp
del servizio plugin. - Implementare
ICryptoPlugin
,IDrmPlugin
,ICryptoFactory
eIDrmFactory
. - Implementa le nuove API nel plugin.
Dettagli del plug-in DRM
I fornitori di plug-in DRM implementano i plug DrmFactory
, CryptoFactory
e DRM.
DrmFactory
La classe DrmHal
ricerca i servizi di plug-in DRM registrati e costruisce i plug-in corrispondenti che supportano un determinato schema crittografico tramite la classe DrmFactory
.
IDrmFactory è il punto di ingresso principale per interagire con il drm HAL di un fornitore tramite l'API createPlugin. L'API createPlugin viene utilizzata per creare istanze IDrmPlugin.
::ndk::ScopedAStatus getSupportedCryptoSchemes( std::vector<::aidl::android::hardware::drm::Uuid>* _aidl_return);
getSupportedCryptoSchemes restituisce un elenco di schemi crittografici supportati per l'istanza 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);
Determina se la fabbrica di plug-in è in grado di creare plug-in DRM che supportano un determinato schema crittografico, specificato da un UUID.
::ndk::ScopedAStatus isContentTypeSupported(const std::string& in_mimeType, bool* _aidl_return);
Determina se la fabbrica di plug-in è in grado di creare plug-in DRM che supportano un determinato formato di contenitore multimediale specificato da 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);
Costruisce un plug-in DRM per lo schema crittografico specificato da UUID.
CryptoFactory
La classe CryptoHal
ricerca i servizi di plug-in DRM registrati e costruisce i plug-in corrispondenti che supportano un determinato schema crittografico tramite la classe CryptoFactory
.
::ndk::ScopedAStatus isCryptoSchemeSupported( const ::aidl::android::hardware::drm::Uuid& in_uuid, bool* _aidl_return);
Determina se la fabbrica di criptovalute è in grado di costruire 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);
Determina se la fabbrica di plug-in è in grado di creare plug-in crittografici che supportano un determinato schema crittografico, specificato da un UUID.
API del 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 può essere trovato in out/Subito dopo la compilazione.