Dokumen ini memberikan ikhtisar kerangka pengelolaan hak digital (DRM) Android dan memperkenalkan antarmuka yang harus diimplementasikan oleh plugin DRM. Dokumen ini tidak menjelaskan aturan ketahanan atau aturan kepatuhan yang mungkin ditentukan oleh skema DRM.
Kerangka
Platform Android menyediakan kerangka kerja DRM yang dapat diperluas yang memungkinkan aplikasi mengelola konten yang dilindungi haknya sesuai dengan batasan lisensi yang terkait dengan konten tersebut. Kerangka kerja DRM mendukung banyak skema DRM; skema DRM mana yang didukung perangkat bergantung pada produsen perangkat. Kerangka kerja DRM menyediakan antarmuka terpadu untuk pengembang aplikasi dan menyembunyikan kompleksitas operasi DRM. Kerangka kerja DRM menyediakan mode operasi yang konsisten untuk konten yang dilindungi dan tidak dilindungi. Skema DRM dapat menentukan model penggunaan yang kompleks berdasarkan metadata lisensi. Kerangka kerja DRM menyediakan hubungan antara konten DRM dan lisensi, serta menangani pengelolaan hak. Hal ini memungkinkan pemutar media diabstraksi dari konten yang dilindungi DRM atau tidak dilindungi. Lihat MediaDrm untuk mengetahui kelas guna mendapatkan kunci untuk mendekripsi aliran media yang dilindungi.
Ketersediaan konten digital yang kaya penting bagi pengguna perangkat seluler. Agar konten mereka tersedia secara luas, pengembang Android dan penerbit konten digital memerlukan penerapan DRM yang konsisten dan didukung di seluruh ekosistem Android. Untuk membuat konten digital tersebut tersedia di perangkat Android dan memastikan setidaknya ada satu DRM konsisten yang tersedia di semua perangkat, Google menyediakan DRM tanpa biaya lisensi pada perangkat Android yang kompatibel. Plugin DRM terintegrasi dengan kerangka DRM Android dan dapat menggunakan perlindungan yang didukung perangkat keras untuk mengamankan konten premium dan kredensial pengguna.
Perlindungan konten yang disediakan oleh plugin DRM bergantung pada keamanan dan kemampuan perlindungan konten dari platform perangkat keras yang mendasarinya. Kemampuan perangkat keras perangkat harus mencakup boot aman perangkat keras untuk membangun rantai kepercayaan terhadap keamanan dan perlindungan kunci kriptografi. Kemampuan perlindungan konten pada perangkat harus mencakup perlindungan bingkai yang didekripsi di perangkat dan perlindungan konten melalui mekanisme perlindungan keluaran yang tepercaya. Tidak semua platform perangkat keras mendukung semua fitur keamanan dan perlindungan konten di atas. Keamanan tidak pernah diterapkan di satu tempat dalam tumpukan, namun bergantung pada integrasi perangkat keras, perangkat lunak, dan layanan. Kombinasi fungsi keamanan perangkat keras, mekanisme boot tepercaya, dan OS aman yang terisolasi untuk menangani fungsi keamanan sangat penting untuk menyediakan perangkat yang aman.
Arsitektur
Kerangka kerja DRM dirancang untuk bersifat agnostik implementasi dan mengabstraksi rincian implementasi skema DRM spesifik dalam plugin DRM spesifik skema. Kerangka kerja DRM mencakup API sederhana untuk menangani operasi DRM yang kompleks, memperoleh lisensi, menyediakan perangkat, mengaitkan konten DRM dan lisensinya, dan akhirnya mendekripsi konten DRM.
Kerangka kerja Android DRM diimplementasikan dalam dua lapisan arsitektur:
- API kerangka DRM, yang diekspos ke aplikasi melalui kerangka aplikasi Android.
- Kerangka kerja DRM kode asli, yang memperlihatkan antarmuka untuk plugin DRM (agen) untuk menangani manajemen hak dan dekripsi untuk berbagai skema DRM.
Lihat Android Media DRM dan Android Media Crypto untuk detail selengkapnya.
Plugin DRM
Saat startup sistem, kerangka DRM memindai instans/layanan HAL (dijelaskan dalam file .rc
) dan plugin ditemukan. Media DRM Server ( mediadrmserver
) membuat objek CryptoHal
dan DrmHal
. CryptoHal
dan DrmHal
kemudian memanggil plugin dengan implementasi khusus vendor.
Plugin harus mengimplementasikan HAL yang terikat. HAL yang dibinder menggunakan Android Interface Definition Language (AIDL) , yang memungkinkan penggantian framework tanpa harus membuat ulang HAL.
Plugin dibuat oleh vendor atau pembuat SOC dan ditempatkan di partisi /vendor
pada perangkat. Semua perangkat yang diluncurkan dengan Android 13 atau lebih tinggi harus mendukung HAL terbinder yang ditulis dalam bahasa AIDL.
Penerapan
Rilis perangkat GMS dan AOSP untuk Android 13 harus menggunakan antarmuka AIDL.
Untuk mengimplementasikan API kerangka kerja DRM baru dengan sebuah plugin:
- Tambahkan layanan plugin ke file build perangkat.
- Perbarui manifes perangkat.
- Tambahkan izin SELinux.
- Buat file
.rc
di bawah/vendor
. - Terapkan pluginnya.
API ditentukan di setiap versi IDrmPlugin.aidl
, ICryptoPlugin.aidl
, IDrmFactory.aidl
, dan ICryptoFactory.aidl
aidl/PLATFORM_ROOT/hardware/interfaces/drm/
Tambahkan layanan plugin ke file pembuatan perangkat
Misalnya, untuk menambahkan dukungan antarmuka AIDL, file VENDOR DEVICE /device.mk
harus menyertakan paket android.hardware.drm-service.*
:
PRODUCT_PACKAGES += \ android.hardware.drm-service.clearkey \ android.hardware.drm-service.widevine
Perbarui manifes perangkat
File vendor manifest.xml
untuk perangkat harus menyertakan entri berikut:
<hal format="aidl"> <name>android.hardware.drm</name> <version>STABLE AIDL VERSION</version> <fqname>ICryptoFactory/clearkey</fqname> <fqname>IDrmFactory/clearkey</fqname> <fqname>ICryptoFactory/widevine</fqname> <fqname>IDrmFactory/widevine</fqname> </hal>
VERSI AIDL STABIL adalah nomor versi setiap rilis API AIDL (misalnya 1, 2). Sebagai alternatif, kami merekomendasikan penggunaan vintf_fragments.
Tambahkan izin SELinux
- Tambahkan ke
VENDOR DEVICE /sepolicy/vendor/file.te
type mediadrm_vendor_data_file, file_type, data_file_type;
- Tambahkan ke
VENDOR DEVICE /sepolicy/vendor/file_contexts
/vendor/bin/hw/android\.hardware\.drm-service\.clearkey u:object_r:hal_drm_clearkey_exec:s0
/data/vendor/mediadrm(/.*)? u:object_r:mediadrm_vendor_data_file:s0 - Tambahkan ke
device/sepolicy/vendor/hal_drm_clearkey.te
vndbinder_use(hal_drm_clearkey) allow hal_drm_clearkey servicemanager:binder { call transfer }; allow hal_drm_clearkey hal_drm_service:service_manager add; allow hal_drm_clearkey { appdomain -isolated_app }:fd use; get_prop(ramdump, public_vendor_default_prop)
Buat file RC di bawah /vendor
File .rc
menentukan tindakan yang harus diambil saat layanan diluncurkan.
Lihat Bahasa Init Android untuk detailnya.
Terapkan pluginnya
- Implementasikan titik masuk
main()
diservice.cpp
dari layanan plugin. - Terapkan
ICryptoPlugin
,IDrmPlugin
,ICryptoFactory
, danIDrmFactory
. - Terapkan API baru di plugin.
Detail plugin DRM
Vendor plugin DRM mengimplementasikan plugin DrmFactory
, CryptoFactory
, dan DRM.
Pabrik Drm
Kelas DrmHal
mencari layanan plugin DRM terdaftar dan membuat plugin terkait yang mendukung skema kripto tertentu melalui kelas DrmFactory
.
IDrmFactory adalah titik masuk utama untuk berinteraksi dengan drm HAL vendor melalui API createPlugin. API createPlugin digunakan untuk membuat instance IDrmPlugin.
::ndk::ScopedAStatus getSupportedCryptoSchemes( std::vector<::aidl::android::hardware::drm::Uuid>* _aidl_return);
getSupportedCryptoSchemes mengembalikan daftar skema kripto yang didukung untuk instans AIDL drm HAL.
::ndk::ScopedAStatus isCryptoSchemeSupported( const ::aidl::android::hardware::drm::Uuid& in_uuid, const std::string& in_mimeType, ::aidl::android::hardware::drm::SecurityLevel in_securityLevel, bool* _aidl_return);
Menentukan apakah pabrik plugin dapat membuat plugin DRM yang mendukung skema kripto tertentu, yang ditentukan oleh UUID.
::ndk::ScopedAStatus isContentTypeSupported(const std::string& in_mimeType, bool* _aidl_return);
Menentukan apakah pabrik plugin dapat membuat plugin DRM yang mendukung format wadah media tertentu yang ditentukan oleh mimeType
.
::ndk::ScopedAStatus createPlugin( const ::aidl::android::hardware::drm::Uuid& in_uuid, const std::string& in_appPackageName, std::shared_ptr<::aidl::android::hardware::drm::IDrmPlugin>* _aidl_return);
Membuat plugin DRM untuk skema kripto yang ditentukan oleh UUID.
Pabrik Kripto
Kelas CryptoHal
mencari layanan plugin DRM terdaftar dan membuat plugin terkait yang mendukung skema kripto tertentu melalui kelas CryptoFactory
.
::ndk::ScopedAStatus isCryptoSchemeSupported( const ::aidl::android::hardware::drm::Uuid& in_uuid, bool* _aidl_return);
Menentukan apakah pabrik kripto dapat membuat plugin kripto yang mendukung skema kripto tertentu, yang ditentukan oleh UUID.
::ndk::ScopedAStatus createPlugin( const ::aidl::android::hardware::drm::Uuid& in_uuid, const std::vector<uint8_t>& in_initData, std::shared_ptr<::aidl::android::hardware::drm::ICryptoPlugin>* _aidl_return);
Menentukan apakah pabrik plugin dapat membuat plugin kripto yang mendukung skema kripto tertentu, yang ditentukan oleh UUID.
API plugin DRM
API didefinisikan dalamhardware/interfaces/drm/aidl/aidl_api/android.hardware.drm/ VERSION /android/hardware/drm/IDrmPlugin.aidl
. File IDrmPlugin.h
yang sesuai dapat ditemukan di out/Segera setelah build.