DRM, DRM

ไอคอน Android DRM HAL

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

กรอบ

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

Android DRM HAL
รูปที่ 1a นามธรรมฮาร์ดแวร์ DRM เลเยอร์ก่อน Android 11
Android DRM HAL โพสต์ R
รูปที่ 1b. นามธรรมฮาร์ดแวร์ DRM เลเยอร์เริ่มต้นใน Android 11

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

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

สถาปัตยกรรม

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

เฟรมเวิร์ก Android DRM ถูกนำไปใช้ในสถาปัตยกรรมสองชั้น:

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

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

ปลั๊กอิน DRM

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

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

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

การดำเนินการ

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

ในการปรับใช้ DRM frameworks API ใหม่โดยปลั๊กอิน:

  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 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 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 หลังจากสร้าง