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

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

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

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

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

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

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

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

टैग

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

स्ट्रीम किस तरह की है

KeyMaster 2 और उससे पहले के वर्शन

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

AttestKey तरीका

Keymaster 3

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

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

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

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

अटेस्टेशन सर्टिफ़िकेट

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

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

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

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

TBSसर्टिफ़िकेट की जांच

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

पुष्टि करने की समयसीमा बढ़ाना

attestation एक्सटेंशन में OID 1.3.6.1.4.1.11129.2.1.17 है. इसमें, पुष्टि किए जा रहे पासकोड के जोड़े और पासकोड जनरेट करने के समय डिवाइस की स्थिति के बारे में जानकारी होती है.

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

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

स् कीमा

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

वर्शन 300

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

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

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

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

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

वर्शन 200

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

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

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

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

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

वर्शन 100

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

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

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

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

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

वर्शन 4

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

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

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

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

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

वर्ज़न 3

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

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

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

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

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

वर्शन 2

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

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

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

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

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

वर्शन 1

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

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

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

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

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

KeyDescription फ़ील्ड

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

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

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

SecurityLevel की वैल्यू

SecurityLevel वैल्यू से पता चलता है कि पासकोड से जुड़ा एलिमेंट (उदाहरण के लिए, पासकोड और पुष्टि) कितने हद तक अटैक के लिए सुरक्षित है.

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

AuthorizationList फ़ील्ड

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

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

purpose
Tag::PURPOSE अनुमति देने वाले टैग के मुताबिक है, जिसमें एक टैग आईडी वैल्यू का इस्तेमाल किया जाता है.
algorithm

Tag::ALGORITHM ऑथराइज़ेशन टैग से मेल खाता है. इस टैग में, टैग आईडी की वैल्यू दो होती है.

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

keySize
यह अनुमति देने वाले Tag::KEY_SIZE टैग से जुड़ा है. यह टैग, 3 वाली टैग आईडी वैल्यू का इस्तेमाल करता है.
digest
यह Tag::DIGEST अनुमति टैग से जुड़ा है. यह टैग, 5 की टैग आईडी वैल्यू का इस्तेमाल करता है.
padding
यह अनुमति देने वाले Tag::PADDING टैग से जुड़ा है. यह टैग, 6 की टैग आईडी वैल्यू का इस्तेमाल करता है.
ecCurve

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

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

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

यह एट्रिब्यूट सिर्फ़ ऐसे एटेस्टेशन वर्शन में मौजूद होता है जो 100 या उससे ज़्यादा हो.

Tag::RSA_OAEP_MGF_DIGEST KeyMint ऑथराइज़ेशन टैग के मुताबिक है, जो 203 की टैग आईडी वैल्यू का इस्तेमाल करता है.
rollbackResistance

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

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

earlyBootOnly

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

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

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

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

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

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

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

trustedUserPresenceRequired

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

Tag::TRUSTED_USER_PRESENCE_REQUIRED ऑथराइज़ेशन टैग से मेल खाता है, जिसमें 507 की टैग आईडी वैल्यू का इस्तेमाल किया जाता है.

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

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

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

यह Tag::TRUSTED_CONFIRMATION_REQUIRED authorization टैग से जुड़ा है, जो टैग आईडी की वैल्यू 508 का इस्तेमाल करता है.

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

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

unlockedDeviceRequired

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

यह Tag::UNLOCKED_DEVICE_REQUIRED अनुमति टैग से जुड़ा है, जो टैग आईडी की वैल्यू 509 का इस्तेमाल करता है.

allApplications

Tag::ALL_APPLICATIONS ऑथराइज़ेशन टैग से मेल खाता है. इस टैग में, 600 की टैग आईडी वैल्यू का इस्तेमाल किया जाता है.

इससे पता चलता है कि किसी डिवाइस पर मौजूद सभी ऐप्लिकेशन, पासकोड जोड़े को ऐक्सेस कर सकते हैं या नहीं.

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

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

rollbackResistant

यह सिर्फ़ एटेस्टेशन पासकोड के वर्शन 1 और 2 में मौजूद है.

यह Tag::ROLLBACK_RESISTANT अनुमति टैग से जुड़ा है, जो 703 की टैग आईडी वैल्यू का इस्तेमाल करता है.

rootOfTrust

Tag::ROOT_OF_TRUST ऑथराइज़ेशन टैग के मुताबिक है, जिसमें 704 की टैग आईडी वैल्यू का इस्तेमाल किया जाता है.

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

osVersion

Tag::OS_VERSION ऑथराइज़ेशन टैग से मेल खाता है, जिसमें 705 टैग आईडी वैल्यू का इस्तेमाल किया जाता है.

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

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

osPatchLevel

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

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

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

attestationApplicationId

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

यह Tag::ATTESTATION_APPLICATION_ID Keymaster अनुमति टैग से जुड़ा है. इस टैग में, टैग आईडी की वैल्यू 709 का इस्तेमाल किया जाता है.

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

attestationIdBrand

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

यह Tag::ATTESTATION_ID_BRAND Keymaster टैग से जुड़ा है, जो 710 की टैग आईडी वैल्यू का इस्तेमाल करता है.

attestationIdDevice

सिर्फ़ कुंजी को प्रमाणित करने वाले वर्शन >= 2 में प्रज़ेंट करें.

यह Tag::ATTESTATION_ID_DEVICE Keymaster टैग से जुड़ा है, जो 711 की टैग आईडी वैल्यू का इस्तेमाल करता है.

attestationIdProduct

सिर्फ़ कुंजी को प्रमाणित करने वाले वर्शन >= 2 में प्रज़ेंट करें.

Tag::ATTESTATION_ID_PRODUCT के-मास्टर टैग से मेल खाता है. इस टैग में, टैग आईडी की वैल्यू 712 होती है.

attestationIdSerial

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

यह Tag::ATTESTATION_ID_SERIAL Keymaster टैग से जुड़ा है, जो 713 की टैग आईडी वैल्यू का इस्तेमाल करता है.

attestationIdImei

सिर्फ़ कुंजी को प्रमाणित करने वाले वर्शन >= 2 में प्रज़ेंट करें.

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

attestationIdMeid

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

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

attestationIdManufacturer

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

यह Tag::ATTESTATION_ID_MANUFACTURER अनुमति वाले टैग से जुड़ा है, जो 716 की टैग आईडी वैल्यू का इस्तेमाल करता है.

attestationIdModel

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

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

vendorPatchLevel

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

यह Tag::VENDOR_PATCHLEVEL अनुमति टैग से जुड़ा है, जो टैग आईडी की वैल्यू 718 का इस्तेमाल करता है.

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

bootPatchLevel

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

यह Tag::BOOT_PATCHLEVEL ऑथराइज़ेशन टैग से मेल खाता है. इस टैग में, टैग आईडी की वैल्यू 719 है.

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

deviceUniqueAttestation

सिर्फ़ कुंजी को प्रमाणित करने वाले वर्शन >= 4 में प्रज़ेंट करें.

यह Tag::DEVICE_UNIQUE_ATTESTATION authorization टैग से जुड़ा है, जो टैग आईडी की वैल्यू 720 का इस्तेमाल करता है.

attestationIdSecondImei

यह सिर्फ़ 300 या उससे ज़्यादा वर्शन के एटेस्टेशन में मौजूद है.

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

RootOfTrust फ़ील्ड

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

VerifiedBootState की वैल्यू

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

AttestationApplicationId

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

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

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

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

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

अनन्य ID

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

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

कहाँ:

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

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

पुष्टि करने वाली कुंजियां और सर्टिफ़िकेट

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

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

एक से ज़्यादा IMEI नंबर

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

अगर OEM के डिवाइसों में सेकंडरी IMEI मौजूद है, तो उसे KeyMint लागू करने के लिए उपलब्ध कराया जाना चाहिए, ताकि लागू करने की प्रोसेस में उसी तरह पुष्टि की जा सके जिस तरह पहले IMEI की पुष्टि की जाती है

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

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

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

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

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

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

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

निर्माण

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

S = D || HMAC(HBK, D)

कहां:

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

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

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

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

  1. Android में Build.BRAND से मिला ब्रैंड का नाम
  2. डिवाइस का नाम, जैसा कि Android में Build.DEVICE ने लौटाया है
  3. Android में Build.PRODUCT से मिला प्रॉडक्ट का नाम
  4. मैन्युफ़ैक्चरर का नाम, जो Android में Build.MANUFACTURER से मिला है
  5. मॉडल का नाम, जैसा कि Android में Build.MODEL ने दिखाया है
  6. सीरियल नंबर
  7. सभी रेडियो के IMEI
  8. सभी रेडियो के MEID

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

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

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

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

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

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

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

Java API

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