पूर्ण-डिस्क एन्क्रिप्शन

पूर्ण-डिस्क एन्क्रिप्शन एक एन्क्रिप्टेड कुंजी का उपयोग करके एंड्रॉइड डिवाइस पर सभी उपयोगकर्ता डेटा को एन्कोड करने की प्रक्रिया है। एक बार एक डिवाइस एन्क्रिप्ट हो जाने के बाद, सभी उपयोगकर्ता-निर्मित डेटा को डिस्क पर जमा करने से पहले स्वचालित रूप से एन्क्रिप्ट किया जाता है और कॉलिंग प्रक्रिया में लौटने से पहले डेटा को स्वचालित रूप से डिक्रिप्ट किया जाता है।

फुल-डिस्क एन्क्रिप्शन को एंड्रॉइड में 4.4 में पेश किया गया था, लेकिन एंड्रॉइड 5.0 ने इन नई सुविधाओं को पेश किया:

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

सावधानी: Android 5.0 में अपग्रेड किए गए और फिर एन्क्रिप्ट किए गए डिवाइस फ़ैक्टरी डेटा रीसेट द्वारा एन्क्रिप्टेड स्थिति में वापस आ सकते हैं। पहले बूट पर एन्क्रिप्ट किए गए नए Android 5.0 डिवाइस को अनएन्क्रिप्टेड स्थिति में नहीं लौटाया जा सकता।

Android पूर्ण-डिस्क एन्क्रिप्शन कैसे काम करता है

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

एन्क्रिप्शन एल्गोरिथ्म 128 उन्नत एन्क्रिप्शन स्टैंडर्ड (AES) है जिसमें सिफर-ब्लॉक चेनिंग (CBC) और ESSIV: SHA256 है। ओपनएसएसएल लाइब्रेरी में कॉल के माध्यम से मास्टर कुंजी को 128-बिट एईएस के साथ एन्क्रिप्ट किया गया है। कुंजी के लिए आपको 128 बिट्स या अधिक का उपयोग करना चाहिए (256 वैकल्पिक होने के साथ)।

नोट: मास्टर कुंजी को एन्क्रिप्ट करने के लिए ओईएम 128-बिट या उच्चतर का उपयोग कर सकते हैं।

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

  • चूक जाना
  • नत्थी करना
  • कूटशब्द
  • नमूना

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

आप Android ओपन सोर्स प्रोजेक्ट cryptfs.cpp फ़ाइल में परिभाषित डिफ़ॉल्ट पासवर्ड पा सकते हैं।

जब उपयोगकर्ता डिवाइस पर पिन/पास या पासवर्ड सेट करता है, तो केवल 128-बिट कुंजी को फिर से एन्क्रिप्ट और संग्रहीत किया जाता है। (यानी। उपयोगकर्ता पिन/पास/पैटर्न परिवर्तन उपयोगकर्ता डेटा के पुन: एन्क्रिप्शन का कारण नहीं बनते हैं।) ध्यान दें कि प्रबंधित डिवाइस पिन, पैटर्न या पासवर्ड प्रतिबंधों के अधीन हो सकता है।

एन्क्रिप्शन init और vold द्वारा प्रबंधित किया जाता है। init कॉल vold , और vold init में ईवेंट ट्रिगर करने के लिए गुण सेट करता है। सिस्टम के अन्य भाग भी रिपोर्ट की स्थिति, पासवर्ड के लिए पूछने, या घातक त्रुटि के मामले में फ़ैक्टरी रीसेट करने का संकेत देने जैसे कार्यों को संचालित करने के लिए गुणों को देखते हैं। vold में एन्क्रिप्शन सुविधाओं का आह्वान करने के लिए, सिस्टम कमांड लाइन टूल vdc के cryptfs कमांड का उपयोग करता है: checkpw , restart करें , enablecrypto , changepw , cryptocomplete , getpw pw , setfield , verifypw , getfield , mountdefaultencrypted , getpwtype , और 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 पर प्रतिक्रिया नहीं देती हैं।

प्रवाह

एक एन्क्रिप्टेड डिवाइस के लिए चार प्रवाह होते हैं। एक उपकरण को केवल एक बार एन्क्रिप्ट किया जाता है और फिर सामान्य बूट प्रवाह का अनुसरण करता है।

  • पहले से अनएन्क्रिप्टेड डिवाइस को एन्क्रिप्ट करें:
    • forceencrypt के साथ एक नया डिवाइस एन्क्रिप्ट करें: पहले बूट पर अनिवार्य एन्क्रिप्शन (एंड्रॉइड एल में शुरू)।
    • किसी मौजूदा डिवाइस को एन्क्रिप्ट करें: उपयोगकर्ता द्वारा आरंभ किया गया एन्क्रिप्शन (Android K और पहले का)।
  • एक एन्क्रिप्टेड डिवाइस बूट करें:
    • बिना पासवर्ड वाले एन्क्रिप्टेड डिवाइस को शुरू करना: एक एन्क्रिप्टेड डिवाइस को बूट करना जिसमें कोई सेट पासवर्ड नहीं है (एंड्रॉइड 5.0 और बाद में चलने वाले डिवाइस के लिए प्रासंगिक)।
    • एक पासवर्ड के साथ एक एन्क्रिप्टेड डिवाइस शुरू करना: एक एन्क्रिप्टेड डिवाइस को बूट करना जिसमें एक सेट पासवर्ड है।

इन प्रवाहों के अतिरिक्त, उपकरण /data को एन्क्रिप्ट करने में भी विफल हो सकता है। प्रत्येक प्रवाह को नीचे विस्तार से समझाया गया है।

फोर्सएनक्रिप्ट के साथ एक नए डिवाइस को एन्क्रिप्ट करें

Android 5.0 डिवाइस के लिए यह सामान्य पहला बूट है।

  1. forceencrypt फ्लैग के साथ अनएन्क्रिप्टेड फाइल सिस्टम का पता लगाएं

    /data एन्क्रिप्ट नहीं किया गया है, लेकिन इसकी आवश्यकता है क्योंकि इसे forceencrypt करने के लिए बाध्य किया गया है। अनमाउंट /data

  2. एन्क्रिप्ट /data प्रारंभ करें

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

  3. टीएमपीएफ माउंट करें

    vold एक tmpfs /data ( ro.crypto.tmpfs_options से tmpfs विकल्पों का उपयोग करके) को आरोहित करता है और गुण vold.encrypt_progress को 0 पर सेट करता है। vold एक एन्क्रिप्टेड सिस्टम को बूट करने के लिए tmpfs /data तैयार करता है और vold.decrypt गुण को यहां सेट करता है: trigger_restart_min_framework

  4. प्रगति दिखाने के लिए रूपरेखा तैयार करें

    चूंकि डिवाइस में एन्क्रिप्ट करने के लिए वस्तुतः कोई डेटा नहीं है, इसलिए प्रगति बार वास्तव में दिखाई नहीं देगा क्योंकि एन्क्रिप्शन इतनी जल्दी होता है। प्रगति UI के बारे में अधिक विवरण के लिए किसी मौजूदा डिवाइस को एन्क्रिप्ट करें देखें।

  5. जब /data एन्क्रिप्ट किया जाता है, तो ढांचे को नीचे ले जाएं

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

  6. माउंट /data

    init फिर एक tmpfs RAMDisk पर /data को आरोहित करता है पैरामीटर का उपयोग करके इसे ro.crypto.tmpfs_options init.rc सेट है।

  7. रूपरेखा प्रारंभ करें

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

किसी मौजूदा डिवाइस को एन्क्रिप्ट करें

ऐसा तब होता है जब आप किसी अनएन्क्रिप्टेड Android K या पहले वाले डिवाइस को एन्क्रिप्ट करते हैं जिसे L में माइग्रेट कर दिया गया है।

यह प्रक्रिया उपयोगकर्ता द्वारा शुरू की गई है और इसे कोड में "इनस्थल एन्क्रिप्शन" कहा जाता है। जब कोई उपयोगकर्ता किसी डिवाइस को एन्क्रिप्ट करने का चयन करता है, तो UI सुनिश्चित करता है कि बैटरी पूरी तरह से चार्ज हो गई है और एसी एडॉप्टर प्लग इन है, इसलिए एन्क्रिप्शन प्रक्रिया को पूरा करने के लिए पर्याप्त शक्ति है।

चेतावनी: यदि डिवाइस का पावर समाप्त हो जाता है और एन्क्रिप्ट करना समाप्त होने से पहले ही बंद हो जाता है, तो फ़ाइल डेटा को आंशिक रूप से एन्क्रिप्टेड अवस्था में छोड़ दिया जाता है। डिवाइस फ़ैक्टरी रीसेट होना चाहिए और सभी डेटा खो गया है।

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

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

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

    यूआई कॉल vold कमांड cryptfs enablecrypto inplace के साथ करता है जहां 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 एक tmpfs /data ( ro.crypto.tmpfs_options से tmpfs विकल्पों का उपयोग करके) को आरोहित करता है और गुण vold.encrypt_progress को 0 पर सेट करता है। vold एक एन्क्रिप्टेड सिस्टम को बूट करने के लिए tmpfs /data तैयार करता है और vold.decrypt गुण को यहां सेट करता है: trigger_restart_min_framework

  9. प्रगति दिखाने के लिए रूपरेखा तैयार करें

    trigger_restart_min_framework सेवाओं की main श्रेणी शुरू करने के लिए init.rc का कारण बनता है। जब फ्रेमवर्क देखता है कि vold.encrypt_progress 0 पर सेट है, तो यह प्रोग्रेस बार UI लाता है, जो हर पांच सेकंड में उस प्रॉपर्टी को क्वेरी करता है और प्रोग्रेस बार को अपडेट करता है। एन्क्रिप्शन लूप हर बार विभाजन के दूसरे प्रतिशत को एन्क्रिप्ट करने पर vold.encrypt_progress को अपडेट करता है।

  10. जब /data एन्क्रिप्ट किया जाता है, तो क्रिप्टो पाद लेख को अपडेट करें

    जब /data सफलतापूर्वक एन्क्रिप्ट किया जाता है, तो vold मेटाडेटा में ध्वज ENCRYPTION_IN_PROGRESS को साफ़ करता है।

    जब डिवाइस सफलतापूर्वक अनलॉक हो जाता है, तब पासवर्ड का उपयोग मास्टर कुंजी को एन्क्रिप्ट करने के लिए किया जाता है और क्रिप्टो फुटर अपडेट किया जाता है।

    यदि रीबूट किसी कारण से विफल हो जाता है, तो vold गुण vold.encrypt_progress को error_reboot_failed पर सेट कर देता है और UI को एक संदेश प्रदर्शित करना चाहिए जो उपयोगकर्ता को रीबूट करने के लिए एक बटन दबाने के लिए कहता है। ऐसा कभी होने की उम्मीद नहीं है।

डिफ़ॉल्ट एन्क्रिप्शन के साथ एक एन्क्रिप्टेड डिवाइस शुरू करना

ऐसा तब होता है जब आप किसी एन्क्रिप्टेड डिवाइस को बिना पासवर्ड के बूट करते हैं। चूंकि एंड्रॉइड 5.0 डिवाइस पहले बूट पर एन्क्रिप्ट किए गए हैं, कोई सेट पासवर्ड नहीं होना चाहिए और इसलिए यह डिफ़ॉल्ट एन्क्रिप्शन स्थिति है।

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

    पता लगाएं कि एंड्रॉइड डिवाइस एन्क्रिप्ट किया गया है क्योंकि /data को माउंट नहीं किया जा सकता है और एन्क्रिप्ट करने योग्य या encryptable में से एक forceencrypt सेट है।

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

  2. डिक्रिप्ट / डेटा

    ब्लॉक डिवाइस पर dm-crypt डिवाइस बनाता है ताकि डिवाइस उपयोग के लिए तैयार हो।

  3. माउंट / डेटा

    vold तब डिक्रिप्ट किए गए वास्तविक /data विभाजन को आरोहित करता है और फिर नया विभाजन तैयार करता है। यह संपत्ति vold.post_fs_data_done को 0 पर सेट करता है और फिर vold.decrypt को trigger_post_fs_data fs_data पर सेट करता है। यह init.rc को इसके post-fs-data कमांड चलाने का कारण बनता है। वे कोई आवश्यक निर्देशिका या लिंक बनाएंगे और फिर vold.post_fs_data_done को 1 पर सेट करेंगे।

    एक बार जब vold.decrypt vold सेट करता है: trigger_restart_framework. यह init.rc को फिर से क्लास main में सेवाएं शुरू करने का कारण बनता है और बूट के बाद पहली बार क्लास late_start में भी सेवाएं शुरू करता है।

  4. रूपरेखा प्रारंभ करें

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

डिफ़ॉल्ट एन्क्रिप्शन के बिना एक एन्क्रिप्टेड डिवाइस प्रारंभ करना

ऐसा तब होता है जब आप एक एन्क्रिप्टेड डिवाइस को बूट करते हैं जिसमें एक सेट पासवर्ड होता है। डिवाइस का पासवर्ड पिन, पैटर्न या पासवर्ड हो सकता है।

  1. पासवर्ड के साथ एन्क्रिप्टेड डिवाइस का पता लगाएं

    पता लगाएं कि एंड्रॉइड डिवाइस एन्क्रिप्ट किया गया है क्योंकि ध्वज ro.crypto.state = "encrypted"

    vold vold.decrypt को trigger_restart_min_framework पर सेट करता है क्योंकि /data पासवर्ड से एन्क्रिप्ट किया गया है।

  2. टीएमपीएफ माउंट करें

    init.rc से पारित पैरामीटर के साथ /data के लिए दिए गए प्रारंभिक माउंट विकल्पों को बचाने के लिए init पांच गुण सेट करता है। 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 8-अंकीय हेक्स संख्या 0x से पहले)
  3. पासवर्ड के लिए प्रांप्ट करने के लिए फ्रेमवर्क शुरू करें

    ढांचा शुरू होता है और देखता है कि vold.decrypt को trigger_restart_min_framework पर सेट किया गया है। यह फ्रेमवर्क को बताता है कि यह tmpfs /data डिस्क पर बूट हो रहा है और इसे यूजर पासवर्ड प्राप्त करने की आवश्यकता है।

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

  4. पासवर्ड के साथ डेटा डिक्रिप्ट करें

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

  5. ढांचा बंद करो

    UI एक क्रिप्टो बूट ग्राफ़िक डालता है और फिर कमांड 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 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. टीएमपीएफ माउंट करें
  3. पासवर्ड के लिए प्रांप्ट करने के लिए फ्रेमवर्क शुरू करें

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

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

यदि इन त्रुटियों का समाधान नहीं होता है, तो उपयोगकर्ता को फ़ैक्टरी वाइप करने के लिए संकेत दें :

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

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

एन्क्रिप्टेड कुंजी संग्रहीत करना

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

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

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

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

एन्क्रिप्शन गुण

init और vold गुण सेट करके एक दूसरे के साथ संवाद करते हैं। यहां एन्क्रिप्शन के लिए उपलब्ध संपत्तियों की सूची दी गई है।

वोल्ड गुण

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

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 tmpfs /data फ़ाइल सिस्टम को आरोहित करते समय init द्वारा उपयोग किए जाने वाले विकल्पों के साथ init.rc द्वारा सेट करें।

इनिट क्रियाएं

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