पूरी ड्राइव को एन्क्रिप्ट (सुरक्षित) करना

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

Android 4.4 में, पूरे डिस्क को एन्क्रिप्ट (सुरक्षित) करने की सुविधा पेश की गई थी. हालांकि, Android 5.0 में ये नई सुविधाएं पेश की गई थीं:

  • तेज़ी से एन्क्रिप्ट (सुरक्षित) करने की सुविधा बनाई गई है. यह सुविधा, डेटा पार्टीशन पर इस्तेमाल किए गए ब्लॉक को ही एन्क्रिप्ट (सुरक्षित) करती है, ताकि पहली बार बूट होने में ज़्यादा समय न लगे. फ़िलहाल, सिर्फ़ ext4 और f2fs फ़ाइलसिस्टम में फ़ास्ट एन्क्रिप्शन की सुविधा काम करती है.
  • पहले बूट पर एन्क्रिप्ट (सुरक्षित) करने के लिए, forceencrypt fstab फ़्लैग जोड़ा गया.
  • बिना पासवर्ड के पैटर्न और एन्क्रिप्शन की सुविधा जोड़ी गई है.
  • ट्रस्टेड एक्ज़ीक्यूशन एनवायरमेंट (टीईई) की साइनिंग सुविधा (जैसे कि TrustZone) का इस्तेमाल करके, एन्क्रिप्शन कुंजी के लिए हार्डवेयर की मदद से सुरक्षित किए गए स्टोरेज को जोड़ा गया. ज़्यादा जानकारी के लिए, एन्क्रिप्ट (सुरक्षित) की गई कुंजी को सेव करना लेख पढ़ें.

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

Android में पूरी डिस्क को सुरक्षित रखने की सुविधा कैसे काम करती है

Android में पूरी डिस्क को सुरक्षित रखने की सुविधा, dm-crypt पर आधारित होती है. यह कर्नल की एक सुविधा है, जो ब्लॉक डिवाइस लेयर पर काम करती है. इस वजह से, एन्क्रिप्शन की सुविधा, एम्बेड किए गए मल्टीमीडिया कार्ड (eMMC) और इसी तरह के फ़्लैश डिवाइसों के साथ काम करती है. ये डिवाइस, कर्नल को ब्लॉक डिवाइस के तौर पर दिखाते हैं. YAFFS के साथ एन्क्रिप्शन की सुविधा काम नहीं करती है. यह सीधे तौर पर रॉ NAND फ़्लैश चिप से कम्यूनिकेट करता है.

एन्क्रिप्शन एल्गोरिदम, 128 ऐडवांस एन्क्रिप्शन स्टैंडर्ड (एईएस) है. इसमें साइफ़र-ब्लॉक चेनिंग (सीबीसी) और ESSIV:SHA256 का इस्तेमाल किया जाता है. मास्टर कुंजी को OpenSSL लाइब्रेरी को कॉल करके, 128-बिट एईएस की मदद से एन्क्रिप्ट (सुरक्षित) किया जाता है. आपको पासकोड के लिए 128 बिट या इससे ज़्यादा का इस्तेमाल करना होगा. हालांकि, 256 बिट का इस्तेमाल करना ज़रूरी नहीं है.

ध्यान दें: ओईएम, मास्टर की को एन्क्रिप्ट (सुरक्षित) करने के लिए 128-बिट या इससे ज़्यादा बिट का इस्तेमाल कर सकते हैं.

Android 5.0 रिलीज़ में, एन्क्रिप्शन की चार स्थितियां होती हैं:

  • डिफ़ॉल्ट
  • पिन
  • पासवर्ड
  • पैटर्न

पहली बार बूट करने पर, डिवाइस 128-बिट की मास्टर कुंजी बनाता है. इसके बाद, यह इसे डिफ़ॉल्ट पासवर्ड और सेव किए गए सॉल्ट के साथ हैश करता है. डिफ़ॉल्ट पासवर्ड यह है: "default_password" हालांकि, नतीजे के तौर पर मिले हैश पर टीईई (जैसे कि TrustZone) के ज़रिए भी हस्ताक्षर किया जाता है. यह मास्टर की को एन्क्रिप्ट करने के लिए, हस्ताक्षर के हैश का इस्तेमाल करता है.

Android Open Source Project की cryptfs.cpp फ़ाइल में, डिफ़ॉल्ट पासवर्ड देखा जा सकता है.

जब उपयोगकर्ता डिवाइस पर पिन/पास या पासवर्ड सेट करता है, तब सिर्फ़ 128-बिट की कुंजी को फिर से एन्क्रिप्ट किया जाता है और सेव किया जाता है. (जैसे, उपयोगकर्ता के पिन/पासवर्ड/पैटर्न में बदलाव करने से, उपयोगकर्ता के डेटा को फिर से एन्क्रिप्ट (सुरक्षित) नहीं किया जाता.) ध्यान दें कि मैनेज किए जा रहे डिवाइस पर, पिन, पैटर्न या पासवर्ड से जुड़ी पाबंदियां लागू हो सकती हैं.

एन्क्रिप्शन को init और vold मैनेज करते हैं. init कॉल vold करता है. साथ ही, vold init में इवेंट ट्रिगर करने के लिए प्रॉपर्टी सेट करता है. सिस्टम के अन्य हिस्से भी प्रॉपर्टी की जांच करते हैं, ताकि ये काम किए जा सकें: रिपोर्ट का स्टेटस देखना, पासवर्ड मांगना या गंभीर गड़बड़ी होने पर डिवाइस को फ़ैक्ट्री रीसेट करने के लिए कहना. vold में एन्क्रिप्शन की सुविधाओं को चालू करने के लिए, सिस्टम, कमांड लाइन टूल vdc के cryptfs कमांड का इस्तेमाल करता है: checkpw, restart, enablecrypto, changepw, cryptocomplete, verifypw, setfield, getfield, mountdefaultencrypted, getpwtype, getpw, और clearpw.

/data को एन्क्रिप्ट (सुरक्षित) करने, डिक्रिप्ट करने या वाइप करने के लिए, /data माउंट नहीं होना चाहिए. हालांकि, किसी भी यूज़र इंटरफ़ेस (यूआई) को दिखाने के लिए, फ़्रेमवर्क को शुरू करना होगा. साथ ही, फ़्रेमवर्क को चलाने के लिए /data की ज़रूरत होती है. इस समस्या को हल करने के लिए, /data पर कुछ समय के लिए फ़ाइल सिस्टम माउंट किया जाता है. इससे Android को पासवर्ड के लिए प्रॉम्प्ट करने, प्रोग्रेस दिखाने या ज़रूरत के मुताबिक डेटा मिटाने का सुझाव देने की अनुमति मिलती है. हालांकि, इसमें यह सीमा लागू होती है कि अस्थायी फ़ाइल सिस्टम से /data फ़ाइल सिस्टम पर स्विच करने के लिए, सिस्टम को अस्थायी फ़ाइल सिस्टम पर खुली हुई हर प्रोसेस को रोकना होगा. इसके बाद, उन प्रोसेस को /data फ़ाइल सिस्टम पर फिर से शुरू करना होगा. इसके लिए, सभी सेवाओं को इन तीन ग्रुप में से किसी एक में शामिल करना ज़रूरी है: core, main, और late_start.

  • core: शुरू होने के बाद कभी बंद न हो.
  • main: डिस्क का पासवर्ड डालने के बाद, शट डाउन करें और फिर से चालू करें.
  • late_start: यह तब तक शुरू नहीं होता, जब तक /data को डिक्रिप्ट और माउंट नहीं कर लिया जाता.

इन कार्रवाइयों को ट्रिगर करने के लिए, vold.decrypt प्रॉपर्टी को अलग-अलग स्ट्रिंग पर सेट किया जाता है. सेवाओं को बंद करने और फिर से चालू करने के लिए, init कमांड ये हैं:

  • class_reset: इससे सेवा बंद हो जाती है. हालांकि, इसे class_start की मदद से फिर से शुरू किया जा सकता है.
  • class_start: किसी सेवा को रीस्टार्ट करता है.
  • class_stop: यह सेवा को बंद कर देता है और SVC_DISABLED फ़्लैग जोड़ देता है. बंद की गई सेवाएं, class_start के अनुरोधों का जवाब नहीं देती हैं.

Flows

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

  • पहले से एन्क्रिप्ट (सुरक्षित) न किए गए डिवाइस को एन्क्रिप्ट (सुरक्षित) करें:
    • forceencrypt की मदद से नए डिवाइस को एन्क्रिप्ट (सुरक्षित) करें: पहली बार बूट करने पर एन्क्रिप्शन (सुरक्षित) करना ज़रूरी है (Android L से शुरू).
    • मौजूदा डिवाइस को एन्क्रिप्ट करना: उपयोगकर्ता की ओर से शुरू किया गया एन्क्रिप्शन (Android K और इससे पहले के वर्शन).
  • एन्क्रिप्ट (सुरक्षित) किए गए डिवाइस को बूट करना:
    • पासवर्ड के बिना एन्क्रिप्ट (सुरक्षित) किए गए डिवाइस को चालू करना: एन्क्रिप्ट (सुरक्षित) किए गए ऐसे डिवाइस को बूट करना जिसमें कोई पासवर्ड सेट नहीं किया गया है. यह Android 5.0 और इसके बाद के वर्शन पर चलने वाले डिवाइसों के लिए ज़रूरी है.
    • पासवर्ड की मदद से एन्क्रिप्ट (सुरक्षित) किए गए डिवाइस को शुरू करना: एन्क्रिप्ट (सुरक्षित) किए गए ऐसे डिवाइस को बूट करना जिस पर पासवर्ड सेट किया गया हो.

इन फ़्लो के अलावा, डिवाइस /data को एन्क्रिप्ट (सुरक्षित) करने में भी फ़ेल हो सकता है. यहां दिए गए सेक्शन में, हर फ़्लो के बारे में ज़्यादा जानकारी दी गई है.

forceencrypt का इस्तेमाल करके, नए डिवाइस को एन्क्रिप्ट (सुरक्षित) करना

Android 5.0 डिवाइस के लिए, यह सामान्य फ़र्स्ट बूट है.

  1. forceencrypt फ़्लैग की मदद से, बिना एन्क्रिप्ट किए गए फ़ाइल सिस्टम का पता लगाना

    /data को एन्क्रिप्ट (सुरक्षित) नहीं किया गया है. हालांकि, forceencrypt के लिए ऐसा करना ज़रूरी है. /data को अनमाउंट करें.

  2. डेटा को एन्क्रिप्ट (सुरक्षित) करना शुरू करें /data

    vold.decrypt = "trigger_encryption" ट्रिगर करता है init.rc, जिससे vold, /data को बिना पासवर्ड के एन्क्रिप्ट (सुरक्षित) करता है. (कोई भी डिवाइस सेट नहीं है, क्योंकि यह नया डिवाइस होना चाहिए.)

  3. tmpfs को माउंट करना

    vold, tmpfs /data को माउंट करता है (ro.crypto.tmpfs_options से tmpfs विकल्पों का इस्तेमाल करके) और vold.encrypt_progress प्रॉपर्टी को 0 पर सेट करता है. vold, एन्क्रिप्ट किए गए सिस्टम को बूट करने के लिए tmpfs /data तैयार करता है. साथ ही, vold.decrypt प्रॉपर्टी को trigger_restart_min_framework पर सेट करता है

  4. प्रोग्रेस दिखाने के लिए फ़्रेमवर्क को ऊपर लाना

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

  5. /data के एन्क्रिप्ट (सुरक्षित) होने पर, फ़्रेमवर्क को हटा दें

    vold vold.decrypt को trigger_default_encryption पर सेट करता है. इससे defaultcrypto सेवा शुरू हो जाती है. (इससे, सुरक्षित किए गए डिफ़ॉल्ट userdata को माउंट करने के लिए नीचे दिया गया फ़्लो शुरू हो जाता है.) trigger_default_encryption, एन्क्रिप्शन (सुरक्षित) करने के तरीके की जांच करता है. इससे यह पता चलता है कि /data को पासवर्ड के साथ या उसके बिना एन्क्रिप्ट (सुरक्षित) किया गया है. Android 5.0 वाले डिवाइसों को पहली बार बूट करने पर एन्क्रिप्ट किया जाता है. इसलिए, कोई पासवर्ड सेट नहीं होना चाहिए. इसलिए, हम /data को डिक्रिप्ट और माउंट करते हैं.

  6. माउंट /data

    इसके बाद, init, /data को tmpfs RAMDisk पर माउंट करता है. इसके लिए, वह ro.crypto.tmpfs_options से पैरामीटर लेता है. ro.crypto.tmpfs_options को init.rc में सेट किया जाता है.

  7. फ़्रेमवर्क शुरू करें

    vold, vold.decrypt को trigger_restart_framework पर सेट करता है. इससे बूट करने की सामान्य प्रोसेस जारी रहती है.

किसी मौजूदा डिवाइस को एन्क्रिप्ट (सुरक्षित) करना

जब Android K या इससे पहले के वर्शन वाले किसी ऐसे डिवाइस को एन्क्रिप्ट (सुरक्षित) किया जाता है जिसे L पर माइग्रेट किया गया हो, तो ऐसा होता है.

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

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

इनप्लेस एन्क्रिप्शन की सुविधा चालू करने के लिए, vold एक लूप शुरू करता है. इससे, असली ब्लॉक डिवाइस के हर सेक्टर को पढ़ा जाता है. इसके बाद, इसे क्रिप्टो ब्लॉक डिवाइस में लिखा जाता है. vold किसी सेक्टर को पढ़ने और लिखने से पहले यह जांच करता है कि वह इस्तेमाल में है या नहीं. इससे, ऐसे नए डिवाइस पर एन्क्रिप्शन की प्रोसेस बहुत तेज़ी से होती है जिसमें बहुत कम या कोई डेटा नहीं होता.

डिवाइस की स्थिति: ro.crypto.state = "unencrypted" सेट करें और बूटिंग जारी रखने के लिए, on nonencrypted init ट्रिगर को लागू करें.

  1. पासवर्ड की जांच करें

    यूज़र इंटरफ़ेस (यूआई), cryptfs enablecrypto inplace कमांड के साथ vold को कॉल करता है. इसमें passwd, उपयोगकर्ता की लॉक स्क्रीन का पासवर्ड होता है.

  2. फ़्रेमवर्क को हटाना

    vold गड़बड़ियों की जांच करता है. अगर यह एन्क्रिप्ट (सुरक्षित) नहीं कर पाता है, तो -1 दिखाता है. साथ ही, लॉग में इसकी वजह प्रिंट करता है. अगर यह एन्क्रिप्ट (सुरक्षित) कर सकता है, तो यह vold.decrypt प्रॉपर्टी को trigger_shutdown_framework पर सेट करता है. इससे init.rc, क्लास late_start और main में सेवाएं देना बंद कर देता है.

  3. क्रिप्टो फ़ुटर बनाना
  4. ब्रेडक्रंब फ़ाइल बनाना
  5. रीबूट करें
  6. ब्रेडक्रंब फ़ाइल का पता लगाना
  7. डेटा को एन्क्रिप्ट (सुरक्षित) करना शुरू करें /data

    vold इसके बाद, क्रिप्टो मैपिंग सेट अप करता है. इससे एक वर्चुअल क्रिप्टो ब्लॉक डिवाइस बनता है. यह डिवाइस, असली ब्लॉक डिवाइस पर मैप करता है. हालांकि, यह हर सेक्टर को लिखते समय एन्क्रिप्ट (सुरक्षित) करता है और पढ़ते समय डिक्रिप्ट (सुरक्षित तरीके से जानकारी को वापस पाना) करता है. vold इसके बाद, क्रिप्टो मेटाडेटा बनाता है और उसे लिखता है.

  8. डेटा को एन्क्रिप्ट (सुरक्षित) करते समय, tmpfs को माउंट करें

    vold, /data को tmpfs के तौर पर माउंट करता है (ro.crypto.tmpfs_options से tmpfs के विकल्पों का इस्तेमाल करके) और vold.encrypt_progress प्रॉपर्टी को 0 पर सेट करता है. vold एन्क्रिप्ट (सुरक्षित) किए गए सिस्टम को बूट करने के लिए, tmpfs /data तैयार करता है. साथ ही, vold.decrypt प्रॉपर्टी को trigger_restart_min_framework पर सेट करता है

  9. प्रोग्रेस दिखाने के लिए फ़्रेमवर्क को ऊपर लाना

    trigger_restart_min_framework की वजह से init.rc, main क्लास की सेवाएं शुरू करता है. जब फ़्रेमवर्क को पता चलता है कि vold.encrypt_progress को 0 पर सेट किया गया है, तो वह प्रोग्रेस बार यूज़र इंटरफ़ेस (यूआई) दिखाता है. यह यूज़र इंटरफ़ेस (यूआई), हर पांच सेकंड में उस प्रॉपर्टी के लिए क्वेरी करता है और प्रोग्रेस बार को अपडेट करता है. एन्क्रिप्शन लूप, vold.encrypt_progress को तब अपडेट करता है, जब वह पार्टीशन के किसी दूसरे हिस्से को एन्क्रिप्ट (सुरक्षित) करता है.

  10. जब /data एन्क्रिप्ट (सुरक्षित) किया गया हो, तब क्रिप्टो फ़ुटर अपडेट करें

    /data के एन्क्रिप्ट (सुरक्षित) हो जाने के बाद, vold मेटाडेटा में मौजूद फ़्लैग ENCRYPTION_IN_PROGRESS को हटा देता है.

    डिवाइस के अनलॉक होने के बाद, पासवर्ड का इस्तेमाल मास्टर पासकोड को एन्क्रिप्ट (सुरक्षित) करने के लिए किया जाता है. साथ ही, क्रिप्टो फ़ुटर को अपडेट किया जाता है.

    अगर किसी वजह से रीबूट नहीं हो पाता है, तो vold प्रॉपर्टी vold.encrypt_progress को error_reboot_failed पर सेट करता है. साथ ही, यूज़र इंटरफ़ेस (यूआई) पर एक मैसेज दिखना चाहिए, जिसमें उपयोगकर्ता से रीबूट करने के लिए बटन दबाने के लिए कहा गया हो. ऐसा कभी नहीं होना चाहिए.

डिफ़ॉल्ट एन्क्रिप्शन के साथ एन्क्रिप्ट (सुरक्षित) किए गए डिवाइस को शुरू करना

जब किसी एन्क्रिप्ट (सुरक्षित) किए गए डिवाइस को बिना पासवर्ड के बूट अप किया जाता है, तो ऐसा होता है. Android 5.0 वाले डिवाइसों को पहली बार बूट करने पर एन्क्रिप्ट (सुरक्षित) किया जाता है. इसलिए, कोई पासवर्ड सेट नहीं होना चाहिए. इसलिए, यह डिफ़ॉल्ट एन्क्रिप्शन की स्थिति है.

  1. बिना पासवर्ड के एन्क्रिप्ट (सुरक्षित) किए गए /data का पता लगाना

    यह पता लगाना कि Android डिवाइस को एन्क्रिप्ट (सुरक्षित) किया गया है, क्योंकि /data को माउंट नहीं किया जा सकता और encryptable या forceencrypt में से कोई एक फ़्लैग सेट किया गया है.

    vold, vold.decrypt को trigger_default_encryption पर सेट करता है. इससे defaultcrypto सेवा शुरू हो जाती है. trigger_default_encryption एन्क्रिप्शन के टाइप की जांच करता है, ताकि यह पता चल सके कि /data को पासवर्ड के साथ या उसके बिना एन्क्रिप्ट (सुरक्षित) किया गया है.

  2. /data को डिक्रिप्ट करें

    यह कुकी, ब्लॉक किए गए डिवाइस पर dm-crypt डिवाइस बनाती है, ताकि डिवाइस का इस्तेमाल किया जा सके.

  3. /data को माउंट करें

    vold इसके बाद, डिक्रिप्ट किए गए असली /data पार्टीशन को माउंट करता है और फिर नया पार्टीशन तैयार करता है. यह प्रॉपर्टी vold.post_fs_data_done को 0 पर सेट करती है. इसके बाद, vold.decrypt को trigger_post_fs_data पर सेट करती है. इससे init.rc, post-fs-data कमांड को लागू करता है. ये ज़रूरी डायरेक्ट्री या लिंक बनाते हैं. इसके बाद, vold.post_fs_data_done को 1 पर सेट करते हैं.

    जब vold को उस प्रॉपर्टी में 1 दिखता है, तो वह प्रॉपर्टी vold.decrypt को trigger_restart_framework. पर सेट कर देता है. इससे init.rc, क्लास main में फिर से सेवाएं शुरू कर देता है. साथ ही, बूट होने के बाद पहली बार क्लास late_start में सेवाएं शुरू कर देता है.

  4. फ़्रेमवर्क शुरू करें

    अब फ़्रेमवर्क, डिक्रिप्ट किए गए /data का इस्तेमाल करके अपनी सभी सेवाओं को बूट करता है. इसके बाद, सिस्टम इस्तेमाल के लिए तैयार हो जाता है.

डिफ़ॉल्ट एन्क्रिप्शन के बिना एन्क्रिप्ट (सुरक्षित) किए गए डिवाइस को चालू करना

जब एन्क्रिप्ट (सुरक्षित) किए गए किसी ऐसे डिवाइस को बूट किया जाता है जिस पर पासवर्ड सेट है, तो ऐसा होता है. डिवाइस का पासवर्ड, पिन, पैटर्न या पासवर्ड हो सकता है.

  1. पासवर्ड की मदद से एन्क्रिप्ट किए गए डिवाइस का पता लगाना

    यह पता लगाना कि Android डिवाइस को एन्क्रिप्ट (सुरक्षित) किया गया है, क्योंकि फ़्लैग ro.crypto.state = "encrypted"

    vold, vold.decrypt को trigger_restart_min_framework पर सेट करता है, क्योंकि /data को पासवर्ड से एन्क्रिप्ट (सुरक्षित) किया जाता है.

  2. tmpfs को माउंट करना

    init, पांच प्रॉपर्टी सेट करता है. इनका इस्तेमाल, /data के लिए दिए गए शुरुआती माउंट विकल्पों को सेव करने के लिए किया जाता है. साथ ही, init.rc से पास किए गए पैरामीटर को भी सेव किया जाता है. vold, क्रिप्टो मैपिंग सेट अप करने के लिए इन प्रॉपर्टी का इस्तेमाल करता है:

    1. ro.crypto.fs_type
    2. ro.crypto.fs_real_blkdev
    3. ro.crypto.fs_mnt_point
    4. ro.crypto.fs_options
    5. ro.crypto.fs_flags (ASCII में आठ अंकों की हेक्स संख्या, जिसके पहले 0x लिखा हो)
  3. पासवर्ड डालने के लिए प्रॉम्प्ट दिखाने वाला फ़्रेमवर्क शुरू करना

    फ़्रेमवर्क शुरू होता है और देखता है कि vold.decrypt को trigger_restart_min_framework पर सेट किया गया है. इससे फ़्रेमवर्क को पता चलता है कि यह tmpfs /data डिस्क पर बूट हो रहा है और इसे उपयोगकर्ता का पासवर्ड चाहिए.

    हालांकि, इससे पहले यह पक्का करना ज़रूरी है कि डिस्क को सही तरीके से एन्क्रिप्ट (सुरक्षित) किया गया हो. यह cryptfs cryptocomplete को vold कमांड भेजता है. vold अगर एन्क्रिप्शन की प्रोसेस पूरी हो गई है, तो 0 दिखाता है. अगर कोई अंदरूनी गड़बड़ी हुई है, तो -1 दिखाता है. अगर एन्क्रिप्शन की प्रोसेस पूरी नहीं हुई है, तो -2 दिखाता है. vold, CRYPTO_ENCRYPTION_IN_PROGRESS फ़्लैग के लिए क्रिप्टो मेटाडेटा की जांच करके यह तय करता है. अगर यह सेट है, तो एन्क्रिप्शन की प्रोसेस में रुकावट आई है. साथ ही, डिवाइस पर इस्तेमाल किया जा सकने वाला कोई डेटा मौजूद नहीं है. अगर vold से कोई गड़बड़ी होती है, तो यूज़र इंटरफ़ेस (यूआई) को उपयोगकर्ता को एक मैसेज दिखाना चाहिए. इसमें डिवाइस को रीबूट करने और फ़ैक्ट्री रीसेट करने के बारे में बताया गया हो. साथ ही, उपयोगकर्ता को ऐसा करने के लिए एक बटन देना चाहिए.

  4. पासवर्ड की मदद से डेटा को डिक्रिप्ट करना

    cryptfs cryptocomplete पूरा होने के बाद, फ़्रेमवर्क एक यूज़र इंटरफ़ेस (यूआई) दिखाता है. इसमें डिस्क का पासवर्ड मांगा जाता है. यूज़र इंटरफ़ेस, पासवर्ड की जांच करता है. इसके लिए, वह vold को cryptfs checkpw कमांड भेजता है. अगर पासवर्ड सही है (इसका पता इस बात से चलता है कि डिक्रिप्ट किए गए /data को किसी अस्थायी जगह पर माउंट किया गया है और फिर अनमाउंट किया गया है), तो vold, डिक्रिप्ट किए गए ब्लॉक डिवाइस का नाम, ro.crypto.fs_crypto_blkdev प्रॉपर्टी में सेव करता है और यूज़र इंटरफ़ेस (यूआई) को स्टेटस 0 दिखाता है. अगर पासवर्ड गलत है, तो यह यूज़र इंटरफ़ेस (यूआई) को -1 दिखाता है.

  5. स्टॉप फ़्रेमवर्क

    यूज़र इंटरफ़ेस (यूआई) पर क्रिप्टो बूट ग्राफ़िक दिखता है. इसके बाद, cryptfs restart कमांड के साथ vold को कॉल करता है. vold, vold.decrypt प्रॉपर्टी को trigger_reset_main पर सेट करता है. इससे init.rc, class_reset main करता है. इससे मुख्य क्लास में मौजूद सभी सेवाएं बंद हो जाती हैं. इससे tmpfs /data को अनमाउंट किया जा सकता है.

  6. माउंट /data

    vold इसके बाद, डिक्रिप्ट किए गए असली /data पार्टीशन को माउंट करता है और नया पार्टीशन तैयार करता है. अगर इसे वाइप करने के विकल्प के साथ एन्क्रिप्ट (सुरक्षित) किया गया था, तो हो सकता है कि इसे कभी तैयार न किया गया हो. यह विकल्प, पहले वर्शन पर काम नहीं करता है. यह vold.post_fs_data_done प्रॉपर्टी को 0 पर सेट करता है. इसके बाद, vold.decrypt को trigger_post_fs_data पर सेट करता है. इससे init.rc, post-fs-data कमांड चलाता है. ये ज़रूरी डायरेक्ट्री या लिंक बनाते हैं. इसके बाद, vold.post_fs_data_done को 1 पर सेट करते हैं. जब vold को उस प्रॉपर्टी में 1 दिखता है, तो वह vold.decrypt प्रॉपर्टी को trigger_restart_framework पर सेट कर देता है. इससे init.rc, क्लास main में सेवाएं फिर से शुरू कर देता है. साथ ही, बूट होने के बाद पहली बार क्लास late_start में सेवाएं शुरू कर देता है.

  7. पूरा फ़्रेमवर्क इस्तेमाल करना शुरू करें

    अब फ़्रेमवर्क, डिक्रिप्ट किए गए /data फ़ाइल सिस्टम का इस्तेमाल करके अपनी सभी सेवाओं को बूट करता है. इसके बाद, सिस्टम इस्तेमाल के लिए तैयार हो जाता है.

कार्रवाई सफल नहीं हुई

डिक्रिप्ट न हो पाने वाले डिवाइस में कुछ समस्याएं हो सकती हैं. डिवाइस बूट करने के लिए, सामान्य चरणों की सीरीज़ शुरू होती है:

  1. पासवर्ड की मदद से एन्क्रिप्ट किए गए डिवाइस का पता लगाना
  2. tmpfs को माउंट करना
  3. पासवर्ड के लिए प्रॉम्प्ट करने वाला फ़्रेमवर्क शुरू करें

हालांकि, फ़्रेमवर्क खुलने के बाद, डिवाइस में कुछ गड़बड़ियां हो सकती हैं:

  • पासवर्ड सही है, लेकिन डेटा को डिक्रिप्ट नहीं किया जा सकता
  • उपयोगकर्ता 30 बार गलत पासवर्ड डालता है

अगर ये गड़बड़ियां ठीक नहीं होती हैं, तो उपयोगकर्ता को फ़ैक्ट्री रीसेट करने के लिए कहें:

अगर vold को एन्क्रिप्ट (सुरक्षित) करने की प्रोसेस के दौरान कोई गड़बड़ी मिलती है और अगर अब तक कोई डेटा नहीं मिटाया गया है और फ़्रेमवर्क चालू है, तो vold, प्रॉपर्टी vold.encrypt_progress को error_not_encrypted पर सेट करता है. यूज़र इंटरफ़ेस (यूआई), उपयोगकर्ता को रीबूट करने के लिए कहता है और उसे सूचना देता है कि एन्क्रिप्शन की प्रोसेस कभी शुरू नहीं हुई. अगर फ़्रेमवर्क के बंद होने के बाद गड़बड़ी होती है, लेकिन प्रोग्रेस बार यूज़र इंटरफ़ेस (यूआई) के चालू होने से पहले, vold सिस्टम को रीबूट करता है. अगर रीबूट नहीं हो पाता है, तो यह vold.encrypt_progress को error_shutting_down पर सेट कर देता है और -1 दिखाता है. हालांकि, गड़बड़ी को पकड़ने के लिए कुछ भी नहीं होगा. आम तौर पर, ऐसा नहीं होता.

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

एन्क्रिप्ट (सुरक्षित) की गई कुंजी को सेव करना

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

  1. 16 बाइट की रैंडम डिस्क एन्क्रिप्शन की (डीईके) और 16 बाइट का सॉल्ट जनरेट करें.
  2. उपयोगकर्ता के पासवर्ड और सॉल्ट पर scrypt लागू करें, ताकि 32 बाइट का इंटरमीडिएट की 1 (IK1) जनरेट किया जा सके.
  3. हार्डवेयर से बंधी निजी कुंजी (एचबीके) के साइज़ के बराबर करने के लिए, IK1 में शून्य बाइट जोड़ें. खास तौर पर, हम इस तरह से पैडिंग करते हैं: 00 || IK1 || 00..00; एक ज़ीरो बाइट, 32 IK1 बाइट, 223 ज़ीरो बाइट.
  4. पैडेड IK1 को HBK के साथ साइन करके, 256 बाइट का IK2 जनरेट करें.
  5. IK2 और सॉल्ट (दूसरे चरण वाला सॉल्ट) पर scrypt लागू करके, 32 बाइट का IK3 जनरेट करें.
  6. IK3 के पहले 16 बाइट को KEK और आखिरी 16 बाइट को IV के तौर पर इस्तेमाल करें.
  7. केईके और इनिशलाइज़ेशन वेक्टर IV की मदद से, एईएस_सीबीसी का इस्तेमाल करके डीईके को एन्क्रिप्ट (सुरक्षित) करें.

पासवर्ड बदलना

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

एन्क्रिप्शन प्रॉपर्टी

vold और init, प्रॉपर्टी सेट करके एक-दूसरे से कम्यूनिकेट करते हैं. यहां एन्क्रिप्शन के लिए उपलब्ध प्रॉपर्टी की सूची दी गई है.

Vold प्रॉपर्टी

प्रॉपर्टी ब्यौरा
vold.decrypt trigger_encryption ड्राइव को बिना पासवर्ड के एन्क्रिप्ट (सुरक्षित) करें.
vold.decrypt trigger_default_encryption ड्राइव की जांच करें कि वह बिना पासवर्ड के एन्क्रिप्ट (सुरक्षित) की गई है या नहीं. अगर ऐसा है, तो इसे डिक्रिप्ट और माउंट करें. ऐसा न होने पर, vold.decrypt को trigger_restart_min_framework पर सेट करें.
vold.decrypt trigger_reset_main इस कुकी को vold सेट करता है. इसका इस्तेमाल, डिस्क का पासवर्ड मांगने वाले यूज़र इंटरफ़ेस (यूआई) को बंद करने के लिए किया जाता है.
vold.decrypt trigger_post_fs_data इस कुकी को vold सेट करता है, ताकि /data को ज़रूरी डायरेक्ट्री वगैरह के साथ तैयार किया जा सके.
vold.decrypt trigger_restart_framework इस कुकी को vold सेट करता है, ताकि असली फ़्रेमवर्क और सभी सेवाएं शुरू की जा सकें.
vold.decrypt trigger_shutdown_framework इस कुकी को vold सेट करता है. इसका इस्तेमाल पूरे फ़्रेमवर्क को बंद करने के लिए किया जाता है, ताकि एन्क्रिप्शन शुरू किया जा सके.
vold.decrypt trigger_restart_min_framework इस कुकी को vold सेट करता है. इसका इस्तेमाल, एन्क्रिप्शन के लिए प्रोग्रेस बार यूज़र इंटरफ़ेस (यूआई) शुरू करने या पासवर्ड के लिए प्रॉम्प्ट दिखाने के लिए किया जाता है. यह ro.crypto.state की वैल्यू पर निर्भर करता है.
vold.encrypt_progress फ़्रेमवर्क शुरू होने पर, अगर यह प्रॉपर्टी सेट है, तो प्रोग्रेस बार के यूज़र इंटरफ़ेस (यूआई) मोड में जाएं.
vold.encrypt_progress 0 to 100 प्रोग्रेस बार के यूज़र इंटरफ़ेस (यूआई) में, सेट की गई प्रतिशत वैल्यू दिखनी चाहिए.
vold.encrypt_progress error_partially_encrypted प्रोग्रेस बार के यूज़र इंटरफ़ेस (यूआई) में, एन्क्रिप्शन के फ़ेल होने का मैसेज दिखना चाहिए. साथ ही, उपयोगकर्ता को डिवाइस को फ़ैक्ट्री रीसेट करने का विकल्प मिलना चाहिए.
vold.encrypt_progress error_reboot_failed प्रोग्रेस बार के यूज़र इंटरफ़ेस (यूआई) पर, एन्क्रिप्शन पूरा होने का मैसेज दिखना चाहिए. साथ ही, उपयोगकर्ता को डिवाइस को रीबूट करने का बटन दिखना चाहिए. यह गड़बड़ी नहीं होनी चाहिए.
vold.encrypt_progress error_not_encrypted प्रोग्रेस बार के यूज़र इंटरफ़ेस (यूआई) पर यह मैसेज दिखना चाहिए कि कोई गड़बड़ी हुई है. साथ ही, यह भी दिखना चाहिए कि कोई डेटा एन्क्रिप्ट (सुरक्षित) नहीं किया गया है या कोई डेटा मिटाया नहीं गया है. इसके अलावा, उपयोगकर्ता को सिस्टम को रीबूट करने का बटन भी दिखना चाहिए.
vold.encrypt_progress error_shutting_down प्रोग्रेस बार का यूज़र इंटरफ़ेस (यूआई) काम नहीं कर रहा है. इसलिए, यह पता नहीं चल पा रहा है कि इस गड़बड़ी को कौन ठीक करेगा. हालांकि, ऐसा कभी नहीं होना चाहिए.
vold.post_fs_data_done 0 इस कुकी को vold ने सेट किया था. इसे vold.decrypt को trigger_post_fs_data पर सेट करने से ठीक पहले सेट किया गया था.
vold.post_fs_data_done 1 init.rc या init.rc के ज़रिए सेट किया जाता है. post-fs-data टास्क पूरा होने के तुरंत बाद सेट किया जाता है.

init प्रॉपर्टी

प्रॉपर्टी ब्यौरा
ro.crypto.fs_crypto_blkdev इस कुकी को vold कमांड checkpw सेट करती है, ताकि vold कमांड restart इसका इस्तेमाल बाद में कर सके.
ro.crypto.state unencrypted इस कुकी को init सेट करता है. इससे पता चलता है कि यह सिस्टम, बिना एन्क्रिप्ट (सुरक्षित) किए गए /data ro.crypto.state encrypted के साथ काम कर रहा है. इस कुकी को init सेट करता है. इसका मकसद यह बताना है कि यह सिस्टम, एन्क्रिप्ट (सुरक्षित) किए गए /data के साथ काम कर रहा है.

ro.crypto.fs_type
ro.crypto.fs_real_blkdev
ro.crypto.fs_mnt_point
ro.crypto.fs_options
ro.crypto.fs_flags

इन पांच प्रॉपर्टी को init सेट करता है. ऐसा तब होता है, जब वह init.rc से पास किए गए पैरामीटर के साथ /data को माउंट करने की कोशिश करता है. vold, क्रिप्टो मैपिंग को सेट अप करने के लिए इनका इस्तेमाल करता है.
ro.crypto.tmpfs_options इसे init.rc सेट करता है. इसमें वे विकल्प होते हैं जिनका इस्तेमाल init को तब करना चाहिए, जब वह tmpfs /data फ़ाइल सिस्टम को माउंट कर रहा हो.

init actions

on post-fs-data
on nonencrypted
on property:vold.decrypt=trigger_reset_main
on property:vold.decrypt=trigger_post_fs_data
on property:vold.decrypt=trigger_restart_min_framework
on property:vold.decrypt=trigger_restart_framework
on property:vold.decrypt=trigger_shutdown_framework
on property:vold.decrypt=trigger_encryption
on property:vold.decrypt=trigger_default_encryption