DRM

ไอคอน HAL ของ Android DRM

หน้านี้จะแสดงภาพรวมของเฟรมเวิร์กการจัดการสิทธิ์ดิจิทัล (DRM) ของ Android และ แนะนำอินเทอร์เฟซที่ปลั๊กอิน DRM ต้องใช้ หน้านี้ไม่ได้ อธิบายกฎความแข็งแกร่งหรือกฎการปฏิบัติตามข้อกำหนดที่อาจกำหนดโดยรูปแบบ DRM

Framework

แพลตฟอร์ม Android มีเฟรมเวิร์ก DRM ที่ขยายได้ซึ่งช่วยให้แอปจัดการเนื้อหาที่ได้รับการคุ้มครองสิทธิ์ตามข้อจำกัดของใบอนุญาตที่เชื่อมโยงกับเนื้อหาได้ เฟรมเวิร์ก DRM รองรับรูปแบบ DRM หลายรูปแบบ และผู้ผลิตอุปกรณ์จะเป็นผู้กำหนดว่าอุปกรณ์รองรับรูปแบบ DRM ใด เฟรมเวิร์ก DRM มีอินเทอร์เฟซแบบรวมสำหรับนักพัฒนาแอปและ ซ่อนความซับซ้อนของการดำเนินการ DRM เฟรมเวิร์ก DRM มีโหมดการทำงานที่สอดคล้องกัน สำหรับเนื้อหาที่ได้รับการคุ้มครองและไม่ได้รับการคุ้มครอง รูปแบบ DRM สามารถกำหนด รูปแบบการใช้งานที่ซับซ้อนได้โดยใช้ข้อมูลเมตาของใบอนุญาต เฟรมเวิร์ก DRM จะเชื่อมโยงเนื้อหา DRM กับใบอนุญาต และจัดการการจัดการสิทธิ์ ซึ่งช่วยให้สามารถแยกโปรแกรมเล่นสื่อออกจากเนื้อหาที่ได้รับการคุ้มครองโดย DRM หรือเนื้อหาที่ไม่ได้ป้องกัน ดู MediaDrm สำหรับคลาสเพื่อรับคีย์สำหรับการถอดรหัสสตรีมสื่อที่ได้รับการปกป้อง

รูปที่ 1 แสดงเลเยอร์การแยกฮาร์ดแวร์ DRM ก่อน Android 11 และรูปที่ 2 แสดงเลเยอร์ใน Android 11 ขึ้นไป

Android DRM HAL

รูปที่ 1 ระดับชั้นการจัดการฮาร์ดแวร์โดยตรงของ DRM ก่อน Android 11

Android DRM HAL เริ่มต้นใน Android 11

รูปที่ 2 ระดับชั้นการจัดการฮาร์ดแวร์โดยตรงของ DRM ตั้งแต่ Android 11 เป็นต้นไป

ความพร้อมใช้งานของเนื้อหาดิจิทัลแบบริชมีเดียเป็นสิ่งสำคัญสำหรับผู้ใช้ในอุปกรณ์เคลื่อนที่ หากต้องการให้เนื้อหาของตนพร้อมให้บริการในวงกว้าง นักพัฒนาแอป Android และผู้เผยแพร่เนื้อหาดิจิทัล จะต้องใช้ DRM ที่สอดคล้องกันซึ่งรองรับในระบบนิเวศของ Android Google มี DRM ที่ไม่มีค่าธรรมเนียมใบอนุญาตในอุปกรณ์ Android ที่รองรับ เพื่อให้เนื้อหาดิจิทัลดังกล่าวพร้อมใช้งานในอุปกรณ์ Android และเพื่อให้มั่นใจว่ามี DRM ที่สอดคล้องกันอย่างน้อย 1 รายการในอุปกรณ์ทั้งหมด ปลั๊กอิน DRM ผสานรวมกับเฟรมเวิร์ก DRM ของ Android และใช้การป้องกันที่ได้รับการสนับสนุนจากฮาร์ดแวร์ เพื่อรักษาความปลอดภัยของเนื้อหาพรีเมียมและข้อมูลเข้าสู่ระบบของผู้ใช้

การปกป้องเนื้อหาที่ปลั๊กอิน DRM มีให้จะขึ้นอยู่กับความปลอดภัยและความสามารถในการปกป้องเนื้อหาของแพลตฟอร์มฮาร์ดแวร์พื้นฐาน ความสามารถด้านฮาร์ดแวร์ของอุปกรณ์ควรมีการเปิดเครื่องอย่างปลอดภัยของฮาร์ดแวร์เพื่อ สร้างห่วงโซ่ความน่าเชื่อถือด้านความปลอดภัยและการปกป้องคีย์การเข้ารหัส ความสามารถในการปกป้องเนื้อหาของอุปกรณ์ควรรวมถึงการปกป้อง เฟรมที่ถอดรหัสแล้วในอุปกรณ์และการปกป้องเนื้อหาผ่านเอาต์พุตที่เชื่อถือได้ กลไกการปกป้อง แพลตฟอร์มฮาร์ดแวร์บางแพลตฟอร์มไม่รองรับฟีเจอร์ด้านความปลอดภัยและการปกป้องเนื้อหาทั้งหมดข้างต้น การรักษาความปลอดภัยไม่ได้ดำเนินการใน ที่เดียวในสแต็ก แต่จะขึ้นอยู่กับการผสานรวมฮาร์ดแวร์ ซอฟต์แวร์ และบริการ การรวมฟังก์ชันความปลอดภัยของฮาร์ดแวร์ กลไกการเปิดเครื่องที่เชื่อถือได้ และระบบปฏิบัติการที่ปลอดภัยซึ่งแยกต่างหากสำหรับการจัดการฟังก์ชันความปลอดภัย เป็นสิ่งสำคัญในการมอบอุปกรณ์ที่ปลอดภัย

สถาปัตยกรรม

กรอบงาน DRM ออกแบบมาให้ไม่ขึ้นอยู่กับการใช้งานและ สรุปรายละเอียดของการใช้งานรูปแบบ DRM ที่เฉพาะเจาะจงใน ปลั๊กอิน DRM ที่เฉพาะเจาะจงรูปแบบ เฟรมเวิร์ก DRM มี API แบบง่ายเพื่อจัดการ การดำเนินการ DRM ที่ซับซ้อน รับใบอนุญาต จัดสรรอุปกรณ์ เชื่อมโยงเนื้อหา DRM กับใบอนุญาต และสุดท้ายคือถอดรหัสเนื้อหา DRM

เฟรมเวิร์ก DRM ของ Android มีการใช้งานในเลเยอร์สถาปัตยกรรม 2 ชั้น ดังนี้

  • API เฟรมเวิร์ก DRM ซึ่งแสดงต่อแอปผ่านเฟรมเวิร์กแอป Android
  • เฟรมเวิร์ก DRM ของโค้ดเนทีฟซึ่งแสดงอินเทอร์เฟซสำหรับปลั๊กอิน DRM (เอเจนต์) เพื่อจัดการการจัดการสิทธิ์และการถอดรหัสสำหรับรูปแบบ DRM ต่างๆ

รูปที่ 3 แสดงเฟรมเวิร์ก DRM ก่อน Android 11 และรูปที่ 4 แสดงเฟรมเวิร์กใน Android 11 ขึ้นไป

เฟรมเวิร์ก DRM ของ Android

รูปที่ 3 เฟรมเวิร์ก DRM ก่อน Android 11

เฟรมเวิร์ก DRM ของ Android ตั้งแต่ Android 11 เป็นต้นไป

รูปที่ 4 เฟรมเวิร์ก DRM เริ่มต้นใน Android 11

ดูรายละเอียดเพิ่มเติมได้ที่ MediaDrm และ MediaCrypto

ปลั๊กอิน DRM

เมื่อระบบเริ่มต้น เฟรมเวิร์ก DRM จะสแกนหาอินสแตนซ์และบริการ HAL (อธิบายไว้ใน.rc ไฟล์) และค้นหาปลั๊กอิน เซิร์ฟเวอร์ DRM ของสื่อ (mediadrmserver) จะสร้าง ทั้งออบเจ็กต์ CryptoHal และ DrmHal CryptoHal และ DrmHal จากนั้นเรียกใช้ปลั๊กอินด้วยการติดตั้งใช้งานที่เจาะจงผู้ให้บริการ

ปลั๊กอินควรใช้ HAL ที่เชื่อมโยง HAL ที่ใช้ Binder จะใช้ ภาษาที่ใช้สื่อสารข้อมูลระหว่างคอมโพเนนต์ของ Android (AIDL) ซึ่งช่วยให้สามารถแทนที่เฟรมเวิร์กได้โดยไม่ต้องสร้าง HAL ใหม่

ปลั๊กอินสร้างขึ้นโดยผู้ให้บริการหรือผู้ผลิต SOC และอยู่ในพาร์ติชัน /vendor ใน อุปกรณ์ อุปกรณ์ทั้งหมดที่เปิดตัวพร้อม Android 13 ขึ้นไปต้องรองรับ HAL ที่ใช้ Binder ซึ่งเขียนด้วยภาษา AIDL

การใช้งาน

หากต้องการใช้ API ของเฟรมเวิร์ก DRM ใหม่โดยปลั๊กอิน ให้ทำดังนี้

  1. เพิ่มบริการปลั๊กอินลงในไฟล์บิลด์ของอุปกรณ์
  2. อัปเดตไฟล์ Manifest ของอุปกรณ์
  3. เพิ่มสิทธิ์ SELinux
  4. สร้างไฟล์ .rc ใน /vendor
  5. ติดตั้งใช้งานปลั๊กอิน

API จะกำหนดไว้ใน IDrmPlugin.aidl, ICryptoPlugin.aidl, IDrmFactory.aidl และ ICryptoFactory.aidl แต่ละเวอร์ชัน

aidl/PLATFORM_ROOT/hardware/interfaces/drm/

เพิ่มบริการปลั๊กอินลงในไฟล์บิลด์ของอุปกรณ์

ตัวอย่างเช่น หากต้องการเพิ่มการรองรับอินเทอร์เฟซ AIDL ไฟล์ VENDOR DEVICE/device.mk ต้องมี แพ็กเกจ android.hardware.drm-service.* ดังนี้

  PRODUCT_PACKAGES += \
    android.hardware.drm-service.clearkey \
    android.hardware.drm-service.widevine

อัปเดตไฟล์ Manifest ของอุปกรณ์

vendor manifest.xml ไฟล์สำหรับอุปกรณ์ต้องมีรายการต่อไปนี้

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

เวอร์ชัน AIDL ที่เสถียรคือหมายเลขเวอร์ชันของ AIDL API แต่ละรุ่น (เช่น 1, 2) หรือเราขอแนะนำให้ใช้ vintf_fragments

เพิ่มสิทธิ์ SELinux

  1. เพิ่มสิทธิ์ให้กับ VENDOR DEVICE/sepolicy/vendor/file.te
    type mediadrm_vendor_data_file, file_type, data_file_type;
  2. เพิ่มสิทธิ์ให้กับ 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. เพิ่มสิทธิ์ให้กับ 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)
        

สร้างไฟล์ RC ในไดเรกทอรี /vendor

ไฟล์ .rc ระบุการดำเนินการที่จะทำเมื่อเปิดใช้บริการ

ดูรายละเอียดได้ที่ Android Init Language

ติดตั้งใช้งานปลั๊กอิน

  1. ใช้main()จุดแรกเข้าในservice.cppของบริการปลั๊กอิน
  2. ใช้ ICryptoPlugin, IDrmPlugin, ICryptoFactory และ IDrmFactory
  3. ติดตั้งใช้งาน API ใหม่ในปลั๊กอิน

รายละเอียดปลั๊กอิน DRM

ผู้ให้บริการปลั๊กอิน DRM จะใช้ DrmFactory, CryptoFactory และปลั๊กอิน DRM

คลาส DrmFactory

คลาส DrmHal จะค้นหาบริการปลั๊กอิน DRM ที่ลงทะเบียนไว้และสร้างปลั๊กอินที่เกี่ยวข้องซึ่งรองรับรูปแบบการเข้ารหัสที่กำหนดผ่านคลาส DrmFactory

IDrmFactory เป็นจุดแรกเข้าหลักสำหรับการโต้ตอบกับ DRM HAL ของผู้ให้บริการ ผ่านเมธอด createPlugin ใช้วิธีนี้เพื่อสร้างอินสแตนซ์ IDrmPlugin

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

getSupportedCryptoSchemes จะแสดงรายการรูปแบบการเข้ารหัสที่รองรับ สำหรับอินสแตนซ์ AIDL DRM HAL ลำดับนี้จะกำหนดว่าโรงงานปลั๊กอินจะสร้างปลั๊กอิน DRM ที่รองรับรูปแบบการเข้ารหัสที่กำหนดได้หรือไม่ ซึ่งระบุโดย 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);

ลำดับนี้จะกำหนดว่าโรงงานปลั๊กอินจะสร้างปลั๊กอิน DRM ที่รองรับรูปแบบคอนเทนเนอร์สื่อที่ระบุโดย mimeType ได้หรือไม่

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

ลำดับนี้จะสร้างปลั๊กอิน DRM สำหรับรูปแบบการเข้ารหัสที่ระบุโดย 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);

คลาส CryptoFactory

คลาส CryptoHal จะค้นหาบริการปลั๊กอิน DRM ที่ลงทะเบียนไว้และสร้างปลั๊กอินที่เกี่ยวข้องซึ่งรองรับรูปแบบการเข้ารหัสที่กำหนดผ่านคลาส CryptoFactory

ลำดับนี้จะกำหนดว่าโรงงานคริปโตสามารถสร้างปลั๊กอินคริปโตที่รองรับรูปแบบคริปโตที่กำหนดได้หรือไม่ ซึ่งระบุโดย UUID ดังนี้

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

ลำดับนี้จะกำหนดว่าโรงงานปลั๊กอินสามารถสร้างปลั๊กอินการเข้ารหัสที่รองรับรูปแบบการเข้ารหัสที่กำหนดได้หรือไม่ ซึ่งระบุโดย 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 ปลั๊กอิน DRM

API กำหนดไว้ใน hardware/interfaces/drm/aidl/aidl_api/android.hardware.drm/ VERSION/android/hardware/drm/IDrmPlugin.aidl คุณจะเห็นไฟล์ IDrmPlugin.h ที่เกี่ยวข้องใน out/Soong หลังจากสร้าง