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.
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.
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:
- Adicione o serviço de plug-in aos arquivos de build do dispositivo.
- Atualize o manifesto do dispositivo.
- Adicione permissões do SELinux.
- Crie um arquivo
.rc
em/vendor
. - 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
- Adicionar a
VENDOR DEVICE/sepolicy/vendor/file.te
type mediadrm_vendor_data_file, file_type, data_file_type;
- 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 - 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
- Implemente o ponto de entrada
main()
emservice.cpp
do serviço do plug-in. - Implemente
ICryptoPlugin
,IDrmPlugin
,ICryptoFactory
eIDrmFactory
. - 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 emhardware/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.