DRM

ไอคอน Android DRM HAL

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

กรอบ

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

ระบบปฏิบัติการ Android DRM HAL
รูปที่ 1ก DRM hardware abstraction Layer ก่อน Android 11
Android DRM HAL โพสต์ R
รูปที่ 1ข. DRM hardware abstraction Layer เริ่มต้นใน Android 11

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

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

สถาปัตยกรรม

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

กรอบงาน Android DRM ถูกนำมาใช้ในสถาปัตยกรรมสองชั้น:

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

ดู Android Media DRM และ Android Media Crypto สำหรับรายละเอียดเพิ่มเติม

ปลั๊กอิน DRM

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

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

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

การนำไปปฏิบัติ

อุปกรณ์ GMS และ AOSP ที่เปิดตัวสำหรับ Android 13 ต้องใช้อินเทอร์เฟซ AIDL

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

  1. เพิ่มบริการปลั๊กอินให้กับไฟล์บิลด์ของอุปกรณ์
  2. อัปเดตรายการอุปกรณ์
  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

อัปเดตรายการอุปกรณ์

ไฟล์ 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 สำหรับรายละเอียด

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

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

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

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

DrmFactory

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

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

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

getSupportedCryptoSchemes ส่งคืนรายการแผนการเข้ารหัสที่รองรับสำหรับอินสแตนซ์ 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);

กำหนดว่าโรงงานปลั๊กอินสามารถสร้างปลั๊กอิน 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

CryptoFactory

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

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

กำหนดว่าโรงงาน crypto สามารถสร้างปลั๊กอิน crypto ที่รองรับโครงการ crypto ที่กำหนดหรือไม่ ซึ่งระบุโดย 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 ที่เกี่ยวข้องสามารถพบได้ใน out/Soong หลังจาก build