DRM

Ikon Android DRM HAL

Halaman ini memberikan ringkasan tentang framework manajemen hak digital (DRM) Android dan memperkenalkan antarmuka yang harus diterapkan oleh plugin DRM. Halaman ini tidak menjelaskan aturan ketahanan atau aturan kepatuhan yang mungkin ditentukan oleh skema DRM.

Framework

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; produsen perangkat menentukan skema DRM yang didukung 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 di-abstrak dari konten yang dilindungi DRM atau tidak dilindungi. Lihat MediaDrm untuk class guna mendapatkan kunci untuk mendekripsi streaming media yang dilindungi.

Gambar 1 menunjukkan lapisan ekstraksi hardware DRM sebelum Android 11, dan Gambar 2 menunjukkan lapisan di Android 11 dan yang lebih tinggi:

Android DRM HAL

Gambar 1. Hardware abstraction layer DRM sebelum Android 11.

Android DRM HAL mulai di Android 11

Gambar 2. Hardware abstraction layer (HAL) DRM mulai dari Android 11.

Ketersediaan konten digital yang kaya sangat 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

Gambar 3 menunjukkan framework DRM sebelum Android 11, dan Gambar 4 menunjukkan framework di Android 11 dan yang lebih tinggi:

Framework DRM Android

Gambar 3. Framework DRM sebelum Android 11.

Framework DRM Android mulai di Android 11

Gambar 4. Framework DRM mulai di Android 11.

Lihat MediaDrm dan MediaCrypto untuk mengetahui detail selengkapnya.

Plugin DRM

Saat sistem dimulai, framework DRM akan memindai instance dan layanan HAL (dijelaskan dalam file .rc ) dan menemukan plugin. Server Media DRM (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

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 bagian /vendor.
  5. Terapkan 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. Menambahkan izin ke VENDOR DEVICE/sepolicy/vendor/file.te:
    type mediadrm_vendor_data_file, file_type, data_file_type;
  2. Menambahkan izin 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. Menambahkan izin 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. Terapkan API baru di plugin.

Detail plugin DRM

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

Class 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 metode createPlugin. Gunakan metode ini 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. Urutan ini menentukan apakah factory plugin dapat membuat plugin DRM yang mendukung skema kripto tertentu, yang ditentukan oleh UUID:

::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);

Urutan ini menentukan apakah factory plugin dapat membuat plugin DRM yang mendukung format penampung media tertentu yang ditentukan oleh mimeType:

::ndk::ScopedAStatus isContentTypeSupported(const std::string& in_mimeType,
    bool* _aidl_return);

Urutan ini membuat plugin DRM untuk skema kripto yang ditentukan oleh UUID:

::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);

Class CryptoFactory

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

Urutan ini menentukan apakah factory kripto dapat membuat plugin kripto yang mendukung skema kripto tertentu, yang ditentukan oleh UUID:

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

Urutan ini menentukan apakah factory plugin 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);

API plugin DRM

API ditentukan 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/Soong setelah build.