DRM

ไอคอน Android DRM HAL

หน้านี้จะแสดงภาพรวมของเฟรมเวิร์กการจัดการสิทธิ์ดิจิทัล (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 แบบ Binderized HAL แบบ Binderized ใช้ Android Interface Definition Language (AIDL) ซึ่งช่วยให้คุณแทนที่เฟรมเวิร์กได้โดยไม่ต้องสร้าง HAL ขึ้นมาใหม่

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

ลำดับนี้จะกำหนดว่า Crypto Factory สร้างปลั๊กอินคริปโตที่รองรับรูปแบบคริปโตที่ระบุโดย 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 หลังจากการบิลด์