Khung CAS

Khung Hệ thống truy cập có điều kiện đa phương tiện (Media CAS) cung cấp các API tiêu chuẩn để kích hoạt các dịch vụ truy cập có điều kiện (CA) trên nhiều phần cứng TV kỹ thuật số, bao gồm 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 Android TVkhung Android TV Tuner , cung cấp các API Java được gọi từ ứng dụng Dịch vụ đầu vào TV (TIS).

Các mục tiêu chính của Media CAS như sau.

  • Cung cấp API Java công khai và khung plugin 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 truyền hình phát sóng 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 plugin gốc. Phần 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 như thang chính.
  • Hỗ trợ các môi trường thực thi đáng tin cậy (TEE) như TrustZone.

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

Cấu hình bộ điều chỉnh phần cứng

Nếu phần cứng chịu trách nhiệm phân kênh và giải xáo trộn luồng truyền tải MPEG, thì khung Tuner sẽ cung cấp dữ liệu thông tin dành riêng cho chương trình (PSI) truy cập có điều kiện cho ứng dụng TIS để giao tiếp với các 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 bộ mô tả CA, ECM và EMM. Các cấu trúc này cho phép plugin CAS lấy các khóa cần thiết để giải mã luồng nội dung.

Sơ đồ cấu hình phần cứng Tuner.

Hình 1. Cấu hình bộ điều chỉnh phần cứng

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

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

Trước Android 11, khung Media CAS vẫn có thể được sử dụng để xử lý nội dung dựa trên phần mềm, chẳng hạn như IPTV từ IP multicast/unicast. Ứng dụng TIS chịu trách nhiệm khởi tạo và cung cấp đúng đối tượng Media CAS Java.

Ứ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 ứng dụng sử dụng khung MediaExtractor, thì ứng dụng đó có thể ủy quyền quản lý phiên CAS, chẳng hạn như mở phiên và xử lý EMM/ECM, cho khung MediaExtractor. Sau đó, MediaExtractor sẽ định cấu hình phiên CAS bằng API gốc trực tiếp.

Mặt khác, ứng dụng 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 API Media CAS Java (ví dụ: khi ứng dụng sử dụng trình phân tích cú pháp MPEG2-TS của riêng nó).

Sơ đồ cấu hình Tuner.

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

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

  • Nếu bản nhạc không yêu cầu giải mã an toàn, trình trích xuất sẽ giải xáo trộn thiết bị truy cập để xóa 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 phải tham gia vào việc giải mã.
  • Nếu bản nhạc yêu cầu giải mã an toàn thì bộ giải mã có thể vẫn cần 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ơ sở được đóng gói (PES) được xáo trộn. Trình trích xuất cần truy cập tiêu đề PES để tải xuống một số thông tin nhất định (ví dụ: dấu thời gian trình bày).

    Bộ giải mã không được sử dụng bởi bộ giải nén nếu luồng truyền tải được xáo trộn ở cấp độ gói PES, trong đó tiêu đề PES được để trố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 được xáo trộn thực sự đến. Để đơn giản, giả sử sử dụng bộ giải xáo trộn nếu rãnh được xác định là được mã hóa dựa trên bảng ánh xạ chương trình (PMT).

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

Khi rãnh ghi yêu cầu giải mã an toàn, bộ giải xáo trộn cần phải thận trọng khi cho phép thao tác giải xáo trộn vào các bộ đệm trố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ì nó phải được xáo trộn trên một phiên khác với âm thanh. ECM cho phiên phải báo hiệu cho plugin rằng cần có bộ giải mã an toàn.

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

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

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

Khi điều chỉnh sang kênh mới, mô-đun TIS đăng ký để nhận các bộ mô tả CA, ECM và EMM từ khung Bộ điều chỉnh PSI. Bộ mô tả CA chứa ID hệ thống CA, xác định duy nhất một nhà cung cấp CA cụ thể và dữ liệu dành riêng cho nhà cung cấp khác. TIS truy vấn Media CAS để xác định xem có tồn tại plugin CAS có thể xử lý bộ 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 ID hệ thống CA được hỗ trợ thì một phiên bản của Media CAS sẽ được tạo và dữ liệu riêng tư của nhà cung cấp từ bộ mô tả CA sẽ được cung cấp cho plugin. Sau đó, các phiên mới đượ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 plugin.

Luồng bổ trợ CAS mẫu

TIS cung cấp ECM cho plugin CAS bằng API Media CAS. ECM chứa từ điều khiển được mã hóa, từ này cần được giải mã bằng thông tin từ EMM. Plugin CAS xác định cách lấy EMM cho nội dung dựa trên thông tin dành riêng cho nhà cung cấp trong bộ mô tả CA do phương thức setPrivateData() cung cấp.

EMM có thể được phân phối theo băng tần trong luồng nội dung hoặc ngoài băng tần bằng cách sử dụng yêu cầu mạng do plugin CA khởi tạo. TIS sử dụng phương thức processEMM() để phân phối bất kỳ EMM nào trong băng tần tới plugin CA.

Nếu cần có yêu cầu mạng để có được EMM, plugin CA 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ơ đồ của một ví dụ CAS.

Hình 4. Ví dụ về plugin CAS để xử lý EMM và ECM

Khi nhận được EMM, plugin CA sẽ phân tích nó để lấy khóa được mã hóa nhằm giải mã từ điều khiển. Khóa EMM được mã hóa và từ điều khiển được mã hóa có thể được tải vào thang khóa hoặc môi trường đáng tin cậy để thực hiện giải mã từ điều khiển và giải xáo trộn luồng nội dung sau đó.

API Java CAS phương tiện

API Java CAS của phương tiện chứa các phương thức sau.

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

    class MediaCas.PluginDescriptor {
      public String getName();
      public int getSystemId();
    }
    static PluginDescriptor[] enumeratePlugins();
    
  • Xây dựng một phiên bản Media CAS cho hệ thống CA được chỉ định. Điều này có nghĩa là khung Media CAS 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 xử lý sự kiện và cho phép ứng dụng chỉ định trình xử lý có vòng lặp được sử dụng.

    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ừ bộ mô tả CA, bảng truy cập có điều kiện hoặc ngoài nguồn băng tần. Điều này không được liên kết với 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 sự kiện đến hệ thống CA. Định dạng của sự kiện dành riêng cho sơ đồ và không rõ ràng đối với khung.

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

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

    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 một phiên đã mở trước đó.

    void Session#close();
    
  • Cung cấp dữ liệu riêng của CA từ bộ mô tả CA trong PMT, có thể từ phần thông tin chương trình hoặc thông tin ES, đến 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 ID phiên.

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

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