DRM

Icona Android DRM HAL

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 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 da diritti in base alle limitazioni della licenza associate ai contenuti. Il framework DRM supporta molti schemi DRM. È il produttore del dispositivo a determinare quali schemi DRM sono supportati dal 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 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. In questo modo, il media player può essere astratto dai contenuti protetti o non protetti da DRM. Consulta MediaDrm per informazioni su come la classe ottiene le chiavi per decriptare gli stream 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:

Android DRM HAL

Figura 1. Hardware Abstraction Layer (HAL) DRM prima di Android 11.

Android DRM HAL a partire da Android 11

Figura 2. Hardware Abstraction Layer (HAL) 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 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 di Android è implementato in due livelli di architettura:

  • Un'API framework DRM, esposta alle app tramite il framework app 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

La Figura 3 mostra il framework DRM prima di Android 11, mentre la Figura 4 mostra il framework in Android 11 e versioni successive:

Framework DRM di Android

Figura 3. Framework DRM precedente ad Android 11.

Framework DRM Android a partire da 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 ricerca di istanze e servizi HAL (descritti nei file .rc ) e scopre i plug-in. Media DRM Server (mediadrmserver) crea sia gli oggetti CryptoHal che DrmHal. CryptoHal e DrmHal chiamano poi i plug-in con implementazioni specifiche del fornitore.

I plug-in devono implementare HAL con binder. Le HAL con binder utilizzano il linguaggio Android Interface Definition Language (AIDL), che consente di sostituire il framework senza dover ricostruire le HAL.

I plug-in vengono 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 HAL con binderizzazione scritte nel linguaggio AIDL.

Implementazione

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 stabile di AIDL è il numero di versione di ogni release dell'API AIDL (ad esempio 1, 2). In alternativa, ti consigliamo di utilizzare vintf_fragments.

Aggiungi le autorizzazioni SELinux

  1. Aggiungi le autorizzazioni a VENDOR DEVICE/sepolicy/vendor/file.te:
    type mediadrm_vendor_data_file, file_type, data_file_type;
  2. Aggiungi le 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
  3. Aggiungi le 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 quando viene lanciato un servizio.

Per maggiori dettagli, consulta Android Init Language.

Implementare il plug-in

  1. Implementa il punto di contatto 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 DrmFactory, CryptoFactory e il plug-in DRM.

Classe DrmFactory

La classe DrmHal cerca i servizi dei plug-in DRM registrati e costruisce i 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 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 HAL DRM AIDL. Questa sequenza determina se la fabbrica di plug-in può creare 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 factory dei plug-in può creare plug-in DRM che supportano un determinato formato del 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 dei plug-in DRM registrati e costruisce i plug-in corrispondenti che supportano un determinato schema di crittografia tramite la classe CryptoFactory.

Questa sequenza determina se la crypto factory 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 factory dei plug-in può 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);

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