Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Kerangka CAS

Kerangka kerja Sistem akses bersyarat media (Media CAS) menyediakan API standar untuk mengaktifkan layanan akses bersyarat (CA) pada berbagai perangkat keras TV digital, termasuk kabel digital, satelit, sistem terestrial, dan sistem IPTV. Framework ini berfungsi dengan framework Input Android TV dan framework Android TV Tuner , yang menyediakan Java API yang dipanggil dari aplikasi TV Input Service (TIS).

Tujuan utama Media CAS adalah sebagai berikut.

  • Menyediakan API Java publik dan kerangka kerja plugin asli yang dapat digunakan oleh pengembang pihak ketiga dan OEM untuk mendukung CAS untuk siaran TV di Android.
  • Menyediakan kerangka kerja CAS dalam Android yang memungkinkan ATV OEM beroperasi dengan berbagai vendor CAS secara konsisten.
  • Mendukung beberapa vendor CAS pihak ketiga menggunakan plugin asli. Plugin CAS mungkin menggunakan protokol jaringan khusus vendor, format pesan pengelolaan hak (EMM) / pesan kontrol hak (ECM), dan pengurai.
  • Mendukung keamanan perangkat keras seperti tangga kunci.
  • Mendukung lingkungan eksekusi tepercaya (TEE) seperti TrustZone.

Konfigurasi yang didukung

Konfigurasi Hardware Tuner

Jika perangkat keras bertanggung jawab atas demultiplexing dan descrambling aliran transportasi MPEG, kerangka kerja Tuner menyediakan data informasi khusus program (PSI) akses bersyarat ke aplikasi TIS untuk berinteraksi dengan tuner TV berbasis perangkat keras.

Akses data PSI bersyarat termasuk deskriptor CA, ECM, dan EMM. Struktur ini memungkinkan plugin CAS untuk mendapatkan kunci yang diperlukan untuk mendekripsi aliran konten.

Diagram konfigurasi perangkat keras Tuner.

Gambar 1. Konfigurasi Hardware Tuner

Konfigurasi perangkat keras mungkin memiliki lapisan TEE, seperti TrustZone, yang diilustrasikan pada Gambar 1. Jika tidak ada lapisan TEE, plugin klien CAS dapat berkomunikasi dengan layanan ladder kunci perangkat keras yang disediakan oleh platform. Karena variasi khusus vendor dari antarmuka ini, Media CAS tidak menstandarkannya.

Konfigurasi perangkat lunak

Sebelum Android 11, kerangka CAS Media masih dapat digunakan untuk memproses konten berbasis perangkat lunak, seperti IPTV dari IP multicast / unicast. Aplikasi TIS bertanggung jawab untuk membuat instance dan menyediakan objek Media CAS Java dengan benar.

Aplikasi mungkin menggunakan MediaExtractor atau pengurai MPEG2-TS lainnya untuk mengekstrak data PSI terkait CA, seperti deskriptor CA, ECM, dan EMM. Jika aplikasi menggunakan kerangka kerja MediaExtractor, itu bisa mendelegasikan manajemen sesi CAS, seperti membuka sesi dan memproses EMM / ECM, ke kerangka kerja MediaExtractor. MediaExtractor kemudian mengonfigurasi sesi CAS menggunakan API asli secara langsung.

Jika tidak, aplikasi bertanggung jawab untuk mengekstrak data PSI terkait CA dan mengonfigurasi sesi CAS menggunakan Media CAS Java API (misalnya, saat aplikasi menggunakan pengurai MPEG2-TS-nya sendiri).

Diagram konfigurasi Tuner.

Gambar 2. Input IPTV, CAS, dan konfigurasi descrambler menggunakan kerangka kerja MediaExtractor

Dalam skenario ekstraktor perangkat lunak, ekstraktor memerlukan objek pengurai berbasis perangkat lunak atau perangkat keras untuk setiap trek yang diacak, terlepas dari apakah trek memanggil dekoder aman. Ini karena hal berikut.

  • Jika trek tidak memerlukan dekode aman, ekstraktor menguraikan unit akses untuk menghapus buffer dan mengekstrak sampel seolah-olah dari aliran yang jelas. Dengan cara ini, MediaCodec tidak perlu terlibat dalam penguraian.
  • Jika trek memerlukan decoding aman, ekstraktor mungkin masih memerlukan descrambler. Hal ini terjadi ketika transport stream diacak di tingkat paket transport, di mana header packetized element stream (PES) diacak. Ekstraktor perlu mengakses header PES untuk menurunkan informasi tertentu (misalnya, stempel waktu presentasi).

    Descrambler tidak digunakan oleh ekstraktor jika aliran transport diacak pada tingkat paket PES, di mana header PES dibiarkan kosong. Namun, tidak mungkin untuk mengonfirmasi kapan pengacakan terjadi hingga paket teracak yang sebenarnya tiba. Untuk mempermudah, asumsikan descrambler digunakan jika trek ditentukan untuk diacak berdasarkan tabel pemetaan program (PMT).

Batasan konfigurasi perangkat lunak

Jika track memerlukan decoding yang aman, descrambler harus berhati-hati saat membiarkan operasi descramble menjadi buffer yang jelas. Karena dekode audio yang tidak aman diperlukan, jika dekode video memerlukan dekoder yang aman, dekode tersebut harus diacak pada sesi yang berbeda dari audio. ECM untuk sesi tersebut harus memberi sinyal ke plugin bahwa dekoder aman diperlukan.

Alternatifnya, plugin harus dapat dengan andal mengikat kunci ke kebijakan keamanannya. Jika tidak, aplikasi dapat dengan mudah mendapatkan bingkai video dengan descrambler audio.

Bahkan ketika sesi membutuhkan decoder yang aman, sesi tersebut mungkin diminta untuk mengeluarkan sejumlah kecil data untuk membersihkan buffer oleh ekstraktor untuk memproses header PES. Untuk mencegah aplikasi berbahaya membuat plugin mengembalikan seluruh unit akses, plugin perlu mengurai payload transport untuk memastikan bahwa payload dimulai dengan header PES dari jenis aliran yang sesuai. Jika tidak, plugin harus menolak permintaan tersebut.

Urutan penyetelan CA.

Saat menyetel ke saluran baru, modul TIS mendaftar untuk menerima deskriptor CA, ECM, dan EMM dari kerangka PSI Tuner. Deskriptor CA berisi ID sistem CA, yang secara unik mengidentifikasi vendor CA tertentu dan data khusus vendor lainnya. TIS menanyakan Media CAS untuk menentukan apakah ada plugin CAS yang dapat menangani deskriptor CA.

Diagram penyetelan konten CAS.

Gambar 3. Menyetel konten CAS

Jika ID sistem CA didukung, instance Media CAS akan dibuat dan data pribadi vendor dari deskriptor CA disediakan untuk plugin. Kemudian, sesi baru dibuka di Media CAS untuk menangani aliran audio dan video. Sesi yang baru dibuka menerima ECM dan EMM untuk plugin.

Contoh aliran plugin CAS

TIS mengirimkan ECM ke plugin CAS menggunakan Media CAS API. ECM berisi kata kontrol terenkripsi, yang perlu didekripsi menggunakan informasi dari EMM. Plugin CAS menentukan cara memperoleh EMM untuk aset berdasarkan informasi khusus vendor dalam deskriptor CA, yang disediakan oleh metode setPrivateData() .

EMM mungkin dikirim dalam pita di aliran konten atau di luar pita menggunakan permintaan jaringan yang dimulai oleh plugin CA. TIS menggunakan metode processEMM() untuk mengirimkan EMM pita apa pun ke plugin CA.

Jika permintaan jaringan diperlukan untuk mendapatkan EMM, plugin CA bertanggung jawab untuk melakukan transaksi jaringan dengan server lisensi.

Diagram contoh CAS.

Gambar 4. Contoh plugin CAS untuk pemrosesan EMM dan ECM

Saat EMM diterima, plugin CA mem-parsingnya untuk mendapatkan kunci terenkripsi untuk mendekripsi kata kontrol. Kunci EMM terenkripsi dan kata kontrol terenkripsi dapat dimuat ke dalam key ladder atau lingkungan tepercaya untuk menjalankan dekripsi kata kontrol dan selanjutnya menguraikan aliran konten.

Media CAS Java API

Media CAS Java API berisi metode berikut.

  • Cantumkan semua plugin CA yang tersedia di perangkat.

    class MediaCas.PluginDescriptor {
      public String getName();
      public int getSystemId();
    }
    static PluginDescriptor[] enumeratePlugins();
    
  • Buat instance Media CAS untuk sistem CA yang ditentukan. Ini berarti kerangka CAS Media dapat menangani beberapa sistem CAS secara bersamaan.

    MediaCas(int CA_system_id);
    MediaCas(@NonNull Context context, int casSystemId,
             @Nullable String tvInputServiceSessionId,
             @PriorityHintUseCaseType int priorityHint);
    
  • Daftarkan pemroses peristiwa dan izinkan aplikasi menentukan penangan yang loopernya digunakan.

    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);
    
  • Kirim data pribadi untuk sistem CA. Data pribadi dapat berasal dari deskriptor CA, tabel akses bersyarat, atau sumber di luar pita. Ini tidak terkait dengan sesi tertentu.

    void setPrivateData(@NonNull byte[] data);
    
  • Proses paket EMM.

    void processEmm(@NonNull byte[] data, int offset, int length);
    
  • Mengirim acara ke sistem CA. Format acara khusus untuk skema dan buram untuk kerangka kerja.

    void sendEvent(int event, int arg, @Nullable byte[] data);
    
  • Memulai operasi penyediaan dari jenis yang ditentukan untuk sistem CA. Saat perangkat mendaftar ke layanan TV berbayar untuk pertama kalinya, perangkat harus disiapkan ke server CAS terlebih dahulu. Sediakan sekumpulan parameter terkait ke perangkat untuk penyediaan.

    void provision(String provisionString);
    
  • Picu penyegaran hak. Saat pengguna berlangganan saluran baru (misalnya, dengan menanggapi iklan atau dengan menambahkan saluran pada panduan program elektronik (EPG)), aplikasi harus dapat memberi tahu klien CA untuk menyegarkan kunci hak.

    void refreshEntitlements(int refreshType);
    
  • Tutup objek Media CAS.

    void close();
    
  • Buka sesi.

    Session openSession();
    Session openSession(@SessionUsage int sessionUsage, @ScramblingMode int scramblingMode);
    
  • Tutup sesi yang dibuka sebelumnya.

    void Session#close();
    
  • Berikan data pribadi CA dari deskriptor CA di PMT, yang bisa dari info program atau bagian info ES, ke sesi CAS.

    void Session#setPrivateData(@NonNull byte[] sessionId, @NonNull byte[] data);
    
  • Proses paket ECM untuk satu sesi.

    void Session#processEcm(@NonNull byte[] data, int offset, int length);
    
  • Dapatkan ID sesi.

    byte[] Session#getSessionId();
    
  • Kirim acara sesi ke sistem CA. Format acara khusus untuk skema dan buram untuk kerangka kerja.

    void Session#sendSessionEvent(int event, int arg, @Nullable byte[] data);