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 ) และค้นหาปลั๊กอิน เซิร์ฟเวอร์ Media DRM (mediadrmserver) จะสร้างออบเจ็กต์ CryptoHal และ DrmHal จากนั้น CryptoHal และ DrmHal จะเรียกปลั๊กอินด้วยการใช้งานที่เฉพาะเจาะจงของผู้ให้บริการ

ปลั๊กอินควรใช้ HAL ที่ผูกกับ Binder 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 จะระบุการดำเนินการที่จะเกิดขึ้นเมื่อเปิดใช้บริการ

ดูรายละเอียดได้ที่ ภาษา Init ของ 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 ใช้เมธอดนี้เพื่อสร้าง 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 หลังจากบิลด์