DRM

Icona HAL DRM Android

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.

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

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.
Struttura DRM Android
Figura 2a. Framework DRM prima di Android 11
Struttura 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 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:

  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.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

  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
        /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
  3. 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

  1. Implementare il punto di ingresso main() in service.cpp del servizio plugin.
  2. Implementare ICryptoPlugin , IDrmPlugin , ICryptoFactory e IDrmFactory .
  3. 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 in hardware/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.