वर्शन बाइंडिंग

डिवाइस के लिए, KeyMint की सभी कुंजियों को रूट ऑफ़ ट्रस्ट से बंधा होना चाहिए. भरोसे का रूट, एक बिटस्ट्रिंग होती है. इसे सार्वजनिक पासकोड से बनाया जाता है. इसका इस्तेमाल, बूट इमेज के हस्ताक्षर की पुष्टि करने के लिए किया जाता है. साथ ही, बूटलोडर के लॉक होने की स्थिति की पुष्टि करने के लिए भी इसका इस्तेमाल किया जाता है.

KeyMint की बटन को डिवाइस के ऑपरेटिंग सिस्टम के वर्शन और पैच लेवल से बाउंड करना भी ज़रूरी है. Treble के मॉड्यूलर स्ट्रक्चर के साथ काम करने के लिए, इस वर्शन बाइंडिंग में हर partition (boot, system, और vendor) के लिए अलग-अलग पैच लेवल शामिल होते हैं. इससे हर partition को अलग से अपडेट किया जा सकता है. साथ ही, रोलबैक की सुरक्षा भी मिलती रहती है.

इस वर्शन बाइंडिंग को लागू करने के लिए, KeyMint के भरोसेमंद ऐप्लिकेशन (टीए) को, ओएस के मौजूदा वर्शन और पैच लेवल को सुरक्षित तरीके से पाने का तरीका चाहिए. साथ ही, यह पक्का करना चाहिए कि उसे जो जानकारी मिलती है वह चल रहे सिस्टम की सभी जानकारी से मेल खाती हो.

  • Android वेरिफ़ाइड बूट (एवीबी) की सुविधा वाले डिवाइस:
    • पैच लेवल और ओएस वर्शन को vbmeta.img में शामिल किया जा सकता है, ताकि बूटलोडर उन्हें KeyMint को दे सके.
    • चेन किए गए पार्टीशन के लिए, पार्टीशन के वर्शन की जानकारी, चेन किए गए VBMeta में होती है.
    • आम तौर पर, वर्शन की जानकारी उस VBMeta struct में होनी चाहिए जिसमें किसी दिए गए पार्टीशन के लिए पुष्टि करने वाला डेटा (हैश या हैशट्री) शामिल हो.
  • एवीबी के बिना काम करने वाले डिवाइस:
    • वेरिफ़ाइड बूट की सुविधा को लागू करने के लिए, बूटलोडर को वर्शन के मेटाडेटा का हैश देना ज़रूरी है, ताकि बूटलोडर, KeyMint को हैश दे सके.
    • boot.img, हेडर में पैच लेवल को सेव करना जारी रख सकता है.
    • system.img, पैच लेवल और ओएस वर्शन को रीड-ओनली प्रॉपर्टी में सेव करना जारी रख सकता है.
    • vendor.img, पैच लेवल को सिर्फ़ पढ़ने के लिए उपलब्ध प्रॉपर्टी ro.vendor.build.version.security_patch में सेव करता है.
    • बूटलोडर, KeyMint को पुष्टि किए गए बूट की मदद से पुष्टि किए गए सभी डेटा का हैश दे सकता है.

यहां दिए गए टैग, काम के पार्टीशन के वर्शन की जानकारी देते हैं:

KeyMint लागू करने के लिए, सभी पैच लेवल को अलग-अलग तरीके से इस्तेमाल किया जाना चाहिए. अगर वर्शन की पूरी जानकारी, किसी कुंजी से जुड़ी वैल्यू से मैच करती है, तो कुंजियों का इस्तेमाल किया जा सकता है. अगर डिवाइस का मौजूदा वर्शन, किसी पासकोड से जुड़ी किसी भी वैल्यू से ज़्यादा नया है, तो पासकोड का इस्तेमाल करने पर KeyMint, KEY_REQUIRES_UPGRADE गड़बड़ी का मैसेज दिखाता है. इसके बाद, Keystore IKeyMintDevice::upgradeKey() का इस्तेमाल करके, मौजूदा पैच लेवल से जुड़ा नया कीब्लॉब जनरेट करता है. इसके बाद, Keystore IKeyMintDevice::deleteKey() को कॉल करके, पिछले कीब्लॉब को मिटा देता है.