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 เลเยอร์ก่อน Android 11
Android DRM HAL หลัง R
รูปที่ 1ข. การแยกแยะฮาร์ดแวร์ 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 ต่างๆ
เฟรมเวิร์ก DRM ของ Android
รูปที่ 2ก เฟรมเวิร์ก DRM ก่อน Android 11
เฟรมเวิร์ก DRM ของ Android
รูปที่ 2ข. เฟรมเวิร์ก DRM ตั้งแต่ Android 11 เป็นต้นไป

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

ปลั๊กอิน DRM

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

ปลั๊กอินควรใช้ HAL แบบ Binderized HAL แบบ Binderized ใช้ 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>

เวอร์ชัน 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 คือจุดแรกเข้าหลักสำหรับการโต้ตอบกับ HAL drm ของผู้ให้บริการผ่าน 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 Factory สร้างปลั๊กอินการเข้ารหัสที่รองรับรูปแบบการเข้ารหัสที่ระบุโดย 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);

ตรวจสอบว่าโรงงานปลั๊กอินสามารถสร้างปลั๊กอิน Crypto ที่รองรับ Crypto Scheme ที่ระบุโดย UUID หรือไม่

API ของปลั๊กอิน DRM

API เหล่านี้จะกำหนดไว้ใน hardware/interfaces/drm/aidl/aidl_api/android.hardware.drm/ VERSION/android/hardware/drm/IDrmPlugin.aidl ไฟล์ IDrmPlugin.h ที่เกี่ยวข้องจะอยู่ใน out/Soong หลังจากการบิลด์