डीआरएम

Android DRM HAL का आइकॉन

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

फ़्रेमवर्क

Android प्लैटफ़ॉर्म, एक्सटेंसिबल डीआरएम फ़्रेमवर्क उपलब्ध कराता है. इसकी मदद से, ऐप्लिकेशन, कॉन्टेंट से जुड़ी लाइसेंस की शर्तों के मुताबिक, अधिकारों से सुरक्षित कॉन्टेंट को मैनेज कर सकते हैं. डीआरएम फ़्रेमवर्क, कई डीआरएम स्कीम के साथ काम करता है. हालांकि, यह डिवाइस बनाने वाली कंपनी तय करती है कि डिवाइस पर कौनसी डीआरएम स्कीम काम करेंगी. डीआरएम फ़्रेमवर्क, ऐप्लिकेशन डेवलपर के लिए एक यूनिफ़ाइड इंटरफ़ेस उपलब्ध कराता है. साथ ही, डीआरएम के काम करने के तरीके को आसान बनाता है. DRM फ़्रेमवर्क, सुरक्षित और असुरक्षित कॉन्टेंट के लिए एक जैसा ऑपरेशन मोड उपलब्ध कराता है. डीआरएम स्कीम, लाइसेंस मेटाडेटा के हिसाब से इस्तेमाल के जटिल मॉडल तय कर सकते हैं. डीआरएम फ़्रेमवर्क, डीआरएम कॉन्टेंट और लाइसेंस के बीच संबंध बनाता है. साथ ही, कॉन्टेंट के अधिकारों को मैनेज करता है. इससे मीडिया प्लेयर को डीआरएम से सुरक्षित या बिना सुरक्षा वाले कॉन्टेंट से अलग किया जा सकता है. सुरक्षित मीडिया स्ट्रीम को डिक्रिप्ट करने के लिए कुंजियां पाने के लिए, क्लास के लिए 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 फ़ाइलों में बताया गया है) और प्लगिन के लिए स्कैन करता है. मीडिया DRM सर्वर (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 क्लास की मदद से, किसी क्रिप्टो स्कीम के साथ काम करने वाले प्लगिन बनाती है.

IDrm तौर-तरीके, किसी वेंडर के dRM HAL के साथ इंटरैक्ट करने का मुख्य एंट्री पॉइंट है. इसके लिए, उसे create लोग API की मदद से इस्तेमाल किया जाता है. 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);

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

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 में मिल सकती है.