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şi çerçevesi ve Android TV Tarayıcısı çerçevesi ile birlikte çalışarak TV Giriş Hizmeti (TIS) uygulamasından çağrılan Java API'lerini 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'lerin çeşitli CAS tedarikçileriyle tutarlı bir şekilde birlikte çalışabilmesini sağlayan bir CAS çerçevesi sağlayın.
- Yerel eklentiler kullanarak birden fazla üçüncü taraf CAS tedarikçisini destekleyin. CAS eklentileri; satıcıya özel ağ protokolleri, yararlanma hakkı yönetim mesajı (EMM)/yararlanma hakkı kontrol mesajı (ECM) biçimlerini ve şifre çözücüleri 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ıklama 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ı
Medya CAS çerçevesi, Android 11'den önce de yazılım tabanlı içerikleri (ör. IP çoklu yayın/unicast üzerinden IPTV) işlemek için kullanılabilmekteydi. 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 çıkarmak 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 uygulamanın sorumluluğundadır (ör. uygulama kendi MPEG2-TS ayrıştırıcısını kullandığında).
Şekil 2. MediaExtractor çerçevesini kullanarak IPTV girişi, CAS ve şifre çö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 yazılım veya donanım tabanlı bir kod çözücü nesnesi gerekir. Bunun nedeni aşağıdakilerdir.
- Kanal güvenli kod çözmeyi gerektirmiyorsa ayıklayıcı, arabellekleri temizlemek için erişim biriminin şifresini çözer ve sanki açık bir akıştan geliyormuş gibi örnekleri ayıklar. Bu sayede
MediaCodec
adlı kullanıcının çözüm sürecine dahil olmasına gerek kalmaz. Kanal, güvenli kod çözmeyi gerektiriyorsa ayıklayıcı için yine de bir şifre çözücü gerekebilir. Bu durum, taşıma akışı taşıma paketi düzeyinde karıştığında, paketlenmiş temel akış (PES) başlığının da karıştığı durumlarda meydana gelir. 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. Bununla birlikte, karma hale getirilmiş gerçek paket gelene kadar karmaşanın 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
Kanal güvenli kod çözmeyi gerektirdiğinde şifre çözücü, şifre çözme işlemini açık arabelleklere aktarırken dikkatli olmalıdır. 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 şifrelenmelidir. Oturum için ECM, eklentiye güvenli bir kod çözücü gerektiğini bildirmelidir.
Alternatif olarak, eklentinin 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ı tarafından arabellekleri temizlemek için küçük miktarda veri vermesi 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ı
Yeni bir kanala ayarlama yaparken TIS modülü, PSI Tuner çerçevesinden CA tanımlayıcıları, ECM'ler ve EMM'leri almak için kaydolur. CA tanımlayıcısı, belirli bir CA tedarikçisini ve tedarikçi firmaya ö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'de yeni oturumlar açılır. Yeni açılan oturumlar, eklenti için ECM'leri ve EMM'leri alır.
Örnek CAS eklentisi akışı
TIS, ECM'leri Media CAS API'lerini kullanarak 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ında yer alan satıcıya özgü bilgilere dayanarak öğe için nasıl EMM alınacağını 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 çözmeyi ve daha sonra içerik akışının şifresini çözme işleminin gerçekleştirilmesi için bir anahtar katmanına veya güvenilir bir ortama yüklenebilir.
Media CAS Java API
Media CAS Java API'si aşağıdaki yöntemleri içerir.
Cihazdaki kullanılabilir tüm CA eklentilerini listeleyin.
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ü işlevi kullanılan 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);
CA sistemine etkinlik gönderir. 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 bir ücretli TV hizmetine ilk kez kaydolduğunda önce CAS sunucusuna sağlanması gerekir. Cihazla ilgili bir dizi ilgili parametreyi temel hazırlığa ekleyin.
void provision(String provisionString);
Yararlanma hakları 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ından CA özel verilerini sağlayın. Bu veriler, program bilgileri veya ES bilgileri bölümünden bir CAS oturumuna kadar olabilir.
void Session#setPrivateData(@NonNull byte[] sessionId, @NonNull byte[] data);
Bir oturum için ECM paketini işleyin.
void Session#processEcm(@NonNull byte[] data, int offset, int length);
Oturum kimliğini alın.
byte[] Session#getSessionId();
CA sistemine oturum etkinliği gönderir. 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);