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

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 वैल्यू TBD
extensions/"attestation" OID 1.3.6.1.4.1.11129.2.1.17 है. कॉन्टेंट के बारे में यहां पुष्टि करने वाले एक्सटेंशन सेक्शन में बताया गया है. सभी 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           INTEGER, # Value 400
    attestationSecurityLevel     SecurityLevel,
    keyMintVersion               INTEGER, # Value 400
    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,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL,
    minMacLength                 [8] EXPLICIT 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,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [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,
}

Modules ::= SET OF Module
Module ::= SEQUENCE {
    packageName                OCTET_STRING,
    version                    INTEGER,
}

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           INTEGER, # Value 300
    attestationSecurityLevel     SecurityLevel,
    keyMintVersion               INTEGER, # Value 300
    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,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL,
    minMacLength                 [8] EXPLICIT 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,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [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           INTEGER, # Value 200
    attestationSecurityLevel     SecurityLevel,
    keyMintVersion               INTEGER, # Value 200
    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,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [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           INTEGER, # Value 100
    attestationSecurityLevel     SecurityLevel,
    keyMintVersion               INTEGER, # Value 100
    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,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [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           INTEGER, # Value 4
    attestationSecurityLevel     SecurityLevel,
    keymasterVersion             INTEGER, # Value 41
    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,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL,
    minMacLength                 [8] EXPLICIT 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,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [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),
}

Version 3

KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 3
    attestationSecurityLevel     SecurityLevel,
    keymasterVersion             INTEGER, # Value 4
    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,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL,
    minMacLength                 [8] EXPLICIT 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,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [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,
}

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

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

Version 2

KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 2
    attestationSecurityLevel     SecurityLevel,
    keymasterVersion             INTEGER, # Value 3
    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           INTEGER, # Value 1
    attestationSecurityLevel     SecurityLevel,
    keymasterVersion             INTEGER, # Value 2
    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 Compatibility Definition Document के सेक्शन 9.11 [C-1-1] से [C-1-4] में बताया गया है. टीईई, रिमोट से होने वाले हमलों से काफ़ी हद तक सुरक्षित होते हैं. साथ ही, हार्डवेयर पर सीधे तौर पर किए जाने वाले हमलों से भी काफ़ी हद तक सुरक्षित होते हैं.
StrongBox जब तक StrongBox सुरक्षित है, तब तक यह भी सुरक्षित है. StrongBox को हार्डवेयर सुरक्षा मॉड्यूल की तरह ही सुरक्षा चिप में लागू किया जाता है. StrongBox को लागू करने से जुड़ी ज़रूरी शर्तों के बारे में, Android Compatibility Definition Document के section 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 अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 509 का इस्तेमाल किया जाता है.

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

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

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 अनुमति देने वाले टैग से मेल खाता है. यह टैग आईडी की वैल्यू 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 अनुमति देने वाले टैग से मेल खाता है. यह टैग आईडी की वैल्यू 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 अनुमति देने वाले टैग से मेल खाता है. इसमें टैग आईडी की वैल्यू 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 15 के लिए, सभी डिवाइसों पर इस सुविधा को लागू करना ज़रूरी है. रिमोट की प्रोविज़निंग की सुविधा, फ़ील्ड में मौजूद डिवाइसों को हर ऐप्लिकेशन के लिए, 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 को न तो लागू करते हैं और न ही इसका इस्तेमाल करते हैं. यह जानकारी इसलिए दी जाती है, ताकि इस सुविधा को लागू करने वाले लोग यह समझ सकें कि ऐप्लिकेशन इसका इस्तेमाल कैसे करते हैं. सिस्टम के कॉम्पोनेंट इसका इस्तेमाल अलग-अलग तरीके से कर सकते हैं. इसलिए, यह ज़रूरी है कि इस सेक्शन को मानक के तौर पर न माना जाए.