DRM

ไอคอน Android DRM HAL

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

กรอบ

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

Android DRM HAL
รูปที่ 1a. DRM Hardware Abstraction Layer ก่อน Android 11
Android DRM HAL โพสต์ R
รูปที่ 1b. ชั้นนามธรรมของฮาร์ดแวร์ DRM เริ่มต้นใน Android 11

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

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

สถาปัตยกรรม

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

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

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

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

ปลั๊กอิน DRM

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

ปลั๊กอินควรใช้ HAL ที่มีการผูกมัด Binderized HAL ใช้ ภาษานิยามอินเทอร์เฟซ HAL (HIDL) ซึ่งช่วยให้สามารถแทนที่เฟรมเวิร์กได้โดยไม่ต้องสร้าง HAL ใหม่

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

การนำไปใช้

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

  1. เพิ่มบริการปลั๊กอินลงในไฟล์บิลด์ของอุปกรณ์
  2. อัปเดตรายการอุปกรณ์
  3. เพิ่มสิทธิ์ SELinux
  4. สร้างไฟล์ .rc ภายใต้ /vendor
  5. ติดตั้งปลั๊กอิน

API ถูกกำหนดไว้ใน IDrmPlugin.hal แต่ละเวอร์ชัน, ICryptoPlugin.hal , IDrmFactory.hal และ ICryptoFactory.hal

PLATFORM_ROOT/hardware/interfaces/drm/VERSION/

การเพิ่มบริการปลั๊กอินลงในไฟล์บิลด์อุปกรณ์

ตัวอย่างเช่นหากต้องการเพิ่มการรองรับอินเทอร์เฟซ 1.3 ไฟล์ VENDOR DEVICE /device.mk ต้องมีแพ็กเกจ android.hardware.drm@1.3-service.* :

เวอร์ชัน 1.0 ถึง 1.2 เลิกใช้งานแล้วใน R / Android 11 อุปกรณ์ที่อัปเกรดเป็น R ยังคงได้รับอนุญาตให้เรียกใช้เวอร์ชัน 1.0 ถึง 1.2 อย่างไรก็ตามอุปกรณ์ใหม่ที่เปิดตัวด้วย R ต้องรันเฉพาะเวอร์ชัน 1.3


  PRODUCT_PACKAGES += \
    android.hardware.drm@1.0-impl \
    android.hardware.drm@1.0-service \
    android.hardware.drm@1.3-service.clearkey \
    android.hardware.drm@1.3-service.widevine

การอัปเดตรายการอุปกรณ์

ไฟล์ vendor manifest.xml สำหรับอุปกรณ์ต้องมีรายการต่อไปนี้:


  <hal format="hidl">
    <name>android.hardware.drm</name>
      <transport>hwbinder</transport>
      <fqname>@1.3::ICryptoFactory/clearkey</fqname>
      <fqname>@1.3::IDrmFactory/clearkey</fqname>
      <fqname>@1.3::ICryptoFactory/widevine</fqname>
      <fqname>@1.3::IDrmFactory/widevine</fqname>
  </hal>

เราขอแนะนำให้ใช้ 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@\[0-9]+\.[0-9]+-service\.clearkey
          u:object_r:hal_drm_clearkey_exec:s0
    /data/vendor/mediadrm(/.*)? u:object_r:mediadrm_vendor_data_file:s0

    หรืออีกวิธีหนึ่งคืออัปเดตหมายเลขเวอร์ชันตามที่แสดงด้านล่าง

    /vendor/bin/hw/android\.hardware\.drm@1\.3-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
    allow hal_drm_clearkey mediadrm_vendor_data_file:dir create_dir_perms;
        allow hal_drm_clearkey mediadrm_vendor_data_file:file create_file_perms;
        

การสร้างไฟล์. 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 createPlugin API ใช้เพื่อสร้างอินสแตนซ์ IDrmPlugin 1.3 IDrmFactory ต้องสร้างอินเตอร์เฟส 1.2 IDrmPlugin เสมอซึ่งส่งคืนผ่านเมธอด 1.0 createPlugin

Return<void> getSupportedCryptoSchemes(getSupportedCryptoSchemes_cb _hidl_cb);

ใหม่ใน 1.3 IDrmFactory getSupportedCryptoSchemes ส่งคืนรายการของแผนการเข้ารหัสที่รองรับสำหรับอินสแตนซ์ HIDL drm HAL

Return<bool> isCryptoSchemeSupported(const hidl_array<uint8_t, 16>uuid);

ตรวจสอบว่าโรงงานปลั๊กอินสามารถสร้างปลั๊กอิน DRM ที่รองรับรูปแบบการเข้ารหัสลับที่กำหนดหรือไม่ซึ่งระบุโดย UUID

Return<bool> isContentTypeSupported(const hidl_string &mimeType);

กำหนดว่าโรงงานปลั๊กอินสามารถสร้างปลั๊กอิน DRM ที่รองรับรูปแบบคอนเทนเนอร์สื่อที่ระบุโดย mimeType หรือไม่

Return<void> createPlugin(const hidl_array<uint8_t, 16>uuid,
        const hidl_string& appPackageName, createPlugin_cb _hidl_cb);

สร้างปลั๊กอิน DRM สำหรับรูปแบบการเข้ารหัสที่ระบุโดย UUID

CryptoFactory

คลาส CryptoHal ค้นหาบริการปลั๊กอิน DRM ที่ลงทะเบียนและสร้างปลั๊กอินที่เกี่ยวข้องซึ่งรองรับรูปแบบการเข้ารหัสที่กำหนดผ่านคลาส CryptoFactory

Return<bool> isCryptoSchemeSupported(const hidl_array<uint8_t, 16>uuid);

พิจารณาว่าโรงงาน crypto สามารถสร้างปลั๊กอิน crypto ที่รองรับรูปแบบการเข้ารหัสที่กำหนดหรือไม่ซึ่งระบุโดย UUID

Return<void> createPlugin(const hidl_array<uint8_t, 16>uuid,
        const hidl_vec<uint8_t>initData, createPlugin_cb _hidl_cb)

ตรวจสอบว่าโรงงานปลั๊กอินสามารถสร้างปลั๊กอิน crypto ที่รองรับรูปแบบการเข้ารหัสที่กำหนดหรือไม่ซึ่งระบุโดย UUID

ปลั๊กอิน DRM

API ถูกกำหนดไว้ใน hardware/interfaces/drm/ VERSION /IDrmPlugin.hal ไฟล์ IDrmPlugin.h เกี่ยวข้องสามารถพบได้ใน out / Soong หลังการสร้าง