Keystore, क्रिप्टोग्राफ़िक कुंजियों को बनाने, सेव करने, और उनका इस्तेमाल करने के लिए ज़्यादा सुरक्षित जगह उपलब्ध कराता है. हार्डवेयर-बैक्ड कुंजी स्टोरेज उपलब्ध होने और उसका इस्तेमाल किए जाने पर, डिवाइस से कुंजी मटीरियल को निकालने से ज़्यादा सुरक्षित रखा जाता है. साथ ही, KeyMint (पहले Keymaster) ऐसी पाबंदियां लागू करता है जिन्हें तोड़ना मुश्किल होता है.
हालांकि, ऐसा सिर्फ़ तब होता है, जब Keystore की कुंजियों को हार्डवेयर-बैक स्टोरेज में रखा जाता है. Keymaster 1 में, ऐप्लिकेशन या रिमोट सर्वर के पास यह पुष्टि करने का कोई भरोसेमंद तरीका नहीं था कि ऐसा हुआ है या नहीं. कीस्टोर डीमन ने उपलब्ध Keymaster हार्डवेयर ऐब्स्ट्रैक्शन लेयर (एचएएल) को लोड किया और कुंजियों के हार्डवेयर बैकअप के बारे में एचएएल ने जो भी जानकारी दी उसे सही मान लिया.
इस समस्या को ठीक करने के लिए, Android 7.0 (Keymaster 2) में कुंजी की पुष्टि करने की सुविधा और Android 8.0 (Keymaster 3) में आईडी की पुष्टि करने की सुविधा पेश की गई थी.
कुंजी की पुष्टि करने का मकसद, यह पता लगाने का तरीका उपलब्ध कराना है कि किसी एसिमेट्रिक कुंजी के जोड़े को हार्डवेयर से सुरक्षित किया गया है या नहीं. साथ ही, यह पता लगाना है कि कुंजी की प्रॉपर्टी क्या हैं और इसके इस्तेमाल पर कौनसी पाबंदियां लागू हैं.
आईडी की पुष्टि करने की सुविधा की मदद से, डिवाइस अपने हार्डवेयर आइडेंटिफ़ायर का सबूत दे सकता है. जैसे, सीरियल नंबर या आईएमईआई.
कुंजी की पुष्टि करना
कुंजी की पुष्टि करने की सुविधा के लिए, Android 7.0 ने एचएएल में टैग, टाइप, और तरीके का एक सेट पेश किया.
टैग
Tag::ATTESTATION_CHALLENGE
Tag::INCLUDE_UNIQUE_ID
Tag::RESET_SINCE_ID_ROTATION
वर्शन के मुताबिक तरीका
Keymaster 2 और इससे पहले के वर्शन
typedef struct { keymaster_blob_t* entries; size_t entry_count; } keymaster_cert_chain_t;
AttestKey
तरीका
Keymaster 3
attestKey(vec<uint8_t> keyToAttest, vec<KeyParameter> attestParams) generates(ErrorCode error, vec<vec<uint8_t>> certChain);
Keymaster 2 और इससे पहले के वर्शन
keymaster_error_t (*attest_key)(const struct keymaster2_device* dev, const keymaster_key_blob_t* key_to_attest, const keymaster_key_param_set_t* attest_params, keymaster_cert_chain_t* cert_chain);
dev
, Keymaster डिवाइस का स्ट्रक्चर है.keyToAttest
,generateKey
से मिला मुख्य BLOB है. इसके लिए, पुष्टि की जाती है.attestParams
, पुष्टि के लिए ज़रूरी पैरामीटर की सूची है. इसमेंTag::ATTESTATION_CHALLENGE
औरTag::RESET_SINCE_ID_ROTATION
के साथ-साथTag::APPLICATION_ID
औरTag::APPLICATION_DATA
भी शामिल हैं. अगर कुंजी जनरेट करने के दौरान इन दोनों को तय किया गया था, तो कुंजी के मुख्य BLOB को डिक्रिप्ट करने के लिए, इन दोनों की ज़रूरत होती है.certChain
आउटपुट पैरामीटर है. यह सर्टिफ़िकेट का कलेक्शन दिखाता है. एंट्री 0, पुष्टि करने वाला सर्टिफ़िकेट है. इसका मतलब है कि यहkeyToAttest
से कुंजी की पुष्टि करता है और इसमें पुष्टि करने वाला एक्सटेंशन शामिल होता है.
attestKey
तरीके को, पुष्टि की गई कुंजी पर सार्वजनिक कुंजी के तौर पर इस्तेमाल किया जाता है. ऐसा इसलिए, क्योंकि इसे किसी भी समय कॉल किया जा सकता है और इसके लिए, अनुमति से जुड़ी शर्तों को पूरा करना ज़रूरी नहीं है. उदाहरण के लिए, अगर पुष्टि की गई कुंजी को इस्तेमाल करने के लिए उपयोगकर्ता की पुष्टि करना ज़रूरी है, तो उपयोगकर्ता की पुष्टि किए बिना पुष्टि की जा सकती है.
पुष्टि करने वाला सर्टिफ़िकेट
पुष्टि करने वाला सर्टिफ़िकेट, एक स्टैंडर्ड X.509 सर्टिफ़िकेट होता है. इसमें पुष्टि करने के लिए एक वैकल्पिक एक्सटेंशन होता है. इसमें पुष्टि की गई कुंजी का ब्यौरा होता है. सर्टिफ़िकेट पर, पुष्टि करने वाली कुंजी से हस्ताक्षर होता है. यह सर्टिफ़ाइड होता है. ऐसा हो सकता है कि पुष्टि करने वाली कुंजी, पुष्टि की जा रही कुंजी से अलग एल्गोरिदम का इस्तेमाल करती हो.
पुष्टि करने वाले सर्टिफ़िकेट में, यहां दी गई टेबल में मौजूद फ़ील्ड शामिल होते हैं. इसमें कोई अन्य फ़ील्ड शामिल नहीं किया जा सकता. कुछ फ़ील्ड में, फ़ील्ड की वैल्यू तय होती है. सीटीएस टेस्ट से यह पुष्टि की जाती है कि सर्टिफ़िकेट का कॉन्टेंट, तय किए गए कॉन्टेंट के मुताबिक है.
सर्टिफ़िकेट SEQUENCE
फ़ील्ड का नाम (आरएफ़सी 5280 देखें) | वैल्यू |
---|---|
tbsCertificate | TBSCertificate SEQUENCE |
signatureAlgorithm | कुंजी पर हस्ताक्षर करने के लिए इस्तेमाल किए गए एल्गोरिदम का AlgorithmIdentifier: ईसी कुंजियों के लिए ईसीडीएसए और आरएसए कुंजियों के लिए आरएसए. |
signatureValue | BIT STRING, ASN.1 DER-encoded tbsCertificate पर कंप्यूट किया गया हस्ताक्षर. |
TBSCertificate SEQUENCE
फ़ील्ड का नाम (आरएफ़सी 5280 देखें) | वैल्यू |
---|---|
version |
INTEGER 2 (इसका मतलब है कि यह v3 सर्टिफ़िकेट है) |
serialNumber |
INTEGER 1 (तय की गई वैल्यू: सभी सर्टिफ़िकेट के लिए एक जैसी) |
signature |
कुंजी को साइन करने के लिए इस्तेमाल किए गए एल्गोरिदम का AlgorithmIdentifier: ईसी कुंजियों के लिए ईसीडीएसए और आरएसए कुंजियों के लिए आरएसए. |
issuer |
यह बैच पुष्टि करने की कुंजी के विषय के फ़ील्ड के जैसा ही होता है. |
validity |
दो तारीखों का SEQUENCE, जिसमें Tag::ACTIVE_DATETIME और Tag::USAGE_EXPIRE_DATETIME की वैल्यू शामिल होती हैं.
ये वैल्यू, 1 जनवरी, 1970 से मिलीसेकंड में दी जाती है.
सर्टिफ़िकेट में तारीख को सही तरीके से दिखाने के लिए, आरएफ़सी 5280 देखें.अगर Tag::ACTIVE_DATETIME मौजूद नहीं है, तो Tag::CREATION_DATETIME की वैल्यू का इस्तेमाल करें. अगर Tag::USAGE_EXPIRE_DATETIME मौजूद नहीं है, तो बैच अटेस्टेशन कुंजी के सर्टिफ़िकेट के खत्म होने की तारीख का इस्तेमाल करें. |
subject |
CN = "Android Keystore Key" (तय की गई वैल्यू: सभी सर्टिफ़िकेट पर एक जैसी होती है) |
subjectPublicKeyInfo |
SubjectPublicKeyInfo, जिसमें पुष्टि की गई सार्वजनिक कुंजी शामिल है. |
extensions/Key Usage |
digitalSignature: सेट होता है, अगर कुंजी का मुख्य मकसद KeyPurpose::SIGN या
KeyPurpose::VERIFY है. अन्य सभी बिट को अनसेट किया गया है. |
extensions/CRL Distribution Points |
वैल्यू अभी तय नहीं है |
extensions/"attestation" |
OID 1.3.6.1.4.1.11129.2.1.17 है. कॉन्टेंट के बारे में यहां दिए गए Attestation extension सेक्शन में बताया गया है. सभी X.509 सर्टिफ़िकेट एक्सटेंशन की तरह, इस एक्सटेंशन का कॉन्टेंट भी OCTET_STRING के तौर पर दिखाया जाता है. इसमें अटेस्टेशन SEQUENCE का DER एन्कोडिंग होता है. |
पुष्टि करने वाला एक्सटेंशन
attestation
एक्सटेंशन का ओआईडी 1.3.6.1.4.1.11129.2.1.17
है. इसमें अटेस्ट की जा रही कुंजी के जोड़े और कुंजी जनरेट करने के समय डिवाइस की स्थिति के बारे में जानकारी होती है.
एआईडीएल इंटरफ़ेस स्पेसिफ़िकेशन में तय किए गए Keymaster/KeyMint टैग टाइप को ASN.1 टाइप में इस तरह से बदला जाता है:
KeyMint या Keymaster का टाइप | ASN.1 टाइप | नोट |
---|---|---|
ENUM |
INTEGER |
|
ENUM_REP |
SET of INTEGER |
|
UINT |
INTEGER |
|
UINT_REP |
SET of INTEGER |
|
ULONG |
INTEGER |
|
ULONG_REP |
SET of INTEGER |
|
DATE |
INTEGER |
1 जनवरी, 1970 को 00:00:00 जीएमटी के बाद से मिलीसेकंड में दिया जाता है. |
BOOL |
NULL |
टैग मौजूद होने का मतलब है कि वैल्यू सही है और मौजूद न होने का मतलब है कि वैल्यू गलत है. |
BIGNUM |
इस तरह का कोई टैग नहीं है. इसलिए, कोई मैपिंग तय नहीं की गई है. | |
BYTES |
OCTET_STRING |
स्कीमा
अटेस्टेशन एक्सटेंशन के कॉन्टेंट के बारे में, यहां दिए गए ASN.1 स्कीमा में बताया गया है:
वर्शन 400
KeyDescription ::= SEQUENCE { attestationVersion 400, attestationSecurityLevel SecurityLevel, keyMintVersion INTEGER, keyMintSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, mgfDigest [203] EXPLICIT SET OF INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, usageCountLimit [405] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL, attestationIdSecondImei [723] EXPLICIT OCTET_STRING OPTIONAL, moduleHash [724] EXPLICIT OCTET_STRING OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
वर्शन 300
KeyDescription ::= SEQUENCE { attestationVersion 300, attestationSecurityLevel SecurityLevel, keyMintVersion INTEGER, keyMintSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, mgfDigest [203] EXPLICIT SET OF INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, usageCountLimit [405] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL, attestationIdSecondImei [723] EXPLICIT OCTET_STRING OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
वर्शन 200
KeyDescription ::= SEQUENCE { attestationVersion 200, attestationSecurityLevel SecurityLevel, keyMintVersion INTEGER, keyMintSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, mgfDigest [203] EXPLICIT SET OF INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, usageCountLimit [405] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
वर्शन 100
KeyDescription ::= SEQUENCE { attestationVersion 100, attestationSecurityLevel SecurityLevel, keyMintVersion INTEGER, keyMintSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, mgfDigest [203] EXPLICIT SET OF INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, usageCountLimit [405] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
वर्शन 4
KeyDescription ::= SEQUENCE { attestationVersion 4, attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, keymasterSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, allApplications [600] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
वर्ज़न 3
KeyDescription ::= SEQUENCE { attestationVersion 3, attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, keymasterSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, allApplications [600] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
वर्शन 2
KeyDescription ::= SEQUENCE { attestationVersion 2, attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, keymasterSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, allApplications [600] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rollbackResistant [703] EXPLICIT NULL OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
वर्शन 1
KeyDescription ::= SEQUENCE { attestationVersion 1, attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, keymasterSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, allApplications [600] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rollbackResistant [703] EXPLICIT NULL OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
KeyDescription फ़ील्ड
-
attestationVersion
-
ASN.1 स्कीमा का वर्शन.
वैल्यू KeyMint या Keymaster का वर्शन 1 Keymaster 2.0 का वर्शन 2 Keymaster का वर्शन 3.0 3 Keymaster 4.0 का वर्शन 4 Keymaster का वर्शन 4.1 100 KeyMint वर्शन 1.0 200 KeyMint 2.0 वर्शन 300 KeyMint 3.0 वर्शन 400 KeyMint 4.0 वर्शन -
attestationSecurityLevel
-
उस जगह का सुरक्षा लेवल जहां अटेस्ट की गई कुंजी सेव की जाती है.
-
keymasterVersion
/keyMintVersion
-
KeyMint या Keymaster एचएएल के वर्शन का
इस्तेमाल किया गया है.
वैल्यू KeyMint या Keymaster का वर्शन 2 Keymaster 2.0 का वर्शन 3 Keymaster का वर्शन 3.0 4 Keymaster 4.0 का वर्शन 41 Keymaster का वर्शन 4.1 100 KeyMint वर्शन 1.0 200 KeyMint 2.0 वर्शन 300 KeyMint 3.0 वर्शन 400 KeyMint 4.0 वर्शन -
keymasterSecurityLevel
/keyMintSecurityLevel
- KeyMint या Keymaster के वर्शन का सुरक्षा स्तर.
-
attestationChallenge
- वह चैलेंज होता है जो कुंजी जनरेट करने के समय दिया जाता है.
-
uniqueId
- यह निजता के लिहाज़ से संवेदनशील डिवाइस आइडेंटिफ़ायर है. सिस्टम ऐप्लिकेशन, कुंजी जनरेट करने के समय इसका अनुरोध कर सकते हैं. अगर यूनीक आईडी का अनुरोध नहीं किया गया है, तो यह फ़ील्ड खाली होता है. ज़्यादा जानकारी के लिए, यूनीक आईडी सेक्शन देखें.
-
softwareEnforced
-
KeyMint या Keymaster की अनुमति वाली सूची, जिसे Android सिस्टम लागू करता है. इस जानकारी को प्लैटफ़ॉर्म में मौजूद कोड से इकट्ठा या जनरेट किया जाता है. इस पर तब तक भरोसा किया जा सकता है, जब तक डिवाइस में ऐसा ऑपरेटिंग सिस्टम चल रहा हो जो Android प्लैटफ़ॉर्म के सुरक्षा मॉडल के मुताबिक हो. इसका मतलब है कि डिवाइस का बूटलोडर लॉक हो और
verifiedBootState
Verified
हो. -
hardwareEnforced
- KeyMint या Keymaster की अनुमति वाली सूची, जिसे डिवाइस के ट्रस्टेड एक्ज़ीक्यूशन एनवायरमेंट (टीईई) या StrongBox लागू करता है. इस जानकारी को सुरक्षित हार्डवेयर में मौजूद कोड से इकट्ठा या जनरेट किया जाता है. इस पर प्लैटफ़ॉर्म का कंट्रोल नहीं होता. उदाहरण के लिए, जानकारी बूटलोडर से मिल सकती है. इसके अलावा, यह किसी ऐसे सुरक्षित कम्यूनिकेशन चैनल से भी मिल सकती है जिसमें प्लैटफ़ॉर्म पर भरोसा करने की ज़रूरत नहीं होती.
SecurityLevel वैल्यू
SecurityLevel
वैल्यू से पता चलता है कि Keystore से जुड़ा कोई एलिमेंट (जैसे- कुंजी का जोड़ा और पुष्टि) हमले से कितना सुरक्षित है.
वैल्यू | मतलब |
---|---|
Software |
जब तक डिवाइस का Android सिस्टम, Android प्लैटफ़ॉर्म के सुरक्षा मॉडल के मुताबिक काम करता है, तब तक यह सुरक्षित रहता है. इसका मतलब है कि डिवाइस का बूटलोडर लॉक है और verifiedBootState Verified है. |
TrustedEnvironment |
जब तक टीईई सुरक्षित है, तब तक यह सुरक्षित है. टीईई के लिए आइसोलेशन से जुड़ी ज़रूरी शर्तों के बारे में, Android कंपैटबिलिटी डेफ़िनिशन डॉक्यूमेंट के सेक्शन 9.11 [C-1-1] से [C-1-4] में बताया गया है. टीईई, रिमोट से किए जाने वाले हमलों से काफ़ी हद तक सुरक्षित होते हैं. साथ ही, हार्डवेयर पर सीधे तौर पर किए जाने वाले हमलों से भी कुछ हद तक सुरक्षित होते हैं. |
StrongBox |
StrongBox के सुरक्षित रहने तक सुरक्षित रहता है. StrongBox को हार्डवेयर सुरक्षा मॉड्यूल की तरह ही, सुरक्षा चिप में लागू किया जाता है. StrongBox को लागू करने से जुड़ी ज़रूरी शर्तों के बारे में, Android कंपैटबिलिटी डेफ़िनिशन डॉक्यूमेंट के सेक्शन 9.11.2 में बताया गया है. StrongBox, रिमोट से किए जाने वाले हमलों और हार्डवेयर पर सीधे तौर पर किए जाने वाले हमलों से सुरक्षित रहता है. जैसे, फ़िज़िकल टेंपरिंग और साइड-चैनल हमले. |
AuthorizationList फ़ील्ड
हर फ़ील्ड, एआईडीएल इंटरफ़ेस स्पेसिफ़िकेशन में मौजूद Keymaster/KeyMint के ऑथराइज़ेशन टैग से मेल खाता है.
स्पेसिफ़िकेशन, अनुमति देने वाले टैग के बारे में भरोसेमंद जानकारी का सोर्स है. जैसे, उनका मतलब, उनके कॉन्टेंट का फ़ॉर्मैट, KeyDescription
ऑब्जेक्ट में softwareEnforced
या hardwareEnforced
फ़ील्ड में दिखने की उम्मीद है या नहीं, वे अन्य टैग के साथ एक-दूसरे से अलग हैं या नहीं वगैरह. सभी AuthorizationList
फ़ील्ड ज़रूरी नहीं हैं.
हर फ़ील्ड में, कॉन्टेक्स्ट के हिसाब से EXPLICIT
टैग होता है. यह KeyMint या Keymaster टैग नंबर के बराबर होता है. इससे AuthorizationList
में डेटा को ज़्यादा कॉम्पैक्ट तरीके से दिखाया जा सकता है. इसलिए, ASN.1 पार्सर को हर कॉन्टेक्स्ट के हिसाब से टैग के लिए, अनुमानित डेटा टाइप के बारे में पता होना चाहिए. उदाहरण के लिए,
Tag::USER_AUTH_TYPE
को ENUM | 504
के तौर पर तय किया गया है. अटेस्टेशन एक्सटेंशन स्कीमा में, AuthorizationList
में मौजूद purpose
फ़ील्ड को userAuthType [504] EXPLICIT INTEGER OPTIONAL
के तौर पर तय किया गया है. इसलिए, इसके ASN.1 एन्कोडिंग में, ASN.1 टाइप INTEGER
के लिए UNIVERSAL
क्लास टैग के बजाय, कॉन्टेक्स्ट के हिसाब से टैग 504
शामिल होगा. यह 10
है.
-
purpose
-
यह
Tag::PURPOSE
अनुमति देने वाले टैग से मेल खाता है. यह टैग, टैग आईडी की वैल्यू के तौर पर 1 का इस्तेमाल करता है. -
algorithm
-
यह
Tag::ALGORITHM
अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 2 होती है.अटेस्टेशन
AuthorizationList
ऑब्जेक्ट में, एल्गोरिदम की वैल्यू हमेशाRSA
याEC
होती है. -
keySize
-
यह
Tag::KEY_SIZE
अनुमति टैग से मेल खाता है. यह टैग, टैग आईडी की वैल्यू के तौर पर 3 का इस्तेमाल करता है. -
blockMode
-
यह
Tag::BLOCK_MODE
अनुमति वाले टैग से मेल खाता है. यह टैग, टैग आईडी की वैल्यू के तौर पर 4 का इस्तेमाल करता है. -
digest
-
यह
Tag::DIGEST
अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 5 का इस्तेमाल किया जाता है. -
padding
-
यह
Tag::PADDING
अनुमति टैग से मेल खाता है. यह टैग आईडी की वैल्यू 6 का इस्तेमाल करता है. -
callerNonce
-
यह
Tag::CALLER_NONCE
अनुमति वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 7 का इस्तेमाल किया जाता है. -
minMacLength
-
यह
Tag::MIN_MAC_LENGTH
अनुमति टैग से मेल खाता है. यह टैग, टैग आईडी की वैल्यू 8 का इस्तेमाल करता है. -
ecCurve
-
यह
Tag::EC_CURVE
अनुमति टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 10 होती है.यह पैरामीटर का वह सेट है जिसका इस्तेमाल, Android सिस्टम की कीस्टोर में एलिप्टिक कर्व (ईसी) कुंजी का जोड़ा जनरेट करने के लिए किया जाता है. यह हस्ताक्षर करने और पुष्टि करने के लिए, ईसीडीएसए का इस्तेमाल करता है.
-
rsaPublicExponent
-
यह
Tag::RSA_PUBLIC_EXPONENT
अनुमति टैग से मेल खाता है. यह 200 के टैग आईडी वैल्यू का इस्तेमाल करता है. -
mgfDigest
-
यह सिर्फ़ मुख्य पुष्टि करने वाले वर्शन >= 100 में मौजूद है.
यहTag::RSA_OAEP_MGF_DIGEST
KeyMint अनुमति टैग से मेल खाता है. यह टैग आईडी वैल्यू 203 का इस्तेमाल करता है. -
rollbackResistance
-
यह सिर्फ़ मुख्य पुष्टि वाले वर्शन >= 3 में मौजूद है.
यह
Tag::ROLLBACK_RESISTANCE
अनुमति देने वाले टैग से मेल खाता है. यह टैग आईडी की वैल्यू 303 का इस्तेमाल करता है. -
earlyBootOnly
-
यह सिर्फ़ मुख्य पुष्टि करने वाले ऐप्लिकेशन के वर्शन 4 या इसके बाद के वर्शन में मौजूद है.
यह
Tag::EARLY_BOOT_ONLY
अनुमति देने वाले टैग से मेल खाता है. यह टैग, 305 की टैग आईडी वैल्यू का इस्तेमाल करता है. -
activeDateTime
-
यह
Tag::ACTIVE_DATETIME
अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 400 का इस्तेमाल किया जाता है. -
originationExpireDateTime
-
यह
Tag::ORIGINATION_EXPIRE_DATETIME
अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 401 का इस्तेमाल किया जाता है. -
usageExpireDateTime
-
यह
Tag::USAGE_EXPIRE_DATETIME
अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 402 का इस्तेमाल किया जाता है. -
usageCountLimit
-
यह
Tag::USAGE_COUNT_LIMIT
अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 405 का इस्तेमाल किया जाता है. -
userSecureId
-
यह
Tag::USER_SECURE_ID
अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 502 का इस्तेमाल किया जाता है. -
noAuthRequired
-
यह
Tag::NO_AUTH_REQUIRED
अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 503 होती है. -
userAuthType
-
यह
Tag::USER_AUTH_TYPE
अनुमति देने वाले टैग से मेल खाता है. यह 504 की टैग आईडी वैल्यू का इस्तेमाल करता है. -
authTimeout
-
यह
Tag::AUTH_TIMEOUT
अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 505 का इस्तेमाल किया जाता है. -
allowWhileOnBody
-
यह
Tag::ALLOW_WHILE_ON_BODY
अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 506 का इस्तेमाल किया जाता है.अगर उपयोगकर्ता ने डिवाइस को अब भी पहना हुआ है, तो पुष्टि करने की समयसीमा खत्म होने के बाद भी इस कुंजी का इस्तेमाल किया जा सकता है. ध्यान दें कि बॉडी सेंसर से यह पता चलता है कि डिवाइस को उपयोगकर्ता के शरीर पर पहना गया है या नहीं.
-
trustedUserPresenceReq
-
यह सिर्फ़ मुख्य पुष्टि वाले वर्शन >= 3 में मौजूद है.
यह
Tag::TRUSTED_USER_PRESENCE_REQUIRED
अनुमति टैग से मेल खाता है. यह टैग, 507 की टैग आईडी वैल्यू का इस्तेमाल करता है.इससे पता चलता है कि इस कुंजी का इस्तेमाल सिर्फ़ तब किया जा सकता है, जब उपयोगकर्ता ने अपनी मौजूदगी का सबूत दिया हो. इसके कई उदाहरणों में ये शामिल हैं:
- StrongBox कुंजी के लिए, हार्डवेयर बटन को StrongBox डिवाइस पर पिन से हार्डवेयर के तौर पर जोड़ा जाता है.
- टीईई कुंजी के लिए, फ़िंगरप्रिंट की पुष्टि करने की सुविधा से यह साबित होता है कि उपयोगकर्ता मौजूद है. ऐसा तब तक होता है, जब तक टीईई के पास स्कैनर का पूरा कंट्रोल होता है और वह फ़िंगरप्रिंट मैच करने की प्रोसेस पूरी करता है.
-
trustedConfirmationReq
-
यह सिर्फ़ मुख्य पुष्टि वाले वर्शन >= 3 में मौजूद है.
यह
Tag::TRUSTED_CONFIRMATION_REQUIRED
अनुमति टैग से मेल खाता है. यह 508 की टैग आईडी वैल्यू का इस्तेमाल करता है.इससे पता चलता है कि इस कुंजी का इस्तेमाल सिर्फ़ तब किया जा सकता है, जब उपयोगकर्ता पुष्टि करने वाले टोकन का इस्तेमाल करके, हस्ताक्षर किए जाने वाले डेटा की पुष्टि करे. उपयोगकर्ता की पुष्टि पाने के तरीके के बारे में ज़्यादा जानने के लिए, Android Protected Confirmation देखें.
ध्यान दें: यह टैग सिर्फ़ उन कुंजियों पर लागू होता है जो
SIGN
मकसद का इस्तेमाल करती हैं. -
unlockedDeviceReq
-
यह सिर्फ़ मुख्य पुष्टि वाले वर्शन >= 3 में मौजूद है.
यह
Tag::UNLOCKED_DEVICE_REQUIRED
authorization टैग से मेल खाता है. यह टैग, 509 के टैग आईडी वैल्यू का इस्तेमाल करता है. -
creationDateTime
-
यह
Tag::CREATION_DATETIME
अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 701 का इस्तेमाल किया जाता है. -
origin
-
यह
Tag::ORIGIN
अनुमति टैग से मेल खाता है. यह टैग, 702 के टैग आईडी वैल्यू का इस्तेमाल करता है. -
rootOfTrust
-
यह
Tag::ROOT_OF_TRUST
authorization टैग से मेल खाता है. यह टैग, 704 के टैग आईडी वैल्यू का इस्तेमाल करता है.ज़्यादा जानकारी के लिए, RootOfTrust डेटा स्ट्रक्चर के बारे में बताने वाला सेक्शन देखें.
-
osVersion
-
यह
Tag::OS_VERSION
अनुमति टैग से मेल खाता है. यह 705 के टैग आईडी वैल्यू का इस्तेमाल करता है.Keymaster से जुड़ा Android ऑपरेटिंग सिस्टम का वर्शन. इसे छह अंकों की पूर्णांक संख्या के तौर पर दिखाया जाता है. उदाहरण के लिए, वर्शन 8.1.0 को 080100 के तौर पर दिखाया जाता है.
सिर्फ़ Keymaster 1.0 या इसके बाद के वर्शन में, इस वैल्यू को अनुमति वाली सूची में शामिल किया जाता है.
-
osPatchLevel
-
यह
Tag::PATCHLEVEL
अनुमति वाले टैग से मेल खाता है. यह 706 के टैग आईडी वैल्यू का इस्तेमाल करता है.Keymaster में इस्तेमाल किए जा रहे सुरक्षा पैच से जुड़ा महीना और साल. इसे छह अंकों की पूर्णांक संख्या के तौर पर दिखाया जाता है. उदाहरण के लिए, अगस्त 2018 के पैच को 201808 के तौर पर दिखाया गया है.
सिर्फ़ Keymaster 1.0 या इसके बाद के वर्शन में, इस वैल्यू को अनुमति वाली सूची में शामिल किया जाता है.
-
attestationApplicationId
-
यह सिर्फ़ मुख्य पुष्टि करने वाले वर्शन >= 2 में मौजूद है.
यह
Tag::ATTESTATION_APPLICATION_ID
authorization टैग से मेल खाता है. यह टैग, 709 के टैग आईडी वैल्यू का इस्तेमाल करता है.ज़्यादा जानकारी के लिए, AttestationApplicationId डेटा स्ट्रक्चर के बारे में बताने वाला सेक्शन देखें.
-
attestationIdBrand
-
यह सिर्फ़ मुख्य पुष्टि करने वाले वर्शन >= 2 में मौजूद है.
यह
Tag::ATTESTATION_ID_BRAND
अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 710 का इस्तेमाल किया जाता है. -
attestationIdDevice
-
यह सिर्फ़ मुख्य पुष्टि करने वाले वर्शन >= 2 में मौजूद है.
यह
Tag::ATTESTATION_ID_DEVICE
अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 711 होती है. -
attestationIdProduct
-
यह सिर्फ़ मुख्य पुष्टि करने वाले वर्शन >= 2 में मौजूद है.
यह
Tag::ATTESTATION_ID_PRODUCT
अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 712 का इस्तेमाल किया जाता है. -
attestationIdSerial
-
यह सिर्फ़ मुख्य पुष्टि करने वाले वर्शन >= 2 में मौजूद है.
यह
Tag::ATTESTATION_ID_SERIAL
अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 713 होती है. -
attestationIdImei
-
यह सिर्फ़ मुख्य पुष्टि करने वाले वर्शन >= 2 में मौजूद है.
यह
Tag::ATTESTATION_ID_IMEI
अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 714 होती है. -
attestationIdMeid
-
यह सिर्फ़ मुख्य पुष्टि करने वाले वर्शन >= 2 में मौजूद है.
यह
Tag::ATTESTATION_ID_MEID
अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 715 होती है. -
attestationIdManufacturer
-
यह सिर्फ़ मुख्य पुष्टि करने वाले वर्शन >= 2 में मौजूद है.
यह
Tag::ATTESTATION_ID_MANUFACTURER
authorization टैग से मेल खाता है. यह टैग, 716 के टैग आईडी वैल्यू का इस्तेमाल करता है. -
attestationIdModel
-
यह सिर्फ़ मुख्य पुष्टि करने वाले वर्शन >= 2 में मौजूद है.
यह
Tag::ATTESTATION_ID_MODEL
authorization tag से मेल खाता है. इसमें टैग आईडी की वैल्यू 717 का इस्तेमाल किया जाता है. -
vendorPatchLevel
-
यह सिर्फ़ पुष्टि करने वाले मुख्य दस्तावेज़ के वर्शन 3 या इससे ज़्यादा में मौजूद है.
यह
Tag::VENDOR_PATCHLEVEL
authorization टैग से मेल खाता है. यह टैग आईडी की वैल्यू 718 का इस्तेमाल करता है.इस कुकी से, वेंडर इमेज के सुरक्षा पैच लेवल के बारे में पता चलता है. इस कुंजी का इस्तेमाल करने के लिए, डिवाइस पर यह पैच इंस्टॉल होना चाहिए. यह वैल्यू YYYYMMDD फ़ॉर्मैट में दिखती है. इससे वेंडर के सुरक्षा पैच की तारीख का पता चलता है. उदाहरण के लिए, अगर किसी Android डिवाइस पर वेंडर का 1 अगस्त, 2018 का सुरक्षा पैच इंस्टॉल किया गया है और उस पर कोई कुंजी जनरेट की गई है, तो इस वैल्यू की वैल्यू 20180801 होगी.
-
bootPatchLevel
-
यह सिर्फ़ पुष्टि करने वाले मुख्य दस्तावेज़ के वर्शन 3 या इससे ज़्यादा में मौजूद है.
यह
Tag::BOOT_PATCHLEVEL
अनुमति देने वाले टैग से मेल खाता है. यह टैग आईडी वैल्यू 719 का इस्तेमाल करता है.इस नीति से, कर्नेल इमेज के सुरक्षा पैच लेवल का पता चलता है. इस कुंजी का इस्तेमाल करने के लिए, डिवाइस पर यह लेवल इंस्टॉल होना चाहिए. वैल्यू YYYYMMDD फ़ॉर्मैट में दिखती है. यह सिस्टम के सुरक्षा पैच की तारीख को दिखाती है. उदाहरण के लिए, अगर किसी Android डिवाइस पर 5 अगस्त, 2018 का सिस्टम सिक्योरिटी पैच इंस्टॉल किया गया है और उस पर कोई कुंजी जनरेट की गई है, तो इस एट्रिब्यूट की वैल्यू 20180805 होगी.
-
deviceUniqueAttestation
-
यह सिर्फ़ पुष्टि करने वाले मुख्य वर्शन >= 4 में मौजूद है.
यह
Tag::DEVICE_UNIQUE_ATTESTATION
अनुमति टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 720 का इस्तेमाल किया जाता है. -
attestationIdSecondImei
-
यह सिर्फ़ पुष्टि करने वाले मुख्य वर्शन >= 300 में मौजूद है.
यह
Tag::ATTESTATION_ID_SECOND_IMEI
अनुमति वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 723 का इस्तेमाल किया जाता है. -
moduleHash
-
सिर्फ़ मुख्य पुष्टि करने वाले वर्शन >= 400 में मौजूद है.
यह
Tag::MODULE_HASH
अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 724 होती है.
RootOfTrust फ़ील्ड
-
verifiedBootKey
- यह सार्वजनिक कुंजी का सुरक्षित हैश होता है. इसका इस्तेमाल, डिवाइस बूट अप के दौरान पुष्टि किए गए बूट के हिस्से के तौर पर एक्ज़ीक्यूट होने वाले सभी कोड की इंटिग्रिटी और पुष्टि करने के लिए किया जाता है. SHA-256 का सुझाव दिया जाता है.
-
deviceLocked
-
डिवाइस का बूटलोडर लॉक है या नहीं.
true
का मतलब है कि डिवाइस ने एक ऐसी इमेज बूट की है जिस पर हस्ताक्षर किया गया है. साथ ही, वेरीफ़ाइड बूट ने इसकी पुष्टि कर दी है. -
verifiedBootState
- डिवाइस के वेरीफ़ाइड बूट की स्थिति.
-
verifiedBootHash
- वेरिफ़ाइड बूट की सुविधा से सुरक्षित किए गए सभी डेटा का डाइजेस्ट. Android वेरिफ़ाइड बूट के रेफ़रंस को लागू करने वाले डिवाइसों के लिए, इस फ़ील्ड में VBMeta डाइजेस्ट होता है.
VerifiedBootState वैल्यू
वैल्यू | बूट की स्थिति | मतलब |
---|---|---|
Verified |
GREEN |
भरोसे की पूरी चेन, हार्डवेयर से सुरक्षित रूट ऑफ़ ट्रस्ट से लेकर बूटलोडर और वेरिफ़ाइड बूट से पुष्टि किए गए सभी पार्टीशन तक फैली होती है.
इस स्थिति में, verifiedBootKey फ़ील्ड में एम्बेड किए गए रूट ऑफ़ ट्रस्ट का हैश होता है. यह सर्टिफ़िकेट, डिवाइस बनाने वाली कंपनी ने फ़ैक्ट्री में डिवाइस की ROM में एम्बेड किया होता है. |
SelfSigned |
YELLOW |
यह Verified जैसा ही है. हालांकि, इसमें पुष्टि, फ़ैक्ट्री में मैन्युफ़ैक्चरर की ओर से एम्बेड किए गए रूट ऑफ़ ट्रस्ट के बजाय, उपयोगकर्ता की ओर से कॉन्फ़िगर किए गए रूट ऑफ़ ट्रस्ट का इस्तेमाल करके की गई थी.
इस स्थिति में, verifiedBootKey फ़ील्ड में उस सार्वजनिक पासकोड का हैश होता है जिसे उपयोगकर्ता ने कॉन्फ़िगर किया है. |
Unverified |
ORANGE |
डिवाइस का बूटलोडर अनलॉक है. इसलिए, भरोसे की चेन नहीं बनाई जा सकती. डिवाइस में बिना किसी पाबंदी के बदलाव किया जा सकता है. इसलिए, उपयोगकर्ता को डिवाइस की इंटिग्रिटी की पुष्टि करनी चाहिए. इस स्थिति में, verifiedBootKey फ़ील्ड में 32 बाइट के शून्य होते हैं. |
Failed |
RED |
डिवाइस की पुष्टि नहीं हो सकी. इस स्थिति में, अन्य RootOfTrust फ़ील्ड के कॉन्टेंट के बारे में कोई गारंटी नहीं दी जाती. |
AttestationApplicationId
इस फ़ील्ड से पता चलता है कि Android प्लैटफ़ॉर्म के हिसाब से, पुष्टि करने की प्रोसेस के दौरान किन ऐप्लिकेशन को सीक्रेट की मटीरियल इस्तेमाल करने की अनुमति है. इसमें एक से ज़्यादा पैकेज शामिल हो सकते हैं. हालांकि, ऐसा सिर्फ़ तब किया जा सकता है, जब एक से ज़्यादा पैकेज एक ही यूआईडी शेयर करते हों. AuthorizationList
में मौजूद AttestationApplicationId
फ़ील्ड, OCTET_STRING
टाइप का होता है. इसे ASN.1 के इस स्कीमा के मुताबिक फ़ॉर्मैट किया जाता है:
AttestationApplicationId ::= SEQUENCE { package_infos SET OF AttestationPackageInfo, signature_digests SET OF OCTET_STRING, } AttestationPackageInfo ::= SEQUENCE { package_name OCTET_STRING, version INTEGER, }
package_infos
-
AttestationPackageInfo
ऑब्जेक्ट का एक सेट. हर ऑब्जेक्ट में पैकेज का नाम और वर्शन नंबर होता है. signature_digests
-
ऐप्लिकेशन के साइनिंग सर्टिफ़िकेट के SHA-256 डाइजेस्ट का सेट. किसी ऐप्लिकेशन के लिए, साइनिंग की के सर्टिफ़िकेट की एक से ज़्यादा चेन हो सकती हैं. इनमें से हर एक के लिए, "लीफ़" सर्टिफ़िकेट को डाइजेस्ट किया जाता है और
signature_digests
फ़ील्ड में रखा जाता है. फ़ील्ड का नाम गुमराह करने वाला है, क्योंकि डाइजेस्ट किए गए डेटा में ऐप्लिकेशन के साइनिंग सर्टिफ़िकेट होते हैं, न कि ऐप्लिकेशन के हस्ताक्षर. ऐसा इसलिए है, क्योंकि इसका नामgetPackageInfo()
को कॉल करने पर मिलने वालीSignature
क्लास के लिए रखा गया है. यहां दिया गया कोड स्निपेट, सेट का एक उदाहरण दिखाता है:{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}
प्रॉविज़निंग की जानकारी देने वाला एक्सटेंशन
प्रॉविज़निंग की जानकारी देने वाले एक्सटेंशन में ओआईडी 1.3.6.1.4.1.11129.2.1.30
है. यह एक्सटेंशन, डिवाइस के बारे में वह जानकारी देता है जो डिवाइस को सेट अप करने वाले सर्वर को पता होती है.
स्कीमा
एक्सटेंशन वैल्यू में कॉन्साइज़ बाइनरी ऑब्जेक्ट रिप्रेजेंटेशन (सीबीओआर) डेटा होता है. यह डेटा, कॉन्साइज़ डेटा डेफ़िनिशन लैंग्वेज (सीडीडीएल) स्कीमा के मुताबिक होता है:
{ 1 : int, ; certificates issued 4 : string, ; validated attested entity (STRONG_BOX/TEE) }
मैप का कोई वर्शन नहीं है और इसमें नए वैकल्पिक फ़ील्ड जोड़े जा सकते हैं.
-
certs_issued
-
पिछले 30 दिनों में डिवाइस को जारी किए गए सर्टिफ़िकेट की अनुमानित संख्या. अगर यह वैल्यू, औसत वैल्यू से कई गुना ज़्यादा है, तो इसका इस्तेमाल संभावित गलत इस्तेमाल के सिग्नल के तौर पर किया जा सकता है.
-
validated_attested_entity
-
पुष्टि की गई अटेस्टेड इकाई एक स्ट्रिंग होती है. इससे उस डिवाइस के टाइप के बारे में पता चलता है जिसकी पुष्टि, प्रोविज़निंग सर्वर ने अटेस्टेड के तौर पर की है. उदाहरण के लिए,
STRONG_BOX
याTEE
.
प्रमाणित करने के लिए इस्तेमाल की जाने वाली कुंजियां
डिवाइस में दो कुंजियां, एक आरएसए और एक ईसीडीएसए, और उनसे जुड़ी सर्टिफ़िकेट चेन सुरक्षित तरीके से उपलब्ध कराई जाती हैं.
Android 12 में रिमोट की प्रोविज़निंग की सुविधा जोड़ी गई है. Android 13 के लिए, डिवाइसों में इस सुविधा को लागू करना ज़रूरी है. रिमोट कुंजी उपलब्ध कराने की सुविधा, फ़ील्ड में मौजूद डिवाइसों को हर ऐप्लिकेशन के लिए, ECDSA P256 पुष्टि करने वाले सर्टिफ़िकेट उपलब्ध कराती है. ये सर्टिफ़िकेट, फ़ैक्ट्री में पहले से इंस्टॉल किए गए सर्टिफ़िकेट की तुलना में कम समय के लिए मान्य होते हैं.
यूनीक आईडी
यूनीक आईडी, 128-बिट वैल्यू होती है. इससे डिवाइस की पहचान होती है. हालांकि, यह सिर्फ़ कुछ समय के लिए मान्य होता है. वैल्यू का हिसाब इस तरह लगाया जाता है:
HMAC_SHA256(T || C || R, HBK)
यहां:
T
"टेंपोरल काउंटर वैल्यू" है. इसेTag::CREATION_DATETIME
की वैल्यू को 2592000000 से भाग देकर निकाला जाता है और शेष को छोड़ दिया जाता है.T
हर 30 दिनों में बदलता है (2592000000 = 30 * 24 * 60 * 60 * 1000).C
,Tag::APPLICATION_ID
की वैल्यू है- अगर attest_key कॉल के attest_params पैरामीटर में
Tag::RESET_SINCE_ID_ROTATION
मौजूद है, तोR
की वैल्यू 1 होती है. अगर टैग मौजूद नहीं है, तो इसकी वैल्यू 0 होती है. HBK
एक यूनीक सीक्रेट कुंजी है, जो हार्डवेयर से जुड़ा होता है. इसकी जानकारी ट्रस्टेड एक्ज़ीक्यूशन एनवायरमेंट को होती है, लेकिन यह कभी भी इसे ज़ाहिर नहीं करता. सीक्रेट कुंजी में कम से कम 128 बिट का एन्ट्रोपी होता है और यह हर डिवाइस के लिए यूनीक होता है. हालांकि, 128 बिट के एन्ट्रोपी के हिसाब से, यूनीक होने की संभावना को स्वीकार किया जा सकता है. एचबीके को एचएमएसी या AES_CMAC के ज़रिए, फ़्यूज़ किए गए की मटीरियल से बनाया जाना चाहिए.
HMAC_SHA256 आउटपुट को 128 बिट पर छोटा करें.
एक से ज़्यादा आईएमईआई
Android 14 में, Android पर कुंजी को प्रमाणित करने के रिकॉर्ड में एक से ज़्यादा आईएमईआई के लिए सहायता जोड़ी गई है. ओईएम, इस सुविधा को लागू कर सकते हैं. इसके लिए, उन्हें दूसरे आईएमईआई के लिए KeyMint टैग जोड़ना होगा. अब डिवाइसों में एक से ज़्यादा सेल्यूलर रेडियो होना आम बात हो गई है. साथ ही, ओईएम अब दो आईएमईआई वाले डिवाइसों के लिए सहायता उपलब्ध करा सकते हैं.
अगर ओईएम के डिवाइसों पर दूसरा आईएमईआई मौजूद है, तो उसे KeyMint के साथ काम करने वाले डिवाइसों पर उपलब्ध कराना ज़रूरी है. इससे KeyMint के साथ काम करने वाले डिवाइस, दूसरे आईएमईआई की पुष्टि उसी तरह कर पाएंगे जिस तरह वे पहले आईएमईआई की पुष्टि करते हैं.
आईडी की पुष्टि करना
Android 8.0 में, Keymaster 3 वाले डिवाइसों के लिए आईडी की पुष्टि करने की सुविधा शामिल है. हालांकि, यह सुविधा वैकल्पिक है. आईडी अटेस्टेशन की सुविधा की मदद से, डिवाइस अपने हार्डवेयर आइडेंटिफ़ायर का सबूत दे सकता है. जैसे, सीरियल नंबर या आईएमईआई. यह सुविधा ज़रूरी नहीं है. हालांकि, हमारा सुझाव है कि Keymaster 3 को लागू करने वाले सभी डिवाइसों पर यह सुविधा काम करे. ऐसा इसलिए, क्योंकि डिवाइस की पहचान की पुष्टि करने की सुविधा से, कई तरह के इस्तेमाल के उदाहरणों को ज़्यादा सुरक्षित बनाया जा सकता है. जैसे, बिना किसी रुकावट के रिमोट कॉन्फ़िगरेशन की सुविधा. ऐसा इसलिए, क्योंकि रिमोट साइड सिस्टम यह पक्का कर सकता है कि वह सही डिवाइस से कम्यूनिकेट कर रहा है, न कि किसी ऐसे डिवाइस से जो अपनी पहचान छिपा रहा है.
आईडी की पुष्टि करने की सुविधा, डिवाइस के हार्डवेयर आइडेंटिफ़ायर की कॉपी बनाती है. इन्हें सिर्फ़ टीईई ऐक्सेस कर सकता है. ऐसा डिवाइस के फ़ैक्ट्री से निकलने से पहले किया जाता है. कोई व्यक्ति डिवाइस के बूटलोडर को अनलॉक कर सकता है. साथ ही, सिस्टम सॉफ़्टवेयर और Android फ़्रेमवर्क से रिपोर्ट किए गए आइडेंटिफ़ायर बदल सकता है. टीईई में मौजूद आइडेंटिफ़ायर की कॉपी में इस तरह से बदलाव नहीं किया जा सकता. इससे यह पक्का होता है कि डिवाइस आईडी की पुष्टि करने की सुविधा, सिर्फ़ डिवाइस के ओरिजनल हार्डवेयर आइडेंटिफ़ायर की पुष्टि करती है. इससे स्पूफ़िंग की कोशिशों को रोका जा सकता है.
आईडी की पुष्टि करने के लिए मुख्य एपीआई, मौजूदा कुंजी की पुष्टि करने के तरीके पर आधारित है. इसे Keymaster 2 के साथ पेश किया गया था. Keymaster के पास मौजूद किसी कुंजी के लिए पुष्टि करने वाले सर्टिफ़िकेट का अनुरोध करते समय, कॉलर यह अनुरोध कर सकता है कि डिवाइस के हार्डवेयर आइडेंटिफ़ायर को पुष्टि करने वाले सर्टिफ़िकेट के मेटाडेटा में शामिल किया जाए. अगर कुंजी को टीईई में रखा जाता है, तो सर्टिफ़िकेट, भरोसेमंद रूट पर वापस चेन हो जाता है. इस तरह के सर्टिफ़िकेट को पाने वाला व्यक्ति, यह पुष्टि कर सकता है कि सर्टिफ़िकेट और उसका कॉन्टेंट, टीईई ने लिखा है. इसमें हार्डवेयर आइडेंटिफ़ायर भी शामिल हैं. जब अटेस्टेशन सर्टिफ़िकेट में हार्डवेयर आइडेंटिफ़ायर शामिल करने के लिए कहा जाता है, तो टीईई सिर्फ़ उन आइडेंटिफ़ायर की पुष्टि करता है जो उसके स्टोरेज में मौजूद हैं. ये आइडेंटिफ़ायर, फ़ैक्ट्री में तैयार किए जाते हैं.
स्टोरेज की प्रॉपर्टी
डिवाइस के आइडेंटिफ़ायर सेव करने वाले स्टोरेज में ये प्रॉपर्टी होनी चाहिए:
- डिवाइस के ओरिजनल आइडेंटिफ़ायर से मिली वैल्यू को फ़ैक्ट्री से डिवाइस के निकलने से पहले, स्टोरेज में कॉपी कर दिया जाता है.
destroyAttestationIds()
तरीके से, आइडेंटिफ़ायर से मिले डेटा की इस कॉपी को हमेशा के लिए मिटाया जा सकता है. हमेशा के लिए मिटाने का मतलब है कि डेटा पूरी तरह से हटा दिया जाता है, ताकि फ़ैक्ट्री रीसेट करने या डिवाइस पर की गई किसी अन्य प्रक्रिया से उसे वापस न लाया जा सके. यह खास तौर पर उन डिवाइसों के लिए ज़रूरी है जहां उपयोगकर्ता ने बूटलोडर को अनलॉक किया है, सिस्टम सॉफ़्टवेयर में बदलाव किया है, और Android फ़्रेमवर्क से मिले आइडेंटिफ़ायर में बदलाव किया है.- आरएमए की सुविधा देने वाली कंपनियों के पास, हार्डवेयर आइडेंटिफ़ायर से मिले डेटा की नई कॉपी जनरेट करने की सुविधा होनी चाहिए. इस तरह, आरएमए की प्रोसेस पूरी करने वाला डिवाइस, आईडी की पुष्टि फिर से कर सकता है. आरएमए की सुविधा देने वाली कंपनियों को पक्का करना चाहिए कि डिवाइस की मरम्मत की प्रक्रिया सुरक्षित रहे. ऐसा इसलिए, ताकि उपयोगकर्ता खुद से इसका इस्तेमाल न कर पाएं. अगर वे ऐसा करते हैं, तो उन्हें नकली आईडी का सर्टिफ़िकेट मिल सकता है.
- टीईई में, Keymaster के भरोसेमंद ऐप्लिकेशन के अलावा कोई और कोड, स्टोरेज में मौजूद आइडेंटिफ़ायर से मिले डेटा को नहीं पढ़ सकता.
- स्टोरेज में छेड़छाड़ का पता चल जाता है: अगर स्टोरेज के कॉन्टेंट में बदलाव किया गया है, तो टीईई इसे इस तरह से देखता है जैसे कॉन्टेंट की कॉपी मिटा दी गई हों. साथ ही, आईडी की पुष्टि करने के सभी अनुरोधों को अस्वीकार कर देता है. इसे लागू करने के लिए, स्टोरेज पर हस्ताक्षर या एमएसी किया जाता है. इसके बारे में यहां बताया गया है.
- स्टोरेज में ओरिजनल आइडेंटिफ़ायर सेव नहीं किए जाते. पहचान की पुष्टि करने की प्रक्रिया में चुनौती होती है. इसलिए, कॉलर हमेशा उन आइडेंटिफ़ायर को उपलब्ध कराता है जिनकी पुष्टि करनी होती है. टीईई को सिर्फ़ यह पुष्टि करनी होती है कि ये वही वैल्यू हैं जो उसके पास पहल से मौजूद हैं. इसकी पुष्टि करने के लिए, ओरिजनल वैल्यू के बजाय उनके सुरक्षित हैश सेव किए जाते हैं.
निर्माण
ऊपर दी गई प्रॉपर्टी वाला कोई इंप्लीमेंटेशन बनाने के लिए, आईडी से मिली वैल्यू को इस कंस्ट्रक्शन S में सेव करें. आईडी वैल्यू की अन्य कॉपी सेव न करें. हालांकि, सिस्टम में मौजूद सामान्य जगहों पर ऐसा किया जा सकता है. डिवाइस का मालिक, रूटिंग करके इन जगहों में बदलाव कर सकता है:
S = D || HMAC(HBK, D)
कहां:
D = HMAC(HBK, ID1) || HMAC(HBK, ID2) || ... || HMAC(HBK, IDn)
HMAC
, एचएमएसी कंस्ट्रक्शन है. इसमें सुरक्षित हैश (SHA-256 का इस्तेमाल करने का सुझाव दिया गया है) का इस्तेमाल किया गया हैHBK
एक हार्डवेयर-बाउंड कुंजी है, जिसका इस्तेमाल किसी और मकसद के लिए नहीं किया जाताID1...IDn
ओरिजनल आईडी वैल्यू हैं; किसी वैल्यू को किसी इंडेक्स से जोड़ने का तरीका, लागू करने के तरीके पर निर्भर करता है. ऐसा इसलिए, क्योंकि अलग-अलग डिवाइसों में आइडेंटिफ़ायर की संख्या अलग-अलग होती है||
से दो या उससे ज़्यादा स्ट्रिंग को एक साथ जोड़ने का पता चलता है
एचएमएसी आउटपुट का साइज़ तय होता है. इसलिए, अलग-अलग आईडी हैश या D का एचएमएसी ढूंढने के लिए, किसी हेडर या अन्य स्ट्रक्चर की ज़रूरत नहीं होती. प्रमाणित करने के लिए, दी गई वैल्यू की जांच करने के अलावा, लागू करने वाले लोगों को S की पुष्टि करनी होगी. इसके लिए, उन्हें S से D को निकालना होगा, HMAC(HBK, D) की गिनती करनी होगी, और इसकी तुलना S में मौजूद वैल्यू से करनी होगी. इससे यह पुष्टि की जा सकेगी कि किसी भी व्यक्ति के आईडी में बदलाव नहीं किया गया है/उसे खराब नहीं किया गया है. साथ ही, लागू करने के लिए, सभी आईडी एलिमेंट और S की पुष्टि के लिए, कॉन्स्टेंट-टाइम कंपैरिज़न का इस्तेमाल करना होगा. तुलना करने में लगने वाला समय एक जैसा होना चाहिए. भले ही, कितने भी आईडी दिए गए हों और टेस्ट का कोई भी हिस्सा सही तरीके से मैच हुआ हो.
हार्डवेयर आइडेंटिफ़ायर
आईडी की पुष्टि करने की सुविधा, इन हार्डवेयर आइडेंटिफ़ायर के साथ काम करती है:
- Android में
Build.BRAND
से मिला ब्रैंड का नाम - Android में
Build.DEVICE
से मिला डिवाइस का नाम - Android में
Build.PRODUCT
से मिला प्रॉडक्ट का नाम - Android में
Build.MANUFACTURER
से मिला मैन्युफ़ैक्चरर का नाम - Android में
Build.MODEL
से मिला मॉडल का नाम - सीरियल नंबर
- सभी रेडियो के आईएमईआई
- सभी रेडियो के एमईआईडी
डिवाइस आईडी की पुष्टि करने की सुविधा के लिए, डिवाइस इन आइडेंटिफ़ायर की पुष्टि करता है. Android पर काम करने वाले सभी डिवाइसों में पहले छह सेंसर होते हैं. इस सुविधा के काम करने के लिए, ये सेंसर ज़रूरी हैं. अगर डिवाइस में कोई इंटिग्रेटेड सेल्युलर रेडियो है, तो डिवाइस में रेडियो के आईएमईआई और/या एमईआईडी की पुष्टि करने की सुविधा भी होनी चाहिए.
आईडी की पुष्टि करने का अनुरोध, कुंजी की पुष्टि करके किया जाता है. साथ ही, अनुरोध में डिवाइस आइडेंटिफ़ायर शामिल किए जाते हैं, ताकि उनकी पुष्टि की जा सके. आइडेंटिफ़ायर को इस तरह टैग किया जाता है:
ATTESTATION_ID_BRAND
ATTESTATION_ID_DEVICE
ATTESTATION_ID_PRODUCT
ATTESTATION_ID_MANUFACTURER
ATTESTATION_ID_MODEL
ATTESTATION_ID_SERIAL
ATTESTATION_ID_IMEI
ATTESTATION_ID_MEID
जिस आइडेंटिफ़ायर की पुष्टि करनी है वह UTF-8 कोड में बदली गई बाइट स्ट्रिंग है. यह फ़ॉर्मैट, संख्या वाले आइडेंटिफ़ायर पर भी लागू होता है. पुष्टि किए जाने वाले हर आइडेंटिफ़ायर को UTF-8 में कोड की गई स्ट्रिंग के तौर पर दिखाया जाता है.
अगर डिवाइस पर आईडी की पुष्टि करने की सुविधा काम नहीं करती है (या destroyAttestationIds()
इसे पहले कॉल किया गया था और डिवाइस अब अपने आईडी की पुष्टि नहीं कर सकता), तो इन टैग में से एक या उससे ज़्यादा टैग शामिल करने वाले कुंजी की पुष्टि करने के किसी भी अनुरोध के लिए, ErrorCode::CANNOT_ATTEST_IDS
गड़बड़ी का मैसेज दिखेगा.
अगर डिवाइस पर आईडी की पुष्टि करने की सुविधा काम करती है और ऊपर दिए गए एक या इससे ज़्यादा टैग को कुंजी की पुष्टि करने के अनुरोध में शामिल किया गया है, तो टीईई यह पुष्टि करता है कि हर टैग के साथ दिया गया आइडेंटिफ़ायर, हार्डवेयर आइडेंटिफ़ायर की कॉपी से मेल खाता है. अगर एक या इससे ज़्यादा आइडेंटिफ़ायर मेल नहीं खाते हैं, तो पूरी पुष्टि नहीं हो पाएगी और आपको ErrorCode::CANNOT_ATTEST_IDS
दिखेगा. एक ही टैग को कई बार सबमिट किया जा सकता है. यह जानकारी तब काम आ सकती है, जब किसी डिवाइस के आईएमईआई की पुष्टि करनी हो. उदाहरण के लिए:
किसी डिवाइस में एक से ज़्यादा रेडियो और एक से ज़्यादा आईएमईआई हो सकते हैं. पुष्टि का अनुरोध तब मान्य होता है, जब हर ATTESTATION_ID_IMEI
के साथ दी गई वैल्यू, डिवाइस के किसी एक रेडियो से मेल खाती हो. यह अन्य सभी टैग पर भी लागू होता है.
अगर पुष्टि हो जाती है, तो पुष्टि किए गए आईडी को जारी किए गए पुष्टि करने वाले सर्टिफ़िकेट के पुष्टि करने वाले एक्सटेंशन (OID 1.3.6.1.4.1.11129.2.1.17) में जोड़ दिया जाता है. इसके लिए, ऊपर दिए गए स्कीमा का इस्तेमाल किया जाता है. Keymaster 2 के अटेस्टेशन स्कीमा में हुए बदलावों को टिप्पणियों के साथ बोल्ड किया गया है.
Java API
यह सेक्शन सिर्फ़ जानकारी देने के लिए है. Keymaster को लागू करने वाले लोग, Java API को न तो लागू करते हैं और न ही इसका इस्तेमाल करते हैं. यह जानकारी इसलिए दी जाती है, ताकि इस सुविधा को लागू करने वाले लोग यह समझ सकें कि ऐप्लिकेशन इसका इस्तेमाल कैसे करते हैं. सिस्टम के कॉम्पोनेंट इसका इस्तेमाल अलग-अलग तरीके से कर सकते हैं. इसलिए, यह ज़रूरी है कि इस सेक्शन को मानक के तौर पर न माना जाए.