Framework Sistem akses bersyarat Media (Media CAS) menyediakan API standar untuk mengaktifkan layanan akses bersyarat (CA) pada berbagai hardware TV digital, termasuk kabel digital, satelit, sistem terestrial, dan sistem IPTV. Framework ini berfungsi dengan framework Android TV Input dan framework Android TV Tuner, yang menyediakan API Java yang dipanggil dari aplikasi TV Input Service (TIS).
Tujuan utama Media CAS adalah sebagai berikut.
- Menyediakan API Java publik dan framework plugin native yang dapat digunakan oleh developer pihak ketiga dan OEM untuk mendukung CAS untuk TV siaran di Android.
- Menyediakan framework CAS dalam Android yang memungkinkan OEM ATV berinteraksi dengan berbagai vendor CAS secara konsisten.
- Mendukung beberapa vendor CAS pihak ketiga menggunakan plugin native. Plugin CAS mungkin menggunakan protokol jaringan khusus vendor, format pesan pengelolaan hak (EMM)/pesan kontrol hak (ECM), dan descrambler.
- Mendukung keamanan hardware seperti tangga kunci.
- Mendukung trusted execution environment (TEE) seperti TrustZone.
Konfigurasi yang didukung
Konfigurasi Tuner Hardware
Jika hardware bertanggung jawab untuk demultiplexing dan descrambling MPEG transport stream, framework Tuner menyediakan data informasi khusus program (PSI) akses bersyarat ke aplikasi TIS untuk berinteraksi dengan tuner TV berbasis hardware.
Data PSI akses bersyarat mencakup deskripsi CA, ECM, dan EMM. Struktur ini memungkinkan plugin CAS mendapatkan kunci yang diperlukan untuk mendekripsi aliran konten.
Gambar 1. Konfigurasi Tuner Hardware
Konfigurasi hardware mungkin memiliki lapisan TEE, seperti TrustZone, yang diilustrasikan dalam Gambar 1. Jika tidak ada lapisan TEE, plugin klien CAS dapat berkomunikasi dengan layanan tangga kunci hardware yang disediakan oleh platform. Karena variasi antarmuka khusus vendor ini, Media CAS tidak menstandarkannya.
Konfigurasi perangkat lunak
Sebelum Android 11, framework Media CAS masih dapat digunakan untuk memproses konten berbasis software, seperti IPTV dari IP multicast/unicast. Aplikasi TIS bertanggung jawab untuk membuat instance dan menyediakan objek Java Media CAS dengan benar.
Aplikasi mungkin menggunakan MediaExtractor atau parser MPEG2-TS lainnya untuk mengekstrak data PSI terkait CA, seperti deskripsi CA, ECM, dan EMM. Jika menggunakan framework MediaExtractor, aplikasi dapat mendelegasikan pengelolaan sesi CAS, seperti membuka sesi dan memproses EMM/ECM, ke MediaExtractor framework. MediaExtractor kemudian mengonfigurasi sesi CAS menggunakan API native 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 parser MPEG2-TS-nya sendiri).
Gambar 2. Input IPTV, CAS, dan konfigurasi descrambler menggunakan framework MediaExtractor
Dalam skenario ekstraktor software, ekstraktor memerlukan software atau objek descrambler berbasis hardware untuk setiap jalur acak, terlepas dari apakah jalur tersebut memanggil dekoder aman. Hal ini disebabkan oleh hal berikut.
- Jika jalur tidak memerlukan decoding aman, ekstraktor akan mengurai
unit akses untuk menghapus buffer dan mengekstrak sampel seolah-olah dari
streaming yang jelas. Dengan cara ini,
MediaCodec
tidak perlu terlibat dalam penuraian. Jika trek memerlukan decoding aman, ekstraktor mungkin masih memerlukan descrambler. Hal ini terjadi saat aliran transpor diacak pada tingkat paket transpor, tempat header aliran dasar paket (PES) diacak. Ekstraktor perlu mengakses header PES untuk mendownload informasi tertentu (misalnya, stempel waktu presentasi).
Descrambler tidak digunakan oleh ekstraktor jika streaming transpor diacak di level paket PES, dengan header PES dibiarkan jelas. Namun, Anda tidak dapat mengonfirmasi kapan pengacakan terjadi hingga paket yang diacak sebenarnya tiba. Untuk memudahkan, asumsikan bahwa descrambler digunakan jika trek ditentukan untuk diacak berdasarkan tabel pemetaan program (PMT).
Keterbatasan konfigurasi software
Jika trek memerlukan decoding aman, descrambler harus berhati-hati saat mengizinkan operasi descramble ke buffering yang jelas. Karena dekode audio yang tidak aman diperlukan, jika dekode video memerlukan decoder yang aman, dekode tersebut harus diacak pada sesi yang berbeda dari audio. ECM untuk sesi tersebut harus memberi sinyal ke plugin bahwa decoder yang aman diperlukan.
Atau, plugin harus dapat mengaitkan kunci ke kebijakan keamanannya dengan andal. Jika tidak, aplikasi dapat dengan mudah mendapatkan frame video dengan descrambler audio.
Meskipun sesi memerlukan decoder aman, sesi mungkin akan diminta untuk menghasilkan output dalam jumlah kecil data guna menghapus buffer oleh ekstraktor untuk memproses header PES. Untuk mencegah aplikasi berbahaya membuat plugin menampilkan seluruh unit akses, plugin perlu mengurai payload transpor untuk memastikan bahwa payload dimulai dengan header PES dari jenis streaming yang sesuai. Jika tidak, plugin harus menolak permintaan.
Urutan tuning CA
Saat melakukan tuning ke saluran baru, modul TIS mendaftar untuk menerima deskriptor CA, ECM, dan EMM dari framework PSI Tuner. Deskripsi CA berisi ID sistem CA, yang secara unik mengidentifikasi vendor CA tertentu dan data khusus vendor lainnya. TIS membuat kueri Media CAS untuk menentukan apakah ada plugin CAS yang dapat menangani deskriptor CA.
Gambar 3. Menyesuaikan konten CAS
Jika ID sistem CA didukung, instance Media CAS akan dibuat dan data pribadi vendor dari deskriptor CA diberikan ke plugin. Kemudian, sesi baru dibuka di Media CAS untuk menangani streaming audio dan video. Sesi yang baru dibuka akan menerima ECM dan EMM untuk plugin.
Contoh alur 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
deskripsi CA, yang disediakan oleh metode setPrivateData()
.
EMM dapat dikirim dalam band di aliran konten atau di luar band menggunakan
permintaan jaringan yang dimulai oleh plugin CA. TIS menggunakan metode processEMM()
untuk mengirimkan EMM dalam band ke plugin CA.
Jika permintaan jaringan diperlukan untuk mendapatkan EMM, plugin CA bertanggung jawab untuk melakukan transaksi jaringan dengan server lisensi.
Gambar 4. Contoh plugin CAS untuk pemrosesan EMM dan ECM
Saat EMM diterima, plugin CA akan mengurainya untuk mendapatkan kunci terenkripsi guna mendekripsi kata kontrol. Kunci EMM yang dienkripsi dan kata kontrol terenkripsi dapat dimuat ke tangga kunci atau lingkungan tepercaya untuk melakukan dekripsi kata kontrol dan penurunan aliran konten berikutnya.
Media CAS Java API
Media CAS Java API berisi metode berikut.
Mencantumkan semua plugin CA yang tersedia di perangkat.
class MediaCas.PluginDescriptor { public String getName(); public int getSystemId(); } static PluginDescriptor[] enumeratePlugins();
Buat instance CAS Media untuk sistem CA yang ditentukan. Artinya, framework Media CAS dapat menangani beberapa sistem CAS secara bersamaan.
MediaCas(int CA_system_id); MediaCas(@NonNull Context context, int casSystemId, @Nullable String tvInputServiceSessionId, @PriorityHintUseCaseType int priorityHint);
Mendaftarkan pemroses peristiwa dan mengizinkan aplikasi menentukan pengendali yang looper-nya 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 deskripsi CA, tabel akses bersyarat, atau sumber di luar band. Ini tidak dikaitkan dengan sesi tertentu.
void setPrivateData(@NonNull byte[] data);
Memproses paket EMM.
void processEmm(@NonNull byte[] data, int offset, int length);
Mengirim peristiwa ke sistem CA. Format peristiwa khusus untuk skema dan buram untuk framework.
void sendEvent(int event, int arg, @Nullable byte[] data);
Memulai operasi penyediaan jenis yang ditentukan untuk sistem CA. Saat perangkat mendaftar ke layanan TV berbayar untuk pertama kalinya, perangkat harus disediakan ke server CAS terlebih dahulu. Memberikan kumpulan parameter terkait ke perangkat untuk penyediaan.
void provision(String provisionString);
Memicu pembaruan hak. Saat pengguna berlangganan ke saluran baru (misalnya, dengan merespons iklan atau dengan menambahkan saluran di panduan program elektronik (EPG)), aplikasi harus dapat memberi tahu klien CA untuk memperbarui kunci hak.
void refreshEntitlements(int refreshType);
Tutup objek Media CAS.
void close();
Buka sesi.
Session openSession(); Session openSession(@SessionUsage int sessionUsage, @ScramblingMode int scramblingMode);
Menutup sesi yang dibuka sebelumnya.
void Session#close();
Berikan data pribadi CA dari deskripsi CA di PMT, yang dapat berasal dari bagian info program atau info ES, ke sesi CAS.
void Session#setPrivateData(@NonNull byte[] sessionId, @NonNull byte[] data);
Memproses paket ECM untuk sesi.
void Session#processEcm(@NonNull byte[] data, int offset, int length);
Mendapatkan ID sesi.
byte[] Session#getSessionId();
Mengirim peristiwa sesi ke sistem CA. Format peristiwa bersifat khusus untuk skema dan tidak transparan untuk framework.
void Session#sendSessionEvent(int event, int arg, @Nullable byte[] data);