Khung hệ thống truy cập có điều kiện của nội dung nghe nhìn (Media CAS) cung cấp các API tiêu chuẩn để bật các dịch vụ truy cập có điều kiện (CA) trên một loạt phần cứng TV 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 mặt đất và hệ thống IPTV. Khung này hoạt động với khung Đầu vào Android TV và khung Bộ điều chỉnh Android TV, 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 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 nhà sản xuất thiết bị gốc (OEM) 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. 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à 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ìm phần cứng
Nếu phần cứng chịu trách nhiệm giải mã và giải mã luồng truyền MPEG, thì Khung bộ thu sẽ cung cấp dữ liệu thông tin cụ thể về chương trình truy cập có điều kiện (PSI) cho ứng dụng TIS để giao tiếp với bộ thu 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 nội dung 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ìm 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, 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 giao diện này có nhiều biến thể tuỳ theo nhà cung cấp, nên Media CAS không chuẩn hoá các giao diện này.
Cấu hình phần mềm
Trước Android 11, bạn vẫn có thể sử 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ừ IP đa điểm/đơn điểm. Ứ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ư nội dung mô tả CA, ECM và EMM. Nếu ứng dụng sử dụng khung MediaExtractor, thì ứng dụng đó có thể uỷ quyền cho khung MediaExtractor quản lý phiên CAS, chẳng hạn như mở phiên và xử lý EMM/ECM. 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 API Java Media CAS (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 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 giải mã dựa trên phần mềm hoặc phần cứng cho mỗi bản nhạc bị xáo trộn, bất kể bản nhạc có gọi trình 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ã bảo mật, 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 truyền tải cơ bản (PES) được đóng gói 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 bị xáo trộn ở cấp gói PES, trong đó tiêu đề PES được để trống. Tuy nhiên, bạn không thể xác nhận thời điểm xáo trộn xảy ra cho đến khi gói xáo trộn thực tế đế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).
Giới hạn 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 trình giải mã bảo mật, 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 phải báo hiệu cho trình bổ trợ rằng cần 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 bộ 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. Trình mô tả CA chứa mã nhận dạng hệ thống CA, giúp 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ý phần mô tả CA hay không.
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 mẫu của trình bổ trợ CAS
TIS phân phối ECM cho trình bổ trợ CAS bằng cách sử dụng API Media CAS. 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 thu nạp EMM cho tài sản dựa trên thông tin dành riêng cho nhà cung cấp trong chỉ số 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 để 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á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 đã 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 việc giải mã từ điều khiển và giải mã luồng nội dung tiếp theo.
Media CAS Java API
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. Điều này có nghĩa là khung Media CAS có thể xử lý nhiều hệ thống CAS cùng một lúc.
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ừ 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. Giá trị này không 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 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 một thao tác cấp phép thuộc loại đã 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, trước tiên, thiết bị đó cần được cấp phép 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 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 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);