पासकोड से सुरक्षित जगह पर क्रिप्टोग्राफ़िक कुंजियां बनाई जा सकती हैं, उन्हें सेव किया जा सकता है, और उनका इस्तेमाल किया जा सकता है. जब हार्डवेयर से सुरक्षित कुंजी का स्टोरेज उपलब्ध होता है और उसका इस्तेमाल किया जाता है, तो कुंजी का मटीरियल डिवाइस से निकाले जाने से ज़्यादा सुरक्षित होता है. साथ ही, Keymaster ऐसी पाबंदियां लागू करता है जिन्हें तोड़ना मुश्किल होता है.
हालांकि, यह सिर्फ़ तब सही होता है, जब यह पता हो कि पासकोड को हार्डवेयर से सुरक्षित स्टोरेज में रखा गया है. Keymaster 1 में, ऐप्लिकेशन या रिमोट सर्वर के पास यह पुष्टि करने का कोई तरीका नहीं था कि ऐसा है या नहीं. कीस्टोर डीमन ने उपलब्ध कीमास्टर एचएएल को लोड किया और हार्डवेयर बैकिंग के संबंध में एचएएल ने जो भी कहा उस पर भरोसा किया.
इस समस्या को ठीक करने के लिए, 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 | TBSसर्टिफ़िकेट का क्रम |
signatureAlgorithm | कुंजी पर हस्ताक्षर करने के लिए इस्तेमाल किए गए एल्गोरिदम का AlgorithmIdentifier: ईसी कुंजियों के लिए ईसीडीए, आरएसए कुंजियों के लिए आरएसए. |
signatureValue | बिट स्ट्रिंग, ASN.1 DER-एन्कोड किए गए tbsCertificate पर कैलकुलेट किया गया हस्ताक्षर. |
TBSसर्टिफ़िकेट की जांच
फ़ील्ड का नाम (आरएफ़सी 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 स्कीमा का वर्शन.
वैल्यू कीमास्टर/कीमिंट वर्शन 1 Keymaster का वर्शन 2.0 2 Keymaster का वर्शन 3.0 3 Keymaster का वर्शन 4.0 4 कीमास्टर वर्शन 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 कीमास्टर वर्शन 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
अनुमति देने वाले टैग के मुताबिक है, जिसमें एक टैग आईडी वैल्यू का इस्तेमाल किया जाता है. -
algorithm
-
Tag::ALGORITHM
ऑथराइज़ेशन टैग से मेल खाता है. इस टैग में, टैग आईडी की वैल्यू दो होती है.पुष्टि करने वाले
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
ऑथराइज़ेशन टैग से मेल खाता है, जिसमें 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
के-मास्टर टैग से मेल खाता है. इस टैग में, टैग आईडी की वैल्यू 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 फ़ील्ड में
एम्बेड किए गए रूट ऑफ़ ट्रस्ट का हैश शामिल होता है. यह वह सर्टिफ़िकेट होता है जिसे फ़ैक्ट्री में डिवाइस बनाने वाली कंपनी ने डिवाइस की 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
फ़ील्ड में डाला जाता है. फ़ील्ड का नाम गुमराह करने वाला है. ऐसा इसलिए है, क्योंकि इकट्ठा किया गया डेटा, ऐप्लिकेशन के साइनिंग सर्टिफ़िकेट होता है, न कि ऐप्लिकेशन के हस्ताक्षर. ऐसा इसलिए होता है, क्योंकि इसका नामSignature
क्लास के लिए होता है, जिसेgetPackageInfo()
को कॉल करने पर सेट किया जाता है. नीचे दिया गया कोड स्निपेट, उदाहरण के एक सेट दिखाता है:{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}
अनन्य ID
यूनीक आईडी, 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 की पुष्टि की जाती है
आईडी की पुष्टि करना
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 पर काम करने वाले सभी डिवाइसों में पहले छह वर्शन मौजूद होते हैं. इनकी ज़रूरत इस सुविधा के काम करने के लिए होती है. अगर इस डिवाइस में इंटिग्रेट किए गए सेल्युलर रेडियो हैं, तो डिवाइस में रेडियो के IMEIs और/या 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
कोड दिखता है. एक ही टैग को कई बार इस्तेमाल किया जा सकता है. ऐसा करना मददगार साबित हो सकता है. उदाहरण के लिए, IMEI को प्रमाणित करते समय:
किसी डिवाइस में एक से ज़्यादा IMEI वाले कई रेडियो हो सकते हैं. पुष्टि का अनुरोध तब मान्य होता है, जब हर ATTESTATION_ID_IMEI
के साथ दी गई वैल्यू, डिवाइस के किसी रेडियो से मैच करती हो. यह बात अन्य सभी टैग पर भी लागू होती है.
अगर प्रमाणित किया जाता है, तो प्रमाणित आईडी को ऊपर दिए गए स्कीमा का इस्तेमाल करके, जारी किए गए, पुष्टि करने वाले सर्टिफ़िकेट के अटेस्टेशन एक्सटेंशन (OID 1.3.6.1.4.1.11129.2.1.17) में जोड़ा जाता है. Keymaster 2 के पुष्टि करने वाले स्कीमा में किए गए बदलावों को टिप्पणियों के साथ बोल्ड किया गया है.
Java API
यह सेक्शन सिर्फ़ जानकारी देने के लिए है. Keymaster लागू करने वाले लोग, Java API को लागू नहीं करते और न ही उसका इस्तेमाल करते हैं. इसे लागू करने वाले लोगों को यह समझने में मदद मिलती है कि ऐप्लिकेशन इस सुविधा का इस्तेमाल कैसे करते हैं. सिस्टम के कॉम्पोनेंट इसका इस्तेमाल अलग तरह से कर सकते हैं. इसलिए, यह ज़रूरी है कि इस सेक्शन को सामान्य न माना जाए.