CAS-фреймворк

Платформа систем условного доступа к мультимедиа (Media CAS) предоставляет стандартные API-интерфейсы для предоставления услуг условного доступа (CA) на ряде оборудования цифрового телевидения, включая цифровые кабельные, спутниковые, наземные системы и системы IPTV. Платформа работает с инфраструктурой ввода Android TV и платформой Android TV Tuner , предоставляя API-интерфейсы Java, вызываемые из приложения TV Input Service (TIS).

Основные задачи Media CAS заключаются в следующем.

  • Предоставьте общедоступный Java API и собственную платформу подключаемых модулей, которые могут использоваться сторонними разработчиками и OEM-производителями для поддержки CAS для вещательного телевидения в Android.
  • Обеспечьте среду CAS в Android, которая позволит OEM-производителям ATV согласованно взаимодействовать с различными поставщиками 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-трансляции. Приложение TIS отвечает за создание экземпляра и правильную подготовку Java-объекта Media CAS.

Приложение может использовать MediaExtractor или другие синтаксические анализаторы MPEG2-TS для извлечения данных PSI, связанных с ЦС, таких как дескрипторы ЦС, ECM и EMM. Если приложение использует платформу MediaExtractor, оно может делегировать управление сеансом CAS, например открытие сеанса и обработку EMM/ECM, платформе MediaExtractor. Затем MediaExtractor настраивает сеанс CAS напрямую с помощью собственного API.

В противном случае приложение отвечает за извлечение данных PSI, связанных с ЦС, и настройку сеанса 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. Дескриптор ЦС содержит идентификатор системы ЦС, который однозначно идентифицирует конкретного поставщика ЦС и другие данные, относящиеся к поставщику. TIS запрашивает Media CAS, чтобы определить, существует ли подключаемый модуль CAS, который может обрабатывать дескриптор CA.

Схема настройки содержимого CAS.

Рисунок 3. Настройка контента CAS

Если идентификатор системы ЦС поддерживается, создается экземпляр Media CAS, а частные данные поставщика из дескриптора ЦС передаются подключаемому модулю. Затем в Media CAS открываются новые сеансы для обработки аудио- и видеопотоков. Вновь открытые сеансы получают ECM и EMM для подключаемого модуля.

Пример потока подключаемого модуля CAS

TIS доставляет ECM в подключаемый модуль CAS с помощью Media CAS API. ECM содержит зашифрованное контрольное слово, которое необходимо расшифровать, используя информацию из EMM. Подключаемый модуль CAS определяет, как получить EMM для актива на основе информации о поставщике в дескрипторе CA, которая предоставляется методом setPrivateData() .

EMM могут быть доставлены в полосе в потоке контента или вне полосы с использованием сетевого запроса, инициированного подключаемым модулем ЦС. TIS использует метод processEMM() для доставки любых внутриполосных сообщений EMM в подключаемый модуль CA.

Если для получения EMM требуется сетевой запрос, подключаемый модуль ЦС отвечает за выполнение сетевой транзакции с сервером лицензий.

Схема примера CAS.

Рисунок 4. Пример плагина CAS для обработки EMM и ECM

Когда сообщение EMM получено, подключаемый модуль ЦС анализирует его, чтобы получить зашифрованный ключ для расшифровки контрольного слова. Зашифрованный ключ EMM и зашифрованное контрольное слово могут быть загружены в лестницу ключей или доверенную среду для выполнения расшифровки контрольного слова и последующего дескремблирования потока контента.

Медиа CAS Java API

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. Частные данные могут поступать из дескриптора ЦС, таблицы условного доступа или из внешних источников. Это не связано с конкретным сеансом.

    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)), приложение должно сообщать клиентам ЦС об обновлении ключей прав.

    void refreshEntitlements(int refreshType);
    
  • Закройте объект Media CAS.

    void close();
    
  • Откройте сеанс.

    Session openSession();
    Session openSession(@SessionUsage int sessionUsage, @ScramblingMode int scramblingMode);
    
  • Закрыть ранее открытую сессию.

    void Session#close();
    
  • Предоставьте частные данные CA из дескриптора CA в PMT, который может быть из раздела информации о программе или информации ES, в сеанс CAS.

    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);