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