khung CAS

Khung Hệ thống truy cập có điều kiện nội dung nghe nhìn (Media CAS) cung cấp các API tiêu chuẩn để cho phép các dịch vụ truy cập có điều kiện (CA) trên nhiều phần cứng truyền hình kỹ thuật số, bao gồm cả hệ thống cáp kỹ thuật số, vệ tinh, hệ thống mặt đất và hệ thống IPTV. Khung này hoạt động với Khung đầu vào của Android TVkhung Android TV Tuner, cung cấp các API Java được gọi qua ứng dụng TV Input Service (TIS).

Sau đây là các mục tiêu chính của CAS truyền thông.

  • Cung cấp API Java công khai và khung trình bổ trợ gốc mà các nhà phát triển bên thứ ba và OEM có thể sử dụng để hỗ trợ CAS cho TV truyền hình trong Android.
  • Cung cấp khung CAS trong Android cho phép các OEM của ATV tương tác với nhiều nhà cung cấp CAS một cách nhất quán.
  • Hỗ trợ nhiều nhà cung cấp CAS bên thứ ba bằng cách sử dụng trình bổ trợ gốc. Các trình bổ trợ CAS có thể sử dụng các giao thức mạng dành riêng cho nhà cung cấp, định dạng thông báo quản lý quyền (EMM)/thông báo kiểm soát quyền (ECM) và trình giải mã.
  • Hỗ trợ bảo mật phần cứng, chẳng hạn như thang chìa khoá.
  • Hỗ trợ các môi trường thực thi (TEE) đáng tin cậy như TrustZone.

Cấu hình được hỗ trợ

Cấu hình Bộ dò tìm phần cứng

Nếu phần cứng chịu trách nhiệm phân kênh và mô tả luồng truyền tải MPEG, thì Khung điều chỉnh sẽ cung cấp dữ liệu thông tin cụ thể theo chương trình (PSI) truy cập có điều kiện cho ứng dụng TIS để giao tiếp với bộ điều chỉnh TV dựa trên phần cứng.

Dữ liệu PSI truy cập có điều kiện bao gồm mã mô tả CA, ECM và EMM. Các cấu trúc này cho phép trình bổ trợ CAS lấy các khoá cần thiết để giải mã luồng nội dung.

Sơ đồ cấu hình Bộ điều chỉnh phần cứng.

Hình 1. Cấu hình bộ dò phần cứng

Cấu hình phần cứng có thể có một lớp TEE, chẳng hạn như TrustZone, được minh hoạ trong Hình 1. Nếu không có lớp TEE, thì trình bổ trợ ứng dụng CAS có thể giao tiếp với các dịch vụ thang khoá phần cứng do nền tảng cung cấp. Do các biến thể dành riêng cho từng nhà cung cấp của các giao diện này, nên CAS nội dung đa phương tiện không chuẩn hoá các biến thể đó.

Cấu hình phần mềm

Trước Android 11, khung CAS của nội dung đa phương tiện vẫn có thể được dùng để xử lý nội dung dựa trên phần mềm, chẳng hạn như IPTV qua chế độ phát đa hướng/unicast (unicast). Ứng dụng TIS chịu trách nhiệm tạo bản sao và cấp phát đúng cách đối tượng Java Media CAS.

Ứng dụng có thể sử dụng MediaExtractor hoặc các trình phân tích cú pháp MPEG2-TS khác để trích xuất dữ liệu PSI liên quan đến CA, chẳng hạn như bộ mô tả CA, ECM và EMM. Nếu sử dụng khung MediaExtractor, ứng dụng có thể uỷ quyền hoạt động quản lý phiên CAS (chẳng hạn như mở một phiên và xử lý EMM/ECM) cho MediaExtractor khung. Sau đó, MediaExtractor sẽ trực tiếp định cấu hình phiên CAS bằng API gốc.

Nếu không, ứng dụng sẽ chịu trách nhiệm trích xuất dữ liệu PSI liên quan đến CA và định cấu hình phiên CAS bằng cách sử dụng Media CAS Java API (ví dụ: khi ứng dụng sử dụng trình phân tích cú pháp MPEG2-TS của riêng mình).

Sơ đồ cấu hình Bộ dò.

Hình 2. Đầu vào IPTV, CAS và cấu hình giải mã bằng khung MediaExtractor

Trong trường hợp trình trích xuất phần mềm, trình trích xuất yêu cầu một đối tượng trình giải mã dựa trên phần cứng hoặc phần mềm cho mỗi kênh bị xáo trộn, bất kể kênh đó có gọi bộ giải mã bảo mật hay không. Điều này là do những lý do sau.

  • Nếu bản nhạc không yêu cầu giải mã bảo mật, trình trích xuất sẽ giải mã đơn vị truy cập để xoá bộ đệm và trích xuất các mẫu như thể từ một luồng rõ ràng. Bằng cách này, MediaCodec không cần tham gia vào quá trình giải mã.
  • Nếu bản nhạc yêu cầu giải mã an toàn, thì trình trích xuất vẫn có thể cần một bộ giải mã. Điều này xảy ra khi luồng truyền tải bị xáo trộn ở cấp gói truyền tải, trong đó tiêu đề luồng cơ bản đóng gói (PES) bị xáo trộn. Trình trích xuất cần truy cập vào tiêu đề PES để truyền một số thông tin nhất định (ví dụ: dấu thời gian trình bày).

    Trình giải mã không được trình trích xuất sử dụng nếu luồng truyền tải được xáo trộn ở cấp gói PES, trong đó tiêu đề PES vẫn còn rõ ràng. Tuy nhiên, không thể xác nhận thời điểm xáo trộn xảy ra cho đến khi gói dữ liệu xáo trộn thực sự đến. Để đơn giản, giả sử bạn sử dụng bộ giải mã nếu kênh được xác định là đã được mã hoá dựa trên bảng ánh xạ chương trình (PMT).

Các hạn chế của cấu hình phần mềm

Khi bản nhạc yêu cầu giải mã an toàn, bộ giải mã cần thận trọng khi cho phép thao tác giải mã vào vùng đệm rõ ràng. Vì cần phải giải mã âm thanh không an toàn, nên nếu giải mã video yêu cầu bộ giải mã an toàn, thì video phải được xáo trộn trên một phiên khác với âm thanh. ECM cho phiên này phải báo hiệu cho trình bổ trợ biết rằng cần phải có bộ giải mã bảo mật.

Ngoài ra, trình bổ trợ phải có khả năng liên kết một khoá với chính sách bảo mật một cách đáng tin cậy. Nếu không, ứng dụng có thể dễ dàng lấy khung hình video bằng trình giải mã âm thanh.

Ngay cả khi phiên yêu cầu bộ giải mã bảo mật, phiên đó có thể được yêu cầu xuất một lượng nhỏ dữ liệu để bộ trích xuất xoá bộ đệm nhằm xử lý tiêu đề PES. Để ngăn ứng dụng độc hại khiến trình bổ trợ trả về toàn bộ đơn vị truy cập, trình bổ trợ cần phân tích cú pháp tải trọng truyền tải để đảm bảo tải trọng bắt đầu bằng tiêu đề PES của loại luồng thích hợp. Nếu không, trình bổ trợ sẽ từ chối yêu cầu.

Trình tự điều chỉnh CA

Khi điều chỉnh sang một kênh mới, mô-đun TIS sẽ đăng ký nhận các chỉ số mô tả CA, ECM và EMM từ khung Trình điều chỉnh PSI. Một phần mô tả CA chứa mã hệ thống CA. Mã này xác định duy nhất một nhà cung cấp CA cụ thể và dữ liệu khác dành riêng cho nhà cung cấp. TIS truy vấn Media CAS để xác định xem có trình bổ trợ CAS nào có thể xử lý phần mô tả CA hay không.

Sơ đồ điều chỉnh nội dung CAS.

Hình 3. Điều chỉnh nội dung CAS

Nếu mã hệ thống CA được hỗ trợ, một thực thể của Media CAS sẽ được tạo và dữ liệu riêng tư của nhà cung cấp từ chỉ số mô tả CA sẽ được cung cấp cho trình bổ trợ. Sau đó, các phiên mới sẽ được mở trong Media CAS để xử lý luồng âm thanh và video. Các phiên mới mở sẽ nhận được ECM và EMM cho trình bổ trợ.

Quy trình trình bổ trợ CAS mẫu

TIS phân phối ECM cho trình bổ trợ CAS bằng cách sử dụng Media CAS API. ECM chứa từ điều khiển đã mã hoá, cần được giải mã bằng thông tin từ EMM. Trình bổ trợ CAS xác định cách lấy EMM cho tài sản dựa trên thông tin cụ thể về nhà cung cấp trong phần mô tả CA do phương thức setPrivateData() cung cấp.

EMM có thể được phân phối trong băng thông trong luồng nội dung hoặc ngoài băng thông bằng cách sử dụng yêu cầu mạng do trình bổ trợ CA khởi tạo. TIS sử dụng phương thức processEMM() để phân phối mọi EMM trong băng thông cho trình bổ trợ CA.

Nếu cần có yêu cầu mạng để có được EMM, thì trình bổ trợ CA sẽ chịu trách nhiệm thực hiện giao dịch mạng với máy chủ cấp phép.

Sơ đồ về một CAS mẫu.

Hình 4. Ví dụ về trình bổ trợ CAS cho quá trình xử lý EMM và ECM

Khi nhận được EMM, trình bổ trợ CA sẽ phân tích cú pháp trình bổ trợ này để lấy khoá đã mã hoá nhằm giải mã từ điều khiển. Khoá EMM đã mã hoá và từ điều khiển đã mã hoá có thể được tải vào một thang khoá hoặc môi trường đáng tin cậy để thực hiện quá trình giải mã từ điều khiển và sau đó mô tả luồng nội dung.

API Java CAS truyền thông

API Java Media CAS chứa các phương thức sau.

  • Liệt kê tất cả các trình bổ trợ CA có sẵn trên thiết bị.

    class MediaCas.PluginDescriptor {
      public String getName();
      public int getSystemId();
    }
    static PluginDescriptor[] enumeratePlugins();
    
  • Tạo một thực thể Media CAS cho hệ thống CA được chỉ định. Tức là khung CAS của nội dung đa phương tiện có thể xử lý đồng thời nhiều hệ thống CAS.

    MediaCas(int CA_system_id);
    MediaCas(@NonNull Context context, int casSystemId,
             @Nullable String tvInputServiceSessionId,
             @PriorityHintUseCaseType int priorityHint);
    
  • Đăng ký trình nghe sự kiện và cho phép ứng dụng chỉ định một trình xử lý có sử dụng trình lặp.

    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);
    
  • Gửi dữ liệu riêng tư cho hệ thống CA. Dữ liệu riêng tư có thể đến từ chỉ số mô tả CA, bảng truy cập có điều kiện hoặc các nguồn ngoài dải. Dữ liệu này không liên quan đến một phiên cụ thể.

    void setPrivateData(@NonNull byte[] data);
    
  • Xử lý gói EMM.

    void processEmm(@NonNull byte[] data, int offset, int length);
    
  • Gửi một sự kiện đến hệ thống CA. Định dạng của sự kiện là dành riêng cho lược đồ và không rõ ràng đối với khung.

    void sendEvent(int event, int arg, @Nullable byte[] data);
    
  • Bắt đầu thao tác cấp phép thuộc loại đã chỉ định cho hệ thống CA. Khi đăng ký dịch vụ truyền hình có trả phí lần đầu tiên, thiết bị cần được cấp phép cho máy chủ CAS trước tiên. Cung cấp một tập hợp các tham số liên quan cho thiết bị để cấp phép.

    void provision(String provisionString);
    
  • Kích hoạt làm mới các quyền. Khi người dùng đăng ký một kênh mới (ví dụ: bằng cách phản hồi quảng cáo hoặc thêm kênh vào hướng dẫn chương trình điện tử (EPG)), ứng dụng sẽ có thể yêu cầu ứng dụng khách CA làm mới khoá quyền.

    void refreshEntitlements(int refreshType);
    
  • Đóng đối tượng Media CAS.

    void close();
    
  • Mở một phiên.

    Session openSession();
    Session openSession(@SessionUsage int sessionUsage, @ScramblingMode int scramblingMode);
    
  • Đóng phiên đã mở trước đó.

    void Session#close();
    
  • Cung cấp dữ liệu riêng tư của CA từ một chỉ số mô tả CA trong PMT, có thể là từ phần thông tin chương trình hoặc phần thông tin ES, cho một phiên CAS.

    void Session#setPrivateData(@NonNull byte[] sessionId, @NonNull byte[] data);
    
  • Xử lý gói ECM cho một phiên.

    void Session#processEcm(@NonNull byte[] data, int offset, int length);
    
  • Lấy mã phiên.

    byte[] Session#getSessionId();
    
  • Gửi một sự kiện phiên đến hệ thống CA. Định dạng của sự kiện là dành riêng cho lược đồ và không rõ ràng đối với khung.

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