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


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


ดู Android Media DRM และ Android Media Crypto สำหรับรายละเอียดเพิ่มเติม
ปลั๊กอิน DRM
เมื่อเริ่มต้นระบบ เฟรมเวิร์ก DRM จะสแกนหาอินสแตนซ์/บริการ HAL (อธิบายไว้ในไฟล์ .rc
) และพบปลั๊กอิน Media DRM Server ( mediadrmserver
) สร้างทั้งวัตถุ CryptoHal
และ DrmHal
จากนั้น CryptoHal
และ DrmHal
เรียกใช้ปลั๊กอินด้วยการใช้งานเฉพาะผู้ขาย
ปลั๊กอินควรใช้ HAL ที่ผูกมัด Binderized HALs ใช้ Android Interface Definition Language (AIDL) ซึ่งช่วยให้เปลี่ยนกรอบงานได้โดยไม่ต้องสร้าง HAL ใหม่
ปลั๊กอินถูกสร้างขึ้นโดยผู้ขายหรือผู้ผลิต SOC และใส่ในพาร์ติชั่น /vendor
บนอุปกรณ์ อุปกรณ์ทั้งหมดที่เปิดตัวด้วย Android 13 ขึ้นไปต้องรองรับ HAL ที่ผูกมัดซึ่งเขียนด้วยภาษา AIDL
การดำเนินการ
อุปกรณ์ GMS และ AOSP ที่วางจำหน่ายสำหรับ Android 13 ต้องใช้อินเทอร์เฟซ AIDL
ในการปรับใช้ DRM frameworks API ใหม่โดยปลั๊กอิน:
- เพิ่มบริการปลั๊กอินให้กับไฟล์บิลด์ของอุปกรณ์
- อัปเดตรายการอุปกรณ์
- เพิ่มสิทธิ์ SELinux
- สร้างไฟล์
.rc
ภายใต้/vendor
- ใช้งานปลั๊กอิน
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>
STABLE AIDL VERSION คือหมายเลขเวอร์ชันของ AIDL API แต่ละรายการ (เช่น 1, 2) อีกทางหนึ่ง เราแนะนำให้ใช้ vintf_fragments
การเพิ่มสิทธิ์ SELinux
- เพิ่มไปยัง
VENDOR DEVICE /sepolicy/vendor/file.te
type mediadrm_vendor_data_file, file_type, data_file_type;
- เพิ่มไปยัง
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 - เพิ่มไปยัง
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 Init Language สำหรับรายละเอียด
การใช้งานปลั๊กอิน
- ใช้จุดเริ่มต้น
main()
ในservice.cpp
ของบริการปลั๊กอิน - ใช้
ICryptoPlugin
,IDrmPlugin
,ICryptoFactory
และIDrmFactory
- ใช้ API ใหม่ในปลั๊กอิน
รายละเอียดปลั๊กอิน DRM
ผู้จำหน่ายปลั๊กอิน DRM ใช้ปลั๊กอิน DrmFactory
, CryptoFactory
และ DRM
DrmFactory
คลาส DrmHal
ค้นหาบริการปลั๊กอิน DRM ที่ลงทะเบียนแล้ว และสร้างปลั๊กอินที่เกี่ยวข้องซึ่งสนับสนุนรูปแบบการเข้ารหัสลับที่กำหนดผ่านคลาส DrmFactory
IDrmFactory เป็นจุดเริ่มต้นหลักสำหรับการโต้ตอบกับ drm HAL ของผู้ขายผ่าน 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 สามารถสร้างปลั๊กอิน crypto ที่รองรับรูปแบบ crypto ที่กำหนดซึ่ง 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 หลังจากสร้าง