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

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

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

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

  • Android वेरिफ़ाइड बूट (एवीबी) की सुविधा वाले डिवाइस:
    • पैच लेवल और ओएस वर्शन को vbmeta.img में शामिल किया जा सकता है, ताकि बूटलोडर उन्हें KeyMint को उपलब्ध करा सके.
    • चेन किए गए पार्टिशन के लिए, पार्टिशन के वर्शन की जानकारी, चेन किए गए वीबीमेटा में होती है.
    • आम तौर पर, वर्शन की जानकारी उस 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 को कॉल करके, पिछले कीब्लॉब को मिटा देता है.