DRM

نماد اندروید DRM HAL

این صفحه یک نمای کلی از چارچوب مدیریت حقوق دیجیتال اندروید (DRM) ارائه می‌کند و رابط‌هایی را که یک پلاگین DRM باید پیاده‌سازی کند، معرفی می‌کند. این صفحه قوانین استحکام یا قوانین انطباق را که ممکن است توسط یک طرح DRM تعریف شده باشد، توصیف نمی کند.

چارچوب

پلتفرم Android یک چارچوب DRM توسعه‌یافته ارائه می‌کند که به برنامه‌ها اجازه می‌دهد محتوای محافظت‌شده با حقوق را مطابق محدودیت‌های مجوز مرتبط با محتوا مدیریت کنند. چارچوب DRM از بسیاری از طرح های DRM پشتیبانی می کند. سازنده دستگاه تعیین می کند که یک دستگاه از کدام طرح های DRM پشتیبانی می کند. چارچوب DRM یک رابط یکپارچه برای توسعه دهندگان برنامه فراهم می کند و پیچیدگی عملیات DRM را پنهان می کند. چارچوب DRM یک حالت عملکرد ثابت برای محتوای محافظت شده و غیر محافظت شده فراهم می کند. طرح‌های DRM می‌توانند مدل‌های استفاده پیچیده را با فراداده مجوز تعریف کنند. چارچوب DRM ارتباط بین محتوای DRM و مجوز را فراهم می کند و مدیریت حقوق را مدیریت می کند. این به پخش کننده رسانه امکان می دهد از محتوای محافظت شده یا غیر محافظت شده با DRM انتزاع شود. برای دریافت کلیدهایی برای رمزگشایی جریان های رسانه ای محافظت شده، کلاس MediaDrm را ببینید.

شکل 1 لایه استخراج سخت افزار DRM را قبل از اندروید 11 نشان می دهد و شکل 2 لایه را در اندروید 11 و بالاتر نشان می دهد:

اندروید DRM HAL

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

Android DRM HAL در اندروید 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 و بالاتر نشان می دهد:

چارچوب اندروید DRM

شکل 3. چارچوب DRM قبل از اندروید 11.

فریم ورک اندروید 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 جدید توسط یک افزونه:

  1. سرویس افزونه را به فایل های ساخت دستگاه اضافه کنید.
  2. مانیفست دستگاه را به روز کنید.
  3. مجوزهای SELinux را اضافه کنید.
  4. یک فایل .rc در زیر /vendor ایجاد کنید.
  5. افزونه را پیاده سازی کنید.

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 را اضافه کنید

  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-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 اضافه کنید:
        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 مراجعه کنید.

افزونه را پیاده سازی کنید

  1. نقطه ورودی main() را در service.cpp سرویس پلاگین پیاده سازی کنید.
  2. ICryptoPlugin ، IDrmPlugin ، ICryptoFactory و IDrmFactory را پیاده سازی کنید.
  3. 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 پس از ساخت پیدا کرد.