DRM

Ícone da HAL do DRM do Android

Este documento fornece uma visão geral da estrutura de gerenciamento de direitos digitais (DRM, na sigla em inglês) do Android e introduz as interfaces que um plug-in DRM deve implementar. Este documento não descrever regras de robustez ou de compliance e que podem ser definidas por um DRM esquema.

Framework

A plataforma Android fornece uma estrutura de DRM extensível que permite os apps gerenciam conteúdo protegido por direitos de acordo com a licença restrições associadas ao conteúdo. A estrutura de DRM oferece suporte a muitas esquemas quais esquemas de DRM um dispositivo suporta depende do fabricante do dispositivo. A estrutura de DRM fornece uma interface unificada para desenvolvedores de aplicativos e oculta a complexidade das operações de DRM. A estrutura de DRM oferece uma abordagem para conteúdo protegido e não protegido. Os esquemas de DRM podem definir modelos de uso complexos por metadados de licença. A estrutura de DRM fornece associação entre conteúdo e licença de DRM, além de lidar com o gerenciamento de direitos. Isso permite que o player de mídia seja abstraído de elementos protegidos por DRM ou conteúdo não protegido. Consulte MediaDrm para que a classe consiga as chaves para descriptografar streams de mídia protegidos.

HAL de DRM do Android
Figura 1a. Abstração de hardware de DRM Camada anterior ao Android 11
Postagem R de HAL de DRM do Android
Figura 1b. Abstração de hardware de DRM Camada do Android 11 em diante

A disponibilidade de conteúdo digital de rich media é importante para usuários de dispositivos móveis. Para disponibilizam amplamente o conteúdo, desenvolvedores Android e conteúdo digital os editores precisam de uma implementação consistente de DRM com suporte em todo o do ecossistema. Para disponibilizar esse conteúdo digital em dispositivos Android e para 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 é integrados à estrutura de DRM do Android e podem usar proteção com suporte de hardware para proteger o conteúdo premium e as credenciais do usuário.

A proteção de conteúdo fornecida pelo plug-in DRM depende da segurança e da aos recursos de proteção de conteúdo da plataforma de hardware. A de hardware do dispositivo devem incluir a inicialização segura do 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 a proteção de frames descriptografados no dispositivo e proteção de conteúdo com uma saída confiável mecanismo de proteção de dados. Nem todas as plataformas de hardware são compatíveis com todos os itens acima recursos de segurança e proteção de conteúdo. A segurança nunca é implementada em um único lugar na pilha, mas depende da integração de hardware, softwares e serviços. A combinação de funções de segurança de hardware, uma mecanismo de inicialização confiável e um SO isolado e seguro para lidar com a é essencial para oferecer um dispositivo seguro.

Arquitetura

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

A estrutura de DRM do Android é implementada em duas camadas de arquitetura:

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

Consulte a documentação do DRM de mídia e Android Media Crypto para saber mais.

Plug-ins de DRM

Na inicialização do sistema, o framework de DRM verifica se há instâncias/serviços da HAL (descritos nos arquivos .rc ). e plug-ins são descobertos. Servidor de DRM de mídia (mediadrmserver) criado objetos CryptoHal e DrmHal. CryptoHal e DrmHal chamam os plug-ins com nomes de com implementações específicas.

Os plug-ins precisam implementar HALs vinculadas. As HALs com Binderized usam a Linguagem de definição de interface do Android (AIDL), o que permite que o framework seja substituído sem precisar recriar as HALs.

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

Implementação

As versões de dispositivos GMS e AOSP para o Android 13 precisam usar a interface AIDL.

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

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

As APIs estão definidas em cada versão do 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 o android.hardware.drm-service.* pacotes:


  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 estas 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 AIDL STABLE é 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 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 Linguagem Init do Android para mais detalhes.

Implementar o plug-in

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

Detalhes do plug-in DRM

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

Fábrica Drm

A classe DrmHal procura construções e serviços de plug-in de DRM registrados. plug-ins correspondentes que oferecem suporte a um determinado esquema de criptografia usando DrmFactory. .

IDrmFactory é o principal ponto de entrada para interagir com a HAL de drm de um fornecedor. por meio da 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 de criptografia com suporte para a instância HAL de drm da 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 é capaz de construir plug-ins DRM compatíveis 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 compatíveis com um formato de contêiner de mídia fornecido 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 por UUID.

Fábrica de criptografia

A classe CryptoHal procura construções e serviços de plug-in de DRM registrados. plug-ins correspondentes que oferecem suporte a um determinado esquema de criptografia usando 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 com suporte a uma esquema de criptografia fornecido, 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 plug-ins pode criar plug-ins de criptografia com suporte a uma esquema de criptografia fornecido, que é especificado por um UUID.

APIs de plug-in de DRM

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