DRM

Ícone do HAL do 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 DRM.

Framework

A plataforma Android oferece um framework DRM extensível que permite que os apps gerenciem conteúdo protegido por direitos de acordo com as restrições de licença associadas a ele. O framework de DRM oferece suporte a vários esquemas DRM. O fabricante do dispositivo determina quais esquemas DRM ele oferece suporte. O framework DRM oferece uma interface unificada para desenvolvedores de apps e esconde a complexidade das operações de DRM. O framework 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. A framework de DRM fornece a associação entre o conteúdo DRM e a licença e processa a gestão de direitos. Isso permite que o player de mídia seja abstrato do conteúdo protegido ou não protegido por DRM. Consulte MediaDrm para saber como a classe recebe chaves para descriptografar transmissões de mídia protegidas.

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 DRM do Android

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

HAL do DRM do Android iniciada no Android 11

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

A disponibilidade de conteúdo digital avançado é importante para os usuários em dispositivos móveis. Para disponibilizar o conteúdo de forma ampla, os desenvolvedores e editores de conteúdo digital precisam de uma implementação de DRM consistente com suporte em todo o ecosistema Android. Para disponibilizar esse conteúdo digital em dispositivos Android e garantir que pelo menos um DRM consistente esteja 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 à framework de DRM do Android e pode usar a proteção com suporte de hardware para proteger conteúdo premium e credenciais do usuário.

A proteção de conteúdo fornecida pelo plug-in de DRM depende dos recursos de segurança e proteção de conteúdo da plataforma de hardware. 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 oferecem suporte a 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 processar funções de segurança é essencial para fornecer um dispositivo seguro.

Arquitetura

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

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

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

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

Framework DRM do Android

Figura 3. Framework de DRM antes do Android 11.

Framework DRM do Android a partir do Android 11

Figura 4. Framework DRM iniciado no Android 11.

Consulte MediaDrm e MediaCrypto para mais detalhes.

Plug-ins DRM

Na inicialização do sistema, o framework DRM procura instâncias e serviços HAL (descritos em arquivos .rc ) e descobre plug-ins. O servidor 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 vinculados. HALs vinculadas usam a Linguagem de definição de interface do Android (AIDL), que permite que o framework seja substituído sem precisar recriar 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 vinculadas escritas na linguagem AIDL.

Implementação

Para implementar novas APIs de frameworks DRM com 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 o 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 versão da API AIDL (por exemplo, 1, 2). Também recomendamos o uso de vintf_fragments.

Adicionar permissões do SELinux

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

Criar um arquivo RC em /vendor

O arquivo .rc especifica as ações a serem realizadas 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 do 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 DRM implementam DrmFactory, CryptoFactory e o plug-in DRM.

Classe DrmFactory

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

IDrmFactory é o ponto de entrada principal para interagir com o HAL DRM de um fornecedor pelo 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 criptográficos compatíveis para a instância AIDL DRM HAL. Essa sequência determina se a fábrica de plug-ins pode criar plug-ins DRM compatíveis com 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 DRM que oferecem suporte a 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 constrói 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 de DRM registrados e cria plug-ins correspondentes que oferecem suporte a um determinado esquema de criptografia pela classe CryptoFactory.

Essa sequência determina se a fábrica de criptografia pode criar 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 criar 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-ins DRM

As APIs sã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.