
เอกสารนี้แสดงภาพรวมของเฟรมเวิร์กการจัดการสิทธิ์ดิจิทัล (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 ถูกรวมเข้ากับเฟรมเวิร์ก Android DRM และสามารถใช้การป้องกันที่สนับสนุนฮาร์ดแวร์เพื่อรักษาความปลอดภัยเนื้อหาระดับพรีเมียมและข้อมูลรับรองผู้ใช้
การป้องกันเนื้อหาที่มีให้โดยปลั๊กอิน 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
จะเรียกใช้ปลั๊กอินด้วยการใช้งานเฉพาะของผู้ขาย
ปลั๊กอินควรใช้ Binderized HAL Binderized HAL ใช้ Android Interface Definition Language (AIDL) ซึ่งช่วยให้เปลี่ยนเฟรมเวิร์กได้โดยไม่ต้องสร้าง HAL ใหม่
ปลั๊กอินถูกสร้างขึ้นโดยผู้ขายหรือผู้ผลิต SOC และใส่พาร์ติชั่น /vendor
บนอุปกรณ์ อุปกรณ์ทั้งหมดที่เปิดตัวด้วย Android 13 ขึ้นไปต้องรองรับ Binderized HAL ที่เขียนด้วยภาษา AIDL
การดำเนินการ
อุปกรณ์ GMS และ AOSP ที่วางจำหน่ายสำหรับ Android 13 ต้องใช้อินเทอร์เฟซ AIDL
หากต้องการใช้ API เฟรมเวิร์ก DRM ใหม่โดยใช้ปลั๊กอิน:
- เพิ่มบริการปลั๊กอินให้กับไฟล์บิลด์ของอุปกรณ์
- อัปเดตรายการอุปกรณ์
- เพิ่มสิทธิ์ 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>
เวอร์ชัน AIDL ที่เสถียรคือหมายเลขเวอร์ชันของ 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
ใช้ปลั๊กอิน
- ใช้จุดเข้าใช้งาน
main()
ในservice.cpp
ของบริการปลั๊กอิน - ใช้
ICryptoPlugin
,IDrmPlugin
,ICryptoFactory
และIDrmFactory
- ใช้ API ใหม่ในปลั๊กอิน
รายละเอียดปลั๊กอิน DRM
ผู้จำหน่ายปลั๊กอิน DRM ใช้ปลั๊กอิน DrmFactory
, CryptoFactory
และ DRM
DrmFactory
คลาส DrmHal
ค้นหาบริการปลั๊กอิน DRM ที่ลงทะเบียน และสร้างปลั๊กอินที่เกี่ยวข้องซึ่งสนับสนุนรูปแบบการเข้ารหัสลับที่กำหนดผ่านคลาส DrmFactory
IDrmFactory เป็นจุดเริ่มต้นหลักสำหรับการโต้ตอบกับ drm HAL ของผู้ขายผ่าน createPlugin API API createPlugin ใช้เพื่อสร้างอินสแตนซ์ 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);
กำหนดว่าโรงงานการเข้ารหัสลับสามารถสร้างปลั๊กอินการเข้ารหัสลับที่รองรับรูปแบบการเข้ารหัสที่กำหนดซึ่งระบุโดย 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 หลังจากสร้าง