Фреймворк Media conditional access systems (Media CAS) предоставляет стандартные API для включения служб условного доступа (CA) на ряде оборудования цифрового телевидения, включая цифровые кабельные, спутниковые, наземные системы и системы IPTV. Фреймворк работает с фреймворком Android TV Input и фреймворком Android TV Tuner , предоставляя Java API, вызываемые из приложения TV Input Service (TIS).
Основными целями Media CAS являются следующие.
- Предоставить общедоступный Java API и собственную платформу плагинов, которые могут использоваться сторонними разработчиками и OEM-производителями для поддержки CAS для вещательного телевидения на Android.
- Предоставить инфраструктуру CAS в Android, которая позволит производителям квадроциклов взаимодействовать с различными поставщиками CAS согласованным образом.
- Поддержка нескольких сторонних поставщиков CAS с использованием собственных плагинов. Плагины CAS могут использовать сетевые протоколы, специфичные для поставщика, форматы сообщений управления правами (EMM)/сообщений контроля прав (ECM) и дешифраторы.
- Поддерживайте аппаратную безопасность, например, с помощью ключевых лестниц.
- Поддержка доверенных сред выполнения (TEE), таких как TrustZone.
Поддерживаемые конфигурации
Конфигурация аппаратного тюнера
Если оборудование отвечает за демультиплексирование и дескремблирование транспортного потока MPEG, инфраструктура тюнера предоставляет данные условного доступа к программно-специфической информации (PSI) приложению TIS для взаимодействия с аппаратными ТВ-тюнерами.
Данные условного доступа PSI включают дескрипторы CA, ECM и EMM. Эти структуры позволяют плагину CAS получать ключи, необходимые для расшифровки потоков контента.
Рисунок 1. Конфигурация аппаратного тюнера
Конфигурация оборудования может иметь уровень TEE, например TrustZone, который показан на рисунке 1. Если уровень TEE отсутствует, клиентский плагин CAS может взаимодействовать с аппаратными ключевыми лестничными сервисами, предоставляемыми платформой. Из-за вариаций этих интерфейсов, специфичных для поставщиков, Media CAS не стандартизирует их.
Конфигурация программного обеспечения
До Android 11 фреймворк Media CAS все еще мог использоваться для обработки программного контента, такого как IPTV из IP multicast/unicast. Приложение TIS отвечает за создание экземпляра и надлежащую подготовку объекта Java Media CAS.
Приложение может использовать MediaExtractor или другие парсеры MPEG2-TS для извлечения данных PSI, связанных с CA, таких как дескрипторы CA, ECM и EMM. Если приложение использует фреймворк MediaExtractor, оно может делегировать управление сеансом CAS, например открытие сеанса и обработку EMM/ECM, фреймворку MediaExtractor. Затем MediaExtractor настраивает сеанс CAS напрямую с помощью собственного API.
В противном случае приложение отвечает за извлечение данных PSI, связанных с CA, и настройку сеанса CAS с использованием API-интерфейсов Media CAS Java (например, когда приложение использует собственный анализатор MPEG2-TS).
Рисунок 2. Конфигурация входа IPTV, CAS и дешифратора с использованием фреймворка MediaExtractor
В сценарии программного экстрактора экстрактору требуется программный или аппаратный объект дескремблера для каждого скремблированного трека, независимо от того, требует ли трек безопасных декодеров. Это связано со следующим.
- Если дорожка не требует безопасного декодирования, экстрактор дескремблирует блок доступа для очистки буферов и извлекает сэмплы так, как будто из чистого потока. Таким образом,
MediaCodec
не нужно участвовать в дескремблировании. Если дорожка требует безопасного декодирования, экстрактору все равно может понадобиться дескремблер. Это происходит, когда транспортный поток скремблируется на уровне транспортных пакетов, где скремблируется заголовок пакетированного элементарного потока (PES). Экстрактору необходимо получить доступ к заголовку PES для передачи определенной информации (например, временной метки представления).
Дескремблер не используется экстрактором, если транспортный поток скремблируется на уровне пакета PES, где заголовок PES остается чистым. Однако невозможно подтвердить, когда происходит скремблирование, пока не прибудет фактический скремблированный пакет. Для простоты предположим, что дескремблер используется, если трек определяется как скремблированный на основе таблицы сопоставления программ (PMT).
Ограничения конфигурации программного обеспечения
Если дорожка требует безопасного декодирования, дескремблер должен быть осторожен, допуская операцию дескремблирования в чистые буферы. Поскольку требуется небезопасное декодирование аудио, если декодирование видео требует безопасных декодеров, его следует скремблировать в сеансе, отличном от аудио. ECM для сеанса должен сигнализировать плагину, что требуется безопасный декодер.
В качестве альтернативы плагин должен иметь возможность надежно привязывать ключ к своей политике безопасности. В противном случае приложение может легко получить видеокадры с помощью аудиодешифратора.
Даже если сеанс требует безопасного декодера, его могут попросить вывести небольшой объем данных для очистки буферов экстрактором для обработки заголовка PES. Чтобы предотвратить возврат вредоносным приложением плагина всего блока доступа, плагин должен проанализировать полезную нагрузку транспорта, чтобы убедиться, что полезная нагрузка начинается с заголовка PES соответствующего типа потока. В противном случае плагин должен отклонить запрос.
Последовательность настройки CA
При настройке на новый канал модуль TIS регистрируется для получения дескрипторов CA, ECM и EMM из фреймворка PSI Tuner. Дескриптор CA содержит идентификатор системы CA, который однозначно идентифицирует конкретного поставщика CA и другие данные, специфичные для поставщика. TIS запрашивает Media CAS, чтобы определить, существует ли плагин CAS, который может обрабатывать дескриптор CA.
Рисунок 3. Настройка содержимого CAS
Если поддерживается идентификатор системы CA, создается экземпляр Media CAS, и личные данные поставщика из дескриптора CA предоставляются плагину. Затем в Media CAS открываются новые сеансы для обработки аудио- и видеопотоков. Недавно открытые сеансы получают ECM и EMM для плагина.
Пример потока плагина CAS
TIS доставляет ECM в плагин CAS с помощью Media CAS API. ECM содержит зашифрованное контрольное слово, которое необходимо расшифровать с использованием информации из EMM. Плагин CAS определяет, как получить EMM для актива, на основе информации поставщика в дескрипторе CA, который предоставляется методом setPrivateData()
.
EMM могут доставляться в полосе в потоке контента или вне полосы с использованием сетевого запроса, инициированного плагином CA. TIS использует метод processEMM()
для доставки любых внутриполосных EMM в плагин CA.
Если для получения EMM требуется сетевой запрос, плагин CA отвечает за выполнение сетевой транзакции с сервером лицензий.
Рисунок 4. Пример плагина CAS для обработки EMM и ECM
При получении EMM плагин CA анализирует его, чтобы получить зашифрованный ключ для расшифровки контрольного слова. Зашифрованный ключ EMM и зашифрованное контрольное слово могут быть загружены в ключевую лестницу или доверенную среду для выполнения расшифровки контрольного слова и последующего дескремблирования потока контента.
API Java для CAS-медиа
Media CAS Java API содержит следующие методы.
Вывести список всех доступных плагинов CA на устройстве.
class MediaCas.PluginDescriptor { public String getName(); public int getSystemId(); } static PluginDescriptor[] enumeratePlugins();
Построить экземпляр Media CAS для указанной системы CA. Это означает, что фреймворк Media CAS может обрабатывать несколько систем CAS одновременно.
MediaCas(int CA_system_id); MediaCas(@NonNull Context context, int casSystemId, @Nullable String tvInputServiceSessionId, @PriorityHintUseCaseType int priorityHint);
Зарегистрируйте прослушиватель событий и разрешите приложению указать обработчик, цикл которого используется.
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);
Отправьте личные данные для системы CA. Личные данные могут поступать из дескриптора CA, таблицы условного доступа или внешних источников. Это не связано с определенным сеансом.
void setPrivateData(@NonNull byte[] data);
Обработка пакета EMM.
void processEmm(@NonNull byte[] data, int offset, int length);
Отправить событие в систему CA. Формат события специфичен для схемы и непрозрачен для фреймворка.
void sendEvent(int event, int arg, @Nullable byte[] data);
Инициировать операцию подготовки указанного типа для системы CA. Когда устройство впервые регистрируется на платную услугу телевидения, его необходимо сначала подготовить к серверу CAS. Предоставить набор связанных параметров устройству для подготовки.
void provision(String provisionString);
Запустить обновление прав. Когда пользователь подписывается на новый канал (например, отвечая на рекламу или добавляя канал в электронный программный гид (EPG)), приложение должно иметь возможность сообщить клиентам CA о необходимости обновить ключи прав.
void refreshEntitlements(int refreshType);
Закройте объект Media CAS.
void close();
Откройте сессию.
Session openSession(); Session openSession(@SessionUsage int sessionUsage, @ScramblingMode int scramblingMode);
Закрыть ранее открытый сеанс.
void Session#close();
Предоставьте сеансу CAS частные данные CA из дескриптора CA в PMT, который может быть из раздела информации о программе или информации ES.
void Session#setPrivateData(@NonNull byte[] sessionId, @NonNull byte[] data);
Обработка пакета ECM для сеанса.
void Session#processEcm(@NonNull byte[] data, int offset, int length);
Получите идентификатор сеанса.
byte[] Session#getSessionId();
Отправить событие сеанса в систему CA. Формат события специфичен для схемы и непрозрачен для фреймворка.
void Session#sendSessionEvent(int event, int arg, @Nullable byte[] data);