कुंजी और आईडी की पुष्टि करना

Keystore, क्रिप्टोग्राफ़िक कुंजियों को बनाने, सेव करने, और उनका इस्तेमाल करने के लिए ज़्यादा सुरक्षित जगह उपलब्ध कराता है. हार्डवेयर-बैक्ड कुंजी स्टोरेज उपलब्ध होने और उसका इस्तेमाल किए जाने पर, डिवाइस से कुंजी मटीरियल को निकालने से ज़्यादा सुरक्षित रखा जाता है. साथ ही, KeyMint (पहले Keymaster) ऐसी पाबंदियां लागू करता है जिन्हें तोड़ना मुश्किल होता है.

हालांकि, ऐसा सिर्फ़ तब होता है, जब Keystore की कुंजियों को हार्डवेयर-बैक स्टोरेज में रखा जाता है. Keymaster 1 में, ऐप्लिकेशन या रिमोट सर्वर के पास यह पुष्टि करने का कोई भरोसेमंद तरीका नहीं था कि ऐसा हुआ है या नहीं. कीस्टोर डीमन ने उपलब्ध Keymaster हार्डवेयर ऐब्स्ट्रैक्शन लेयर (एचएएल) को लोड किया और कुंजियों के हार्डवेयर बैकअप के बारे में एचएएल ने जो भी जानकारी दी उसे सही मान लिया.

इस समस्या को ठीक करने के लिए, Android 7.0 (Keymaster 2) में कुंजी की पुष्टि करने की सुविधा और Android 8.0 (Keymaster 3) में आईडी की पुष्टि करने की सुविधा पेश की गई थी.

कुंजी की पुष्टि करने का मकसद, यह पता लगाने का तरीका उपलब्ध कराना है कि किसी एसिमेट्रिक कुंजी के जोड़े को हार्डवेयर से सुरक्षित किया गया है या नहीं. साथ ही, यह पता लगाना है कि कुंजी की प्रॉपर्टी क्या हैं और इसके इस्तेमाल पर कौनसी पाबंदियां लागू हैं.

आईडी की पुष्टि करने की सुविधा की मदद से, डिवाइस अपने हार्डवेयर आइडेंटिफ़ायर का सबूत दे सकता है. जैसे, सीरियल नंबर या आईएमईआई.

कुंजी की पुष्टि करना

कुंजी की पुष्टि करने की सुविधा के लिए, Android 7.0 ने एचएएल में टैग, टाइप, और तरीके का एक सेट पेश किया.

टैग

  • Tag::ATTESTATION_CHALLENGE
  • Tag::INCLUDE_UNIQUE_ID
  • Tag::RESET_SINCE_ID_ROTATION

वर्शन के मुताबिक तरीका

Keymaster 2 और इससे पहले के वर्शन

typedef struct {
    keymaster_blob_t* entries;
    size_t entry_count;
} keymaster_cert_chain_t;

AttestKey तरीका

Keymaster 3

    attestKey(vec<uint8_t> keyToAttest, vec<KeyParameter> attestParams)
        generates(ErrorCode error, vec<vec<uint8_t>> certChain);

Keymaster 2 और इससे पहले के वर्शन

keymaster_error_t (*attest_key)(const struct keymaster2_device* dev,
        const keymaster_key_blob_t* key_to_attest,
        const keymaster_key_param_set_t* attest_params,
        keymaster_cert_chain_t* cert_chain);
  • dev, Keymaster डिवाइस का स्ट्रक्चर है.
  • keyToAttest, generateKey से मिला मुख्य BLOB है. इसके लिए, पुष्टि की जाती है.
  • attestParams, पुष्टि के लिए ज़रूरी पैरामीटर की सूची है. इसमें Tag::ATTESTATION_CHALLENGE और Tag::RESET_SINCE_ID_ROTATION के साथ-साथ Tag::APPLICATION_ID और Tag::APPLICATION_DATA भी शामिल हैं. अगर कुंजी जनरेट करने के दौरान इन दोनों को तय किया गया था, तो कुंजी के मुख्य BLOB को डिक्रिप्ट करने के लिए, इन दोनों की ज़रूरत होती है.
  • certChain आउटपुट पैरामीटर है. यह सर्टिफ़िकेट का कलेक्शन दिखाता है. एंट्री 0, पुष्टि करने वाला सर्टिफ़िकेट है. इसका मतलब है कि यह keyToAttest से कुंजी की पुष्टि करता है और इसमें पुष्टि करने वाला एक्सटेंशन शामिल होता है.

attestKey तरीके को, पुष्टि की गई कुंजी पर सार्वजनिक कुंजी के तौर पर इस्तेमाल किया जाता है. ऐसा इसलिए, क्योंकि इसे किसी भी समय कॉल किया जा सकता है और इसके लिए, अनुमति से जुड़ी शर्तों को पूरा करना ज़रूरी नहीं है. उदाहरण के लिए, अगर पुष्टि की गई कुंजी को इस्तेमाल करने के लिए उपयोगकर्ता की पुष्टि करना ज़रूरी है, तो उपयोगकर्ता की पुष्टि किए बिना पुष्टि की जा सकती है.

पुष्टि करने वाला सर्टिफ़िकेट

पुष्टि करने वाला सर्टिफ़िकेट, एक स्टैंडर्ड X.509 सर्टिफ़िकेट होता है. इसमें पुष्टि करने के लिए एक वैकल्पिक एक्सटेंशन होता है. इसमें पुष्टि की गई कुंजी का ब्यौरा होता है. सर्टिफ़िकेट पर, पुष्टि करने वाली कुंजी से हस्ताक्षर होता है. यह सर्टिफ़ाइड होता है. ऐसा हो सकता है कि पुष्टि करने वाली कुंजी, पुष्टि की जा रही कुंजी से अलग एल्गोरिदम का इस्तेमाल करती हो.

पुष्टि करने वाले सर्टिफ़िकेट में, यहां दी गई टेबल में मौजूद फ़ील्ड शामिल होते हैं. इसमें कोई अन्य फ़ील्ड शामिल नहीं किया जा सकता. कुछ फ़ील्ड में, फ़ील्ड की वैल्यू तय होती है. सीटीएस टेस्ट से यह पुष्टि की जाती है कि सर्टिफ़िकेट का कॉन्टेंट, तय किए गए कॉन्टेंट के मुताबिक है.

सर्टिफ़िकेट SEQUENCE

फ़ील्ड का नाम (आरएफ़सी 5280 देखें) वैल्यू
tbsCertificate TBSCertificate SEQUENCE
signatureAlgorithm कुंजी पर हस्ताक्षर करने के लिए इस्तेमाल किए गए एल्गोरिदम का AlgorithmIdentifier:
ईसी कुंजियों के लिए ईसीडीएसए और आरएसए कुंजियों के लिए आरएसए.
signatureValue BIT STRING, ASN.1 DER-encoded tbsCertificate पर कंप्यूट किया गया हस्ताक्षर.

TBSCertificate SEQUENCE

फ़ील्ड का नाम (आरएफ़सी 5280 देखें) वैल्यू
version INTEGER 2 (इसका मतलब है कि यह v3 सर्टिफ़िकेट है)
serialNumber INTEGER 1 (तय की गई वैल्यू: सभी सर्टिफ़िकेट के लिए एक जैसी)
signature कुंजी को साइन करने के लिए इस्तेमाल किए गए एल्गोरिदम का AlgorithmIdentifier: ईसी कुंजियों के लिए ईसीडीएसए और आरएसए कुंजियों के लिए आरएसए.
issuer यह बैच पुष्टि करने की कुंजी के विषय के फ़ील्ड के जैसा ही होता है.
validity दो तारीखों का SEQUENCE, जिसमें Tag::ACTIVE_DATETIME और Tag::USAGE_EXPIRE_DATETIME की वैल्यू शामिल होती हैं. ये वैल्यू, 1 जनवरी, 1970 से मिलीसेकंड में दी जाती है. सर्टिफ़िकेट में तारीख को सही तरीके से दिखाने के लिए, आरएफ़सी 5280 देखें.
अगर Tag::ACTIVE_DATETIME मौजूद नहीं है, तो Tag::CREATION_DATETIME की वैल्यू का इस्तेमाल करें. अगर Tag::USAGE_EXPIRE_DATETIME मौजूद नहीं है, तो बैच अटेस्टेशन कुंजी के सर्टिफ़िकेट के खत्म होने की तारीख का इस्तेमाल करें.
subject CN = "Android Keystore Key" (तय की गई वैल्यू: सभी सर्टिफ़िकेट पर एक जैसी होती है)
subjectPublicKeyInfo SubjectPublicKeyInfo, जिसमें पुष्टि की गई सार्वजनिक कुंजी शामिल है.
extensions/Key Usage digitalSignature: सेट होता है, अगर कुंजी का मुख्य मकसद KeyPurpose::SIGN या KeyPurpose::VERIFY है. अन्य सभी बिट को अनसेट किया गया है.
extensions/CRL Distribution Points वैल्यू अभी तय नहीं है
extensions/"attestation" OID 1.3.6.1.4.1.11129.2.1.17 है. कॉन्टेंट के बारे में यहां दिए गए Attestation extension सेक्शन में बताया गया है. सभी X.509 सर्टिफ़िकेट एक्सटेंशन की तरह, इस एक्सटेंशन का कॉन्टेंट भी OCTET_STRING के तौर पर दिखाया जाता है. इसमें अटेस्टेशन SEQUENCE का DER एन्कोडिंग होता है.

पुष्टि करने वाला एक्सटेंशन

attestation एक्सटेंशन का ओआईडी 1.3.6.1.4.1.11129.2.1.17 है. इसमें अटेस्ट की जा रही कुंजी के जोड़े और कुंजी जनरेट करने के समय डिवाइस की स्थिति के बारे में जानकारी होती है.

एआईडीएल इंटरफ़ेस स्पेसिफ़िकेशन में तय किए गए Keymaster/KeyMint टैग टाइप को ASN.1 टाइप में इस तरह से बदला जाता है:

KeyMint या Keymaster का टाइप ASN.1 टाइप नोट
ENUM INTEGER
ENUM_REP SET of INTEGER
UINT INTEGER
UINT_REP SET of INTEGER
ULONG INTEGER
ULONG_REP SET of INTEGER
DATE INTEGER 1 जनवरी, 1970 को 00:00:00 जीएमटी के बाद से मिलीसेकंड में दिया जाता है.
BOOL NULL टैग मौजूद होने का मतलब है कि वैल्यू सही है और मौजूद न होने का मतलब है कि वैल्यू गलत है.
BIGNUM इस तरह का कोई टैग नहीं है. इसलिए, कोई मैपिंग तय नहीं की गई है.
BYTES OCTET_STRING

स्कीमा

अटेस्टेशन एक्सटेंशन के कॉन्टेंट के बारे में, यहां दिए गए ASN.1 स्कीमा में बताया गया है:

वर्शन 400

KeyDescription ::= SEQUENCE {
    attestationVersion  400,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    keyMintSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly  [305] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit  [405] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation  [720] EXPLICIT NULL OPTIONAL,
    attestationIdSecondImei  [723] EXPLICIT OCTET_STRING OPTIONAL,
    moduleHash  [724] EXPLICIT OCTET_STRING OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
    verifiedBootHash OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

वर्शन 300

KeyDescription ::= SEQUENCE {
    attestationVersion  300,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    keyMintSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly  [305] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit  [405] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation  [720] EXPLICIT NULL OPTIONAL,
    attestationIdSecondImei  [723] EXPLICIT OCTET_STRING OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
    verifiedBootHash OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

वर्शन 200

KeyDescription ::= SEQUENCE {
    attestationVersion  200,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    keyMintSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly  [305] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit  [405] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation  [720] EXPLICIT NULL OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
    verifiedBootHash OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

वर्शन 100

KeyDescription ::= SEQUENCE {
    attestationVersion  100,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    keyMintSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly  [305] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit  [405] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation  [720] EXPLICIT NULL OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
    verifiedBootHash OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

वर्शन 4

KeyDescription ::= SEQUENCE {
    attestationVersion  4,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly  [305] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    allApplications  [600] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation  [720] EXPLICIT NULL OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
    verifiedBootHash OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

वर्ज़न 3

KeyDescription ::= SEQUENCE {
    attestationVersion  3,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    allApplications  [600] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
    verifiedBootHash OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

वर्शन 2

KeyDescription ::= SEQUENCE {
    attestationVersion  2,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    allApplications  [600] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rollbackResistant  [703] EXPLICIT NULL OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

वर्शन 1

KeyDescription ::= SEQUENCE {
    attestationVersion  1,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    allApplications  [600] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rollbackResistant  [703] EXPLICIT NULL OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

KeyDescription फ़ील्ड

attestationVersion
ASN.1 स्कीमा का वर्शन.
वैल्यूKeyMint या Keymaster का वर्शन
1Keymaster 2.0 का वर्शन
2Keymaster का वर्शन 3.0
3Keymaster 4.0 का वर्शन
4Keymaster का वर्शन 4.1
100KeyMint वर्शन 1.0
200KeyMint 2.0 वर्शन
300KeyMint 3.0 वर्शन
400KeyMint 4.0 वर्शन
attestationSecurityLevel

उस जगह का सुरक्षा लेवल जहां अटेस्ट की गई कुंजी सेव की जाती है.

keymasterVersion / keyMintVersion
KeyMint या Keymaster एचएएल के वर्शन का इस्तेमाल किया गया है.
वैल्यूKeyMint या Keymaster का वर्शन
2Keymaster 2.0 का वर्शन
3Keymaster का वर्शन 3.0
4Keymaster 4.0 का वर्शन
41Keymaster का वर्शन 4.1
100KeyMint वर्शन 1.0
200KeyMint 2.0 वर्शन
300KeyMint 3.0 वर्शन
400KeyMint 4.0 वर्शन
keymasterSecurityLevel / keyMintSecurityLevel
KeyMint या Keymaster के वर्शन का सुरक्षा स्तर.
attestationChallenge
वह चैलेंज होता है जो कुंजी जनरेट करने के समय दिया जाता है.
uniqueId
यह निजता के लिहाज़ से संवेदनशील डिवाइस आइडेंटिफ़ायर है. सिस्टम ऐप्लिकेशन, कुंजी जनरेट करने के समय इसका अनुरोध कर सकते हैं. अगर यूनीक आईडी का अनुरोध नहीं किया गया है, तो यह फ़ील्ड खाली होता है. ज़्यादा जानकारी के लिए, यूनीक आईडी सेक्शन देखें.
softwareEnforced
KeyMint या Keymaster की अनुमति वाली सूची, जिसे Android सिस्टम लागू करता है. इस जानकारी को प्लैटफ़ॉर्म में मौजूद कोड से इकट्ठा या जनरेट किया जाता है. इस पर तब तक भरोसा किया जा सकता है, जब तक डिवाइस में ऐसा ऑपरेटिंग सिस्टम चल रहा हो जो Android प्लैटफ़ॉर्म के सुरक्षा मॉडल के मुताबिक हो. इसका मतलब है कि डिवाइस का बूटलोडर लॉक हो और verifiedBootState Verified हो.
hardwareEnforced
KeyMint या Keymaster की अनुमति वाली सूची, जिसे डिवाइस के ट्रस्टेड एक्ज़ीक्यूशन एनवायरमेंट (टीईई) या StrongBox लागू करता है. इस जानकारी को सुरक्षित हार्डवेयर में मौजूद कोड से इकट्ठा या जनरेट किया जाता है. इस पर प्लैटफ़ॉर्म का कंट्रोल नहीं होता. उदाहरण के लिए, जानकारी बूटलोडर से मिल सकती है. इसके अलावा, यह किसी ऐसे सुरक्षित कम्यूनिकेशन चैनल से भी मिल सकती है जिसमें प्लैटफ़ॉर्म पर भरोसा करने की ज़रूरत नहीं होती.

SecurityLevel वैल्यू

SecurityLevel वैल्यू से पता चलता है कि Keystore से जुड़ा कोई एलिमेंट (जैसे- कुंजी का जोड़ा और पुष्टि) हमले से कितना सुरक्षित है.

वैल्यू मतलब
Software जब तक डिवाइस का Android सिस्टम, Android प्लैटफ़ॉर्म के सुरक्षा मॉडल के मुताबिक काम करता है, तब तक यह सुरक्षित रहता है. इसका मतलब है कि डिवाइस का बूटलोडर लॉक है और verifiedBootState Verified है.
TrustedEnvironment जब तक टीईई सुरक्षित है, तब तक यह सुरक्षित है. टीईई के लिए आइसोलेशन से जुड़ी ज़रूरी शर्तों के बारे में, Android कंपैटबिलिटी डेफ़िनिशन डॉक्यूमेंट के सेक्शन 9.11 [C-1-1] से [C-1-4] में बताया गया है. टीईई, रिमोट से किए जाने वाले हमलों से काफ़ी हद तक सुरक्षित होते हैं. साथ ही, हार्डवेयर पर सीधे तौर पर किए जाने वाले हमलों से भी कुछ हद तक सुरक्षित होते हैं.
StrongBox StrongBox के सुरक्षित रहने तक सुरक्षित रहता है. StrongBox को हार्डवेयर सुरक्षा मॉड्यूल की तरह ही, सुरक्षा चिप में लागू किया जाता है. StrongBox को लागू करने से जुड़ी ज़रूरी शर्तों के बारे में, Android कंपैटबिलिटी डेफ़िनिशन डॉक्यूमेंट के सेक्शन 9.11.2 में बताया गया है. StrongBox, रिमोट से किए जाने वाले हमलों और हार्डवेयर पर सीधे तौर पर किए जाने वाले हमलों से सुरक्षित रहता है. जैसे, फ़िज़िकल टेंपरिंग और साइड-चैनल हमले.

AuthorizationList फ़ील्ड

हर फ़ील्ड, एआईडीएल इंटरफ़ेस स्पेसिफ़िकेशन में मौजूद Keymaster/KeyMint के ऑथराइज़ेशन टैग से मेल खाता है. स्पेसिफ़िकेशन, अनुमति देने वाले टैग के बारे में भरोसेमंद जानकारी का सोर्स है. जैसे, उनका मतलब, उनके कॉन्टेंट का फ़ॉर्मैट, KeyDescription ऑब्जेक्ट में softwareEnforced या hardwareEnforced फ़ील्ड में दिखने की उम्मीद है या नहीं, वे अन्य टैग के साथ एक-दूसरे से अलग हैं या नहीं वगैरह. सभी AuthorizationList फ़ील्ड ज़रूरी नहीं हैं.

हर फ़ील्ड में, कॉन्टेक्स्ट के हिसाब से EXPLICIT टैग होता है. यह KeyMint या Keymaster टैग नंबर के बराबर होता है. इससे AuthorizationList में डेटा को ज़्यादा कॉम्पैक्ट तरीके से दिखाया जा सकता है. इसलिए, ASN.1 पार्सर को हर कॉन्टेक्स्ट के हिसाब से टैग के लिए, अनुमानित डेटा टाइप के बारे में पता होना चाहिए. उदाहरण के लिए, Tag::USER_AUTH_TYPE को ENUM | 504 के तौर पर तय किया गया है. अटेस्टेशन एक्सटेंशन स्कीमा में, AuthorizationList में मौजूद purpose फ़ील्ड को userAuthType [504] EXPLICIT INTEGER OPTIONAL के तौर पर तय किया गया है. इसलिए, इसके ASN.1 एन्कोडिंग में, ASN.1 टाइप INTEGER के लिए UNIVERSAL क्लास टैग के बजाय, कॉन्टेक्स्ट के हिसाब से टैग 504 शामिल होगा. यह 10 है.

KeyMint 4 से जनरेट किए गए पुष्टि करने वाले दस्तावेज़ों में ये फ़ील्ड मौजूद होते हैं:
purpose
यह Tag::PURPOSE अनुमति देने वाले टैग से मेल खाता है. यह टैग, टैग आईडी की वैल्यू के तौर पर 1 का इस्तेमाल करता है.
algorithm

यह Tag::ALGORITHM अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 2 होती है.

अटेस्टेशन AuthorizationList ऑब्जेक्ट में, एल्गोरिदम की वैल्यू हमेशा RSA या EC होती है.

keySize
यह Tag::KEY_SIZE अनुमति टैग से मेल खाता है. यह टैग, टैग आईडी की वैल्यू के तौर पर 3 का इस्तेमाल करता है.
blockMode
यह Tag::BLOCK_MODE अनुमति वाले टैग से मेल खाता है. यह टैग, टैग आईडी की वैल्यू के तौर पर 4 का इस्तेमाल करता है.
digest
यह Tag::DIGEST अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 5 का इस्तेमाल किया जाता है.
padding
यह Tag::PADDING अनुमति टैग से मेल खाता है. यह टैग आईडी की वैल्यू 6 का इस्तेमाल करता है.
callerNonce
यह Tag::CALLER_NONCE अनुमति वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 7 का इस्तेमाल किया जाता है.
minMacLength
यह Tag::MIN_MAC_LENGTH अनुमति टैग से मेल खाता है. यह टैग, टैग आईडी की वैल्यू 8 का इस्तेमाल करता है.
ecCurve

यह Tag::EC_CURVE अनुमति टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 10 होती है.

यह पैरामीटर का वह सेट है जिसका इस्तेमाल, Android सिस्टम की कीस्टोर में एलिप्टिक कर्व (ईसी) कुंजी का जोड़ा जनरेट करने के लिए किया जाता है. यह हस्ताक्षर करने और पुष्टि करने के लिए, ईसीडीएसए का इस्तेमाल करता है.

rsaPublicExponent
यह Tag::RSA_PUBLIC_EXPONENT अनुमति टैग से मेल खाता है. यह 200 के टैग आईडी वैल्यू का इस्तेमाल करता है.
mgfDigest

यह सिर्फ़ मुख्य पुष्टि करने वाले वर्शन >= 100 में मौजूद है.

यह Tag::RSA_OAEP_MGF_DIGEST KeyMint अनुमति टैग से मेल खाता है. यह टैग आईडी वैल्यू 203 का इस्तेमाल करता है.
rollbackResistance

यह सिर्फ़ मुख्य पुष्टि वाले वर्शन >= 3 में मौजूद है.

यह Tag::ROLLBACK_RESISTANCE अनुमति देने वाले टैग से मेल खाता है. यह टैग आईडी की वैल्यू 303 का इस्तेमाल करता है.

earlyBootOnly

यह सिर्फ़ मुख्य पुष्टि करने वाले ऐप्लिकेशन के वर्शन 4 या इसके बाद के वर्शन में मौजूद है.

यह Tag::EARLY_BOOT_ONLY अनुमति देने वाले टैग से मेल खाता है. यह टैग, 305 की टैग आईडी वैल्यू का इस्तेमाल करता है.

activeDateTime
यह Tag::ACTIVE_DATETIME अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 400 का इस्तेमाल किया जाता है.
originationExpireDateTime
यह Tag::ORIGINATION_EXPIRE_DATETIME अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 401 का इस्तेमाल किया जाता है.
usageExpireDateTime
यह Tag::USAGE_EXPIRE_DATETIME अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 402 का इस्तेमाल किया जाता है.
usageCountLimit
यह Tag::USAGE_COUNT_LIMIT अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 405 का इस्तेमाल किया जाता है.
userSecureId
यह Tag::USER_SECURE_ID अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 502 का इस्तेमाल किया जाता है.
noAuthRequired

यह Tag::NO_AUTH_REQUIRED अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 503 होती है.

userAuthType
यह Tag::USER_AUTH_TYPE अनुमति देने वाले टैग से मेल खाता है. यह 504 की टैग आईडी वैल्यू का इस्तेमाल करता है.
authTimeout
यह Tag::AUTH_TIMEOUT अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 505 का इस्तेमाल किया जाता है.
allowWhileOnBody

यह Tag::ALLOW_WHILE_ON_BODY अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 506 का इस्तेमाल किया जाता है.

अगर उपयोगकर्ता ने डिवाइस को अब भी पहना हुआ है, तो पुष्टि करने की समयसीमा खत्म होने के बाद भी इस कुंजी का इस्तेमाल किया जा सकता है. ध्यान दें कि बॉडी सेंसर से यह पता चलता है कि डिवाइस को उपयोगकर्ता के शरीर पर पहना गया है या नहीं.

trustedUserPresenceReq

यह सिर्फ़ मुख्य पुष्टि वाले वर्शन >= 3 में मौजूद है.

यह Tag::TRUSTED_USER_PRESENCE_REQUIRED अनुमति टैग से मेल खाता है. यह टैग, 507 की टैग आईडी वैल्यू का इस्तेमाल करता है.

इससे पता चलता है कि इस कुंजी का इस्तेमाल सिर्फ़ तब किया जा सकता है, जब उपयोगकर्ता ने अपनी मौजूदगी का सबूत दिया हो. इसके कई उदाहरणों में ये शामिल हैं:

  • StrongBox कुंजी के लिए, हार्डवेयर बटन को StrongBox डिवाइस पर पिन से हार्डवेयर के तौर पर जोड़ा जाता है.
  • टीईई कुंजी के लिए, फ़िंगरप्रिंट की पुष्टि करने की सुविधा से यह साबित होता है कि उपयोगकर्ता मौजूद है. ऐसा तब तक होता है, जब तक टीईई के पास स्कैनर का पूरा कंट्रोल होता है और वह फ़िंगरप्रिंट मैच करने की प्रोसेस पूरी करता है.
trustedConfirmationReq

यह सिर्फ़ मुख्य पुष्टि वाले वर्शन >= 3 में मौजूद है.

यह Tag::TRUSTED_CONFIRMATION_REQUIRED अनुमति टैग से मेल खाता है. यह 508 की टैग आईडी वैल्यू का इस्तेमाल करता है.

इससे पता चलता है कि इस कुंजी का इस्तेमाल सिर्फ़ तब किया जा सकता है, जब उपयोगकर्ता पुष्टि करने वाले टोकन का इस्तेमाल करके, हस्ताक्षर किए जाने वाले डेटा की पुष्टि करे. उपयोगकर्ता की पुष्टि पाने के तरीके के बारे में ज़्यादा जानने के लिए, Android Protected Confirmation देखें.

ध्यान दें: यह टैग सिर्फ़ उन कुंजियों पर लागू होता है जो SIGN मकसद का इस्तेमाल करती हैं.

unlockedDeviceReq

यह सिर्फ़ मुख्य पुष्टि वाले वर्शन >= 3 में मौजूद है.

यह Tag::UNLOCKED_DEVICE_REQUIRED authorization टैग से मेल खाता है. यह टैग, 509 के टैग आईडी वैल्यू का इस्तेमाल करता है.

creationDateTime
यह Tag::CREATION_DATETIME अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 701 का इस्तेमाल किया जाता है.
origin

यह Tag::ORIGIN अनुमति टैग से मेल खाता है. यह टैग, 702 के टैग आईडी वैल्यू का इस्तेमाल करता है.

rootOfTrust

यह Tag::ROOT_OF_TRUST authorization टैग से मेल खाता है. यह टैग, 704 के टैग आईडी वैल्यू का इस्तेमाल करता है.

ज़्यादा जानकारी के लिए, RootOfTrust डेटा स्ट्रक्चर के बारे में बताने वाला सेक्शन देखें.

osVersion

यह Tag::OS_VERSION अनुमति टैग से मेल खाता है. यह 705 के टैग आईडी वैल्यू का इस्तेमाल करता है.

Keymaster से जुड़ा Android ऑपरेटिंग सिस्टम का वर्शन. इसे छह अंकों की पूर्णांक संख्या के तौर पर दिखाया जाता है. उदाहरण के लिए, वर्शन 8.1.0 को 080100 के तौर पर दिखाया जाता है.

सिर्फ़ Keymaster 1.0 या इसके बाद के वर्शन में, इस वैल्यू को अनुमति वाली सूची में शामिल किया जाता है.

osPatchLevel

यह Tag::PATCHLEVEL अनुमति वाले टैग से मेल खाता है. यह 706 के टैग आईडी वैल्यू का इस्तेमाल करता है.

Keymaster में इस्तेमाल किए जा रहे सुरक्षा पैच से जुड़ा महीना और साल. इसे छह अंकों की पूर्णांक संख्या के तौर पर दिखाया जाता है. उदाहरण के लिए, अगस्त 2018 के पैच को 201808 के तौर पर दिखाया गया है.

सिर्फ़ Keymaster 1.0 या इसके बाद के वर्शन में, इस वैल्यू को अनुमति वाली सूची में शामिल किया जाता है.

attestationApplicationId

यह सिर्फ़ मुख्य पुष्टि करने वाले वर्शन >= 2 में मौजूद है.

यह Tag::ATTESTATION_APPLICATION_ID authorization टैग से मेल खाता है. यह टैग, 709 के टैग आईडी वैल्यू का इस्तेमाल करता है.

ज़्यादा जानकारी के लिए, AttestationApplicationId डेटा स्ट्रक्चर के बारे में बताने वाला सेक्शन देखें.

attestationIdBrand

यह सिर्फ़ मुख्य पुष्टि करने वाले वर्शन >= 2 में मौजूद है.

यह Tag::ATTESTATION_ID_BRAND अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 710 का इस्तेमाल किया जाता है.

attestationIdDevice

यह सिर्फ़ मुख्य पुष्टि करने वाले वर्शन >= 2 में मौजूद है.

यह Tag::ATTESTATION_ID_DEVICE अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 711 होती है.

attestationIdProduct

यह सिर्फ़ मुख्य पुष्टि करने वाले वर्शन >= 2 में मौजूद है.

यह Tag::ATTESTATION_ID_PRODUCT अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 712 का इस्तेमाल किया जाता है.

attestationIdSerial

यह सिर्फ़ मुख्य पुष्टि करने वाले वर्शन >= 2 में मौजूद है.

यह Tag::ATTESTATION_ID_SERIAL अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 713 होती है.

attestationIdImei

यह सिर्फ़ मुख्य पुष्टि करने वाले वर्शन >= 2 में मौजूद है.

यह Tag::ATTESTATION_ID_IMEI अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 714 होती है.

attestationIdMeid

यह सिर्फ़ मुख्य पुष्टि करने वाले वर्शन >= 2 में मौजूद है.

यह Tag::ATTESTATION_ID_MEID अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 715 होती है.

attestationIdManufacturer

यह सिर्फ़ मुख्य पुष्टि करने वाले वर्शन >= 2 में मौजूद है.

यह Tag::ATTESTATION_ID_MANUFACTURER authorization टैग से मेल खाता है. यह टैग, 716 के टैग आईडी वैल्यू का इस्तेमाल करता है.

attestationIdModel

यह सिर्फ़ मुख्य पुष्टि करने वाले वर्शन >= 2 में मौजूद है.

यह Tag::ATTESTATION_ID_MODEL authorization tag से मेल खाता है. इसमें टैग आईडी की वैल्यू 717 का इस्तेमाल किया जाता है.

vendorPatchLevel

यह सिर्फ़ पुष्टि करने वाले मुख्य दस्तावेज़ के वर्शन 3 या इससे ज़्यादा में मौजूद है.

यह Tag::VENDOR_PATCHLEVEL authorization टैग से मेल खाता है. यह टैग आईडी की वैल्यू 718 का इस्तेमाल करता है.

इस कुकी से, वेंडर इमेज के सुरक्षा पैच लेवल के बारे में पता चलता है. इस कुंजी का इस्तेमाल करने के लिए, डिवाइस पर यह पैच इंस्टॉल होना चाहिए. यह वैल्यू YYYYMMDD फ़ॉर्मैट में दिखती है. इससे वेंडर के सुरक्षा पैच की तारीख का पता चलता है. उदाहरण के लिए, अगर किसी Android डिवाइस पर वेंडर का 1 अगस्त, 2018 का सुरक्षा पैच इंस्टॉल किया गया है और उस पर कोई कुंजी जनरेट की गई है, तो इस वैल्यू की वैल्यू 20180801 होगी.

bootPatchLevel

यह सिर्फ़ पुष्टि करने वाले मुख्य दस्तावेज़ के वर्शन 3 या इससे ज़्यादा में मौजूद है.

यह Tag::BOOT_PATCHLEVEL अनुमति देने वाले टैग से मेल खाता है. यह टैग आईडी वैल्यू 719 का इस्तेमाल करता है.

इस नीति से, कर्नेल इमेज के सुरक्षा पैच लेवल का पता चलता है. इस कुंजी का इस्तेमाल करने के लिए, डिवाइस पर यह लेवल इंस्टॉल होना चाहिए. वैल्यू YYYYMMDD फ़ॉर्मैट में दिखती है. यह सिस्टम के सुरक्षा पैच की तारीख को दिखाती है. उदाहरण के लिए, अगर किसी Android डिवाइस पर 5 अगस्त, 2018 का सिस्टम सिक्योरिटी पैच इंस्टॉल किया गया है और उस पर कोई कुंजी जनरेट की गई है, तो इस एट्रिब्यूट की वैल्यू 20180805 होगी.

deviceUniqueAttestation

यह सिर्फ़ पुष्टि करने वाले मुख्य वर्शन >= 4 में मौजूद है.

यह Tag::DEVICE_UNIQUE_ATTESTATION अनुमति टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 720 का इस्तेमाल किया जाता है.

attestationIdSecondImei

यह सिर्फ़ पुष्टि करने वाले मुख्य वर्शन >= 300 में मौजूद है.

यह Tag::ATTESTATION_ID_SECOND_IMEI अनुमति वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 723 का इस्तेमाल किया जाता है.

moduleHash

सिर्फ़ मुख्य पुष्टि करने वाले वर्शन >= 400 में मौजूद है.

यह Tag::MODULE_HASH अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 724 होती है.

RootOfTrust फ़ील्ड

verifiedBootKey
यह सार्वजनिक कुंजी का सुरक्षित हैश होता है. इसका इस्तेमाल, डिवाइस बूट अप के दौरान पुष्टि किए गए बूट के हिस्से के तौर पर एक्ज़ीक्यूट होने वाले सभी कोड की इंटिग्रिटी और पुष्टि करने के लिए किया जाता है. SHA-256 का सुझाव दिया जाता है.
deviceLocked
डिवाइस का बूटलोडर लॉक है या नहीं. true का मतलब है कि डिवाइस ने एक ऐसी इमेज बूट की है जिस पर हस्ताक्षर किया गया है. साथ ही, वेरीफ़ाइड बूट ने इसकी पुष्टि कर दी है.
verifiedBootState
डिवाइस के वेरीफ़ाइड बूट की स्थिति.
verifiedBootHash
वेरिफ़ाइड बूट की सुविधा से सुरक्षित किए गए सभी डेटा का डाइजेस्ट. Android वेरिफ़ाइड बूट के रेफ़रंस को लागू करने वाले डिवाइसों के लिए, इस फ़ील्ड में VBMeta डाइजेस्ट होता है.

VerifiedBootState वैल्यू

वैल्यू बूट की स्थिति मतलब
Verified GREEN भरोसे की पूरी चेन, हार्डवेयर से सुरक्षित रूट ऑफ़ ट्रस्ट से लेकर बूटलोडर और वेरिफ़ाइड बूट से पुष्टि किए गए सभी पार्टीशन तक फैली होती है. इस स्थिति में, verifiedBootKey फ़ील्ड में एम्बेड किए गए रूट ऑफ़ ट्रस्ट का हैश होता है. यह सर्टिफ़िकेट, डिवाइस बनाने वाली कंपनी ने फ़ैक्ट्री में डिवाइस की ROM में एम्बेड किया होता है.
SelfSigned YELLOW यह Verified जैसा ही है. हालांकि, इसमें पुष्टि, फ़ैक्ट्री में मैन्युफ़ैक्चरर की ओर से एम्बेड किए गए रूट ऑफ़ ट्रस्ट के बजाय, उपयोगकर्ता की ओर से कॉन्फ़िगर किए गए रूट ऑफ़ ट्रस्ट का इस्तेमाल करके की गई थी. इस स्थिति में, verifiedBootKey फ़ील्ड में उस सार्वजनिक पासकोड का हैश होता है जिसे उपयोगकर्ता ने कॉन्फ़िगर किया है.
Unverified ORANGE डिवाइस का बूटलोडर अनलॉक है. इसलिए, भरोसे की चेन नहीं बनाई जा सकती. डिवाइस में बिना किसी पाबंदी के बदलाव किया जा सकता है. इसलिए, उपयोगकर्ता को डिवाइस की इंटिग्रिटी की पुष्टि करनी चाहिए. इस स्थिति में, verifiedBootKey फ़ील्ड में 32 बाइट के शून्य होते हैं.
Failed RED डिवाइस की पुष्टि नहीं हो सकी. इस स्थिति में, अन्य RootOfTrust फ़ील्ड के कॉन्टेंट के बारे में कोई गारंटी नहीं दी जाती.

AttestationApplicationId

इस फ़ील्ड से पता चलता है कि Android प्लैटफ़ॉर्म के हिसाब से, पुष्टि करने की प्रोसेस के दौरान किन ऐप्लिकेशन को सीक्रेट की मटीरियल इस्तेमाल करने की अनुमति है. इसमें एक से ज़्यादा पैकेज शामिल हो सकते हैं. हालांकि, ऐसा सिर्फ़ तब किया जा सकता है, जब एक से ज़्यादा पैकेज एक ही यूआईडी शेयर करते हों. AuthorizationList में मौजूद AttestationApplicationIdफ़ील्ड, OCTET_STRING टाइप का होता है. इसे ASN.1 के इस स्कीमा के मुताबिक फ़ॉर्मैट किया जाता है:

AttestationApplicationId ::= SEQUENCE {
    package_infos  SET OF AttestationPackageInfo,
    signature_digests  SET OF OCTET_STRING,
}

AttestationPackageInfo ::= SEQUENCE {
    package_name  OCTET_STRING,
    version  INTEGER,
}
package_infos
AttestationPackageInfo ऑब्जेक्ट का एक सेट. हर ऑब्जेक्ट में पैकेज का नाम और वर्शन नंबर होता है.
signature_digests

ऐप्लिकेशन के साइनिंग सर्टिफ़िकेट के SHA-256 डाइजेस्ट का सेट. किसी ऐप्लिकेशन के लिए, साइनिंग की के सर्टिफ़िकेट की एक से ज़्यादा चेन हो सकती हैं. इनमें से हर एक के लिए, "लीफ़" सर्टिफ़िकेट को डाइजेस्ट किया जाता है और signature_digests फ़ील्ड में रखा जाता है. फ़ील्ड का नाम गुमराह करने वाला है, क्योंकि डाइजेस्ट किए गए डेटा में ऐप्लिकेशन के साइनिंग सर्टिफ़िकेट होते हैं, न कि ऐप्लिकेशन के हस्ताक्षर. ऐसा इसलिए है, क्योंकि इसका नाम getPackageInfo() को कॉल करने पर मिलने वाली Signature क्लास के लिए रखा गया है. यहां दिया गया कोड स्निपेट, सेट का एक उदाहरण दिखाता है:

{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}
    

प्रॉविज़निंग की जानकारी देने वाला एक्सटेंशन

प्रॉविज़निंग की जानकारी देने वाले एक्सटेंशन में ओआईडी 1.3.6.1.4.1.11129.2.1.30 है. यह एक्सटेंशन, डिवाइस के बारे में वह जानकारी देता है जो डिवाइस को सेट अप करने वाले सर्वर को पता होती है.

स्कीमा

एक्सटेंशन वैल्यू में कॉन्साइज़ बाइनरी ऑब्जेक्ट रिप्रेजेंटेशन (सीबीओआर) डेटा होता है. यह डेटा, कॉन्साइज़ डेटा डेफ़िनिशन लैंग्वेज (सीडीडीएल) स्कीमा के मुताबिक होता है:

  {
        1 : int,       ; certificates issued
        4 : string,    ; validated attested entity (STRONG_BOX/TEE)
  }

मैप का कोई वर्शन नहीं है और इसमें नए वैकल्पिक फ़ील्ड जोड़े जा सकते हैं.

certs_issued

पिछले 30 दिनों में डिवाइस को जारी किए गए सर्टिफ़िकेट की अनुमानित संख्या. अगर यह वैल्यू, औसत वैल्यू से कई गुना ज़्यादा है, तो इसका इस्तेमाल संभावित गलत इस्तेमाल के सिग्नल के तौर पर किया जा सकता है.

validated_attested_entity

पुष्टि की गई अटेस्टेड इकाई एक स्ट्रिंग होती है. इससे उस डिवाइस के टाइप के बारे में पता चलता है जिसकी पुष्टि, प्रोविज़निंग सर्वर ने अटेस्टेड के तौर पर की है. उदाहरण के लिए, STRONG_BOX या TEE.

प्रमाणित करने के लिए इस्तेमाल की जाने वाली कुंजियां

डिवाइस में दो कुंजियां, एक आरएसए और एक ईसीडीएसए, और उनसे जुड़ी सर्टिफ़िकेट चेन सुरक्षित तरीके से उपलब्ध कराई जाती हैं.

Android 12 में रिमोट की प्रोविज़निंग की सुविधा जोड़ी गई है. Android 13 के लिए, डिवाइसों में इस सुविधा को लागू करना ज़रूरी है. रिमोट कुंजी उपलब्ध कराने की सुविधा, फ़ील्ड में मौजूद डिवाइसों को हर ऐप्लिकेशन के लिए, ECDSA P256 पुष्टि करने वाले सर्टिफ़िकेट उपलब्ध कराती है. ये सर्टिफ़िकेट, फ़ैक्ट्री में पहले से इंस्टॉल किए गए सर्टिफ़िकेट की तुलना में कम समय के लिए मान्य होते हैं.

यूनीक आईडी

यूनीक आईडी, 128-बिट वैल्यू होती है. इससे डिवाइस की पहचान होती है. हालांकि, यह सिर्फ़ कुछ समय के लिए मान्य होता है. वैल्यू का हिसाब इस तरह लगाया जाता है:

HMAC_SHA256(T || C || R, HBK)

यहां:

  • T "टेंपोरल काउंटर वैल्यू" है. इसे Tag::CREATION_DATETIME की वैल्यू को 2592000000 से भाग देकर निकाला जाता है और शेष को छोड़ दिया जाता है. T हर 30 दिनों में बदलता है (2592000000 = 30 * 24 * 60 * 60 * 1000).
  • C, Tag::APPLICATION_ID की वैल्यू है
  • अगर attest_key कॉल के attest_params पैरामीटर में Tag::RESET_SINCE_ID_ROTATION मौजूद है, तो R की वैल्यू 1 होती है. अगर टैग मौजूद नहीं है, तो इसकी वैल्यू 0 होती है.
  • HBK एक यूनीक सीक्रेट कुंजी है, जो हार्डवेयर से जुड़ा होता है. इसकी जानकारी ट्रस्टेड एक्ज़ीक्यूशन एनवायरमेंट को होती है, लेकिन यह कभी भी इसे ज़ाहिर नहीं करता. सीक्रेट कुंजी में कम से कम 128 बिट का एन्ट्रोपी होता है और यह हर डिवाइस के लिए यूनीक होता है. हालांकि, 128 बिट के एन्ट्रोपी के हिसाब से, यूनीक होने की संभावना को स्वीकार किया जा सकता है. एचबीके को एचएमएसी या AES_CMAC के ज़रिए, फ़्यूज़ किए गए की मटीरियल से बनाया जाना चाहिए.

HMAC_SHA256 आउटपुट को 128 बिट पर छोटा करें.

एक से ज़्यादा आईएमईआई

Android 14 में, Android पर कुंजी को प्रमाणित करने के रिकॉर्ड में एक से ज़्यादा आईएमईआई के लिए सहायता जोड़ी गई है. ओईएम, इस सुविधा को लागू कर सकते हैं. इसके लिए, उन्हें दूसरे आईएमईआई के लिए KeyMint टैग जोड़ना होगा. अब डिवाइसों में एक से ज़्यादा सेल्यूलर रेडियो होना आम बात हो गई है. साथ ही, ओईएम अब दो आईएमईआई वाले डिवाइसों के लिए सहायता उपलब्ध करा सकते हैं.

अगर ओईएम के डिवाइसों पर दूसरा आईएमईआई मौजूद है, तो उसे KeyMint के साथ काम करने वाले डिवाइसों पर उपलब्ध कराना ज़रूरी है. इससे KeyMint के साथ काम करने वाले डिवाइस, दूसरे आईएमईआई की पुष्टि उसी तरह कर पाएंगे जिस तरह वे पहले आईएमईआई की पुष्टि करते हैं.

आईडी की पुष्टि करना

Android 8.0 में, Keymaster 3 वाले डिवाइसों के लिए आईडी की पुष्टि करने की सुविधा शामिल है. हालांकि, यह सुविधा वैकल्पिक है. आईडी अटेस्टेशन की सुविधा की मदद से, डिवाइस अपने हार्डवेयर आइडेंटिफ़ायर का सबूत दे सकता है. जैसे, सीरियल नंबर या आईएमईआई. यह सुविधा ज़रूरी नहीं है. हालांकि, हमारा सुझाव है कि Keymaster 3 को लागू करने वाले सभी डिवाइसों पर यह सुविधा काम करे. ऐसा इसलिए, क्योंकि डिवाइस की पहचान की पुष्टि करने की सुविधा से, कई तरह के इस्तेमाल के उदाहरणों को ज़्यादा सुरक्षित बनाया जा सकता है. जैसे, बिना किसी रुकावट के रिमोट कॉन्फ़िगरेशन की सुविधा. ऐसा इसलिए, क्योंकि रिमोट साइड सिस्टम यह पक्का कर सकता है कि वह सही डिवाइस से कम्यूनिकेट कर रहा है, न कि किसी ऐसे डिवाइस से जो अपनी पहचान छिपा रहा है.

आईडी की पुष्टि करने की सुविधा, डिवाइस के हार्डवेयर आइडेंटिफ़ायर की कॉपी बनाती है. इन्हें सिर्फ़ टीईई ऐक्सेस कर सकता है. ऐसा डिवाइस के फ़ैक्ट्री से निकलने से पहले किया जाता है. कोई व्यक्ति डिवाइस के बूटलोडर को अनलॉक कर सकता है. साथ ही, सिस्टम सॉफ़्टवेयर और Android फ़्रेमवर्क से रिपोर्ट किए गए आइडेंटिफ़ायर बदल सकता है. टीईई में मौजूद आइडेंटिफ़ायर की कॉपी में इस तरह से बदलाव नहीं किया जा सकता. इससे यह पक्का होता है कि डिवाइस आईडी की पुष्टि करने की सुविधा, सिर्फ़ डिवाइस के ओरिजनल हार्डवेयर आइडेंटिफ़ायर की पुष्टि करती है. इससे स्पूफ़िंग की कोशिशों को रोका जा सकता है.

आईडी की पुष्टि करने के लिए मुख्य एपीआई, मौजूदा कुंजी की पुष्टि करने के तरीके पर आधारित है. इसे Keymaster 2 के साथ पेश किया गया था. Keymaster के पास मौजूद किसी कुंजी के लिए पुष्टि करने वाले सर्टिफ़िकेट का अनुरोध करते समय, कॉलर यह अनुरोध कर सकता है कि डिवाइस के हार्डवेयर आइडेंटिफ़ायर को पुष्टि करने वाले सर्टिफ़िकेट के मेटाडेटा में शामिल किया जाए. अगर कुंजी को टीईई में रखा जाता है, तो सर्टिफ़िकेट, भरोसेमंद रूट पर वापस चेन हो जाता है. इस तरह के सर्टिफ़िकेट को पाने वाला व्यक्ति, यह पुष्टि कर सकता है कि सर्टिफ़िकेट और उसका कॉन्टेंट, टीईई ने लिखा है. इसमें हार्डवेयर आइडेंटिफ़ायर भी शामिल हैं. जब अटेस्टेशन सर्टिफ़िकेट में हार्डवेयर आइडेंटिफ़ायर शामिल करने के लिए कहा जाता है, तो टीईई सिर्फ़ उन आइडेंटिफ़ायर की पुष्टि करता है जो उसके स्टोरेज में मौजूद हैं. ये आइडेंटिफ़ायर, फ़ैक्ट्री में तैयार किए जाते हैं.

स्टोरेज की प्रॉपर्टी

डिवाइस के आइडेंटिफ़ायर सेव करने वाले स्टोरेज में ये प्रॉपर्टी होनी चाहिए:

  • डिवाइस के ओरिजनल आइडेंटिफ़ायर से मिली वैल्यू को फ़ैक्ट्री से डिवाइस के निकलने से पहले, स्टोरेज में कॉपी कर दिया जाता है.
  • destroyAttestationIds() तरीके से, आइडेंटिफ़ायर से मिले डेटा की इस कॉपी को हमेशा के लिए मिटाया जा सकता है. हमेशा के लिए मिटाने का मतलब है कि डेटा पूरी तरह से हटा दिया जाता है, ताकि फ़ैक्ट्री रीसेट करने या डिवाइस पर की गई किसी अन्य प्रक्रिया से उसे वापस न लाया जा सके. यह खास तौर पर उन डिवाइसों के लिए ज़रूरी है जहां उपयोगकर्ता ने बूटलोडर को अनलॉक किया है, सिस्टम सॉफ़्टवेयर में बदलाव किया है, और Android फ़्रेमवर्क से मिले आइडेंटिफ़ायर में बदलाव किया है.
  • आरएमए की सुविधा देने वाली कंपनियों के पास, हार्डवेयर आइडेंटिफ़ायर से मिले डेटा की नई कॉपी जनरेट करने की सुविधा होनी चाहिए. इस तरह, आरएमए की प्रोसेस पूरी करने वाला डिवाइस, आईडी की पुष्टि फिर से कर सकता है. आरएमए की सुविधा देने वाली कंपनियों को पक्का करना चाहिए कि डिवाइस की मरम्मत की प्रक्रिया सुरक्षित रहे. ऐसा इसलिए, ताकि उपयोगकर्ता खुद से इसका इस्तेमाल न कर पाएं. अगर वे ऐसा करते हैं, तो उन्हें नकली आईडी का सर्टिफ़िकेट मिल सकता है.
  • टीईई में, Keymaster के भरोसेमंद ऐप्लिकेशन के अलावा कोई और कोड, स्टोरेज में मौजूद आइडेंटिफ़ायर से मिले डेटा को नहीं पढ़ सकता.
  • स्टोरेज में छेड़छाड़ का पता चल जाता है: अगर स्टोरेज के कॉन्टेंट में बदलाव किया गया है, तो टीईई इसे इस तरह से देखता है जैसे कॉन्टेंट की कॉपी मिटा दी गई हों. साथ ही, आईडी की पुष्टि करने के सभी अनुरोधों को अस्वीकार कर देता है. इसे लागू करने के लिए, स्टोरेज पर हस्ताक्षर या एमएसी किया जाता है. इसके बारे में यहां बताया गया है.
  • स्टोरेज में ओरिजनल आइडेंटिफ़ायर सेव नहीं किए जाते. पहचान की पुष्टि करने की प्रक्रिया में चुनौती होती है. इसलिए, कॉलर हमेशा उन आइडेंटिफ़ायर को उपलब्ध कराता है जिनकी पुष्टि करनी होती है. टीईई को सिर्फ़ यह पुष्टि करनी होती है कि ये वही वैल्यू हैं जो उसके पास पहल से मौजूद हैं. इसकी पुष्टि करने के लिए, ओरिजनल वैल्यू के बजाय उनके सुरक्षित हैश सेव किए जाते हैं.

निर्माण

ऊपर दी गई प्रॉपर्टी वाला कोई इंप्लीमेंटेशन बनाने के लिए, आईडी से मिली वैल्यू को इस कंस्ट्रक्शन S में सेव करें. आईडी वैल्यू की अन्य कॉपी सेव न करें. हालांकि, सिस्टम में मौजूद सामान्य जगहों पर ऐसा किया जा सकता है. डिवाइस का मालिक, रूटिंग करके इन जगहों में बदलाव कर सकता है:

S = D || HMAC(HBK, D)

कहां:

  • D = HMAC(HBK, ID1) || HMAC(HBK, ID2) || ... || HMAC(HBK, IDn)
  • HMAC, एचएमएसी कंस्ट्रक्शन है. इसमें सुरक्षित हैश (SHA-256 का इस्तेमाल करने का सुझाव दिया गया है) का इस्तेमाल किया गया है
  • HBK एक हार्डवेयर-बाउंड कुंजी है, जिसका इस्तेमाल किसी और मकसद के लिए नहीं किया जाता
  • ID1...IDn ओरिजनल आईडी वैल्यू हैं; किसी वैल्यू को किसी इंडेक्स से जोड़ने का तरीका, लागू करने के तरीके पर निर्भर करता है. ऐसा इसलिए, क्योंकि अलग-अलग डिवाइसों में आइडेंटिफ़ायर की संख्या अलग-अलग होती है
  • || से दो या उससे ज़्यादा स्ट्रिंग को एक साथ जोड़ने का पता चलता है

एचएमएसी आउटपुट का साइज़ तय होता है. इसलिए, अलग-अलग आईडी हैश या D का एचएमएसी ढूंढने के लिए, किसी हेडर या अन्य स्ट्रक्चर की ज़रूरत नहीं होती. प्रमाणित करने के लिए, दी गई वैल्यू की जांच करने के अलावा, लागू करने वाले लोगों को S की पुष्टि करनी होगी. इसके लिए, उन्हें S से D को निकालना होगा, HMAC(HBK, D) की गिनती करनी होगी, और इसकी तुलना S में मौजूद वैल्यू से करनी होगी. इससे यह पुष्टि की जा सकेगी कि किसी भी व्यक्ति के आईडी में बदलाव नहीं किया गया है/उसे खराब नहीं किया गया है. साथ ही, लागू करने के लिए, सभी आईडी एलिमेंट और S की पुष्टि के लिए, कॉन्स्टेंट-टाइम कंपैरिज़न का इस्तेमाल करना होगा. तुलना करने में लगने वाला समय एक जैसा होना चाहिए. भले ही, कितने भी आईडी दिए गए हों और टेस्ट का कोई भी हिस्सा सही तरीके से मैच हुआ हो.

हार्डवेयर आइडेंटिफ़ायर

आईडी की पुष्टि करने की सुविधा, इन हार्डवेयर आइडेंटिफ़ायर के साथ काम करती है:

  1. Android में Build.BRAND से मिला ब्रैंड का नाम
  2. Android में Build.DEVICE से मिला डिवाइस का नाम
  3. Android में Build.PRODUCT से मिला प्रॉडक्ट का नाम
  4. Android में Build.MANUFACTURER से मिला मैन्युफ़ैक्चरर का नाम
  5. Android में Build.MODEL से मिला मॉडल का नाम
  6. सीरियल नंबर
  7. सभी रेडियो के आईएमईआई
  8. सभी रेडियो के एमईआईडी

डिवाइस आईडी की पुष्टि करने की सुविधा के लिए, डिवाइस इन आइडेंटिफ़ायर की पुष्टि करता है. Android पर काम करने वाले सभी डिवाइसों में पहले छह सेंसर होते हैं. इस सुविधा के काम करने के लिए, ये सेंसर ज़रूरी हैं. अगर डिवाइस में कोई इंटिग्रेटेड सेल्युलर रेडियो है, तो डिवाइस में रेडियो के आईएमईआई और/या एमईआईडी की पुष्टि करने की सुविधा भी होनी चाहिए.

आईडी की पुष्टि करने का अनुरोध, कुंजी की पुष्टि करके किया जाता है. साथ ही, अनुरोध में डिवाइस आइडेंटिफ़ायर शामिल किए जाते हैं, ताकि उनकी पुष्टि की जा सके. आइडेंटिफ़ायर को इस तरह टैग किया जाता है:

  • ATTESTATION_ID_BRAND
  • ATTESTATION_ID_DEVICE
  • ATTESTATION_ID_PRODUCT
  • ATTESTATION_ID_MANUFACTURER
  • ATTESTATION_ID_MODEL
  • ATTESTATION_ID_SERIAL
  • ATTESTATION_ID_IMEI
  • ATTESTATION_ID_MEID

जिस आइडेंटिफ़ायर की पुष्टि करनी है वह UTF-8 कोड में बदली गई बाइट स्ट्रिंग है. यह फ़ॉर्मैट, संख्या वाले आइडेंटिफ़ायर पर भी लागू होता है. पुष्टि किए जाने वाले हर आइडेंटिफ़ायर को UTF-8 में कोड की गई स्ट्रिंग के तौर पर दिखाया जाता है.

अगर डिवाइस पर आईडी की पुष्टि करने की सुविधा काम नहीं करती है (या destroyAttestationIds()इसे पहले कॉल किया गया था और डिवाइस अब अपने आईडी की पुष्टि नहीं कर सकता), तो इन टैग में से एक या उससे ज़्यादा टैग शामिल करने वाले कुंजी की पुष्टि करने के किसी भी अनुरोध के लिए, ErrorCode::CANNOT_ATTEST_IDS गड़बड़ी का मैसेज दिखेगा.

अगर डिवाइस पर आईडी की पुष्टि करने की सुविधा काम करती है और ऊपर दिए गए एक या इससे ज़्यादा टैग को कुंजी की पुष्टि करने के अनुरोध में शामिल किया गया है, तो टीईई यह पुष्टि करता है कि हर टैग के साथ दिया गया आइडेंटिफ़ायर, हार्डवेयर आइडेंटिफ़ायर की कॉपी से मेल खाता है. अगर एक या इससे ज़्यादा आइडेंटिफ़ायर मेल नहीं खाते हैं, तो पूरी पुष्टि नहीं हो पाएगी और आपको ErrorCode::CANNOT_ATTEST_IDS दिखेगा. एक ही टैग को कई बार सबमिट किया जा सकता है. यह जानकारी तब काम आ सकती है, जब किसी डिवाइस के आईएमईआई की पुष्टि करनी हो. उदाहरण के लिए: किसी डिवाइस में एक से ज़्यादा रेडियो और एक से ज़्यादा आईएमईआई हो सकते हैं. पुष्टि का अनुरोध तब मान्य होता है, जब हर ATTESTATION_ID_IMEI के साथ दी गई वैल्यू, डिवाइस के किसी एक रेडियो से मेल खाती हो. यह अन्य सभी टैग पर भी लागू होता है.

अगर पुष्टि हो जाती है, तो पुष्टि किए गए आईडी को जारी किए गए पुष्टि करने वाले सर्टिफ़िकेट के पुष्टि करने वाले एक्सटेंशन (OID 1.3.6.1.4.1.11129.2.1.17) में जोड़ दिया जाता है. इसके लिए, ऊपर दिए गए स्कीमा का इस्तेमाल किया जाता है. Keymaster 2 के अटेस्टेशन स्कीमा में हुए बदलावों को टिप्पणियों के साथ बोल्ड किया गया है.

Java API

यह सेक्शन सिर्फ़ जानकारी देने के लिए है. Keymaster को लागू करने वाले लोग, Java API को न तो लागू करते हैं और न ही इसका इस्तेमाल करते हैं. यह जानकारी इसलिए दी जाती है, ताकि इस सुविधा को लागू करने वाले लोग यह समझ सकें कि ऐप्लिकेशन इसका इस्तेमाल कैसे करते हैं. सिस्टम के कॉम्पोनेंट इसका इस्तेमाल अलग-अलग तरीके से कर सकते हैं. इसलिए, यह ज़रूरी है कि इस सेक्शन को मानक के तौर पर न माना जाए.