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

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

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

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

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

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

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

কী প্রত্যয়ন সমর্থন করার জন্য, অ্যান্ড্রয়েড 7.0 HAL-তে ট্যাগ, ধরণ এবং পদ্ধতির একটি সেট চালু করেছে।

ট্যাগ

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

আদর্শ

কীমাস্টার ২ এবং তার নিচের

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_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 হল আউটপুট প্যারামিটার, যা সার্টিফিকেটের একটি অ্যারে ফেরত দেয়। এন্ট্রি 0 হল অ্যাটেস্টেশন সার্টিফিকেট, যার অর্থ এটি keyToAttest থেকে কীটি সার্টিফিকেট করে এবং এতে অ্যাটেস্টেশন এক্সটেনশন থাকে।

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

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

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

প্রত্যয়ন শংসাপত্রে নীচের টেবিলের ক্ষেত্রগুলি রয়েছে এবং কোনও অতিরিক্ত ক্ষেত্র থাকতে পারে না। কিছু ক্ষেত্র একটি নির্দিষ্ট ক্ষেত্রের মান নির্দিষ্ট করে। CTS পরীক্ষাগুলি যাচাই করে যে শংসাপত্রের বিষয়বস্তু ঠিক যেমনটি সংজ্ঞায়িত করা হয়েছে।

সার্টিফিকেট সিকোয়েন্স

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

টিবিএস সার্টিফিকেট সিকোয়েন্স

ক্ষেত্রের নাম ( RFC 5280 দেখুন) মূল্য
version পূর্ণসংখ্যা ২ (মানে v3 সার্টিফিকেট)
serialNumber পূর্ণসংখ্যা ১ (নির্দিষ্ট মান: সকল সার্টিফিকেটের ক্ষেত্রে একই)
signature অ্যালগরিদম সাইন কী-এর জন্য ব্যবহৃত অ্যালগরিদমের শনাক্তকারী: EC কী-এর জন্য ECDSA, RSA কী-এর জন্য RSA।
issuer ব্যাচ অ্যাটেস্টেশন কী-এর বিষয় ক্ষেত্রের মতোই।
validity দুটি তারিখের SEQUENCE, যার মান Tag::ACTIVE_DATETIME এবং Tag::USAGE_EXPIRE_DATETIME । এই মানগুলি ১ জানুয়ারী, ১৯৭০ থেকে মিলিসেকেন্ডে। সার্টিফিকেটগুলিতে সঠিক তারিখ উপস্থাপনের জন্য RFC 5280 দেখুন।
যদি Tag::ACTIVE_DATETIME উপস্থিত না থাকে, তাহলে Tag::CREATION_DATETIME এর মান ব্যবহার করুন। যদি Tag::USAGE_EXPIRE_DATETIME উপস্থিত না থাকে, তাহলে ব্যাচ অ্যাটেস্টেশন কী সার্টিফিকেটের মেয়াদ শেষ হওয়ার তারিখ ব্যবহার করুন।
subject CN = "Android Keystore Key" (নির্দিষ্ট মান: সকল সার্টিফিকেটের ক্ষেত্রে একই)
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; নীচের Attestation এক্সটেনশন বিভাগে বিষয়বস্তু সংজ্ঞায়িত করা হয়েছে। সমস্ত X.509 সার্টিফিকেট এক্সটেনশনের মতো, বিষয়বস্তুটি একটি OCTET_STRING হিসাবে উপস্থাপিত হয় যাতে attestation SEQUENCE এর একটি DER এনকোডিং থাকে।

প্রত্যয়ন এক্সটেনশন

attestation এক্সটেনশনটিতে OID 1.3.6.1.4.1.11129.2.1.17 রয়েছে। এতে প্রত্যয়িত কী জোড়া এবং কী জেনারেশনের সময় ডিভাইসের অবস্থা সম্পর্কে তথ্য রয়েছে।

AIDL ইন্টারফেস স্পেসিফিকেশনে সংজ্ঞায়িত Keymaster/KeyMint ট্যাগের ধরণগুলি নিম্নরূপ ASN.1 প্রকারে অনুবাদ করা হয়েছে:

কীমিন্ট বা কীমাস্টার টাইপ 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 ১ জানুয়ারী, ১৯৭০ থেকে মিলিসেকেন্ড ০০:০০:০০ GMT।
BOOL NULL ট্যাগের উপস্থিতি মানে সত্য, অনুপস্থিতি মানে মিথ্যা।
BIGNUM কোনও ট্যাগে এই ধরণের তথ্য নেই, তাই কোনও ম্যাপিং সংজ্ঞায়িত করা হয়নি।
BYTES OCTET_STRING

স্কিমা

প্রত্যয়ন এক্সটেনশন কন্টেন্ট নিম্নলিখিত ASN.1 স্কিমা দ্বারা বর্ণনা করা হয়েছে:

সংস্করণ 400

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

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

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

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

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

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

সংস্করণ 300

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

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

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

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

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

সংস্করণ ২০০

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

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

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

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

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

সংস্করণ ১০০

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

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

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

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

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

সংস্করণ ৪

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

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

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

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

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

সংস্করণ ৩

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

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

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

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

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

সংস্করণ ২

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 স্কিমা সংস্করণ।
মূল্য কীমিন্ট অথবা কীমাস্টার সংস্করণ
কীমাস্টার সংস্করণ ২.০
কীমাস্টার সংস্করণ 3.0
কীমাস্টার সংস্করণ ৪.০
কীমাস্টার সংস্করণ ৪.১
১০০ কীমিন্ট সংস্করণ ১.০
২০০ কীমিন্ট সংস্করণ 2.0
৩০০ কীমিন্ট সংস্করণ 3.0
৪০০ কীমিন্ট সংস্করণ ৪.০
attestationSecurityLevel

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

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

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

SecurityLevel মানটি নির্দেশ করে যে একটি Keystore-সম্পর্কিত উপাদান (উদাহরণস্বরূপ, কী জোড়া এবং প্রত্যয়ন) আক্রমণের জন্য কতটা স্থিতিস্থাপক।

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

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

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

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

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

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

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

keySize
Tag::KEY_SIZE অনুমোদন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 3 এর ট্যাগ আইডি মান ব্যবহার করে।
blockMode
Tag::BLOCK_MODE অনুমোদন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 4 এর ট্যাগ আইডি মান ব্যবহার করে।
digest
Tag::DIGEST অনুমোদন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 5 এর ট্যাগ আইডি মান ব্যবহার করে।
padding
Tag::PADDING অনুমোদন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 6 এর ট্যাগ আইডি মান ব্যবহার করে।
callerNonce
Tag::CALLER_NONCE অনুমোদন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 7 এর ট্যাগ আইডি মান ব্যবহার করে।
minMacLength
Tag::MIN_MAC_LENGTH অনুমোদন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 8 এর ট্যাগ আইডি মান ব্যবহার করে।
ecCurve

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

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

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

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

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

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

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

earlyBootOnly

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

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

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

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

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

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

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

trustedUserPresenceReq

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

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

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

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

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

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

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

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

unlockedDeviceReq

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

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

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

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

rootOfTrust

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

আরও বিস্তারিত জানার জন্য, RootOfTrust ডেটা স্ট্রাকচার বর্ণনাকারী বিভাগটি দেখুন।

osVersion

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

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

শুধুমাত্র Keymaster সংস্করণ 1.0 বা উচ্চতর সংস্করণেই অনুমোদনের তালিকায় এই মানটি অন্তর্ভুক্ত রয়েছে।

osPatchLevel

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

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

শুধুমাত্র Keymaster সংস্করণ 1.0 বা উচ্চতর সংস্করণেই অনুমোদনের তালিকায় এই মানটি অন্তর্ভুক্ত রয়েছে।

attestationApplicationId

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

Tag::ATTESTATION_APPLICATION_ID অনুমোদন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা ৭০৯ এর ট্যাগ আইডি মান ব্যবহার করে।

আরও বিস্তারিত জানার জন্য, AttestationApplicationId ডেটা স্ট্রাকচার বর্ণনাকারী বিভাগটি দেখুন।

attestationIdBrand

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

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

attestationIdDevice

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

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

attestationIdProduct

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

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

attestationIdSerial

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

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

attestationIdImei

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

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

attestationIdMeid

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

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

attestationIdManufacturer

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

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

attestationIdModel

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

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

vendorPatchLevel

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

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

এই কী ব্যবহারের জন্য ডিভাইসে ইনস্টল করা আবশ্যক এমন বিক্রেতার চিত্রের সুরক্ষা প্যাচ স্তর নির্দিষ্ট করে। মানটি YYYYMMDD আকারে প্রদর্শিত হয়, যা বিক্রেতার সুরক্ষা প্যাচের তারিখ উপস্থাপন করে। উদাহরণস্বরূপ, যদি বিক্রেতার ১ আগস্ট, ২০১৮ এর সুরক্ষা প্যাচ ইনস্টল থাকা অবস্থায় কোনও Android ডিভাইসে একটি কী তৈরি করা হয়, তাহলে এই মানটি হবে 20180801।

bootPatchLevel

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

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

এই কী ব্যবহারের জন্য ডিভাইসে ইনস্টল করা আবশ্যক কার্নেল ইমেজ সিকিউরিটি প্যাচ লেভেল নির্দিষ্ট করে। মানটি YYYYMMDD আকারে প্রদর্শিত হয়, যা সিস্টেম সিকিউরিটি প্যাচের তারিখ উপস্থাপন করে। উদাহরণস্বরূপ, যদি সিস্টেমের ৫ আগস্ট, ২০১৮ সিকিউরিটি প্যাচ ইনস্টল থাকা অবস্থায় একটি অ্যান্ড্রয়েড ডিভাইসে একটি কী তৈরি করা হয়, তাহলে এই মান হবে ২০১৮০৮০৫।

deviceUniqueAttestation

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

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

attestationIdSecondImei

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

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

moduleHash

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

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

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

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

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

মূল্য সংশ্লিষ্ট বুট অবস্থা অর্থ
Verified GREEN একটি সম্পূর্ণ বিশ্বাসের শৃঙ্খল একটি হার্ডওয়্যার-সুরক্ষিত রুট অফ ট্রাস্ট থেকে বুটলোডার এবং Verified Boot দ্বারা যাচাইকৃত সমস্ত পার্টিশন পর্যন্ত বিস্তৃত। এই অবস্থায়, verifiedBootKey ফিল্ডে এমবেডেড রুট অফ ট্রাস্টের হ্যাশ থাকে, যা কারখানায় ডিভাইস প্রস্তুতকারকের দ্বারা ডিভাইসের ROM-এ এমবেড করা শংসাপত্র।
SelfSigned YELLOW Verified এর মতোই, তবে যাচাইকরণটি কারখানায় প্রস্তুতকারকের দ্বারা এমবেড করা রুট অফ ট্রাস্টের পরিবর্তে ব্যবহারকারী দ্বারা কনফিগার করা রুট অফ ট্রাস্ট ব্যবহার করে করা হয়েছিল। এই অবস্থায়, verifiedBootKey ফিল্ডে ব্যবহারকারী দ্বারা কনফিগার করা পাবলিক কী-এর হ্যাশ থাকে।
Unverified ORANGE ডিভাইসের বুটলোডারটি আনলক করা আছে, তাই বিশ্বাসের একটি শৃঙ্খল স্থাপন করা যাচ্ছে না। ডিভাইসটি অবাধে পরিবর্তন করা যেতে পারে, তাই ডিভাইসের অখণ্ডতা ব্যান্ডের বাইরে থাকা ব্যবহারকারী দ্বারা যাচাই করা আবশ্যক। এই অবস্থায় verifiedBootKey ফিল্ডে 32 বাইট শূন্য থাকে।
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 ডাইজেস্টের একটি সেট। একটি অ্যাপে একাধিক সাইনিং কী সার্টিফিকেট চেইন থাকতে পারে। প্রতিটির জন্য, "leaf" সার্টিফিকেট ডাইজেস্ট করা হয় এবং 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 হল একটি অনন্য হার্ডওয়্যার-আবদ্ধ গোপন তথ্য যা বিশ্বস্ত এক্সিকিউশন এনভায়রনমেন্টের কাছে পরিচিত এবং এটি কখনও প্রকাশ করে না। গোপন তথ্যটিতে কমপক্ষে 128 বিট এনট্রপি রয়েছে এবং এটি প্রতিটি ডিভাইসের জন্য অনন্য (128 বিট এনট্রপির কারণে সম্ভাব্য স্বতন্ত্রতা গ্রহণযোগ্য)। HBK HMAC বা AES_CMAC এর মাধ্যমে ফিউজড কী উপাদান থেকে প্রাপ্ত করা উচিত।

HMAC_SHA256 আউটপুটটি 128 বিটে ছোট করুন।

একাধিক IMEI

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

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

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

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

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

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

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

ডিভাইসের শনাক্তকারী ধারণকারী স্টোরেজে এই বৈশিষ্ট্যগুলি থাকা প্রয়োজন:

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

নির্মাণ

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

S = D || HMAC(HBK, D)

কোথায়:

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

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

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

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

  1. অ্যান্ড্রয়েডে Build.BRAND দ্বারা প্রদত্ত ব্র্যান্ড নাম
  2. ডিভাইসের নাম, যেমনটি Build.DEVICE দ্বারা Android-এ ফেরত দেওয়া হয়েছে
  3. Android-এ Build.PRODUCT দ্বারা প্রদত্ত পণ্যের নাম
  4. Android-এ Build.MANUFACTURER দ্বারা প্রদত্ত প্রস্তুতকারকের নাম
  5. মডেল নাম, যেমনটি Build.MODEL দ্বারা Android-এ ফেরত দেওয়া হয়েছে
  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 সত্যায়ন স্কিমা থেকে পরিবর্তনগুলি মন্তব্য সহ বোল্ড করা হবে।

জাভা এপিআই

এই বিভাগটি শুধুমাত্র তথ্যের জন্য। কীমাস্টার ইমপ্লিমেন্টাররা জাভা এপিআই বাস্তবায়ন বা ব্যবহার করে না। এটি বাস্তবায়নকারীদের বুঝতে সাহায্য করার জন্য প্রদান করা হয়েছে যে অ্যাপগুলি কীভাবে বৈশিষ্ট্যটি ব্যবহার করে। সিস্টেমের উপাদানগুলি এটি ভিন্নভাবে ব্যবহার করতে পারে, যে কারণে এই বিভাগটিকে আদর্শিক হিসাবে বিবেচনা না করা অত্যন্ত গুরুত্বপূর্ণ।