
Questo documento fornisce una panoramica del framework DRM (Digital Rights Management) di Android e introduce le interfacce che un plug-in DRM deve implementare. Questo documento non descrive le regole di robustezza o di conformità che possono 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. Spetta al produttore del dispositivo decidere quali schemi DRM supportare. 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à 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 sulla classe per ottenere le chiavi per decriptare gli stream multimediali protetti.


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 assicurarsi 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 funzionalità di sicurezza hardware, un meccanismo di avvio attendibile e un sistema operativo sicuro isolato per la gestione delle funzionalità di sicurezza è fondamentale per fornire un dispositivo sicuro.
Architettura
Il framework DRM è progettato per essere indipendente dall'implementazione e astrae i dettagli dell'implementazione specifica dello schema DRM 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 di applicazioni 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.


Per ulteriori dettagli, consulta Android Media DRM e Android Media Crypto.
Plug-in DRM
All'avvio del sistema, il framework DRM esegue la ricerca di istanze/servizi HAL (descritti nei file .rc
) e vengono rilevati 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
La versione dei dispositivi GMS e AOSP per Android 13 deve utilizzare l'interfaccia AIDL.
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 AIDL STABILE è il numero di versione di ogni release dell'API AIDL (ad es. 1, 2). In alternativa, ti consigliamo di utilizzare vintf_fragments.
Aggiungi le 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)
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.
DrmFactory
La classe DrmHal
cerca i servizi dei plug-in DRM registrati e crea 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 l'API createPlugin. L'API createPlugin viene utilizzata per creare istanze di 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.
::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 factory dei plug-in è in grado di creare plug-in DRM che supportano un determinato schema di crittografia, specificato da un UUID.
::ndk::ScopedAStatus isContentTypeSupported(const std::string& in_mimeType, bool* _aidl_return);
Determina se la factory dei plug-in è in grado di creare plug-in DRM che supportano un determinato formato del 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 di crittografia specificato dall'UUID.
CryptoFactory
La classe CryptoHal
cerca i servizi dei plug-in DRM registrati e crea i plug-in corrispondenti che supportano un determinato schema di crittografia tramite la classe CryptoFactory
.
::ndk::ScopedAStatus isCryptoSchemeSupported( const ::aidl::android::hardware::drm::Uuid& in_uuid, bool* _aidl_return);
Determina se la crypto factory è in grado di 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);
Determina se la factory dei plug-in è in grado di creare plug-in di crittografia che supportano un determinato schema di crittografia, specificato da un UUID.
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.