पासकोड से सुरक्षित जगह पर क्रिप्टोग्राफ़िक कुंजियां बनाई जा सकती हैं, उन्हें सेव किया जा सकता है, और उनका इस्तेमाल किया जा सकता है. जब हार्डवेयर से सुरक्षित कुंजी का स्टोरेज उपलब्ध होता है और उसका इस्तेमाल किया जाता है, तो कुंजी का मटीरियल डिवाइस से निकाले जाने से ज़्यादा सुरक्षित होता है. साथ ही, Keymaster ऐसी पाबंदियां लागू करता है जिन्हें तोड़ना मुश्किल होता है.
हालांकि, यह सिर्फ़ तब सही होता है, जब यह पता हो कि पासकोड को स्टोर करने के लिए इस्तेमाल होने वाली कुंजियां, हार्डवेयर से सुरक्षित स्टोरेज में हैं. Keymaster 1 में, ऐप्लिकेशन या रिमोट सर्वर के पास यह पुष्टि करने का कोई तरीका नहीं था कि ऐसा है या नहीं. keystore डेमन, उपलब्ध keymaster HAL को लोड करता है और कुंजियों के हार्डवेयर बैकअप के बारे में HAL की बातों पर भरोसा करता है.
इस समस्या को ठीक करने के लिए, Keymaster ने Android 7.0 (Keymaster 2) में की पुष्टि और Android 8.0 (Keymaster 3) में आईडी की पुष्टि की सुविधा शुरू की.
कुंजी की पुष्टि करने की सुविधा का मकसद, यह तय करने का एक तरीका उपलब्ध कराना है कि असिमेट्रिक कुंजी का जोड़ा, हार्डवेयर पर आधारित है या नहीं. साथ ही, यह भी तय करना है कि कुंजी की प्रॉपर्टी क्या हैं और इसके इस्तेमाल पर कौनसी पाबंदियां लागू होती हैं.
आईडी की पुष्टि करने की सुविधा की मदद से, डिवाइस अपने हार्डवेयर आइडेंटिफ़ायर की पुष्टि कर सकता है. जैसे, सीरियल नंबर या IMEI.
कुंजी की पुष्टि करना
कुंजी की पुष्टि करने के लिए, 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
, कीमास्टर डिवाइस का स्ट्रक्चर है.keyToAttest
वह पासकोड है जोgenerateKey
से मिला है. इसके लिए पुष्टि की गई है.attestParams
, पुष्टि के लिए ज़रूरी पैरामीटर की सूची है. इसमेंTag::ATTESTATION_CHALLENGE
और हो सकता है किTag::RESET_SINCE_ID_ROTATION
के साथ-साथTag::APPLICATION_ID
औरTag::APPLICATION_DATA
भी शामिल हों. अगर पासकोड जनरेट करने के दौरान, इन दो एट्रिब्यूट की जानकारी दी गई है, तो पासकोड ब्लॉब को डिक्रिप्ट करने के लिए ये ज़रूरी हैं.certChain
आउटपुट पैरामीटर है, जो सर्टिफ़िकेट का एक कलेक्शन दिखाता है. एंट्री 0, पुष्टि करने वाला सर्टिफ़िकेट है. इसका मतलब है कि यहkeyToAttest
की कुंजी की पुष्टि करता है और इसमें पुष्टि करने वाला एक्सटेंशन शामिल होता है.
attestKey
तरीके को पुष्टि की गई कुंजी पर, सार्वजनिक कुंजी के ऑपरेशन के तौर पर माना जाता है. इसकी वजह यह है कि इसे किसी भी समय कॉल किया जा सकता है और इसके लिए अनुमति से जुड़ी पाबंदियों को पूरा करने की ज़रूरत नहीं होती. उदाहरण के लिए, अगर पुष्टि की गई कुंजी का इस्तेमाल करने के लिए उपयोगकर्ता की पुष्टि ज़रूरी है, तो उपयोगकर्ता की पुष्टि किए बिना भी पुष्टि की जा सकती है.
अटेस्टेशन सर्टिफ़िकेट
पुष्टि करने वाला सर्टिफ़िकेट, एक स्टैंडर्ड X.509 सर्टिफ़िकेट होता है. इसमें पुष्टि करने वाला एक्सटेंशन भी हो सकता है. हालांकि, यह ज़रूरी नहीं है. इस एक्सटेंशन में, पुष्टि की गई कुंजी की जानकारी होती है. सर्टिफ़िकेट पर, सर्टिफ़ाइड अटेस्टेशन पासकोड से हस्ताक्षर किया गया हो. पुष्टि करने वाली कुंजी, पुष्टि की जा रही कुंजी से अलग एल्गोरिदम का इस्तेमाल कर सकती है.
अटेस्टेशन सर्टिफ़िकेट में, नीचे दी गई टेबल में मौजूद फ़ील्ड होते हैं. इसमें कोई और फ़ील्ड नहीं हो सकता. कुछ फ़ील्ड में, फ़ील्ड की एक तय वैल्यू दी जाती है. सीटीएस की जांच से यह पुष्टि होती है कि सर्टिफ़िकेट का कॉन्टेंट, तय किए गए कॉन्टेंट से मेल खाता है.
सर्टिफ़िकेट SEQUENCE
फ़ील्ड का नाम (आरएफ़सी 5280 देखें) | वैल्यू |
---|---|
tbsCertificate | TBSCertificate SEQUENCE |
signatureAlgorithm | कुंजी पर हस्ताक्षर करने के लिए इस्तेमाल किए गए एल्गोरिदम का AlgorithmIdentifier: ईसी कुंजियों के लिए ईसीडीए, आरएसए कुंजियों के लिए आरएसए. |
signatureValue | बिट स्ट्रिंग, ASN.1 DER-एन्कोड किए गए tbsCertificate पर कैलकुलेट किया गया हस्ताक्षर. |
TBSCertificate SEQUENCE
फ़ील्ड का नाम (आरएफ़सी 5280 देखें) | वैल्यू |
---|---|
version |
INTEGER 2 (इसका मतलब है कि v3 सर्टिफ़िकेट) |
serialNumber |
INTEGER 1 (तय वैल्यू: सभी सर्टिफ़िकेट पर एक जैसी) |
signature |
कुंजी पर हस्ताक्षर करने के लिए इस्तेमाल किए गए एल्गोरिदम का AlgorithmIdentifier: ईसी कुंजियों के लिए ECDSA, आरएसए कुंजियों के लिए आरएसए. |
issuer |
यह बैच की पुष्टि करने वाली कुंजी के विषय फ़ील्ड जैसा ही होता है. |
validity |
दो तारीखों का क्रम, जिसमें 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 |
वैल्यू TBD |
extensions/"attestation" |
OID 1.3.6.1.4.1.11129.2.1.17 है. कॉन्टेंट के बारे में यहां दिए गए पुष्टि करने वाले एक्सटेंशन सेक्शन में बताया गया है. सभी X.509 सर्टिफ़िकेट एक्सटेंशन की तरह ही, कॉन्टेंट को OCTET_STRING के तौर पर दिखाया जाता है. इसमें पुष्टि करने वाले SEQUENCE का DER कोड होता है. |
पुष्टि करने की समयसीमा बढ़ाना
attestation
एक्सटेंशन का OID
1.3.6.1.4.1.11129.2.1.17
है. इसमें, पुष्टि किए जा रहे पासकोड के जोड़े और पासकोड जनरेट करने के समय डिवाइस की स्थिति की जानकारी होती है.
AIDL इंटरफ़ेस स्पेसिफ़िकेशन में बताए गए Keymaster/KeyMint टैग टाइप को ASN.1 टाइप में इस तरह से बदला जाता है:
Keymaster/KeyMint का टाइप | 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 स्कीमा में बताया गया है:
वर्शन 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 स्कीमा का वर्शन.
वैल्यू Keymaster/KeyMint का वर्शन 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 -
attestationSecurityLevel
-
उस जगह का सुरक्षा लेवल जहां पुष्टि की गई कुंजी सेव की गई है.
-
keymasterVersion
/keyMintVersion
-
Keymaster/KeyMint हार्डवेयर ऐब्स्ट्रैक्शन लेयर (एचएएल) के लागू होने का वर्शन.
वैल्यू Keymaster/KeyMint का वर्शन 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 -
keymasterSecurityLevel
/keyMintSecurityLevel
- Keymaster/KeyMint को लागू करने का सुरक्षा लेवल.
-
attestationChallenge
- पासकोड जनरेट करने के समय दिया गया चैलेंज.
-
uniqueId
- निजता से जुड़ा डिवाइस आइडेंटिफ़ायर, जिसका अनुरोध सिस्टम ऐप्लिकेशन, पासकोड जनरेट करने के समय कर सकते हैं. अगर यूनीक आईडी का अनुरोध नहीं किया गया है, तो यह फ़ील्ड खाली रहता है. ज़्यादा जानकारी के लिए, यूनीक आईडी सेक्शन देखें.
-
softwareEnforced
-
Keymaster/KeyMint की अनुमति वाली सूची, जिसे Android सिस्टम लागू करता है. यह जानकारी, प्लैटफ़ॉर्म में मौजूद कोड से इकट्ठा या जनरेट की जाती है. साथ ही, इसे डिवाइस के सिस्टम पार्टीशन में सेव किया जाता है. डिवाइस पर तब तक भरोसा किया जा सकता है, जब तक उस पर ऐसा ऑपरेटिंग सिस्टम काम कर रहा हो जो Android प्लैटफ़ॉर्म के सुरक्षा मॉडल का पालन करता हो. इसका मतलब है कि डिवाइस का बूटलोडर लॉक हो और
verifiedBootState
की वैल्यूVerified
हो. -
hardwareEnforced
- Keymaster/KeyMint की अनुमति वाली सूची, जिसे डिवाइस के ट्रस्टेड एक्ज़ीक्यूशन एनवायरमेंट (टीईई) या StrongBox से लागू किया जाता है. यह जानकारी, सुरक्षित हार्डवेयर में कोड की मदद से इकट्ठा या जनरेट की जाती है. साथ ही, इसे प्लैटफ़ॉर्म कंट्रोल नहीं करता. उदाहरण के लिए, जानकारी, बूटलोडर से या ऐसे सुरक्षित कम्यूनिकेशन चैनल से मिल सकती है जिसमें प्लैटफ़ॉर्म पर भरोसा करने की ज़रूरत न पड़े.
SecurityLevel की वैल्यू
SecurityLevel
वैल्यू से पता चलता है कि पासकोड से जुड़ा एलिमेंट (उदाहरण के लिए, पासकोड और पुष्टि) कितने हद तक अटैक के लिए सुरक्षित है.
वैल्यू | मतलब |
---|---|
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 फ़ील्ड
हर फ़ील्ड, AIDL इंटरफ़ेस स्पेसिफ़िकेशन में मौजूद Keymaster/KeyMint अनुमति टैग से जुड़ा होता है.
स्पेसिफ़िकेशन, अनुमति वाले टैग के बारे में पूरी जानकारी देता है: उनके मतलब, कॉन्टेंट के फ़ॉर्मैट, KeyDescription
ऑब्जेक्ट में softwareEnforced
या hardwareEnforced
फ़ील्ड में दिखने की संभावना, एक-दूसरे से अलग होने वाले अन्य टैग वगैरह. सभी AuthorizationList
फ़ील्ड ज़रूरी नहीं हैं.
हर फ़ील्ड में, EXPLICIT
के लिए एक खास कॉन्टेक्स्ट टैग होता है, जो कि Keymaster/KeyMint टैग नंबर के बराबर होता है. इससे 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 वाली टैग आईडी वैल्यू का इस्तेमाल करता है. -
digest
-
यह
Tag::DIGEST
अनुमति टैग से जुड़ा है. यह टैग, 5 की टैग आईडी वैल्यू का इस्तेमाल करता है. -
padding
-
यह अनुमति देने वाले
Tag::PADDING
टैग से जुड़ा है. यह टैग, 6 की टैग आईडी वैल्यू का इस्तेमाल करता है. -
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
Keymaster अनुमति वाले टैग से मेल खाता है, जो 401 की टैग आईडी वैल्यू का इस्तेमाल करता है. -
usageExpireDateTime
-
यह अनुमति वाले टैग के लिए है, जो
Tag::USAGE_EXPIRE_DATETIME
के बराबर है. यह टैग, 402 की टैग आईडी वैल्यू का इस्तेमाल करता है. -
usageCountLimit
-
यह
Tag::USAGE_COUNT_LIMIT
अनुमति टैग से जुड़ा है, जो टैग आईडी की वैल्यू 405 का इस्तेमाल करता है. -
noAuthRequired
-
यह अनुमति वाले
Tag::NO_AUTH_REQUIRED
टैग से जुड़ा है, जो टैग आईडी की वैल्यू 503 का इस्तेमाल करता है. -
userAuthType
-
यह
Tag::USER_AUTH_TYPE
अनुमति टैग से जुड़ा है. यह टैग, 504 की टैग आईडी वैल्यू का इस्तेमाल करता है. -
authTimeout
-
Tag::AUTH_TIMEOUT
अनुमति टैग से मेल खाता है. यह टैग, 505 की टैग आईडी वैल्यू का इस्तेमाल करता है. -
allowWhileOnBody
-
यह
Tag::ALLOW_WHILE_ON_BODY
अनुमति टैग से जुड़ा है, जो टैग आईडी की वैल्यू 506 का इस्तेमाल करता है.पुष्टि करने के लिए तय की गई समयसीमा खत्म होने के बाद भी, बटन का इस्तेमाल किया जा सकता है. ऐसा तब किया जा सकता है, जब उपयोगकर्ता ने डिवाइस को अब भी पहना हो. ध्यान दें कि सुरक्षित तौर पर पहने जाने वाला सेंसर यह तय करता है कि डिवाइस, उपयोगकर्ता के शरीर पर पहना जा रहा है या नहीं.
-
trustedUserPresenceRequired
-
यह सिर्फ़ ऐसेट की पुष्टि करने वाले वर्शन 3 और उसके बाद के वर्शन में मौजूद है.
यह
Tag::TRUSTED_USER_PRESENCE_REQUIRED
authorization टैग से जुड़ा है, जो 507 की टैग आईडी वैल्यू का इस्तेमाल करता है.इससे पता चलता है कि इस पासकोड का इस्तेमाल सिर्फ़ तब किया जा सकता है, जब उपयोगकर्ता ने अपनी मौजूदगी का सबूत दिया हो. इसके कुछ उदाहरण यहां दिए गए हैं:
- StrongBox पासकोड के लिए, हार्डवेयर बटन, जो कि StrongBox डिवाइस पर पिन से कनेक्ट होता है.
- टीईई पासकोड के लिए, फ़िंगरप्रिंट की मदद से पुष्टि करने की सुविधा से, डिवाइस पर मौजूद होने की पुष्टि होती है. ऐसा तब तक होता है, जब तक टीईई के पास स्कैनर का पूरा कंट्रोल होता है और वह फ़िंगरप्रिंट मैच करने की प्रोसेस करता है.
-
trustedConfirmationRequired
-
यह सिर्फ़ ऐसेट की पुष्टि करने वाले वर्शन 3 और उसके बाद के वर्शन में मौजूद है.
यह
Tag::TRUSTED_CONFIRMATION_REQUIRED
authorization टैग से जुड़ा है, जो टैग आईडी की वैल्यू 508 का इस्तेमाल करता है.इससे पता चलता है कि पासकोड का इस्तेमाल सिर्फ़ तब किया जा सकता है, जब उपयोगकर्ता अनुमति वाले टोकन का इस्तेमाल करके, उस डेटा की पुष्टि करता है जिस पर हस्ताक्षर करना है. उपयोगकर्ता की पुष्टि करने के तरीके के बारे में ज़्यादा जानने के लिए, Android पर सुरक्षित पुष्टि देखें.
ध्यान दें: यह टैग सिर्फ़ उन बटन पर लागू होता है जो
SIGN
के मकसद का इस्तेमाल करते हैं. -
unlockedDeviceRequired
-
यह सिर्फ़ ऐसेट की पुष्टि करने वाले वर्शन 3 और उसके बाद के वर्शन में मौजूद है.
यह
Tag::UNLOCKED_DEVICE_REQUIRED
अनुमति टैग से जुड़ा है, जो टैग आईडी की वैल्यू 509 का इस्तेमाल करता है. -
allApplications
-
यह
Tag::ALL_APPLICATIONS
अनुमति टैग से जुड़ा है, जो 600 की टैग आईडी वैल्यू का इस्तेमाल करता है.इससे पता चलता है कि किसी डिवाइस पर मौजूद सभी ऐप्लिकेशन, पासकोड जोड़े को ऐक्सेस कर सकते हैं या नहीं.
-
applicationId
-
यह
Tag::APPLICATION_ID
अनुमति टैग से जुड़ा है. यह टैग, 601 की टैग आईडी वैल्यू का इस्तेमाल करता है. -
creationDateTime
-
यह
Tag::CREATION_DATETIME
अनुमति टैग से जुड़ा है. यह टैग, 701 की टैग आईडी वैल्यू का इस्तेमाल करता है. -
origin
-
यह अनुमति देने वाले
Tag::ORIGIN
टैग से जुड़ा होता है. यह टैग, 702 की टैग आईडी वैल्यू का इस्तेमाल करता है. -
rollbackResistant
-
यह सिर्फ़ एटेस्टेशन पासकोड के वर्शन 1 और 2 में मौजूद है.
यह
Tag::ROLLBACK_RESISTANT
अनुमति टैग से जुड़ा है, जो 703 की टैग आईडी वैल्यू का इस्तेमाल करता है. -
rootOfTrust
-
यह
Tag::ROOT_OF_TRUST
अनुमति टैग से जुड़ा है, जो 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
Keymaster अनुमति टैग से जुड़ा है. इस टैग में, टैग आईडी की वैल्यू 709 का इस्तेमाल किया जाता है.ज़्यादा जानकारी के लिए, AttestationApplicationId के डेटा स्ट्रक्चर के बारे में बताने वाला सेक्शन देखें.
-
attestationIdBrand
-
यह सिर्फ़ ऐसेट की पुष्टि करने वाले वर्शन 2 और उसके बाद के वर्शन में मौजूद है.
यह
Tag::ATTESTATION_ID_BRAND
Keymaster टैग से जुड़ा है, जो 710 की टैग आईडी वैल्यू का इस्तेमाल करता है. -
attestationIdDevice
-
यह सिर्फ़ ऐसेट की पुष्टि करने वाले वर्शन 2 और उसके बाद के वर्शन में मौजूद है.
यह
Tag::ATTESTATION_ID_DEVICE
Keymaster टैग से जुड़ा है, जो 711 की टैग आईडी वैल्यू का इस्तेमाल करता है. -
attestationIdProduct
-
यह सिर्फ़ ऐसेट की पुष्टि करने वाले वर्शन 2 और उसके बाद के वर्शन में मौजूद है.
यह
Tag::ATTESTATION_ID_PRODUCT
Keymaster टैग से जुड़ा है, जो 712 की टैग आईडी वैल्यू का इस्तेमाल करता है. -
attestationIdSerial
-
यह सिर्फ़ ऐसेट की पुष्टि करने वाले वर्शन 2 और उसके बाद के वर्शन में मौजूद है.
यह
Tag::ATTESTATION_ID_SERIAL
Keymaster टैग से जुड़ा है, जो 713 की टैग आईडी वैल्यू का इस्तेमाल करता है. -
attestationIdImei
-
यह सिर्फ़ ऐसेट की पुष्टि करने वाले वर्शन 2 और उसके बाद के वर्शन में मौजूद है.
यह
Tag::ATTESTATION_ID_IMEI
अनुमति टैग से जुड़ा है, जो 714 की टैग आईडी वैल्यू का इस्तेमाल करता है. -
attestationIdMeid
-
यह सिर्फ़ ऐसेट की पुष्टि करने वाले वर्शन 2 और उसके बाद के वर्शन में मौजूद है.
यह
Tag::ATTESTATION_ID_MEID
अनुमति टैग से जुड़ा है, जो 715 की टैग आईडी वैल्यू का इस्तेमाल करता है. -
attestationIdManufacturer
-
यह सिर्फ़ ऐसेट की पुष्टि करने वाले वर्शन 2 और उसके बाद के वर्शन में मौजूद है.
यह
Tag::ATTESTATION_ID_MANUFACTURER
अनुमति वाले टैग से जुड़ा है, जो 716 की टैग आईडी वैल्यू का इस्तेमाल करता है. -
attestationIdModel
-
यह सिर्फ़ ऐसेट की पुष्टि करने वाले वर्शन 2 और उसके बाद के वर्शन में मौजूद है.
यह
Tag::ATTESTATION_ID_MODEL
अनुमति टैग से जुड़ा है, जो 717 की टैग आईडी वैल्यू का इस्तेमाल करता है. -
vendorPatchLevel
-
यह सिर्फ़ ऐसेट की पुष्टि करने वाले वर्शन 3 और उसके बाद के वर्शन में मौजूद है.
यह
Tag::VENDOR_PATCHLEVEL
अनुमति टैग से जुड़ा है, जो टैग आईडी की वैल्यू 718 का इस्तेमाल करता है.इससे वेंडर इमेज के सुरक्षा पैच लेवल की जानकारी मिलती है. इस कुंजी का इस्तेमाल करने के लिए, यह लेवल डिवाइस पर इंस्टॉल होना चाहिए. वैल्यू, YYYYMMDD फ़ॉर्मैट में दिखती है. इससे वेंडर के सुरक्षा पैच की तारीख का पता चलता है. उदाहरण के लिए, अगर किसी Android डिवाइस पर 1 अगस्त, 2018 को वेंडर का सुरक्षा पैच इंस्टॉल होने के बाद कुंजी जनरेट की गई थी, तो यह वैल्यू 20180801 होगी.
-
bootPatchLevel
-
यह सिर्फ़ ऐसेट की पुष्टि करने वाले वर्शन 3 और उसके बाद के वर्शन में मौजूद है.
यह
Tag::BOOT_PATCHLEVEL
अनुमति टैग से जुड़ा है, जो टैग आईडी की वैल्यू 719 का इस्तेमाल करता है.इस कुंजी का इस्तेमाल करने के लिए, डिवाइस पर कर्नल इमेज का वह सुरक्षा पैच लेवल होना चाहिए जिसकी जानकारी इस एट्रिब्यूट में दी गई है. वैल्यू YYYYMMDD फ़ॉर्मैट में दिखती है. इससे सिस्टम के सुरक्षा पैच की तारीख का पता चलता है. उदाहरण के लिए, अगर किसी Android डिवाइस पर 5 अगस्त, 2018 को इंस्टॉल किए गए सिस्टम के सुरक्षा पैच के साथ कुंजी जनरेट की गई थी, तो यह वैल्यू 20180805 होगी.
-
deviceUniqueAttestation
-
यह एट्रिब्यूट सिर्फ़ ऐसेट की पुष्टि करने वाले वर्शन 4 और उसके बाद के वर्शन में मौजूद होता है.
यह
Tag::DEVICE_UNIQUE_ATTESTATION
authorization टैग से जुड़ा है, जो 720 की टैग आईडी वैल्यू का इस्तेमाल करता है. -
attestationIdSecondImei
-
यह सिर्फ़ ऐसे एटेस्टेशन वर्शन में मौजूद है जिनका वर्शन 300 या इससे ज़्यादा है.
यह
Tag::ATTESTATION_ID_SECOND_IMEI
अनुमति टैग से जुड़ा है, जो 723 की टैग आईडी वैल्यू का इस्तेमाल करता है.
RootOfTrust फ़ील्ड
-
verifiedBootKey
- सार्वजनिक कुंजी का एक सुरक्षित हैश, जिसका इस्तेमाल पुष्टि किए गए बूट के हिस्से के तौर पर, डिवाइस के बूट अप के दौरान चलने वाले सभी कोड की पुष्टि करने के लिए किया जाता है. SHA-256 का सुझाव दिया जाता है.
-
deviceLocked
-
डिवाइस का बूटलोडर लॉक है या नहीं.
true
का मतलब है कि डिवाइस ने ऐसी हस्ताक्षर की गई इमेज को बूट किया है जिसकी पुष्टि वेरिफ़ाइड बूट की मदद से की गई है. -
verifiedBootState
- डिवाइस की वेरिफ़ाइड बूट की स्थिति.
-
verifiedBootHash
- वेरिफ़ाइड बूट की मदद से सुरक्षित किए गए सभी डेटा का डाइजेस्ट. Android Verified Boot के रेफ़रंस को लागू करने वाले डिवाइसों के लिए, इस फ़ील्ड में VBMeta डाइजेस्ट होता है.
VerifiedBootState की वैल्यू
वैल्यू | इससे जुड़ी बूट की स्थिति | मतलब |
---|---|---|
Verified |
GREEN |
भरोसे की पूरी चेन, हार्डवेयर से सुरक्षित रूट ऑफ़ ट्रस्ट से लेकर, bootloader और उन सभी पार्टिशन तक होती है जिनकी पुष्टि पुष्टि किए गए बूट की मदद से की जाती है.
इस स्थिति में, verifiedBootKey फ़ील्ड में एम्बेड किए गए रूट ऑफ़ ट्रस्ट का हैश होता है. यह डिवाइस बनाने वाली कंपनी, फ़ैक्ट्री में डिवाइस के रोम में एम्बेड किया गया सर्टिफ़िकेट होता है. |
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]), ...}
यूनीक आईडी
यूनीक आईडी, 128-बिट की वैल्यू होती है. इससे डिवाइस की पहचान की जाती है, लेकिन सिर्फ़ कुछ समय के लिए. वैल्यू का हिसाब इस तरह लगाया जाता है:
HMAC_SHA256(T || C || R, HBK)
कहाँ:
T
"टेंपलल काउंटर वैल्यू" है. इसेTag::CREATION_DATETIME
की वैल्यू को 2592000000 से भाग देकर, बचे हुए हिस्से को हटाकर कैलकुलेट किया जाता है.T
हर 30 दिनों में बदलता है (2592000000 = 30 * 24 * 60 * 60 * 1000).C
,Tag::APPLICATION_ID
की वैल्यू है- अगर
Tag::RESET_SINCE_ID_ROTATION
, attest_key कॉल के attest_params पैरामीटर में मौजूद है, तोR
की वैल्यू 1 होगी. अगर टैग मौजूद नहीं है, तो वैल्यू 0 होगी. HBK
, हार्डवेयर से जुड़ा एक यूनीक पासकोड है. यह ट्रस्टेड एक्ज़ीक्यूशन एनवायरमेंट के पास होता है और इसे कभी भी किसी को नहीं बताया जाता. सीक्रेट में कम से कम 128 बिट का एन्ट्रोपी होता है और यह हर डिवाइस के लिए यूनीक होता है. 128 बिट के एन्ट्रोपी के हिसाब से, यह माना जा सकता है कि यह यूनीक है. एचबीके, एचएमएसी या AES_CMAC की मदद से, फ़्यूज़ किए गए पासकोड से बनाया जाना चाहिए.
HMAC_SHA256 आउटपुट को 128 बिट तक काटें.
पुष्टि करने वाली कुंजियां और सर्टिफ़िकेट
डिवाइस में दो कुंजियां, एक आरएसए और एक ईसीडीएसए, और उनसे जुड़ी सर्टिफ़िकेट चेन को सुरक्षित तरीके से सेट किया जाता है.
Android 12 में, रिमोट पासकोड प्रोविज़निंग की सुविधा को जोड़ा गया है. Android 13 के लिए, डिवाइसों पर इस सुविधा को लागू करना ज़रूरी है. रिमोट कुंजी प्रोविज़निंग की सुविधा, फ़ील्ड में मौजूद डिवाइसों को हर ऐप्लिकेशन के लिए, ECDSA P256 पुष्टि करने वाले सर्टिफ़िकेट देती है. ये सर्टिफ़िकेट, फ़ैक्ट्री से मिलने वाले सर्टिफ़िकेट के मुकाबले कम समय के लिए मान्य होते हैं.
एक से ज़्यादा IMEI
Android 14 में, Android पासकोड की पुष्टि करने वाले रिकॉर्ड में एक से ज़्यादा IMEI जोड़े जा सकते हैं. OEM, दूसरे IMEI के लिए KeyMint टैग जोड़कर, इस सुविधा को लागू कर सकते हैं. अब डिवाइसों में एक से ज़्यादा सेल्युलर रेडियो होना आम बात हो गई है. साथ ही, OEM अब दो आईएमईआई वाले डिवाइसों के साथ काम कर सकते हैं.
अगर OEM के डिवाइसों में सेकंडरी IMEI मौजूद है, तो उसे KeyMint लागू करने के लिए उपलब्ध कराया जाना चाहिए, ताकि लागू करने की प्रोसेस में उसी तरह पुष्टि की जा सके जिस तरह पहले IMEI की पुष्टि की जाती है
प्रॉविज़निंग की जानकारी का एक्सटेंशन
प्रावधान की जानकारी वाले एक्सटेंशन का OID
1.3.6.1.4.1.11129.2.1.30
है. यह एक्सटेंशन, डिवाइस के बारे में वह जानकारी देता है जो डिवाइस को सेट अप करने वाले सर्वर के पास होती है.
स्कीमा
यह एक्सटेंशन, CDDL स्कीमा का पालन करता है:
{ 1 : int, ; certificates issued }
मैप में कोई वर्शन नहीं होता और इसमें वैकल्पिक फ़ील्ड जोड़े जा सकते हैं.
-
certs_issued
-
पिछले 30 दिनों में डिवाइस को जारी किए गए सर्टिफ़िकेट की अनुमानित संख्या. अगर वैल्यू, औसत से काफ़ी ज़्यादा है, तो इस वैल्यू का इस्तेमाल संभावित गलत इस्तेमाल के सिग्नल के तौर पर किया जा सकता है.
आईडी की पुष्टि करना
Android 8.0 में, Keymaster 3 वाले डिवाइसों के लिए आईडी की पुष्टि करने की सुविधा शामिल है. हालांकि, इसका इस्तेमाल करना ज़रूरी नहीं है. आईडी की पुष्टि करने की सुविधा की मदद से, डिवाइस अपने हार्डवेयर आइडेंटिफ़ायर, जैसे कि सीरियल नंबर या IMEI की पुष्टि कर सकता है. यह सुविधा ज़रूरी नहीं है, लेकिन हमारा सुझाव है कि Keymaster 3 के सभी वर्शन में इस सुविधा का इस्तेमाल किया जाए. ऐसा इसलिए, क्योंकि डिवाइस की पहचान की पुष्टि करने से, ज़ीरो-टच रिमोट कॉन्फ़िगरेशन जैसे इस्तेमाल के उदाहरणों को ज़्यादा सुरक्षित बनाया जा सकता है. ऐसा इसलिए, क्योंकि रिमोट साइड को यह पक्का करने में मदद मिलती है कि वह सही डिवाइस से बात कर रहा है, न कि किसी ऐसे डिवाइस से जो अपनी पहचान बदलकर बात कर रहा है.
आईडी की पुष्टि करने की सुविधा, डिवाइस के हार्डवेयर आइडेंटिफ़ायर की कॉपी बनाकर काम करती है. डिवाइस के फ़ैक्ट्री से बाहर निकलने से पहले, सिर्फ़ ट्रस्टेड एक्ज़ीक्यूशन एनवायरमेंट (टीईई) ही इन कॉपी को ऐक्सेस कर सकता है. उपयोगकर्ता, डिवाइस के बूटलोडर को अनलॉक कर सकता है. साथ ही, सिस्टम सॉफ़्टवेयर और Android फ़्रेमवर्क की ओर से बताए गए आइडेंटिफ़ायर को बदल सकता है. TEE में मौजूद आइडेंटिफ़ायर की कॉपी में इस तरह से बदलाव नहीं किया जा सकता. इससे यह पक्का होता है कि डिवाइस आईडी की पुष्टि सिर्फ़ डिवाइस के मूल हार्डवेयर आइडेंटिफ़ायर की पुष्टि करती है. इससे स्पूफिंग की कोशिशों को नाकाम किया जा सकता है.
आईडी की पुष्टि करने के लिए मुख्य एपीआई, Keymaster 2 के साथ शुरू किए गए मौजूदा पासकोड की पुष्टि करने के तरीके पर आधारित है. अगर कॉल करने वाला व्यक्ति, पासकोड मैनेजर के पास मौजूद पासकोड के लिए पुष्टि करने वाले सर्टिफ़िकेट का अनुरोध करता है, तो वह डिवाइस के हार्डवेयर आइडेंटिफ़ायर को पुष्टि करने वाले सर्टिफ़िकेट के मेटाडेटा में शामिल करने का अनुरोध कर सकता है. अगर कुंजी टीईई में रखी जाती है, तो सर्टिफ़िकेट, किसी भरोसेमंद रूट से जुड़ा होता है. इस तरह के सर्टिफ़िकेट पाने वाला व्यक्ति, इस बात की पुष्टि कर सकता है कि सर्टिफ़िकेट और उसके कॉन्टेंट को TEE ने लिखा है. इनमें हार्डवेयर आइडेंटिफ़ायर भी शामिल हैं. जब पुष्टि करने वाले सर्टिफ़िकेट में हार्डवेयर आइडेंटिफ़ायर शामिल करने के लिए कहा जाता है, तो टीईई सिर्फ़ अपने स्टोरेज में मौजूद आइडेंटिफ़ायर की पुष्टि करता है. ये आइडेंटिफ़ायर, फ़ैक्ट्री फ़्लोर पर डाले जाते हैं.
स्टोरेज प्रॉपर्टी
डिवाइस के आइडेंटिफ़ायर को सेव करने वाले स्टोरेज में ये प्रॉपर्टी होनी चाहिए:
- डिवाइस के ओरिजनल आइडेंटिफ़ायर से मिली वैल्यू, डिवाइस के फ़ैक्ट्री से बाहर निकलने से पहले, स्टोरेज में कॉपी कर दी जाती हैं.
destroyAttestationIds()
तरीके से, आइडेंटिफ़ायर से मिले डेटा की इस कॉपी को हमेशा के लिए मिटाया जा सकता है. हमेशा के लिए मिटाने का मतलब है कि डेटा को पूरी तरह से मिटा दिया गया है. इसलिए, डिवाइस को फ़ैक्ट्री रीसेट करने या उस पर कोई दूसरा तरीका अपनाने पर भी, डेटा वापस नहीं लाया जा सकता. यह जानकारी खास तौर पर उन डिवाइसों के लिए ज़रूरी है जिनके उपयोगकर्ता ने bootloader को अनलॉक किया है और सिस्टम सॉफ़्टवेयर में बदलाव किया है. साथ ही, Android फ़्रेमवर्क से मिले आइडेंटिफ़ायर में भी बदलाव किया है.- आरएमए की सुविधाओं में, हार्डवेयर आइडेंटिफ़ायर से मिले डेटा की नई कॉपी जनरेट करने की सुविधा होनी चाहिए. इस तरह, आरएमए की प्रक्रिया से गुज़रने वाले डिवाइस के लिए, आईडी की पुष्टि फिर से की जा सकती है. आरएमए की सुविधाओं के लिए इस्तेमाल किए जाने वाले तरीके को सुरक्षित रखना ज़रूरी है, ताकि उपयोगकर्ता खुद इसे इस्तेमाल न कर सकें. ऐसा करने पर, वे झूठे आईडी की पुष्टि कर पाएंगे.
- टीईई में मौजूद Keymaster के ट्रस्ट किए गए ऐप्लिकेशन के अलावा, कोई भी कोड स्टोरेज में मौजूद, आइडेंटिफ़ायर से मिला डेटा नहीं पढ़ सकता.
- स्टोरेज में मौजूद कॉन्टेंट में बदलाव नहीं किया जा सकता: अगर स्टोरेज में मौजूद कॉन्टेंट में बदलाव किया गया है, तो टीईई उस कॉन्टेंट को वैसे ही मानता है जैसे कॉन्टेंट की कॉपी नष्ट कर दी गई हों. साथ ही, वह आईडी की पुष्टि करने की सभी कोशिशों को अस्वीकार कर देता है. इसे लागू करने के लिए, जैसा कि यहां बताया गया है स्टोरेज पर हस्ताक्षर करें या उसे मैक करें.
- स्टोरेज में ओरिजनल आइडेंटिफ़ायर सेव नहीं किए जाते. आईडी की पुष्टि करने के लिए, कॉलर को हमेशा पुष्टि किए जाने वाले आइडेंटिफ़ायर देने होते हैं. टीईई को सिर्फ़ इस बात की पुष्टि करनी होगी कि ये वैल्यू, उन वैल्यू से मेल खाती हैं जो पहले थीं. वैल्यू के बजाय, ओरिजनल वैल्यू के सुरक्षित हैश स्टोर करने से,
निर्माण
ऊपर दी गई प्रॉपर्टी वाला लागू करने का तरीका बनाने के लिए, आईडी से मिली वैल्यू को यहां दिए गए कंस्ट्रक्शन S में सेव करें. आईडी वैल्यू की अन्य कॉपी सेव न करें. हालांकि, सिस्टम में सामान्य जगहों पर आईडी वैल्यू सेव की जा सकती हैं. इनमें डिवाइस का मालिक, रूट करके बदलाव कर सकता है:
S = D || HMAC(HBK, D)
कहां:
D = HMAC(HBK, ID1) || HMAC(HBK, ID2) || ... || HMAC(HBK, IDn)
HMAC
, सही सुरक्षित हैश के साथ एचएमएस का कॉन्स्ट्रक्शन है (SHA-256 का सुझाव दिया जाता है)HBK
, हार्डवेयर से जुड़ी ऐसी कुंजी है जिसका इस्तेमाल किसी दूसरे काम के लिए नहीं किया जाताID1...IDn
मूल आईडी वैल्यू हैं; किसी खास वैल्यू को किसी खास इंडेक्स से जोड़ना, लागू करने के तरीके पर निर्भर करता है, क्योंकि अलग-अलग डिवाइसों में आइडेंटिफ़ायर की संख्या अलग-अलग होती है||
से कनकैनेटेशन का पता चलता है
HMAC आउटपुट का साइज़ तय होता है. इसलिए, अलग-अलग आईडी हैश या D का HMAC ढूंढने के लिए, किसी हेडर या दूसरे स्ट्रक्चर की ज़रूरत नहीं होती. पुष्टि करने के लिए दी गई वैल्यू की जांच करने के अलावा, लागू करने के लिए S से D को निकालकर, HMAC(HBK, D) का हिसाब लगाकर, S में मौजूद वैल्यू से इसकी तुलना करके S की पुष्टि करनी होगी. इससे यह पुष्टि की जा सकेगी कि किसी भी आईडी में बदलाव नहीं किया गया है या उसे नुकसान नहीं पहुंचा है. साथ ही, लागू करने के लिए, सभी अलग-अलग आईडी एलिमेंट और S की पुष्टि के लिए, एक जैसे समय की तुलना का इस्तेमाल करना ज़रूरी है. तुलना में लगने वाला समय एक जैसा होना चाहिए. भले ही, दिए गए आईडी की संख्या और टेस्ट के किसी भी हिस्से की सही मैचिंग हो.
हार्डवेयर आइडेंटिफ़ायर
आईडी की पुष्टि करने की सुविधा, इन हार्डवेयर आइडेंटिफ़ायर के साथ काम करती है:
- Android में
Build.BRAND
से मिला ब्रैंड का नाम - डिवाइस का नाम, जैसा कि Android में
Build.DEVICE
से मिला - Android में
Build.PRODUCT
से मिला प्रॉडक्ट का नाम - मैन्युफ़ैक्चरर का नाम, जैसा कि Android में
Build.MANUFACTURER
से मिला है - मॉडल का नाम, जैसा कि Android में
Build.MODEL
से मिला है - सीरियल नंबर
- सभी रेडियो के IMEI
- सभी रेडियो के MEID
डिवाइस आईडी की पुष्टि करने के लिए, डिवाइस इन आइडेंटिफ़ायर की पुष्टि करता है. Android पर काम करने वाले सभी डिवाइसों में पहले छह वर्शन मौजूद होते हैं. इनकी ज़रूरत इस सुविधा के काम करने के लिए होती है. अगर डिवाइस में कोई इंटिग्रेटेड सेल्युलर रेडियो है, तो डिवाइस में रेडियो के IMEI और/या MEID के लिए भी पुष्टि की सुविधा होनी चाहिए.
आईडी की पुष्टि का अनुरोध करने के लिए, कुंजी की पुष्टि की जाती है. साथ ही, अनुरोध में पुष्टि करने के लिए डिवाइस आइडेंटिफ़ायर शामिल किए जाते हैं. आइडेंटिफ़ायर को इनके तौर पर टैग किया जाता है:
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 को लागू नहीं करते और न ही उसका इस्तेमाल करते हैं. इसे लागू करने वाले लोगों को यह समझने में मदद मिलती है कि ऐप्लिकेशन इस सुविधा का इस्तेमाल कैसे करते हैं. सिस्टम के कॉम्पोनेंट इसका इस्तेमाल अलग तरह से कर सकते हैं. इसलिए, यह ज़रूरी है कि इस सेक्शन को सामान्य न माना जाए.