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 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
Figura 1a. Livello di astrazione hardware DRM prima di Android 11
Posta HAL DRM Android 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 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
Figura 2a. Framework DRM prima di Android 11
Quadro DRM Android
Figura 2b. Framework DRM a partire da Android 11

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:

  1. Aggiungi il servizio plug-in ai file di build del dispositivo.
  2. Aggiorna il manifest del dispositivo.
  3. Aggiungi i permessi SELinux.
  4. Crea un file .rc in /vendor .
  5. 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

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

  1. Implementa 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 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 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/Soong dopo la compilazione.