DRM

ไอคอน Android DRM HAL

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

เฟรมเวิร์ก

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

DRM สำหรับ Android
รูปที่ 1a การจัดการฮาร์ดแวร์ DRM เลเยอร์ก่อน Android 11
วันที่ โพสต์ DRM HAL ของ Android
รูปที่ 1ข การจัดการฮาร์ดแวร์ DRM เริ่มเลเยอร์ใน Android 11

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

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

สถาปัตยกรรม

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

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

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

โปรดดู Android Media DRM และ ดูรายละเอียดเพิ่มเติมได้ที่ Android Media Crypto

ปลั๊กอิน DRM

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

ปลั๊กอินควรใช้ HAL ที่เชื่อมโยงไว้ Binderized HALs ใช้องค์ประกอบ Android Interface Definition Language (AIDL) ซึ่งทำให้สามารถแทนที่เฟรมเวิร์กได้โดยไม่ต้องสร้าง HAL ใหม่

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

การใช้งาน

อุปกรณ์ที่เปิดตัว GMS และ AOSP สำหรับ Android 13 ต้องใช้อินเทอร์เฟซ 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>

STABLE AIDL VERSION คือหมายเลขเวอร์ชันของ 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 ของปลั๊กอิน service.
  2. ติดตั้งใช้งาน ICryptoPlugin, IDrmPlugin ICryptoFactory และ IDrmFactory
  3. ใช้ API ใหม่ในปลั๊กอิน

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

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

โรงงาน Drm

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

IDrmfactor คือจุดแรกเข้าหลักในการโต้ตอบกับ HAL ใน DRM ของผู้ให้บริการ ผ่าน createPlugin API ระบบใช้ createPlugin API ในการสร้างอินสแตนซ์ IDrmPlugin

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

getSupportedCryptoSchemes แสดงรายการรูปแบบคริปโตที่รองรับ สำหรับอินสแตนซ์ drm drm ของ AIDL

::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 ที่สนับสนุนได้หรือไม่ รูปแบบคริปโตหนึ่งๆ ซึ่งระบุโดย UUID

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

ตรวจสอบว่าโรงงานปลั๊กอินสามารถสร้างปลั๊กอิน DRM ที่สนับสนุน รูปแบบคอนเทนเนอร์สื่อที่ระบุโดย 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);

สร้างปลั๊กอิน DRM สำหรับรูปแบบคริปโตที่ระบุโดย UUID

โรงงานคริปโต

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

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

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

API ปลั๊กอิน DRM

API กําหนดไว้ใน hardware/interfaces/drm/aidl/aidl_api/android.hardware.drm/ VERSION/android/hardware/drm/IDrmPlugin.aidl ฟิลด์ ไฟล์ IDrmPlugin.h ไฟล์จะอยู่ในหรือหลังจากการสร้างเร็วๆ นี้