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 ถูกรวมเข้ากับเฟรมเวิร์ก Android DRM และสามารถใช้การป้องกันที่สนับสนุนฮาร์ดแวร์เพื่อรักษาความปลอดภัยเนื้อหาระดับพรีเมียมและข้อมูลรับรองผู้ใช้

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

สถาปัตยกรรม

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

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

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

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

ปลั๊กอิน DRM

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

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

ปลั๊กอินถูกสร้างขึ้นโดยผู้ขายหรือผู้ผลิต SOC และใส่พาร์ติชั่น /vendor บนอุปกรณ์ อุปกรณ์ทั้งหมดที่เปิดตัวด้วย Android 13 ขึ้นไปต้องรองรับ Binderized 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>

เวอร์ชัน 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

ใช้ปลั๊กอิน

  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 API createPlugin ใช้เพื่อสร้างอินสแตนซ์ 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);

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