DRM

Ikon Android DRM HAL

Dokumen ini memberikan ringkasan framework manajemen hak digital (DRM) Android dan memperkenalkan antarmuka yang harus diterapkan plugin DRM. Dokumen ini tidak menjelaskan aturan keandalan atau aturan kepatuhan yang dapat ditentukan oleh skema DRM.

Kerangka kerja

Platform Android menyediakan framework DRM yang dapat diperluas yang memungkinkan aplikasi mengelola konten yang dilindungi hak sesuai dengan batasan lisensi yang terkait dengan konten. Framework DRM mendukung banyak skema DRM; skema DRM yang didukung oleh perangkat bergantung pada produsen perangkat. Framework DRM menyediakan antarmuka terpadu untuk developer aplikasi dan menyembunyikan kompleksitas operasi DRM. Framework DRM menyediakan mode operasi yang konsisten untuk konten yang dilindungi dan tidak dilindungi. Skema DRM dapat menentukan model penggunaan yang kompleks berdasarkan metadata lisensi. Framework DRM menyediakan asosiasi antara konten dan lisensi DRM, serta menangani pengelolaan hak. Hal ini memungkinkan pemutar media dipisahkan dari konten yang dilindungi DRM atau tidak dilindungi. Lihat MediaDrm untuk class guna mendapatkan kunci untuk mendekripsi streaming media yang dilindungi.

Android DRM HAL
Gambar 1a. Lapisan abstraksi hardware DRM sebelum Android 11
Android DRM HAL pasca R
Gambar 1b. Lapisan abstraksikan hardware DRM yang dimulai di Android 11

Ketersediaan konten digital yang lengkap penting bagi pengguna di perangkat seluler. Agar konten mereka tersedia secara luas, developer Android dan penayang konten digital memerlukan penerapan DRM yang konsisten dan didukung di seluruh ekosistem Android. Untuk menyediakan konten digital tersebut di perangkat Android dan memastikan bahwa ada setidaknya satu DRM yang konsisten di semua perangkat, Google menyediakan DRM tanpa biaya lisensi di perangkat Android yang kompatibel. Plugin DRM terintegrasi dengan framework DRM Android dan dapat menggunakan perlindungan yang didukung hardware untuk mengamankan konten premium dan kredensial pengguna.

Perlindungan konten yang disediakan oleh plugin DRM bergantung pada keamanan dan kemampuan perlindungan konten dari platform hardware yang mendasarinya. Kemampuan hardware perangkat harus menyertakan booting aman hardware untuk membuat rantai kepercayaan keamanan dan perlindungan kunci kriptografis. Kemampuan perlindungan konten perangkat harus mencakup perlindungan frame yang didekripsi di perangkat dan perlindungan konten melalui mekanisme perlindungan output tepercaya. Tidak semua platform hardware mendukung semua fitur keamanan dan perlindungan konten di atas. Keamanan tidak pernah diterapkan di satu tempat dalam stack, tetapi bergantung pada integrasi hardware, software, dan layanan. Kombinasi fungsi keamanan hardware, mekanisme booting tepercaya, dan OS aman yang terisolasi untuk menangani fungsi keamanan sangat penting untuk menyediakan perangkat yang aman.

Arsitektur

Framework DRM dirancang agar tidak bergantung pada implementasi dan memisahkan detail implementasi skema DRM tertentu dalam plugin DRM khusus skema. Framework DRM menyertakan API sederhana untuk menangani operasi DRM yang kompleks, memperoleh lisensi, menyediakan perangkat, mengaitkan konten DRM dan lisensinya, dan terakhir mendekripsi konten DRM.

Framework DRM Android diterapkan dalam dua lapisan arsitektur:

  • API framework DRM, yang diekspos ke aplikasi melalui framework aplikasi Android.
  • Framework DRM kode native, yang mengekspos antarmuka untuk plugin DRM (agen) guna menangani pengelolaan hak dan dekripsi untuk berbagai skema DRM.
Framework DRM Android
Gambar 2a. Framework DRM sebelum Android 11
Framework DRM Android
Gambar 2b. Framework DRM mulai Android 11

Lihat Android Media DRM dan Android Media Crypto untuk mengetahui detail selengkapnya.

Plugin DRM

Saat memulai sistem, framework DRM akan memindai instance/layanan HAL (dijelaskan dalam file .rc ) dan plugin akan ditemukan. Server DRM Media (mediadrmserver) membuat objek CryptoHal dan DrmHal. CryptoHal dan DrmHal kemudian memanggil plugin dengan implementasi khusus vendor.

Plugin harus menerapkan HAL yang dibinderisasi. HAL yang di-binderkan menggunakan Android Interface Definition Language (AIDL), yang memungkinkan framework diganti tanpa harus mem-build ulang HAL.

Plugin dibuat oleh vendor atau pembuat SOC dan ditempatkan di partisi /vendor di perangkat. Semua perangkat yang diluncurkan dengan Android 13 atau yang lebih tinggi harus mendukung HAL binderized yang ditulis dalam bahasa AIDL.

Implementasi

Rilis perangkat GMS dan AOSP untuk Android 13 harus menggunakan antarmuka AIDL.

Untuk menerapkan API framework DRM baru dengan plugin:

  1. Tambahkan layanan plugin ke file build perangkat.
  2. Perbarui manifes perangkat.
  3. Menambahkan izin SELinux.
  4. Buat file .rc di /vendor.
  5. Implementasikan plugin.

API ditentukan di setiap versi IDrmPlugin.aidl, ICryptoPlugin.aidl, IDrmFactory.aidl, dan ICryptoFactory.aidl

aidl/PLATFORM_ROOT/hardware/interfaces/drm/

Menambahkan layanan plugin ke file build 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

Memperbarui 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 AIDL API (misalnya, 1, 2). Atau, sebaiknya gunakan vintf_fragments.

Menambahkan 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)
        

Membuat file RC di bagian /vendor

File .rc menentukan tindakan yang akan diambil saat layanan diluncurkan.

Lihat Bahasa Android Init untuk mengetahui detailnya.

Mengimplementasikan plugin

  1. Terapkan titik entri main() di service.cpp layanan plugin.
  2. Implementasikan ICryptoPlugin, IDrmPlugin, ICryptoFactory, dan IDrmFactory.
  3. Implementasikan API baru dalam plugin.

Detail plugin DRM

Vendor plugin DRM menerapkan plugin DrmFactory, CryptoFactory, dan DRM.

DrmFactory

Class DrmHal menelusuri layanan plugin DRM terdaftar dan membuat plugin yang sesuai yang mendukung skema kripto tertentu melalui class DrmFactory.

IDrmFactory adalah titik entri utama untuk berinteraksi dengan drm HAL vendor melalui createPlugin API. createPlugin API digunakan untuk membuat instance IDrmPlugin.

::ndk::ScopedAStatus getSupportedCryptoSchemes(
    std::vector<::aidl::android::hardware::drm::Uuid>* _aidl_return);

getsupportedCryptoSchemes menampilkan daftar skema kripto yang didukung untuk instance 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 factory 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 factory plugin dapat membuat plugin DRM yang mendukung format penampung 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.

CryptoFactory

Class CryptoHal akan menelusuri layanan plugin DRM terdaftar dan membuat plugin yang sesuai yang mendukung skema kripto tertentu melalui class CryptoFactory.

::ndk::ScopedAStatus isCryptoSchemeSupported(
    const ::aidl::android::hardware::drm::Uuid& in_uuid,
    bool* _aidl_return);

Menentukan apakah factory 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 factory plugin dapat membuat plugin kripto yang mendukung skema kripto tertentu, yang ditentukan oleh UUID.

API plugin DRM

API ditentukan di hardware/interfaces/drm/aidl/aidl_api/android.hardware.drm/ VERSION/android/hardware/drm/IDrmPlugin.aidl. File IDrmPlugin.h yang sesuai dapat ditemukan di out/Soong setelah build.