DRM

Ícone da HAL de DRM do Android

Esta página oferece uma visão geral do framework de gerenciamento de direitos digitais (DRM) do Android e apresenta as interfaces que um plug-in de DRM precisa implementar. Esta página não descreve regras de robustez ou compliance que podem ser definidas por um esquema de DRM.

Framework

A plataforma Android oferece um framework de DRM extensível que permite aos apps gerenciar conteúdo protegido por direitos de acordo com as restrições de licença associadas ao conteúdo. O framework DRM oferece suporte a muitos esquemas de DRM. O fabricante do dispositivo determina quais esquemas são compatíveis. O framework de DRM oferece uma interface unificada para desenvolvedores de apps e oculta a complexidade das operações de DRM. O framework de DRM oferece um modo de operação consistente para conteúdo protegido e não protegido. Os esquemas de DRM podem definir modelos de uso complexos por metadados de licença. O framework de DRM fornece a associação entre conteúdo e licença de DRM e processa o gerenciamento de direitos. Isso permite que o player de mídia seja abstraído do conteúdo protegido ou não protegido por DRM. Consulte MediaDrm para a classe que obtém chaves para descriptografar fluxos de mídia protegidos.

A Figura 1 mostra a camada de extração de hardware DRM antes do Android 11, e a Figura 2 mostra a camada no Android 11 e versões mais recentes:

HAL de DRM do Android

Figura 1. Camada de abstração de hardware de DRM antes do Android 11.

HAL de DRM do Android a partir do Android 11

Figura 2. Camada de abstração de hardware de DRM a partir do Android 11.

A disponibilidade de conteúdo digital avançado é importante para usuários em dispositivos móveis. Para disponibilizar o conteúdo de forma ampla, os desenvolvedores Android e os editores de conteúdo digital precisam de uma implementação consistente de DRM compatível com todo o ecossistema Android. Para disponibilizar esse conteúdo digital em dispositivos Android e garantir que haja pelo menos um DRM consistente disponível em todos os dispositivos, o Google oferece DRM sem taxas de licença em dispositivos Android compatíveis. O plug-in de DRM é integrado à estrutura de DRM do Android e pode usar proteção baseada em hardware para proteger conteúdo premium e credenciais de usuário.

A proteção de conteúdo fornecida pelo plug-in de DRM depende da segurança e dos recursos de proteção de conteúdo da plataforma de hardware subjacente. Os recursos de hardware do dispositivo precisam incluir a inicialização segura de hardware para estabelecer uma cadeia de confiança de segurança e proteção de chaves criptográficas. Os recursos de proteção de conteúdo do dispositivo precisam incluir a proteção de frames descriptografados no dispositivo e a proteção de conteúdo por um mecanismo de proteção de saída confiável. Nem todas as plataformas de hardware são compatíveis com todos os recursos de segurança e proteção de conteúdo acima. A segurança nunca é implementada em um único lugar na pilha, mas depende da integração de hardware, software e serviços. A combinação de funções de segurança de hardware, um mecanismo de inicialização confiável e um SO seguro isolado para lidar com funções de segurança é essencial para oferecer um dispositivo seguro.

Arquitetura

O framework de DRM foi projetado para ser independente de implementação e abstrai os detalhes da implementação de um esquema de DRM específico em um plug-in de DRM específico do esquema. O framework de DRM inclui APIs simples para lidar com operações complexas de DRM, adquirir licenças, provisionar o dispositivo, associar o conteúdo de DRM e a licença e, por fim, descriptografar o conteúdo de DRM.

O framework de DRM do Android é implementado em duas camadas de arquitetura:

  • Uma API de framework de DRM, que é exposta aos apps pelo framework de apps do Android
  • Um framework DRM de código nativo que expõe uma interface para plug-ins (agentes) de DRM para lidar com o gerenciamento de direitos e a descriptografia de vários esquemas de DRM.

A Figura 3 mostra o framework de DRM antes do Android 11, e a Figura 4 mostra o framework no Android 11 e versões mais recentes:

Framework de DRM do Android

Figura 3. Framework de DRM antes do Android 11.

Framework de DRM do Android a partir do Android 11

Figura 4. Framework de DRM a partir do Android 11.

Consulte MediaDrm e MediaCrypto para mais detalhes.

Plug-ins de DRM

Na inicialização do sistema, a estrutura do DRM verifica instâncias e serviços HAL (descritos em arquivos .rc ) e descobre plug-ins. O servidor de DRM de mídia (mediadrmserver) cria objetos CryptoHal e DrmHal. CryptoHal e DrmHal chamam os plug-ins com implementações específicas do fornecedor.

Os plug-ins precisam implementar HALs binderizados. As HALs binderizadas usam a Linguagem de definição de interface do Android (AIDL), que permite substituir o framework sem precisar reconstruir as HALs.

Os plug-ins são criados por fornecedores ou fabricantes de SoC e colocados em uma partição /vendor no dispositivo. Todos os dispositivos lançados com o Android 13 ou versões mais recentes precisam oferecer suporte a HALs binderizados escritos na linguagem AIDL.

Implementação

Para implementar novas APIs de frameworks DRM por um plug-in:

  1. Adicione o serviço de plug-in aos arquivos de build do dispositivo.
  2. Atualize o manifesto do dispositivo.
  3. Adicione permissões do SELinux.
  4. Crie um arquivo .rc em /vendor.
  5. Implemente o plug-in.

As APIs são definidas em cada versão de IDrmPlugin.aidl, ICryptoPlugin.aidl, IDrmFactory.aidl e ICryptoFactory.aidl.

aidl/PLATFORM_ROOT/hardware/interfaces/drm/

Adicionar serviço de plug-in aos arquivos de build do dispositivo

Por exemplo, para adicionar suporte à interface AIDL, o arquivo VENDOR DEVICE/device.mk precisa incluir os pacotes android.hardware.drm-service.*:

  PRODUCT_PACKAGES += \
    android.hardware.drm-service.clearkey \
    android.hardware.drm-service.widevine

Atualizar o manifesto do dispositivo

O arquivo vendor manifest.xml do dispositivo precisa incluir as seguintes entradas:

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

A versão estável da AIDL é o número da versão de cada lançamento da API AIDL (por exemplo, 1, 2). Como alternativa, recomendamos usar vintf_fragments.

Adicionar permissões do SELinux

  1. Adicione permissões a VENDOR DEVICE/sepolicy/vendor/file.te:
    type mediadrm_vendor_data_file, file_type, data_file_type;
  2. Adicione permissões 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. Adicione permissões 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)
        

Crie um arquivo RC em /vendor

O arquivo .rc especifica as ações a serem tomadas quando um serviço é iniciado.

Consulte Linguagem de inicialização do Android para mais detalhes.

Implementar o plug-in

  1. Implemente o ponto de entrada main() em service.cpp do serviço de plug-in.
  2. Implemente ICryptoPlugin, IDrmPlugin, ICryptoFactory e IDrmFactory.
  3. Implemente as novas APIs no plug-in.

Detalhes do plug-in DRM

Os fornecedores de plug-ins de DRM implementam DrmFactory, CryptoFactory e o plug-in de DRM.

Classe DrmFactory

A classe DrmHal pesquisa serviços de plug-in DRM registrados e cria plug-ins correspondentes que oferecem suporte a um determinado esquema criptográfico pela classe DrmFactory.

IDrmFactory é o principal ponto de entrada para interagir com uma HAL de DRM de um fornecedor usando o método createPlugin. Use esse método para criar instâncias de IDrmPlugin.

::ndk::ScopedAStatus getSupportedCryptoSchemes(
    std::vector<::aidl::android::hardware::drm::Uuid>* _aidl_return);

getSupportedCryptoSchemes retorna uma lista de esquemas de criptografia compatíveis para a instância AIDL DRM HAL. Essa sequência determina se a fábrica de plug-ins pode construir plug-ins de DRM que oferecem suporte a um determinado esquema de criptografia, especificado por um 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);

Essa sequência determina se a fábrica de plug-ins pode criar plug-ins de DRM compatíveis com um determinado formato de contêiner de mídia especificado por mimeType:

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

Essa sequência cria um plug-in de DRM para o esquema de criptografia especificado pelo 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

A classe CryptoHal pesquisa serviços de plug-in DRM registrados e cria plug-ins correspondentes que oferecem suporte a um determinado esquema criptográfico pela classe CryptoFactory.

Essa sequência determina se a fábrica de criptografia pode construir plug-ins de criptografia que oferecem suporte a um determinado esquema de criptografia, especificado por um UUID:

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

Essa sequência determina se a fábrica de plug-ins pode construir plug-ins de criptografia que oferecem suporte a um determinado esquema de criptografia, especificado por um 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);

APIs de plug-in DRM

As APIs estão definidas em hardware/interfaces/drm/aidl/aidl_api/android.hardware.drm/ VERSION/android/hardware/drm/IDrmPlugin.aidl. O arquivo IDrmPlugin.h correspondente pode ser encontrado em out/Soong após o build.