![Icona HAL DRM Android](https://source.android.google.cn/static/docs/core/media/images/ape_fwk_hal_drm.png?authuser=8&hl=it)
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 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 dai diritti in base ai vincoli di licenza associati al contenuto. Il framework DRM supporta molti schemi DRM; quali schemi DRM supportati da un dispositivo dipendono 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 i contenuti protetti e non protetti. Gli schemi DRM possono definire modelli di utilizzo complessi tramite metadati di 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 astratto dal contenuto protetto da DRM o non protetto. Vedi MediaDrm per la classe per ottenere le chiavi per decrittografare i flussi multimediali protetti.
![Android DRM HAL](https://source.android.google.cn/static/docs/core/media/images/ape_fwk_drm.png?authuser=8&hl=it)
![Posta HAL DRM Android R](https://source.android.google.cn/static/docs/core/media/images/aidl-ape_fwk_drm_postQ.png?authuser=8&hl=it)
La disponibilità di ricchi contenuti digitali è 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 in tutto l'ecosistema Android. Per rendere disponibili i contenuti digitali 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 da hardware per proteggere i contenuti premium e le credenziali dell'utente.
La protezione del contenuto fornita dal plug-in DRM dipende dalle capacità di sicurezza e protezione del contenuto della piattaforma hardware sottostante. Le funzionalità hardware del dispositivo dovrebbero includere l'avvio sicuro dell'hardware per stabilire una catena di fiducia di sicurezza e protezione delle chiavi crittografiche. Le funzionalità 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 attendibile. 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 unico punto dello 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 specifica dello schema DRM in un plug-in DRM specifico dello schema. Il framework DRM include semplici API per gestire operazioni DRM complesse, acquisire licenze, effettuare il provisioning del dispositivo, associare il contenuto DRM e la relativa licenza e infine decrittografare il contenuto DRM.
Il framework DRM Android è implementato in due livelli architettonici:
- Un'API del framework DRM, esposta alle app tramite il framework delle applicazioni Android.
- Un framework DRM in codice nativo, che espone un'interfaccia per plug-in DRM (agenti) per gestire la gestione dei diritti e la decrittografia per vari schemi DRM.
![Quadro DRM Android](https://source.android.google.cn/static/docs/shared-images/ape_fwk_drm_2.png?authuser=8&hl=it)
![Quadro DRM Android](https://source.android.google.cn/static/docs/core/media/images/ape_fwk_drm_2_postO.png?authuser=8&hl=it)
Per ulteriori dettagli, consulta Android Media DRM e Android Media Crypto .
Plugin DRM
All'avvio del sistema, il framework DRM esegue la scansione delle istanze/servizi HAL (descritti nei file .rc
) e vengono rilevati i plug-in. Media DRM Server ( mediadrmserver
) crea sia oggetti CryptoHal
che DrmHal
. CryptoHal
e DrmHal
chiamano quindi i plugin con implementazioni specifiche del fornitore.
I plugin dovrebbero implementare HAL binderizzati. Gli HAL binderizzati utilizzano Android Interface Definition Language (AIDL) , che consente la sostituzione del framework senza dover ricostruire gli HAL.
I plugin vengono creati dai fornitori o dai 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 dei 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 manifest del dispositivo.
- Aggiungi i permessi 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/
Aggiungi il 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
Aggiorna il 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 STABLE AIDL VERSION è il numero di versione di ciascuna versione dell'API AIDL (ad esempio 1, 2). In alternativa, consigliamo di utilizzare vintf_fragments.
Aggiungi i permessi 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
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 avviato un servizio.
Vedi Lingua di inizializzazione Android per i dettagli.
Implementa il plug-in
- Implementa 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 DrmFactory
, CryptoFactory
e plug-in DRM.
DrmFactory
La classe DrmHal
cerca servizi di plugin DRM registrati e costruisce plugin corrispondenti che supportano un dato schema crittografico attraverso la classe DrmFactory
.
IDrmFactory è il punto di ingresso principale per interagire con l'HAL drm 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 di crittografia supportati per l'istanza HAL AIDL drm.
::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 il plugin factory è in grado di costruire plugin DRM che supportano un dato schema crittografico, specificato da un UUID.
::ndk::ScopedAStatus isContentTypeSupported(const std::string& in_mimeType, bool* _aidl_return);
Determina se il plugin factory è in grado di costruire plugin DRM che supportano un dato formato 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 plugin DRM per lo schema crittografico specificato dall'UUID.
CryptoFactory
La classe CryptoHal
cerca servizi di plug-in DRM registrati e costruisce 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 crittografica è in grado di costruire plug-in crittografici che supportano un determinato schema crittografico, 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 il plugin factory è in grado di costruire plugin crittografici che supportano un determinato schema crittografico, 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 può essere trovato in out/Soong dopo la compilazione.