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 regole di robustezza o 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; quale schema DRM supporta 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 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 al lettore multimediale di essere estratto dal contenuto protetto o non protetto da DRM. Vedere MediaDrm per la classe per ottenere le chiavi per decrittografare i flussi multimediali protetti.

Android DRM HAL
Figura 1a. Strato 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 ricchi contenuti digitali è importante per gli utenti sui dispositivi mobili. Per rendere i propri contenuti ampiamente disponibili, gli sviluppatori Android e gli editori di contenuti digitali necessitano di un'implementazione DRM coerente supportata nell'intero ecosistema Android. Per rendere disponibili i contenuti digitali sui dispositivi Android e per 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 basata su 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 tramite 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 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 dello schema. Il framework DRM include API semplici per gestire operazioni DRM complesse, acquisire licenze, eseguire il provisioning del dispositivo, associare il contenuto DRM e la relativa licenza e infine decrittografare il contenuto DRM.

Il framework Android DRM è implementato in due livelli architetturali:

  • Un'API del framework DRM, esposta alle app tramite il framework dell'applicazione Android.
  • Un framework DRM in codice nativo, che espone un'interfaccia per plug-in DRM (agenti) per gestire la gestione dei diritti e la decrittazione per vari schemi DRM.
Struttura Android DRM
Figura 2a. Framework DRM prima di Android 11
Struttura Android DRM
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 delle istanze/servizi HAL (descritti nei file .rc ) e vengono rilevati i plug-in. Media DRM Server ( mediadrmserver ) crea oggetti sia CryptoHal che DrmHal . CryptoHal e DrmHal quindi chiamano i plugin con implementazioni specifiche del fornitore.

I plugin dovrebbero implementare HAL binderizzati. Gli HAL binderizzati utilizzano l' Android Interface Definition Language (AIDL) , che consente di sostituire il framework senza dover ricostruire gli HAL.

I plug-in sono creati da fornitori o produttori di SOC e inseriti in una partizione /vendor sul dispositivo. Tutti i dispositivi che vengono avviati con Android 13 o versioni successive devono supportare gli 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 es. 1, 2). In alternativa, ti 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 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 all'avvio di un servizio.

Vedi Android Init Language 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 il plug-in DrmFactory , CryptoFactory e 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 l'interazione 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 crittografici supportati per l'istanza HAL drm AIDL.

::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 produzione di plug-in è in grado di creare plug-in DRM che supportano un determinato 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 plug-in DRM per lo schema crittografico specificato da UUID.

Crypto Factory

La classe CryptoHal cerca i servizi 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 crittografia è 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 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/Soong dopo la compilazione.