কীস্টোর একটি নিয়ন্ত্রিত উপায়ে ক্রিপ্টোগ্রাফিক কী তৈরি, সংরক্ষণ এবং ব্যবহার করার জন্য আরও সুরক্ষিত একটি স্থান প্রদান করে। যখন হার্ডওয়্যার-সমর্থিত কী স্টোরেজ উপলব্ধ থাকে এবং ব্যবহৃত হয়, তখন ডিভাইস থেকে কী উপাদান নিষ্কাশনের বিরুদ্ধে আরও সুরক্ষিত থাকে, এবং কীমিন্ট (পূর্বে কীমাস্টার) এমন বিধিনিষেধ প্রয়োগ করে যা লঙ্ঘন করা কঠিন।
তবে, এটি কেবল তখনই সত্য যখন কীস্টোর কীগুলো হার্ডওয়্যার-সমর্থিত স্টোরেজে আছে বলে জানা যায়। কীমাস্টার ১-এ, অ্যাপ বা রিমোট সার্ভারগুলোর পক্ষে নির্ভরযোগ্যভাবে যাচাই করার কোনো উপায় ছিল না যে বিষয়টি সেরকমই ছিল কিনা। কীস্টোর ডেমনটি উপলব্ধ কীমাস্টার হার্ডওয়্যার অ্যাবস্ট্রাকশন লেয়ার (HAL) লোড করত এবং কীগুলোর হার্ডওয়্যার সমর্থনের বিষয়ে HAL যা বলত, তাই বিশ্বাস করত।
এর প্রতিকার হিসেবে অ্যান্ড্রয়েড ৭.০-তে (কীমাস্টার ২) কী অ্যাটেস্টেশন এবং অ্যান্ড্রয়েড ৮.০-তে (কীমাস্টার ৩) আইডি অ্যাটেস্টেশন চালু করা হয়েছিল।
কী অ্যাটেস্টেশনের লক্ষ্য হলো একটি অ্যাসিমেট্রিক কী পেয়ার হার্ডওয়্যার-সমর্থিত কিনা, কী-টির বৈশিষ্ট্য কী এবং এর ব্যবহারে কী কী সীমাবদ্ধতা প্রযোজ্য, তা দৃঢ়ভাবে নির্ধারণ করার একটি উপায় প্রদান করা।
আইডি অ্যাটেস্টেশন ডিভাইসটিকে তার হার্ডওয়্যার শনাক্তকারী, যেমন সিরিয়াল নম্বর বা IMEI-এর প্রমাণ সরবরাহ করার সুযোগ দেয়।
মূল প্রত্যয়ন
কী অ্যাটেস্টেশন সমর্থন করার জন্য, অ্যান্ড্রয়েড ৭.০ HAL-এ এক সেট ট্যাগ, টাইপ এবং মেথড চালু করেছে।
ট্যাগ
-
Tag::ATTESTATION_CHALLENGE -
Tag::INCLUDE_UNIQUE_ID -
Tag::RESET_SINCE_ID_ROTATION
প্রকার
Keymaster 2 এবং এর নিচের
typedef struct {
keymaster_blob_t* entries;
size_t entry_count;
} keymaster_cert_chain_t;
AttestKey পদ্ধতি
কীমাস্টার ৩
attestKey(vec<uint8_t> keyToAttest, vec<KeyParameter> attestParams)
generates(ErrorCode error, vec<vec<uint8_t>> certChain);Keymaster 2 এবং এর নিচের
keymaster_error_t (*attest_key)(const struct keymaster2_device* dev,
const keymaster_key_blob_t* key_to_attest,
const keymaster_key_param_set_t* attest_params,
keymaster_cert_chain_t* cert_chain);
-
devহলো Keymaster ডিভাইসের কাঠামো। -
keyToAttestহলোgenerateKeyথেকে প্রাপ্ত কী ব্লব, যার জন্য অ্যাটেস্টেশনটি তৈরি করা হয়। -
attestParamsহলো অ্যাটেস্টেশনের জন্য প্রয়োজনীয় প্যারামিটারগুলোর একটি তালিকা। এর মধ্যে রয়েছেTag::ATTESTATION_CHALLENGEএবং সম্ভবতTag::RESET_SINCE_ID_ROTATION, সেইসাথেTag::APPLICATION_IDএবংTag::APPLICATION_DATA। কী জেনারেশনের সময় নির্দিষ্ট করা হয়ে থাকলে, কী ব্লব ডিক্রিপ্ট করার জন্য শেষের দুটি প্যারামিটার প্রয়োজন। -
certChainহলো আউটপুট প্যারামিটার, যা সার্টিফিকেটগুলোর একটি অ্যারে রিটার্ন করে। এন্ট্রি ০ হলো অ্যাটেস্টেশন সার্টিফিকেট, অর্থাৎ এটিkeyToAttestথেকে প্রাপ্ত কী-টিকে সার্টিফাই করে এবং এতে অ্যাটেস্টেশন এক্সটেনশনটি থাকে।
attestKey মেথডটিকে অ্যাটেস্টেড কী-এর উপর একটি পাবলিক কী অপারেশন হিসেবে বিবেচনা করা হয়, কারণ এটি যেকোনো সময় কল করা যেতে পারে এবং এর জন্য কোনো অথরাইজেশন সীমাবদ্ধতা পূরণের প্রয়োজন হয় না। উদাহরণস্বরূপ, যদি অ্যাটেস্টেড কী ব্যবহারের জন্য ব্যবহারকারীর প্রমাণীকরণের প্রয়োজন হয়, তবে ব্যবহারকারীর প্রমাণীকরণ ছাড়াই একটি অ্যাটেস্টেশন তৈরি করা যেতে পারে।
প্রত্যয়নপত্র
অ্যাটেস্টেশন সার্টিফিকেটটি একটি স্ট্যান্ডার্ড X.509 সার্টিফিকেট, যার সাথে একটি ঐচ্ছিক অ্যাটেস্টেশন এক্সটেনশন থাকে এবং এতে অ্যাটেস্টেড কী-এর একটি বিবরণ থাকে। সার্টিফিকেটটি একটি সার্টিফাইড অ্যাটেস্টেশন কী দ্বারা স্বাক্ষরিত হয়। অ্যাটেস্টেশন কী-টি, যে কী-টি অ্যাটেস্টেড করা হচ্ছে তার থেকে ভিন্ন অ্যালগরিদম ব্যবহার করতে পারে।
প্রত্যয়ন সার্টিফিকেটে নিচের সারণিতে উল্লেখিত ফিল্ডগুলো থাকে এবং এতে কোনো অতিরিক্ত ফিল্ড থাকতে পারে না। কিছু ফিল্ডের জন্য একটি নির্দিষ্ট মান উল্লেখ করা থাকে। CTS পরীক্ষার মাধ্যমে যাচাই করা হয় যে সার্টিফিকেটের বিষয়বস্তু ঠিক সংজ্ঞায়িত মান অনুযায়ীই আছে।
সার্টিফিকেট ক্রম
| ক্ষেত্রের নাম ( RFC 5280 দেখুন) | মূল্য |
|---|---|
| টিবিএস সার্টিফিকেট | টিবিএস সার্টিফিকেট ক্রম |
| স্বাক্ষর অ্যালগরিদম | কী-টি স্বাক্ষর করতে ব্যবহৃত অ্যালগরিদমের অ্যালগরিদমআইডেন্টিফায়ার: EC কীগুলির জন্য ECDSA, RSA কীগুলির জন্য RSA৷ |
| স্বাক্ষরমান | বিট স্ট্রিং, ASN.1 DER-এনকোডেড tbsCertificate-এর উপর গণনাকৃত স্বাক্ষর। |
টিবিএস সার্টিফিকেট ক্রম
| ক্ষেত্রের নাম ( RFC 5280 দেখুন) | মূল্য |
|---|---|
version | পূর্ণসংখ্যা ২ (মানে ভি৩ সার্টিফিকেট) |
serialNumber | পূর্ণসংখ্যা ১ (স্থির মান: সকল সার্টিফিকেটে একই) |
signature | কী স্বাক্ষর করতে ব্যবহৃত অ্যালগরিদমের অ্যালগরিদমআইডেন্টিফায়ার: EC কী-এর জন্য ECDSA, RSA কী-এর জন্য RSA। |
issuer | ব্যাচ অ্যাটেস্টেশন কী-এর সাবজেক্ট ফিল্ডের মতোই। |
validity | দুটি তারিখের একটি অনুক্রম, যাতে Tag::ACTIVE_DATETIME এবং Tag::USAGE_EXPIRE_DATETIME এর মানগুলো রয়েছে। এই মানগুলো ১ জানুয়ারী, ১৯৭০ থেকে মিলিসেকেন্ডে পরিমাপ করা হয়। সার্টিফিকেটে সঠিক তারিখ উপস্থাপনার জন্য RFC 5280 দেখুন।যদি Tag::ACTIVE_DATETIME উপস্থিত না থাকে, তাহলে Tag::CREATION_DATETIME এর মান ব্যবহার করুন। যদি Tag::USAGE_EXPIRE_DATETIME উপস্থিত না থাকে, তাহলে ব্যাচ অ্যাটেস্টেশন কী সার্টিফিকেটের মেয়াদ শেষ হওয়ার তারিখ ব্যবহার করুন। |
subject | CN = "অ্যান্ড্রয়েড কীস্টোর কী" (স্থির মান: সকল সার্টিফিকেটে একই) |
subjectPublicKeyInfo | SubjectPublicKeyInfo-তে সত্যায়িত পাবলিক কী রয়েছে। |
extensions/Key Usage | ডিজিটাল সিগনেচার: যদি কী-টির উদ্দেশ্য KeyPurpose::SIGN বা KeyPurpose::VERIFY , তবে এটি সেট করা হয়। অন্য সব বিট আনসেট থাকে। |
extensions/CRL Distribution Points | মূল্য নির্ধারণ করা হবে |
extensions/"attestation" | OID-টি হলো 1.3.6.1.4.1.11129.2.1.17; এর বিষয়বস্তু নিচের অ্যাটেস্টেশন এক্সটেনশন বিভাগে সংজ্ঞায়িত করা হয়েছে। সমস্ত X.509 সার্টিফিকেট এক্সটেনশনের মতোই, এর বিষয়বস্তু একটি OCTET_STRING হিসেবে উপস্থাপিত হয়, যা অ্যাটেস্টেশন SEQUENCE-এর একটি DER এনকোডিং ধারণ করে। |
প্রত্যয়ন সম্প্রসারণ
attestation এক্সটেনশনটির OID হলো 1.3.6.1.4.1.11129.2.1.17 । এতে অ্যাটেস্টেশন করা হচ্ছে এমন কী পেয়ার এবং কী তৈরির সময় ডিভাইসটির অবস্থা সম্পর্কিত তথ্য থাকে।
AIDL ইন্টারফেস স্পেসিফিকেশনে সংজ্ঞায়িত Keymaster/KeyMint ট্যাগ টাইপগুলিকে নিম্নলিখিতভাবে ASN.1 টাইপে অনুবাদ করা হয়:
| KeyMint বা Keymaster টাইপ | ASN.1 প্রকার | নোট |
|---|---|---|
ENUM | INTEGER | |
ENUM_REP | SET of INTEGER | |
UINT | INTEGER | |
UINT_REP | SET of INTEGER | |
ULONG | INTEGER | |
ULONG_REP | SET of INTEGER | |
DATE | INTEGER | ১ জানুয়ারী, ১৯৭০ ০০:০০:০০ জিএমটি থেকে মিলিসেকেন্ড। |
BOOL | NULL | ট্যাগের উপস্থিতি মানে সত্য, অনুপস্থিতি মানে মিথ্যা। |
BIGNUM | কোনো ট্যাগের এই প্রকার নেই, তাই কোনো ম্যাপিং সংজ্ঞায়িত করা হয়নি। | |
BYTES | OCTET_STRING |
স্কিমা
অ্যাটেস্টেশন এক্সটেনশনের বিষয়বস্তু নিম্নলিখিত ASN.1 স্কিমা দ্বারা বর্ণিত হয়েছে। এনক্রিপ্টেড কী ইম্পোর্ট করার জন্য AuthorizationList এর ASN.1 স্কিমাটিও ব্যবহৃত হয়। যে ফিল্ডগুলো অ্যাটেস্টেশন এক্সটেনশনে প্রদর্শিত হবে না, সেগুলোকে সেভাবেই উল্লেখ করা হয়েছে।
সংস্করণ ৫০০
KeyDescription ::= SEQUENCE {
attestationVersion INTEGER, # Value 500
attestationSecurityLevel SecurityLevel,
keyMintVersion INTEGER, # Value 500
keyMintSecurityLevel SecurityLevel,
attestationChallenge OCTET_STRING,
uniqueId OCTET_STRING,
softwareEnforced AuthorizationList,
hardwareEnforced AuthorizationList,
}
SecurityLevel ::= ENUMERATED {
Software (0),
TrustedEnvironment (1),
StrongBox (2),
}
AuthorizationList ::= SEQUENCE {
purpose [1] EXPLICIT SET OF INTEGER OPTIONAL,
algorithm [2] EXPLICIT INTEGER OPTIONAL,
keySize [3] EXPLICIT INTEGER OPTIONAL,
blockMode [4] EXPLICIT SET OF INTEGER OPTIONAL,
digest [5] EXPLICIT SET OF INTEGER OPTIONAL,
padding [6] EXPLICIT SET OF INTEGER OPTIONAL,
callerNonce [7] EXPLICIT NULL OPTIONAL, # Non-attestation
minMacLength [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
ecCurve [10] EXPLICIT INTEGER OPTIONAL,
mlDsaVariant [11] EXPLICIT INTEGER OPTIONAL,
rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL,
mgfDigest [203] EXPLICIT SET OF INTEGER OPTIONAL,
rollbackResistance [303] EXPLICIT NULL OPTIONAL,
earlyBootOnly [305] EXPLICIT NULL OPTIONAL,
activeDateTime [400] EXPLICIT INTEGER OPTIONAL,
originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL,
usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL,
usageCountLimit [405] EXPLICIT INTEGER OPTIONAL,
userSecureId [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
noAuthRequired [503] EXPLICIT NULL OPTIONAL,
userAuthType [504] EXPLICIT INTEGER OPTIONAL,
authTimeout [505] EXPLICIT INTEGER OPTIONAL,
allowWhileOnBody [506] EXPLICIT NULL OPTIONAL,
trustedUserPresenceReq [507] EXPLICIT NULL OPTIONAL,
trustedConfirmationReq [508] EXPLICIT NULL OPTIONAL,
unlockedDeviceReq [509] EXPLICIT NULL OPTIONAL,
creationDateTime [701] EXPLICIT INTEGER OPTIONAL,
origin [702] EXPLICIT INTEGER OPTIONAL,
rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL,
osVersion [705] EXPLICIT INTEGER OPTIONAL,
osPatchLevel [706] EXPLICIT INTEGER OPTIONAL,
attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL,
vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL,
bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL,
deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL,
attestationIdSecondImei [723] EXPLICIT OCTET_STRING OPTIONAL,
moduleHash [724] EXPLICIT OCTET_STRING OPTIONAL,
}
Modules ::= SET OF Module
Module ::= SEQUENCE {
packageName OCTET_STRING,
version INTEGER,
}
RootOfTrust ::= SEQUENCE {
verifiedBootKey OCTET_STRING,
deviceLocked BOOLEAN,
verifiedBootState VerifiedBootState,
verifiedBootHash OCTET_STRING,
}
VerifiedBootState ::= ENUMERATED {
Verified (0),
SelfSigned (1),
Unverified (2),
Failed (3),
}
সংস্করণ ৪০০
KeyDescription ::= SEQUENCE {
attestationVersion INTEGER, # Value 400
attestationSecurityLevel SecurityLevel,
keyMintVersion INTEGER, # Value 400
keyMintSecurityLevel SecurityLevel,
attestationChallenge OCTET_STRING,
uniqueId OCTET_STRING,
softwareEnforced AuthorizationList,
hardwareEnforced AuthorizationList,
}
SecurityLevel ::= ENUMERATED {
Software (0),
TrustedEnvironment (1),
StrongBox (2),
}
AuthorizationList ::= SEQUENCE {
purpose [1] EXPLICIT SET OF INTEGER OPTIONAL,
algorithm [2] EXPLICIT INTEGER OPTIONAL,
keySize [3] EXPLICIT INTEGER OPTIONAL,
blockMode [4] EXPLICIT SET OF INTEGER OPTIONAL,
digest [5] EXPLICIT SET OF INTEGER OPTIONAL,
padding [6] EXPLICIT SET OF INTEGER OPTIONAL,
callerNonce [7] EXPLICIT NULL OPTIONAL, # Non-attestation
minMacLength [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
ecCurve [10] EXPLICIT INTEGER OPTIONAL,
rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL,
mgfDigest [203] EXPLICIT SET OF INTEGER OPTIONAL,
rollbackResistance [303] EXPLICIT NULL OPTIONAL,
earlyBootOnly [305] EXPLICIT NULL OPTIONAL,
activeDateTime [400] EXPLICIT INTEGER OPTIONAL,
originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL,
usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL,
usageCountLimit [405] EXPLICIT INTEGER OPTIONAL,
userSecureId [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
noAuthRequired [503] EXPLICIT NULL OPTIONAL,
userAuthType [504] EXPLICIT INTEGER OPTIONAL,
authTimeout [505] EXPLICIT INTEGER OPTIONAL,
allowWhileOnBody [506] EXPLICIT NULL OPTIONAL,
trustedUserPresenceReq [507] EXPLICIT NULL OPTIONAL,
trustedConfirmationReq [508] EXPLICIT NULL OPTIONAL,
unlockedDeviceReq [509] EXPLICIT NULL OPTIONAL,
creationDateTime [701] EXPLICIT INTEGER OPTIONAL,
origin [702] EXPLICIT INTEGER OPTIONAL,
rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL,
osVersion [705] EXPLICIT INTEGER OPTIONAL,
osPatchLevel [706] EXPLICIT INTEGER OPTIONAL,
attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL,
vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL,
bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL,
deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL,
attestationIdSecondImei [723] EXPLICIT OCTET_STRING OPTIONAL,
moduleHash [724] EXPLICIT OCTET_STRING OPTIONAL,
}
Modules ::= SET OF Module
Module ::= SEQUENCE {
packageName OCTET_STRING,
version INTEGER,
}
RootOfTrust ::= SEQUENCE {
verifiedBootKey OCTET_STRING,
deviceLocked BOOLEAN,
verifiedBootState VerifiedBootState,
verifiedBootHash OCTET_STRING,
}
VerifiedBootState ::= ENUMERATED {
Verified (0),
SelfSigned (1),
Unverified (2),
Failed (3),
}
সংস্করণ ৩০০
KeyDescription ::= SEQUENCE {
attestationVersion INTEGER, # Value 300
attestationSecurityLevel SecurityLevel,
keyMintVersion INTEGER, # Value 300
keymintSecurityLevel SecurityLevel,
attestationChallenge OCTET_STRING,
uniqueId OCTET_STRING,
softwareEnforced AuthorizationList,
hardwareEnforced AuthorizationList,
}
SecurityLevel ::= ENUMERATED {
Software (0),
TrustedEnvironment (1),
StrongBox (2),
}
AuthorizationList ::= SEQUENCE {
purpose [1] EXPLICIT SET OF INTEGER OPTIONAL,
algorithm [2] EXPLICIT INTEGER OPTIONAL,
keySize [3] EXPLICIT INTEGER OPTIONAL,
blockMode [4] EXPLICIT SET OF INTEGER OPTIONAL,
digest [5] EXPLICIT SET OF INTEGER OPTIONAL,
padding [6] EXPLICIT SET OF INTEGER OPTIONAL,
callerNonce [7] EXPLICIT NULL OPTIONAL, # Non-attestation
minMacLength [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
ecCurve [10] EXPLICIT INTEGER OPTIONAL,
rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL,
mgfDigest [203] EXPLICIT SET OF INTEGER OPTIONAL,
rollbackResistance [303] EXPLICIT NULL OPTIONAL,
earlyBootOnly [305] EXPLICIT NULL OPTIONAL,
activeDateTime [400] EXPLICIT INTEGER OPTIONAL,
originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL,
usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL,
usageCountLimit [405] EXPLICIT INTEGER OPTIONAL,
userSecureId [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
noAuthRequired [503] EXPLICIT NULL OPTIONAL,
userAuthType [504] EXPLICIT INTEGER OPTIONAL,
authTimeout [505] EXPLICIT INTEGER OPTIONAL,
allowWhileOnBody [506] EXPLICIT NULL OPTIONAL,
trustedUserPresenceReq [507] EXPLICIT NULL OPTIONAL,
trustedConfirmationReq [508] EXPLICIT NULL OPTIONAL,
unlockedDeviceReq [509] EXPLICIT NULL OPTIONAL,
creationDateTime [701] EXPLICIT INTEGER OPTIONAL,
origin [702] EXPLICIT INTEGER OPTIONAL,
rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL,
osVersion [705] EXPLICIT INTEGER OPTIONAL,
osPatchLevel [706] EXPLICIT INTEGER OPTIONAL,
attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL,
vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL,
bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL,
deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL,
attestationIdSecondImei [723] EXPLICIT OCTET_STRING OPTIONAL,
}
RootOfTrust ::= SEQUENCE {
verifiedBootKey OCTET_STRING,
deviceLocked BOOLEAN,
verifiedBootState VerifiedBootState,
verifiedBootHash OCTET_STRING,
}
VerifiedBootState ::= ENUMERATED {
Verified (0),
SelfSigned (1),
Unverified (2),
Failed (3),
}
সংস্করণ ২০০
KeyDescription ::= SEQUENCE {
attestationVersion INTEGER, # Value 200
attestationSecurityLevel SecurityLevel,
keyMintVersion INTEGER, # Value 200
keymintSecurityLevel SecurityLevel,
attestationChallenge OCTET_STRING,
uniqueId OCTET_STRING,
softwareEnforced AuthorizationList,
hardwareEnforced AuthorizationList,
}
SecurityLevel ::= ENUMERATED {
Software (0),
TrustedEnvironment (1),
StrongBox (2),
}
AuthorizationList ::= SEQUENCE {
purpose [1] EXPLICIT SET OF INTEGER OPTIONAL,
algorithm [2] EXPLICIT INTEGER OPTIONAL,
keySize [3] EXPLICIT INTEGER OPTIONAL,
blockMode [4] EXPLICIT SET OF INTEGER OPTIONAL,
digest [5] EXPLICIT SET OF INTEGER OPTIONAL,
padding [6] EXPLICIT SET OF INTEGER OPTIONAL,
callerNonce [7] EXPLICIT NULL OPTIONAL, # Non-attestation
minMacLength [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
ecCurve [10] EXPLICIT INTEGER OPTIONAL,
rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL,
mgfDigest [203] EXPLICIT SET OF INTEGER OPTIONAL,
rollbackResistance [303] EXPLICIT NULL OPTIONAL,
earlyBootOnly [305] EXPLICIT NULL OPTIONAL,
activeDateTime [400] EXPLICIT INTEGER OPTIONAL,
originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL,
usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL,
usageCountLimit [405] EXPLICIT INTEGER OPTIONAL,
userSecureId [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
noAuthRequired [503] EXPLICIT NULL OPTIONAL,
userAuthType [504] EXPLICIT INTEGER OPTIONAL,
authTimeout [505] EXPLICIT INTEGER OPTIONAL,
allowWhileOnBody [506] EXPLICIT NULL OPTIONAL,
trustedUserPresenceReq [507] EXPLICIT NULL OPTIONAL,
trustedConfirmationReq [508] EXPLICIT NULL OPTIONAL,
unlockedDeviceReq [509] EXPLICIT NULL OPTIONAL,
creationDateTime [701] EXPLICIT INTEGER OPTIONAL,
origin [702] EXPLICIT INTEGER OPTIONAL,
rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL,
osVersion [705] EXPLICIT INTEGER OPTIONAL,
osPatchLevel [706] EXPLICIT INTEGER OPTIONAL,
attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL,
vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL,
bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL,
deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL,
}
RootOfTrust ::= SEQUENCE {
verifiedBootKey OCTET_STRING,
deviceLocked BOOLEAN,
verifiedBootState VerifiedBootState,
verifiedBootHash OCTET_STRING,
}
VerifiedBootState ::= ENUMERATED {
Verified (0),
SelfSigned (1),
Unverified (2),
Failed (3),
}
সংস্করণ ১০০
KeyDescription ::= SEQUENCE {
attestationVersion INTEGER, # Value 100
attestationSecurityLevel SecurityLevel,
keyMintVersion INTEGER, # Value 100
keymintSecurityLevel SecurityLevel,
attestationChallenge OCTET_STRING,
uniqueId OCTET_STRING,
softwareEnforced AuthorizationList,
hardwareEnforced AuthorizationList,
}
SecurityLevel ::= ENUMERATED {
Software (0),
TrustedEnvironment (1),
StrongBox (2),
}
AuthorizationList ::= SEQUENCE {
purpose [1] EXPLICIT SET OF INTEGER OPTIONAL,
algorithm [2] EXPLICIT INTEGER OPTIONAL,
keySize [3] EXPLICIT INTEGER OPTIONAL,
digest [5] EXPLICIT SET OF INTEGER OPTIONAL,
padding [6] EXPLICIT SET OF INTEGER OPTIONAL,
callerNonce [7] EXPLICIT NULL OPTIONAL, # Non-attestation
minMacLength [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
ecCurve [10] EXPLICIT INTEGER OPTIONAL,
rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL,
mgfDigest [203] EXPLICIT SET OF INTEGER OPTIONAL,
rollbackResistance [303] EXPLICIT NULL OPTIONAL,
earlyBootOnly [305] EXPLICIT NULL OPTIONAL,
activeDateTime [400] EXPLICIT INTEGER OPTIONAL,
originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL,
usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL,
usageCountLimit [405] EXPLICIT INTEGER OPTIONAL,
userSecureId [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
noAuthRequired [503] EXPLICIT NULL OPTIONAL,
userAuthType [504] EXPLICIT INTEGER OPTIONAL,
authTimeout [505] EXPLICIT INTEGER OPTIONAL,
allowWhileOnBody [506] EXPLICIT NULL OPTIONAL,
trustedUserPresenceReq [507] EXPLICIT NULL OPTIONAL,
trustedConfirmationReq [508] EXPLICIT NULL OPTIONAL,
unlockedDeviceReq [509] EXPLICIT NULL OPTIONAL,
creationDateTime [701] EXPLICIT INTEGER OPTIONAL,
origin [702] EXPLICIT INTEGER OPTIONAL,
rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL,
osVersion [705] EXPLICIT INTEGER OPTIONAL,
osPatchLevel [706] EXPLICIT INTEGER OPTIONAL,
attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL,
vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL,
bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL,
deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL,
}
RootOfTrust ::= SEQUENCE {
verifiedBootKey OCTET_STRING,
deviceLocked BOOLEAN,
verifiedBootState VerifiedBootState,
verifiedBootHash OCTET_STRING,
}
VerifiedBootState ::= ENUMERATED {
Verified (0),
SelfSigned (1),
Unverified (2),
Failed (3),
}
সংস্করণ ৪
KeyDescription ::= SEQUENCE {
attestationVersion INTEGER, # Value 4
attestationSecurityLevel SecurityLevel,
keymasterVersion INTEGER, # Value 41
keymasterSecurityLevel SecurityLevel,
attestationChallenge OCTET_STRING,
uniqueId OCTET_STRING,
softwareEnforced AuthorizationList,
hardwareEnforced AuthorizationList,
}
SecurityLevel ::= ENUMERATED {
Software (0),
TrustedEnvironment (1),
StrongBox (2),
}
AuthorizationList ::= SEQUENCE {
purpose [1] EXPLICIT SET OF INTEGER OPTIONAL,
algorithm [2] EXPLICIT INTEGER OPTIONAL,
keySize [3] EXPLICIT INTEGER OPTIONAL,
blockMode [4] EXPLICIT SET OF INTEGER OPTIONAL,
digest [5] EXPLICIT SET OF INTEGER OPTIONAL,
padding [6] EXPLICIT SET OF INTEGER OPTIONAL,
callerNonce [7] EXPLICIT NULL OPTIONAL, # Non-attestation
minMacLength [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
ecCurve [10] EXPLICIT INTEGER OPTIONAL,
rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL,
rollbackResistance [303] EXPLICIT NULL OPTIONAL,
activeDateTime [400] EXPLICIT INTEGER OPTIONAL,
originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL,
usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL,
userSecureId [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
noAuthRequired [503] EXPLICIT NULL OPTIONAL,
userAuthType [504] EXPLICIT INTEGER OPTIONAL,
authTimeout [505] EXPLICIT INTEGER OPTIONAL,
allowWhileOnBody [506] EXPLICIT NULL OPTIONAL,
trustedUserPresenceReq [507] EXPLICIT NULL OPTIONAL,
trustedConfirmationReq [508] EXPLICIT NULL OPTIONAL,
unlockedDeviceReq [509] EXPLICIT NULL OPTIONAL,
creationDateTime [701] EXPLICIT INTEGER OPTIONAL,
origin [702] EXPLICIT INTEGER OPTIONAL,
rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL,
osVersion [705] EXPLICIT INTEGER OPTIONAL,
osPatchLevel [706] EXPLICIT INTEGER OPTIONAL,
attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL,
vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL,
bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL,
deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL,
}
RootOfTrust ::= SEQUENCE {
verifiedBootKey OCTET_STRING,
deviceLocked BOOLEAN,
verifiedBootState VerifiedBootState,
verifiedBootHash OCTET_STRING,
}
VerifiedBootState ::= ENUMERATED {
Verified (0),
SelfSigned (1),
Unverified (2),
Failed (3),
}
সংস্করণ ৩
KeyDescription ::= SEQUENCE {
attestationVersion INTEGER, # Value 3
attestationSecurityLevel SecurityLevel,
keymasterVersion INTEGER, # Value 4
keymasterSecurityLevel SecurityLevel,
attestationChallenge OCTET_STRING,
uniqueId OCTET_STRING,
softwareEnforced AuthorizationList,
hardwareEnforced AuthorizationList,
}
SecurityLevel ::= ENUMERATED {
Software (0),
TrustedEnvironment (1),
StrongBox (2),
}
AuthorizationList ::= SEQUENCE {
purpose [1] EXPLICIT SET OF INTEGER OPTIONAL,
algorithm [2] EXPLICIT INTEGER OPTIONAL,
keySize [3] EXPLICIT INTEGER OPTIONAL,
blockMode [4] EXPLICIT SET OF INTEGER OPTIONAL,
digest [5] EXPLICIT SET OF INTEGER OPTIONAL,
padding [6] EXPLICIT SET OF INTEGER OPTIONAL,
callerNonce [7] EXPLICIT NULL OPTIONAL, # Non-attestation
minMacLength [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
ecCurve [10] EXPLICIT INTEGER OPTIONAL,
rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL,
rollbackResistance [303] EXPLICIT NULL OPTIONAL,
activeDateTime [400] EXPLICIT INTEGER OPTIONAL,
originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL,
usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL,
userSecureId [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
noAuthRequired [503] EXPLICIT NULL OPTIONAL,
userAuthType [504] EXPLICIT INTEGER OPTIONAL,
authTimeout [505] EXPLICIT INTEGER OPTIONAL,
allowWhileOnBody [506] EXPLICIT NULL OPTIONAL,
trustedUserPresenceReq [507] EXPLICIT NULL OPTIONAL,
trustedConfirmationReq [508] EXPLICIT NULL OPTIONAL,
unlockedDeviceReq [509] EXPLICIT NULL OPTIONAL,
creationDateTime [701] EXPLICIT INTEGER OPTIONAL,
origin [702] EXPLICIT INTEGER OPTIONAL,
rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL,
osVersion [705] EXPLICIT INTEGER OPTIONAL,
osPatchLevel [706] EXPLICIT INTEGER OPTIONAL,
attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL,
vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL,
bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL,
}
RootOfTrust ::= SEQUENCE {
verifiedBootKey OCTET_STRING,
deviceLocked BOOLEAN,
verifiedBootState VerifiedBootState,
verifiedBootHash OCTET_STRING,
}
VerifiedBootState ::= ENUMERATED {
Verified (0),
SelfSigned (1),
Unverified (2),
Failed (3),
}
সংস্করণ ২
KeyDescription ::= SEQUENCE {
attestationVersion INTEGER, # Value 2
attestationSecurityLevel SecurityLevel,
keymasterVersion INTEGER, # Value 3
keymasterSecurityLevel SecurityLevel,
attestationChallenge OCTET_STRING,
uniqueId OCTET_STRING,
softwareEnforced AuthorizationList,
hardwareEnforced AuthorizationList,
}
SecurityLevel ::= ENUMERATED {
Software (0),
TrustedEnvironment (1),
}
AuthorizationList ::= SEQUENCE {
purpose [1] EXPLICIT SET OF INTEGER OPTIONAL,
algorithm [2] EXPLICIT INTEGER OPTIONAL,
keySize [3] EXPLICIT INTEGER OPTIONAL,
digest [5] EXPLICIT SET OF INTEGER OPTIONAL,
padding [6] EXPLICIT SET OF INTEGER OPTIONAL,
ecCurve [10] EXPLICIT INTEGER OPTIONAL,
rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL,
activeDateTime [400] EXPLICIT INTEGER OPTIONAL,
originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL,
usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL,
noAuthRequired [503] EXPLICIT NULL OPTIONAL,
userAuthType [504] EXPLICIT INTEGER OPTIONAL,
authTimeout [505] EXPLICIT INTEGER OPTIONAL,
allowWhileOnBody [506] EXPLICIT NULL OPTIONAL,
allApplications [600] EXPLICIT NULL OPTIONAL,
creationDateTime [701] EXPLICIT INTEGER OPTIONAL,
origin [702] EXPLICIT INTEGER OPTIONAL,
rollbackResistant [703] EXPLICIT NULL OPTIONAL,
rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL,
osVersion [705] EXPLICIT INTEGER OPTIONAL,
osPatchLevel [706] EXPLICIT INTEGER OPTIONAL,
attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL,
attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL,
}
RootOfTrust ::= SEQUENCE {
verifiedBootKey OCTET_STRING,
deviceLocked BOOLEAN,
verifiedBootState VerifiedBootState,
}
VerifiedBootState ::= ENUMERATED {
Verified (0),
SelfSigned (1),
Unverified (2),
Failed (3),
}
সংস্করণ ১
KeyDescription ::= SEQUENCE {
attestationVersion INTEGER, # Value 1
attestationSecurityLevel SecurityLevel,
keymasterVersion INTEGER, # Value 2
keymasterSecurityLevel SecurityLevel,
attestationChallenge OCTET_STRING,
uniqueId OCTET_STRING,
softwareEnforced AuthorizationList,
hardwareEnforced AuthorizationList,
}
SecurityLevel ::= ENUMERATED {
Software (0),
TrustedEnvironment (1),
}
AuthorizationList ::= SEQUENCE {
purpose [1] EXPLICIT SET OF INTEGER OPTIONAL,
algorithm [2] EXPLICIT INTEGER OPTIONAL,
keySize [3] EXPLICIT INTEGER OPTIONAL,
digest [5] EXPLICIT SET OF INTEGER OPTIONAL,
padding [6] EXPLICIT SET OF INTEGER OPTIONAL,
ecCurve [10] EXPLICIT INTEGER OPTIONAL,
rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL,
activeDateTime [400] EXPLICIT INTEGER OPTIONAL,
originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL,
usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL,
noAuthRequired [503] EXPLICIT NULL OPTIONAL,
userAuthType [504] EXPLICIT INTEGER OPTIONAL,
authTimeout [505] EXPLICIT INTEGER OPTIONAL,
allowWhileOnBody [506] EXPLICIT NULL OPTIONAL,
allApplications [600] EXPLICIT NULL OPTIONAL,
creationDateTime [701] EXPLICIT INTEGER OPTIONAL,
origin [702] EXPLICIT INTEGER OPTIONAL,
rollbackResistant [703] EXPLICIT NULL OPTIONAL,
rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL,
osVersion [705] EXPLICIT INTEGER OPTIONAL,
osPatchLevel [706] EXPLICIT INTEGER OPTIONAL,
}
RootOfTrust ::= SEQUENCE {
verifiedBootKey OCTET_STRING,
deviceLocked BOOLEAN,
verifiedBootState VerifiedBootState,
}
VerifiedBootState ::= ENUMERATED {
Verified (0),
SelfSigned (1),
Unverified (2),
Failed (3),
}
মূল বিবরণ ক্ষেত্রগুলি
-
attestationVersion - ASN.1 স্কিমা সংস্করণ।
মূল্য KeyMint বা Keymaster সংস্করণ ১ কীমাস্টার সংস্করণ ২.০ ২ কীমাস্টার সংস্করণ ৩.০ ৩ কীমাস্টার সংস্করণ ৪.০ ৪ কীমাস্টার সংস্করণ ৪.১ ১০০ KeyMint সংস্করণ 1.0 ২০০ KeyMint সংস্করণ 2.0 ৩০০ KeyMint সংস্করণ 3.0 ৪০০ KeyMint সংস্করণ 4.0 ৫০০ KeyMint সংস্করণ 5.0 -
attestationSecurityLevel যে স্থানে সত্যায়িত চাবিটি সংরক্ষণ করা হয়, সেই স্থানের নিরাপত্তা স্তর ।
-
keymasterVersion/keyMintVersion - KeyMint বা Keymaster HAL বাস্তবায়নের সংস্করণ।
মূল্য KeyMint বা Keymaster সংস্করণ ২ কীমাস্টার সংস্করণ ২.০ ৩ কীমাস্টার সংস্করণ ৩.০ ৪ কীমাস্টার সংস্করণ ৪.০ ৪১ কীমাস্টার সংস্করণ ৪.১ ১০০ KeyMint সংস্করণ 1.0 ২০০ KeyMint সংস্করণ 2.0 ৩০০ KeyMint সংস্করণ 3.0 ৪০০ KeyMint সংস্করণ 4.0 ৫০০ KeyMint সংস্করণ 5.0 -
keymasterSecurityLevel/keyMintSecurityLevel - KeyMint বা Keymaster বাস্তবায়নের নিরাপত্তা স্তর ।
-
attestationChallenge - গুরুত্বপূর্ণ উৎপাদন সময়ে চ্যালেঞ্জটি প্রদান করা হয়েছিল।
-
uniqueId - একটি গোপনীয়তা-সংবেদনশীল ডিভাইস শনাক্তকারী, যা সিস্টেম অ্যাপগুলো কী তৈরির সময় অনুরোধ করতে পারে। যদি অনন্য আইডি-র জন্য অনুরোধ করা না হয়, তবে এই ক্ষেত্রটি খালি থাকে। বিস্তারিত জানতে, অনন্য আইডি বিভাগটি দেখুন।
-
softwareEnforced - অ্যান্ড্রয়েড সিস্টেম দ্বারা প্রয়োগ করা KeyMint বা Keymaster অনুমোদন তালিকা । এই তথ্য প্ল্যাটফর্মের কোড দ্বারা সংগ্রহ বা তৈরি করা হয়। যতক্ষণ ডিভাইসটি অ্যান্ড্রয়েড প্ল্যাটফর্ম সিকিউরিটি মডেল (Android Platform Security Model) মেনে চলে এমন একটি অপারেটিং সিস্টেম চালাচ্ছে (অর্থাৎ, ডিভাইসটির বুটলোডার লক করা আছে এবং
verifiedBootState'Verified'), ততক্ষণ এটি বিশ্বাসযোগ্য। -
hardwareEnforced - KeyMint বা Keymaster অনুমোদন তালিকাটি ডিভাইসের Trusted Execution Environment (TEE) বা StrongBox দ্বারা বলবৎ করা হয়। এই তথ্য সুরক্ষিত হার্ডওয়্যারের কোড দ্বারা সংগ্রহ বা তৈরি করা হয় এবং এটি প্ল্যাটফর্ম দ্বারা নিয়ন্ত্রিত নয়। উদাহরণস্বরূপ, তথ্য বুটলোডার থেকে বা এমন কোনো সুরক্ষিত যোগাযোগ চ্যানেলের মাধ্যমে আসতে পারে, যেখানে প্ল্যাটফর্মকে বিশ্বাস করার কোনো প্রয়োজন হয় না।
নিরাপত্তা স্তরের মান
SecurityLevel মানটি নির্দেশ করে যে একটি কীস্টোর-সম্পর্কিত উপাদান (যেমন, কী পেয়ার এবং অ্যাটেস্টেশন) আক্রমণের বিরুদ্ধে কতটা প্রতিরোধী।
| মূল্য | অর্থ |
|---|---|
Software | ডিভাইসটি ততক্ষণ পর্যন্ত সুরক্ষিত, যতক্ষণ এর অ্যান্ড্রয়েড সিস্টেম অ্যান্ড্রয়েড প্ল্যাটফর্ম সিকিউরিটি মডেল মেনে চলে (অর্থাৎ, ডিভাইসটির বুটলোডার লক করা থাকে এবং verifiedBootState টি Verified হয়)। |
TrustedEnvironment | যতক্ষণ TEE-এর নিরাপত্তা বিঘ্নিত না হয়, ততক্ষণ এটি সুরক্ষিত থাকে। TEE-এর জন্য বিচ্ছিন্নতার প্রয়োজনীয়তাগুলো অ্যান্ড্রয়েড কম্প্যাটিবিলিটি ডেফিনিশন ডকুমেন্টের ৯.১১ [C-1-1] থেকে [C-1-4] অনুচ্ছেদে সংজ্ঞায়িত করা হয়েছে। TEE দূরবর্তী নিরাপত্তা বিঘ্নিত হওয়ার বিরুদ্ধে অত্যন্ত প্রতিরোধী এবং সরাসরি হার্ডওয়্যার আক্রমণের মাধ্যমে নিরাপত্তা বিঘ্নিত হওয়ার বিরুদ্ধে মাঝারিভাবে প্রতিরোধী। |
StrongBox | যতক্ষণ StrongBox-এর নিরাপত্তা বিঘ্নিত না হয়, ততক্ষণ এটি সুরক্ষিত। StrongBox একটি হার্ডওয়্যার নিরাপত্তা মডিউলের অনুরূপ একটি সুরক্ষিত উপাদানে বাস্তবায়িত হয়। StrongBox বাস্তবায়নের জন্য প্রয়োজনীয় শর্তাবলী Android Compatibility Definition Document-এর ৯.১১.২ অনুচ্ছেদে সংজ্ঞায়িত করা হয়েছে। StrongBox দূরবর্তী নিরাপত্তা লঙ্ঘন এবং সরাসরি হার্ডওয়্যার আক্রমণের (যেমন, ভৌত বিকৃতি এবং সাইড-চ্যানেল আক্রমণ) মাধ্যমে নিরাপত্তা লঙ্ঘনের বিরুদ্ধে অত্যন্ত প্রতিরোধী। |
অনুমোদন তালিকা ক্ষেত্র
প্রতিটি ফিল্ড AIDL ইন্টারফেস স্পেসিফিকেশন থেকে একটি Keymaster/KeyMint অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ। স্পেসিফিকেশনটিই অথরাইজেশন ট্যাগ সম্পর্কিত তথ্যের নির্ভরযোগ্য উৎস: যেমন—এগুলোর অর্থ, বিষয়বস্তুর বিন্যাস, KeyDescription অবজেক্টের softwareEnforced বা hardwareEnforced ফিল্ডে এগুলো প্রদর্শিত হবে কিনা, এগুলো অন্যান্য ট্যাগের সাথে পারস্পরিকভাবে স্বতন্ত্র কিনা, ইত্যাদি। AuthorizationList সমস্ত ফিল্ড ঐচ্ছিক।
প্রতিটি ফিল্ডের একটি EXPLICIT প্রসঙ্গ-নির্দিষ্ট ট্যাগ থাকে যা KeyMint বা Keymaster ট্যাগ নম্বরের সমান, যা AuthorizationList এ ডেটার আরও সংক্ষিপ্ত উপস্থাপনা সক্ষম করে। তাই ASN.1 পার্সারকে অবশ্যই প্রতিটি প্রসঙ্গ-নির্দিষ্ট ট্যাগের জন্য প্রত্যাশিত ডেটা টাইপ জানতে হবে। উদাহরণস্বরূপ, Tag::USER_AUTH_TYPE কে ENUM | 504 হিসাবে সংজ্ঞায়িত করা হয়েছে। অ্যাটেস্টেশন এক্সটেনশন স্কিমাতে, AuthorizationList এর purpose ফিল্ডটি userAuthType [504] EXPLICIT INTEGER OPTIONAL হিসাবে নির্দিষ্ট করা হয়েছে। তাই এর ASN.1 এনকোডিং-এ ASN.1 টাইপ INTEGER এর জন্য UNIVERSAL ক্লাস ট্যাগ (যা 10 ) এর পরিবর্তে প্রসঙ্গ-নির্দিষ্ট ট্যাগ 504 থাকবে।
-
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_DIGESTKeyMint অথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 203 ট্যাগ আইডি মান ব্যবহার করে।-
rollbackResistance শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ ৩ বা তার চেয়ে বড় সংস্করণে উপস্থিত।
এটি
Tag::ROLLBACK_RESISTANCEঅথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 303 ট্যাগ আইডি মান ব্যবহার করে।-
earlyBootOnly শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ >= ৪-এ উপস্থিত।
এটি
Tag::EARLY_BOOT_ONLYঅথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 305 ট্যাগ আইডি মান ব্যবহার করে।-
activeDateTime - এটি
Tag::ACTIVE_DATETIMEঅথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 400 ট্যাগ আইডি মান ব্যবহার করে। -
originationExpireDateTime - এটি
Tag::ORIGINATION_EXPIRE_DATETIMEঅথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 401 ট্যাগ আইডি মান ব্যবহার করে। -
usageExpireDateTime - এটি
Tag::USAGE_EXPIRE_DATETIMEঅথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 402 ট্যাগ আইডি মান ব্যবহার করে। -
usageCountLimit - এটি
Tag::USAGE_COUNT_LIMITঅথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 405 ট্যাগ আইডি মান ব্যবহার করে। -
userSecureId - এটি
Tag::USER_SECURE_IDঅথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 502 ট্যাগ আইডি মান ব্যবহার করে। এই ট্যাগটি অ্যাটেস্টেশনে কখনও উপস্থিত থাকে না। -
noAuthRequired এটি
Tag::NO_AUTH_REQUIREDঅথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 503 ট্যাগ আইডি মান ব্যবহার করে।-
userAuthType - এটি
Tag::USER_AUTH_TYPEঅথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 504 ট্যাগ আইডি মান ব্যবহার করে। -
authTimeout - এটি
Tag::AUTH_TIMEOUTঅথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 505 ট্যাগ আইডি মান ব্যবহার করে। -
allowWhileOnBody এটি
Tag::ALLOW_WHILE_ON_BODYঅথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 506 ট্যাগ আইডি মান ব্যবহার করে।যদি ব্যবহারকারী তখনও ডিভাইসটি তার শরীরে পরিধান করে থাকেন, তবে প্রমাণীকরণের সময়সীমা শেষ হওয়ার পরেও কী-টি ব্যবহার করার অনুমতি দেওয়া হয়। উল্লেখ্য যে, একটি সুরক্ষিত অন-বডি সেন্সর নির্ধারণ করে যে ডিভাইসটি ব্যবহারকারীর শরীরে পরিধান করা আছে কি না।
-
trustedUserPresenceReq শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ ৩ বা তার চেয়ে বড় সংস্করণে উপস্থিত।
এটি
Tag::TRUSTED_USER_PRESENCE_REQUIREDঅথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 507 ট্যাগ আইডি মান ব্যবহার করে।নির্দিষ্ট করে যে, এই চাবিটি কেবল তখনই ব্যবহারযোগ্য হবে যখন ব্যবহারকারী সশরীরে উপস্থিত থাকার প্রমাণ দেবেন। কয়েকটি উদাহরণ নিচে দেওয়া হলো:
- স্ট্রংবক্স কী-এর জন্য, এটি একটি হার্ডওয়্যার বাটন যা স্ট্রংবক্স ডিভাইসের একটি পিনের সাথে হার্ডওয়্যারের মাধ্যমে সংযুক্ত থাকে।
- TEE কী-এর ক্ষেত্রে, ফিঙ্গারপ্রিন্ট প্রমাণীকরণ উপস্থিতির প্রমাণ হিসেবে কাজ করে, যতক্ষণ পর্যন্ত স্ক্যানারের উপর TEE-এর একচেটিয়া নিয়ন্ত্রণ থাকে এবং সে ফিঙ্গারপ্রিন্ট মেলানোর প্রক্রিয়াটি সম্পাদন করে।
-
trustedConfirmationReq শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ ৩ বা তার চেয়ে বড় সংস্করণে উপস্থিত।
এটি
Tag::TRUSTED_CONFIRMATION_REQUIREDঅথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 508 ট্যাগ আইডি মান ব্যবহার করে।এটি নির্দিষ্ট করে যে, ব্যবহারকারী একটি অনুমোদন টোকেন ব্যবহার করে স্বাক্ষরিতব্য ডেটার নিশ্চিতকরণ প্রদান করলেই কেবল কী-টি ব্যবহারযোগ্য হবে। ব্যবহারকারীর নিশ্চিতকরণ কীভাবে পেতে হয় সে সম্পর্কে আরও তথ্যের জন্য, অ্যান্ড্রয়েড সুরক্ষিত নিশ্চিতকরণ (Android Protected Confirmation ) দেখুন।
দ্রষ্টব্য: এই ট্যাগটি শুধুমাত্র সেইসব কী-এর ক্ষেত্রে প্রযোজ্য যেগুলো
SIGNউদ্দেশ্যে ব্যবহৃত হয়।-
unlockedDeviceReq শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ ৩ বা তার চেয়ে বড় সংস্করণে উপস্থিত।
এটি
Tag::UNLOCKED_DEVICE_REQUIREDঅথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 509 ট্যাগ আইডি মান ব্যবহার করে।-
creationDateTime - এটি
Tag::CREATION_DATETIMEঅথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 701 ট্যাগ আইডি মান ব্যবহার করে। -
origin এটি
Tag::ORIGINঅথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 702 ট্যাগ আইডি মান ব্যবহার করে।-
rootOfTrust এটি
Tag::ROOT_OF_TRUSTঅথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 704 ট্যাগ আইডি মান ব্যবহার করে।আরও বিস্তারিত জানতে, RootOfTrust ডেটা স্ট্রাকচার সম্পর্কিত অংশটি দেখুন।
-
osVersion এটি
Tag::OS_VERSIONঅথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 705 ট্যাগ আইডি মান ব্যবহার করে।কীমাস্টারের সাথে যুক্ত অ্যান্ড্রয়েড অপারেটিং সিস্টেমের সংস্করণ, যা একটি ছয়-অঙ্কের পূর্ণসংখ্যা হিসাবে নির্দিষ্ট করা হয়। উদাহরণস্বরূপ, সংস্করণ 8.1.0-কে 080100 হিসাবে প্রকাশ করা হয়।
শুধুমাত্র কীমাস্টার ভার্সন ১.০ বা তার উচ্চতর সংস্করণেই অনুমোদন তালিকায় এই মানটি অন্তর্ভুক্ত থাকে।
-
osPatchLevel এটি
Tag::OS_PATCHLEVELঅথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 706 ট্যাগ আইডি মান ব্যবহার করে।KeyMint (পূর্বে Keymaster)-এ ব্যবহৃত নিরাপত্তা প্যাচের সাথে সম্পর্কিত মাস এবং বছর, যা একটি ছয়-অঙ্কের পূর্ণসংখ্যা হিসাবে নির্দিষ্ট করা হয়। উদাহরণস্বরূপ, আগস্ট ২০১৮-এর প্যাচটি 201808 হিসাবে উপস্থাপিত হয়।
কোনো ডিভাইস সম্প্রতি প্যাচ করা হয়েছে কিনা তা পরীক্ষা করার জন্য
vendorPatchLevelবাbootPatchLevelপরিবর্তে এই ফিল্ডটি ব্যবহার করা শ্রেয়।শুধুমাত্র কীমাস্টার ভার্সন ১.০ বা তার উচ্চতর সংস্করণেই অনুমোদন তালিকায় এই মানটি অন্তর্ভুক্ত থাকে।
-
attestationApplicationId শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ >= ২-এ উপস্থিত।
এটি
Tag::ATTESTATION_APPLICATION_IDঅথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 709 ট্যাগ আইডি মান ব্যবহার করে।আরও বিস্তারিত জানতে, AttestationApplicationId ডেটা স্ট্রাকচার সম্পর্কিত অংশটি দেখুন।
-
attestationIdBrand শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ >= ২-এ উপস্থিত।
এটি
Tag::ATTESTATION_ID_BRANDঅথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 710 ট্যাগ আইডি মান ব্যবহার করে।-
attestationIdDevice শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ >= ২-এ উপস্থিত।
এটি
Tag::ATTESTATION_ID_DEVICEঅথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 711 ট্যাগ আইডি মান ব্যবহার করে।-
attestationIdProduct শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ >= ২-এ উপস্থিত।
এটি
Tag::ATTESTATION_ID_PRODUCTঅথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 712 ট্যাগ আইডি মান ব্যবহার করে।-
attestationIdSerial শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ >= ২-এ উপস্থিত।
এটি
Tag::ATTESTATION_ID_SERIALঅথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 713 ট্যাগ আইডি মান ব্যবহার করে।-
attestationIdImei শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ >= ২-এ উপস্থিত।
এটি
Tag::ATTESTATION_ID_IMEIঅথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 714 ট্যাগ আইডি মান ব্যবহার করে।-
attestationIdMeid শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ >= ২-এ উপস্থিত।
এটি
Tag::ATTESTATION_ID_MEIDঅথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 715 ট্যাগ আইডি মান ব্যবহার করে।-
attestationIdManufacturer শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ >= ২-এ উপস্থিত।
এটি
Tag::ATTESTATION_ID_MANUFACTURERঅথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 716 ট্যাগ আইডি মান ব্যবহার করে।-
attestationIdModel শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ >= ২-এ উপস্থিত।
এটি
Tag::ATTESTATION_ID_MODELঅথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 717 ট্যাগ আইডি মান ব্যবহার করে।-
vendorPatchLevel শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ ৩ বা তার চেয়ে বড় সংস্করণগুলিতে উপস্থিত।
এটি
Tag::VENDOR_PATCHLEVELঅথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 718 ট্যাগ আইডি মান ব্যবহার করে।এই কী-টি ব্যবহার করার জন্য ডিভাইসে যে ভেন্ডর ইমেজ সিকিউরিটি প্যাচ লেভেলটি অবশ্যই ইনস্টল করা থাকতে হবে, তা নির্দিষ্ট করে। এর মান হলো সিকিউরিটি প্যাচ লেভেল থেকে ড্যাশগুলো বাদ দিয়ে গঠিত একটি পূর্ণসংখ্যা। উদাহরণস্বরূপ, যদি ভেন্ডরের 2018-08-05 সিকিউরিটি প্যাচ ইনস্টল করা কোনো অ্যান্ড্রয়েড ডিভাইসে একটি কী তৈরি করা হয়, তাহলে এই মানটি হবে 20180805।
-
bootPatchLevel শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ ৩ বা তার চেয়ে বড় সংস্করণগুলিতে উপস্থিত।
এটি
Tag::BOOT_PATCHLEVELঅথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 719 ট্যাগ আইডি মান ব্যবহার করে।এই কী-টি ব্যবহার করার জন্য ডিভাইসে যে কার্নেল ইমেজ সিকিউরিটি প্যাচ লেভেলটি অবশ্যই ইনস্টল করা থাকতে হবে, তা নির্দিষ্ট করে। এর মান হলো সিকিউরিটি প্যাচ লেভেল থেকে ড্যাশগুলো বাদ দিয়ে গঠিত একটি পূর্ণসংখ্যা। উদাহরণস্বরূপ, যদি কার্নেলের 2018-08-05 সিকিউরিটি প্যাচ ইনস্টল করা কোনো অ্যান্ড্রয়েড ডিভাইসে একটি কী তৈরি করা হয়, তাহলে এই মানটি হবে 20180805।
-
deviceUniqueAttestation শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ ৪ বা তার চেয়ে বড় সংস্করণগুলিতে উপস্থিত।
এটি
Tag::DEVICE_UNIQUE_ATTESTATIONঅথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 720 ট্যাগ আইডি মান ব্যবহার করে।-
attestationIdSecondImei শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ >= 300-এ উপস্থিত।
এটি
Tag::ATTESTATION_ID_SECOND_IMEIঅথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 723 ট্যাগ আইডি মান ব্যবহার করে।-
moduleHash শুধুমাত্র কী অ্যাটেস্টেশন সংস্করণ >= 400-এ উপস্থিত।
এটি
Tag::MODULE_HASHঅথরাইজেশন ট্যাগের সাথে সঙ্গতিপূর্ণ, যা 724 ট্যাগ আইডি মান ব্যবহার করে।
রুটঅফট্রাস্ট ক্ষেত্রগুলি
-
verifiedBootKey - ভেরিফায়েড বুট -এর অংশ হিসেবে ডিভাইস বুট আপের সময় কার্যকর হওয়া সমস্ত কোডের অখণ্ডতা ও সত্যতা যাচাই করতে ব্যবহৃত পাবলিক কী-এর একটি সুরক্ষিত হ্যাশ। SHA-256 ব্যবহারের পরামর্শ দেওয়া হয়।
-
deviceLocked - ডিভাইসটির বুটলোডার লক করা আছে কিনা।
trueমানে হলো, ডিভাইসটি এমন একটি স্বাক্ষরিত ইমেজ বুট করেছে যা ভেরিফাইড বুট (Verified Boot) দ্বারা সফলভাবে যাচাই করা হয়েছে। -
verifiedBootState - ডিভাইসটির ভেরিফাইড বুট অবস্থা ।
-
verifiedBootHash - ভেরিফায়েড বুট দ্বারা সুরক্ষিত সমস্ত ডেটার একটি ডাইজেস্ট। যেসব ডিভাইস অ্যান্ড্রয়েড ভেরিফায়েড বুট রেফারেন্স ইমপ্লিমেন্টেশন ব্যবহার করে, সেগুলোর ক্ষেত্রে এই ফিল্ডটিতে VBMeta ডাইজেস্ট থাকে।
যাচাইকৃত বুট অবস্থা মান
| মূল্য | সংশ্লিষ্ট বুট অবস্থা | অর্থ |
|---|---|---|
Verified | GREEN | একটি সম্পূর্ণ ট্রাস্ট চেইন হার্ডওয়্যার-সুরক্ষিত রুট অফ ট্রাস্ট থেকে বুটলোডার এবং ভেরিফায়েড বুট দ্বারা যাচাইকৃত সমস্ত পার্টিশন পর্যন্ত বিস্তৃত থাকে। এই অবস্থায়, verifiedBootKey ফিল্ডটিতে এমবেডেড রুট অফ ট্রাস্টের হ্যাশ থাকে, যা হলো সেই সার্টিফিকেট যা ডিভাইস প্রস্তুতকারক কারখানায় ডিভাইসটির রম-এ এমবেড করে দেয়। |
SelfSigned | YELLOW | Verified এর মতোই, তবে এক্ষেত্রে ভেরিফিকেশনটি করা হয়েছে প্রস্তুতকারকের কারখানায় এমবেড করা রুট অফ ট্রাস্টের পরিবর্তে ব্যবহারকারী দ্বারা কনফিগার করা একটি রুট অফ ট্রাস্ট ব্যবহার করে। এই অবস্থায়, ' verifiedBootKey ফিল্ডটিতে ব্যবহারকারী দ্বারা কনফিগার করা পাবলিক কী-এর হ্যাশ থাকে। |
Unverified | ORANGE | ডিভাইসটির বুটলোডার আনলক করা আছে, তাই একটি চেইন অফ ট্রাস্ট স্থাপন করা সম্ভব নয়। ডিভাইসটি অবাধে পরিবর্তন করা যায়, তাই ব্যবহারকারীকে আউট-অফ-ব্যান্ডে ডিভাইসটির অখণ্ডতা যাচাই করতে হবে। এই অবস্থায় verifiedBootKey ফিল্ডটিতে ৩২ বাইট শূন্য থাকে। |
Failed | RED | ডিভাইসটি যাচাইকরণে ব্যর্থ হয়েছে। এই অবস্থায়, অন্যান্য RootOfTrust ফিল্ডগুলোর বিষয়বস্তু সম্পর্কে কোনো নিশ্চয়তা নেই। |
অ্যাটেস্টেশন অ্যাপ্লিকেশন আইডি
এই ফিল্ডটি অ্যান্ড্রয়েড প্ল্যাটফর্মের সেই বিশ্বাসকে প্রতিফলিত করে যে, কোন অ্যাপগুলো অ্যাটেস্টেশনের অধীনে থাকা সিক্রেট কী মেটেরিয়াল ব্যবহার করার অনুমতি পাবে। এতে একাধিক প্যাকেজ থাকতে পারে যদি এবং কেবল যদি একাধিক প্যাকেজের একই UID থাকে। AuthorizationList এর AttestationApplicationId ফিল্ডটি OCTET_STRING টাইপের এবং এটি নিম্নলিখিত ASN.1 স্কিমা অনুযায়ী ফরম্যাট করা হয়:
AttestationApplicationId ::= SEQUENCE {
package_infos SET OF AttestationPackageInfo,
signature_digests SET OF OCTET_STRING,
}
AttestationPackageInfo ::= SEQUENCE {
package_name OCTET_STRING,
version INTEGER,
}package_infos-
AttestationPackageInfoঅবজেক্টের একটি সেট, যার প্রতিটি একটি প্যাকেজের নাম এবং সংস্করণ নম্বর প্রদান করে। -
signature_digests অ্যাপটির সাইনিং সার্টিফিকেটগুলোর SHA-256 ডাইজেস্টের একটি সেট। একটি অ্যাপের একাধিক সাইনিং কী সার্টিফিকেট চেইন থাকতে পারে। প্রতিটির জন্য, "লিফ" সার্টিফিকেটটি ডাইজেস্ট করে
signature_digestsফিল্ডে রাখা হয়। ফিল্ডটির নামটি বিভ্রান্তিকর, কারণ ডাইজেস্ট করা ডেটা হলো অ্যাপটির সাইনিং সার্টিফিকেট, অ্যাপের সিগনেচার নয়। এর কারণ হলো,getPackageInfo()কল করে প্রাপ্তSignatureক্লাসের নামানুসারে এর নামকরণ করা হয়েছে। নিচের কোড স্নিপেটটিতে একটি উদাহরণ সেট দেখানো হলো:{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}
সরবরাহ তথ্য সম্প্রসারণ
প্রভিশনিং ইনফরমেশন এক্সটেনশনটির OID হলো 1.3.6.1.4.1.11129.2.1.30 । এই এক্সটেনশনটি প্রভিশনিং সার্ভারের কাছে ডিভাইসটি সম্পর্কে জানা তথ্য সরবরাহ করে।
স্কিমা
এক্সটেনশন ভ্যালুটি কনসাইজ বাইনারি অবজেক্ট রিপ্রেজেন্টেশন (CBOR) ডেটা নিয়ে গঠিত, যা এই কনসাইজ ডেটা ডেফিনিশন ল্যাঙ্গুয়েজ (CDDL) স্কিমা মেনে চলে:
{
1 : int, ; certificates issued
4 : string, ; validated attested entity (STRONG_BOX/TEE)
}
মানচিত্রটির কোনো সংস্করণ নেই এবং এতে নতুন ঐচ্ছিক ক্ষেত্র যোগ করা হতে পারে।
-
certs_issued গত ৩০ দিনে ডিভাইসটিতে ইস্যু করা সার্টিফিকেটের একটি আনুমানিক সংখ্যা। এই মানটি যদি গড়ের চেয়ে কয়েকগুণ বেশি হয়, তবে এটিকে সম্ভাব্য অপব্যবহারের সংকেত হিসেবে ব্যবহার করা যেতে পারে।
-
validated_attested_entity সত্যায়িত কী-টির প্রত্যয়িত উৎস নির্দেশকারী একটি স্ট্রিং, যা চিপসেট প্রস্তুতকারক দ্বারা সরাসরি সত্যায়িত। উদাহরণস্বরূপ,
STRONG_BOXবাTEE।
সত্যায়ন চাবি
একটি RSA ও একটি ECDSA, এই দুটি কী এবং সংশ্লিষ্ট সার্টিফিকেট চেইনগুলো ডিভাইসটিতে নিরাপদে সংরক্ষণ করা থাকে।
অ্যান্ড্রয়েড ১২-এ রিমোট কী প্রভিশনিং চালু করা হয়েছে এবং অ্যান্ড্রয়েড ১৫ অনুযায়ী সকল ডিভাইসে এটি প্রয়োগ করা বাধ্যতামূলক। রিমোট কী প্রভিশনিং ফিল্ডে থাকা ডিভাইসগুলোকে প্রতিটি অ্যাপের জন্য ECDSA P256 অ্যাটেস্টেশন সার্টিফিকেট প্রদান করে। এই সার্টিফিকেটগুলোর মেয়াদ ফ্যাক্টরি থেকে দেওয়া সার্টিফিকেটের চেয়ে কম।
অনন্য আইডি
ইউনিক আইডি হলো একটি ১২৮-বিটের মান যা ডিভাইসটিকে শনাক্ত করে, কিন্তু তা শুধুমাত্র একটি সীমিত সময়ের জন্য। এই মানটি নিম্নোক্ত সূত্র দিয়ে গণনা করা হয়:
HMAC_SHA256(T || C || R, HBK)
কোথায়:
-
Tহলো "টেম্পোরাল কাউন্টার ভ্যালু", যাTag::CREATION_DATETIMEএর মানকে 2592000000 দিয়ে ভাগ করে এবং ভাগশেষ বাদ দিয়ে গণনা করা হয়।Tপ্রতি 30 দিন পর পর পরিবর্তিত হয় (2592000000 = 30 * 24 * 60 * 60 * 1000)। -
CহলোTag::APPLICATION_IDএর মান। - attest_key কলের attest_params প্যারামিটারে
Tag::RESET_SINCE_ID_ROTATIONউপস্থিত থাকলেRমান 1 হবে, অথবা ট্যাগটি উপস্থিত না থাকলে 0 হবে। -
HBKহলো একটি অনন্য হার্ডওয়্যার-আবদ্ধ গোপনীয় তথ্য, যা ট্রাস্টেড এক্সিকিউশন এনভায়রনমেন্টের (Trusted Execution Environment) কাছে পরিচিত এবং এটি দ্বারা কখনো প্রকাশ করা হয় না। এই গোপনীয় তথ্যে কমপক্ষে ১২৮ বিট এনট্রপি থাকে এবং এটি প্রতিটি ডিভাইসের জন্য অনন্য (১২৮ বিট এনট্রপির পরিপ্রেক্ষিতে সম্ভাব্য অনন্যতা গ্রহণযোগ্য)। HBK অবশ্যই HMAC বা AES_CMAC-এর মাধ্যমে ফিউজড কী মেটেরিয়াল (fused key material) থেকে ডিরাইভ (derive) করতে হবে।
HMAC_SHA256 আউটপুটকে ১২৮ বিটে সংক্ষিপ্ত করুন।
একাধিক IMEI
অ্যান্ড্রয়েড ১৪-এর অ্যান্ড্রয়েড কী অ্যাটেস্টেশন রেকর্ডে একাধিক IMEI ব্যবহারের সুবিধা যুক্ত করা হয়েছে। OEM-রা দ্বিতীয় একটি IMEI-এর জন্য KeyMint ট্যাগ যোগ করে এই ফিচারটি প্রয়োগ করতে পারেন। ডিভাইসগুলোতে একাধিক সেলুলার রেডিও থাকা এখন ক্রমশ সাধারণ হয়ে উঠছে এবং OEM-রা এখন দুটি IMEI যুক্ত ডিভাইসগুলোকেও সাপোর্ট করতে পারবেন।
OEM-দের ডিভাইসে যদি একটি দ্বিতীয় IMEI থাকে, তবে সেটি KeyMint ইমপ্লিমেন্টেশন(গুলি)-তে সরবরাহ করা আবশ্যক, যাতে সেই ইমপ্লিমেন্টেশনগুলি প্রথম IMEI-এর মতোই দ্বিতীয়টিকেও সত্যায়িত করতে পারে।
পরিচয়পত্র সত্যায়ন
অ্যান্ড্রয়েড ৮.০-তে কীমাস্টার ৩ যুক্ত ডিভাইসগুলোর জন্য আইডি অ্যাটেস্টেশন-এর ঐচ্ছিক সাপোর্ট অন্তর্ভুক্ত রয়েছে। আইডি অ্যাটেস্টেশন ডিভাইসটিকে তার হার্ডওয়্যার আইডেন্টিফায়ার, যেমন সিরিয়াল নম্বর বা আইএমইআই (IMEI)-এর প্রমাণ সরবরাহ করার সুযোগ দেয়। যদিও এটি একটি ঐচ্ছিক ফিচার, তবুও সমস্ত কীমাস্টার ৩ ইমপ্লিমেন্টেশনে এর সাপোর্ট রাখার জন্য জোরালোভাবে সুপারিশ করা হয়। কারণ, ডিভাইসের পরিচয় প্রমাণ করতে পারার ফলে সত্যিকারের জিরো-টাচ রিমোট কনফিগারেশনের মতো ব্যবহারের ক্ষেত্রগুলো আরও সুরক্ষিত হয় (এর ফলে রিমোট প্রান্ত নিশ্চিত হতে পারে যে সে সঠিক ডিভাইসের সাথেই কথা বলছে, এমন কোনো ডিভাইসের সাথে নয় যা তার পরিচয় জাল করছে)।
ডিভাইসটি কারখানা থেকে বের হওয়ার আগে, এর হার্ডওয়্যার আইডেন্টিফায়ারগুলোর এমন কপি তৈরি করার মাধ্যমে আইডি অ্যাটেস্টেশন কাজ করে, যেগুলোতে শুধুমাত্র TEE-ই অ্যাক্সেস করতে পারে। একজন ব্যবহারকারী ডিভাইসের বুটলোডার আনলক করে সিস্টেম সফটওয়্যার এবং অ্যান্ড্রয়েড ফ্রেমওয়ার্ক দ্বারা রিপোর্ট করা আইডেন্টিফায়ারগুলো পরিবর্তন করতে পারে। TEE-এর কাছে থাকা আইডেন্টিফায়ারগুলোর কপি এভাবে ম্যানিপুলেট করা যায় না, যা নিশ্চিত করে যে ডিভাইস আইডি অ্যাটেস্টেশন শুধুমাত্র ডিভাইসের আসল হার্ডওয়্যার আইডেন্টিফায়ারগুলোকেই সত্যায়ন করে এবং এর ফলে স্পুফিংয়ের প্রচেষ্টা ব্যর্থ করে দেয়।
আইডি অ্যাটেস্টেশনের জন্য প্রধান এপিআই সারফেসটি কীমাস্টার ২-এর সাথে প্রবর্তিত বিদ্যমান কী অ্যাটেস্টেশন মেকানিজমের উপর ভিত্তি করে তৈরি। কীমাস্টারের কাছে থাকা কোনো কী-এর জন্য অ্যাটেস্টেশন সার্টিফিকেটের অনুরোধ করার সময়, কলার অনুরোধ করতে পারেন যেন ডিভাইসটির হার্ডওয়্যার আইডেন্টিফায়ারগুলো অ্যাটেস্টেশন সার্টিফিকেটের মেটাডেটাতে অন্তর্ভুক্ত করা হয়। যদি কী-টি TEE-তে সংরক্ষিত থাকে, তবে সার্টিফিকেটটি একটি পরিচিত রুট অফ ট্রাস্ট-এর সাথে চেইনবদ্ধ হয়। এই ধরনের সার্টিফিকেটের প্রাপক যাচাই করতে পারেন যে সার্টিফিকেট এবং এর বিষয়বস্তু, হার্ডওয়্যার আইডেন্টিফায়ারসহ, TEE দ্বারা লেখা হয়েছে। অ্যাটেস্টেশন সার্টিফিকেটে হার্ডওয়্যার আইডেন্টিফায়ার অন্তর্ভুক্ত করতে বলা হলে, TEE শুধুমাত্র তার স্টোরেজে থাকা আইডেন্টিফায়ারগুলোকেই অ্যাটেস্ট করে, যা ফ্যাক্টরি ফ্লোরে পপুলেট করা হয়েছিল।
স্টোরেজ বৈশিষ্ট্য
যে স্টোরেজে ডিভাইসটির আইডেন্টিফায়ারগুলো সংরক্ষিত থাকে, সেটির নিম্নলিখিত বৈশিষ্ট্যগুলো থাকা প্রয়োজন:
- ডিভাইসটি কারখানা থেকে বের হওয়ার আগেই এর মূল শনাক্তকারীগুলো থেকে প্রাপ্ত মানগুলো স্টোরেজে কপি করা হয়।
-
destroyAttestationIds()মেথডটি আইডেন্টিফায়ার-ভিত্তিক ডেটার এই কপিটিকে স্থায়ীভাবে ধ্বংস করতে পারে। স্থায়ীভাবে ধ্বংস করার অর্থ হলো ডেটা সম্পূর্ণরূপে মুছে ফেলা হয়, ফলে ফ্যাক্টরি রিসেট বা ডিভাইসে করা অন্য কোনো পদ্ধতি দ্বারাও এটিকে পুনরুদ্ধার করা যায় না। এটি সেইসব ডিভাইসের জন্য বিশেষভাবে গুরুত্বপূর্ণ, যেখানে ব্যবহারকারী বুটলোডার আনলক করেছেন, সিস্টেম সফটওয়্যার পরিবর্তন করেছেন এবং অ্যান্ড্রয়েড ফ্রেমওয়ার্ক দ্বারা ফেরত দেওয়া আইডেন্টিফায়ারগুলো পরিবর্তন করেছেন। - আরএমএ (RMA) সুবিধাগুলোর হার্ডওয়্যার আইডেন্টিফায়ার-ভিত্তিক ডেটার নতুন কপি তৈরি করার ক্ষমতা থাকা উচিত। এর ফলে, আরএমএ প্রক্রিয়ার মধ্য দিয়ে যাওয়া একটি ডিভাইস পুনরায় আইডি অ্যাটেস্টেশন করতে পারবে। আরএমএ সুবিধাগুলো দ্বারা ব্যবহৃত পদ্ধতিটি অবশ্যই সুরক্ষিত রাখতে হবে, যাতে ব্যবহারকারীরা নিজেরা এটি ব্যবহার করতে না পারে, কারণ তা করলে তারা স্পুফড আইডির অ্যাটেস্টেশন পেয়ে যাবে।
- TEE-তে থাকা Keymaster বিশ্বস্ত অ্যাপ ব্যতীত অন্য কোনো কোড স্টোরেজে সংরক্ষিত শনাক্তকারী-ভিত্তিক ডেটা পড়তে পারে না।
- স্টোরেজটি টেম্পার-এভিডেন্ট: যদি স্টোরেজের বিষয়বস্তু পরিবর্তন করা হয়, তাহলে TEE এটিকে এমনভাবে বিবেচনা করে যেন বিষয়বস্তুর কপিগুলো ধ্বংস করা হয়েছে এবং আইডি সত্যায়নের সমস্ত প্রচেষ্টা প্রত্যাখ্যান করে। এটি নিচে বর্ণিত পদ্ধতি অনুযায়ী স্টোরেজটিতে সাইনিং বা MAC করার মাধ্যমে বাস্তবায়ন করা হয়।
- স্টোরেজটি মূল আইডেন্টিফায়ারগুলো সংরক্ষণ করে না। যেহেতু আইডি অ্যাটেস্টেশনে একটি চ্যালেঞ্জ জড়িত থাকে, তাই কলার সর্বদা অ্যাটেস্ট করার জন্য আইডেন্টিফায়ারগুলো সরবরাহ করে। TEE-কে শুধু যাচাই করতে হয় যে এগুলো তাদের মূল মানের সাথে মেলে কিনা। মূল মানগুলোর পরিবর্তে সেগুলোর সুরক্ষিত হ্যাশ সংরক্ষণ করা এই যাচাইকরণকে সম্ভব করে তোলে।
নির্মাণ
উপরে তালিকাভুক্ত বৈশিষ্ট্যসম্পন্ন একটি ইমপ্লিমেন্টেশন তৈরি করতে, আইডি-থেকে-প্রাপ্ত মানগুলি নিম্নলিখিত কনস্ট্রাকশন S-এ সংরক্ষণ করুন। সিস্টেমের স্বাভাবিক স্থানগুলি ব্যতীত আইডি মানগুলির অন্য কোনো অনুলিপি সংরক্ষণ করবেন না, যে স্থানগুলি একজন ডিভাইস মালিক রুটিংয়ের মাধ্যমে পরিবর্তন করতে পারেন:
S = D || HMAC(HBK, D)
যেখানে:
-
D = HMAC(HBK, ID 1 ) || HMAC(HBK, ID 2 ) || ... || HMAC(HBK, ID n ) -
HMACহলো একটি উপযুক্ত সুরক্ষিত হ্যাশ (SHA-256 সুপারিশকৃত) সহ HMAC গঠন। -
HBKএকটি হার্ডওয়্যার-সংযুক্ত কী যা অন্য কোনো উদ্দেশ্যে ব্যবহৃত হয় না। -
ID 1 ...ID nহলো মূল ID মানগুলো; একটি নির্দিষ্ট সূচকের সাথে একটি নির্দিষ্ট মানের সংযোগ বাস্তবায়ন-নির্ভর, কারণ বিভিন্ন ডিভাইসে শনাক্তকারীর সংখ্যা ভিন্ন ভিন্ন হয়। -
||সংযুক্তি বোঝায়
যেহেতু HMAC আউটপুটগুলো নির্দিষ্ট আকারের হয়, তাই স্বতন্ত্র ID হ্যাশ বা D-এর HMAC খুঁজে বের করার জন্য কোনো হেডার বা অন্য কোনো কাঠামোর প্রয়োজন হয় না। অ্যাটেস্টেশন সম্পাদনের জন্য প্রদত্ত মানগুলো যাচাই করার পাশাপাশি, ইমপ্লিমেন্টেশনগুলোকে S থেকে D বের করে, HMAC(HBK, D) গণনা করে এবং S-এর মানের সাথে তুলনা করে S-কে ভ্যালিডেট করতে হবে, যাতে কোনো স্বতন্ত্র ID পরিবর্তিত বা বিকৃত হয়নি তা নিশ্চিত করা যায়। এছাড়াও, ইমপ্লিমেন্টেশনগুলোকে অবশ্যই সমস্ত স্বতন্ত্র ID এলিমেন্টের জন্য এবং S-এর ভ্যালিডেশনের জন্য কনস্ট্যান্ট-টাইম কম্প্যারিসন ব্যবহার করতে হবে। প্রদত্ত ID-এর সংখ্যা এবং পরীক্ষার যেকোনো অংশের সঠিক মিল নির্বিশেষে তুলনার সময় অবশ্যই স্থির থাকতে হবে।
হার্ডওয়্যার শনাক্তকারী
আইডি অ্যাটেস্টেশন নিম্নলিখিত হার্ডওয়্যার আইডেন্টিফায়ারগুলিকে সমর্থন করে:
- অ্যান্ড্রয়েডে
Build.BRANDদ্বারা প্রাপ্ত ব্র্যান্ডের নাম - অ্যান্ড্রয়েডে
Build.DEVICEদ্বারা প্রাপ্ত ডিভাইসের নাম। - অ্যান্ড্রয়েডে
Build.PRODUCTদ্বারা প্রাপ্ত পণ্যের নাম। - অ্যান্ড্রয়েডে
Build.MANUFACTURERদ্বারা প্রাপ্ত প্রস্তুতকারকের নাম। - অ্যান্ড্রয়েডে
Build.MODELদ্বারা প্রাপ্ত মডেলের নাম। - ক্রমিক সংখ্যা
- সমস্ত রেডিওর IMEI
- সকল রেডিওর MEID
ডিভাইস আইডি অ্যাটেস্টেশন সমর্থন করার জন্য, একটি ডিভাইস এই আইডেন্টিফায়ারগুলো অ্যাটেস্ট করে। অ্যান্ড্রয়েড চালিত সমস্ত ডিভাইসে প্রথম ছয়টি আইডেন্টিফায়ার থাকে এবং এই ফিচারটি কাজ করার জন্য সেগুলো অপরিহার্য। যদি ডিভাইসটিতে কোনো ইন্টিগ্রেটেড সেলুলার রেডিও থাকে, তবে ডিভাইসটিকে অবশ্যই সেই রেডিওগুলোর IMEI এবং/অথবা MEID-এর অ্যাটেস্টেশনও সমর্থন করতে হবে।
কী অ্যাটেস্টেশন সম্পাদন করে এবং অনুরোধে অ্যাটেস্ট করার জন্য ডিভাইস আইডেন্টিফায়ারগুলো অন্তর্ভুক্ত করার মাধ্যমে আইডি অ্যাটেস্টেশনের জন্য অনুরোধ করা হয়। আইডেন্টিফায়ারগুলোকে নিম্নরূপে ট্যাগ করা হয়:
-
ATTESTATION_ID_BRAND -
ATTESTATION_ID_DEVICE -
ATTESTATION_ID_PRODUCT -
ATTESTATION_ID_MANUFACTURER -
ATTESTATION_ID_MODEL -
ATTESTATION_ID_SERIAL -
ATTESTATION_ID_IMEI -
ATTESTATION_ID_MEID
সত্যায়নযোগ্য শনাক্তকারীটি একটি UTF-8 এনকোডেড বাইট স্ট্রিং। এই বিন্যাসটি সাংখ্যিক শনাক্তকারীর ক্ষেত্রেও প্রযোজ্য। সত্যায়নযোগ্য প্রতিটি শনাক্তকারীকে একটি UTF-8 এনকোডেড স্ট্রিং হিসাবে প্রকাশ করা হয়।
যদি ডিভাইসটি আইডি অ্যাটেস্টেশন সমর্থন না করে (অথবা পূর্বে destroyAttestationIds() কল করা হয়ে থাকে এবং ডিভাইসটি তার আইডিগুলো আর অ্যাটেস্ট করতে না পারে), তাহলে এই ট্যাগগুলোর এক বা একাধিক অন্তর্ভুক্ত থাকা যেকোনো কী অ্যাটেস্টেশন অনুরোধ ErrorCode::CANNOT_ATTEST_IDS সাথে ব্যর্থ হবে।
যদি ডিভাইসটি আইডি অ্যাটেস্টেশন সমর্থন করে এবং একটি কী অ্যাটেস্টেশন অনুরোধে উপরের এক বা একাধিক ট্যাগ অন্তর্ভুক্ত করা হয়ে থাকে, তাহলে TEE যাচাই করে দেখে যে প্রতিটি ট্যাগের সাথে সরবরাহ করা আইডেন্টিফায়ারটি তার হার্ডওয়্যার আইডেন্টিফায়ারের কপির সাথে মেলে কিনা। যদি এক বা একাধিক আইডেন্টিফায়ার না মেলে, তাহলে সম্পূর্ণ অ্যাটেস্টেশনটি ErrorCode::CANNOT_ATTEST_IDS সহ ব্যর্থ হয়। একই ট্যাগ একাধিকবার সরবরাহ করা বৈধ। এটি কার্যকর হতে পারে, উদাহরণস্বরূপ, IMEI অ্যাটেস্ট করার সময়: একটি ডিভাইসে একাধিক IMEI সহ একাধিক রেডিও থাকতে পারে। একটি অ্যাটেস্টেশন অনুরোধ তখনই বৈধ হবে যদি প্রতিটি ATTESTATION_ID_IMEI এর সাথে সরবরাহ করা মান ডিভাইসটির কোনো একটি রেডিওর সাথে মেলে। একই নিয়ম অন্য সব ট্যাগের ক্ষেত্রেও প্রযোজ্য।
যদি অ্যাটেস্টেশন সফল হয়, তাহলে উপরের স্কিমা ব্যবহার করে ইস্যু করা অ্যাটেস্টেশন সার্টিফিকেটের অ্যাটেস্টেশন এক্সটেনশনে (OID 1.3.6.1.4.1.11129.2.1.17) অ্যাটেস্টেড আইডিগুলো যোগ করা হয়। Keymaster 2 অ্যাটেস্টেশন স্কিমা থেকে করা পরিবর্তনগুলো মন্তব্যসহ বোল্ড করে দেখানো হয়েছে।
জাভা এপিআই
এই অংশটি শুধুমাত্র তথ্যমূলক। Keymaster বাস্তবায়নকারীরা জাভা এপিআই (Java API) বাস্তবায়ন বা ব্যবহার করেন না। অ্যাপগুলো কীভাবে এই ফিচারটি ব্যবহার করে, তা বাস্তবায়নকারীদের বুঝতে সাহায্য করার জন্যই এটি প্রদান করা হয়েছে। সিস্টেমের উপাদানগুলো এটি ভিন্নভাবে ব্যবহার করতে পারে, যে কারণে এই অংশটিকে আদর্শ হিসেবে গণ্য না করাটা অত্যন্ত গুরুত্বপূর্ণ।