CAS çerçevesi

Medya koşullu erişim sistemleri (Medya CAS) çerçevesi, dijital kablo, uydu, karasal sistemler ve IPTV sistemleri de dahil olmak üzere bir dizi dijital TV donanımı üzerinde 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çevesiyle birlikte çalışarak TV Giriş Hizmeti (TIS) uygulamasından çağrılan Java API'lerini sağlar.

Media CAS'ın temel amaçları aşağıdaki gibidir.

  • Android'de TV yayını için CAS'yi desteklemek amacıyla üçüncü taraf geliştiriciler ve OEM'ler tarafından kullanılabilecek genel bir Java API'si ve yerel eklenti çerçevesi sağlayın.
  • ATV OEM'lerinin çeşitli CAS satıcılarıyla tutarlı bir şekilde birlikte çalışmasına olanak tanıyan Android içinde bir CAS çerçevesi sağlayın.
  • Yerel eklentileri kullanarak birden fazla üçüncü taraf CAS satıcısını destekleyin. CAS eklentileri satıcıya özel ağ protokollerini, yetki yönetimi mesajı (EMM)/yetki kontrol mesajı (ECM) formatlarını ve şifre çözücüleri kullanabilir.
  • Anahtar merdivenler gibi donanım güvenliğini destekleyin.
  • TrustZone gibi güvenilir yürütme ortamlarını (TEE'ler) destekleyin.

Desteklenen yapılandırmalar

Donanım Ayarlayıcı yapılandırması

Donanım, MPEG taşıma akışının çoğullama ve karışıklığının çözülmesinden sorumluysa, Tuner çerçevesi, donanım tabanlı TV alıcılarıyla arayüz oluşturmak için TIS uygulamasına koşullu erişim programına özel bilgiler (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ı elde etmesini sağlar.

Donanım Ayarlayıcı yapılandırmasının şeması.

Şekil 1. Donanım Ayarlayıcı yapılandırması

Donanım konfigürasyonu, Şekil 1'de gösterilen TrustZone gibi bir TEE katmanına sahip olabilir. Bir 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 çok noktaya yayın/tek noktaya yayından IPTV gibi yazılım tabanlı içerikleri işlemek için hâlâ kullanılabiliyordu. TIS uygulaması, Media CAS Java nesnesinin başlatılmasından ve düzgün şekilde sağlanması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ını kullanabilir. Uygulama MediaExtractor çerçevesini kullanıyorsa, bir oturumun açılması ve EMM/ECM'nin işlenmesi gibi CAS oturum yönetimini MediaExtractor çerçevesine devredebilir. MediaExtractor daha sonra doğrudan yerel API'yi kullanarak CAS oturumunu yapılandırır.

Aksi takdirde uygulama, CA ile ilgili PSI verilerinin çıkarılmasından ve Media CAS Java API'lerini kullanarak CAS oturumunun yapılandırılmasından sorumludur (örneğin, uygulama kendi MPEG2-TS ayrıştırıcısını kullandığında).

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

Şekil 2. MediaExtractor çerçevesini kullanan IPTV girişi, CAS ve şifre çözücü yapılandırması

Yazılım çıkarıcı senaryosunda, izin güvenli kod çözücüleri çağırıp çağırmadığına bakılmaksızın çıkarıcı, her karıştırılmış iz için bir yazılım veya donanım tabanlı şifre çözücü nesnesine ihtiyaç duyar. Bunun nedeni aşağıdakilerden kaynaklanmaktadır.

  • İz güvenli kod çözme gerektirmiyorsa çıkarıcı, arabellekleri temizlemek için erişim ünitesinin şifresini çözer ve örnekleri temiz bir akıştan alıyormuş gibi çıkarır. Bu şekilde MediaCodec şifre çözme işlemine dahil olmasına gerek kalmaz.
  • Parça güvenli kod çözme gerektiriyorsa çıkarıcının yine de bir şifre çözücüye ihtiyacı olabilir. Bu durum, taşıma akışı, paketlenmiş temel akış (PES) başlığının karıştırıldığı taşıma paketi seviyesinde karıştırıldığında meydana gelir. Çıkarıcının, belirli bilgileri (örneğin sunum zaman damgası) aşağı akışa almak için PES başlığına erişmesi gerekir.

    Aktarım akışı, PES başlığının açık bırakıldığı PES paket seviyesinde karıştırılmışsa, şifre çözücü çıkarıcı tarafından kullanılmaz. Ancak gerçek karıştırılmış paket gelene kadar karıştırmanın ne zaman gerçekleşeceğini onaylamak mümkün değildir. Basitlik açısından, parçanın program eşleme tablosuna (PMT) göre karıştırılacağı belirlenirse bir şifre çözücünün kullanıldığını varsayalım.

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

İz güvenli kod çözme gerektirdiğinde, şifre çözücünün temiz arabelleklere bir şifre çözme işlemine izin verirken dikkatli olması gerekir. Güvenli olmayan ses kod çözme gerekli olduğundan, video kod çözme güvenli kod çözücüler gerektiriyorsa sesten farklı bir oturumda karıştırılmalıdır. Oturumun ECM'si eklentiye güvenli bir kod çözücünün gerekli olduğunu bildirmelidir.

Alternatif olarak eklentinin güvenlik politikasına güvenilir bir şekilde bir anahtar bağlayabilmesi gerekir. Aksi takdirde uygulama, ses şifre çözücüyü kullanarak kolayca video kareleri alabilir.

Oturum güvenli bir kod çözücü gerektirse bile, PES başlığını işlemek üzere çıkarıcı tarafından arabellekleri temizlemek için küçük miktarda veri çıkışı yapması istenebilir. Kötü amaçlı bir uygulamanın, eklentinin erişim biriminin tamamını döndürmesini önlemek için eklentinin, taşıma yükünü ayrıştırarak, taşıma yükünün uygun akış türündeki bir PES başlığıyla başladığından emin olması gerekir. Aksi halde eklentinin isteği reddetmesi gerekir.

CA ayarlama sırası

Yeni bir kanala ayarlarken TIS modülü, PSI Ayarlayıcı çerçevesinden CA tanımlayıcılarını, ECM'leri ve EMM'leri almak üzere kaydolur. CA tanımlayıcısı, belirli bir CA satıcısını ve satıcıya ö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 mevcut olup olmadığını belirlemek için Medya CAS'ı sorgular.

CAS içeriğini ayarlama şeması.

Şekil 3. CAS içeriğini ayarlama

CA sistem kimliği destekleniyorsa Medya CAS'nin bir örneği oluşturulur ve CA tanımlayıcısındaki satıcıya özel veriler eklentiye sağlanır. Daha sonra Media CAS'ta ses ve video akışlarının yönetilmesi için yeni oturumlar açılır. Yeni açılan oturumlar, eklentiye ilişkin ECM'leri ve EMM'leri alır.

Örnek CAS eklenti akışı

TIS, Medya CAS API'lerini kullanarak ECM'leri CAS eklentisine iletir. Bir ECM, EMM'den gelen bilgiler kullanılarak şifresinin çözülmesi gereken şifrelenmiş kontrol sözcüğünü içerir. CAS eklentisi, setPrivateData() yöntemi tarafından sağlanan CA tanımlayıcısındaki satıcıya özel bilgilere dayanarak varlık için bir EMM'nin nasıl alınacağını belirler.

EMM'ler, CA eklentisi tarafından başlatılan bir ağ isteği kullanılarak içerik akışında bant içinde veya bant dışında 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, ağ işleminin bir lisans sunucusuyla gerçekleştirilmesinden CA eklentisi sorumludur.

Örnek bir CAS'ın diyagramı.

Şekil 4. EMM ve ECM işleme için örnek CAS eklentisi

EMM alındığında, CA eklentisi, kontrol sözcüğünün şifresini çözmek için şifrelenmiş anahtarı elde etmek üzere onu ayrıştırır. Şifrelenmiş EMM anahtarı ve şifrelenmiş kontrol sözcüğü, kontrol sözcüğü şifresinin çözülmesini ve ardından içerik akışının karışıklığının çözülmesini gerçekleştirmek için bir anahtar merdivenine veya güvenilir ortama yüklenebilir.

Medya CAS Java API'si

Media CAS Java API'si aşağıdaki yöntemleri içerir.

  • Cihazdaki mevcut tüm CA eklentilerini listeleyin.

    class MediaCas.PluginDescriptor {
      public String getName();
      public int getSystemId();
    }
    static PluginDescriptor[] enumeratePlugins();
    
  • Belirtilen CA sistemi için bir Medya CAS örneği oluşturun. Bu, Media CAS çerçevesinin aynı anda birden fazla CAS sistemini yönetebileceği anlamına gelir.

    MediaCas(int CA_system_id);
    MediaCas(@NonNull Context context, int casSystemId,
             @Nullable String tvInputServiceSessionId,
             @PriorityHintUseCaseType int priorityHint);
    
  • Bir olay dinleyicisini kaydedin ve uygulamanın, döngüleyicinin kullanıldığı işleyiciyi 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 sistemi için özel verileri 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şkili değildir.

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

    void processEmm(@NonNull byte[] data, int offset, int length);
    
  • Bir olayı CA ​​sistemine gönderin. Etkinliğin formatı şemaya özeldir ve çerçeveye karşı şeffaf değildir.

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

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

    void refreshEntitlements(int refreshType);
    
  • Medya 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();
    
  • Program bilgisi veya ES bilgisi bölümünden olabilecek, PMT'deki bir CA tanımlayıcısından CA özel verilerini bir CAS oturumuna sağlayın.

    void Session#setPrivateData(@NonNull byte[] sessionId, @NonNull byte[] data);
    
  • Bir oturum için bir ECM paketini işleyin.

    void Session#processEcm(@NonNull byte[] data, int offset, int length);
    
  • Oturum kimliğini alın.

    byte[] Session#getSessionId();
    
  • CA sistemine bir oturum olayı gönderin. Etkinliğin formatı şemaya özeldir ve çerçeveye şeffaf değildir.

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