কী এবং আইডি প্রত্যয়ন

কীস্টোর একটি নিয়ন্ত্রিত উপায়ে ক্রিপ্টোগ্রাফিক কী তৈরি, সংরক্ষণ এবং ব্যবহার করার জন্য আরও সুরক্ষিত একটি স্থান প্রদান করে। যখন হার্ডওয়্যার-সমর্থিত কী স্টোরেজ উপলব্ধ থাকে এবং ব্যবহৃত হয়, তখন ডিভাইস থেকে কী উপাদান নিষ্কাশনের বিরুদ্ধে আরও সুরক্ষিত থাকে, এবং কীমিন্ট (পূর্বে কীমাস্টার) এমন বিধিনিষেধ প্রয়োগ করে যা লঙ্ঘন করা কঠিন।

তবে, এটি কেবল তখনই সত্য যখন কীস্টোর কীগুলো হার্ডওয়্যার-সমর্থিত স্টোরেজে আছে বলে জানা যায়। কীমাস্টার ১-এ, অ্যাপ বা রিমোট সার্ভারগুলোর পক্ষে নির্ভরযোগ্যভাবে যাচাই করার কোনো উপায় ছিল না যে বিষয়টি সেরকমই ছিল কিনা। কীস্টোর ডেমনটি উপলব্ধ কীমাস্টার হার্ডওয়্যার অ্যাবস্ট্রাকশন লেয়ার (HAL) লোড করত এবং কীগুলোর হার্ডওয়্যার সমর্থনের বিষয়ে HAL যা বলত, তাই বিশ্বাস করত।

এর প্রতিকার হিসেবে অ্যান্ড্রয়েড ৭.০-তে (কীমাস্টার ২) কী অ্যাটেস্টেশন এবং অ্যান্ড্রয়েড ৮.০-তে (কীমাস্টার ৩) আইডি অ্যাটেস্টেশন চালু করা হয়েছিল।

কী অ্যাটেস্টেশনের লক্ষ্য হলো একটি অ্যাসিমেট্রিক কী পেয়ার হার্ডওয়্যার-সমর্থিত কিনা, কী-টির বৈশিষ্ট্য কী এবং এর ব্যবহারে কী কী সীমাবদ্ধতা প্রযোজ্য, তা দৃঢ়ভাবে নির্ধারণ করার একটি উপায় প্রদান করা।

আইডি অ্যাটেস্টেশন ডিভাইসটিকে তার হার্ডওয়্যার শনাক্তকারী, যেমন সিরিয়াল নম্বর বা IMEI-এর প্রমাণ সরবরাহ করার সুযোগ দেয়।

মূল প্রত্যয়ন

কী অ্যাটেস্টেশন সমর্থন করার জন্য, অ্যান্ড্রয়েড ৭.০ HAL-এ এক সেট ট্যাগ, টাইপ এবং মেথড চালু করেছে।

ট্যাগ

  • 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 পদ্ধতি

কীমাস্টার ৩

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

Keymaster 2 এবং এর নিচের

keymaster_error_t (*attest_key)(const struct keymaster2_device* dev,
        const keymaster_key_blob_t* key_to_attest,
        const keymaster_key_param_set_t* attest_params,
        keymaster_cert_chain_t* cert_chain);
  • dev হলো Keymaster ডিভাইসের কাঠামো।
  • keyToAttest হলো generateKey থেকে প্রাপ্ত কী ব্লব, যার জন্য অ্যাটেস্টেশনটি তৈরি করা হয়।
  • attestParams হলো অ্যাটেস্টেশনের জন্য প্রয়োজনীয় প্যারামিটারগুলোর একটি তালিকা। এর মধ্যে রয়েছে Tag::ATTESTATION_CHALLENGE এবং সম্ভবত Tag::RESET_SINCE_ID_ROTATION , সেইসাথে Tag::APPLICATION_ID এবং Tag::APPLICATION_DATA । কী জেনারেশনের সময় নির্দিষ্ট করা হয়ে থাকলে, কী ব্লব ডিক্রিপ্ট করার জন্য শেষের দুটি প্যারামিটার প্রয়োজন।
  • certChain হলো আউটপুট প্যারামিটার, যা সার্টিফিকেটগুলোর একটি অ্যারে রিটার্ন করে। এন্ট্রি ০ হলো অ্যাটেস্টেশন সার্টিফিকেট, অর্থাৎ এটি keyToAttest থেকে প্রাপ্ত কী-টিকে সার্টিফাই করে এবং এতে অ্যাটেস্টেশন এক্সটেনশনটি থাকে।

attestKey মেথডটিকে অ্যাটেস্টেড কী-এর উপর একটি পাবলিক কী অপারেশন হিসেবে বিবেচনা করা হয়, কারণ এটি যেকোনো সময় কল করা যেতে পারে এবং এর জন্য কোনো অথরাইজেশন সীমাবদ্ধতা পূরণের প্রয়োজন হয় না। উদাহরণস্বরূপ, যদি অ্যাটেস্টেড কী ব্যবহারের জন্য ব্যবহারকারীর প্রমাণীকরণের প্রয়োজন হয়, তবে ব্যবহারকারীর প্রমাণীকরণ ছাড়াই একটি অ্যাটেস্টেশন তৈরি করা যেতে পারে।

প্রত্যয়নপত্র

অ্যাটেস্টেশন সার্টিফিকেটটি একটি স্ট্যান্ডার্ড X.509 সার্টিফিকেট, যার সাথে একটি ঐচ্ছিক অ্যাটেস্টেশন এক্সটেনশন থাকে এবং এতে অ্যাটেস্টেড কী-এর একটি বিবরণ থাকে। সার্টিফিকেটটি একটি সার্টিফাইড অ্যাটেস্টেশন কী দ্বারা স্বাক্ষরিত হয়। অ্যাটেস্টেশন কী-টি, যে কী-টি অ্যাটেস্টেড করা হচ্ছে তার থেকে ভিন্ন অ্যালগরিদম ব্যবহার করতে পারে।

প্রত্যয়ন সার্টিফিকেটে নিচের সারণিতে উল্লেখিত ফিল্ডগুলো থাকে এবং এতে কোনো অতিরিক্ত ফিল্ড থাকতে পারে না। কিছু ফিল্ডের জন্য একটি নির্দিষ্ট মান উল্লেখ করা থাকে। CTS পরীক্ষার মাধ্যমে যাচাই করা হয় যে সার্টিফিকেটের বিষয়বস্তু ঠিক সংজ্ঞায়িত মান অনুযায়ীই আছে।

সার্টিফিকেট ক্রম

ক্ষেত্রের নাম ( RFC 5280 দেখুন) মূল্য
টিবিএস সার্টিফিকেট টিবিএস সার্টিফিকেট ক্রম
স্বাক্ষর অ্যালগরিদম কী-টি স্বাক্ষর করতে ব্যবহৃত অ্যালগরিদমের অ্যালগরিদমআইডেন্টিফায়ার:
EC কীগুলির জন্য ECDSA, RSA কীগুলির জন্য RSA৷
স্বাক্ষরমান বিট স্ট্রিং, ASN.1 DER-এনকোডেড tbsCertificate-এর উপর গণনাকৃত স্বাক্ষর।

টিবিএস সার্টিফিকেট ক্রম

ক্ষেত্রের নাম ( RFC 5280 দেখুন) মূল্য
version পূর্ণসংখ্যা ২ (মানে ভি৩ সার্টিফিকেট)
serialNumber পূর্ণসংখ্যা ১ (স্থির মান: সকল সার্টিফিকেটে একই)
signature কী স্বাক্ষর করতে ব্যবহৃত অ্যালগরিদমের অ্যালগরিদমআইডেন্টিফায়ার: EC কী-এর জন্য ECDSA, RSA কী-এর জন্য RSA।
issuer ব্যাচ অ্যাটেস্টেশন কী-এর সাবজেক্ট ফিল্ডের মতোই।
validity দুটি তারিখের একটি অনুক্রম, যাতে Tag::ACTIVE_DATETIME এবং Tag::USAGE_EXPIRE_DATETIME এর মানগুলো রয়েছে। এই মানগুলো ১ জানুয়ারী, ১৯৭০ থেকে মিলিসেকেন্ডে পরিমাপ করা হয়। সার্টিফিকেটে সঠিক তারিখ উপস্থাপনার জন্য RFC 5280 দেখুন।
যদি Tag::ACTIVE_DATETIME উপস্থিত না থাকে, তাহলে Tag::CREATION_DATETIME এর মান ব্যবহার করুন। যদি Tag::USAGE_EXPIRE_DATETIME উপস্থিত না থাকে, তাহলে ব্যাচ অ্যাটেস্টেশন কী সার্টিফিকেটের মেয়াদ শেষ হওয়ার তারিখ ব্যবহার করুন।
subject CN = "অ্যান্ড্রয়েড কীস্টোর কী" (স্থির মান: সকল সার্টিফিকেটে একই)
subjectPublicKeyInfo SubjectPublicKeyInfo-তে সত্যায়িত পাবলিক কী রয়েছে।
extensions/Key Usage ডিজিটাল সিগনেচার: যদি কী-টির উদ্দেশ্য KeyPurpose::SIGN বা KeyPurpose::VERIFY , তবে এটি সেট করা হয়। অন্য সব বিট আনসেট থাকে।
extensions/CRL Distribution Points মূল্য নির্ধারণ করা হবে
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 টাইপে অনুবাদ করা হয়:

KeyMint বা Keymaster টাইপ ASN.1 প্রকার নোট
ENUM INTEGER
ENUM_REP SET of INTEGER
UINT INTEGER
UINT_REP SET of INTEGER
ULONG INTEGER
ULONG_REP SET of INTEGER
DATE INTEGER ১ জানুয়ারী, ১৯৭০ ০০:০০:০০ জিএমটি থেকে মিলিসেকেন্ড।
BOOL NULL ট্যাগের উপস্থিতি মানে সত্য, অনুপস্থিতি মানে মিথ্যা।
BIGNUM কোনো ট্যাগের এই প্রকার নেই, তাই কোনো ম্যাপিং সংজ্ঞায়িত করা হয়নি।
BYTES OCTET_STRING

স্কিমা

অ্যাটেস্টেশন এক্সটেনশনের বিষয়বস্তু নিম্নলিখিত ASN.1 স্কিমা দ্বারা বর্ণিত হয়েছে। এনক্রিপ্টেড কী ইম্পোর্ট করার জন্য AuthorizationList এর ASN.1 স্কিমাটিও ব্যবহৃত হয়। যে ফিল্ডগুলো অ্যাটেস্টেশন এক্সটেনশনে প্রদর্শিত হবে না, সেগুলোকে সেভাবেই উল্লেখ করা হয়েছে।

সংস্করণ ৫০০

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

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

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

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

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

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

সংস্করণ ৪০০

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

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

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

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

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

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

সংস্করণ ৩০০

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

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

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

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

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

সংস্করণ ২০০

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

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

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

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

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

সংস্করণ ১০০

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

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

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

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

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

সংস্করণ ৪

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

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

AuthorizationList ::= SEQUENCE {
    purpose                      [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm                    [2] EXPLICIT INTEGER OPTIONAL,
    keySize                      [3] EXPLICIT INTEGER OPTIONAL,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL, # Non-attestation
    minMacLength                 [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    ecCurve                     [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent          [200] EXPLICIT INTEGER OPTIONAL,
    rollbackResistance         [303] EXPLICIT NULL OPTIONAL,
    activeDateTime             [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime        [402] EXPLICIT INTEGER OPTIONAL,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [509] EXPLICIT NULL OPTIONAL,
    creationDateTime           [701] EXPLICIT INTEGER OPTIONAL,
    origin                     [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust                [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion                  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel               [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId   [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand         [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice        [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct       [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial        [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei          [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid          [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel         [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel           [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel             [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation    [720] EXPLICIT NULL OPTIONAL,
}

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

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

সংস্করণ ৩

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

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

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

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

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

সংস্করণ ২

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

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

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

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

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

সংস্করণ ১

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

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

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

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

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

মূল বিবরণ ক্ষেত্রগুলি

attestationVersion
ASN.1 স্কিমা সংস্করণ।
মূল্য KeyMint বা Keymaster সংস্করণ
কীমাস্টার সংস্করণ ২.০
কীমাস্টার সংস্করণ ৩.০
কীমাস্টার সংস্করণ ৪.০
কীমাস্টার সংস্করণ ৪.১
১০০ KeyMint সংস্করণ 1.0
২০০ KeyMint সংস্করণ 2.0
৩০০ KeyMint সংস্করণ 3.0
৪০০ KeyMint সংস্করণ 4.0
৫০০ KeyMint সংস্করণ 5.0
attestationSecurityLevel

যে স্থানে সত্যায়িত চাবিটি সংরক্ষণ করা হয়, সেই স্থানের নিরাপত্তা স্তর

keymasterVersion / keyMintVersion
KeyMint বা Keymaster HAL বাস্তবায়নের সংস্করণ।
মূল্য KeyMint বা Keymaster সংস্করণ
কীমাস্টার সংস্করণ ২.০
কীমাস্টার সংস্করণ ৩.০
কীমাস্টার সংস্করণ ৪.০
৪১ কীমাস্টার সংস্করণ ৪.১
১০০ KeyMint সংস্করণ 1.0
২০০ KeyMint সংস্করণ 2.0
৩০০ KeyMint সংস্করণ 3.0
৪০০ KeyMint সংস্করণ 4.0
৫০০ KeyMint সংস্করণ 5.0
keymasterSecurityLevel / keyMintSecurityLevel
KeyMint বা Keymaster বাস্তবায়নের নিরাপত্তা স্তর
attestationChallenge
গুরুত্বপূর্ণ উৎপাদন সময়ে চ্যালেঞ্জটি প্রদান করা হয়েছিল।
uniqueId
একটি গোপনীয়তা-সংবেদনশীল ডিভাইস শনাক্তকারী, যা সিস্টেম অ্যাপগুলো কী তৈরির সময় অনুরোধ করতে পারে। যদি অনন্য আইডি-র জন্য অনুরোধ করা না হয়, তবে এই ক্ষেত্রটি খালি থাকে। বিস্তারিত জানতে, অনন্য আইডি বিভাগটি দেখুন।
softwareEnforced
অ্যান্ড্রয়েড সিস্টেম দ্বারা প্রয়োগ করা KeyMint বা Keymaster অনুমোদন তালিকা । এই তথ্য প্ল্যাটফর্মের কোড দ্বারা সংগ্রহ বা তৈরি করা হয়। যতক্ষণ ডিভাইসটি অ্যান্ড্রয়েড প্ল্যাটফর্ম সিকিউরিটি মডেল (Android Platform Security Model) মেনে চলে এমন একটি অপারেটিং সিস্টেম চালাচ্ছে (অর্থাৎ, ডিভাইসটির বুটলোডার লক করা আছে এবং verifiedBootState ' Verified '), ততক্ষণ এটি বিশ্বাসযোগ্য।
hardwareEnforced
KeyMint বা Keymaster অনুমোদন তালিকাটি ডিভাইসের Trusted Execution Environment (TEE) বা StrongBox দ্বারা বলবৎ করা হয়। এই তথ্য সুরক্ষিত হার্ডওয়্যারের কোড দ্বারা সংগ্রহ বা তৈরি করা হয় এবং এটি প্ল্যাটফর্ম দ্বারা নিয়ন্ত্রিত নয়। উদাহরণস্বরূপ, তথ্য বুটলোডার থেকে বা এমন কোনো সুরক্ষিত যোগাযোগ চ্যানেলের মাধ্যমে আসতে পারে, যেখানে প্ল্যাটফর্মকে বিশ্বাস করার কোনো প্রয়োজন হয় না।

নিরাপত্তা স্তরের মান

SecurityLevel মানটি নির্দেশ করে যে একটি কীস্টোর-সম্পর্কিত উপাদান (যেমন, কী পেয়ার এবং অ্যাটেস্টেশন) আক্রমণের বিরুদ্ধে কতটা প্রতিরোধী।

মূল্য অর্থ
Software ডিভাইসটি ততক্ষণ পর্যন্ত সুরক্ষিত, যতক্ষণ এর অ্যান্ড্রয়েড সিস্টেম অ্যান্ড্রয়েড প্ল্যাটফর্ম সিকিউরিটি মডেল মেনে চলে (অর্থাৎ, ডিভাইসটির বুটলোডার লক করা থাকে এবং verifiedBootState টি Verified হয়)।
TrustedEnvironment যতক্ষণ TEE-এর নিরাপত্তা বিঘ্নিত না হয়, ততক্ষণ এটি সুরক্ষিত থাকে। TEE-এর জন্য বিচ্ছিন্নতার প্রয়োজনীয়তাগুলো অ্যান্ড্রয়েড কম্প্যাটিবিলিটি ডেফিনিশন ডকুমেন্টের ৯.১১ [C-1-1] থেকে [C-1-4] অনুচ্ছেদে সংজ্ঞায়িত করা হয়েছে। TEE দূরবর্তী নিরাপত্তা বিঘ্নিত হওয়ার বিরুদ্ধে অত্যন্ত প্রতিরোধী এবং সরাসরি হার্ডওয়্যার আক্রমণের মাধ্যমে নিরাপত্তা বিঘ্নিত হওয়ার বিরুদ্ধে মাঝারিভাবে প্রতিরোধী।
StrongBox যতক্ষণ StrongBox-এর নিরাপত্তা বিঘ্নিত না হয়, ততক্ষণ এটি সুরক্ষিত। StrongBox একটি হার্ডওয়্যার নিরাপত্তা মডিউলের অনুরূপ একটি সুরক্ষিত উপাদানে বাস্তবায়িত হয়। StrongBox বাস্তবায়নের জন্য প্রয়োজনীয় শর্তাবলী Android Compatibility Definition Document-এর ৯.১১.২ অনুচ্ছেদে সংজ্ঞায়িত করা হয়েছে। StrongBox দূরবর্তী নিরাপত্তা লঙ্ঘন এবং সরাসরি হার্ডওয়্যার আক্রমণের (যেমন, ভৌত বিকৃতি এবং সাইড-চ্যানেল আক্রমণ) মাধ্যমে নিরাপত্তা লঙ্ঘনের বিরুদ্ধে অত্যন্ত প্রতিরোধী।

অনুমোদন তালিকা ক্ষেত্র

প্রতিটি ফিল্ড AIDL ইন্টারফেস স্পেসিফিকেশন থেকে একটি Keymaster/KeyMint অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ। স্পেসিফিকেশনটিই অথরাইজেশন ট্যাগ সম্পর্কিত তথ্যের নির্ভরযোগ্য উৎস: যেমন—এগুলোর অর্থ, বিষয়বস্তুর বিন্যাস, KeyDescription অবজেক্টের softwareEnforced বা hardwareEnforced ফিল্ডে এগুলো প্রদর্শিত হবে কিনা, এগুলো অন্যান্য ট্যাগের সাথে পারস্পরিকভাবে স্বতন্ত্র কিনা, ইত্যাদি। AuthorizationList সমস্ত ফিল্ড ঐচ্ছিক।

প্রতিটি ফিল্ডের একটি EXPLICIT প্রসঙ্গ-নির্দিষ্ট ট্যাগ থাকে যা KeyMint বা Keymaster ট্যাগ নম্বরের সমান, যা AuthorizationList এ ডেটার আরও সংক্ষিপ্ত উপস্থাপনা সক্ষম করে। তাই ASN.1 পার্সারকে অবশ্যই প্রতিটি প্রসঙ্গ-নির্দিষ্ট ট্যাগের জন্য প্রত্যাশিত ডেটা টাইপ জানতে হবে। উদাহরণস্বরূপ, Tag::USER_AUTH_TYPE কে ENUM | 504 হিসাবে সংজ্ঞায়িত করা হয়েছে। অ্যাটেস্টেশন এক্সটেনশন স্কিমাতে, AuthorizationList এর purpose ফিল্ডটি userAuthType [504] EXPLICIT INTEGER OPTIONAL হিসাবে নির্দিষ্ট করা হয়েছে। তাই এর ASN.1 এনকোডিং-এ ASN.1 টাইপ INTEGER এর জন্য UNIVERSAL ক্লাস ট্যাগ (যা 10 ) এর পরিবর্তে প্রসঙ্গ-নির্দিষ্ট ট্যাগ 504 থাকবে।

KeyMint 5 দ্বারা তৈরি অ্যাটেস্টেশনগুলিতে নিম্নলিখিত ফিল্ডগুলি উপস্থিত থাকে:
purpose
এটি Tag::PURPOSE অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা ট্যাগ আইডি ভ্যালু হিসেবে 1 ব্যবহার করে।
algorithm

এটি Tag::ALGORITHM অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা ট্যাগ আইডি ভ্যালু হিসেবে 2 ব্যবহার করে।

একটি অ্যাটেস্টেশন AuthorizationList অবজেক্টে, অ্যালগরিদম ভ্যালুটি সর্বদা RSA , EC বা ML_DSA হয়।

keySize
এটি Tag::KEY_SIZE অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা ৩ ট্যাগ আইডি মান ব্যবহার করে।
blockMode
এটি Tag::BLOCK_MODE অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা ৪ ট্যাগ আইডি মান ব্যবহার করে।
digest
এটি Tag::DIGEST অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 5 ট্যাগ আইডি মান ব্যবহার করে।
padding
এটি Tag::PADDING অথরাইজেশন ট্যাগের অনুরূপ, যা ৬ ট্যাগ আইডি মান ব্যবহার করে।
callerNonce
এটি Tag::CALLER_NONCE অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা ৭ ট্যাগ আইডি মান ব্যবহার করে। এই ট্যাগটি অ্যাটেস্টেশনে কখনও উপস্থিত থাকে না।
minMacLength
এটি Tag::MIN_MAC_LENGTH অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা ৮ ট্যাগ আইডি মান ব্যবহার করে। এই ট্যাগটি অ্যাটেস্টেশনে কখনও উপস্থিত থাকে না।
ecCurve

এটি Tag::EC_CURVE অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 10 ট্যাগ আইডি মান ব্যবহার করে।

অ্যান্ড্রয়েড সিস্টেম কীস্টোরের মধ্যে একটি এলিপটিক কার্ভ (EC) কী পেয়ার তৈরি করতে ব্যবহৃত প্যারামিটারগুলোর সেট, যা স্বাক্ষর এবং যাচাইকরণের জন্য ECDSA ব্যবহার করে।

mlDsaVariant

শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ >= 500-এ উপস্থিত।

এটি Tag::ML_DSA_VARIANT অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 11 ট্যাগ আইডি মান ব্যবহার করে।

rsaPublicExponent
এটি Tag::RSA_PUBLIC_EXPONENT অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 200 ট্যাগ আইডি মান ব্যবহার করে।
mgfDigest

শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ >= ১০০-তে উপস্থিত।

এটি Tag::RSA_OAEP_MGF_DIGEST KeyMint অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 203 ট্যাগ আইডি মান ব্যবহার করে।
rollbackResistance

শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ ৩ বা তার চেয়ে বড় সংস্করণে উপস্থিত।

এটি Tag::ROLLBACK_RESISTANCE অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 303 ট্যাগ আইডি মান ব্যবহার করে।

earlyBootOnly

শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ >= ৪-এ উপস্থিত।

এটি Tag::EARLY_BOOT_ONLY অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 305 ট্যাগ আইডি মান ব্যবহার করে।

activeDateTime
এটি Tag::ACTIVE_DATETIME অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 400 ট্যাগ আইডি মান ব্যবহার করে।
originationExpireDateTime
এটি Tag::ORIGINATION_EXPIRE_DATETIME অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 401 ট্যাগ আইডি মান ব্যবহার করে।
usageExpireDateTime
এটি Tag::USAGE_EXPIRE_DATETIME অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 402 ট্যাগ আইডি মান ব্যবহার করে।
usageCountLimit
এটি Tag::USAGE_COUNT_LIMIT অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 405 ট্যাগ আইডি মান ব্যবহার করে।
userSecureId
এটি Tag::USER_SECURE_ID অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 502 ট্যাগ আইডি মান ব্যবহার করে। এই ট্যাগটি অ্যাটেস্টেশনে কখনও উপস্থিত থাকে না।
noAuthRequired

এটি Tag::NO_AUTH_REQUIRED অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 503 ট্যাগ আইডি মান ব্যবহার করে।

userAuthType
এটি Tag::USER_AUTH_TYPE অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 504 ট্যাগ আইডি মান ব্যবহার করে।
authTimeout
এটি Tag::AUTH_TIMEOUT অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 505 ট্যাগ আইডি মান ব্যবহার করে।
allowWhileOnBody

এটি Tag::ALLOW_WHILE_ON_BODY অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 506 ট্যাগ আইডি মান ব্যবহার করে।

যদি ব্যবহারকারী তখনও ডিভাইসটি তার শরীরে পরিধান করে থাকেন, তবে প্রমাণীকরণের সময়সীমা শেষ হওয়ার পরেও কী-টি ব্যবহার করার অনুমতি দেওয়া হয়। উল্লেখ্য যে, একটি সুরক্ষিত অন-বডি সেন্সর নির্ধারণ করে যে ডিভাইসটি ব্যবহারকারীর শরীরে পরিধান করা আছে কি না।

trustedUserPresenceReq

শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ ৩ বা তার চেয়ে বড় সংস্করণে উপস্থিত।

এটি Tag::TRUSTED_USER_PRESENCE_REQUIRED অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 507 ট্যাগ আইডি মান ব্যবহার করে।

নির্দিষ্ট করে যে, এই চাবিটি কেবল তখনই ব্যবহারযোগ্য হবে যখন ব্যবহারকারী সশরীরে উপস্থিত থাকার প্রমাণ দেবেন। কয়েকটি উদাহরণ নিচে দেওয়া হলো:

  • স্ট্রংবক্স কী-এর জন্য, এটি একটি হার্ডওয়্যার বাটন যা স্ট্রংবক্স ডিভাইসের একটি পিনের সাথে হার্ডওয়্যারের মাধ্যমে সংযুক্ত থাকে।
  • TEE কী-এর ক্ষেত্রে, ফিঙ্গারপ্রিন্ট প্রমাণীকরণ উপস্থিতির প্রমাণ হিসেবে কাজ করে, যতক্ষণ পর্যন্ত স্ক্যানারের উপর TEE-এর একচেটিয়া নিয়ন্ত্রণ থাকে এবং সে ফিঙ্গারপ্রিন্ট মেলানোর প্রক্রিয়াটি সম্পাদন করে।
trustedConfirmationReq

শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ ৩ বা তার চেয়ে বড় সংস্করণে উপস্থিত।

এটি Tag::TRUSTED_CONFIRMATION_REQUIRED অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 508 ট্যাগ আইডি মান ব্যবহার করে।

এটি নির্দিষ্ট করে যে, ব্যবহারকারী একটি অনুমোদন টোকেন ব্যবহার করে স্বাক্ষরিতব্য ডেটার নিশ্চিতকরণ প্রদান করলেই কেবল কী-টি ব্যবহারযোগ্য হবে। ব্যবহারকারীর নিশ্চিতকরণ কীভাবে পেতে হয় সে সম্পর্কে আরও তথ্যের জন্য, অ্যান্ড্রয়েড সুরক্ষিত নিশ্চিতকরণ (Android Protected Confirmation ) দেখুন।

দ্রষ্টব্য: এই ট্যাগটি শুধুমাত্র সেইসব কী-এর ক্ষেত্রে প্রযোজ্য যেগুলো SIGN উদ্দেশ্যে ব্যবহৃত হয়।

unlockedDeviceReq

শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ ৩ বা তার চেয়ে বড় সংস্করণে উপস্থিত।

এটি Tag::UNLOCKED_DEVICE_REQUIRED অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 509 ট্যাগ আইডি মান ব্যবহার করে।

creationDateTime
এটি Tag::CREATION_DATETIME অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 701 ট্যাগ আইডি মান ব্যবহার করে।
origin

এটি Tag::ORIGIN অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 702 ট্যাগ আইডি মান ব্যবহার করে।

rootOfTrust

এটি Tag::ROOT_OF_TRUST অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 704 ট্যাগ আইডি মান ব্যবহার করে।

আরও বিস্তারিত জানতে, RootOfTrust ডেটা স্ট্রাকচার সম্পর্কিত অংশটি দেখুন।

osVersion

এটি Tag::OS_VERSION অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 705 ট্যাগ আইডি মান ব্যবহার করে।

কীমাস্টারের সাথে যুক্ত অ্যান্ড্রয়েড অপারেটিং সিস্টেমের সংস্করণ, যা একটি ছয়-অঙ্কের পূর্ণসংখ্যা হিসাবে নির্দিষ্ট করা হয়। উদাহরণস্বরূপ, সংস্করণ 8.1.0-কে 080100 হিসাবে প্রকাশ করা হয়।

শুধুমাত্র কীমাস্টার ভার্সন ১.০ বা তার উচ্চতর সংস্করণেই অনুমোদন তালিকায় এই মানটি অন্তর্ভুক্ত থাকে।

osPatchLevel

এটি Tag::OS_PATCHLEVEL অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 706 ট্যাগ আইডি মান ব্যবহার করে।

KeyMint (পূর্বে Keymaster)-এ ব্যবহৃত নিরাপত্তা প্যাচের সাথে সম্পর্কিত মাস এবং বছর, যা একটি ছয়-অঙ্কের পূর্ণসংখ্যা হিসাবে নির্দিষ্ট করা হয়। উদাহরণস্বরূপ, আগস্ট ২০১৮-এর প্যাচটি 201808 হিসাবে উপস্থাপিত হয়।

কোনো ডিভাইস সম্প্রতি প্যাচ করা হয়েছে কিনা তা পরীক্ষা করার জন্য vendorPatchLevel বা bootPatchLevel পরিবর্তে এই ফিল্ডটি ব্যবহার করা শ্রেয়।

শুধুমাত্র কীমাস্টার ভার্সন ১.০ বা তার উচ্চতর সংস্করণেই অনুমোদন তালিকায় এই মানটি অন্তর্ভুক্ত থাকে।

attestationApplicationId

শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ >= ২-এ উপস্থিত।

এটি Tag::ATTESTATION_APPLICATION_ID অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 709 ট্যাগ আইডি মান ব্যবহার করে।

আরও বিস্তারিত জানতে, AttestationApplicationId ডেটা স্ট্রাকচার সম্পর্কিত অংশটি দেখুন।

attestationIdBrand

শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ >= ২-এ উপস্থিত।

এটি Tag::ATTESTATION_ID_BRAND অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 710 ট্যাগ আইডি মান ব্যবহার করে।

attestationIdDevice

শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ >= ২-এ উপস্থিত।

এটি Tag::ATTESTATION_ID_DEVICE অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 711 ট্যাগ আইডি মান ব্যবহার করে।

attestationIdProduct

শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ >= ২-এ উপস্থিত।

এটি Tag::ATTESTATION_ID_PRODUCT অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 712 ট্যাগ আইডি মান ব্যবহার করে।

attestationIdSerial

শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ >= ২-এ উপস্থিত।

এটি Tag::ATTESTATION_ID_SERIAL অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 713 ট্যাগ আইডি মান ব্যবহার করে।

attestationIdImei

শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ >= ২-এ উপস্থিত।

এটি Tag::ATTESTATION_ID_IMEI অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 714 ট্যাগ আইডি মান ব্যবহার করে।

attestationIdMeid

শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ >= ২-এ উপস্থিত।

এটি Tag::ATTESTATION_ID_MEID অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 715 ট্যাগ আইডি মান ব্যবহার করে।

attestationIdManufacturer

শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ >= ২-এ উপস্থিত।

এটি Tag::ATTESTATION_ID_MANUFACTURER অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 716 ট্যাগ আইডি মান ব্যবহার করে।

attestationIdModel

শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ >= ২-এ উপস্থিত।

এটি Tag::ATTESTATION_ID_MODEL অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 717 ট্যাগ আইডি মান ব্যবহার করে।

vendorPatchLevel

শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ ৩ বা তার চেয়ে বড় সংস্করণগুলিতে উপস্থিত।

এটি Tag::VENDOR_PATCHLEVEL অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 718 ট্যাগ আইডি মান ব্যবহার করে।

এই কী-টি ব্যবহার করার জন্য ডিভাইসে যে ভেন্ডর ইমেজ সিকিউরিটি প্যাচ লেভেলটি অবশ্যই ইনস্টল করা থাকতে হবে, তা নির্দিষ্ট করে। এর মান হলো সিকিউরিটি প্যাচ লেভেল থেকে ড্যাশগুলো বাদ দিয়ে গঠিত একটি পূর্ণসংখ্যা। উদাহরণস্বরূপ, যদি ভেন্ডরের 2018-08-05 সিকিউরিটি প্যাচ ইনস্টল করা কোনো অ্যান্ড্রয়েড ডিভাইসে একটি কী তৈরি করা হয়, তাহলে এই মানটি হবে 20180805।

bootPatchLevel

শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ ৩ বা তার চেয়ে বড় সংস্করণগুলিতে উপস্থিত।

এটি Tag::BOOT_PATCHLEVEL অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 719 ট্যাগ আইডি মান ব্যবহার করে।

এই কী-টি ব্যবহার করার জন্য ডিভাইসে যে কার্নেল ইমেজ সিকিউরিটি প্যাচ লেভেলটি অবশ্যই ইনস্টল করা থাকতে হবে, তা নির্দিষ্ট করে। এর মান হলো সিকিউরিটি প্যাচ লেভেল থেকে ড্যাশগুলো বাদ দিয়ে গঠিত একটি পূর্ণসংখ্যা। উদাহরণস্বরূপ, যদি কার্নেলের 2018-08-05 সিকিউরিটি প্যাচ ইনস্টল করা কোনো অ্যান্ড্রয়েড ডিভাইসে একটি কী তৈরি করা হয়, তাহলে এই মানটি হবে 20180805।

deviceUniqueAttestation

শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ ৪ বা তার চেয়ে বড় সংস্করণগুলিতে উপস্থিত।

এটি Tag::DEVICE_UNIQUE_ATTESTATION অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 720 ট্যাগ আইডি মান ব্যবহার করে।

attestationIdSecondImei

শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ >= 300-এ উপস্থিত।

এটি Tag::ATTESTATION_ID_SECOND_IMEI অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 723 ট্যাগ আইডি মান ব্যবহার করে।

moduleHash

শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ >= 400-এ উপস্থিত।

এটি Tag::MODULE_HASH অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 724 ট্যাগ আইডি মান ব্যবহার করে।

রুটঅফট্রাস্ট ক্ষেত্রগুলি

verifiedBootKey
ভেরিফায়েড বুট -এর অংশ হিসেবে ডিভাইস বুট আপের সময় কার্যকর হওয়া সমস্ত কোডের অখণ্ডতা ও সত্যতা যাচাই করতে ব্যবহৃত পাবলিক কী-এর একটি সুরক্ষিত হ্যাশ। SHA-256 ব্যবহারের পরামর্শ দেওয়া হয়।
deviceLocked
ডিভাইসটির বুটলোডার লক করা আছে কিনা। true মানে হলো, ডিভাইসটি এমন একটি স্বাক্ষরিত ইমেজ বুট করেছে যা ভেরিফাইড বুট (Verified Boot) দ্বারা সফলভাবে যাচাই করা হয়েছে।
verifiedBootState
ডিভাইসটির ভেরিফাইড বুট অবস্থা
verifiedBootHash
ভেরিফায়েড বুট দ্বারা সুরক্ষিত সমস্ত ডেটার একটি ডাইজেস্ট। যেসব ডিভাইস অ্যান্ড্রয়েড ভেরিফায়েড বুট রেফারেন্স ইমপ্লিমেন্টেশন ব্যবহার করে, সেগুলোর ক্ষেত্রে এই ফিল্ডটিতে VBMeta ডাইজেস্ট থাকে।

যাচাইকৃত বুট অবস্থা মান

মূল্য সংশ্লিষ্ট বুট অবস্থা অর্থ
Verified GREEN একটি সম্পূর্ণ ট্রাস্ট চেইন হার্ডওয়্যার-সুরক্ষিত রুট অফ ট্রাস্ট থেকে বুটলোডার এবং ভেরিফায়েড বুট দ্বারা যাচাইকৃত সমস্ত পার্টিশন পর্যন্ত বিস্তৃত থাকে। এই অবস্থায়, verifiedBootKey ফিল্ডটিতে এমবেডেড রুট অফ ট্রাস্টের হ্যাশ থাকে, যা হলো সেই সার্টিফিকেট যা ডিভাইস প্রস্তুতকারক কারখানায় ডিভাইসটির রম-এ এমবেড করে দেয়।
SelfSigned YELLOW Verified এর মতোই, তবে এক্ষেত্রে ভেরিফিকেশনটি করা হয়েছে প্রস্তুতকারকের কারখানায় এমবেড করা রুট অফ ট্রাস্টের পরিবর্তে ব্যবহারকারী দ্বারা কনফিগার করা একটি রুট অফ ট্রাস্ট ব্যবহার করে। এই অবস্থায়, ' verifiedBootKey ফিল্ডটিতে ব্যবহারকারী দ্বারা কনফিগার করা পাবলিক কী-এর হ্যাশ থাকে।
Unverified ORANGE ডিভাইসটির বুটলোডার আনলক করা আছে, তাই একটি চেইন অফ ট্রাস্ট স্থাপন করা সম্ভব নয়। ডিভাইসটি অবাধে পরিবর্তন করা যায়, তাই ব্যবহারকারীকে আউট-অফ-ব্যান্ডে ডিভাইসটির অখণ্ডতা যাচাই করতে হবে। এই অবস্থায় verifiedBootKey ফিল্ডটিতে ৩২ বাইট শূন্য থাকে।
Failed RED ডিভাইসটি যাচাইকরণে ব্যর্থ হয়েছে। এই অবস্থায়, অন্যান্য RootOfTrust ফিল্ডগুলোর বিষয়বস্তু সম্পর্কে কোনো নিশ্চয়তা নেই।

অ্যাটেস্টেশন অ্যাপ্লিকেশন আইডি

এই ফিল্ডটি অ্যান্ড্রয়েড প্ল্যাটফর্মের সেই বিশ্বাসকে প্রতিফলিত করে যে, কোন অ্যাপগুলো অ্যাটেস্টেশনের অধীনে থাকা সিক্রেট কী মেটেরিয়াল ব্যবহার করার অনুমতি পাবে। এতে একাধিক প্যাকেজ থাকতে পারে যদি এবং কেবল যদি একাধিক প্যাকেজের একই UID থাকে। 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]), ...}
    

সরবরাহ তথ্য সম্প্রসারণ

প্রভিশনিং ইনফরমেশন এক্সটেনশনটির OID হলো 1.3.6.1.4.1.11129.2.1.30 । এই এক্সটেনশনটি প্রভিশনিং সার্ভারের কাছে ডিভাইসটি সম্পর্কে জানা তথ্য সরবরাহ করে।

স্কিমা

এক্সটেনশন ভ্যালুটি কনসাইজ বাইনারি অবজেক্ট রিপ্রেজেন্টেশন (CBOR) ডেটা নিয়ে গঠিত, যা এই কনসাইজ ডেটা ডেফিনিশন ল্যাঙ্গুয়েজ (CDDL) স্কিমা মেনে চলে:

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

মানচিত্রটির কোনো সংস্করণ নেই এবং এতে নতুন ঐচ্ছিক ক্ষেত্র যোগ করা হতে পারে।

certs_issued

গত ৩০ দিনে ডিভাইসটিতে ইস্যু করা সার্টিফিকেটের একটি আনুমানিক সংখ্যা। এই মানটি যদি গড়ের চেয়ে কয়েকগুণ বেশি হয়, তবে এটিকে সম্ভাব্য অপব্যবহারের সংকেত হিসেবে ব্যবহার করা যেতে পারে।

validated_attested_entity

সত্যায়িত কী-টির প্রত্যয়িত উৎস নির্দেশকারী একটি স্ট্রিং, যা চিপসেট প্রস্তুতকারক দ্বারা সরাসরি সত্যায়িত। উদাহরণস্বরূপ, STRONG_BOX বা TEE

সত্যায়ন চাবি

একটি RSA ও একটি ECDSA, এই দুটি কী এবং সংশ্লিষ্ট সার্টিফিকেট চেইনগুলো ডিভাইসটিতে নিরাপদে সংরক্ষণ করা থাকে।

অ্যান্ড্রয়েড ১২-এ রিমোট কী প্রভিশনিং চালু করা হয়েছে এবং অ্যান্ড্রয়েড ১৫ অনুযায়ী সকল ডিভাইসে এটি প্রয়োগ করা বাধ্যতামূলক। রিমোট কী প্রভিশনিং ফিল্ডে থাকা ডিভাইসগুলোকে প্রতিটি অ্যাপের জন্য ECDSA P256 অ্যাটেস্টেশন সার্টিফিকেট প্রদান করে। এই সার্টিফিকেটগুলোর মেয়াদ ফ্যাক্টরি থেকে দেওয়া সার্টিফিকেটের চেয়ে কম।

অনন্য আইডি

ইউনিক আইডি হলো একটি ১২৮-বিটের মান যা ডিভাইসটিকে শনাক্ত করে, কিন্তু তা শুধুমাত্র একটি সীমিত সময়ের জন্য। এই মানটি নিম্নোক্ত সূত্র দিয়ে গণনা করা হয়:

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

কোথায়:

  • T হলো "টেম্পোরাল কাউন্টার ভ্যালু", যা Tag::CREATION_DATETIME এর মানকে 2592000000 দিয়ে ভাগ করে এবং ভাগশেষ বাদ দিয়ে গণনা করা হয়। T প্রতি 30 দিন পর পর পরিবর্তিত হয় (2592000000 = 30 * 24 * 60 * 60 * 1000)।
  • C হলো Tag::APPLICATION_ID এর মান।
  • attest_key কলের attest_params প্যারামিটারে Tag::RESET_SINCE_ID_ROTATION উপস্থিত থাকলে R মান 1 হবে, অথবা ট্যাগটি উপস্থিত না থাকলে 0 হবে।
  • HBK হলো একটি অনন্য হার্ডওয়্যার-আবদ্ধ গোপনীয় তথ্য, যা ট্রাস্টেড এক্সিকিউশন এনভায়রনমেন্টের (Trusted Execution Environment) কাছে পরিচিত এবং এটি দ্বারা কখনো প্রকাশ করা হয় না। এই গোপনীয় তথ্যে কমপক্ষে ১২৮ বিট এনট্রপি থাকে এবং এটি প্রতিটি ডিভাইসের জন্য অনন্য (১২৮ বিট এনট্রপির পরিপ্রেক্ষিতে সম্ভাব্য অনন্যতা গ্রহণযোগ্য)। HBK অবশ্যই HMAC বা AES_CMAC-এর মাধ্যমে ফিউজড কী মেটেরিয়াল (fused key material) থেকে ডিরাইভ (derive) করতে হবে।

HMAC_SHA256 আউটপুটকে ১২৮ বিটে সংক্ষিপ্ত করুন।

একাধিক IMEI

অ্যান্ড্রয়েড ১৪-এর অ্যান্ড্রয়েড কী অ্যাটেস্টেশন রেকর্ডে একাধিক IMEI ব্যবহারের সুবিধা যুক্ত করা হয়েছে। OEM-রা দ্বিতীয় একটি IMEI-এর জন্য KeyMint ট্যাগ যোগ করে এই ফিচারটি প্রয়োগ করতে পারেন। ডিভাইসগুলোতে একাধিক সেলুলার রেডিও থাকা এখন ক্রমশ সাধারণ হয়ে উঠছে এবং OEM-রা এখন দুটি IMEI যুক্ত ডিভাইসগুলোকেও সাপোর্ট করতে পারবেন।

OEM-দের ডিভাইসে যদি একটি দ্বিতীয় IMEI থাকে, তবে সেটি KeyMint ইমপ্লিমেন্টেশন(গুলি)-তে সরবরাহ করা আবশ্যক, যাতে সেই ইমপ্লিমেন্টেশনগুলি প্রথম IMEI-এর মতোই দ্বিতীয়টিকেও সত্যায়িত করতে পারে।

পরিচয়পত্র সত্যায়ন

অ্যান্ড্রয়েড ৮.০-তে কীমাস্টার ৩ যুক্ত ডিভাইসগুলোর জন্য আইডি অ্যাটেস্টেশন-এর ঐচ্ছিক সাপোর্ট অন্তর্ভুক্ত রয়েছে। আইডি অ্যাটেস্টেশন ডিভাইসটিকে তার হার্ডওয়্যার আইডেন্টিফায়ার, যেমন সিরিয়াল নম্বর বা আইএমইআই (IMEI)-এর প্রমাণ সরবরাহ করার সুযোগ দেয়। যদিও এটি একটি ঐচ্ছিক ফিচার, তবুও সমস্ত কীমাস্টার ৩ ইমপ্লিমেন্টেশনে এর সাপোর্ট রাখার জন্য জোরালোভাবে সুপারিশ করা হয়। কারণ, ডিভাইসের পরিচয় প্রমাণ করতে পারার ফলে সত্যিকারের জিরো-টাচ রিমোট কনফিগারেশনের মতো ব্যবহারের ক্ষেত্রগুলো আরও সুরক্ষিত হয় (এর ফলে রিমোট প্রান্ত নিশ্চিত হতে পারে যে সে সঠিক ডিভাইসের সাথেই কথা বলছে, এমন কোনো ডিভাইসের সাথে নয় যা তার পরিচয় জাল করছে)।

ডিভাইসটি কারখানা থেকে বের হওয়ার আগে, এর হার্ডওয়্যার আইডেন্টিফায়ারগুলোর এমন কপি তৈরি করার মাধ্যমে আইডি অ্যাটেস্টেশন কাজ করে, যেগুলোতে শুধুমাত্র TEE-ই অ্যাক্সেস করতে পারে। একজন ব্যবহারকারী ডিভাইসের বুটলোডার আনলক করে সিস্টেম সফটওয়্যার এবং অ্যান্ড্রয়েড ফ্রেমওয়ার্ক দ্বারা রিপোর্ট করা আইডেন্টিফায়ারগুলো পরিবর্তন করতে পারে। TEE-এর কাছে থাকা আইডেন্টিফায়ারগুলোর কপি এভাবে ম্যানিপুলেট করা যায় না, যা নিশ্চিত করে যে ডিভাইস আইডি অ্যাটেস্টেশন শুধুমাত্র ডিভাইসের আসল হার্ডওয়্যার আইডেন্টিফায়ারগুলোকেই সত্যায়ন করে এবং এর ফলে স্পুফিংয়ের প্রচেষ্টা ব্যর্থ করে দেয়।

আইডি অ্যাটেস্টেশনের জন্য প্রধান এপিআই সারফেসটি কীমাস্টার ২-এর সাথে প্রবর্তিত বিদ্যমান কী অ্যাটেস্টেশন মেকানিজমের উপর ভিত্তি করে তৈরি। কীমাস্টারের কাছে থাকা কোনো কী-এর জন্য অ্যাটেস্টেশন সার্টিফিকেটের অনুরোধ করার সময়, কলার অনুরোধ করতে পারেন যেন ডিভাইসটির হার্ডওয়্যার আইডেন্টিফায়ারগুলো অ্যাটেস্টেশন সার্টিফিকেটের মেটাডেটাতে অন্তর্ভুক্ত করা হয়। যদি কী-টি TEE-তে সংরক্ষিত থাকে, তবে সার্টিফিকেটটি একটি পরিচিত রুট অফ ট্রাস্ট-এর সাথে চেইনবদ্ধ হয়। এই ধরনের সার্টিফিকেটের প্রাপক যাচাই করতে পারেন যে সার্টিফিকেট এবং এর বিষয়বস্তু, হার্ডওয়্যার আইডেন্টিফায়ারসহ, TEE দ্বারা লেখা হয়েছে। অ্যাটেস্টেশন সার্টিফিকেটে হার্ডওয়্যার আইডেন্টিফায়ার অন্তর্ভুক্ত করতে বলা হলে, TEE শুধুমাত্র তার স্টোরেজে থাকা আইডেন্টিফায়ারগুলোকেই অ্যাটেস্ট করে, যা ফ্যাক্টরি ফ্লোরে পপুলেট করা হয়েছিল।

স্টোরেজ বৈশিষ্ট্য

যে স্টোরেজে ডিভাইসটির আইডেন্টিফায়ারগুলো সংরক্ষিত থাকে, সেটির নিম্নলিখিত বৈশিষ্ট্যগুলো থাকা প্রয়োজন:

  • ডিভাইসটি কারখানা থেকে বের হওয়ার আগেই এর মূল শনাক্তকারীগুলো থেকে প্রাপ্ত মানগুলো স্টোরেজে কপি করা হয়।
  • destroyAttestationIds() মেথডটি আইডেন্টিফায়ার-ভিত্তিক ডেটার এই কপিটিকে স্থায়ীভাবে ধ্বংস করতে পারে। স্থায়ীভাবে ধ্বংস করার অর্থ হলো ডেটা সম্পূর্ণরূপে মুছে ফেলা হয়, ফলে ফ্যাক্টরি রিসেট বা ডিভাইসে করা অন্য কোনো পদ্ধতি দ্বারাও এটিকে পুনরুদ্ধার করা যায় না। এটি সেইসব ডিভাইসের জন্য বিশেষভাবে গুরুত্বপূর্ণ, যেখানে ব্যবহারকারী বুটলোডার আনলক করেছেন, সিস্টেম সফটওয়্যার পরিবর্তন করেছেন এবং অ্যান্ড্রয়েড ফ্রেমওয়ার্ক দ্বারা ফেরত দেওয়া আইডেন্টিফায়ারগুলো পরিবর্তন করেছেন।
  • আরএমএ (RMA) সুবিধাগুলোর হার্ডওয়্যার আইডেন্টিফায়ার-ভিত্তিক ডেটার নতুন কপি তৈরি করার ক্ষমতা থাকা উচিত। এর ফলে, আরএমএ প্রক্রিয়ার মধ্য দিয়ে যাওয়া একটি ডিভাইস পুনরায় আইডি অ্যাটেস্টেশন করতে পারবে। আরএমএ সুবিধাগুলো দ্বারা ব্যবহৃত পদ্ধতিটি অবশ্যই সুরক্ষিত রাখতে হবে, যাতে ব্যবহারকারীরা নিজেরা এটি ব্যবহার করতে না পারে, কারণ তা করলে তারা স্পুফড আইডির অ্যাটেস্টেশন পেয়ে যাবে।
  • TEE-তে থাকা Keymaster বিশ্বস্ত অ্যাপ ব্যতীত অন্য কোনো কোড স্টোরেজে সংরক্ষিত শনাক্তকারী-ভিত্তিক ডেটা পড়তে পারে না।
  • স্টোরেজটি টেম্পার-এভিডেন্ট: যদি স্টোরেজের বিষয়বস্তু পরিবর্তন করা হয়, তাহলে TEE এটিকে এমনভাবে বিবেচনা করে যেন বিষয়বস্তুর কপিগুলো ধ্বংস করা হয়েছে এবং আইডি সত্যায়নের সমস্ত প্রচেষ্টা প্রত্যাখ্যান করে। এটি নিচে বর্ণিত পদ্ধতি অনুযায়ী স্টোরেজটিতে সাইনিং বা MAC করার মাধ্যমে বাস্তবায়ন করা হয়।
  • স্টোরেজটি মূল আইডেন্টিফায়ারগুলো সংরক্ষণ করে না। যেহেতু আইডি অ্যাটেস্টেশনে একটি চ্যালেঞ্জ জড়িত থাকে, তাই কলার সর্বদা অ্যাটেস্ট করার জন্য আইডেন্টিফায়ারগুলো সরবরাহ করে। TEE-কে শুধু যাচাই করতে হয় যে এগুলো তাদের মূল মানের সাথে মেলে কিনা। মূল মানগুলোর পরিবর্তে সেগুলোর সুরক্ষিত হ্যাশ সংরক্ষণ করা এই যাচাইকরণকে সম্ভব করে তোলে।

নির্মাণ

উপরে তালিকাভুক্ত বৈশিষ্ট্যসম্পন্ন একটি ইমপ্লিমেন্টেশন তৈরি করতে, আইডি-থেকে-প্রাপ্ত মানগুলি নিম্নলিখিত কনস্ট্রাকশন S-এ সংরক্ষণ করুন। সিস্টেমের স্বাভাবিক স্থানগুলি ব্যতীত আইডি মানগুলির অন্য কোনো অনুলিপি সংরক্ষণ করবেন না, যে স্থানগুলি একজন ডিভাইস মালিক রুটিংয়ের মাধ্যমে পরিবর্তন করতে পারেন:

S = D || HMAC(HBK, D)

যেখানে:

  • D = HMAC(HBK, ID 1 ) || HMAC(HBK, ID 2 ) || ... || HMAC(HBK, ID n )
  • HMAC হলো একটি উপযুক্ত সুরক্ষিত হ্যাশ (SHA-256 সুপারিশকৃত) সহ HMAC গঠন।
  • HBK একটি হার্ডওয়্যার-সংযুক্ত কী যা অন্য কোনো উদ্দেশ্যে ব্যবহৃত হয় না।
  • ID 1 ...ID n হলো মূল ID মানগুলো; একটি নির্দিষ্ট সূচকের সাথে একটি নির্দিষ্ট মানের সংযোগ বাস্তবায়ন-নির্ভর, কারণ বিভিন্ন ডিভাইসে শনাক্তকারীর সংখ্যা ভিন্ন ভিন্ন হয়।
  • || সংযুক্তি বোঝায়

যেহেতু HMAC আউটপুটগুলো নির্দিষ্ট আকারের হয়, তাই স্বতন্ত্র ID হ্যাশ বা D-এর HMAC খুঁজে বের করার জন্য কোনো হেডার বা অন্য কোনো কাঠামোর প্রয়োজন হয় না। অ্যাটেস্টেশন সম্পাদনের জন্য প্রদত্ত মানগুলো যাচাই করার পাশাপাশি, ইমপ্লিমেন্টেশনগুলোকে S থেকে D বের করে, HMAC(HBK, D) গণনা করে এবং S-এর মানের সাথে তুলনা করে S-কে ভ্যালিডেট করতে হবে, যাতে কোনো স্বতন্ত্র ID পরিবর্তিত বা বিকৃত হয়নি তা নিশ্চিত করা যায়। এছাড়াও, ইমপ্লিমেন্টেশনগুলোকে অবশ্যই সমস্ত স্বতন্ত্র ID এলিমেন্টের জন্য এবং S-এর ভ্যালিডেশনের জন্য কনস্ট্যান্ট-টাইম কম্প্যারিসন ব্যবহার করতে হবে। প্রদত্ত ID-এর সংখ্যা এবং পরীক্ষার যেকোনো অংশের সঠিক মিল নির্বিশেষে তুলনার সময় অবশ্যই স্থির থাকতে হবে।

হার্ডওয়্যার শনাক্তকারী

আইডি অ্যাটেস্টেশন নিম্নলিখিত হার্ডওয়্যার আইডেন্টিফায়ারগুলিকে সমর্থন করে:

  1. অ্যান্ড্রয়েডে Build.BRAND দ্বারা প্রাপ্ত ব্র্যান্ডের নাম
  2. অ্যান্ড্রয়েডে Build.DEVICE দ্বারা প্রাপ্ত ডিভাইসের নাম।
  3. অ্যান্ড্রয়েডে Build.PRODUCT দ্বারা প্রাপ্ত পণ্যের নাম।
  4. অ্যান্ড্রয়েডে Build.MANUFACTURER দ্বারা প্রাপ্ত প্রস্তুতকারকের নাম।
  5. অ্যান্ড্রয়েডে Build.MODEL দ্বারা প্রাপ্ত মডেলের নাম।
  6. ক্রমিক সংখ্যা
  7. সমস্ত রেডিওর IMEI
  8. সকল রেডিওর MEID

ডিভাইস আইডি অ্যাটেস্টেশন সমর্থন করার জন্য, একটি ডিভাইস এই আইডেন্টিফায়ারগুলো অ্যাটেস্ট করে। অ্যান্ড্রয়েড চালিত সমস্ত ডিভাইসে প্রথম ছয়টি আইডেন্টিফায়ার থাকে এবং এই ফিচারটি কাজ করার জন্য সেগুলো অপরিহার্য। যদি ডিভাইসটিতে কোনো ইন্টিগ্রেটেড সেলুলার রেডিও থাকে, তবে ডিভাইসটিকে অবশ্যই সেই রেডিওগুলোর 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 সাথে ব্যর্থ হবে।

যদি ডিভাইসটি আইডি অ্যাটেস্টেশন সমর্থন করে এবং একটি কী অ্যাটেস্টেশন অনুরোধে উপরের এক বা একাধিক ট্যাগ অন্তর্ভুক্ত করা হয়ে থাকে, তাহলে TEE যাচাই করে দেখে যে প্রতিটি ট্যাগের সাথে সরবরাহ করা আইডেন্টিফায়ারটি তার হার্ডওয়্যার আইডেন্টিফায়ারের কপির সাথে মেলে কিনা। যদি এক বা একাধিক আইডেন্টিফায়ার না মেলে, তাহলে সম্পূর্ণ অ্যাটেস্টেশনটি ErrorCode::CANNOT_ATTEST_IDS সহ ব্যর্থ হয়। একই ট্যাগ একাধিকবার সরবরাহ করা বৈধ। এটি কার্যকর হতে পারে, উদাহরণস্বরূপ, IMEI অ্যাটেস্ট করার সময়: একটি ডিভাইসে একাধিক IMEI সহ একাধিক রেডিও থাকতে পারে। একটি অ্যাটেস্টেশন অনুরোধ তখনই বৈধ হবে যদি প্রতিটি ATTESTATION_ID_IMEI এর সাথে সরবরাহ করা মান ডিভাইসটির কোনো একটি রেডিওর সাথে মেলে। একই নিয়ম অন্য সব ট্যাগের ক্ষেত্রেও প্রযোজ্য।

যদি অ্যাটেস্টেশন সফল হয়, তাহলে উপরের স্কিমা ব্যবহার করে ইস্যু করা অ্যাটেস্টেশন সার্টিফিকেটের অ্যাটেস্টেশন এক্সটেনশনে (OID 1.3.6.1.4.1.11129.2.1.17) অ্যাটেস্টেড আইডিগুলো যোগ করা হয়। Keymaster 2 অ্যাটেস্টেশন স্কিমা থেকে করা পরিবর্তনগুলো মন্তব্যসহ বোল্ড করে দেখানো হয়েছে।

জাভা এপিআই

এই অংশটি শুধুমাত্র তথ্যমূলক। Keymaster বাস্তবায়নকারীরা জাভা এপিআই (Java API) বাস্তবায়ন বা ব্যবহার করেন না। অ্যাপগুলো কীভাবে এই ফিচারটি ব্যবহার করে, তা বাস্তবায়নকারীদের বুঝতে সাহায্য করার জন্যই এটি প্রদান করা হয়েছে। সিস্টেমের উপাদানগুলো এটি ভিন্নভাবে ব্যবহার করতে পারে, যে কারণে এই অংশটিকে আদর্শ হিসেবে গণ্য না করাটা অত্যন্ত গুরুত্বপূর্ণ।