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

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

তবে, এটি কেবল তখনই সত্য যখন কীস্টোর কীগুলো হার্ডওয়্যার-সমর্থিত স্টোরেজে আছে বলে জানা যায়। কীমাস্টার ১-এ, অ্যাপ বা রিমোট সার্ভারগুলোর পক্ষে নির্ভরযোগ্যভাবে যাচাই করার কোনো উপায় ছিল না যে বিষয়টি সেরকমই ছিল কিনা। কীস্টোর ডেমনটি উপলব্ধ কীমাস্টার হার্ডওয়্যার অ্যাবস্ট্রাকশন লেয়ার (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 Secure as long as StrongBox is not compromised. StrongBox is implemented in a secure element similar to a hardware security module. The implementation requirements for StrongBox are defined in section 9.11.2 of the Android Compatibility Definition Document. StrongBox is highly resistant to remote compromise and compromise by direct hardware attack (for example, physical tampering and side-channel attacks).

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

Each field corresponds to a Keymaster/KeyMint authorization tag from the AIDL interface specification . The specification is the source of truth about authorization tags: their meaning, the format of their contents, whether they are expected to appear in the softwareEnforced or hardwareEnforced fields in the KeyDescription object, whether they are mutually exclusive with other tags, etc. All AuthorizationList fields are optional.

Each field has an EXPLICIT context-specific tag equal to the KeyMint or Keymaster tag number, which enables a more compact representation of the data in the AuthorizationList . The ASN.1 parser must therefore know the expected data type for each context-specific tag. For example, Tag::USER_AUTH_TYPE is defined as ENUM | 504 . In the attestation extension schema, the purpose field in the AuthorizationList is specified as userAuthType [504] EXPLICIT INTEGER OPTIONAL . Its ASN.1 encoding will therefore contain the context-specific tag 504 instead of the UNIVERSAL class tag for the ASN.1 type INTEGER , which is 10 .

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

A set of SHA-256 digests of the app's signing certificates. An app can have multiple signing key certificate chains. For each, the "leaf" certificate is digested and placed in the signature_digests field. The field name is misleading, since the digested data is the app's signing certificates, not the app signatures, because it is named for the Signature class returned by a call to getPackageInfo() . The following code snippet shows an example set:

{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-এর মতোই দ্বিতীয়টিকেও সত্যায়িত করতে পারে।

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

Android 8.0 includes optional support for ID attestation for devices with Keymaster 3. ID attestation allows the device to provide proof of its hardware identifiers, such as serial number or IMEI. Although an optional feature, it is highly recommended that all Keymaster 3 implementations provide support for it because being able to prove the device's identity enables use cases such as true zero-touch remote configuration to be more secure (because the remote side can be certain it is talking to the right device, not a device spoofing its identity).

ID attestation works by creating copies of the device's hardware identifiers that only the TEE can access before the device leaves the factory. A user can unlock the device's bootloader and change the system software and the identifiers reported by the Android frameworks. The copies of the identifiers held by the TEE cannot be manipulated in this way, ensuring that device ID attestation only attests to the device's original hardware identifiers, thereby thwarting spoofing attempts.

The main API surface for ID attestation builds on top of the existing key attestation mechanism introduced with Keymaster 2. When requesting an attestation certificate for a key held by Keymaster, the caller can request that the device's hardware identifiers be included in the attestation certificate's metadata. If the key is held in the TEE, the certificate chains back to a known root of trust. The recipient of such a certificate can verify that the certificate and its contents, including the hardware identifiers, were written by the TEE. When asked to include hardware identifiers in the attestation certificate, the TEE attests only to the identifiers held in its storage, as populated on the factory floor.

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

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

  • ডিভাইসটি কারখানা থেকে বের হওয়ার আগেই এর মূল শনাক্তকারীগুলো থেকে প্রাপ্ত মানগুলো স্টোরেজে কপি করা হয়।
  • The destroyAttestationIds() method can permanently destroy this copy of the identifier-derived data. Permanent destruction means the data is completely removed so neither a factory reset nor any other procedure performed on the device can restore it. This is especially important for devices where a user has unlocked the bootloader and changed the system software and modified the identifiers returned by Android frameworks.
  • আরএমএ (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 মানগুলো; একটি নির্দিষ্ট সূচকের সাথে একটি নির্দিষ্ট মানের সংযোগ বাস্তবায়ন-নির্ভর, কারণ বিভিন্ন ডিভাইসে শনাক্তকারীর সংখ্যা ভিন্ন ভিন্ন হয়।
  • || সংযুক্তি বোঝায়

Because the HMAC outputs are fixed size, no headers or other structure are required to be able to find individual ID hashes, or the HMAC of D. In addition to checking provided values to perform attestation, implementations need to validate S by extracting D from S, computing HMAC(HBK, D) and comparing it to the value in S to verify that no individual IDs were modified/corrupted. Also, implementations must use constant-time comparisons for all individual ID elements and the validation of S. Comparison time must be constant regardless of the number of IDs provided and the correct matching of any part of the test.

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

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

  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 সাথে ব্যর্থ হবে।

If the device supports ID attestation and one or more of the above tags have been included in a key attestation request, the TEE verifies the identifier supplied with each of the tags matches its copy of the hardware identifiers. If one or more identifiers do not match, the entire attestation fails with ErrorCode::CANNOT_ATTEST_IDS . It is valid for the same tag to be supplied multiple times. This can be useful, for example, when attesting IMEIs: A device can have multiple radios with multiple IMEIs. An attestation request is valid if the value supplied with each ATTESTATION_ID_IMEI matches one of the device's radios. The same applies to all other tags.

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

জাভা এপিআই

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