
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 di 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 dai diritti in base ai vincoli della licenza associati ai contenuti. Il framework DRM supporta molti schemi DRM; il produttore del dispositivo determina quali schemi DRM sono supportati da un 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 tramite i metadati della licenza. Il framework DRM fornisce l'associazione tra i contenuti DRM e la licenza e gestisce i diritti. Ciò consente di astrarre il lettore multimediale dai contenuti protetti da DRM o non protetti. Consulta MediaDrm per la classe per ottenere le chiavi per decriptare i flussi 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. Livello di astrazione hardware DRM prima di Android 11.
Figura 2. Livello di astrazione hardware DRM a partire da Android 11.
La disponibilità di contenuti digitali avanzati è importante per gli utenti di dispositivi mobili. Per rendere i propri contenuti ampiamente disponibili, gli sviluppatori Android e gli editori di contenuti digitali hanno bisogno di un'implementazione coerente della gestione dei diritti digitali supportata in tutto l'ecosistema Android. Per rendere disponibili i contenuti digitali sui dispositivi Android e per 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 basata su hardware per proteggere i contenuti premium e le credenziali utente.
La protezione dei contenuti fornita dal plug-in DRM dipende dalla sicurezza e dalle funzionalità di protezione dei contenuti della piattaforma hardware sottostante. Le funzionalità hardware del dispositivo devono includere l'avvio protetto hardware per stabilire una catena di affidabilità 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 dello stack, 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 Android è implementato in due livelli architetturali:
- Un'API framework DRM, esposta alle app tramite il framework delle app per Android
- Un framework DRM con codice nativo, che espone un'interfaccia per i plug-in (agenti) DRM 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 prima di 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 scansione di istanze e servizi HAL (descritti nei file .rc
)
e rileva i plug-in. Il server DRM dei contenuti multimediali (mediadrmserver
) crea
gli oggetti CryptoHal
e DrmHal
.
CryptoHal
e DrmHal
, quindi chiama i plug-in con implementazioni specifiche del fornitore.
I plug-in devono implementare HAL binderizzati. Le HAL binderizzate utilizzano Android Interface Definition Language (AIDL), che consente di sostituire il framework senza dover ricompilare le HAL.
I plug-in sono 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 le HAL binderizzate scritte
nel linguaggio AIDL.
Implementazione
Per implementare nuove API dei framework DRM tramite un plug-in:
- Aggiungi il servizio 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 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 esempio 1, 2).
In alternativa, ti consigliamo di utilizzare vintf_fragments
.
Aggiungere le autorizzazioni SELinux
- Aggiungi autorizzazioni a
VENDOR DEVICE/sepolicy/vendor/file.te
:
type mediadrm_vendor_data_file, file_type, data_file_type;
- Aggiungi 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 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 all'avvio di un servizio.
Per maggiori dettagli, vedi Android Init Language.
Implementare il plug-in
- Implementa il punto di ingresso
main()
inservice.cpp
del servizio di 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 di 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 accesso 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 AIDL DRM HAL. Questa sequenza determina se la fabbrica di plug-in può costruire
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 fabbrica di plug-in può creare plug-in DRM che supportano un
determinato formato 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 di plug-in DRM registrati e crea
i plug-in corrispondenti che supportano un determinato schema di crittografia tramite la classe CryptoFactory
.
Questa sequenza determina se la fabbrica di crittografia 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 fabbrica di plug-in può creare plug-in di crittografia che supportano uno schema di crittografia specifico, 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 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 si trova in out/Soong
dopo la creazione.