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 که از طریق چارچوب برنامه اندروید در معرض برنامه ها قرار می گیرد.
  • یک چارچوب کد بومی DRM، که رابطی را برای پلاگین‌های DRM (نمایندگان) برای مدیریت حقوق و رمزگشایی برای طرح‌های مختلف DRM نشان می‌دهد.
چارچوب DRM اندروید
شکل 2 الف. فریمورک DRM قبل از اندروید 11
چارچوب DRM اندروید
شکل 2b. فریمورک DRM که در اندروید 11 شروع می شود

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

پلاگین های DRM

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

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

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

پیاده سازی

برای پیاده سازی API های چارچوب های DRM جدید توسط یک افزونه:

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

APIها در هر نسخه IDrmPlugin.hal ، ICryptoPlugin.hal ، IDrmFactory.hal و ICryptoFactory.hal

PLATFORM_ROOT/hardware/interfaces/drm/VERSION/

افزودن سرویس پلاگین به فایل های ساخت دستگاه

به عنوان مثال، برای افزودن پشتیبانی از رابط 1.3، فایل VENDOR DEVICE /device.mk باید شامل بسته‌های android.hardware.drm@1.3-service.* باشد:

نسخه‌های 1.0 تا 1.2 در R / Android 11 منسوخ شده‌اند. دستگاه‌هایی که به R ارتقا می‌یابند همچنان مجاز به اجرای نسخه‌های 1.0 تا 1.2 هستند. با این حال، دستگاه های جدیدی که با R راه اندازی می شوند باید فقط نسخه 1.3 را اجرا کنند.


  PRODUCT_PACKAGES += \
    android.hardware.drm@1.0-impl \
    android.hardware.drm@1.0-service \
    android.hardware.drm@1.3-service.clearkey \
    android.hardware.drm@1.3-service.widevine

در حال به روز رسانی مانیفست دستگاه

فایل vendor manifest.xml برای دستگاه باید شامل ورودی‌های زیر باشد:


  <hal format="hidl">
    <name>android.hardware.drm</name>
      <transport>hwbinder</transport>
      <fqname>@1.3::ICryptoFactory/clearkey</fqname>
      <fqname>@1.3::IDrmFactory/clearkey</fqname>
      <fqname>@1.3::ICryptoFactory/widevine</fqname>
      <fqname>@1.3::IDrmFactory/widevine</fqname>
  </hal>

متناوبا، توصیه می کنیم از 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@\[0-9]+\.[0-9]+-service\.clearkey
          u:object_r:hal_drm_clearkey_exec:s0
    /data/vendor/mediadrm(/.*)? u:object_r:mediadrm_vendor_data_file:s0

    متناوبا، شماره نسخه ها را مطابق شکل زیر به روز کنید.

    /vendor/bin/hw/android\.hardware\.drm@1\.3-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
    allow hal_drm_clearkey mediadrm_vendor_data_file:dir create_dir_perms;
        allow hal_drm_clearkey mediadrm_vendor_data_file:file create_file_perms;
        

ایجاد یک فایل .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 فروشنده از طریق CreativePlugin API است. CreativePlugin API برای ایجاد نمونه های IDrmPlugin استفاده می شود. IDrmFactory 1.3 همیشه باید 1.2 رابط IDrmPlugin ایجاد کند که از طریق روش 1.0 createPlugin برگردانده می شود.

Return<void> getSupportedCryptoSchemes(getSupportedCryptoSchemes_cb _hidl_cb);

getSupportedCryptoSchemes جدید در 1.3 IDrmFactory، فهرستی از طرح های رمزنگاری پشتیبانی شده را برای نمونه HIDL drm HAL برمی گرداند.

Return<bool> isCryptoSchemeSupported(const hidl_array<uint8_t, 16>uuid);

تعیین می‌کند که آیا کارخانه افزونه‌ها قادر به ساخت افزونه‌های DRM هستند که از یک طرح رمزنگاری معین پشتیبانی می‌کنند، که توسط یک UUID مشخص شده است.

Return<bool> isContentTypeSupported(const hidl_string &mimeType);

تعیین می‌کند که آیا کارخانه افزونه‌ها قادر به ساخت پلاگین‌های DRM هستند که از فرمت محفظه رسانه مشخص شده توسط mimeType پشتیبانی می‌کنند.

Return<void> createPlugin(const hidl_array<uint8_t, 16>uuid,
        const hidl_string& appPackageName, createPlugin_cb _hidl_cb);

یک پلاگین DRM برای طرح رمزنگاری مشخص شده توسط UUID می سازد.

CryptoFactory

کلاس CryptoHal خدمات پلاگین DRM ثبت شده را جستجو می کند و افزونه های مربوطه را می سازد که از یک طرح رمزنگاری معین از طریق کلاس CryptoFactory می کنند.

Return<bool> isCryptoSchemeSupported(const hidl_array<uint8_t, 16>uuid);

تعیین می کند که آیا کارخانه کریپتو قادر به ساخت پلاگین های رمزنگاری است که از یک طرح رمزنگاری معین پشتیبانی می کند، که توسط یک UUID مشخص شده است.

Return<void> createPlugin(const hidl_array<uint8_t, 16>uuid,
        const hidl_vec<uint8_t>initData, createPlugin_cb _hidl_cb)

تعیین می‌کند که آیا کارخانه افزونه‌ها قادر به ساخت پلاگین‌های رمزنگاری هستند که از یک طرح رمزنگاری معین پشتیبانی می‌کنند، که توسط یک UUID مشخص شده است.

پلاگین DRM

APIها در hardware/interfaces/drm/ VERSION /IDrmPlugin.hal . فایل IDrmPlugin.h مربوطه را می توان در out/oong پس از ساخت پیدا کرد.