अनुमति टैग

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

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

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

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

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

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

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

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

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

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

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