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

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

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

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

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

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

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

कुंजी की पुष्टि करने के लिए, Android 7.0 ने एचएएल में टैग, टाइप, और तरीकों का एक सेट जोड़ा है.

टैग

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

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

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

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

AttestKey तरीका

Keymaster 3

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

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

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

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

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

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

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

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

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

TBSCertificate SEQUENCE

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

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

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

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

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

स्कीमा

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

वर्शन 300

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

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

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

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

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

वर्शन 200

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

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

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

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

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

वर्शन 100

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

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

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

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

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

वर्शन 4

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

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

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

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

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

वर्ज़न 3

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

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

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

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

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

वर्शन 2

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

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

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

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

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

वर्शन 1

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

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

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

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

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

KeyDescription फ़ील्ड

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

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

keymasterVersion / keyMintVersion
Keymaster/KeyMint हार्डवेयर ऐब्स्ट्रैक्शन लेयर (एचएएल) के लागू होने का वर्शन.
वैल्यूKeymaster/KeyMint का वर्शन
2Keymaster का वर्शन 2.0
3Keymaster का वर्शन 3.0
4Keymaster का वर्शन 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 अनुमति टैग से मेल खाता है. यह टैग, 1 की टैग आईडी वैल्यू का इस्तेमाल करता है.
algorithm

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

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

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

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

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

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

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

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

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

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

earlyBootOnly

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

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

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

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

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

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

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

trustedUserPresenceRequired

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

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

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

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

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

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

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

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

unlockedDeviceRequired

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

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

allApplications

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

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

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

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

rollbackResistant

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

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

rootOfTrust

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

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

osVersion

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

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

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

osPatchLevel

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

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

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

attestationApplicationId

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

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

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

attestationIdBrand

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

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

attestationIdDevice

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

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

attestationIdProduct

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

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

attestationIdSerial

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

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

attestationIdImei

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

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

attestationIdMeid

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

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

attestationIdManufacturer

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

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

attestationIdModel

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

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

vendorPatchLevel

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

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

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

bootPatchLevel

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

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

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

deviceUniqueAttestation

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

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

attestationIdSecondImei

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

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

RootOfTrust फ़ील्ड

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

VerifiedBootState की वैल्यू

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

AttestationApplicationId

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

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

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

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

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

यूनीक आईडी

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

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

कहाँ:

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

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

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

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

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

एक से ज़्यादा IMEI

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

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

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

प्रावधान की जानकारी वाले एक्सटेंशन का OID 1.3.6.1.4.1.11129.2.1.30 है. यह एक्सटेंशन, डिवाइस के बारे में वह जानकारी देता है जो डिवाइस को सेट अप करने वाले सर्वर के पास होती है.

स्कीमा

यह एक्सटेंशन, CDDL स्कीमा का पालन करता है:

  {
        1 : int,   ; certificates issued
  }

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

certs_issued

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

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

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

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

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

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

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

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

निर्माण

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

S = D || HMAC(HBK, D)

कहां:

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

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

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

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

  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 पर काम करने वाले सभी डिवाइसों में पहले छह वर्शन मौजूद होते हैं. इनकी ज़रूरत इस सुविधा के काम करने के लिए होती है. अगर डिवाइस में कोई इंटिग्रेटेड सेल्युलर रेडियो है, तो डिवाइस में रेडियो के IMEI और/या MEID के लिए भी पुष्टि की सुविधा होनी चाहिए.

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

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

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

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

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

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

Java API

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