Khung hệ thống truy cập có điều kiện cho nội dung nghe nhìn (Media CAS) cung cấp các API tiêu chuẩn để bật 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 truyền hình cáp kỹ thuật số, vệ tinh, truyền hình số mặt đất và IPTV. Khung này hoạt động với khung Android TV Input và khung Android TV Tuner, cung cấp các API Java được gọi từ ứng dụng TV Input Service (TIS).
Sau đây là các mục tiêu chính của Media CAS.
- Cung cấp một 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 truyền hình phát sóng trên Android.
- Cung cấp một khung CAS trong Android cho phép các OEM ATV tương tác với nhiều nhà cung cấp CAS theo 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 các trình bổ trợ gốc. Các trình bổ trợ CAS có thể sử dụng 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à bộ giải mã.
- Hỗ trợ bảo mật phần cứng, chẳng hạn như thang khoá.
- Hỗ trợ 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ộ dò tín hiệu phần cứng
Nếu phần cứng chịu trách nhiệm giải mã và tách 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 bộ chỉnh TV dựa trên phần cứng.
Dữ liệu PSI về quyền truy cập có điều kiện bao gồm các bộ 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.
Hình 1. Cấu hình Bộ dò tín hiệu 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, như minh hoạ trong Hình 1. Nếu không có lớp TEE, một trình bổ trợ ứng dụng CAS có thể giao tiếp với các dịch vụ bậc khoá phần cứng do nền tảng cung cấp. Do các biến thể dành riêng cho nhà cung cấp của những giao diện này, Media CAS không chuẩn hoá chúng.
Cấu hình phần mềm
Trước Android 11, bạn vẫn có thể dùng khung Media CAS để xử lý nội dung dựa trên phần mềm, chẳng hạn như IPTV từ truyền hình đa phương thức/đơn phương thức qua IP. Ứng dụng TIS chịu trách nhiệm khởi tạo và cung cấp đúng cách đố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ư các bộ mô tả CA, ECM và EMM. Nếu ứng dụng dùng MediaExtractor của khung, thì ứng dụng có thể uỷ quyền quản lý phiên CAS (chẳng hạn như mở một phiên và xử lý EMM/ECM) cho MediaExtractor của khung. Sau đó, MediaExtractor sẽ định cấu hình phiên CAS bằng cách sử dụng trực tiếp 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 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).
Hình 2. Cấu hình đầu vào IPTV, CAS và bộ giải mã bằng MediaExtractor của khung
Trong trường hợp bộ trích xuất phần mềm, bộ 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 từng bản nhạc bị xáo trộn, bất kể bản nhạc có yêu cầu 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ã an toàn, trình trích xuất sẽ giải mã đơn vị truy cập để xoá các vùng đệ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 được đó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 (ví dụ: dấu thời gian trình chiếu).
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 bị xáo trộn ở cấp gói PES, trong đó tiêu đề PES vẫn rõ ràng. Tuy nhiên, bạn không thể xác nhận thời điểm xảy ra quá trình xáo trộn cho đến khi gói dữ liệu thực tế đã xáo trộn đến. Để đơn giản, hãy giả định rằng một bộ giải mã được dùng nếu bản nhạc được xác định là bị xáo trộn dựa trên bảng ánh xạ chương trình (PMT).
Hạn chế về 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 một thao tác giải mã vào các vùng đệm rõ ràng. Vì cần có tính năng giải mã âm thanh không an toàn, nên nếu tính năng giải mã video yêu cầu bộ giải mã an toàn, thì video đó phải được xáo trộn trong một phiên khác với âm thanh. ECM cho phiên phải báo hiệu cho trình bổ trợ rằng cần có bộ giải mã an toàn.
Ngoài ra, trình bổ trợ phải có khả năng liên kết một cách đáng tin cậy một khoá với chính sách bảo mật của khoá đó. 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 một bộ giải mã an toàn, phiên đó có thể được yêu cầu xuất một lượng nhỏ dữ liệu để xoá 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 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 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, trình bổ trợ sẽ từ chối yêu cầu.
Trình tự điều chỉnh CA
Khi dò đài sang một kênh mới, mô-đun TIS sẽ đăng ký nhận các bộ mô tả CA, ECM và EMM từ khung PSI Tuner. Một bộ mô tả CA chứa mã nhận dạng hệ thống CA, mã này xác định duy nhất một nhà cung cấp CA cụ thể và các 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ý bộ mô tả CA hay không.
Hình 3. Điều chỉnh nội dung CAS
Nếu mã nhận dạng hệ thống CA được hỗ trợ, 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 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ợ.
Luồng trình bổ trợ CAS mẫu
TIS gửi ECM đến trình bổ trợ CAS bằng cách sử dụng API CAS nội dung nghe nhìn. ECM chứa từ kiểm soát đã 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 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 trong luồng nội dung hoặc ngoài luồng nội dung 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()
để gửi mọi EMM trong băng tần đến trình bổ trợ CA.
Nếu cần có yêu cầu mạng để lấy 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ột máy chủ cấp phép.
Hình 4. Ví dụ về trình bổ trợ CAS để xử lý EMM và ECM
Khi nhận được EMM, trình bổ trợ CA sẽ phân tích cú pháp EMM đó để lấy khoá đã mã hoá nhằm giải mã từ điều khiển. Khoá EMM được mã hoá và từ kiểm soát được 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 quy trình giải mã từ kiểm soát và quy trình giải mã tiếp theo của luồng nội dung.
Media CAS Java API
Media CAS Java API có 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 đã 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ý một trình nghe sự kiện và cho phép ứng dụng chỉ định một trình xử lý mà looper của trình xử lý đó được 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 các nguồn ngoài băng tần. Điều này không liên quan đến một phiên cụ thể.
void setPrivateData(@NonNull byte[] data);
Xử lý một 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 này 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);
Khởi tạo một thao tác cung cấp thuộc loại được chỉ định cho hệ thống CA. Khi đăng ký dịch vụ truyền hình trả phí lần đầu tiên, thiết bị cần được cấp phép trước cho máy chủ CAS. 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 việc 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 một quảng cáo hoặc bằng cách thêm một kênh vào hướng dẫn chương trình điện tử (EPG)), ứng dụng phải có thể yêu cầu các ứng dụng 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 một phiên đã mở trước đó.
void Session#close();
Cung cấp dữ liệu riêng tư của CA từ một bộ mô tả CA trong PMT (có thể là từ phần thông tin chương trình hoặc thông tin ES) cho một phiên CAS.
void Session#setPrivateData(@NonNull byte[] sessionId, @NonNull byte[] data);
Xử lý một 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 này dành riêng cho giản đồ và không rõ ràng đối với khung.
void Session#sendSessionEvent(int event, int arg, @Nullable byte[] data);