DRM

Ikon Android DRM HAL

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.

Android DRM HAL
Gambar 1a. Lapisan abstraksi perangkat keras DRM sebelum Android 11
Android DRM HAL posting R
Gambar 1b. Lapisan abstraksi perangkat keras DRM dimulai di Android 11

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.
Kerangka DRM Android
Gambar 2a. Kerangka kerja DRM sebelum Android 11
Kerangka DRM Android
Gambar 2b. Kerangka kerja DRM dimulai di Android 11

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:

  1. Tambahkan layanan plugin ke file build perangkat.
  2. Perbarui manifes perangkat.
  3. Tambahkan izin SELinux.
  4. Buat file .rc di bawah /vendor .
  5. 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

  1. Tambahkan ke VENDOR DEVICE /sepolicy/vendor/file.te
    type mediadrm_vendor_data_file, file_type, data_file_type;
  2. 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
  3. 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

  1. Implementasikan titik masuk main() di service.cpp dari layanan plugin.
  2. Terapkan ICryptoPlugin , IDrmPlugin , ICryptoFactory , dan IDrmFactory .
  3. 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 dalam hardware/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.