अनुमति टैग

KeyMint (पहले इसे Keymaster कहा जाता था) API, अनुमति देने वाले टैग का बड़े पैमाने पर इस्तेमाल करता है. ये नाम-वैल्यू पेयर होते हैं. हर टैग में ये शामिल हैं:

  • जुड़ी हुई वैल्यू के साथ enum का नाम
  • जुड़ा हुआ टाइप (उदाहरण के लिए, पूर्णांक, बाइट, तारीख, enum), जिसमें यह जानकारी शामिल होती है कि एक से ज़्यादा वैल्यू की अनुमति है या नहीं

उदाहरण के लिए, Tag::BLOCK_MODE नाम वाले टैग की बेस एनम वैल्यू 4 है. साथ ही, इसमें TagType::ENUM_REP टाइप का मार्कर है. इससे पता चलता है कि इससे जुड़ी वैल्यू, दोहराई जा सकने वाली एनम वैल्यू है. इस मामले में, यह वैल्यू BlockMode है.

टैग, एपीआई पर दो काम करते हैं:

  • एपीआई पर की गई किसी कार्रवाई के पैरामीटर के तौर पर. उदाहरण के लिए, एचएमएसी साइनिंग की कार्रवाई पर Tag::MAC_LENGTH से, एचएमएसी की अनुरोध की गई लंबाई का पता चलता है.
  • मुख्य विशेषताओं के तौर पर, वे वैल्यू जो किसी खास कुंजी से हमेशा के लिए जुड़ी होती हैं. जैसे, कुंजी के ब्लब में शामिल होती हैं. उदाहरण के लिए, Tag::EC_CURVE से पता चलता है कि कोई कुंजी किस एलिप्टिक कर्व के लिए है. हर मुख्य विशेषता, सुरक्षा के एक लेवल से जुड़ी होती है. इससे पता चलता है कि सिस्टम का कौन-सा हिस्सा, एट्रिब्यूट की निगरानी करता है:
    • सुरक्षा कुंजी की मुख्य विशेषता, सुरक्षित हार्डवेयर में TRUSTED_ENVIRONMENT या STRONGBOX के सुरक्षा स्तर के साथ लागू की जाती है.
    • सुरक्षा लेवल SOFTWARE या KEYSTORE वाली मुख्य विशेषता को सिर्फ़ keystore2 सिस्टम सेवा लागू करती है. इसलिए, ऐसी विशेषता ओएस के साथ छेड़छाड़ होने पर भी सुरक्षित नहीं रहती.

कई टैग, मुख्य विशेषताओं और पैरामीटर, दोनों के तौर पर काम करते हैं:

  • मुख्य विशेषताओं से, किसी कुंजी के लिए अनुमति वाले पैरामीटर के सेट के बारे में पता चलता है. उदाहरण के लिए:
    • किसी ECDSA कुंजी के Tag::PURPOSE में SIGN और AGREE_KEY, दोनों शामिल हो सकते हैं.
    • एईएस कुंजी के लिए Tag::BLOCK_MODE में ईसीबी, सीबीसी, और सीटीआर मोड शामिल हो सकते हैं.
  • इसके बाद, begin() अनुरोध में कार्रवाई के लिए, पैरामीटर की कोई खास वैल्यू शामिल होती है. उदाहरण के लिए:
    • begin() में एक खास मकसद वाला पैरामीटर होता है. इसकी वैल्यू, मुख्य विशेषताओं की Tag::PURPOSE वैल्यू में से किसी एक से मेल खानी चाहिए.
    • AES ऑपरेशन के लिए begin() को params फ़ील्ड में Tag::BLOCK_MODE के लिए एक वैल्यू शामिल करनी होगी. यह वैल्यू, कुंजी की विशेषताओं में से किसी एक वैल्यू से मेल खानी चाहिए.

यह दोहरा फ़ंक्शन, खास तौर पर उन टैग को इकट्ठा करने के लिए काम का है जिन्हें कुंजी जनरेट करने या इंपोर्ट करने की कार्रवाई के दौरान keyParams के तौर पर पास किया जाता है.

  • कुछ टैग, कुंजी जनरेट करने की कार्रवाई के लिए पैरामीटर के तौर पर काम करते हैं. उदाहरण के लिए, Tag::CERTIFICATE_SUBJECT टैग, सिर्फ़ (एसिमेट्रिक) कुंजी जनरेट करने की प्रोसेस पर असर डालता है. यह X.509 सर्टिफ़िकेट में मौजूद किसी फ़ील्ड को कंट्रोल करता है.
  • अन्य टैग, नई जनरेट की गई कुंजी से key characteristics के तौर पर जुड़े होते हैं. साथ ही, इन्हें वापस किए गए keyblob में शामिल किया जाता है, ताकि ये हमेशा कुंजी से जुड़े रहें.

टैग वैल्यू के बारे में ज़्यादा जानकारी, यहां दी गई HAL इंटरफ़ेस की खास बातों में मिल सकती है:

  • KeyMint — सभी टैग, Android के रिलीज़ किए गए वर्शन की संबंधित ब्रांच में Tag.aidl में तय किए गए हैं.
  • Keymaster — टैग, platform/hardware/interfaces/keymaster/keymaster-version/types.hal में तय किए जाते हैं. ये टैग, हर keymaster-version के लिए अलग-अलग होते हैं. जैसे, Keymaster 3 के लिए 3.0/types.hal और Keymaster 4 के लिए 4.0/types.hal. Keymaster 2 और इससे पहले के वर्शन के लिए, टैग platform/hardware/libhardware/include/hardware/keymaster_defs.h में तय किए जाते हैं.