इस पेज पर, Keymaster हार्डवेयर एब्स्ट्रैक्शन लेयर (एचएएल) को लागू करने वालों के लिए जानकारी दी गई है. इसमें एपीआई के हर फ़ंक्शन के बारे में बताया गया है. साथ ही, यह भी बताया गया है कि यह फ़ंक्शन Keymaster के किस वर्शन में उपलब्ध है. इसके अलावा, इसमें डिफ़ॉल्ट तौर पर लागू करने के बारे में भी बताया गया है. टैग के लिए, Keymaster अनुमति टैग पेज देखें.
लागू करने के सामान्य दिशा-निर्देश
यहां दिए गए दिशा-निर्देश, एपीआई के सभी फ़ंक्शन पर लागू होते हैं.
इनपुट पॉइंटर पैरामीटर
वर्शन: 1, 2
किसी कॉल के लिए इस्तेमाल नहीं किए गए इनपुट पॉइंटर पैरामीटर, NULL
हो सकते हैं. कॉल करने वाले व्यक्ति को प्लेसहोल्डर देने की ज़रूरत नहीं है.
उदाहरण के लिए, हो सकता है कि कुछ कुंजी टाइप और मोड, inParams
आर्ग्युमेंट से begin
तक की किसी भी वैल्यू का इस्तेमाल न करें. इसलिए, कॉलर inParams
को NULL
पर सेट कर सकता है या खाली पैरामीटर सेट कर सकता है. कॉलर, इस्तेमाल न किए गए पैरामीटर भी दे सकते हैं. साथ ही, Keymaster के तरीकों से गड़बड़ियां नहीं होनी चाहिए.
अगर ज़रूरी इनपुट पैरामीटर NULL
है, तो Keymaster के तरीके ErrorCode::UNEXPECTED_NULL_POINTER
दिखाने चाहिए.
Keymaster 3 में, पॉइंटर पैरामीटर नहीं होते. सभी पैरामीटर को वैल्यू या const रेफ़रंस के ज़रिए पास किया जाता है.
आउटपुट पॉइंटर पैरामीटर
वर्शन: 1, 2
इनपुट पॉइंटर पैरामीटर की तरह ही, इस्तेमाल नहीं किए गए आउटपुट पॉइंटर पैरामीटर भी NULL
हो सकते हैं. अगर किसी तरीके को NULL
के तौर पर मिले आउटपुट पैरामीटर में डेटा दिखाना है, तो उसे ErrorCode::OUTPUT_PARAMETER_NULL
दिखाना चाहिए.
Keymaster 3 में, पॉइंटर पैरामीटर नहीं होते. सभी पैरामीटर को वैल्यू या const रेफ़रंस के ज़रिए पास किया जाता है.
एपीआई का गलत इस्तेमाल
वर्शन: 1, 2, 3
कॉल करने वाले कई तरह से ऐसे अनुरोध कर सकते हैं जो समझ में न आएं या बेवकूफ़ी भरे हों, लेकिन तकनीकी तौर पर गलत न हों. ऐसे मामलों में, Keymaster लागू करने के लिए, डिवाइस के काम न करने या गड़बड़ी की जानकारी देने की ज़रूरत नहीं होती. बहुत छोटी कुंजियों का इस्तेमाल, काम के न होने वाले इनपुट पैरामीटर की जानकारी, आईवी या नॉन्स का फिर से इस्तेमाल, बिना किसी मकसद के कुंजियों का जनरेशन वगैरह का पता लगाने के लिए, लागू करने की प्रक्रिया का इस्तेमाल नहीं किया जाना चाहिए. ज़रूरी पैरामीटर को शामिल न करने, ज़रूरी अमान्य पैरामीटर की जानकारी देने, और ऐसी ही अन्य गड़बड़ियों का पता लगाया जाना चाहिए.
ऐप्लिकेशन, फ़्रेमवर्क, और Android की-स्टोर की यह ज़िम्मेदारी है कि वे यह पक्का करें कि Keymaster मॉड्यूल को किए जाने वाले कॉल सही और काम के हों.
फ़ंक्शन
getHardwareFeatures
वर्शन: 3
getHardwareFeatures
का नया तरीका, क्लाइंट को सुरक्षित हार्डवेयर की कुछ अहम विशेषताओं के बारे में बताता है.
यह तरीका कोई आर्ग्युमेंट नहीं लेता और चार वैल्यू दिखाता है, जो सभी बूलियन होती हैं:
- अगर कुंजियों को सुरक्षित हार्डवेयर (उदाहरण के लिए, टीईई) में सेव किया जाता है और उन्हें कभी भी वहां से बाहर नहीं भेजा जाता, तो
isSecure
true
होता है. supportsEllipticCurve
true
है, अगर हार्डवेयर में एनआईएसटी कर्व (P-224, P-256, P-384, और P-521) के साथ एलिप्टिक कर्व क्रिप्टोग्राफ़ी की सुविधा काम करती है.supportsSymmetricCryptography
true
होता है अगर हार्डवेयर, एईएस और एचएमएसी के साथ-साथ सिमेट्रिक क्रिप्टोग्राफ़ी के साथ काम करता है.supportsAttestation
true
होता है, अगर हार्डवेयर में, सुरक्षित माहौल में डाली गई कुंजी से हस्ताक्षर किए गए, Keymaster के सार्वजनिक पासकोड की पुष्टि करने वाले सर्टिफ़िकेट जनरेट करने की सुविधा होती है.
इस तरीके से, सिर्फ़ ErrorCode:OK
, ErrorCode::KEYMASTER_NOT_CONFIGURED
या गड़बड़ी का कोई ऐसा कोड दिख सकता है जिससे पता चलता हो कि सुरक्षित हार्डवेयर से संपर्क नहीं हो पा रहा है.
getHardwareFeatures() generates(bool isSecure, bool supportsEllipticCurve, bool supportsSymmetricCryptography, bool supportsAttestation, bool supportsAllDigests, string keymasterName, string keymasterAuthorName);
कॉन्फ़िगर करो
वर्शन: 2
इस फ़ंक्शन को Keymaster 2 में लॉन्च किया गया था और Keymaster 3 में बंद कर दिया गया था. इसकी वजह यह है कि यह जानकारी सिस्टम प्रॉपर्टी फ़ाइलों में उपलब्ध होती है और मैन्युफ़ैक्चरर के लागू होने की प्रोसेस, स्टार्टअप के दौरान उन फ़ाइलों को पढ़ती है.
Keymaster को कॉन्फ़िगर करता है. डिवाइस खुलने के बाद और उसका इस्तेमाल करने से पहले, इस तरीके को एक बार कॉल किया जाता है. इसका इस्तेमाल,
KM_TAG_OS_VERSION
और
KM_TAG_OS_PATCHLEVEL
को
कीमास्टर को देने के लिए किया जाता है. जब तक इस तरीके को कॉल नहीं किया जाता, तब तक अन्य सभी तरीके KM_ERROR_KEYMASTER_NOT_CONFIGURED
दिखाते हैं. इस तरीके से दी गई वैल्यू को, keymaster हर बार सिर्फ़ एक बार स्वीकार करता है. इसके बाद के कॉल, KM_ERROR_OK
दिखाते हैं, लेकिन कुछ नहीं करते.
अगर पासकोड मैनेजर को सुरक्षित हार्डवेयर में लागू किया गया है और दिए गए ओएस वर्शन और पैच लेवल की वैल्यू, बूटलोडर से सुरक्षित हार्डवेयर को दी गई वैल्यू से मेल नहीं खाती हैं (या बूटलोडर ने वैल्यू नहीं दी हैं), तो यह तरीका KM_ERROR_INVALID_ARGUMENT
दिखाता है. साथ ही, अन्य सभी तरीके KM_ERROR_KEYMASTER_NOT_CONFIGURED
दिखाते रहेंगे.
keymaster_error_t (*configure)(const struct keymaster2_device* dev, const keymaster_key_param_set_t* params);
addRngEntropy
वर्शन: 1, 2, 3
इस फ़ंक्शन को Keymaster 1 में add_rng_entropy
के तौर पर लॉन्च किया गया था और Keymaster 3 में इसका नाम बदल दिया गया.
कॉल करने वाले व्यक्ति से मिले एन्ट्रापी को पूल में जोड़ता है. इस पूल का इस्तेमाल, Keymaster 1 लागू करने के लिए किया जाता है. इससे कुंजियों, आईवी, और अन्य चीज़ों के लिए, रैंडम नंबर जनरेट किए जाते हैं.
Keymaster को लागू करने के लिए, दिए गए एन्ट्रापी को अपने पूल में सुरक्षित तरीके से मिलाना ज़रूरी है. इसमें, हार्डवेयर रैंडम नंबर जनरेटर से जनरेट किया गया एन्ट्रापी भी शामिल होना चाहिए.
डेटा को इस तरह मिक्स किया जाना चाहिए कि हमलावर के पास addRngEntropy
से मिले बिट या हार्डवेयर से जनरेट किए गए बिट में से किसी एक का पूरा कंट्रोल हो, लेकिन दोनों का नहीं. ऐसा होने पर, हमलावर को एन्ट्रापी पूल से जनरेट किए गए बिट का अनुमान लगाने में कोई फ़ायदा नहीं मिलेगा.
Keymaster के ऐसे लागू होने वाले वर्शन जो अपने इंटरनल पूल में एन्ट्रापी का अनुमान लगाने की कोशिश करते हैं, वे यह मानते हैं कि addRngEntropy
से मिले डेटा में कोई एन्ट्रापी नहीं है. अगर एक ही कॉल में 2 कि॰ब॰ से ज़्यादा डेटा दिया जाता है, तो Keymaster लागू करने पर ErrorCode::INVALID_INPUT_LENGTH
दिख सकता है.
generateKey
वर्शन: 1, 2, 3
इस फ़ंक्शन को Keymaster 1 में generate_key
के तौर पर लॉन्च किया गया था और Keymaster 3 में इसका नाम बदल दिया गया.
इससे एक नई क्रिप्टोग्राफ़िक कुंजी जनरेट होती है. इसमें, उससे जुड़ी अनुमतियां भी शामिल होती हैं, जो कुंजी से हमेशा जुड़ी रहती हैं. Keymaster लागू करने से, कुंजी को जनरेट करने के समय दी गई अनुमतियों के मुताबिक इस्तेमाल करना असंभव हो जाता है. जिन अनुमतियों को सुरक्षित हार्डवेयर लागू नहीं कर सकता उनके लिए, सुरक्षित हार्डवेयर की ज़िम्मेदारी सिर्फ़ यह पक्का करना है कि कुंजी से जुड़ी उन अनुमतियों में बदलाव न किया जा सके जिन्हें लागू नहीं किया जा सकता. इससे, getKeyCharacteristics
को किए जाने वाले हर कॉल से मूल वैल्यू मिलती है. इसके अलावा, generateKey
से मिली विशेषताओं की मदद से, अनुमतियों को हार्डवेयर और सॉफ़्टवेयर से लागू होने वाली सूचियों के बीच सही तरीके से बांटा जाता है. ज़्यादा जानकारी के लिए,
getKeyCharacteristics
पर जाएं.
generateKey
फ़ंक्शन में दिए गए पैरामीटर, जनरेट की जा रही कुंजी के टाइप पर निर्भर करते हैं. इस सेक्शन में, हर तरह की कुंजी के लिए ज़रूरी और वैकल्पिक टैग की खास जानकारी दी गई है. टाइप बताने के लिए, Tag::ALGORITHM
का इस्तेमाल करना हमेशा ज़रूरी होता है.
आरएसए कुंजियां
आरएसए पासकोड जनरेट करने के लिए, ये पैरामीटर ज़रूरी हैं.
Tag::KEY_SIZE
सार्वजनिक मॉड्यूल का साइज़, बिट में बताता है. अगर इसे छोड़ दिया जाता है, तो यह तरीकाErrorCode::UNSUPPORTED_KEY_SIZE
दिखाता है. इन वैल्यू का इस्तेमाल किया जा सकता है: 1024, 2048, 3072, और 4096. सुझाई गई वैल्यू, ऐसे सभी पासकोड साइज़ हैं जो 8 के मल्टीपल हैं.Tag::RSA_PUBLIC_EXPONENT
आरएसए पब्लिक एक्सपोनेंट की वैल्यू बताता है. अगर इसे छोड़ दिया जाता है, तो यह तरीकाErrorCode::INVALID_ARGUMENT
दिखाता है. इन वैल्यू का इस्तेमाल किया जा सकता है: 3 और 65537. सुझाई गई वैल्यू, 2^64 तक की सभी प्राइम वैल्यू हैं.
आरएसए कुंजी जनरेट करने के लिए, यहां दिए गए पैरामीटर ज़रूरी नहीं हैं. हालांकि, इनके बिना आरएसए कुंजी बनाने पर, ऐसी कुंजी बनती है जिसका इस्तेमाल नहीं किया जा सकता. हालांकि, अगर इन पैरामीटर को छोड़ दिया जाता है, तो generateKey
फ़ंक्शन कोई गड़बड़ी नहीं दिखाता.
Tag::PURPOSE
से, अनुमति वाले मकसदों के बारे में पता चलता है. आरएसए कुंजियों के लिए, सभी कामों के लिए, किसी भी कॉम्बिनेशन में काम करना ज़रूरी है.Tag::DIGEST
, डाइजेस्ट एल्गोरिदम के बारे में बताता है. इनका इस्तेमाल नई कुंजी के साथ किया जा सकता है. ऐसे लागू किए गए एल्गोरिदम जो सभी डाइजेस्ट एल्गोरिदम के साथ काम नहीं करते, उन्हें ऐसे पासकोड जनरेशन के अनुरोध स्वीकार करने होंगे जिनमें काम न करने वाले डाइजेस्ट शामिल हों. काम न करने वाले डाइजेस्ट को, रिटर्न की गई मुख्य विशेषताओं में, सॉफ़्टवेयर से लागू की गई सूची में रखा जाना चाहिए. ऐसा इसलिए है, क्योंकि पासकोड को उन दूसरे डाइजेस्ट के साथ इस्तेमाल किया जा सकता है, लेकिन डाइजेस्ट करने की प्रोसेस, सॉफ़्टवेयर में की जाती है. इसके बाद,Digest::NONE
के साथ ऑपरेशन करने के लिए हार्डवेयर को कॉल किया जाता है.Tag::PADDING
, पैडिंग मोड के बारे में बताता है. इनका इस्तेमाल, नई कुंजी के साथ किया जा सकता है. अगर डिजेस्ट एल्गोरिदम के इस्तेमाल की जानकारी दी गई है, तो ऐसे एल्गोरिदम के लिए,PaddingMode::RSA_PSS
औरPaddingMode::RSA_OAEP
को मुख्य विशेषताओं की सूची में शामिल करना होगा. ऐसा उन एल्गोरिदम के लिए करना होगा जो काम नहीं करते.
ईसीडीएसए कुंजियां
ईसीएसडीए कुंजी जनरेट करने के लिए, सिर्फ़ Tag::KEY_SIZE
की ज़रूरत होती है. ईसी ग्रुप चुनने के लिए, इस टैग का इस्तेमाल करें.
इन वैल्यू का इस्तेमाल किया जा सकता है: 224, 256, 384, और 521. ये वैल्यू, क्रमशः NIST p-224, p-256, p-384, और p521 कर्व को दिखाती हैं.
Tag::DIGEST
, काम की ECDSA कुंजी के लिए भी ज़रूरी है,
लेकिन इसे जनरेट करने के लिए ज़रूरी नहीं है.
एईएस कुंजियां
एईएस पासकोड जनरेट करने के लिए, सिर्फ़ Tag::KEY_SIZE
की ज़रूरत होती है. अगर इसे छोड़ दिया जाता है, तो यह तरीका ErrorCode::UNSUPPORTED_KEY_SIZE
दिखाता है. इन वैल्यू का इस्तेमाल किया जा सकता है:
128 और 256. साथ ही, 192-बिट एईएस कुंजियों के लिए वैकल्पिक सहायता भी उपलब्ध है.
नीचे दिए गए पैरामीटर, खास तौर पर AES पासकोड के लिए ज़रूरी हैं. हालांकि, इन्हें पासकोड जनरेट करने के लिए इस्तेमाल करना ज़रूरी नहीं है:
Tag::BLOCK_MODE
उन ब्लॉक मोड के बारे में बताता है जिनके साथ नई कुंजी का इस्तेमाल किया जा सकता है.Tag::PADDING
उन पैडिंग मोड के बारे में बताता है जिनका इस्तेमाल किया जा सकता है. यह सिर्फ़ ईसीबी और सीबीसी मोड के लिए काम का है.
अगर GCM ब्लॉक मोड की जानकारी दी गई है, तो Tag::MIN_MAC_LENGTH
दें.
अगर इसे छोड़ दिया जाता है, तो यह तरीका ErrorCode::MISSING_MIN_MAC_LENGTH
दिखाता है.
टैग की वैल्यू, 8 का गुणक होनी चाहिए और 96 से 128 के बीच होनी चाहिए.
एचएमएसी कुंजियां
एचएमएसी पासकोड जनरेट करने के लिए, ये पैरामीटर ज़रूरी हैं:
Tag::KEY_SIZE
'की' का साइज़ बिट में बताता है. 64 से कम वैल्यू और ऐसी वैल्यू जिनमें 8 का गुणक न हो, इस्तेमाल नहीं की जा सकतीं. 64 से 512 के बीच, आठ के सभी गुणक इस्तेमाल किए जा सकते हैं. ज़्यादा वैल्यू का इस्तेमाल किया जा सकता है.Tag::MIN_MAC_LENGTH
इस एट्रिब्यूट की वैल्यू से, कम से कम ऐसी मैक की लंबाई तय होती है जिन्हें इस कुंजी से जनरेट या पुष्टि की जा सकती है. वैल्यू, आठ की múltiplo है और कम से कम 64 है.Tag::DIGEST
कुंजी के लिए डाइजेस्ट एल्गोरिदम तय करता है. सिर्फ़ एक डाइजेस्ट दिया गया हो. ऐसा न होने पर,ErrorCode::UNSUPPORTED_DIGEST
दिखाएं. अगर ट्रस्टलेट में डाइजेस्ट काम नहीं करता है, तोErrorCode::UNSUPPORTED_DIGEST
दिखाएं.
मुख्य विशेषताएं
अगर विशेषताओं वाला आर्ग्युमेंट NULL
नहीं है, तो generateKey
, जनरेट किए गए नए पासकोड की विशेषताओं को, हार्डवेयर से लागू होने वाली और सॉफ़्टवेयर से लागू होने वाली सूचियों में बांटकर दिखाता है. किन विशेषताओं को किस सूची में शामिल किया जाता है, इसकी जानकारी पाने के लिए getKeyCharacteristics
देखें. दिखाए गए एट्रिब्यूट में, Tag::APPLICATION_ID
और Tag::APPLICATION_DATA
को छोड़कर, पासकोड जनरेट करने के लिए बताए गए सभी पैरामीटर शामिल होते हैं.
अगर इन टैग को मुख्य पैरामीटर में शामिल किया गया था, तो उन्हें दिखाए गए एट्रिब्यूट से हटा दिया जाता है, ताकि दिखाए गए मुख्य ब्लॉब की जांच करके उनकी वैल्यू न मिल सके. हालांकि, ये एन्क्रिप्शन की मदद से, पासकोड ब्लॉब से जुड़े होते हैं. इसलिए, अगर पासकोड का इस्तेमाल करते समय सही वैल्यू नहीं दी जाती हैं, तो पासकोड का इस्तेमाल नहीं किया जा सकता. इसी तरह, Tag::ROOT_OF_TRUST
को पासकोड से क्रिप्टोग्राफ़िक तरीके से जोड़ा जाता है. हालांकि, पासकोड बनाने या इंपोर्ट करने के दौरान इसकी जानकारी नहीं दी जा सकती और इसे कभी भी नहीं दिखाया जाता.
दिए गए टैग के अलावा, ट्रस्टलेट में KeyOrigin::GENERATED
वैल्यू के साथ Tag::ORIGIN
भी जोड़ा जाता है. अगर पासकोड को वापस नहीं लाया जा सकता, तो Tag::ROLLBACK_RESISTANT
जोड़ा जाता है.
रोलबैक रेज़िस्टेंस (कुंजी का दोबारा इस्तेमाल न हो पाना)
रोलबैक रेज़िस्टेंस का मतलब है कि जब किसी पासकोड को deleteKey
या deleteAllKeys
की मदद से मिटाया जाता है, तो सुरक्षित हार्डवेयर की मदद से यह पक्का किया जाता है कि उसे फिर कभी इस्तेमाल न किया जा सके. रोलबैक रेज़िस्टेंस के बिना लागू किए गए तरीके से, आम तौर पर कॉलर को जनरेट किया गया या इंपोर्ट किया गया पासकोड, पासकोड ब्लॉब के तौर पर मिलता है. यह एक एन्क्रिप्ट (सुरक्षित) और पुष्टि किया गया फ़ॉर्म होता है. जब पासकोड स्टोर, पासकोड ब्लॉब को मिटा देता है, तो पासकोड हट जाता है. हालांकि, अगर कोई हमलावर पहले पासकोड का डेटा वापस पा लेता है, तो वह उसे डिवाइस पर वापस ला सकता है.
अगर सुरक्षित हार्डवेयर यह गारंटी देता है कि मिटाई गई कुंजियों को बाद में वापस नहीं लाया जा सकता, तो कुंजी को रोलबैक से सुरक्षित माना जाता है. आम तौर पर, ऐसा किसी भरोसेमंद जगह पर अतिरिक्त कुंजी का मेटाडेटा सेव करके किया जाता है. इस मेटाडेटा में हमलावर हेर-फेर नहीं कर सकता. मोबाइल डिवाइसों पर, आम तौर पर रिप्ले प्रोटेक्टेड मेमोरी ब्लॉक (आरपीएमबी) का इस्तेमाल किया जाता है. बनाई जा सकने वाली कुंजियों की संख्या सीमित नहीं होती और रोलबैक रेज़िस्टेंस के लिए इस्तेमाल किए जाने वाले भरोसेमंद स्टोरेज का साइज़ सीमित हो सकता है. इसलिए, भले ही नए पासकोड के लिए रोलबैक रेज़िस्टेंस की सुविधा उपलब्ध न कराई जा सके, फिर भी इस तरीके से पासकोड जनरेट किया जा सकता है. ऐसे में, मुख्य विशेषताओं में Tag::ROLLBACK_RESISTANT
को नहीं जोड़ा जाना चाहिए.
getKeyCharacteristics
वर्शन: 1, 2, 3
इस फ़ंक्शन को Keymaster 1 में get_key_characteristics
के तौर पर लॉन्च किया गया था. Keymaster 3 में इसका नाम बदलकर
यह दी गई कुंजी से जुड़े पैरामीटर और अनुमतियां दिखाता है. इन्हें दो सेट में बांटा गया है: हार्डवेयर से लागू होने वाली अनुमतियां और सॉफ़्टवेयर से लागू होने वाली अनुमतियां. यहां दिया गया ब्यौरा, generateKey
और importKey
से मिली मुख्य विशेषताओं की सूचियों पर भी लागू होता है.
अगर कुंजी जनरेट करने या इंपोर्ट करने के दौरान Tag::APPLICATION_ID
दिया गया था, तो clientId
आर्ग्युमेंट में यही वैल्यू इस तरीके के लिए दी जाती है. ऐसा न होने पर, तरीका ErrorCode::INVALID_KEY_BLOB
दिखाता है. इसी तरह, अगर जनरेट करने या इंपोर्ट करने के दौरान Tag::APPLICATION_DATA
दिया गया था, तो appData
आर्ग्युमेंट में इस तरीके के लिए वही वैल्यू दी जाती है.
इस तरीके से मिली विशेषताओं से, दी गई कुंजी के टाइप और इस्तेमाल के बारे में पूरी जानकारी मिलती है.
यह तय करने का सामान्य नियम है कि कोई टैग, हार्डवेयर से लागू होने वाली पाबंदियों की सूची में आता है या सॉफ़्टवेयर से लागू होने वाली पाबंदियों की सूची में, यह इस बात पर निर्भर करता है कि टैग का मतलब, सुरक्षित हार्डवेयर से पूरी तरह से पक्का किया जाता है या नहीं. ऐसा न करने पर, इसे सॉफ़्टवेयर से लागू किया जाता है. यहां कुछ खास टैग की सूची दी गई है, जिनके सही ऐलोकेशन के बारे में शायद साफ़ तौर पर न पता हो:
Tag::ALGORITHM
,Tag::KEY_SIZE
, औरTag::RSA_PUBLIC_EXPONENT
पासकोड की खास विशेषताएं हैं. हार्डवेयर से सुरक्षित की गई किसी भी कुंजी के लिए, ये टैग, हार्डवेयर से लागू की गई सूची में होते हैं.Tag::DIGEST
वैल्यू, सुरक्षित हार्डवेयर के साथ काम करती हैं. इन्हें, हार्डवेयर के साथ काम करने वाली सूची में रखा जाता है. काम न करने वाले डाइजेस्ट, काम करने वाले सॉफ़्टवेयर की सूची में शामिल हो जाते हैं.Tag::PADDING
वैल्यू आम तौर पर, हार्डवेयर के साथ काम करने वाले डिवाइसों की सूची में शामिल होती हैं. ऐसा तब तक होता है, जब तक कि किसी खास पैडिंग मोड को सॉफ़्टवेयर से पूरा नहीं किया जाता. ऐसे में, उन्हें सॉफ़्टवेयर से लागू होने वाली पाबंदियों की सूची में शामिल किया जाता है. ऐसा उन आरएसए कुंजियों के लिए हो सकता है जो ऐसे डाइजेस्ट एल्गोरिदम के साथ PSS या OAEP पैडिंग की अनुमति देते हैं जो सुरक्षित हार्डवेयर के साथ काम नहीं करते.Tag::USER_SECURE_ID
औरTag::USER_AUTH_TYPE
को हार्डवेयर से सिर्फ़ तब लागू किया जाता है, जब उपयोगकर्ता की पुष्टि करने के लिए हार्डवेयर का इस्तेमाल किया जाता है. ऐसा करने के लिए, Keymaster ट्रस्टलेट और पुष्टि करने वाले ट्रस्टलेट, दोनों को सुरक्षित होना चाहिए. साथ ही, दोनों के पास एक ऐसी एचएमएसी कुंजी होनी चाहिए जिसका इस्तेमाल, पुष्टि करने वाले टोकन पर हस्ताक्षर करने और उनकी पुष्टि करने के लिए किया जाता है. ज़्यादा जानकारी के लिए, पुष्टि पेज देखें.Tag::ACTIVE_DATETIME
,Tag::ORIGINATION_EXPIRE_DATETIME
, औरTag::USAGE_EXPIRE_DATETIME
टैग के लिए, ऐसी दीवार घड़ी का ऐक्सेस ज़रूरी है जिसकी पुष्टि की जा सके. ज़्यादातर सुरक्षित हार्डवेयर के पास, सिर्फ़ उस समय की जानकारी का ऐक्सेस होता है जो असुरक्षित ओएस से मिलती है. इसका मतलब है कि टैग, सॉफ़्टवेयर से लागू होते हैं.- हार्डवेयर से जुड़ी कुंजियों के लिए,
Tag::ORIGIN
हमेशा हार्डवेयर की सूची में शामिल होता है. इस सूची में मौजूद होने का मतलब है कि ऊपर की लेयर यह तय करती हैं कि कुंजी, हार्डवेयर से सुरक्षित है या नहीं.
importKey
वर्शन: 1, 2, 3
इस फ़ंक्शन को Keymaster 1 में import_key
के तौर पर लॉन्च किया गया था और Keymaster 3 में इसका नाम बदल दिया गया.
Keymaster हार्डवेयर में पासकोड इंपोर्ट करता है. मुख्य परिभाषा पैरामीटर और आउटपुट की विशेषताओं को generateKey
की तरह ही मैनेज किया जाता है. हालांकि, इनमें ये अपवाद हैं:
- इनपुट पैरामीटर में
Tag::KEY_SIZE
औरTag::RSA_PUBLIC_EXPONENT
(सिर्फ़ आरएसए कुंजियों के लिए) की ज़रूरत नहीं होती. अगर यह एट्रिब्यूट नहीं दिया जाता है, तो ट्रस्टलेट, दिए गए मुख्य कॉन्टेंट से वैल्यू का पता लगाता है और मुख्य विशेषताओं में सही टैग और वैल्यू जोड़ता है. अगर पैरामीटर दिए जाते हैं, तो ट्रस्टलेट उनकी पुष्टि, पासकोड के आधार पर करता है. अगर वैल्यू मेल नहीं खाती है, तो यह तरीकाErrorCode::IMPORT_PARAMETER_MISMATCH
दिखाता है. Tag::ORIGIN
की वैल्यू,KeyOrigin::IMPORTED
की वैल्यू के बराबर होती है.
exportKey
वर्शन: 1, 2, 3
इस फ़ंक्शन को Keymaster 1 में export_key
के तौर पर लॉन्च किया गया था और Keymaster 3 में इसका नाम बदल दिया गया.
Keymaster आरएसए या ईसी कुंजी पेयर से सार्वजनिक कुंजी एक्सपोर्ट करता है.
अगर कुंजी जनरेट करने या इंपोर्ट करने के दौरान Tag::APPLICATION_ID
दिया गया था, तो clientId
आर्ग्युमेंट में इस तरीके के लिए वही वैल्यू दी जाती है. ऐसा न होने पर, यह तरीका ErrorCode::INVALID_KEY_BLOB
दिखाता है. इसी तरह, अगर जनरेट करने या इंपोर्ट करने के दौरान Tag::APPLICATION_DATA
दी गई थी, तो appData
आर्ग्युमेंट में इस तरीके के लिए वही वैल्यू दी जाती है.
deleteKey
वर्शन: 1, 2, 3
इस फ़ंक्शन को Keymaster 1 में delete_key
के तौर पर लॉन्च किया गया था और Keymaster 3 में इसका नाम बदल दिया गया.
दी गई कुंजी को मिटाता है. यह तरीका ज़रूरी नहीं है. इसे सिर्फ़ ऐसे Keymaster मॉड्यूल लागू करते हैं जो रोलबैक रेज़िस्टेंस देते हैं.
deleteAllKeys
वर्शन: 1, 2, 3
इस फ़ंक्शन को Keymaster 1 में delete_all_keys
के तौर पर लॉन्च किया गया था और Keymaster 3 में इसका नाम बदल दिया गया.
सभी कुंजियों को मिटाता है. यह तरीका ज़रूरी नहीं है. इसे सिर्फ़ ऐसे Keymaster मॉड्यूल लागू करते हैं जो रोलबैक रेज़िस्टेंस देते हैं.
destroyAttestationIds
वर्शन: 3
destroyAttestationIds()
तरीके का इस्तेमाल, आईडी की पुष्टि की नई सुविधा को हमेशा के लिए बंद करने के लिए किया जाता है. हालांकि, इस सुविधा का इस्तेमाल करना ज़रूरी नहीं है, लेकिन इसका सुझाव दिया जाता है. अगर टीईई के पास यह पक्का करने का कोई तरीका नहीं है कि इस तरीके को कॉल करने के बाद, आईडी की पुष्टि की सुविधा हमेशा के लिए बंद हो गई है, तो आईडी की पुष्टि की सुविधा को बिलकुल भी लागू नहीं किया जाना चाहिए. इस मामले में, यह तरीका कुछ नहीं करता और ErrorCode::UNIMPLEMENTED
दिखाता है. अगर आईडी की पुष्टि की सुविधा काम करती है, तो इस तरीके को लागू करना ज़रूरी है. साथ ही, आने वाले समय में आईडी की पुष्टि करने की सभी कोशिशों को हमेशा के लिए बंद कर देना चाहिए. इस तरीके को जितनी चाहे उतनी बार कॉल किया जा सकता है. अगर आईडी की पुष्टि करने की सुविधा पहले से ही हमेशा के लिए बंद है, तो यह तरीका कुछ नहीं करता और ErrorCode::OK
दिखाता है.
इस तरीके से सिर्फ़ ये गड़बड़ी कोड दिख सकते हैं:
ErrorCode::UNIMPLEMENTED
(अगर आईडी की पुष्टि करने की सुविधा काम नहीं करती),
ErrorCode:OK
, ErrorCode::KEYMASTER_NOT_CONFIGURED
या
सुरक्षित हार्डवेयर के साथ कम्यूनिकेट करने में हुई गड़बड़ी का कोई एक कोड.
चालू करें
वर्शन: 1, 2, 3
यह फ़ंक्शन, दिए गए पैरामीटर के साथ, बताई गई कुंजी का इस्तेमाल करके, बताए गए मकसद के लिए क्रिप्टोग्राफ़िक ऑपरेशन शुरू करता है. साथ ही, ऑपरेशन हैंडल दिखाता है. इस हैंडल का इस्तेमाल, ऑपरेशन पूरा करने के लिए update
और finish
के साथ किया जाता है. पुष्टि किए गए ऑपरेशन में, ऑपरेशन हैंडल का इस्तेमाल चैलेंज टोकन के तौर पर भी किया जाता है. साथ ही, ऐसे ऑपरेशन के लिए, पुष्टि करने वाले टोकन के challenge
फ़ील्ड में शामिल किया जाता है.
Keymaster लागू करने पर, एक साथ कम से कम 16 ऑपरेशन किए जा सकते हैं. Keystore में ज़्यादा से ज़्यादा 15 पासकोड सेव किए जा सकते हैं. एक पासकोड, vold के पासवर्ड एन्क्रिप्शन के लिए सेव किया जाता है. जब Keystore में 15 ऑपरेशन चल रहे हों (begin
को कॉल किया गया है, लेकिन finish
या abort
को कॉल नहीं किया गया है) और उसे 16वां ऑपरेशन शुरू करने का अनुरोध मिलता है, तो वह हाल ही में सबसे कम इस्तेमाल किए गए ऑपरेशन पर abort
को कॉल करता है. इससे, चालू ऑपरेशन की संख्या को 14 पर कम करने के बाद, begin
को कॉल करके नया ऑपरेशन शुरू किया जाता है.
अगर कुंजी जनरेट करने या इंपोर्ट करने के दौरान, Tag::APPLICATION_ID
या Tag::APPLICATION_DATA
तय किए गए थे, तो begin
के कॉल में उन टैग को शामिल किया जाता है जिनकी वैल्यू, इस तरीके के inParams
आर्ग्युमेंट में मूल रूप से तय की गई थी.
अनुमति लागू करना
इस तरीके के दौरान, ट्रस्टलेट इन कुंजियों की अनुमतियों को लागू करता है. ऐसा तब होता है, जब इन्हें लागू करने के लिए, हार्डवेयर से लागू होने वाली सुविधाओं को चुना गया हो और यह कार्रवाई, सार्वजनिक कुंजी से की जा रही कार्रवाई न हो. आरएसए या ईसी कुंजियों के साथ, सार्वजनिक कुंजी के ऑपरेशन, यानी KeyPurpose::ENCRYPT
और KeyPurpose::VERIFY
, को अनुमति की ज़रूरी शर्तें पूरी न होने पर भी पूरा करने की अनुमति है.
Tag::PURPOSE
:begin()
कॉल में बताए गए मकसद को, पासकोड की अनुमतियों में बताए गए किसी एक मकसद से मैच करना होगा. ऐसा तब तक ज़रूरी है, जब तक अनुरोध किया गया ऑपरेशन, सार्वजनिक पासकोड से जुड़ा ऑपरेशन न हो. अगर बताई गई वजह मेल नहीं खाती और कार्रवाई, सार्वजनिक कुंजी से जुड़ी कार्रवाई नहीं है, तोbegin
ErrorCode::UNSUPPORTED_PURPOSE
दिखाता है. सार्वजनिक कुंजी से जुड़े ऑपरेशन, एसिमेट्रिक एन्क्रिप्शन या पुष्टि करने वाले ऑपरेशन होते हैं.Tag::ACTIVE_DATETIME
को सिर्फ़ तब लागू किया जा सकता है, जब यूटीसी टाइम का भरोसेमंद सोर्स उपलब्ध हो. अगर मौजूदा तारीख और समय, टैग की वैल्यू से पहले का है, तो यह तरीकाErrorCode::KEY_NOT_YET_VALID
दिखाता है.Tag::ORIGINATION_EXPIRE_DATETIME
को सिर्फ़ तब लागू किया जा सकता है, जब यूटीसी टाइम का भरोसेमंद सोर्स उपलब्ध हो. अगर मौजूदा तारीख और समय, टैग की वैल्यू से बाद का है और मकसदKeyPurpose::ENCRYPT
याKeyPurpose::SIGN
है, तो यह तरीकाErrorCode::KEY_EXPIRED
दिखाता है.Tag::USAGE_EXPIRE_DATETIME
को सिर्फ़ तब लागू किया जा सकता है, जब यूटीसी टाइम का भरोसेमंद सोर्स उपलब्ध हो. अगर मौजूदा तारीख और समय, टैग की वैल्यू से बाद का है और मकसदKeyPurpose::DECRYPT
याKeyPurpose::VERIFY
है, तो यह तरीकाErrorCode::KEY_EXPIRED
दिखाता है.Tag::MIN_SECONDS_BETWEEN_OPS
की तुलना, भरोसेमंद रिलेटिव टाइमर से की जाती है. इससे, पासकोड के आखिरी इस्तेमाल का पता चलता है. अगर आखिरी बार इस्तेमाल करने का समय और टैग की वैल्यू, मौजूदा समय से कम है, तो यह तरीकाErrorCode::KEY_RATE_LIMIT_EXCEEDED
दिखाता है. लागू करने से जुड़ी ज़रूरी जानकारी के लिए, टैग की जानकारी देखें.Tag::MAX_USES_PER_BOOT
की तुलना, एक सुरक्षित काउंटर से की जाती है. यह काउंटर, डिवाइस के बूट होने के बाद से कुंजी के इस्तेमाल को ट्रैक करता है. अगर पिछले इस्तेमाल की संख्या, टैग की वैल्यू से ज़्यादा है, तो तरीकाErrorCode::KEY_MAX_OPS_EXCEEDED
दिखाता है.Tag::USER_SECURE_ID
को इस तरीके से सिर्फ़ तब लागू किया जाता है, जब पासकोड मेंTag::AUTH_TIMEOUT
भी हो. अगर पासकोड में दोनों शामिल हैं, तो इस तरीके सेinParams
में एक मान्यTag::AUTH_TOKEN
मिलना चाहिए. पुष्टि करने वाला टोकन मान्य हो, इसके लिए ये सभी बातें सही होनी चाहिए:- HMAC फ़ील्ड की पुष्टि सही तरीके से की गई हो.
- पासकोड में मौजूद कम से कम एक वैल्यू,
Tag::USER_SECURE_ID
पासकोड में मौजूद कम से कम एक सुरक्षित आईडी वैल्यू से मैच करती हो. - पासकोड में एक ऐसा
Tag::USER_AUTH_TYPE
होता है जो टोकन में मौजूद पुष्टि करने के तरीके से मेल खाता है.
अगर इनमें से कोई भी शर्त पूरी नहीं होती है, तो यह तरीका
ErrorCode::KEY_USER_NOT_AUTHENTICATED
दिखाता है.Tag::CALLER_NONCE
कॉलर को नॉन्स या इनिशलाइज़ेशन वेक्टर (IV) तय करने की अनुमति देता है. अगर कुंजी में यह टैग नहीं है, लेकिन कॉल करने वाले ने इस तरीके के लिएTag::NONCE
दिया है, तोErrorCode::CALLER_NONCE_PROHIBITED
दिखाया जाता है.Tag::BOOTLOADER_ONLY
इससे पता चलता है कि सिर्फ़ बूटलोडर ही कुंजी का इस्तेमाल कर सकता है. अगर बूटलोडर के काम पूरा होने के बाद, इस तरीके को सिर्फ़ बूटलोडर पासकोड के साथ कॉल किया जाता है, तो यहErrorCode::INVALID_KEY_BLOB
दिखाता है.
आरएसए कुंजियां
आरएसए कुंजी के सभी ऑपरेशन, inParams
में सिर्फ़ एक पैडिंग मोड तय करते हैं.
अगर कोई वैल्यू नहीं दी गई है या एक से ज़्यादा वैल्यू दी गई हैं, तो यह तरीका ErrorCode::UNSUPPORTED_PADDING_MODE
दिखाता है.
आरएसए साइनिंग और पुष्टि करने की कार्रवाइयों के लिए डाइजेस्ट की ज़रूरत होती है. OAEP पैडिंग मोड के साथ आरएसए एन्क्रिप्शन और डिक्रिप्शन की कार्रवाइयों के लिए भी डाइजेस्ट की ज़रूरत होती है. ऐसे मामलों में, कॉलर inParams
में सिर्फ़ एक डाइजेस्ट तय करता है. अगर कोई वैल्यू नहीं दी गई है या एक से ज़्यादा वैल्यू दी गई हैं, तो यह तरीका ErrorCode::UNSUPPORTED_DIGEST
दिखाता है.
निजी कुंजी के ऑपरेशन (KeyPurpose::DECYPT
और KeyPurpose::SIGN
) के लिए, डाइजेस्ट और पैडिंग की अनुमति की ज़रूरत होती है. इसका मतलब है कि कुंजी की अनुमतियों में बताई गई वैल्यू होनी चाहिए. अगर ऐसा नहीं है, तो यह तरीका ErrorCode::INCOMPATIBLE_DIGEST
या ErrorCode::INCOMPATIBLE_PADDING
दिखाता है. बिना अनुमति वाले डाइजेस्ट या पैडिंग के साथ, सार्वजनिक कुंजी के ऑपरेशन (KeyPurpose::ENCRYPT
और KeyPurpose::VERIFY
) की अनुमति है.
PaddingMode::NONE
को छोड़कर, आरएसए पैडिंग के सभी मोड सिर्फ़ कुछ कामों के लिए लागू होते हैं. खास तौर पर,
PaddingMode::RSA_PKCS1_1_5_SIGN
और PaddingMode::RSA_PSS
सिर्फ़ हस्ताक्षर करने और पुष्टि करने की सुविधा देते हैं. वहीं, PaddingMode::RSA_PKCS1_1_1_5_ENCRYPT
और PaddingMode::RSA_OAEP
सिर्फ़ एन्क्रिप्ट (सुरक्षित) और डिक्रिप्ट (सुरक्षित करने की प्रक्रिया को वापस पहले जैसा करना) करने की सुविधा देते हैं.
अगर तय किया गया मोड, तय किए गए मकसद के साथ काम नहीं करता है, तो यह तरीका ErrorCode::UNSUPPORTED_PADDING_MODE
दिखाता है.
पैडिंग मोड और डाइजेस्ट के बीच कुछ अहम इंटरैक्शन होते हैं:
PaddingMode::NONE
से पता चलता है कि रॉ आरएसए ऑपरेशन किया गया है. अगर हस्ताक्षर या पुष्टि की जा रही है, तो डाइजेस्ट के लिएDigest::NONE
का इस्तेमाल किया जाता है. बिना पैड किए एन्क्रिप्ट (सुरक्षित) करने या डिक्रिप्ट (अनचाहे डेटा हटाकर मूल डेटा वापस लाने) करने के लिए, डाइजेस्ट की ज़रूरत नहीं होती.PaddingMode::RSA_PKCS1_1_5_SIGN
पैडिंग के लिए डाइजेस्ट की ज़रूरत होती है. डिगस्टDigest::NONE
हो सकता है. ऐसे में, Keymaster लागू करने की प्रोसेस, PKCS#1 v1.5 का सही हस्ताक्षर स्ट्रक्चर नहीं बना सकती, क्योंकि यह DigestInfo स्ट्रक्चर नहीं जोड़ सकती. इसके बजाय, लागू करने पर0x00 || 0x01 || PS || 0x00 || M
बनता है, जहां M दिया गया मैसेज है और PS पैडिंग स्ट्रिंग है. आरएसए कुंजी का साइज़, मैसेज से कम से कम 11 बाइट बड़ा होना चाहिए. ऐसा न होने पर, यह तरीकाErrorCode::INVALID_INPUT_LENGTH
दिखाता है.PaddingMode::RSA_PKCS1_1_1_5_ENCRYPT
पैडिंग के लिए, डाइजेस्ट की ज़रूरत नहीं होती.PaddingMode::RSA_PSS
पैडिंग के लिए डाइजेस्ट की ज़रूरत होती है, जोDigest::NONE
नहीं हो सकता. अगरDigest::NONE
तय किया गया है, तो तरीकाErrorCode::INCOMPATIBLE_DIGEST
दिखाता है. इसके अलावा, आरएसए कुंजी का साइज़, डाइजेस्ट के आउटपुट साइज़ से कम से कम 2 + D बाइट बड़ा होना चाहिए. यहां D, डाइजेस्ट का साइज़ है, जो बाइट में होता है. ऐसा न होने पर, यह तरीकाErrorCode::INCOMPATIBLE_DIGEST
दिखाता है. नमक का साइज़ D है.PaddingMode::RSA_OAEP
पैडिंग के लिए डाइजेस्ट की ज़रूरत होती है, जोDigest::NONE
नहीं हो सकता. अगरDigest::NONE
तय किया गया है, तो तरीकाErrorCode::INCOMPATIBLE_DIGEST
दिखाता है.
ईसी बटन
ईसी पासकोड के ऑपरेशन, inParams
में सिर्फ़ एक पैडिंग मोड तय करते हैं.
अगर कोई वैल्यू नहीं दी गई है या एक से ज़्यादा वैल्यू दी गई हैं, तो यह तरीका ErrorCode::UNSUPPORTED_PADDING_MODE
दिखाता है.
निजी कुंजी के ऑपरेशन (KeyPurpose::SIGN
) के लिए, डाइजेस्ट और पैडिंग की अनुमति की ज़रूरत होती है. इसका मतलब है कि कुंजी की अनुमतियों में बताई गई वैल्यू होनी चाहिए. अगर ऐसा नहीं है, तो ErrorCode::INCOMPATIBLE_DIGEST
दिखाएं. सार्वजनिक कुंजी के ऑपरेशन (KeyPurpose::VERIFY
) के लिए, बिना अनुमति वाले डाइजेस्ट या पैडिंग की अनुमति है.
एईएस कुंजियां
AES कुंजी के ऑपरेशन में, inParams
में एक ब्लॉक मोड और एक पैडिंग मोड तय किया जाता है. अगर कोई वैल्यू तय नहीं की गई है या एक से ज़्यादा बार तय की गई है, तो ErrorCode::UNSUPPORTED_BLOCK_MODE
या
ErrorCode::UNSUPPORTED_PADDING_MODE
दिखाएं. बताए गए मोड के लिए, पासकोड की अनुमति होनी चाहिए. ऐसा न होने पर, यह तरीका ErrorCode::INCOMPATIBLE_BLOCK_MODE
या ErrorCode::INCOMPATIBLE_PADDING_MODE
दिखाता है.
अगर ब्लॉक मोड BlockMode::GCM
है, तो inParams
Tag::MAC_LENGTH
तय करता है. साथ ही, बताई गई वैल्यू 8 का मल्टीपल होनी चाहिए, जो 128 से ज़्यादा या पासकोड की अनुमतियों में Tag::MIN_MAC_LENGTH
की वैल्यू से कम न हो. अगर एमएसी की लंबाई 128 से ज़्यादा है या 8 का multiple नहीं है, तो ErrorCode::UNSUPPORTED_MAC_LENGTH
दिखाएं. अगर वैल्यू, पासकोड की तय सीमा से कम है, तो ErrorCode::INVALID_MAC_LENGTH
दिखाएं.
अगर ब्लॉक मोड BlockMode::GCM
या BlockMode::CTR
है, तो पैडिंग मोड PaddingMode::NONE
होना चाहिए.
BlockMode::ECB
या BlockMode::CBC
के लिए, मोड PaddingMode::NONE
या PaddingMode::PKCS7
हो सकता है. अगर पैडिंग मोड इन शर्तों को पूरा नहीं करता है, तो ErrorCode::INCOMPATIBLE_PADDING_MODE
दिखाएं.
अगर ब्लॉक मोड BlockMode::CBC
, BlockMode::CTR
या BlockMode::GCM
है, तो इनिशिएलाइज़ेशन वेक्टर या नॉन्स की ज़रूरत होती है.
ज़्यादातर मामलों में, कॉल करने वालों को आईवी या नॉन्स देने की ज़रूरत नहीं होती. ऐसे में, Keymaster लागू करने पर, एक रैंडम IV या नॉन्स जनरेट होता है और उसे outParams
में Tag::NONCE
के साथ दिखाया जाता है.
CBC और CTR IV, 16 बाइट के होते हैं. GCM नॉन्स 12 बाइट के होते हैं. अगर पासकोड की अनुमतियों में Tag::CALLER_NONCE
शामिल है, तो कॉलर inParams
में Tag::NONCE
के साथ एक आईवी या नॉन्स दे सकता है. अगर Tag::CALLER_NONCE
के पास अनुमति नहीं है, लेकिन कोई नॉन्स दिया गया है, तो ErrorCode::CALLER_NONCE_PROHIBITED
दिखाएं.
अगर Tag::CALLER_NONCE
के अनुमति मिलने पर कोई नॉन्स नहीं दिया गया है, तो कोई रैंडम आईवी/नॉन्स जनरेट करें.
एचएमएसी कुंजियां
एचएमएसी कुंजी के ऑपरेशन, inParams
में Tag::MAC_LENGTH
तय करते हैं.
दी गई वैल्यू, 8 की गुना होनी चाहिए. यह डाइजेस्ट की लंबाई से ज़्यादा नहीं होनी चाहिए या पासकोड की अनुमतियों में Tag::MIN_MAC_LENGTH
की वैल्यू से कम नहीं होनी चाहिए. अगर मैक की लंबाई, डाइजेस्ट की लंबाई से ज़्यादा है या आठ के मल्टीपल नहीं है, तो ErrorCode::UNSUPPORTED_MAC_LENGTH
दिखाएं.
अगर वैल्यू, पासकोड की तय सीमा से कम है, तो ErrorCode::INVALID_MAC_LENGTH
दिखाएं.
अपडेट करें
वर्शन: 1, 2, 3
begin
से शुरू किए गए किसी मौजूदा ऑपरेशन में प्रोसेस करने के लिए डेटा उपलब्ध कराता है.
कार्रवाई, operationHandle
पैरामीटर से तय की जाती है.
बफ़र मैनेज करने के लिए ज़्यादा सुविधाएं देने के लिए, इस तरीके को लागू करने पर, दिए गए डेटा से कम डेटा का इस्तेमाल किया जा सकता है. कॉल करने वाले व्यक्ति को, बाद के कॉल में बाकी डेटा फ़ीड करने के लिए, लूपिंग की ज़िम्मेदारी लेनी होगी. इस्तेमाल किए गए इनपुट की संख्या, inputConsumed
पैरामीटर में दिखती है.
लागू करने के लिए, कम से कम एक बाइट का इस्तेमाल हमेशा किया जाता है. ऐसा तब तक होता है, जब तक कि ऑपरेशन और बाइट का इस्तेमाल नहीं किया जा सकता. अगर शून्य से ज़्यादा बाइट दिए जाते हैं और शून्य बाइट का इस्तेमाल किया जाता है, तो कॉलर इसे गड़बड़ी मानते हैं और ऑपरेशन को रोक देते हैं.
अपडेट के बाद, लागू करने वाले यह भी चुन सकते हैं कि कितना डेटा दिखाना है. यह सिर्फ़ एन्क्रिप्शन और डिक्रिप्शन के लिए ज़रूरी है, क्योंकि साइन करने और पुष्टि करने की प्रोसेस में finish
तक कोई डेटा नहीं मिलता.
डेटा को बफ़र करने के बजाय, उसे जल्द से जल्द दिखाएं.
गड़बड़ी ठीक करना
अगर यह तरीका ErrorCode::OK
के अलावा कोई दूसरा गड़बड़ी कोड दिखाता है, तो ऑपरेशन को रोक दिया जाता है और ऑपरेशन हैंडल अमान्य हो जाता है. इस तरीके का इस्तेमाल करके, हैंडल को आने वाले समय में इस्तेमाल करने पर, finish
या abort
के साथ ErrorCode::INVALID_OPERATION_HANDLE
दिखेगा.
अनुमति लागू करना
पासकोड की पुष्टि करने की प्रोसेस, मुख्य तौर पर begin
में की जाती है.
हालांकि, ऐसा तब नहीं होता, जब पासकोड:
- एक या उससे ज़्यादा
Tag::USER_SECURE_IDs
Tag::AUTH_TIMEOUT
इस मामले में, हर कार्रवाई के लिए पासकोड की अनुमति की ज़रूरत होती है. साथ ही, अपडेट करने के तरीके को inParams
आर्ग्युमेंट में Tag::AUTH_TOKEN
मिलता है. एचएमएस यह पुष्टि करता है कि टोकन मान्य है और उसमें एक मैच करने वाला सुरक्षित उपयोगकर्ता आईडी है. साथ ही, यह कुंजी के Tag::USER_AUTH_TYPE
से मैच करता है और challenge
फ़ील्ड में मौजूद मौजूदा ऑपरेशन का ऑपरेशन हैंडल है. अगर ये शर्तें पूरी नहीं होती हैं, तो ErrorCode::KEY_USER_NOT_AUTHENTICATED
दिखाएं.
कॉलर, update
और
finish
पर किए जाने वाले हर कॉल के लिए, ऑथेंटिकेशन टोकन उपलब्ध कराता है. लागू करने के लिए, टोकन की पुष्टि सिर्फ़ एक बार करनी होगी.
आरएसए कुंजियां
Digest::NONE
के साथ हस्ताक्षर करने और पुष्टि करने के लिए,
यह तरीका पूरे ब्लॉक को एक ही अपडेट में हस्ताक्षर करने या पुष्टि करने के लिए स्वीकार करता है. यह ब्लॉक के सिर्फ़ एक हिस्से का इस्तेमाल नहीं कर सकता. हालांकि, अगर कॉल करने वाला व्यक्ति एक से ज़्यादा अपडेट में डेटा देने का विकल्प चुनता है, तो यह तरीका उसे स्वीकार कर लेता है.
अगर कॉलर, हस्ताक्षर करने के लिए ज़्यादा डेटा देता है, तो ErrorCode::INVALID_INPUT_LENGTH
दिखाएं. ऐसा तब होता है, जब डेटा का साइज़, आरएसए पासकोड के साइज़ से ज़्यादा हो.
ईसीडीएसए कुंजियां
Digest::NONE
के साथ हस्ताक्षर करने और पुष्टि करने के लिए,
यह तरीका पूरे ब्लॉक को एक ही अपडेट में हस्ताक्षर करने या पुष्टि करने के लिए स्वीकार करता है. इस तरीके से, ब्लॉक के सिर्फ़ एक हिस्से का इस्तेमाल नहीं किया जा सकता.
हालांकि, अगर कॉलर एक से ज़्यादा अपडेट में डेटा देने का विकल्प चुनता है, तो यह तरीका उसे स्वीकार करता है. अगर कॉलर, हस्ताक्षर करने के लिए ज़रूरत से ज़्यादा डेटा देता है, तो डेटा को चुपचाप छोटा कर दिया जाता है. (यह, मिलते-जुलते आरएसए ऑपरेशन में दिए गए अतिरिक्त डेटा को मैनेज करने से अलग है. इसकी वजह, लेगसी क्लाइंट के साथ काम करना है.)
एईएस कुंजियां
AES GCM मोड, पुष्टि करने से जुड़े डेटा के साथ काम करता है. यह डेटा, inParams
आर्ग्युमेंट में Tag::ASSOCIATED_DATA
टैग के ज़रिए दिया जाता है.
इससे जुड़ा डेटा, बार-बार किए जाने वाले कॉल में दिया जा सकता है. यह तब ज़रूरी होता है, जब एक ही ब्लॉक में भेजने के लिए डेटा काफ़ी बड़ा हो. हालांकि, एन्क्रिप्ट (सुरक्षित) या डिक्रिप्ट (अनचाहे कोड को मूल कोड में बदलना) किए जाने वाले डेटा से पहले, यह डेटा हमेशा दिया जाता है. अपडेट कॉल में, एन्क्रिप्ट (सुरक्षित)/डिक्रिप्ट (सुरक्षित से सामान्य में बदलना) करने के लिए डेटा और उससे जुड़ा डेटा, दोनों शामिल किए जा सकते हैं. हालांकि, इसके बाद के अपडेट में उससे जुड़ा डेटा शामिल नहीं किया जा सकता. अगर कॉलर, एन्क्रिप्ट/डिक्रिप्ट करने के लिए डेटा वाले कॉल के बाद, अपडेट कॉल के लिए उससे जुड़ा डेटा उपलब्ध कराता है, तो ErrorCode::INVALID_TAG
दिखाएं.
GCM एन्क्रिप्शन के लिए, टैग को सिफरटेक्स्ट में finish
के बाद जोड़ा जाता है. डिक्रिप्ट करने के दौरान, आखिरी अपडेट कॉल के लिए दिए गए डेटा के आखिरी Tag::MAC_LENGTH
बाइट टैग होते हैं. update
को एक बार कॉल करने पर, यह पता नहीं चलता कि यह आखिरी कॉल है या नहीं. इसलिए, यह टैग की लंबाई को छोड़कर बाकी सभी चीज़ों को प्रोसेस करता है. साथ ही, finish
के दौरान, संभावित टैग डेटा को बफ़र करता है.
पूरा करें
वर्शन: 1, 2, 3
begin
से शुरू की गई प्रोसेस को पूरा करता है. साथ ही, update
इंस्टेंस से मिले उस डेटा को प्रोसेस करता है जिसे अब तक प्रोसेस नहीं किया गया है.
यह तरीका, किसी ऑपरेशन में आखिरी बार कॉल किया जाता है, ताकि प्रोसेस किया गया सारा डेटा दिखाया जा सके.
भले ही, यह कार्रवाई पूरी हो जाए या कोई गड़बड़ी दिखे, यह तरीका कार्रवाई को पूरा कर देता है. इसलिए, दिए गए ऑपरेशन हैंडल को अमान्य कर दिया जाता है. इस तरीके या update
या abort
का इस्तेमाल करके, हैंडल का आने वाले समय में इस्तेमाल करने पर, ErrorCode::INVALID_OPERATION_HANDLE
दिखता है.
हस्ताक्षर करने की कार्रवाइयां, आउटपुट के तौर पर हस्ताक्षर दिखाती हैं. पुष्टि करने वाले ऑपरेशन, signature
पैरामीटर में मौजूद हस्ताक्षर को स्वीकार करते हैं और कोई आउटपुट नहीं दिखाते.
अनुमति लागू करना
पासकोड की पुष्टि करने की प्रोसेस मुख्य रूप से begin
में की जाती है. हालांकि, अगर पासकोड में ये दोनों विशेषताएं मौजूद हैं, तो उसे पासवर्ड के तौर पर इस्तेमाल किया जा सकता है:
- एक या उससे ज़्यादा
Tag::USER_SECURE_IDs
Tag::AUTH_TIMEOUT
इस मामले में, हर कार्रवाई के लिए पासकोड की अनुमति की ज़रूरत होती है. साथ ही, अपडेट करने के तरीके को inParams
आर्ग्युमेंट में Tag::AUTH_TOKEN
मिलता है. एचएमएस यह पुष्टि करता है कि टोकन मान्य है और उसमें सुरक्षित उपयोगकर्ता आईडी मौजूद है. साथ ही, यह भी पुष्टि करता है कि टोकन, कुंजी के Tag::USER_AUTH_TYPE
से मेल खाता है और challenge
फ़ील्ड में मौजूद मौजूदा ऑपरेशन का ऑपरेशन हैंडल है. अगर ये शर्तें पूरी नहीं होती हैं, तो ErrorCode::KEY_USER_NOT_AUTHENTICATED
दिखाएं.
कॉलर, update
और finish
पर किए जाने वाले हर कॉल के लिए, ऑथेंटिकेशन टोकन उपलब्ध कराता है.
लागू करने के लिए, टोकन की पुष्टि सिर्फ़ एक बार करनी होगी.
आरएसए कुंजियां
पैडिंग मोड के आधार पर, कुछ अन्य ज़रूरी शर्तें:
PaddingMode::NONE
. बिना पैड किए हस्ताक्षर करने और एन्क्रिप्ट करने की कार्रवाइयों के लिए, अगर दिया गया डेटा कुंजी से छोटा है, तो हस्ताक्षर करने/एन्क्रिप्ट करने से पहले, डेटा को बाईं ओर शून्य से पैड किया जाता है. अगर डेटा की लंबाई, कुंजी की लंबाई के बराबर है, लेकिन संख्या में ज़्यादा है, तोErrorCode::INVALID_ARGUMENT
दिखाएं. पुष्टि और डिक्रिप्ट करने के लिए, डेटा का साइज़, कुंजी के साइज़ के बराबर होना चाहिए. अगर ऐसा नहीं है, तोErrorCode::INVALID_INPUT_LENGTH.
दिखाएंPaddingMode::RSA_PSS
. PSS पैड वाले हस्ताक्षर वाले ऑपरेशन के लिए, PSS साल्ट का साइज़ मैसेज डाइजेस्ट के बराबर होता है और इसे रैंडम तरीके से जनरेट किया जाता है.begin
परinputParams
मेंTag::DIGEST
के साथ बताए गए डाइजेस्ट का इस्तेमाल, पीएसएस डाइजेस्ट एल्गोरिदम और एमजीएफ़1 डाइजेस्ट एल्गोरिदम के तौर पर किया जाता है.PaddingMode::RSA_OAEP
.begin
परinputParams
में,Tag::DIGEST
के साथ बताए गए डाइजेस्ट का इस्तेमाल, OAEP डाइजेस्ट एल्गोरिदम के तौर पर किया जाता है. साथ ही, SHA1 का इस्तेमाल MGF1 डाइजेस्ट एल्गोरिदम के तौर पर किया जाता है.
ईसीडीएसए कुंजियां
अगर बिना पैड किए हस्ताक्षर करने या पुष्टि करने के लिए दिया गया डेटा बहुत लंबा है, तो उसे छोटा करें.
एईएस कुंजियां
ब्लॉक मोड के आधार पर, कुछ और शर्तें:
BlockMode::ECB
याBlockMode::CBC
. अगर पैडिंगPaddingMode::NONE
है और डेटा की लंबाई, AES ब्लॉक साइज़ का मल्टीपल नहीं है, तोErrorCode::INVALID_INPUT_LENGTH
दिखाएं. अगर पैडिंग की वैल्यूPaddingMode::PKCS7
है, तो डेटा को PKCS#7 स्पेसिफ़िकेशन के मुताबिक पैड करें. ध्यान दें कि PKCS#7 का सुझाव है कि अगर डेटा, ब्लॉक की लंबाई का मल्टीपल है, तो एक और पैडिंग ब्लॉक जोड़ें.BlockMode::GCM
. एन्क्रिप्ट (सुरक्षित) करने के दौरान, सभी सादा टेक्स्ट को प्रोसेस करने के बाद, टैग (Tag::MAC_LENGTH
बाइट) का हिसाब लगाएं और उसे वापस मिले सिफरटेक्स्ट में जोड़ें. डिक्रिप्ट करने के दौरान, आखिरीTag::MAC_LENGTH
बिट को टैग के तौर पर प्रोसेस करें. अगर टैग की पुष्टि नहीं हो पाती है, तोErrorCode::VERIFICATION_FAILED
दिखाएं.
रहने दो
वर्शन: 1, 2, 3
चल रही कार्रवाई को रोक देता है. 'रद्द करें' कॉल के बाद, दिए गए ऑपरेशन हैंडल का बाद में इस्तेमाल करने के लिए, update
, finish
या abort
के साथ ErrorCode::INVALID_OPERATION_HANDLE
दिखाएं.
get_supported_algorithms
वर्शन: 1
Keymaster हार्डवेयर के लागू होने पर काम करने वाले एल्गोरिदम की सूची दिखाता है. सॉफ़्टवेयर लागू करने पर, खाली सूची दिखती है. वहीं, हाइब्रिड लागू करने पर, सिर्फ़ उन एल्गोरिदम की सूची दिखती है जो हार्डवेयर के साथ काम करते हैं.
Keymaster 1 लागू करने पर, आरएसए, ईसी, एईएस, और एचएमएसी का इस्तेमाल किया जा सकता है.
get_supported_block_modes
वर्शन: 1
यह किसी खास एल्गोरिदम और मकसद के लिए, Keymaster हार्डवेयर के लागू होने पर काम करने वाले AES ब्लॉक मोड की सूची दिखाता है.
RSA, EC, और HMAC, ब्लॉक सिफर नहीं हैं. इसलिए, इनके लिए यह तरीका सभी मान्य कामों के लिए, खाली सूची दिखाता है. अमान्य मकसद की वजह से, यह तरीका ErrorCode::INVALID_PURPOSE
दिखाता है.
Keymaster 1 के लागू होने से, एईएस एन्क्रिप्शन और डिक्रिप्शन के लिए ECB, CBC, CTR, और GCM का इस्तेमाल किया जा सकता है.
get_supported_padding_modes
वर्शन: 1
यह किसी खास एल्गोरिदम और मकसद के लिए, Keymaster हार्डवेयर के लागू होने पर काम करने वाले पैडिंग मोड की सूची दिखाता है.
HMAC और ईसी में पैडिंग का कोई मतलब नहीं है. इसलिए, यह तरीका सभी मान्य कामों के लिए खाली सूची दिखाता है. अमान्य मकसद की वजह से, यह तरीका ErrorCode::INVALID_PURPOSE
दिखाता है.
आरएसए के लिए, Keymaster 1 के लागू होने पर ये काम किए जा सकते हैं:
- बिना पैड किए एन्क्रिप्शन, डिक्रिप्शन, हस्ताक्षर, और पुष्टि. बिना पैड किए एन्क्रिप्ट (सुरक्षित) करने और हस्ताक्षर करने के लिए, अगर मैसेज पब्लिक मॉड्यूल से छोटा है, तो उसे लागू करने के लिए, बाईं ओर शून्य जोड़ना होगा. बिना पैड किए डिक्रिप्ट करने और पुष्टि करने के लिए, इनपुट की लंबाई, सार्वजनिक मॉड्यूल के साइज़ से मेल खानी चाहिए.
- PKCS#1 v1.5 एन्क्रिप्शन और हस्ताक्षर करने के लिए पैडिंग मोड
- कम से कम 20 वर्णों का नमक वाला पीएसएस
- OAEP
ईसीबी और सीबीसी मोड में एईएस के लिए, Keymaster 1 के लागू होने पर, पैडिंग नहीं और PKCS#7-पैडिंग का इस्तेमाल किया जा सकता है. सीटीआर और जीसीएम मोड में, सिर्फ़ बिना पैडिंग वाला विकल्प काम करता है.
get_supported_digests
वर्शन: 1
किसी खास एल्गोरिदम और मकसद के लिए, Keymaster हार्डवेयर के लागू होने पर काम करने वाले डाइजेस्ट मोड की सूची दिखाता है.
कोई भी AES मोड, डाइजेस्ट करने की सुविधा का इस्तेमाल नहीं करता या उसे डाइजेस्ट करने की ज़रूरत नहीं होती. इसलिए, यह तरीका मान्य कामों के लिए खाली सूची दिखाता है.
Keymaster 1 लागू करने पर, तय किए गए डाइजेस्ट का कोई सब-सेट लागू किया जा सकता है. लागू करने पर, SHA-256 मिलता है. साथ ही, MD5, SHA1, SHA-224, SHA-256, SHA384, और SHA512 (तय किए गए डाइजेस्ट का पूरा सेट) मिल सकता है.
get_supported_import_formats
वर्शन: 1
किसी खास एल्गोरिदम के Keymaster हार्डवेयर लागू करने से, इंपोर्ट किए जा सकने वाले फ़ॉर्मैट की सूची दिखाता है.
Keymaster 1 के लागू होने से, आरएसए और ईसी कुंजी पेयर को इंपोर्ट करने के लिए, पासवर्ड की सुरक्षा के बिना PKCS#8 फ़ॉर्मैट का इस्तेमाल किया जा सकता है. साथ ही, एईएस और एचएमएसी कुंजी के मैटीरियल को रॉ फ़ॉर्मैट में इंपोर्ट किया जा सकता है.
get_supported_export_formats
वर्शन: 1
किसी खास एल्गोरिदम के Keymaster हार्डवेयर लागू करने से, एक्सपोर्ट किए जा सकने वाले फ़ॉर्मैट की सूची दिखाता है.
Keymaster1 लागू करने पर, आरएसए और ईसी सार्वजनिक कुंजियों को एक्सपोर्ट करने के लिए, X.509 फ़ॉर्मैट का इस्तेमाल किया जा सकता है. निजी कुंजियों या असिमेट्रिक कुंजियों को एक्सपोर्ट नहीं किया जा सकता.
पुराने फ़ंक्शन
Keymaster 0
यहां दिए गए फ़ंक्शन, Keymaster 0 की मूल परिभाषा से जुड़े हैं. ये, Keymaster 1 के स्ट्रक्चर keymaster1_device_t में मौजूद थे. हालांकि, Keymaster
1.0 में इन्हें लागू नहीं किया गया था और उनके फ़ंक्शन पॉइंटर NULL
पर सेट थे.
generate_keypair
import_keypair
get_keypair_public
delete_keypair
delete_all
sign_data
Verify_data
Keymaster 1
नीचे दिए गए फ़ंक्शन, Keymaster 1 की परिभाषा से जुड़े हैं. हालांकि, इन्हें Keymaster 2 में हटा दिया गया है. साथ ही, ऊपर दिए गए Keymaster 0 के फ़ंक्शन भी हटा दिए गए हैं:
get_supported_algorithms
get_supported_block_modes
get_supported_padding_modes
get_supported_digests
get_supported_import_formats
get_supported_export_formats
Keymaster 2
नीचे दिए गए फ़ंक्शन, Keymaster 2 की परिभाषा से जुड़े हैं. हालांकि, इन्हें Keymaster 3 में हटा दिया गया है. साथ ही, ऊपर दिए गए Keymaster 1 के फ़ंक्शन भी हटा दिए गए हैं:
configure