DRM

Ikon Android DRM HAL

Dokumen ini memberikan ikhtisar kerangka kerja manajemen hak digital (DRM) Android dan memperkenalkan antarmuka yang harus diterapkan 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 hak sesuai dengan batasan lisensi yang terkait dengan konten. Kerangka kerja DRM mendukung banyak skema DRM; skema DRM mana yang didukung perangkat terserah 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 dengan metadata lisensi. Kerangka kerja DRM menyediakan hubungan antara konten dan lisensi DRM, dan menangani manajemen hak. Ini memungkinkan pemutar media diabstraksi dari konten yang dilindungi DRM atau tidak dilindungi. Lihat MediaDrm untuk 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 di perangkat seluler. Untuk membuat konten mereka tersedia secara luas, pengembang Android dan penerbit konten digital memerlukan implementasi DRM yang konsisten yang didukung di seluruh ekosistem Android. Untuk membuat konten digital tersebut tersedia di perangkat Android dan untuk memastikan bahwa 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 kerja Android DRM 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 keamanan dan perlindungan kunci kriptografi. Kemampuan perlindungan konten perangkat harus mencakup perlindungan bingkai yang didekripsi di perangkat dan perlindungan konten melalui mekanisme perlindungan keluaran tepercaya. Tidak semua platform perangkat keras mendukung semua fitur keamanan dan perlindungan konten di atas. Keamanan tidak pernah diimplementasikan di satu tempat dalam tumpukan, melainkan 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 menjadi agnostik implementasi dan mengabstraksikan detail implementasi skema DRM tertentu dalam plugin DRM khusus 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 kerja DRM, yang diekspos ke aplikasi melalui kerangka kerja 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

Pada startup sistem, kerangka kerja DRM memindai instans/layanan HAL (dijelaskan dalam file .rc ) dan plugin ditemukan melalui registri HIDL. Media DRM Server ( mediadrmserver ) membuat objek CryptoHal dan DrmHal . CryptoHal dan DrmHal kemudian memanggil plugin dengan implementasi khusus vendor.

Plugin harus mengimplementasikan HAL yang di-binder. HAL yang diikat menggunakan bahasa definisi antarmuka HAL (HIDL) , yang memungkinkan kerangka kerja diganti tanpa harus membangun kembali HAL.

Plugin dibuat oleh vendor atau pembuat SOC dan dimasukkan ke dalam partisi /vendor pada perangkat. Semua perangkat yang diluncurkan dengan Android 8.0 atau lebih tinggi harus mendukung HAL binder yang ditulis dalam bahasa HIDL.

Penerapan

Untuk mengimplementasikan API kerangka kerja DRM baru dengan 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. Menerapkan plugin.

API didefinisikan di setiap versi IDrmPlugin.hal , ICryptoPlugin.hal , IDrmFactory.hal , dan ICryptoFactory.hal

PLATFORM_ROOT/hardware/interfaces/drm/VERSION/

Menambahkan layanan plugin ke file pembuatan perangkat

Misalnya, untuk menambahkan dukungan antarmuka 1.3, file VENDOR DEVICE /device.mk harus menyertakan paket android.hardware.drm@1.3-service.* :

Versi 1.0 hingga 1.2 tidak digunakan lagi di R / Android 11. Peningkatan perangkat ke R masih diizinkan untuk menjalankan versi 1.0 hingga 1.2. Namun, perangkat baru yang diluncurkan dengan R harus menjalankan hanya versi1.3.


  PRODUCT_PACKAGES += \
    android.hardware.drm@1.0-impl \
    android.hardware.drm@1.0-service \
    android.hardware.drm@1.3-service.clearkey \
    android.hardware.drm@1.3-service.widevine

Memperbarui manifes perangkat

File vendor manifest.xml untuk perangkat harus menyertakan entri berikut:


  <hal format="hidl">
    <name>android.hardware.drm</name>
      <transport>hwbinder</transport>
      <fqname>@1.3::ICryptoFactory/clearkey</fqname>
      <fqname>@1.3::IDrmFactory/clearkey</fqname>
      <fqname>@1.3::ICryptoFactory/widevine</fqname>
      <fqname>@1.3::IDrmFactory/widevine</fqname>
  </hal>

Sebagai alternatif, kami sarankan menggunakan 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

    Kami merekomendasikan penggunaan ekspresi reguler untuk menentukan nomor versi untuk menghindari membuat pembaruan untuk rilis baru, misalnya:

    /vendor/bin/hw/android\.hardware\.drm@\[0-9]+\.[0-9]+-service\.clearkey
          u:object_r:hal_drm_clearkey_exec:s0
    /data/vendor/mediadrm(/.*)? u:object_r:mediadrm_vendor_data_file:s0

    Sebagai alternatif, perbarui nomor versi seperti yang ditunjukkan di bawah ini.

    /vendor/bin/hw/android\.hardware\.drm@1\.3-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
    allow hal_drm_clearkey mediadrm_vendor_data_file:dir create_dir_perms;
        allow hal_drm_clearkey mediadrm_vendor_data_file:file create_file_perms;
        

Membuat file .rc di bawah /vendor

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

Lihat Bahasa Init Android untuk detailnya.

Menerapkan plugin

  1. Terapkan titik masuk main() di service.cpp dari layanan plugin.
  2. Menerapkan 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 yang sesuai yang mendukung skema kripto yang diberikan melalui kelas DrmFactory .

IDrmFactory adalah titik masuk utama untuk berinteraksi dengan drm HAL vendor melalui createPlugin API. API createPlugin digunakan untuk membuat instance IDrmPlugin. 1.3 IDrmFactory harus selalu membuat 1.2 antarmuka IDrmPlugin, yang dikembalikan melalui metode 1.0 createPlugin.

Return<void> getSupportedCryptoSchemes(getSupportedCryptoSchemes_cb _hidl_cb);

Baru di 1.3 IDrmFactory, getSupportedCryptoSchemes mengembalikan daftar skema kripto yang didukung untuk instans HIDL drm HAL.

Return<bool> isCryptoSchemeSupported(const hidl_array<uint8_t, 16>uuid);

Menentukan apakah pabrik plugin dapat membuat plugin DRM yang mendukung skema kripto tertentu, yang ditentukan oleh UUID.

Return<bool> isContentTypeSupported(const hidl_string &mimeType);

Menentukan apakah pabrik plugin dapat membuat plugin DRM yang mendukung format wadah media tertentu yang ditentukan oleh mimeType .

Return<void> createPlugin(const hidl_array<uint8_t, 16>uuid,
        const hidl_string& appPackageName, createPlugin_cb _hidl_cb);

Membangun plugin DRM untuk skema kripto yang ditentukan oleh UUID.

Pabrik Kripto

Kelas CryptoHal mencari layanan plugin DRM terdaftar dan membangun plugin yang sesuai yang mendukung skema kripto yang diberikan melalui kelas CryptoFactory .

Return<bool> isCryptoSchemeSupported(const hidl_array<uint8_t, 16>uuid);

Menentukan apakah pabrik kripto dapat membuat plugin kripto yang mendukung skema kripto tertentu, yang ditentukan oleh UUID.

Return<void> createPlugin(const hidl_array<uint8_t, 16>uuid,
        const hidl_vec<uint8_t>initData, createPlugin_cb _hidl_cb)

Menentukan apakah pabrik plugin dapat membuat plugin kripto yang mendukung skema kripto tertentu, yang ditentukan oleh UUID.

plugin DRM

API didefinisikan dalam hardware/interfaces/drm/ VERSION /IDrmPlugin.hal . File IDrmPlugin.h yang sesuai dapat ditemukan di out/Segera setelah build.