DRM

Ícone DRM HAL do Android

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

Estrutura

A plataforma Android fornece uma estrutura DRM extensível que permite que os aplicativos gerenciem conteúdo protegido por direitos de acordo com as restrições de licença associadas ao conteúdo. A estrutura DRM suporta muitos esquemas DRM; quais esquemas DRM um dispositivo suporta depende do fabricante do dispositivo. A estrutura DRM fornece uma interface unificada para desenvolvedores de aplicativos e oculta a complexidade das operações DRM. A estrutura DRM fornece um modo de operação consistente para conteúdo protegido e não protegido. Os esquemas DRM podem definir modelos de uso complexos por meio de metadados de licença. A estrutura DRM fornece a associação entre o conteúdo DRM e a licença e cuida do gerenciamento de direitos. Isso permite que o reprodutor de mídia seja abstraído de conteúdo protegido ou não protegido por DRM. Consulte MediaDrm para a classe obter chaves para descriptografar fluxos de mídia protegidos.

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

A disponibilidade de conteúdo digital rico é importante para usuários de dispositivos móveis. Para disponibilizar amplamente seu 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 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 fornece DRM sem taxas de licença em dispositivos Android compatíveis. O plug-in DRM é integrado à estrutura DRM do Android e pode usar proteção apoiada por hardware para proteger conteúdo premium e credenciais de usuário.

A proteção de conteúdo fornecida pelo plug-in DRM depende dos recursos de segurança e proteção de conteúdo da plataforma de hardware subjacente. As capacidades de hardware do dispositivo devem incluir 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 devem incluir proteção de quadros descriptografados no dispositivo e proteção de conteúdo por meio de um mecanismo confiável de proteção de saída. Nem todas as plataformas de hardware suportam todos os recursos de segurança e proteção de conteúdo acima. A segurança nunca é implementada em um único local da 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 sistema operacional seguro isolado para lidar com funções de segurança é fundamental para fornecer um dispositivo seguro.

Arquitetura

A estrutura DRM foi projetada para ser independente de implementação e abstrair os detalhes da implementação específica do esquema DRM em um plug-in DRM específico do esquema. A estrutura DRM inclui APIs simples para lidar com operações DRM complexas, adquirir licenças, provisionar o dispositivo, associar conteúdo DRM e sua licença e, finalmente, descriptografar o conteúdo DRM.

A estrutura Android DRM é implementada em duas camadas arquitetônicas:

  • Uma API de estrutura DRM, que é exposta a aplicativos por meio da estrutura de aplicativos Android.
  • Uma estrutura DRM de código nativo, que expõe uma interface para plug-ins (agentes) de DRM para lidar com gerenciamento de direitos e descriptografia para vários esquemas de DRM.
Estrutura DRM do Android
Figura 2a. Estrutura DRM antes do Android 11
Estrutura DRM do Android
Figura 2b. Estrutura DRM começando no Android 11

Consulte Android Media DRM e Android Media Crypto para obter mais detalhes.

Plug-ins DRM

Na inicialização do sistema, a estrutura DRM verifica instâncias/serviços HAL (descritos em arquivos .rc ) e plug-ins são descobertos. Media DRM Server ( mediadrmserver ) cria objetos CryptoHal e DrmHal . CryptoHal e DrmHal então chamam os plug-ins com implementações específicas do fornecedor.

Os plug-ins devem implementar HALs vinculados. HALs vinculados usam a linguagem de definição de interface Android (AIDL) , que permite que a estrutura seja substituída sem a necessidade de reconstruir 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 Android 13 ou superior devem oferecer suporte a HALs vinculados escritos na linguagem AIDL.

Implementação

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

Para implementar novas APIs de estruturas DRM por meio de um plugin:

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

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 construção do dispositivo

Por exemplo, para adicionar suporte à interface AIDL, o arquivo VENDOR DEVICE /device.mk deve 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 deve 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 DO AIDL é o número da versão de cada versão da API AIDL (por exemplo, 1, 2). Como alternativa, recomendamos o uso de vintf_fragments.

Adicionar permissões SELinux

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

Consulte Idioma de inicialização do Android para obter detalhes.

Implementar o plug-in

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

Detalhes do plug-in DRM

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

DrmFábrica

A classe DrmHal procura serviços de plug-in DRM registrados e constrói plug-ins correspondentes que suportam um determinado esquema de criptografia por meio da classe DrmFactory .

IDrmFactory é o principal ponto de entrada para interagir com o drm HAL de um fornecedor por meio da API createPlugin. A API createPlugin é usada para criar instâncias IDrmPlugin.

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

getSupportedCryptoSchemes retorna uma lista de esquemas de criptografia suportados para a instância AIDL drm HAL.

::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 plugins é capaz de construir plugins DRM que suportam um determinado esquema de criptografia, que é especificado por um UUID.

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

Determina se a fábrica de plug-ins é capaz de construir plug-ins DRM que suportam 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 plugin DRM para o esquema de criptografia especificado pelo UUID.

Criptofábrica

A classe CryptoHal procura serviços de plug-in DRM registrados e constrói plug-ins correspondentes que suportam um determinado esquema de criptografia por meio da classe CryptoFactory .

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

Determina se a fábrica de criptografia é capaz de construir plug-ins de criptografia que suportam um determinado esquema de criptografia, que é 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 plugins é capaz de construir plugins criptográficos que suportam um determinado esquema criptográfico, que é especificado por um UUID.

APIs de plug-in 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 a compilação.