O framework de sistemas de acesso condicional de mídia (CAS, na sigla em inglês) oferece padrões APIs para ativar serviços de acesso condicional (CA) em uma variedade de TV digital hardware, incluindo cabo digital, satélite, sistemas terrestres e IPTV sistemas. O framework funciona com a Framework do Android TV Input (link em inglês) e o framework do Android TV Tuner, fornecendo APIs Java invocadas a partir do aplicativo TV Input Service (TIS).
Os principais objetivos do Media CAS são os seguintes.
- Fornecer uma API Java pública e uma estrutura de plug-in nativo que possam ser usadas. por desenvolvedores terceirizados e OEMs para oferecer suporte ao CAS para TV aberta no Android.
- Fornecer um framework CAS no Android que permita a interoperabilidade de OEMs de ATVs com diversos fornecedores de CAS de maneira consistente.
- Oferecer suporte a vários fornecedores de CAS terceirizados usando plug-ins nativos. Os plug-ins do CAS podem usar protocolos de rede específicos do fornecedor, direitos formatos de mensagem de gerenciamento (EMM)/mensagem de controle de direitos (ECM, na sigla em inglês), e decodificadores.
- Ofereça suporte à segurança de hardware, como escadas de chaves.
- Ofereça suporte a ambientes de execução confiáveis (TEEs), como o TrustZone.
Configurações compatíveis
Configuração do sintonizador de hardware
Se o hardware for responsável pela demultiplexação do fluxo de transporte MPEG e a decodificação, o framework Tuner fornece dados de informações específicas do programa de acesso condicional (PSI) para o aplicativo TIS para interagir com sintonizadores de TV baseados em hardware.
Os dados PSI do acesso condicional incluem descritores de CA, ECMs e EMMs. Esses permitem que o plug-in CAS consiga as chaves necessárias para descriptografar a streams de conteúdo.
Figura 1. Configuração do sintonizador de hardware
A configuração de hardware pode ter uma camada TEE, como TrustZone, o que é ilustrado na figura 1. Se não houver uma camada TEE, um cliente CAS plug-in pode se comunicar com serviços de chaves de hardware fornecidos pelo de plataforma. Devido a variações específicas do fornecedor dessas interfaces, o Media CAS não os padroniza.
Configuração de software
Antes do Android 11, o framework de CAS de mídia ainda podia ser usada para processar conteúdo baseado em software, como IPTV do endereço IP multicast/unicast. O app TIS é responsável por instanciar e provisionando o objeto Java do Media CAS.
O aplicativo pode usar o MediaExtractor ou outros analisadores MPEG2-TS para extrair Dados de PSI relacionados à CA, como descritores de CA, ECMs e EMMs. Se o app usa o MediaExtractor de framework, ele pode delegar a sessão do CAS gerenciamento de identidade e acesso, como abrir uma sessão e processar EMM/ECM, ao framework MediaExtractor. Depois, o MediaExtractor configura a sessão do CAS usando o a API diretamente.
Caso contrário, o app será responsável por extrair os dados de PSI relacionados à CA e configurar a sessão do CAS usando as APIs Java do Media CAS (por exemplo, quando o app usa o próprio analisador MPEG2-TS).
Figura 2. configuração de entrada de IPTV, CAS e descrambler usando o MediaExtractor de framework
No cenário do extrator de software, ele exige um software ou desembaralhador baseado em hardware para cada faixa embaralhada, independentemente de as chamadas de acompanhamento chamarem decodificadores seguros. Isso se deve à o seguinte.
- Se a faixa não exigir decodificação segura, o extrator decodificará
à unidade de acesso para limpar buffers e extrair amostras como se fossem de um
fluxo limpo. Dessa forma, a
MediaCodec
não precisa estar envolvida na descriptografando. Se a faixa exigir uma decodificação segura, o extrator ainda poderá precisa de um desembaralhador. Isso acontece quando o fluxo de transporte são embaralhadas no nível do pacote de transporte, em que o pacote elementar de stream (PES) é embaralhado. O extrator precisa acessar a PES. cabeçalho para downstream certas informações (por exemplo, a apresentação carimbo de data/hora).
O desembaralhador não é usado pelo extrator se o fluxo de transporte for embaralhado no nível do pacote PES, em que o cabeçalho da PES está livre. No entanto, não é possível confirmar quando a mistura acontece até que o o pacote embaralhado de fato chega. Para simplificar, suponha que um desembaralhador seja usado se a faixa for determinada como embaralhada com base no mapeamento do programa (PMT).
Limitações da configuração de software
Quando a faixa exige uma decodificação segura, o desembaralhador precisa ser ser cauteloso ao permitir que uma operação de decodificação fique reservas. Como a decodificação de áudio não segura é necessária, se a decodificação de vídeo exigir decodificadores seguros, ele deve ser embaralhado em uma sessão diferente do áudio. O ECM da sessão precisa sinalizar ao plug-in que um decodificador seguro é obrigatório.
Como alternativa, o plug-in precisa ser capaz de vincular de maneira confiável uma é fundamental para a política de segurança. Caso contrário, o app pode gerar vídeos com facilidade frames com o desembaralhador de áudio.
Mesmo quando a sessão exige um decodificador seguro, pode ser a saída de uma pequena quantidade de dados para limpar os buffers pelo extrator para processar o cabeçalho da PES. Evitar que um app malicioso crie o plug-in retornar toda a unidade de acesso, o plug-in precisará analisar o payload de transporte para garantir que o payload comece com um cabeçalho PES do stream apropriado não é válido. Caso contrário, o plug-in deverá negar a solicitação.
Sequência de ajuste de CA
Ao sintonizar um novo canal, o módulo TIS é registrado para receber CA descritores, ECMs e EMMs do framework PSI Tuner. um descritor de AC. contém o ID do sistema da AC, que identifica exclusivamente uma AC específica fornecedor e outros dados específicos do fornecedor. O TIS consulta Media CAS para determinar se existe um plug-in CAS que pode processar o descritor de CA.
Figura 3. Como ajustar o conteúdo do CAS
Se houver suporte para o ID do sistema da AC, uma instância do Media CAS será criada e os dados particulares do fornecedor no descritor da CA são fornecidos ao plug-in. Depois, novas sessões são abertas no Media CAS para gerenciar o áudio e o vídeo. córregos. As sessões recém-abertas recebem ECMs e EMMs para o plug-in.
Exemplo de fluxo de plug-in CAS
O TIS fornece ECMs ao plug-in do CAS usando as APIs Media CAS. Um ECM
contém a palavra de controle criptografada, que precisa ser descriptografada
usando informações de um EMM. O plug-in CAS determina como adquirir
um EMM para o recurso com base nas informações específicas do fornecedor na
Descritor da CA, que é fornecido pelo método setPrivateData()
.
Os EMMs podem ser entregues em banda no stream de conteúdo ou fora da banda usando um
solicitação de rede iniciada pelo plug-in da AC. O TIS usa o método processEMM()
para enviar EMMs em banda ao plug-in da AC.
Se for necessária uma solicitação de rede para conseguir um EMM, o plug-in de CA será responsável por realizar a transação de rede com um servidor de licença.
Figura 4. Exemplo de plug-in CAS para processamento de EMM e ECM
Quando o EMM é recebido, o plug-in da CA o analisa para conseguir a chave criptografada para descriptografar a palavra de controle. O EMM criptografado e a palavra de controle criptografada podem ser carregadas em uma escada de chave ou para executar a descriptografia de palavras de controle e descodificação do fluxo de conteúdo.
API Media CAS Java
A API Media CAS Java contém os métodos a seguir.
Liste todos os plug-ins de CA disponíveis no dispositivo.
class MediaCas.PluginDescriptor { public String getName(); public int getSystemId(); } static PluginDescriptor[] enumeratePlugins();
Cria uma instância de CAS de mídia para o sistema de CA especificado. Isso significa que o framework de CAS de mídia pode lidar com vários sistemas de CAS simultaneamente.
MediaCas(int CA_system_id); MediaCas(@NonNull Context context, int casSystemId, @Nullable String tvInputServiceSessionId, @PriorityHintUseCaseType int priorityHint);
Registre um listener de eventos e permita que o aplicativo especifique um manipulador cujo looper é usado.
interface MediaCas.EventListener { void onEvent(MediaCas, int event, int arg, byte[] data); void onSessionEvent(@NonNull MediaCas mediaCas, @NonNull Session session, int event, int arg, @Nullable byte[] data); void onPluginStatusUpdate(@NonNull MediaCas mediaCas, @PluginStatus int status, int arg); void onResourceLost(@NonNull MediaCas mediaCas); } void setEventListener(MediaCas.EventListener listener, Handler handler);
Envie os dados particulares para o sistema de AC. Os dados privados podem vir do descritor da AC, da tabela de acesso condicional ou ou fora de banda. Isso não está associado a uma sessão específica.
void setPrivateData(@NonNull byte[] data);
Processa um pacote de EMM.
void processEmm(@NonNull byte[] data, int offset, int length);
Envie um evento para um sistema de AC. O formato do evento é específicos para o esquema e opacos para o framework.
void sendEvent(int event, int arg, @Nullable byte[] data);
Iniciar uma operação de provisionamento do tipo especificado para uma AC sistema. Quando um dispositivo assina um serviço de TV por assinatura para pela primeira vez, ele precisa ser provisionado no servidor CAS primeiro. Forneça um conjunto de parâmetros relacionados ao dispositivo para provisionamento.
void provision(String provisionString);
Acionar uma atualização de direitos. Quando um usuário se inscreve em um novo canal (por exemplo, respondendo a um anúncio ou ao adicionar um canal no guia eletrônico da programação (EPG), o app precisa informar aos clientes da AC para atualizar as chaves de direitos.
void refreshEntitlements(int refreshType);
Feche o objeto do Media CAS.
void close();
Abra uma sessão.
Session openSession(); Session openSession(@SessionUsage int sessionUsage, @ScramblingMode int scramblingMode);
Feche uma sessão aberta anteriormente.
void Session#close();
Forneça os dados particulares da AC a partir de um descritor da AC no PMT, que pode ser da seção de informações do programa ou do ES para uma sessão do CAS.
void Session#setPrivateData(@NonNull byte[] sessionId, @NonNull byte[] data);
processar um pacote de ECM para uma sessão;
void Session#processEcm(@NonNull byte[] data, int offset, int length);
Recebe o ID da sessão.
byte[] Session#getSessionId();
Envie um evento de sessão para um sistema de AC. O formato do o evento é específico para o esquema e é opaco para o framework.
void Session#sendSessionEvent(int event, int arg, @Nullable byte[] data);