
این صفحه یک نمای کلی از چارچوب مدیریت حقوق دیجیتال اندروید (DRM) ارائه میکند و رابطهایی را که یک پلاگین DRM باید پیادهسازی کند، معرفی میکند. این صفحه قوانین استحکام یا قوانین انطباق را که ممکن است توسط یک طرح DRM تعریف شده باشد، توصیف نمی کند.
چارچوب
پلتفرم Android یک چارچوب DRM توسعهیافته ارائه میکند که به برنامهها اجازه میدهد محتوای محافظتشده با حقوق را مطابق محدودیتهای مجوز مرتبط با محتوا مدیریت کنند. چارچوب DRM از بسیاری از طرح های DRM پشتیبانی می کند. سازنده دستگاه تعیین می کند که یک دستگاه از کدام طرح های DRM پشتیبانی می کند. چارچوب DRM یک رابط یکپارچه برای توسعه دهندگان برنامه فراهم می کند و پیچیدگی عملیات DRM را پنهان می کند. چارچوب DRM یک حالت عملکرد ثابت برای محتوای محافظت شده و غیر محافظت شده فراهم می کند. طرحهای DRM میتوانند مدلهای استفاده پیچیده را با فراداده مجوز تعریف کنند. چارچوب DRM ارتباط بین محتوای DRM و مجوز را فراهم می کند و مدیریت حقوق را مدیریت می کند. این به پخش کننده رسانه امکان می دهد از محتوای محافظت شده یا غیر محافظت شده با DRM انتزاع شود. برای دریافت کلیدهایی برای رمزگشایی جریان های رسانه ای محافظت شده، کلاس MediaDrm را ببینید.
شکل 1 لایه استخراج سخت افزار DRM را قبل از اندروید 11 نشان می دهد و شکل 2 لایه را در اندروید 11 و بالاتر نشان می دهد:
شکل 1. لایه انتزاعی سخت افزار DRM قبل از اندروید 11.
شکل 2. لایه انتزاعی سخت افزار DRM که در اندروید 11 شروع می شود.
در دسترس بودن محتوای دیجیتالی غنی برای کاربران دستگاه های تلفن همراه مهم است. برای اینکه محتوای خود را به طور گسترده در دسترس قرار دهند، توسعه دهندگان اندروید و ناشران محتوای دیجیتال به یک پیاده سازی DRM ثابت نیاز دارند که در سراسر اکوسیستم اندروید پشتیبانی شود. برای در دسترس قرار دادن محتوای دیجیتال در دستگاههای Android و اطمینان از وجود حداقل یک DRM ثابت در همه دستگاهها، Google DRM را بدون هزینه مجوز در دستگاههای Android سازگار ارائه میکند. افزونه DRM با چارچوب Android DRM یکپارچه شده است و می تواند از محافظت سخت افزاری برای ایمن کردن محتوای ممتاز و اعتبار کاربر استفاده کند.
حفاظت از محتوای ارائه شده توسط افزونه DRM به امنیت و قابلیت های محافظت از محتوا در پلت فرم سخت افزاری زیرین بستگی دارد. قابلیتهای سختافزاری دستگاه باید شامل راهاندازی امن سختافزاری باشد تا زنجیرهای از اعتماد امنیت و حفاظت از کلیدهای رمزنگاری ایجاد شود. قابلیتهای حفاظت از محتوای دستگاه باید شامل محافظت از قابهای رمزگشایی شده در دستگاه و محافظت از محتوا از طریق مکانیزم حفاظت خروجی قابل اعتماد باشد. همه پلتفرمهای سختافزاری از همه ویژگیهای امنیتی و حفاظت محتوا در بالا پشتیبانی نمیکنند. امنیت هرگز در یک مکان واحد در پشته پیاده سازی نمی شود، بلکه به ادغام سخت افزار، نرم افزار و خدمات متکی است. ترکیبی از عملکردهای امنیتی سختافزار، مکانیزم راهاندازی قابل اعتماد، و سیستمعامل امن ایزوله برای مدیریت عملکردهای امنیتی برای ارائه یک دستگاه ایمن بسیار مهم است.
معماری
چارچوب DRM به گونهای طراحی شده است که پیادهسازی آگنوستیک باشد و جزئیات اجرای طرح DRM خاص را در یک پلاگین DRM ویژه طرح خلاصه میکند. چارچوب DRM شامل APIهای ساده برای مدیریت عملیات پیچیده DRM، دریافت مجوزها، ارائه دستگاه، مرتبط کردن محتوای DRM و مجوز آن و در نهایت رمزگشایی محتوای DRM است.
چارچوب Android DRM در دو لایه معماری پیاده سازی شده است:
- یک API چارچوب DRM، که از طریق چارچوب برنامه Android در معرض برنامه ها قرار می گیرد
- یک چارچوب کد بومی DRM، که یک رابط برای پلاگینها (نمایندگان) DRM برای مدیریت حقوق و رمزگشایی برای طرحهای مختلف DRM نشان میدهد.
شکل 3 چارچوب DRM را قبل از اندروید 11 نشان می دهد و شکل 4 چارچوب را در اندروید 11 و بالاتر نشان می دهد:
شکل 3. چارچوب DRM قبل از اندروید 11.
شکل 4. چارچوب DRM که در اندروید 11 شروع می شود.
برای جزئیات بیشتر به MediaDrm و MediaCrypto مراجعه کنید.
پلاگین های DRM
در راه اندازی سیستم، چارچوب DRM برای نمونه ها و سرویس های HAL (توضیح داده شده در فایل های .rc
) اسکن می کند و افزونه ها را کشف می کند. سرور رسانه DRM ( mediadrmserver
) هم اشیاء CryptoHal
و هم DrmHal
ایجاد می کند. سپس CryptoHal
و DrmHal
پلاگین ها را با پیاده سازی های خاص فروشنده فراخوانی می کنند.
پلاگین ها باید HAL های بایندر شده را پیاده سازی کنند. HALهای بایندر شده از زبان تعریف رابط اندروید (AIDL) استفاده میکنند که اجازه میدهد چارچوب بدون نیاز به بازسازی HAL جایگزین شود.
پلاگین ها توسط فروشندگان یا سازندگان SOC ساخته می شوند و در یک پارتیشن /vendor
بر روی دستگاه قرار می گیرند. همه دستگاههایی که با Android 13 یا بالاتر راهاندازی میشوند باید از HALهای بایندر شده که به زبان 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 Init Language مراجعه کنید.
افزونه را پیاده سازی کنید
- نقطه ورودی
main()
را درservice.cpp
سرویس پلاگین پیاده سازی کنید. -
ICryptoPlugin
،IDrmPlugin
،ICryptoFactory
وIDrmFactory
را پیاده سازی کنید. - API های جدید را در افزونه پیاده سازی کنید.
جزئیات افزونه DRM
فروشندگان پلاگین DRM DrmFactory
، CryptoFactory
و پلاگین DRM را پیاده سازی می کنند.
کلاس DrmFactory
کلاس DrmHal
خدمات پلاگین DRM ثبت شده را جستجو می کند و پلاگین های مربوطه را می سازد که از یک طرح رمزنگاری معین از طریق کلاس DrmFactory
پشتیبانی می کنند.
IDrmFactory
نقطه ورود اصلی برای تعامل با DRM HAL فروشنده از طریق متد 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
پشتیبانی می کنند.
این دنباله تعیین میکند که آیا کارخانه کریپتو میتواند افزونههای رمزنگاری را بسازد که از یک طرح رمزنگاری معین پشتیبانی میکنند، که توسط یک 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
پس از ساخت پیدا کرد.