DRM

Icona Android DRM HAL

Questo documento fornisce una panoramica del framework DRM (Digital Rights Management) 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.

Framework

La piattaforma Android fornisce un framework DRM estensibile che consente alle app di gestire i contenuti protetti da diritti in base alle limitazioni della licenza associate ai contenuti. Il framework DRM supporta molti schemi DRM. Spetta al produttore del dispositivo decidere quali schemi DRM supportare. 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à di funzionamento 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 i contenuti DRM e la licenza e gestisce la gestione dei diritti. Ciò consente di estrarre il media player da contenuti protetti da DRM o non protetti. Consulta MediaDrm per la classe per ottenere le chiavi per decriptare gli stream multimediali protetti.

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

La disponibilità di contenuti digitali avanzati è importante per gli utenti che utilizzano dispositivi mobili. Per mettere i propri contenuti a disposizione di un pubblico più ampio, gli sviluppatori Android e i publisher di contenuti digitali hanno bisogno di un'implementazione DRM coerente supportata nell'intero ecosistema Android. Per rendere disponibili questi contenuti digitali sui dispositivi Android e per garantire che sia disponibile almeno un DRM coerente su tutti i dispositivi, Google fornisce il 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 dalle funzionalità di sicurezza e protezione dei contenuti della piattaforma hardware di base. Le funzionalità hardware del dispositivo devono includere l'avvio protetto hardware per stabilire una catena di attendibilità 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 della pila, ma si basa 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 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 di Android è implementato in due livelli di architettura:

  • Un'API framework DRM, esposta alle app tramite il framework di applicazioni Android.
  • Un framework DRM in codice nativo, che espone un'interfaccia per i plug-in DRM (agent) 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

Per ulteriori dettagli, consulta Android Media DRM e Android Media Crypto.

Plug-in DRM

All'avvio del sistema, il framework DRM esegue la ricerca di istanze/servizi HAL (descritti nei file .rc ) e vengono rilevati i plug-in. Media DRM Server (mediadrmserver) crea sia gli oggetti CryptoHal che DrmHal. CryptoHal e DrmHal, quindi, chiamano i plug-in con implementazioni specifiche del fornitore.

I plug-in devono implementare HAL con binder. Gli HAL Binderized utilizzano il Android Interface Definition Language (AIDL), che consente di sostituire il framework senza dover ricreare gli HAL.

I plug-in vengono creati da fornitori o produttori del SOC e inseriti in una partizione /vendor sul dispositivo. Tutti i dispositivi lanciati con Android 13 o versioni successive devono supportare HAL con binderizzazione scritte nel linguaggio AIDL.

Implementazione

La release dei dispositivi GMS e AOSP per Android 13 deve utilizzare l'interfaccia AIDL.

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

  1. Aggiungi il servizio del plug-in ai file di build del dispositivo.
  2. Aggiorna il file manifest del dispositivo.
  3. Aggiungi le autorizzazioni 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/

Aggiungere il servizio del 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 es. 1, 2). In alternativa, ti consigliamo di utilizzare vintf_fragments.

Aggiungi le 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)
        

Crea un file RC in /vendor

Il file .rc specifica le azioni da intraprendere quando viene lanciato un servizio.

Per maggiori dettagli, consulta Lingua di inizializzazione di Android.

Implementare il plug-in

  1. Implementa il punto di accesso main() in service.cpp del servizio del plug-in.
  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 i plug-in DrmFactory, CryptoFactory e DRM.

Fabbrica

La classe DrmHal cerca servizi plug-in DRM registrati e crea plug-in corrispondenti che supportano un determinato schema di crittografia tramite la classe DrmFactory.

IDrmFactory è il punto di contatto principale per interagire con l'HAL drm di un fornitore tramite l'API createPlugin. L'API createplugin viene utilizzata per creare istanze IDrmplug.

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

::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 factory dei plug-in è in grado di creare plug-in DRM che supportano un determinato schema di crittografia, specificato da un UUID.

::ndk::ScopedAStatus isContentTypeSupported(const std::string& in_mimeType,
    bool* _aidl_return);

Determina se il fabbrica di plug-in è in grado di creare plug-in DRM che supportano un dato formato di container 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);

Crea un plug-in DRM per lo schema di crittografia specificato dall'UUID.

CryptoFactory

La classe CryptoHal cerca i servizi dei plug-in DRM registrati e crea i plug-in corrispondenti che supportano un determinato schema di crittografia tramite la classe CryptoFactory.

::ndk::ScopedAStatus isCryptoSchemeSupported(
    const ::aidl::android::hardware::drm::Uuid& in_uuid,
    bool* _aidl_return);

Determina se la crypto factory è in grado di creare 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 factory dei plug-in è in grado di creare plug-in di crittografia che supportano un determinato schema di crittografia, specificato da un UUID.

API per 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 si trova in out/Soong dopo la compilazione.