DRM

Ícone do HAL do DRM do Android

Este documento apresenta uma visão geral do framework de gerenciamento de direitos digitais (DRM) do Android e as interfaces que um plug-in de DRM precisa implementar. Este documento não descreve regras de robustez ou de conformidade que possam ser definidas por um esquema de DRM.

Framework

A plataforma Android oferece um framework de 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 são compatíveis com ele. O framework DRM oferece uma interface unificada para desenvolvedores de aplicativos e esconde a complexidade das operações 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 o gerenciamento 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.

HAL DRM do Android
Figura 1a. Camada de abstração de hardware DRM antes do Android 11
HAL de DRM do Android após o R
Figura 1b. Camada de abstração de hardware de DRM a partir do Android 11

A disponibilidade de conteúdo digital de rich media é importante para usuários de dispositivos móveis. Para disponibilizar amplamente o conteúdo, os desenvolvedores Android e os editores de conteúdo digital precisam de uma implementação consistente de DRM com suporte em todo o ecossistema do 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 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 DRM depende dos recursos de segurança e de proteção de conteúdo da plataforma de hardware subjacente. Os recursos de hardware do dispositivo precisam incluir inicialização segura de hardware para estabelecer uma cadeia de confiança e proteção das chaves criptográficas. Os recursos de proteção de conteúdo do dispositivo precisam incluir a proteção de frames descriptografados no dispositivo e proteção de conteúdo com 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 aplicativo 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.
Framework DRM do Android
Figura 2a. Framework DRM antes do Android 11
Framework DRM do Android
Figura 2b. Framework DRM no Android 11

Consulte DRM de mídia do Android e Criptografia de mídia do Android para mais detalhes.

Plug-ins DRM

Na inicialização do sistema, o framework DRM procura instâncias/serviços HAL (descritos em arquivos .rc ) e os plug-ins são descobertos. 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

A versão do GMS e dos dispositivos AOSP para o Android 13 precisa usar a interface AIDL.

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 VERSAO STABLE 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 a VENDOR DEVICE/sepolicy/vendor/file.te
    type mediadrm_vendor_data_file, file_type, data_file_type;
  2. Adicionar 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 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 realizadas quando um serviço é iniciado.

Consulte Idioma Init 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 plug-in DRM.

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.

O IDrmFactory é o ponto de entrada principal para interagir com o HAL de drm de um fornecedor usando a API createPlugin. A API createPlugin é usada para criar instâncias do 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 HAL de DRM do 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 a fábrica de plug-ins pode criar plug-ins de DRM compatíveis com um determinado esquema de criptografia, especificado por um UUID.

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

Determina se a fábrica de plug-ins pode criar plug-ins DRM compatíveis com um determinado formato de contêiner de mídia especificado por 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);

Constrói um plug-in de DRM para o esquema de criptografia especificado pelo UUID.

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.

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

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 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 a fábrica de plug-ins pode criar plug-ins de criptografia compatíveis com um determinado esquema de criptografia, especificado por um UUID.

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.