DRM

Icona di Android DRM HAL

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 il contenuto protetto con RMS in base ai vincoli di licenza associati al contenuto. Il framework DRM supporta molti schemi DRM; gli 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 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 contenuto DRM e licenza e gestisce la gestione dei diritti. Ciò consente di astrarre il lettore multimediale da contenuti protetti da DRM o non protetti. Vedere MediaDrm per la classe per ottenere le chiavi per decrittografare i flussi multimediali protetti.

Android DRM HAL
Figura 1a. Livello di astrazione hardware DRM prima di Android 11
HAL DRM Android post R
Figura 1b. Livello di astrazione hardware DRM a partire da Android 11

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 nell'ecosistema Android. Per rendere tale contenuto digitale disponibile sui dispositivi Android e per garantire che ci sia almeno un DRM coerente disponibile su tutti i dispositivi, Google fornisce DRM senza costi di licenza sui dispositivi Android compatibili. Il plug-in DRM è integrato con il framework Android DRM 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 dalla sicurezza e dalle capacità di protezione del contenuto della piattaforma hardware sottostante. Le funzionalità hardware del dispositivo dovrebbero includere l'avvio protetto dall'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 tramite un meccanismo di protezione dell'output affidabile. Non tutte le piattaforme hardware supportano tutte le funzioni di sicurezza e protezione dei contenuti sopra descritte. La sicurezza non viene mai implementata in un unico punto 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 protetto 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 semplici API per gestire complesse operazioni DRM, acquisire licenze, eseguire il provisioning del dispositivo, associare contenuto DRM e la relativa licenza e infine decrittografare il contenuto DRM.

Il framework Android DRM è implementato in due livelli architettonici:

  • Un'API framework DRM, esposta alle app tramite il framework dell'applicazione Android.
  • Un framework DRM a codice nativo, che espone un'interfaccia per plug-in DRM (agenti) per gestire la gestione dei diritti e la decrittografia per vari schemi DRM.
Framework DRM Android
Figura 2a. Framework DRM prima di Android 11
Framework DRM Android
Figura 2b. Framework DRM a partire da Android 11

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 i plug-in vengono rilevati tramite il registro HIDL. Media DRM Server ( mediadrmserver ) crea oggetti sia 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 il linguaggio di definizione dell'interfaccia HAL (HIDL) , 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 che si avviano con Android 8.0 o versioni successive devono supportare HAL binderizzati scritti nel linguaggio HIDL.

Implementazione

Per implementare nuove API di framework DRM da un plug-in:

  1. Aggiungi il servizio plug-in ai file di build del dispositivo.
  2. Aggiorna il manifesto del dispositivo.
  3. Aggiungi i permessi di SELinux.
  4. Crea un file .rc in /vendor .
  5. Implementa il plugin.

Le API sono definite in ogni versione di IDrmPlugin.hal , ICryptoPlugin.hal , IDrmFactory.hal e ICryptoFactory.hal

PLATFORM_ROOT/hardware/interfaces/drm/VERSION/

Aggiunta del servizio plug-in ai file di build del dispositivo

Ad esempio, per aggiungere il supporto per l'interfaccia 1.3, il file VENDOR DEVICE /device.mk deve includere i pacchetti android.hardware.drm@1.3-service.* :

Le versioni da 1.0 a 1.2 sono deprecate in R / Android 11. I dispositivi che eseguono l'aggiornamento a R possono ancora eseguire le versioni da 1.0 a 1.2. Tuttavia, i nuovi dispositivi che si avviano con R devono eseguire solo la versione1.3.


  PRODUCT_PACKAGES += \
    android.hardware.drm@1.0-impl \
    android.hardware.drm@1.0-service \
    android.hardware.drm@1.3-service.clearkey \
    android.hardware.drm@1.3-service.widevine

Aggiornamento del manifesto del dispositivo

Il file vendor manifest.xml per il dispositivo deve includere le seguenti voci:


  <hal format="hidl">
    <name>android.hardware.drm</name>
      <transport>hwbinder</transport>
      <fqname>@1.3::ICryptoFactory/clearkey</fqname>
      <fqname>@1.3::IDrmFactory/clearkey</fqname>
      <fqname>@1.3::ICryptoFactory/widevine</fqname>
      <fqname>@1.3::IDrmFactory/widevine</fqname>
  </hal>

In alternativa, ti consigliamo di utilizzare vintf_fragments.

Aggiunta di autorizzazioni SELinux

  1. Aggiungi a VENDOR DEVICE /sepolicy/vendor/file.te
    type mediadrm_vendor_data_file, file_type, data_file_type;
  2. Aggiungi a VENDOR DEVICE /sepolicy/vendor/file_contexts

    Si consiglia di utilizzare espressioni regolari per specificare i numeri di versione per evitare di effettuare aggiornamenti per le nuove versioni, ad esempio:

    /vendor/bin/hw/android\.hardware\.drm@\[0-9]+\.[0-9]+-service\.clearkey
          u:object_r:hal_drm_clearkey_exec:s0
    /data/vendor/mediadrm(/.*)? u:object_r:mediadrm_vendor_data_file:s0

    In alternativa, aggiorna i numeri di versione come mostrato di seguito.

    /vendor/bin/hw/android\.hardware\.drm@1\.3-service\.clearkey
          u:object_r:hal_drm_clearkey_exec:s0
    /data/vendor/mediadrm(/.*)? u:object_r:mediadrm_vendor_data_file:s0
  3. Aggiungi a device/sepolicy/vendor/hal_drm_clearkey.te
    allow hal_drm_clearkey mediadrm_vendor_data_file:dir create_dir_perms;
        allow hal_drm_clearkey mediadrm_vendor_data_file:file create_file_perms;
        

Creazione di un file .rc in / vendor

Il file .rc specifica le azioni da intraprendere all'avvio di un servizio.

Vedi Android Init Language per i dettagli.

Implementazione del plugin

  1. Implementa il punto di ingresso main() in service.cpp del servizio plugin.
  2. Implementa ICryptoPlugin , IDrmPlugin , ICryptoFactory e IDrmFactory .
  3. Implementa le nuove API nel plug-in.

Dettagli del plug-in DRM

I fornitori di plug-in DRM implementano DrmFactory , CryptoFactory e plug-in DRM.

DrmFactory

La classe DrmHal cerca i servizi 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. 1.3 IDrmFactory deve sempre creare interfacce 1.2 IDrmPlugin, che vengono restituite tramite il metodo 1.0 createPlugin.

Return<void> getSupportedCryptoSchemes(getSupportedCryptoSchemes_cb _hidl_cb);

Nuovo in 1.3 IDrmFactory, getSupportedCryptoSchemes restituisce un elenco di schemi crittografici supportati per l'istanza HAL drm HIDL.

Return<bool> isCryptoSchemeSupported(const hidl_array<uint8_t, 16>uuid);

Determina se la fabbrica di plug-in è in grado di costruire plug-in DRM che supportano un determinato schema crittografico, specificato da un UUID.

Return<bool> isContentTypeSupported(const hidl_string &mimeType);

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 .

Return<void> createPlugin(const hidl_array<uint8_t, 16>uuid,
        const hidl_string& appPackageName, createPlugin_cb _hidl_cb);

Costruisce un plug-in DRM per lo schema crittografico specificato da UUID.

CryptoFactory

La classe CryptoHal cerca i servizi plug-in DRM registrati e costruisce i plug-in corrispondenti che supportano un determinato schema crittografico attraverso la classe CryptoFactory .

Return<bool> isCryptoSchemeSupported(const hidl_array<uint8_t, 16>uuid);

Determina se la crypto factory è in grado di costruire plugin crittografici che supportano un determinato schema crittografico, che è specificato da un UUID.

Return<void> createPlugin(const hidl_array<uint8_t, 16>uuid,
        const hidl_vec<uint8_t>initData, createPlugin_cb _hidl_cb)

Determina se la fabbrica di plug-in è in grado di costruire plug-in crittografici che supportano un determinato schema crittografico, specificato da un UUID.

Plugin DRM

Le API sono definite in hardware/interfaces/drm/ VERSION /IDrmPlugin.hal . Il file IDrmPlugin.h corrispondente può essere trovato in out / Soong dopo la compilazione.