DRM

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

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

چارچوب

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

اندروید DRM HAL
شکل 1a. لایه انتزاعی سخت افزار DRM قبل از اندروید 11
پست اندروید DRM HAL R
شکل 1b. لایه انتزاعی سخت افزاری 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 نشان می‌دهد.
چارچوب DRM اندروید
شکل 2 الف. فریمورک DRM قبل از اندروید 11
چارچوب DRM اندروید
شکل 2b. فریمورک DRM که در اندروید 11 شروع می شود

برای جزئیات بیشتر به Android Media DRM و Android Media Crypto مراجعه کنید.

پلاگین های DRM

در راه‌اندازی سیستم، چارچوب DRM برای نمونه‌ها/خدمات HAL (توضیح‌شده در فایل‌های .rc ) اسکن می‌کند و افزونه‌ها کشف می‌شوند. سرور رسانه DRM ( mediadrmserver ) هم اشیاء CryptoHal و هم DrmHal را ایجاد می کند. سپس CryptoHal و DrmHal پلاگین ها را با پیاده سازی های خاص فروشنده فراخوانی می کنند.

پلاگین ها باید HAL های بایندر شده را پیاده سازی کنند. HAL‌های بایندر شده از زبان تعریف رابط اندروید (AIDL) استفاده می‌کنند که اجازه می‌دهد چارچوب بدون نیاز به بازسازی HAL جایگزین شود.

پلاگین ها توسط فروشندگان یا سازندگان SOC ساخته می شوند و در یک پارتیشن /vendor بر روی دستگاه قرار می گیرند. همه دستگاه‌هایی که با Android 13 یا بالاتر راه‌اندازی می‌شوند باید از HAL‌های بایندر شده که به زبان AIDL نوشته شده‌اند پشتیبانی کنند.

پیاده سازی

دستگاه‌های GMS و AOSP برای Android 13 باید از رابط 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>

STABLE AIDL VERSION شماره نسخه هر نسخه 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 API است. CreativePlugin 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);

تعیین می کند که آیا کارخانه کریپتو قادر به ساخت افزونه های رمزنگاری است که از یک طرح رمزنگاری معین پشتیبانی می کند، که توسط یک 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 پس از ساخت پیدا کرد.