CAS çerçevesi

Medya koşullu erişim sistemleri (Media 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. Bu çerçeve, TV Giriş Hizmeti (TIS) uygulamasından çağrılan Java API'leri sağlayarak Android TV Giriş çerçevesi ve Android TV Tuner çerçevesi ile çalışır.

Media CAS'in temel hedefleri şunlardır:

  • Üçüncü taraf geliştiriciler ve OEM'ler tarafından Android'de yayın TV için CAS'i desteklemek üzere 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 sağlayıcılarla tutarlı bir şekilde birlikte çalışmasına olanak tanıyan bir CAS çerçevesi sağlar.
  • Yerel eklentileri kullanarak birden fazla üçüncü taraf CAS tedarikçisini destekleyin. CAS eklentileri, tedarikçiye özel ağ protokolleri, hak yönetimi mesajı (EMM)/hak kontrol mesajı (ECM) biçimleri ve çözücüler kullanabilir.
  • Anahtar merdivenleri gibi donanım güvenliğini destekler.
  • TrustZone gibi güvenilir yürütme ortamlarını (TEE) destekleyin.

Desteklenen yapılandırmalar

Donanım kanal ayarlayıcı yapılandırması

Donanım, MPEG aktarım akışı demultipleksleme ve karıştırma çözme işlemlerinden sorumludur. Tuner framework, donanım tabanlı TV tuner'larıyla arayüz oluşturmak için TIS uygulamasına koşullu erişim programına özel bilgi (PSI) verileri sağlar.

Koşullu erişim PSI verileri, CA tanımlayıcılarını, ECM'leri 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.

Donanım Tuner yapılandırmasının şeması.

1. şekil. Donanım kanal ayarlayıcı yapılandırması

Donanım yapılandırmasında, Şekil 1'de gösterildiği gibi TrustZone gibi bir TEE katmanı olabilir. TEE katmanı yoksa bir CAS istemci eklentisi, platform tarafından sağlanan donanım anahtarı merdiveni hizmetleriyle iletişim kurabilir. Bu arayüzlerin satıcıya özel 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ını üzerinden IPTV gibi yazılıma dayalı içerikleri işlemek için kullanılmaya devam edebiliyordu. TIS uygulaması, Media CAS Java nesnesini oluşturmaktan ve doğru şekilde sağlamaktan 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ını kullanabilir. Uygulama MediaExtractor çerçevesini kullanıyorsa oturum açma ve EMM/ECM işleme gibi CAS oturum yönetimi işlemlerini MediaExtractor çerçevesine devredebilir. MediaExtractor daha sonra 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 (örneğin, uygulama kendi MPEG2-TS ayrıştırıcısını kullandığında).

Tarayıcı yapılandırmasının şeması.

Şekil 2. Framework MediaExtractor kullanılarak IPTV girişi, CAS ve karıştırma çözücü yapılandırması

Yazılım ayıklayıcı senaryosunda, parça güvenli kod çözücüler gerektirsin veya gerektirmesin, ayıklayıcı her karıştırılmış parça için yazılıma veya donanıma dayalı bir karıştırma çözücü nesne gerektirir. Bunun nedeni aşağıdakilerden biri olabilir.

  • Parça güvenli kod çözme gerektirmiyorsa ayıklayıcı, arabellekleri temizlemek için erişim biriminin kodunu çözer ve örnekleri açık bir akıştanmış gibi ayıklar. Bu sayede MediaCodec, karıştırma işleminin çözülmesine dahil olmak zorunda kalmaz.
  • Parça, güvenli kod çözme gerektiriyorsa ayıklayıcının yine de bir karıştırıcı çözücüye ihtiyacı olabilir. Bu durum, taşıma akışı taşıma paketi düzeyinde karıştırıldığında (paketlenmiş temel akış (PES) başlığı karıştırıldığında) meydana gelir. Ayıklayıcının, belirli bilgileri (örneğin, sunum zaman damgası) aşağı akışa aktarmak için PES üstbilgisine erişmesi gerekir.

    Taşıma akışı, PES üstbilgisinin açık bırakıldığı PES paketi düzeyinde karıştırılmışsa karıştırıcı, ayıklayıcı tarafından kullanılmaz. Ancak, gerçek karıştırılmış paket gelene kadar karıştırmanın ne zaman gerçekleştiğini onaylamak mümkün değildir. Basitlik açısından, program eşleme tablosuna (PMT) göre parçanın karıştırılmış olduğu belirlenirse bir çözücünün kullanıldığını varsayın.

Yazılım yapılandırmasıyla ilgili sınırlamalar

Parça güvenli kod çözme gerektirdiğinde, karıştırıcı, kod çözme işleminin açık arabelleklere girmesine izin verirken dikkatli olmalıdır. Güvenli olmayan ses kod çözme işlemi gerektiğinden video kod çözme işlemi için güvenli kod çözücüler gerekiyorsa sesle farklı bir oturumda karıştırılmalıdır. Oturumun ECM'si, güvenli bir kod çözücünün gerekli olduğunu eklentiye bildirmelidir.

Alternatif olarak, eklenti bir anahtarı güvenlik politikasına güvenilir bir şekilde bağlayabilmelidir. Aksi takdirde, uygulama ses çözücüyle video karelerini kolayca alabilir.

Oturum güvenli bir kod çözücü gerektirse bile, PES başlığını işlemek için ayıklayıcı tarafından arabellekleri temizlemek üzere az miktarda veri çıkışı yapması istenebilir. Kötü amaçlı bir uygulamanın, eklentinin tüm erişim birimini döndürmesini önlemek için eklentinin, yükün uygun akış türünde bir PES başlığıyla başladığından emin olmak üzere aktarım yükünü ayrıştırması gerekir. Aksi takdirde, eklenti isteği reddetmelidir.

CA ayarlama sırası

Yeni bir kanala geçiş yapıldığında TIS modülü, PSI Tuner çerçevesinden CA tanımlayıcıları, ECM'ler ve EMM'ler almak için kaydolur. CA tanımlayıcısı, belirli bir CA sağlayıcısını benzersiz şekilde tanımlayan CA sistem kimliğini ve sağlayıcıya özel diğer verileri içerir. TIS, CA tanımlayıcısını işleyebilecek bir CAS eklentisinin olup olmadığını belirlemek için Media CAS'e sorgu gönderir.

CAS içeriğini ayarlama diyagramı.

3.Şekil CAS içeriğini ayarlama

CA sistem kimliği destekleniyorsa Media CAS'ın bir örneği oluşturulur ve CA tanımlayıcısından alınan satıcıya ait özel veriler 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'ler ve EMM'ler alır.

Örnek CAS eklenti akışı

TIS, Media CAS API'lerini kullanarak CAS eklentisine ECM'ler sunar. Bir ECM, EMM'den alınan bilgiler kullanılarak şifresi çözülmesi gereken şifrelenmiş kontrol sözcüğünü içerir. CAS eklentisi, setPrivateData() yöntemiyle sağlanan CA tanımlayıcısındaki tedarikçiye özgü bilgilere göre öğe için nasıl EMM edinileceğini belirler.

EMM'ler, içerik akışında bant içi olarak veya CA eklentisi tarafından başlatılan bir ağ isteği kullanılarak bant dışı olarak teslim edilebilir. TIS, bant içi EMM'leri CA eklentisine iletmek için processEMM() yöntemini kullanır.

EMM almak için bir ağ isteği gerekiyorsa CA eklentisi, lisans sunucusuyla ağ işlemini gerçekleştirmekten sorumludur.

Örnek bir CAS'nin şeması.

Ş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 içerik akışının sonraki karıştırma işlemini gerçekleştirmek için bir anahtar merdivenine veya güvenilir ortama yüklenebilir.

Media CAS Java API'si

Media CAS Java API'sinde aşağıdaki yöntemler bulunur.

  • Cihazdaki tüm kullanılabilir 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 işleyici kaydedin ve uygulamanın, looper'ı 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 özel verilerini gönderin. Özel veriler CA tanımlayıcısından, koşullu erişim tablosundan veya bant dışı kaynaklardan gelebilir. Bu, belirli bir oturumla ilişkilendirilmez.

    void setPrivateData(@NonNull byte[] data);
    
  • EMM paketini işleme

    void processEmm(@NonNull byte[] data, int offset, int length);
    
  • CA sistemine etkinlik gönderme Etkinliğin biçimi şemaya özeldir ve çerçeve için opakdır.

    void sendEvent(int event, int arg, @Nullable byte[] data);
    
  • Bir CA sistemi için belirtilen türde bir sağlama işlemi başlatır. Bir cihaz ilk kez ücretli TV hizmetine kaydolduğunda önce CAS sunucusu için temel hazırlık yapılması gerekir. Sağlama için cihaza bir dizi ilgili parametre sağlayın.

    void provision(String provisionString);
    
  • Hakların yenilenmesini tetikleyin. Bir kullanıcı yeni bir kanala abone olduğunda (örneğin, bir reklama yanıt vererek veya elektronik program rehberine (EPG) bir kanal ekleyerek) uygulama, CA istemcilerine yetki anahtarlarını yenilemelerini söyleyebilmelidir.

    void refreshEntitlements(int refreshType);
    
  • Media CAS nesnesini kapatın.

    void close();
    
  • Bir 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 (program bilgileri veya ES bilgileri bölümünde olabilir) bir CAS oturumuna CA özel verilerini sağlayın.

    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();
    
  • Bir CA sistemine oturum etkinliği gönderme. Etkinliğin biçimi şemaya özeldir ve çerçeve için opakdır.

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