Medya koşullu erişim sistemleri (Medya CAS) çerçevesi, dijital kablo, uydu, karasal sistemler ve IPTV sistemleri dahil olmak üzere çeşitli dijital TV donanımlarında koşullu erişim (CA) hizmetlerini etkinleştirmek için standart API'ler sağlar. Çerçeve, Android TV Giriş çerçevesi ve Android TV Tuner çerçevesi ile çalışır ve TV Giriş Hizmeti (TIS) uygulamasından çağrılan Java API'leri sağlar.
Media CAS'ın ana hedefleri şunlardır.
- Android'de yayın TV'si için CAS'i desteklemek üzere üçüncü taraf geliştiriciler ve OEM'ler tarafından kullanılabilecek herkese açık bir Java API'si ve yerel eklenti çerçevesi sağlayın.
- Android'de, ATV OEM'lerinin çeşitli CAS tedarikçileriyle tutarlı bir şekilde birlikte çalışabilmesini sağlayan bir CAS çerçevesi sağlayın.
- Yerel eklentileri kullanarak birden fazla üçüncü taraf CAS tedarikçi firmasını destekleyin. CAS eklentileri, tedarikçiye özgü ağ protokolleri, hak yönetimi mesajı (EMM)/hak kontrol mesajı (ECM) biçimleri ve kod çözücüler kullanabilir.
- Anahtar merdivenleri gibi donanım güvenliğini destekleyin.
- TrustZone gibi güvenilir yürütme ortamlarını (TEE'ler) destekler.
Desteklenen yapılandırmalar
Donanım tarayıcısı yapılandırması
MPEG aktarma akışının çoklu yayından ayırma ve kod çözme işlemlerinden donanım sorumluysa Tuner çerçevesi, donanım tabanlı TV tuner'larıyla arayüz oluşturmak için TIS uygulamasına koşullu erişim programına özgü bilgi (PSI) verileri sağlar.
Koşullu erişim PSI verileri CA tanımlayıcıları, ECM'ler ve EMM'leri içerir. Bu yapılar, CAS eklentisinin içerik akışlarının şifresini çözmek için gereken anahtarları almasını sağlar.
Şekil 1. Donanım tarayıcısı yapılandırması
Donanım yapılandırmasında, Şekil 1'de gösterilen TrustZone gibi bir TEE katmanı olabilir. TEE katmanı yoksa CAS istemci eklentisi, platform tarafından sağlanan donanım anahtar basamağı hizmetleriyle iletişim kurabilir. Bu arayüzlerin tedarikçi firmaya özgü varyasyonları nedeniyle Media CAS bunları standartlaştırmaz.
Yazılım yapılandırması
Android 11'den önce, Media CAS çerçevesi, IP çoklu yayın/tek yayından IPTV gibi yazılım tabanlı içerikleri işlemek için kullanılmaya devam edebilirdi. TIS uygulaması, Media CAS Java nesnesini örneklemekten ve doğru şekilde temel hazırlığından sorumludur.
Uygulama, CA tanımlayıcıları, ECM'ler ve EMM'ler gibi CA ile ilgili PSI verilerini ayıklamak için MediaExtractor'ı veya diğer MPEG2-TS ayrıştırıcıları kullanabilir. Uygulama MediaExtractor çerçevesini kullanıyorsa CAS oturum yönetimini (ör. oturum açma ve EMM/ECM işleme) MediaExtractor çerçevesine devredebilir. Ardından MediaExtractor, CAS oturumunu doğrudan yerel API'yi kullanarak yapılandırır.
Aksi takdirde, CA ile ilgili PSI verilerini ayıklamak ve Media CAS Java API'lerini kullanarak CAS oturumunu yapılandırmak (ör. uygulama kendi MPEG2-TS ayrıştırıcısını kullandığında) uygulamanın sorumluluğundadır.
Şekil 2. MediaExtractor çerçevesini kullanarak IPTV girişi, CAS ve kod çözücü yapılandırması
Yazılım ayıklayıcı senaryosuna göre, ayıklayıcının, parçanın güvenli kod çözücüler gerektirip gerektirmediğine bakılmaksızın her kodlanmış parça için bir yazılım veya donanım tabanlı kod çözücü nesnesi gerekir. Bunun nedeni aşağıdakilerdir.
- Parça güvenli kod çözme gerektirmiyorsa ayrıştırıcı, erişim birimini kod çözerek önbellekleri temizler ve temiz bir akıştan alınmış gibi örnekler ayrıştırır. Bu sayede
MediaCodec
'ün kod çözme işlemine dahil olması gerekmez. Parçanın şifresini çözmek için güvenli kod çözme gerekiyorsa ayıklayıcının bir kod çözücüye ihtiyacı olabilir. Bu durum, paketlenmiş temel akış (PES) başlığının karıştırıldığı taşıma paketi seviyesinde taşıma akışının karıştırılmasıyla gerçekleşir. Ayıklama aracının, belirli bilgileri (ör. sunma zaman damgası) aşağı akışa göndermek için PES başlığına erişmesi gerekir.
Taşıma akışı, PES başlığının net bırakıldığı PES paketi düzeyinde şifrelenmişse şifre çözücü, ayıklayıcı tarafından kullanılmaz. Ancak gerçek karmaşık paket gelene kadar karmaşıklaştırma işleminin ne zaman gerçekleştiğini doğrulamak mümkün değildir. Basitlik açısından, kanalın program eşleme tablosuna (PMT) göre kodlandığı belirlenirse bir kod çözücü kullanıldığını varsayalım.
Yazılım yapılandırmasıyla ilgili sınırlamalar
Parçanın güvenli kod çözme işlemi gerektirmesi durumunda, kod çözücünün net arabellekleri kod çözme işlemine izin verirken dikkatli olması gerekir. Güvenli olmayan ses kod çözme gerekli olduğundan, video kod çözme için güvenli kod çözücüler gerekiyorsa video, sesten farklı bir oturumda kodlanmalıdır. Oturum için ECM, eklentiye güvenli bir kod çözücü gerektiğini bildirmelidir.
Alternatif olarak, eklenti bir anahtarı güvenlik politikasına güvenilir bir şekilde bağlayabilmelidir. Aksi takdirde uygulama, ses çözücü ile video karelerini kolayca alabilir.
Oturum için güvenli bir kod çözücü gerekli olsa bile, PES başlığını işleyen ayrıştırıcının arabellekleri temizlemek için küçük miktarda veri yayınlaması istenebilir. Kötü amaçlı bir uygulamanın eklentinin erişim biriminin tamamını döndürmesini önlemek için eklentinin, yükün uygun akış türüne sahip bir PES başlığıyla başlamasını sağlamak amacıyla aktarım yükünü ayrıştırması gerekir. Aksi takdirde, eklenti isteği reddeder.
CA ayarlama sırası
TIS modülü, yeni bir kanala ayarlandığında PSI Tuner çerçevesinden CA tanımlayıcılar, ECM'ler ve EMM'ler almak için kaydedilir. CA tanımlayıcısı, belirli bir CA tedarikçisini ve tedarikçiye özgü diğer verileri benzersiz şekilde tanımlayan CA sistem kimliğini içerir. TIS, CA tanımlayıcısını işleyebilecek bir CAS eklentisinin olup olmadığını belirlemek için Media CAS'i sorgular.
Şekil 3. CAS içeriğini ayarlama
CA sistem kimliği destekleniyorsa Media CAS örneği oluşturulur ve CA tanımlayıcısından alınan tedarikçi özel verileri eklentiye sağlanır. Ardından, ses ve video akışlarını işlemek için Media CAS'te yeni oturumlar açılır. Yeni açılan oturumlar, eklenti için ECM'leri ve EMM'leri alır.
Örnek CAS eklentisi akışı
TIS, Media CAS API'lerini kullanarak ECM'leri CAS eklentisine gönderir. ECM, şifrelenmiş kontrol kelimesini içerir. Bu kelimenin şifresi, EMM'deki bilgiler kullanılarak çözülmelidir. CAS eklentisi, setPrivateData()
yöntemi tarafından sağlanan CA tanımlayıcısı içindeki tedarikçiye özgü bilgilere göre öğe için EMM'nin nasıl edinileceğini belirler.
EMM'ler, içerik akışında bant içinde veya CA eklentisi tarafından başlatılan bir ağ isteği kullanılarak bant dışında yayınlanabilir. TIS, bant içi EMM'leri CA eklentisine iletmek için processEMM()
yöntemini kullanır.
EMM almak için ağ isteği gerekiyorsa CA eklentisi, lisans sunucusuyla ağ işlemini gerçekleştirmekten sorumludur.
Şekil 4. EMM ve ECM işleme için örnek CAS eklentisi
EMM alındığında CA eklentisi, kontrol kelimesinin şifresini çözmek için şifrelenmiş anahtarı elde etmek üzere EMM'yi ayrıştırır. Şifrelenmiş EMM anahtarı ve şifrelenmiş kontrol kelimesi, kontrol kelimesinin şifresini çözmek ve ardından içerik akışının kod çözme işlemini gerçekleştirmek için bir anahtar merdivenine veya güvenilir bir ortama yüklenebilir.
Media CAS Java API
Media CAS Java API aşağıdaki yöntemleri içerir.
Cihazdaki tüm CA eklentilerini listeler.
class MediaCas.PluginDescriptor { public String getName(); public int getSystemId(); } static PluginDescriptor[] enumeratePlugins();
Belirtilen CA sistemi için bir Media CAS örneği oluşturun. Bu, Media CAS çerçevesinin aynı anda birden fazla CAS sistemini işleyebileceği anlamına gelir.
MediaCas(int CA_system_id); MediaCas(@NonNull Context context, int casSystemId, @Nullable String tvInputServiceSessionId, @PriorityHintUseCaseType int priorityHint);
Bir etkinlik dinleyicisi kaydedin ve uygulamanın, döngüsünün kullanıldığı bir işleyici belirtmesine izin verin.
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 sisteminin gizli verilerini gönderin. Gizli veriler CA tanımlayıcısı, koşullu erişim tablosu veya bant dışı kaynaklardan gelebilir. Bu, belirli bir oturumla ilişkili değildir.
void setPrivateData(@NonNull byte[] data);
EMM paketini işleyin.
void processEmm(@NonNull byte[] data, int offset, int length);
Bir CA sistemine etkinlik gönderin. Etkinliğin biçimi şemaya özgüdür ve çerçeve için şeffaf değildir.
void sendEvent(int event, int arg, @Nullable byte[] data);
CA sistemi için belirtilen türde bir temel hazırlama işlemi başlatın. Bir cihaz, ücretli TV hizmetine ilk kez kaydolduğunda önce CAS sunucusunda temel hazırlığı yapılmalıdır. Cihazla ilgili bir dizi ilgili parametreyi temel hazırlığa ekleyin.
void provision(String provisionString);
Hakların yenilenmesini tetikleyin. Bir kullanıcı yeni bir kanala abone olduğunda (ör. bir reklamı yanıtlayarak veya elektronik program rehberine (EPG) kanal ekleyerek), uygulama, CA istemcilerine hak anahtarlarını yenilemeleri gerektiğini bildirebilmelidir.
void refreshEntitlements(int refreshType);
Media CAS nesnesini kapatın.
void close();
Oturum açın.
Session openSession(); Session openSession(@SessionUsage int sessionUsage, @ScramblingMode int scramblingMode);
Daha önce açılmış bir oturumu kapatın.
void Session#close();
PMT'deki bir CA tanımlayıcısı (program bilgileri veya ES bilgileri bölümünden alınabilir) üzerinden CA gizli verilerini bir CAS oturumuna sağlayın.
void Session#setPrivateData(@NonNull byte[] sessionId, @NonNull byte[] data);
Bir oturum için ECM paketi işleyin.
void Session#processEcm(@NonNull byte[] data, int offset, int length);
Oturum kimliğini alın.
byte[] Session#getSessionId();
Bir CA sistemine oturum etkinliği gönderin. Etkinliğin biçimi şemaya özgüdür ve çerçeve için şeffaf değildir.
void Session#sendSessionEvent(int event, int arg, @Nullable byte[] data);