
این صفحه مروری بر چارچوب مدیریت حقوق دیجیتال (DRM) اندروید ارائه میدهد و رابطهایی را که یک افزونه DRM باید پیادهسازی کند، معرفی میکند. این صفحه قوانین پایداری یا قوانین انطباق را که ممکن است توسط یک طرح DRM تعریف شوند، شرح نمیدهد.
چارچوب
پلتفرم اندروید یک چارچوب DRM توسعهپذیر ارائه میدهد که به برنامهها اجازه میدهد محتوای دارای حق نشر را بر اساس محدودیتهای مجوز مرتبط با محتوا مدیریت کنند. چارچوب DRM از بسیاری از طرحهای DRM پشتیبانی میکند؛ سازنده دستگاه تعیین میکند که دستگاه از کدام طرحهای DRM پشتیبانی میکند. چارچوب DRM یک رابط کاربری یکپارچه برای توسعهدهندگان برنامه فراهم میکند و پیچیدگی عملیات DRM را پنهان میکند. چارچوب DRM یک حالت عملیاتی سازگار برای محتوای محافظتشده و محافظتنشده ارائه میدهد. طرحهای DRM میتوانند مدلهای استفاده پیچیده را با استفاده از فراداده مجوز تعریف کنند. چارچوب DRM ارتباط بین محتوای DRM و مجوز را فراهم میکند و مدیریت حقوق را مدیریت میکند. این امر پخشکننده رسانه را قادر میسازد تا از محتوای محافظتشده یا محافظتنشده DRM جدا شود. برای دریافت کلیدهای رمزگشایی جریانهای رسانهای محافظتشده، به MediaDrm مراجعه کنید.
شکل ۱ لایه استخراج سختافزاری DRM را قبل از اندروید ۱۱ و شکل ۲ این لایه را در اندروید ۱۱ و بالاتر نشان میدهد:

شکل ۱. لایه انتزاعی سختافزاری DRM قبل از اندروید ۱۱.

شکل ۲. لایه انتزاعی سختافزاری DRM که از اندروید ۱۱ شروع میشود.
دسترسی به محتوای غنی دیجیتال برای کاربران دستگاههای تلفن همراه مهم است. برای اینکه محتوای آنها به طور گسترده در دسترس قرار گیرد، توسعهدهندگان اندروید و ناشران محتوای دیجیتال به یک پیادهسازی DRM سازگار نیاز دارند که در سراسر اکوسیستم اندروید پشتیبانی شود. برای اینکه این محتوای دیجیتال در دستگاههای اندروید در دسترس قرار گیرد و اطمینان حاصل شود که حداقل یک DRM سازگار در همه دستگاهها در دسترس است، گوگل DRM را بدون هزینه مجوز در دستگاههای سازگار اندروید ارائه میدهد. افزونه DRM با چارچوب DRM اندروید یکپارچه شده است و میتواند از محافظت سختافزاری برای ایمنسازی محتوای پریمیوم و اعتبارنامههای کاربر استفاده کند.
حفاظت از محتوای ارائه شده توسط افزونه DRM به قابلیتهای امنیتی و حفاظت از محتوای پلتفرم سختافزاری زیربنایی بستگی دارد. قابلیتهای سختافزاری دستگاه باید شامل بوت امن سختافزاری برای ایجاد زنجیره اعتماد امنیتی و حفاظت از کلیدهای رمزنگاری باشد. قابلیتهای حفاظت از محتوای دستگاه باید شامل حفاظت از فریمهای رمزگشایی شده در دستگاه و حفاظت از محتوا از طریق یک مکانیسم حفاظت خروجی قابل اعتماد باشد. همه پلتفرمهای سختافزاری از همه ویژگیهای امنیتی و حفاظت از محتوای فوق پشتیبانی نمیکنند. امنیت هرگز در یک مکان واحد در پشته پیادهسازی نمیشود، بلکه به ادغام سختافزار، نرمافزار و خدمات متکی است. ترکیب عملکردهای امنیتی سختافزاری، یک مکانیسم بوت قابل اعتماد و یک سیستمعامل امن ایزوله برای مدیریت عملکردهای امنیتی، برای ارائه یک دستگاه امن بسیار مهم است.
معماری
چارچوب DRM به گونهای طراحی شده است که مستقل از پیادهسازی باشد و جزئیات پیادهسازی طرح DRM خاص را در یک افزونه DRM مختص طرح، خلاصه میکند. چارچوب DRM شامل APIهای سادهای برای مدیریت عملیات پیچیده DRM، دریافت مجوزها، ارائه دستگاه، مرتبط کردن محتوای DRM و مجوز آن و در نهایت رمزگشایی محتوای DRM است.
چارچوب DRM اندروید در دو لایه معماری پیادهسازی شده است:
- یک API چارچوب DRM که از طریق چارچوب برنامه اندروید در دسترس برنامهها قرار میگیرد.
- یک چارچوب DRM با کد بومی، که رابطی را برای افزونههای DRM (عاملها) ارائه میدهد تا مدیریت حقوق و رمزگشایی را برای طرحهای مختلف DRM انجام دهد.
شکل ۳ چارچوب DRM قبل از اندروید ۱۱ و شکل ۴ چارچوب آن را در اندروید ۱۱ و بالاتر نشان میدهد:

شکل ۳. چارچوب DRM قبل از اندروید ۱۱.

شکل ۴. چارچوب DRM که از اندروید ۱۱ شروع میشود.
برای جزئیات بیشتر به MediaDrm و MediaCrypto مراجعه کنید.
افزونههای DRM
در هنگام راهاندازی سیستم، چارچوب DRM نمونهها و سرویسهای HAL (که در فایلهای .rc شرح داده شدهاند) را اسکن کرده و افزونهها را کشف میکند. Media DRM Server ( mediadrmserver ) هر دو شیء CryptoHal و DrmHal را ایجاد میکند. CryptoHal و DrmHal سپس افزونهها را با پیادهسازیهای خاص فروشنده فراخوانی میکنند.
افزونهها باید HALهای بایندری (binderized HALs) را پیادهسازی کنند. HALهای بایندری از زبان تعریف رابط اندروید (AIDL) استفاده میکنند که امکان جایگزینی فریمورک را بدون نیاز به بازسازی HALها فراهم میکند.
افزونهها توسط فروشندگان یا سازندگان SOC ساخته میشوند و در پارتیشن /vendor روی دستگاه قرار میگیرند. همه دستگاههایی که با اندروید ۱۳ یا بالاتر عرضه میشوند باید از HALهای binderized نوشته شده به زبان 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، شماره نسخه هر نسخه از API AIDL است (برای مثال، ۱، ۲). به عنوان جایگزین، توصیه میکنیم از 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 اقداماتی را که باید هنگام راهاندازی یک سرویس انجام شوند، مشخص میکند.
برای جزئیات بیشتر به زبان اولیه اندروید مراجعه کنید.
پیاده سازی افزونه
- نقطه ورودی
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);
رابطهای برنامهنویسی کاربردی افزونههای DRM
APIها درhardware/interfaces/drm/aidl/aidl_api/android.hardware.drm/ VERSION /android/hardware/drm/IDrmPlugin.aidl تعریف شدهاند. فایل IDrmPlugin.h مربوطه را میتوانید پس از ساخت در out/Soong پیدا کنید.