डीआरएम

Android DRM HAL का आइकॉन

इस दस्तावेज़ में, Android डिजिटल राइट मैनेजमेंट (डीआरएम) फ़्रेमवर्क के बारे में खास जानकारी दी गई है. साथ ही, उन इंटरफ़ेस के बारे में बताया गया है जिन्हें डीआरएम प्लग इन को लागू करना होगा. इस दस्तावेज़ में, डीआरएम स्कीम के तहत तय किए गए, मज़बूत सुरक्षा के नियमों या कानूनों का पालन करने के नियमों के बारे में नहीं बताया गया है.

फ़्रेमवर्क

Android प्लैटफ़ॉर्म, एक्सटेंसिबल डीआरएम फ़्रेमवर्क उपलब्ध कराता है. इसकी मदद से, ऐप्लिकेशन, कॉन्टेंट से जुड़ी लाइसेंस की पाबंदियों के हिसाब से, अधिकारों से सुरक्षित कॉन्टेंट को मैनेज कर सकते हैं. डीआरएम फ़्रेमवर्क, कई डीआरएम स्कीम के साथ काम करता है. हालांकि, यह डिवाइस बनाने वाली कंपनी तय करती है कि डिवाइस पर कौनसी डीआरएम स्कीम काम करेंगी. डीआरएम फ़्रेमवर्क, ऐप्लिकेशन डेवलपर के लिए एक यूनिफ़ाइड इंटरफ़ेस उपलब्ध कराता है. साथ ही, डीआरएम के काम करने के तरीके को आसान बनाता है. डीआरएम फ़्रेमवर्क, सुरक्षित और असुरक्षित कॉन्टेंट के लिए एक जैसा ऑपरेशन मोड उपलब्ध कराता है. डीआरएम स्कीम, लाइसेंस मेटाडेटा के हिसाब से इस्तेमाल के जटिल मॉडल तय कर सकते हैं. डीआरएम फ़्रेमवर्क, डीआरएम कॉन्टेंट और लाइसेंस के बीच संबंध बनाता है. साथ ही, कॉन्टेंट के अधिकारों को मैनेज करता है. इससे मीडिया प्लेयर को डीआरएम से सुरक्षित या बिना सुरक्षा वाले कॉन्टेंट से अलग किया जा सकता है. सुरक्षित मीडिया स्ट्रीम को डिक्रिप्ट करने के लिए कुंजियां पाने के लिए, क्लास के लिए MediaDrm देखें.

Android DRM HAL
पहली इमेज. Android 11 से पहले की DRM हार्डवेयर एब्स्ट्रैक्शन लेयर
Android R के बाद का DRM HAL
पहली इमेज. Android 11 में शुरू होने वाला डीआरएम हार्डवेयर ऐब्स्ट्रैक्शन लेयर

मोबाइल डिवाइसों का इस्तेमाल करने वाले लोगों के लिए, शानदार डिजिटल कॉन्टेंट की उपलब्धता ज़रूरी है. Android डेवलपर और डिजिटल कॉन्टेंट पब्लिशर को, अपने कॉन्टेंट को बड़े पैमाने पर उपलब्ध कराने के लिए, Android के सभी प्लैटफ़ॉर्म पर काम करने वाले डीआरएम (डिजिटल राइट मैनेजमेंट) को लागू करना ज़रूरी है. उस डिजिटल कॉन्टेंट को Android डिवाइसों पर उपलब्ध कराने के लिए और यह पक्का करने के लिए कि सभी डिवाइसों पर कम से कम एक डीआरएम उपलब्ध हो, Google, काम करने वाले Android डिवाइसों पर लाइसेंस शुल्क के बिना डीआरएम उपलब्ध कराता है. डीआरएम प्लग इन, Android डीआरएम फ़्रेमवर्क के साथ इंटिग्रेट होता है. साथ ही, यह प्रीमियम कॉन्टेंट और उपयोगकर्ता के क्रेडेंशियल को सुरक्षित रखने के लिए, हार्डवेयर की मदद से सुरक्षा की सुविधा का इस्तेमाल कर सकता है.

डीआरएम प्लग इन से मिलने वाली कॉन्टेंट सुरक्षा, इस्तेमाल किए जा रहे हार्डवेयर प्लैटफ़ॉर्म की सुरक्षा और कॉन्टेंट की सुरक्षा से जुड़ी सुविधाओं पर निर्भर करती है. डिवाइस की हार्डवेयर सुविधाओं में, हार्डवेयर से सुरक्षित बूट की सुविधा शामिल होनी चाहिए. इससे, क्रिप्टोग्राफ़िक कुंजियों की सुरक्षा और भरोसे की चेन को सेट अप किया जा सकता है. डिवाइस में कॉन्टेंट की सुरक्षा से जुड़ी सुविधाओं में, डिवाइस में डिक्रिप्ट किए गए फ़्रेम की सुरक्षा और भरोसेमंद आउटपुट सुरक्षा प्रोसेस की मदद से कॉन्टेंट की सुरक्षा शामिल होनी चाहिए. सभी हार्डवेयर प्लैटफ़ॉर्म पर, ऊपर बताई गई सुरक्षा और कॉन्टेंट की सुरक्षा से जुड़ी सभी सुविधाएं काम नहीं करतीं. सुरक्षा को स्टैक में कभी भी एक ही जगह पर लागू नहीं किया जाता. इसके बजाय, यह हार्डवेयर, सॉफ़्टवेयर, और सेवाओं के इंटिग्रेशन पर निर्भर करता है. सुरक्षित डिवाइस उपलब्ध कराने के लिए, हार्डवेयर की सुरक्षा से जुड़े फ़ंक्शन, भरोसेमंद बूट मैकेनिज्म, और सुरक्षा से जुड़े फ़ंक्शन को मैनेज करने के लिए अलग से सुरक्षित ओएस का होना ज़रूरी है.

भवन निर्माण

डीआरएम फ़्रेमवर्क को इस तरह से डिज़ाइन किया गया है कि इसे किसी भी प्लैटफ़ॉर्म पर लागू किया जा सके. साथ ही, यह किसी खास डीआरएम स्कीम को लागू करने की जानकारी को, स्कीम के हिसाब से डीआरएम प्लग इन में शामिल करता है. डीआरएम फ़्रेमवर्क में आसान एपीआई शामिल होते हैं. इनकी मदद से, डीआरएम से जुड़े मुश्किल कामों को मैनेज किया जा सकता है. जैसे, लाइसेंस हासिल करना, डिवाइस को कॉन्फ़िगर करना, डीआरएम कॉन्टेंट और उसके लाइसेंस को जोड़ना, और आखिर में डीआरएम कॉन्टेंट को डिक्रिप्ट करना.

Android डीआरएम फ़्रेमवर्क को दो लेयर में लागू किया गया है:

  • डीआरएम फ़्रेमवर्क एपीआई, जो Android ऐप्लिकेशन फ़्रेमवर्क के ज़रिए ऐप्लिकेशन के लिए उपलब्ध होता है.
  • एक नेटिव कोड डीआरएम फ़्रेमवर्क, जो डीआरएम प्लग इन (एजेंट) के लिए इंटरफ़ेस दिखाता है. इससे, डीआरएम की अलग-अलग स्कीम के लिए, अधिकारों को मैनेज करने और डिक्रिप्ट (सुरक्षित) करने की सुविधा मिलती है.
Android डीआरएम फ़्रेमवर्क
दूसरी इमेज. Android 11 से पहले का डीआरएम फ़्रेमवर्क
Android डीआरएम फ़्रेमवर्क
दूसरी इमेज. Android 11 में डीआरएम फ़्रेमवर्क की शुरुआत

ज़्यादा जानकारी के लिए, Android मीडिया डीआरएम और Android मीडिया क्रिप्टो देखें.

डीआरएम प्लग इन

सिस्टम के स्टार्टअप होने पर, डीआरएम फ़्रेमवर्क, एचएएल इंस्टेंस/सेवाओं (.rc फ़ाइलों में बताई गई) को स्कैन करता है और प्लग इन ढूंढता है. मीडिया डीआरएम सर्वर (mediadrmserver), CryptoHal और DrmHal, दोनों ऑब्जेक्ट बनाता है. इसके बाद, CryptoHal और DrmHal, वेंडर के हिसाब से लागू किए गए प्लगिन को कॉल करते हैं.

प्लग इन में, बाइंडर वाले एचएएल लागू होने चाहिए. बाइंडर वाले एचएएल, Android इंटरफ़ेस डेफ़िनिशन लैंग्वेज (एआईडीएल) का इस्तेमाल करते हैं. इससे एचएएल को फिर से बनाने के बिना, फ़्रेमवर्क को बदला जा सकता है.

प्लग इन, वेंडर या SoC बनाने वाली कंपनियां बनाती हैं और उन्हें डिवाइस पर /vendor सेक्शन में डालती हैं. Android 13 या इसके बाद के वर्शन के साथ लॉन्च होने वाले सभी डिवाइसों में, एआईडीएल भाषा में लिखे गए बाइंडर किए गए एचएएल काम करने चाहिए.

लागू करना

Android 13 के लिए GMS और AOSP डिवाइस रिलीज़ में, AIDL इंटरफ़ेस का इस्तेमाल करना ज़रूरी है.

प्लग इन की मदद से नए डीआरएम फ़्रेमवर्क एपीआई लागू करने के लिए:

  1. डिवाइस की बिल्ड फ़ाइलों में प्लग इन सेवा जोड़ें.
  2. डिवाइस मेनिफ़ेस्ट को अपडेट करें.
  3. SELinux की अनुमतियां जोड़ें.
  4. /vendor में जाकर, .rc फ़ाइल बनाएं.
  5. प्लग इन लागू करें.

एपीआई, 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)
        

/vendor में RC फ़ाइल बनाना

.rc फ़ाइल से पता चलता है कि सेवा लॉन्च होने पर क्या कार्रवाई की जानी है.

ज़्यादा जानकारी के लिए, Android Init Language देखें.

प्लग इन लागू करना

  1. प्लग इन सेवा के service.cpp में main() एंट्री पॉइंट लागू करें.
  2. ICryptoPlugin, IDrmPlugin, ICryptoFactory, और IDrmFactory लागू करें.
  3. प्लग इन में नए एपीआई लागू करें.

डीआरएम प्लग इन की जानकारी

डीआरएम प्लग इन वेंडर, DrmFactory, CryptoFactory, और डीआरएम प्लग इन लागू करते हैं.

DrmFactory

DrmHal क्लास, रजिस्टर की गई डीआरएम प्लगिन सेवाओं को खोजती है और DrmFactory क्लास की मदद से, किसी क्रिप्टो स्कीम के साथ काम करने वाले प्लगिन बनाती है.

createPlugin API की मदद से, किसी वेंडर के drm HAL के साथ इंटरैक्ट करने के लिए, IDrmFactory मुख्य एंट्री पॉइंट है. createPlugin 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);

इससे यह तय होता है कि प्लग इन फ़ैक्ट्री, यूयूआईडी से तय की गई किसी क्रिप्टो स्कीम के साथ काम करने वाले डीआरएम प्लग इन बना सकती है या नहीं.

::ndk::ScopedAStatus isContentTypeSupported(const std::string& in_mimeType,
    bool* _aidl_return);

इससे यह तय होता है कि प्लग इन फ़ैक्ट्री, 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);

UUID से तय की गई क्रिप्टो स्कीम के लिए, डीआरएम प्लग इन बनाता है.

CryptoFactory

CryptoHal क्लास, रजिस्टर की गई डीआरएम प्लगिन सेवाओं को खोजती है और CryptoFactory क्लास की मदद से, किसी क्रिप्टो स्कीम के साथ काम करने वाले प्लगिन बनाती है.

::ndk::ScopedAStatus isCryptoSchemeSupported(
    const ::aidl::android::hardware::drm::Uuid& in_uuid,
    bool* _aidl_return);

इससे यह तय होता है कि क्रिप्टो फ़ैक्ट्री, क्रिप्टो स्कीम के साथ काम करने वाले क्रिप्टो प्लग इन बना सकती है या नहीं. क्रिप्टो स्कीम को यूनीक आइडेंटिफ़ायर (यूआईडी) से दिखाया जाता है.

::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);

इससे यह तय होता है कि प्लग इन फ़ैक्ट्री, यूयूआईडी से तय की गई किसी क्रिप्टो स्कीम के साथ काम करने वाले क्रिप्टो प्लग इन बना सकती है या नहीं.

डीआरएम प्लग इन एपीआई

एपीआई के बारे में hardware/interfaces/drm/aidl/aidl_api/android.hardware.drm/ VERSION/android/hardware/drm/IDrmPlugin.aidl में बताया गया है. बने प्रोग्राम के बाद, उससे जुड़ी IDrmPlugin.h फ़ाइल को out/Soong में देखा जा सकता है.