يوفر Keystore مكانًا أكثر أمانًا لإنشاء مفاتيح التشفير وتخزينها واستخدامها بطريقة منظَّمة. عندما تكون ميزة تخزين المفاتيح الاحتياطية متاحة ويتم استخدامها، تكون بيانات المفاتيح أكثر أمانًا من حيث استخراجها من الجهاز، وتفرض خدمة KeyMint (المعروفة سابقًا باسم Keymaster) قيودًا يصعب التحايل عليها.
ومع ذلك، لا ينطبق ذلك إلا إذا كانت مفاتيح Keystore معروفة بأنّها مخزّنة في مساحة تخزين محمية بواسطة الأجهزة. في Keymaster 1، لم يكن بإمكان التطبيقات أو الخوادم البعيدة التحقّق بشكل موثوق من ذلك. حمّل برنامج keystore الخفي طبقة تجريد الأجهزة (HAL) المتوفّرة في Keymaster، وصدّق على كل ما قالته طبقة تجريد الأجهزة (HAL) بشأن مفاتيح التشفير المُدمَجة بشكل آمن في الأجهزة.
ولحلّ هذه المشكلة، تم طرح ميزة إثبات صحة المفتاح في الإصدار 7.0 من نظام التشغيل Android (Keymaster 2)، كما تم طرح ميزة إثبات صحة المعرّف في الإصدار 8.0 من نظام التشغيل Android (Keymaster 3).
تهدف مصادقة المفتاح إلى توفير طريقة لتحديد ما إذا كان زوج المفاتيح غير المتماثل مدعومًا بالأجهزة، وما هي خصائص المفتاح، وما هي القيود المفروضة على استخدامه.
تتيح عملية إثبات صحة المعرّف للجهاز تقديم دليل على معرّفات الأجهزة، مثل الرقم التسلسلي أو رقم IMEI.
مصادقة المفتاح
لإتاحة إثبات صحة المفتاح، قدّمت الإصدار 7.0 من نظام التشغيل Android مجموعة من العلامات والأنواع والطرق إلى طبقة HAL.
العلامات
Tag::ATTESTATION_CHALLENGETag::INCLUDE_UNIQUE_IDTag::RESET_SINCE_ID_ROTATION
النوع
Keymaster 2 والإصدارات الأقدم
typedef struct {
keymaster_blob_t* entries;
size_t entry_count;
} keymaster_cert_chain_t;
طريقة AttestKey
Keymaster 3
attestKey(vec<uint8_t> keyToAttest, vec<KeyParameter> attestParams)
generates(ErrorCode error, vec<vec<uint8_t>> certChain);Keymaster 2 والإصدارات الأقدم
keymaster_error_t (*attest_key)(const struct keymaster2_device* dev,
const keymaster_key_blob_t* key_to_attest,
const keymaster_key_param_set_t* attest_params,
keymaster_cert_chain_t* cert_chain);
-
devهو بنية جهاز 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) | القيمة |
|---|---|
| tbsCertificate | TBSCertificate SEQUENCE |
| signatureAlgorithm | AlgorithmIdentifier للخوارزمية المستخدَمة لتوقيع المفتاح: ECDSA لمفاتيح EC، وRSA لمفاتيح RSA |
| signatureValue | BIT STRING، التوقيع المحسوب على tbsCertificate بترميز ASN.1 DER |
TBSCertificate SEQUENCE
| اسم الحقل (راجِع RFC 5280) | القيمة |
|---|---|
version |
INTEGER 2 (تعني شهادة الإصدار 3) |
serialNumber |
INTEGER 1 (قيمة ثابتة: هي نفسها في جميع الشهادات) |
signature |
AlgorithmIdentifier للخوارزمية المستخدَمة لتوقيع المفتاح: ECDSA لمفاتيح EC، وRSA لمفاتيح RSA |
issuer |
يكون هذا المعرّف هو نفسه حقل الموضوع لمفتاح المصادقة المجمّعة. |
validity |
تسلسل من تاريخَين، يحتوي على قيمتَي Tag::ACTIVE_DATETIME وTag::USAGE_EXPIRE_DATETIME
تكون هذه القيم بالملي ثانية منذ 1 يناير 1970.
يُرجى الاطّلاع على RFC 5280 لمعرفة طرق عرض التاريخ الصحيحة في الشهادات.في حال عدم توفّر Tag::ACTIVE_DATETIME، استخدِم قيمة
Tag::CREATION_DATETIME. في حال عدم توفّر Tag::USAGE_EXPIRE_DATETIME، استخدِم تاريخ انتهاء صلاحية شهادة مفتاح المصادقة المجمّعة. |
subject |
CN = "Android Keystore Key" (قيمة ثابتة: هي نفسها في جميع الشهادات) |
subjectPublicKeyInfo |
SubjectPublicKeyInfo الذي يحتوي على المفتاح العام الذي تم إثبات صحته |
extensions/Key Usage |
digitalSignature: يتم ضبطها إذا كان المفتاح يتضمّن الغرض KeyPurpose::SIGN أو KeyPurpose::VERIFY. يجب أن تكون جميع البتات الأخرى غير مضبوطة. |
extensions/CRL Distribution Points |
سيتم تحديد القيمة لاحقًا |
extensions/"attestation" |
رقم تعريف العنصر هو 1.3.6.1.4.1.11129.2.1.17، ويتم تحديد المحتوى في قسم إضافة الشهادة أدناه. كما هو الحال مع جميع إضافات شهادات X.509، يتم تمثيل المحتوى كسلسلة OCTET_STRING تحتوي على ترميز DER لـ SEQUENCE الخاص بشهادة التصديق. |
إضافة المصادقة
تحتوي الإضافة attestation على معرّف عنصر 1.3.6.1.4.1.11129.2.1.17. ويحتوي على معلومات حول مفتاحَي التشفير اللذين يتم إثبات صحتهما وحالة الجهاز عند إنشاء المفتاح.
يتم تحويل أنواع علامات Keymaster/KeyMint المحدّدة في مواصفات واجهة AIDL إلى أنواع 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 |
ملّي ثانية منذ 1 يناير 1970 الساعة 00:00:00 بتوقيت غرينتش |
BOOL |
NULL |
يشير توفّر العلامة إلى القيمة "صحيح"، وعدم توفّرها إلى القيمة "خطأ". |
BIGNUM |
لا تتضمّن أي علامات هذا النوع، لذا لم يتم تحديد أي عملية ربط. | |
BYTES |
OCTET_STRING |
مخطط
يتم وصف محتوى إضافة شهادة التصديق من خلال مخطط ASN.1 التالي. يتم أيضًا استخدام مخطط ASN.1 الخاص بـ AuthorizationList في استيراد المفاتيح المشفّرة.
يتم توضيح أي حقول لن تظهر في إضافة شهادة الإثبات.
الإصدار 500
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),
}
الإصدار 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, # 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),
}
الإصدار 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, # 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),
}
الإصدار 200
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),
}
الإصدار 100
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),
}
الإصدار 4
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),
}
الإصدار 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),
}
الإصدار 2
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),
}
الإصدار 1
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),
}
حقول KeyDescription
-
attestationVersion -
إصدار مخطط ASN.1.
القيمة إصدار KeyMint أو Keymaster 1 الإصدار 2.0 من Keymaster 2 الإصدار 3.0 من Keymaster 3 الإصدار 4.0 من Keymaster 4 الإصدار 4.1 من Keymaster 100 الإصدار 1.0 من KeyMint 200 الإصدار 2.0 من KeyMint 300 الإصدار 3.0 من KeyMint 400 الإصدار 4.0 من KeyMint 500 الإصدار 5.0 من KeyMint -
attestationSecurityLevel -
مستوى الأمان للموقع الجغرافي الذي يتم فيه تخزين المفتاح الذي تم إثبات صحته
-
keymasterVersion/keyMintVersion -
تمثّل هذه السمة إصدار KeyMint أو Keymaster HAL.
القيمة إصدار KeyMint أو Keymaster 2 الإصدار 2.0 من Keymaster 3 الإصدار 3.0 من Keymaster 4 الإصدار 4.0 من Keymaster 41 الإصدار 4.1 من Keymaster 100 الإصدار 1.0 من KeyMint 200 الإصدار 2.0 من KeyMint 300 الإصدار 3.0 من KeyMint 400 الإصدار 4.0 من KeyMint 500 الإصدار 5.0 من KeyMint -
keymasterSecurityLevel/keyMintSecurityLevel - تمثّل هذه السمة مستوى الأمان لعملية تنفيذ KeyMint أو Keymaster.
-
attestationChallenge - تمثّل هذه السمة التحدّي الذي تم تقديمه عند إنشاء المفتاح.
-
uniqueId - معرّف جهاز يراعي الخصوصية ويمكن أن تطلبه تطبيقات النظام عند إنشاء المفتاح. إذا لم يُطلب رقم التعريف الفريد، يكون هذا الحقل فارغًا. لمعرفة التفاصيل، يُرجى الاطّلاع على قسم المعرّف الفريد.
-
softwareEnforced -
قائمة الأذونات في KeyMint أو Keymaster التي يفرضها نظام Android يتم جمع هذه المعلومات أو إنشاؤها بواسطة رمز في المنصة. ويمكن الوثوق به طالما أنّ الجهاز يعمل بنظام تشغيل يتوافق مع نموذج أمان منصة Android (أي أنّ برنامج إقلاع الجهاز مقفل وأنّ
verifiedBootStateهوVerified). -
hardwareEnforced - قائمة الأذونات الخاصة بـ KeyMint أو Keymaster، والتي تفرضها بيئة التنفيذ الموثوقة (TEE) أو StrongBox على الجهاز. يتم جمع هذه المعلومات أو إنشاؤها بواسطة رمز في الجهاز الآمن، ولا تتحكّم المنصة فيها. على سبيل المثال، يمكن أن تأتي المعلومات من برنامج الإقلاع أو من خلال قناة اتصال آمنة لا تتطلّب الوثوق بالنظام الأساسي.
قيم SecurityLevel
تشير قيمة SecurityLevel إلى مدى مقاومة عنصر ذي صلة بـ Keystore (مثل زوج المفاتيح وشهادة التصديق) للهجوم.
| القيمة | المعنى |
|---|---|
Software |
آمنة طالما أنّ نظام Android على الجهاز يتوافق مع
نموذج أمان منصة Android
(أي أنّ برنامج إقلاع الجهاز مقفل وأنّ
verifiedBootState هو
Verified). |
TrustedEnvironment |
آمنة طالما أنّ بيئة التنفيذ الموثوقة لم يتم اختراقها. يتم تحديد متطلبات العزل لبيئات التنفيذ الموثوقة (TEE) في الفقرات من 9.11 [C-1-1] إلى [C-1-4] من "مستند تعريف معايير التوافق" لنظام Android. تتسم بيئات التنفيذ الموثوقة بمقاومة عالية للاختراق عن بُعد ومقاومة معتدلة للاختراق من خلال الهجمات المباشرة على الأجهزة. |
StrongBox |
آمنة ما دام StrongBox لم يتعرّض للاختراق يتم تنفيذ StrongBox في عنصر آمن مشابه لوحدة أمان الأجهزة. تم تحديد متطلبات التنفيذ الخاصة بـ StrongBox في الفقرة 9.11.2 من مستند تعريف معايير التوافق مع Android. تتسم StrongBox بمقاومة عالية ضد الاختراق عن بُعد والاختراق من خلال الهجوم المباشر على الأجهزة (مثل التلاعب المادي وهجمات القنوات الجانبية). |
حقول AuthorizationList
يتوافق كل حقل مع علامة تفويض Keymaster/KeyMint من
مواصفات واجهة AIDL.
المواصفات هي المصدر الموثوق لعلامات التفويض، بما في ذلك معناها وتنسيق محتواها وما إذا كان من المتوقّع أن تظهر في الحقلَين softwareEnforced أو hardwareEnforced ضمن الكائن KeyDescription وما إذا كانت تستبعد بعضها البعض مع علامات أخرى وما إلى ذلك. جميع الحقول AuthorizationList اختيارية.
يحتوي كل حقل على علامة EXPLICIT خاصة بالسياق تساوي رقم علامة KeyMint أو Keymaster، ما يتيح عرض البيانات بشكل أكثر اختصارًا في AuthorizationList. لذلك، يجب أن يعرف محلّل ASN.1 نوع البيانات المتوقّع لكل علامة خاصة بالسياق. على سبيل المثال، يتم تعريف Tag::USER_AUTH_TYPE على أنّه ENUM | 504. في مخطط إضافة شهادة المصادقة، يتم تحديد الحقل purpose في AuthorizationList على أنّه userAuthType [504] EXPLICIT INTEGER OPTIONAL. لذلك، سيتضمّن ترميز ASN.1 العلامة الخاصة بالسياق 504 بدلاً من علامة الفئة UNIVERSAL لنوع ASN.1 INTEGER، وهو 10.
-
purpose -
يتوافق مع علامة التفويض
Tag::PURPOSEالتي تستخدم قيمة رقم تعريف العلامة 1. -
algorithm -
يتوافق مع علامة التفويض
Tag::ALGORITHM، التي تستخدم قيمة المعرّف 2.في عنصر
AuthorizationListالخاص بشهادة التصديق، تكون قيمة الخوارزمية دائمًاRSAأوECأوML_DSA. -
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.مجموعة المَعلمات المستخدَمة لإنشاء زوج مفاتيح منحنى قطع ناقص (EC)، والتي تستخدم خوارزمية ECDSA للتوقيع والتحقّق، وذلك ضمن مخزن مفاتيح نظام Android.
-
mlDsaVariant -
يظهر هذا الحقل فقط في الإصدار 500 أو الإصدارات الأحدث من خدمة "التصديق على المفتاح".
يتوافق مع علامة التفويض
Tag::ML_DSA_VARIANTالتي تستخدم قيمة المعرّف 11. -
rsaPublicExponent -
يتوافق مع علامة الإذن
Tag::RSA_PUBLIC_EXPONENTالتي تستخدم قيمة المعرّف 200. -
mgfDigest -
يظهر هذا الحقل فقط في إصدار شهادة صحة المفتاح الأكبر من أو يساوي 100.
يتوافق مع علامة التفويضTag::RSA_OAEP_MGF_DIGESTKeyMint التي تستخدم قيمة المعرّف 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.يشير إلى أنّ هذا المفتاح لا يمكن استخدامه إلا إذا قدّم المستخدم دليلاً على تواجده الفعلي. في ما يلي بعض الأمثلة:
- بالنسبة إلى مفتاح StrongBox، يكون زر الجهاز متصلاً مباشرةً بدبوس على جهاز StrongBox.
- بالنسبة إلى مفتاح 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.تمثّل هذه السمة إصدار نظام التشغيل Android المرتبط بـ Keymaster، ويتم تحديدها كعدد صحيح مكوّن من ستة أرقام. على سبيل المثال، يتم تمثيل الإصدار 8.1.0 بالرقم 080100.
يتضمّن الإصدار 1.0 من Keymaster أو الإصدارات الأحدث هذه القيمة في قائمة التفويض.
-
osPatchLevel -
تتطابق مع علامة التفويض
Tag::OS_PATCHLEVELالتي تستخدم قيمة المعرّف 706.الشهر والسنة المرتبطان بحزمة الأمان المستخدَمة في KeyMint (المعروفة سابقًا باسم Keymaster)، ويتم تحديدهما كعدد صحيح مكوّن من ستة أرقام. على سبيل المثال، يتم تمثيل حزمة الأمان لشهر آب (أغسطس) 2018 بالرقم 201808.
يُفضّل استخدام هذا الحقل بدلاً من
vendorPatchLevelأوbootPatchLevelللتحقّق مما إذا كان الجهاز قد تم تصحيحه مؤخرًا.يتضمّن الإصدار 1.0 من Keymaster أو الإصدارات الأحدث هذه القيمة في قائمة التفويض.
-
attestationApplicationId -
يظهر هذا الحقل فقط في إصدارات شهادة صحة المفتاح التي تساوي 2 أو أكبر.
تتوافق مع علامة
Tag::ATTESTATION_APPLICATION_IDالتفويض التي تستخدم قيمة المعرّف 709.لمزيد من التفاصيل، راجِع القسم الذي يصف بنية بيانات 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.تحدّد هذه السمة مستوى رمز تصحيح الأمان لصورة المورّد الذي يجب تثبيته على الجهاز لاستخدام هذا المفتاح. القيمة هي العدد الصحيح الناتج عن أخذ مستوى حزمة الأمان وإزالة الشرطات منه. على سبيل المثال، إذا تم إنشاء مفتاح على جهاز Android مثبّت عليه حزمة أمان بتاريخ 05-08-2018 من المورّد، ستكون هذه القيمة 20180805.
-
bootPatchLevel -
تتوفّر فقط في إصدارات شهادة صحة الجهاز الرئيسية التي تساوي 3 أو أعلى.
يتوافق مع علامة التفويض
Tag::BOOT_PATCHLEVELالتي تستخدم قيمة المعرّف 719.تحدّد هذه السمة مستوى رمز تصحيح الأمان لصورة النواة الذي يجب تثبيته على الجهاز لاستخدام هذا المفتاح. القيمة هي العدد الصحيح الناتج عن أخذ مستوى حزمة الأمان وإزالة الشرطات منه. على سبيل المثال، إذا تم إنشاء مفتاح على جهاز Android مثبَّت عليه حزمة أمان لنواة النظام بتاريخ 2018-08-05، ستكون هذه القيمة 20180805.
-
deviceUniqueAttestation -
تتوفّر فقط في إصدارات شهادة صحة المفتاح 4 أو الإصدارات الأحدث.
تتطابق مع علامة التفويض
Tag::DEVICE_UNIQUE_ATTESTATIONالتي تستخدم قيمة المعرّف 720. -
attestationIdSecondImei -
تتوفّر فقط في إصدارات "شهادة صحة المفتاح" التي تساوي أو تزيد عن 300.
يتوافق مع علامة التفويض
Tag::ATTESTATION_ID_SECOND_IMEIالتي تستخدم قيمة رقم تعريف العلامة 723. -
moduleHash -
يظهر هذا الحقل فقط في إصدارات شهادة صحة المفتاح التي تساوي أو تزيد عن 400.
يتوافق مع علامة
Tag::MODULE_HASHالتفويض التي تستخدم قيمة المعرّف 724.
حقول RootOfTrust
-
verifiedBootKey - هي عبارة عن تجزئة آمنة للمفتاح العام المستخدَم للتحقّق من صحة جميع الرموز التي يتم تنفيذها أثناء عملية بدء تشغيل الجهاز ومن مصداقيتها، وذلك كجزء من عملية التشغيل المُتحقَّق منه. ننصح باستخدام SHA-256.
-
deviceLocked -
تُستخدَم لتحديد ما إذا كان برنامج إقلاع الجهاز مقفلاً. يشير
trueإلى أنّ الجهاز شغّل صورة موقَّعة تم التحقّق منها بنجاح باستخدام التشغيل المتحقَّق منه. -
verifiedBootState - حالة "التشغيل المتحقّق منه" للجهاز.
-
verifiedBootHash - ملخّص لجميع البيانات المحمية بموجب عملية التحقّق من صحة التمهيد بالنسبة إلى الأجهزة التي تستخدم التنفيذ المرجعي لبرنامج Android Verified Boot، يحتوي هذا الحقل على ملخّص VBMeta.
قيم VerifiedBootState
| القيمة | حالة التشغيل المقابلة | المعنى |
|---|---|---|
Verified |
GREEN |
تمتد سلسلة الثقة الكاملة من جذر الثقة المحمي بواسطة الأجهزة إلى برنامج التشغيل وجميع الأقسام التي تم التحقّق منها باستخدام التشغيل المتحقّق منه.
في هذه الحالة، يحتوي الحقل verifiedBootKey على قيمة التجزئة لجذر الثقة المضمّن، وهو الشهادة المضمّنة في ذاكرة القراءة فقط (ROM) للجهاز من قِبل الشركة المصنّعة للجهاز في المصنع. |
SelfSigned |
YELLOW |
هي نفسها Verified، باستثناء أنّ عملية التحقّق تمت باستخدام مصدر ثقة تم إعداده من قِبل المستخدم بدلاً من مصدر الثقة المضمّن من قِبل الشركة المصنّعة في المصنع.
في هذه الحالة، يحتوي الحقل verifiedBootKey على قيمة التجزئة للمفتاح العام الذي أعدّه المستخدم. |
Unverified |
ORANGE |
برنامج الإقلاع في الجهاز غير مقفَل، وبالتالي لا يمكن إنشاء سلسلة ثقة. يمكن تعديل الجهاز بحرية، لذا يجب أن يتحقّق المستخدم من سلامة الجهاز خارج نطاق التطبيق. في هذه الحالة، يحتوي الحقل verifiedBootKey على 32 بايت من الأصفار. |
Failed |
RED |
تعذّر التحقّق من الجهاز. في هذه الحالة، لا تتوفّر أي ضمانات بشأن محتوى الحقول الأخرى RootOfTrust. |
AttestationApplicationId
يعكس هذا الحقل اعتقاد نظام التشغيل Android الأساسي بشأن التطبيقات المسموح لها باستخدام مواد المفتاح السري أثناء عملية التصديق. ويمكن أن يحتوي على حِزم متعدّدة إذا وفقط إذا كانت الحِزم المتعدّدة تتشارك معرّف UID نفسه. يكون الحقل AttestationApplicationId في AuthorizationList من النوع 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لكل شهادة. اسم الحقل مضلِّل، لأنّ البيانات المجزّأة هي شهادات توقيع التطبيق، وليست تواقيع التطبيق، لأنّ الاسم مأخوذ من الفئةSignatureالتي يتم عرضها عند استدعاءgetPackageInfo(). يعرض مقتطف الرمز التالي مجموعة أمثلة:{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 -
عدد تقريبي للشهادات التي تم إصدارها للجهاز خلال آخر 30 يومًا يمكن استخدام هذه القيمة كمؤشر على إساءة الاستخدام المحتملة إذا كانت القيمة أكبر من المتوسط بعدة مراتب.
-
validated_attested_entity -
سلسلة تشير إلى المصدر المعتمد للمفتاح الذي تم إثبات صحته، والذي تم التحقّق منه مباشرةً من قِبل الشركة المصنّعة لشرائح المعالجة. على سبيل المثال،
STRONG_BOXأوTEE.
مفاتيح التصديق
يتم توفير مفتاحَين، أحدهما RSA والآخر ECDSA، وسلاسل الشهادات المقابلة لهما بشكل آمن على الجهاز.
يتضمّن نظام التشغيل Android 12 ميزة توفير المفاتيح عن بُعد، ويشترط نظام التشغيل Android 15 أن تتضمّن جميع الأجهزة هذه الميزة. توفّر خدمة Remote Key Provisioning للأجهزة الميدانية شهادات إثبات صحة ECDSA P256 لكل تطبيق. وتكون مدة صلاحية هذه الشهادات أقصر من مدة صلاحية الشهادات التي يتم توفيرها في المصنع.
المعرّف الفريد
المعرّف الفريد هو قيمة 128 بت تحدّد الجهاز، ولكن لفترة زمنية محدودة فقط. يتم احتساب القيمة باستخدام:
HMAC_SHA256(T || C || R, HBK)
المكان:
Tهي "قيمة العداد الزمني"، ويتم احتسابها من خلال قسمة قيمةTag::CREATION_DATETIMEعلى 2592000000، مع تجاهل أي باقي. يتغيّرTكل 30 يومًا (2592000000 = 30 * 24 * 60 * 60 * 1000).Cهي قيمةTag::APPLICATION_ID- تكون قيمة
Rهي 1 إذا كانTag::RESET_SINCE_ID_ROTATIONمتوفّرًا في المَعلمة attest_params عند طلب attest_key، أو 0 إذا لم تكن العلامة متوفّرة. -
HBKهو سرّ فريد مرتبط بالأجهزة ولا يمكن لبيئة التنفيذ الموثوقة الكشف عنه أبدًا. يحتوي السر على 128 بت على الأقل من البيانات العشوائية وهو فريد لكل جهاز (يمكن قبول الفرادة الاحتمالية بالنظر إلى 128 بت من البيانات العشوائية). يجب أن يتم اشتقاق HBK من مواد المفاتيح المدمجة عبر HMAC أو AES_CMAC.
يجب اقتطاع ناتج HMAC_SHA256 إلى 128 بت.
أرقام IMEI متعددة
يضيف نظام التشغيل Android 14 إمكانية استخدام أرقام IMEI متعددة في سجل "شهادة صحة مفتاح Android". يمكن لمصنّعي المعدات الأصلية تنفيذ هذه الميزة من خلال إضافة علامة KeyMint لرمز IMEI ثانٍ. أصبح من الشائع بشكل متزايد أن تحتوي الأجهزة على العديد من أجهزة الراديو الخلوية، ويمكن لمصنّعي المعدات الأصلية الآن توفير أجهزة برقمَي IMEI.
على مصنّعي المعدات الأصلية توفير رقم IMEI ثانوي، إذا كان متوفّرًا على أجهزتهم، ليتم توفيره لعمليات تنفيذ KeyMint، كي تتمكّن عمليات التنفيذ هذه من إثبات صحة رقم IMEI الثانوي بالطريقة نفسها التي تثبت بها صحة رقم IMEI الأول.
الإقرار باستخدام مستند تعريف الهوية
يتضمّن الإصدار 8.0 من نظام التشغيل Android إمكانية إثبات صحة معرّف الأجهزة التي تتضمّن Keymaster 3. تتيح خدمة "إثبات صحة المعرّف" للجهاز تقديم دليل على معرّفات الأجهزة، مثل الرقم التسلسلي أو رقم IMEI. على الرغم من أنّها ميزة اختيارية، ننصح بشدة بأن تتوافق جميع عمليات تنفيذ Keymaster 3 معها، لأنّ إمكانية إثبات هوية الجهاز تتيح حالات استخدام، مثل الإعداد عن بُعد بدون أي تدخل وبشكل أكثر أمانًا (لأنّ الجهة البعيدة يمكنها التأكّد من أنّها تتواصل مع الجهاز الصحيح، وليس جهازًا ينتحل هوية جهاز آخر).
تعمل ميزة "إثبات صحة المعرّف" من خلال إنشاء نُسخ من معرّفات الأجهزة التي لا يمكن لأي شخص الوصول إليها سوى بيئة التنفيذ الموثوقة (TEE) قبل مغادرة الجهاز للمصنع. يمكن للمستخدم فتح برنامج تحميل التشغيل على الجهاز وتغيير برنامج النظام والمعرّفات التي تعرضها إطارات عمل Android. لا يمكن التلاعب بنسخ المعرّفات التي تحتفظ بها بيئة التنفيذ الموثوقة بهذه الطريقة، ما يضمن أنّ مصادقة رقم تعريف الجهاز لا تصادق إلا على معرّفات الجهاز الأصلية، وبالتالي إحباط محاولات الانتحال.
تستند مساحة واجهة برمجة التطبيقات الرئيسية الخاصة بإثبات صحة المعرّف إلى آلية إثبات صحة المفتاح الحالية التي تم طرحها مع Keymaster 2. عند طلب شهادة إثبات صحة لمفتاح يحتفظ به Keymaster، يمكن للجهة الطالبة أن تطلب تضمين معرّفات الجهاز في بيانات شهادة إثبات الصحة الوصفية. إذا كان المفتاح مخزّنًا في بيئة التنفيذ الموثوقة (TEE)، سيتم ربط سلاسل الشهادات بجذر موثوق معروف. يمكن لمستلِم هذه الشهادة التأكّد من أنّ TEE هو من كتب الشهادة ومحتواها، بما في ذلك معرّفات الأجهزة. عندما يُطلب تضمين معرّفات الأجهزة في شهادة التصديق، لا يصدّق بيئة التنفيذ الموثوقة إلا على المعرّفات المخزّنة فيها، كما تم إدخالها في المصنع.
خصائص مساحة التخزين
يجب أن تتضمّن مساحة التخزين التي تحتوي على معرّفات الجهاز الخصائص التالية:
- يتم نسخ القيم المستمدّة من المعرّفات الأصلية للجهاز إلى مساحة التخزين قبل مغادرة الجهاز المصنع.
- يمكن أن تؤدي طريقة
destroyAttestationIds()إلى إتلاف هذه النسخة من البيانات المستندة إلى المعرّف نهائيًا. يعني التلف الدائم إزالة البيانات بالكامل، وبالتالي لا يمكن استعادتها من خلال إعادة الضبط على الإعدادات الأصلية أو أي إجراء آخر يتم تنفيذه على الجهاز. ويكون ذلك مهمًا بشكل خاص للأجهزة التي فتح فيها المستخدم برنامج الإقلاع وغير برنامج النظام وعدّل المعرّفات التي تعرضها إطارات عمل Android. - يجب أن تتوفّر في مرافق RMA إمكانية إنشاء نُسخ جديدة من البيانات المستندة إلى معرّف الجهاز. بهذه الطريقة، يمكن لجهاز تم إرساله إلى مركز RMA إجراء عملية إثبات صحة المعرّف مرة أخرى. يجب حماية الآلية التي تستخدمها مرافق إعادة التصنيع (RMA) حتى لا يتمكّن المستخدمون من تشغيلها بأنفسهم، لأنّ ذلك سيسمح لهم بالحصول على شهادات مصادقة لأرقام تعريف مزيّفة.
- لا يمكن لأي رمز برمجي آخر غير تطبيق Keymaster الموثوق في بيئة التنفيذ الموثوقة (TEE) قراءة البيانات المستندة إلى المعرّف والمخزّنة.
- يجب أن يكون التخزين مقاومًا للتلاعب: إذا تم تعديل محتوى التخزين، سيتعامل معه TEE كما لو تم إتلاف نُسخ المحتوى، وسيرفض جميع محاولات إثبات صحة المستندات. يتم تنفيذ ذلك من خلال توقيع أو إنشاء رمز مصادقة الرسائل (MAC) للتخزين كما هو موضّح أدناه.
- لا تتضمّن وحدة التخزين المعرّفات الأصلية. بما أنّ عملية إثبات صحة المستندات تتضمّن اختبارًا، يقدّم المتّصل دائمًا المعرّفات التي سيتم إثبات صحتها. كل ما على بيئة التنفيذ الموثوقة هو التأكّد من أنّ هذه القيم تتطابق مع القيم التي كانت لديها في الأصل. يتم إتاحة عملية التحقّق هذه من خلال تخزين رموز التجزئة الآمنة للقيم الأصلية بدلاً من القيم نفسها.
أشغال
لإنشاء عملية تنفيذ تتضمّن السمات المذكورة أعلاه، خزِّن القيم المشتقة من المعرّف في بنية S التالية. لا تخزِّن نُسخًا أخرى من قيم المعرّف، باستثناء المواضع العادية في النظام التي يمكن لمالك الجهاز تعديلها من خلال إجراء عملية الروت:
S = D || HMAC(HBK, D)
where:
D = HMAC(HBK, ID1) || HMAC(HBK, ID2) || ... || HMAC(HBK, IDn)HMACهي بنية HMAC مع تجزئة آمنة مناسبة (يُنصح باستخدام SHA-256)-
HBKهو مفتاح مرتبط بالجهاز ولا يُستخدم لأي غرض آخر -
ID1...IDnهي قيم المعرّفات الأصلية، ويرتبط كل معرّف بفهرس معيّن حسب طريقة التنفيذ، لأنّ عدد المعرّفات يختلف من جهاز إلى آخر. - يمثّل
||التسلسل
بما أنّ نواتج HMAC تكون بحجم ثابت، لا يلزم توفير عناوين أو بنية أخرى للعثور على تجزئات أرقام التعريف الفردية أو HMAC الخاص بـ D. بالإضافة إلى التحقّق من القيم المقدَّمة لإجراء عملية التصديق، يجب أن تتحقّق عمليات التنفيذ من صحة S من خلال استخراج D من S، واحتساب HMAC(HBK, D) ومقارنته بالقيمة في S للتأكّد من عدم تعديل أو إتلاف أي أرقام تعريف فردية. بالإضافة إلى ذلك، يجب أن تستخدم عمليات التنفيذ مقارنات بوقت ثابت لجميع عناصر المعرّف الفردية والتحقّق من صحة S. يجب أن يكون وقت المقارنة ثابتًا بغض النظر عن عدد أرقام التعريف المقدَّمة والمطابقة الصحيحة لأي جزء من الاختبار.
معرّفات الأجهزة
تتيح خدمة "إثبات صحة المستند التعريفي" استخدام معرّفات الأجهزة التالية:
- اسم العلامة التجارية، كما يعرضه
Build.BRANDعلى Android - اسم الجهاز، كما تعرضه
Build.DEVICEفي Android - اسم المنتج، كما يتم عرضه من خلال
Build.PRODUCTفي Android - اسم الشركة المصنّعة، كما يتم عرضه بواسطة
Build.MANUFACTURERفي Android - اسم الطراز، كما تعرضه
Build.MODELفي Android - الرقم التسلسلي
- أرقام IMEI لجميع الاتصالات اللاسلكية
- أرقام تعريف المعدات المتنقلة (MEID) لجميع أجهزة الراديو
لإتاحة إثبات صحة رقم تعريف الجهاز، يثبت الجهاز صحة هذه المعرّفات. تتوفّر الوحدات الست الأولى على جميع أجهزة Android، وهي ضرورية لكي تعمل هذه الميزة. إذا كان الجهاز يتضمّن أي أجهزة راديو خلوية مدمجة، يجب أن يتيح الجهاز أيضًا إثبات صحة أرقام IMEI و/أو MEID الخاصة بأجهزة الراديو.
يتم طلب إثبات صحة المستند التعريفي من خلال إجراء عملية إثبات صحة المفتاح وتضمين معرّفات الجهاز المطلوب إثبات صحتها في الطلب. يتم وضع علامة على المعرّفات على النحو التالي:
ATTESTATION_ID_BRANDATTESTATION_ID_DEVICEATTESTATION_ID_PRODUCTATTESTATION_ID_MANUFACTURERATTESTATION_ID_MODELATTESTATION_ID_SERIALATTESTATION_ID_IMEIATTESTATION_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 بالخط العريض، مع إضافة تعليقات.
Java API
هذا القسم مخصّص لتقديم المعلومات فقط. لا ينفّذ مطوّرو Keymaster واجهة برمجة التطبيقات Java API ولا يستخدمونها. يتم توفير ذلك لمساعدة المطوّرين على فهم كيفية استخدام التطبيقات لهذه الميزة. قد تستخدم مكونات النظام هذه السمة بشكل مختلف، ولهذا السبب من المهم عدم التعامل مع هذا القسم على أنّه معياري.