Keystore مکان امن تری برای ایجاد، ذخیره و استفاده از کلیدهای رمزنگاری به روشی کنترل شده فراهم می کند. هنگامی که ذخیرهسازی کلید با پشتوانه سختافزاری در دسترس است و استفاده میشود، مواد کلید در برابر استخراج از دستگاه ایمنتر هستند و Keymaster محدودیتهایی را اعمال میکند که به سختی میتوان آنها را برانداز کرد.
با این حال، این تنها در صورتی صادق است که کلیدهای ذخیرهسازی کلید در فضای ذخیرهسازی سختافزاری قرار داشته باشند. در Keymaster 1، هیچ راهی برای برنامه ها یا سرورهای راه دور وجود نداشت که به طور قابل اعتماد تأیید کنند که آیا چنین است. دیمون keystore، keymaster موجود HAL را بارگذاری کرد و هر آنچه که HAL در رابطه با پشتوانه سخت افزاری کلیدها می گفت، باور داشت.
برای رفع این مشکل، Keymaster گواهینامه کلید را در Android 7.0 (Keymaster 2) و گواهی ID را در Android 8.0 (Keymaster 3) معرفی کرد.
هدف تأیید کلید ارائه راهی برای تعیین قویاً تعیین اینکه آیا یک جفت کلید نامتقارن دارای پشتوانه سخت افزاری است، ویژگی های کلید چیست و چه محدودیت هایی برای استفاده از آن اعمال می شود.
گواهی شناسه به دستگاه اجازه می دهد تا مدرک شناسایی سخت افزاری خود، مانند شماره سریال یا IMEI را ارائه دهد.
گواهی کلیدی
برای پشتیبانی از گواهی کلید، اندروید 7.0 مجموعه ای از برچسب ها، نوع و روش را به 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
کی مستر 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
ساختار دستگاه کی مستر است. -
keyToAttest
حباب کلیدی است که ازgenerateKey
بازگردانده شده است که گواهی برای آن ایجاد شده است. -
attestParams
لیستی از پارامترهای لازم برای تأیید است. این شاملTag::ATTESTATION_CHALLENGE
و احتمالاًTag::RESET_SINCE_ID_ROTATION
، و همچنینTag::APPLICATION_ID
وTag::APPLICATION_DATA
است. دو مورد آخر برای رمزگشایی حباب کلید در صورتی که در طول تولید کلید مشخص شده باشند، ضروری هستند. -
certChain
پارامتر خروجی است که آرایه ای از گواهی ها را برمی گرداند. ورودی 0 گواهی گواهی است، به این معنی که کلید را ازkeyToAttest
تأیید می کند و حاوی پسوند گواهی است.
متد attestKey
یک عملیات کلید عمومی روی کلید تایید شده در نظر گرفته می شود، زیرا می توان آن را در هر زمان فراخوانی کرد و نیازی به رعایت محدودیت های مجوز ندارد. به عنوان مثال، اگر کلید تأیید شده برای استفاده نیاز به احراز هویت کاربر داشته باشد، میتوان بدون احراز هویت کاربر، یک تأییدیه تولید کرد.
گواهی تصدیق
گواهی تأیید یک گواهی استاندارد X.509 با پسوند گواهی اختیاری است که حاوی توضیحات کلید تأیید شده است. این گواهی با یک کلید گواهی تایید شده امضا شده است. کلید تأیید ممکن است از الگوریتم متفاوتی نسبت به کلید تأیید شده استفاده کند.
گواهی گواهی شامل فیلدهای جدول زیر است و نمی تواند حاوی فیلدهای اضافی باشد. برخی از فیلدها مقدار فیلد ثابتی را مشخص می کنند. آزمونهای CTS تأیید میکنند که محتوای گواهی دقیقاً مطابق تعریف است.
SEQUENCE گواهی
نام فیلد (به RFC 5280 مراجعه کنید) | ارزش |
---|---|
گواهی tbs | SEQUENCE گواهی TBSC |
الگوریتم امضا | AlgorithmIdentifier الگوریتم مورد استفاده برای علامت گذاری کلید: ECDSA برای کلیدهای EC، RSA برای کلیدهای RSA. |
signatureValue | BIT STRING، امضای محاسبه شده در ASN.1 DER-encoded tbsCertificate. |
SEQUENCE گواهی TBSC
نام فیلد (به RFC 5280 مراجعه کنید) | ارزش |
---|---|
version | INTEGER 2 (به معنای گواهی v3) |
serialNumber | INTEGER 1 (مقدار ثابت: در همه گواهی ها یکسان است) |
signature | AlgorithmIdentifier الگوریتم مورد استفاده برای علامت گذاری کلید: ECDSA برای کلیدهای EC، RSA برای کلیدهای RSA. |
issuer | مانند فیلد موضوع کلید تأیید دسته ای. |
validity | SEQUENCE از دو تاریخ، حاوی مقادیر 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 | ارزش TBD |
extensions/"attestation" | OID 1.3.6.1.4.1.11129.2.1.17 است. محتوا در بخش پسوند گواهی در زیر تعریف شده است. مانند تمام پسوندهای گواهی X.509، محتوا به صورت OCTET_STRING حاوی رمزگذاری DER از SEQUENCE گواهی نمایش داده می شود. |
تمدید تصدیق
پسوند attestation
دارای OID 1.3.6.1.4.1.11129.2.1.17
است. حاوی اطلاعاتی درباره جفت کلید مورد تایید و وضعیت دستگاه در زمان تولید کلید است.
انواع برچسب Keymaster/KeyMint تعریف شده در مشخصات رابط AIDL به انواع ASN.1 به صورت زیر ترجمه می شوند:
نوع Keymaster/KeyMint | نوع 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 GMT. |
BOOL | NULL | تگ حضور به معنای واقعی است، غیبت به معنای نادرست است. |
BIGNUM | هیچ برچسبی این نوع را ندارد، بنابراین هیچ نقشه برداری تعریف نشده است. | |
BYTES | OCTET_STRING |
طرحواره
محتوای پسوند گواهی با طرح ASN.1 زیر توصیف می شود:
نسخه 300
KeyDescription ::= SEQUENCE { attestationVersion 300, attestationSecurityLevel SecurityLevel, keyMintVersion INTEGER, keyMintSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, mgfDigest [203] EXPLICIT SET OF INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, usageCountLimit [405] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [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 200, attestationSecurityLevel SecurityLevel, keyMintVersion INTEGER, keyMintSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, mgfDigest [203] EXPLICIT SET OF INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, usageCountLimit [405] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [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 100, attestationSecurityLevel SecurityLevel, keyMintVersion INTEGER, keyMintSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, mgfDigest [203] EXPLICIT SET OF INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, usageCountLimit [405] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [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 4, attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, 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, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT 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, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, allApplications [600] 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 3, attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, 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, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, allApplications [600] 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 2, attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, 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 1, attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, 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.
ارزش نسخه Keymaster/KeyMint 1 کی مستر نسخه 2.0 2 کی مستر نسخه 3.0 3 کی مستر نسخه 4.0 4 کی مستر نسخه 4.1 100 KeyMint نسخه 1.0 200 KeyMint نسخه 2.0 300 KeyMint نسخه 3.0 -
attestationSecurityLevel
سطح امنیتی مکانی که کلید تأیید شده در آن ذخیره می شود.
-
keymasterVersion
/keyMintVersion
- نسخه اجرای لایه انتزاعی سخت افزاری Keymaster/KeyMint (HAL).
ارزش نسخه Keymaster/KeyMint 2 کی مستر نسخه 2.0 3 کی مستر نسخه 3.0 4 کی مستر نسخه 4.0 41 کی مستر نسخه 4.1 100 KeyMint نسخه 1.0 200 KeyMint نسخه 2.0 300 KeyMint نسخه 3.0 -
keymasterSecurityLevel
/keyMintSecurityLevel
- سطح امنیتی اجرای Keymaster/KeyMint.
-
attestationChallenge
- چالش ارائه شده در زمان تولید کلید.
-
uniqueId
- یک شناسه دستگاه حساس به حریم خصوصی که برنامههای سیستم میتوانند در زمان تولید کلید درخواست کنند. اگر شناسه منحصر به فرد درخواست نشود، این قسمت خالی است. برای جزئیات، بخش شناسه منحصر به فرد را ببینید.
-
softwareEnforced
- لیست مجوزهای Keymaster/KeyMint که توسط سیستم Android اعمال می شود. این اطلاعات توسط کد در پلتفرم جمع آوری یا تولید می شود و در پارتیشن سیستم دستگاه ذخیره می شود. تا زمانی که دستگاه دارای سیستم عاملی است که با مدل امنیتی پلتفرم Android مطابقت دارد (یعنی بوت لودر دستگاه قفل شده و
verifiedBootState
Verified
باشد) قابل اعتماد است. -
hardwareEnforced
- لیست مجوز Keymaster/KeyMint که توسط Trusted Execution Environment (TEE) یا StrongBox دستگاه اعمال میشود. این اطلاعات با کد موجود در سخت افزار امن جمع آوری یا تولید می شود و توسط پلتفرم کنترل نمی شود. به عنوان مثال، اطلاعات می تواند از بوت لودر یا از طریق یک کانال ارتباطی امن که شامل اعتماد به پلت فرم نیست، به دست آید.
مقادیر SecurityLevel
مقدار SecurityLevel
میزان انعطاف پذیری یک عنصر مرتبط با Keystore (به عنوان مثال، جفت کلید و گواهی) را در برابر حمله نشان می دهد.
ارزش | معنی |
---|---|
Software | تا زمانی که سیستم اندروید دستگاه با مدل امنیتی پلتفرم Android مطابقت داشته باشد (یعنی بوت لودر دستگاه قفل شده و verifiedBootState Verified است) ایمن باشد. |
TrustedEnvironment | تا زمانی که محیط اجرای مورد اعتماد (TEE) به خطر نیفتد، ایمن باشید. الزامات جداسازی برای TEE ها در بخش های 9.11 [C-1-1] تا [C-1-4] سند تعریف سازگاری Android تعریف شده است. TEE ها در برابر نفوذ از راه دور بسیار مقاوم هستند و در برابر حمله مستقیم سخت افزاری نسبتاً مقاوم هستند. |
StrongBox | تا زمانی که StrongBox به خطر نیفتد، ایمن باشید. StrongBox در یک عنصر امن شبیه به یک ماژول امنیتی سخت افزاری پیاده سازی شده است. الزامات پیاده سازی StrongBox در بخش 9.11.2 سند تعریف سازگاری اندروید تعریف شده است. StrongBox در برابر سازش از راه دور و به خطر افتادن با حمله مستقیم سخت افزاری (به عنوان مثال، دستکاری فیزیکی و حملات کانال جانبی) بسیار مقاوم است. |
فیلدهای AuthorizationList
هر فیلد مربوط به برچسب مجوز Keymaster/KeyMint از مشخصات رابط AIDL است. مشخصات منبع حقیقت در مورد تگ های مجوز است: معنای آنها، قالب محتوای آنها، اینکه آیا انتظار می رود در فیلدهای softwareEnforced
یا hardwareEnforced
در شی KeyDescription
ظاهر شوند، اینکه آیا آنها متقابلاً با برچسب های دیگر منحصر به فرد هستند، و غیره. All AuthorizationList
فیلدها اختیاری هستند
هر فیلد دارای یک تگ متن خاص EXPLICIT
برابر با شماره برچسب Keymaster/KeyMint است که نمایش فشرده تری از داده ها را در AuthorizationList
امکان پذیر می کند. بنابراین تجزیه کننده ASN.1 باید نوع داده مورد انتظار برای هر تگ زمینه خاص را بداند. به عنوان مثال، Tag::USER_AUTH_TYPE
به عنوان ENUM | 504
تعریف می شود ENUM | 504
. در طرح توسعه گواهی، فیلد purpose
در AuthorizationList
به عنوان userAuthType [504] EXPLICIT INTEGER OPTIONAL
مشخص شده است. بنابراین رمزگذاری ASN.1 آن به جای تگ کلاس UNIVERSAL
برای نوع ASN.1 INTEGER
، که 10
است، حاوی تگ 504
برای زمینه خاص خواهد بود.
-
purpose
- مربوط به
Tag::PURPOSE
است که از مقدار شناسه برچسب 1 استفاده می کند. -
algorithm
مربوط به تگ مجوز
Tag::ALGORITHM
است که از مقدار شناسه برچسب 2 استفاده می کند.در یک شیء تاییدیه
AuthorizationList
، مقدار الگوریتم همیشهRSA
یاEC
است.-
keySize
- مربوط به برچسب مجوز
Tag::KEY_SIZE
است که از مقدار شناسه برچسب 3 استفاده می کند. -
digest
- مربوط به تگ مجوز
Tag::DIGEST
است که از مقدار شناسه برچسب 5 استفاده می کند. -
padding
- مربوط به برچسب مجوز
Tag::PADDING
است که از مقدار شناسه برچسب 6 استفاده می کند. -
ecCurve
مربوط به برچسب مجوز
Tag::EC_CURVE
است که از مقدار شناسه برچسب 10 استفاده می کند.مجموعه پارامترهای مورد استفاده برای تولید یک جفت کلید منحنی بیضوی (EC) که از ECDSA برای امضا و تأیید در فروشگاه کلید سیستم اندروید استفاده میکند.
-
rsaPublicExponent
- مربوط به برچسب مجوز
Tag::RSA_PUBLIC_EXPONENT
است که از مقدار شناسه برچسب 200 استفاده می کند. -
mgfDigest
فقط در نسخه گواهی کلیدی >= 100 ارائه شود.
مربوط بهTag::RSA_OAEP_MGF_DIGEST
مجوز KeyMint است که از مقدار شناسه برچسب 203 استفاده می کند.-
rollbackResistance
فقط در نسخه گواهی کلیدی >= 3 ارائه شود.
مربوط به برچسب مجوز
Tag::ROLLBACK_RESISTANCE
است که از مقدار شناسه برچسب 303 استفاده می کند.-
earlyBootOnly
فقط در نسخه گواهی کلیدی >= 4 ارائه شود.
مربوط به برچسب مجوز
Tag::EARLY_BOOT_ONLY
است که از مقدار شناسه برچسب 305 استفاده می کند.-
activeDateTime
- مربوط به برچسب مجوز
Tag::ACTIVE_DATETIME
است که از مقدار شناسه برچسب 400 استفاده می کند. -
originationExpireDateTime
- مربوط به
Tag::ORIGINATION_EXPIRE_DATETIME
مجوز Keymaster است که از مقدار شناسه برچسب 401 استفاده می کند. -
usageExpireDateTime
- مربوط به برچسب مجوز
Tag::USAGE_EXPIRE_DATETIME
است که از مقدار شناسه برچسب 402 استفاده می کند. -
usageCountLimit
- مربوط به
Tag::USAGE_COUNT_LIMIT
است که از مقدار شناسه برچسب 405 استفاده می کند. -
noAuthRequired
مربوط به برچسب مجوز
Tag::NO_AUTH_REQUIRED
است که از مقدار شناسه برچسب 503 استفاده می کند.-
userAuthType
- مربوط به برچسب مجوز
Tag::USER_AUTH_TYPE
است که از مقدار شناسه برچسب 504 استفاده می کند. -
authTimeout
- مربوط به برچسب مجوز
Tag::AUTH_TIMEOUT
است که از مقدار شناسه برچسب 505 استفاده می کند. -
allowWhileOnBody
مربوط به برچسب مجوز
Tag::ALLOW_WHILE_ON_BODY
است که از مقدار شناسه برچسب 506 استفاده می کند.در صورتی که کاربر همچنان دستگاه را روی بدن خود میپوشد، به کلید اجازه میدهد پس از مدت زمان وقفه تأیید اعتبار استفاده شود. توجه داشته باشید که یک سنسور روی بدنه ایمن تعیین می کند که آیا دستگاه بر روی بدن کاربر پوشیده شده است یا خیر.
-
trustedUserPresenceRequired
فقط در نسخه گواهی کلیدی >= 3 ارائه شود.
مربوط به
Tag::TRUSTED_USER_PRESENCE_REQUIRED
است که از مقدار شناسه برچسب 507 استفاده می کند.مشخص می کند که این کلید فقط در صورتی قابل استفاده است که کاربر مدرک حضور فیزیکی ارائه کرده باشد. چندین مثال شامل موارد زیر است:
- برای یک کلید StrongBox، یک دکمه سخت افزاری به یک پین در دستگاه StrongBox متصل شده است.
- برای یک کلید TEE، تا زمانی که TEE کنترل انحصاری اسکنر را داشته باشد و فرآیند تطبیق اثر انگشت را انجام دهد، احراز هویت اثر انگشت اثبات حضور را ارائه میکند.
-
trustedConfirmationRequired
فقط در نسخه گواهی کلیدی >= 3 ارائه شود.
مربوط به
Tag::TRUSTED_CONFIRMATION_REQUIRED
است که از مقدار شناسه برچسب 508 استفاده می کند.مشخص میکند که کلید فقط در صورتی قابل استفاده است که کاربر تأییدیه دادههایی را که باید امضا میشود با استفاده از یک نشانه تأیید ارائه کند. برای اطلاعات بیشتر درباره نحوه دریافت تأییدیه کاربر، به تأیید محافظت شده Android مراجعه کنید.
توجه: این تگ فقط برای کلیدهایی که از هدف
SIGN
استفاده می کنند قابل استفاده است.-
unlockedDeviceRequired
فقط در نسخه گواهی کلیدی >= 3 ارائه شود.
مربوط به
Tag::UNLOCKED_DEVICE_REQUIRED
است که از مقدار شناسه برچسب 509 استفاده می کند.-
allApplications
مربوط به برچسب مجوز
Tag::ALL_APPLICATIONS
است که از مقدار شناسه برچسب 600 استفاده می کند.نشان می دهد که آیا همه برنامه های یک دستگاه می توانند به جفت کلید دسترسی داشته باشند یا خیر.
-
applicationId
- مربوط به تگ مجوز
Tag::APPLICATION_ID
است که از مقدار شناسه برچسب 601 استفاده می کند. -
creationDateTime
- مربوط به برچسب مجوز
Tag::CREATION_DATETIME
است که از مقدار شناسه برچسب 701 استفاده می کند. -
origin
مربوط به تگ مجوز
Tag::ORIGIN
است که از مقدار شناسه برچسب 702 استفاده می کند.-
rollbackResistant
فقط در گواهینامه های کلیدی نسخه های 1 و 2 ارائه شود.
مربوط به برچسب مجوز
Tag::ROLLBACK_RESISTANT
است که از مقدار شناسه برچسب 703 استفاده می کند.-
rootOfTrust
مربوط به تگ مجوز
Tag::ROOT_OF_TRUST
است که از مقدار شناسه برچسب 704 استفاده می کند.برای جزئیات بیشتر، به بخش توصیف ساختار داده RootOfTrust مراجعه کنید.
-
osVersion
مربوط به تگ مجوز
Tag::OS_VERSION
است که از مقدار شناسه برچسب 705 استفاده می کند.نسخه سیستم عامل اندروید مرتبط با Keymaster که به عنوان یک عدد صحیح شش رقمی مشخص شده است. به عنوان مثال، نسخه 8.1.0 به عنوان 080100 نشان داده شده است.
فقط Keymaster نسخه 1.0 یا بالاتر شامل این مقدار در لیست مجوزها است.
-
osPatchLevel
مربوط به برچسب مجوز
Tag::PATCHLEVEL
است که از مقدار شناسه برچسب 706 استفاده می کند.ماه و سال مرتبط با وصله امنیتی که در Keymaster استفاده می شود، به عنوان یک عدد صحیح شش رقمی مشخص شده است. به عنوان مثال، پچ آگوست 2018 به عنوان 201808 نشان داده شده است.
فقط Keymaster نسخه 1.0 یا بالاتر شامل این مقدار در لیست مجوزها است.
-
attestationApplicationId
فقط در نسخه های گواهی کلیدی >= 2 ارائه شود.
مربوط به
Tag::ATTESTATION_APPLICATION_ID
مجوز Keymaster است که از مقدار شناسه برچسب 709 استفاده می کند.برای جزئیات بیشتر، به بخش توصیف ساختار داده AttestationApplicationId مراجعه کنید.
-
attestationIdBrand
فقط در نسخه های گواهی کلیدی >= 2 ارائه شود.
مربوط به
Tag::ATTESTATION_ID_BRAND
Keymaster است که از مقدار شناسه برچسب 710 استفاده می کند.-
attestationIdDevice
فقط در نسخه های گواهی کلیدی >= 2 ارائه شود.
مربوط به
Tag::ATTESTATION_ID_DEVICE
Keymaster است که از مقدار شناسه برچسب 711 استفاده می کند.-
attestationIdProduct
فقط در نسخه های گواهی کلیدی >= 2 ارائه شود.
مربوط به
Tag::ATTESTATION_ID_PRODUCT
Keymaster است که از مقدار شناسه برچسب 712 استفاده می کند.-
attestationIdSerial
فقط در نسخه های گواهی کلیدی >= 2 ارائه شود.
مربوط به تگ
Tag::ATTESTATION_ID_SERIAL
Keymaster است که از مقدار شناسه برچسب 713 استفاده می کند.-
attestationIdImei
فقط در نسخه های گواهی کلیدی >= 2 ارائه شود.
مربوط به برچسب مجوز
Tag::ATTESTATION_ID_IMEI
است که از مقدار شناسه برچسب 714 استفاده می کند.-
attestationIdMeid
فقط در نسخه های گواهی کلیدی >= 2 ارائه شود.
مربوط به برچسب مجوز
Tag::ATTESTATION_ID_MEID
است که از مقدار شناسه برچسب 715 استفاده می کند.-
attestationIdManufacturer
فقط در نسخه های گواهی کلیدی >= 2 ارائه شود.
مربوط به
Tag::ATTESTATION_ID_MANUFACTURER
است که از مقدار شناسه برچسب 716 استفاده می کند.-
attestationIdModel
فقط در نسخه های گواهی کلیدی >= 2 ارائه شود.
مربوط به برچسب مجوز
Tag::ATTESTATION_ID_MODEL
است که از مقدار شناسه برچسب 717 استفاده می کند.-
vendorPatchLevel
فقط در نسخه های گواهی کلیدی >= 3 ارائه شود.
مربوط به برچسب مجوز
Tag::VENDOR_PATCHLEVEL
است که از مقدار شناسه برچسب 718 استفاده می کند.سطح وصله امنیتی تصویر فروشنده را که برای استفاده از این کلید باید روی دستگاه نصب شود، مشخص می کند. مقدار به شکل YYYYMMDD ظاهر می شود که نشان دهنده تاریخ وصله امنیتی فروشنده است. به عنوان مثال، اگر کلیدی در یک دستگاه اندرویدی با نصب وصله امنیتی 1 آگوست 2018 فروشنده تولید شود، این مقدار 20180801 خواهد بود.
-
bootPatchLevel
فقط در نسخه های گواهی کلیدی >= 3 ارائه شود.
مربوط به برچسب مجوز
Tag::BOOT_PATCHLEVEL
است که از مقدار شناسه برچسب 719 استفاده می کند.سطح وصله امنیتی تصویر هسته را مشخص می کند که برای استفاده از این کلید باید روی دستگاه نصب شود. مقدار به شکل YYYYMMDD ظاهر می شود که نشان دهنده تاریخ وصله امنیتی سیستم است. به عنوان مثال، اگر کلیدی در دستگاه اندرویدی با نصب وصله امنیتی 5 آگوست 2018 سیستم تولید شود، این مقدار 20180805 خواهد بود.
-
deviceUniqueAttestation
فقط در نسخه های گواهی کلیدی >= 4 ارائه شود.
مربوط به
Tag::DEVICE_UNIQUE_ATTESTATION
است که از مقدار شناسه برچسب 720 استفاده می کند.-
attestationIdSecondImei
فقط در نسخه های گواهی کلیدی >= 300 ارائه شود.
مربوط به برچسب مجوز
Tag::ATTESTATION_ID_SECOND_IMEI
است که از مقدار شناسه برچسب 723 استفاده می کند.
فیلدهای RootOfTrust
-
verifiedBootKey
- یک هش ایمن از کلید عمومی که برای تأیید یکپارچگی و صحت همه کدهایی که در هنگام راهاندازی دستگاه به عنوان بخشی از Boot تأیید شده اجرا میشوند، استفاده میشود. SHA-256 توصیه می شود.
-
deviceLocked
- اینکه آیا بوت لودر دستگاه قفل است یا خیر.
true
به این معنی است که دستگاه یک تصویر امضا شده را بوت کرده است که با موفقیت توسط Verified Boot تأیید شده است. -
verifiedBootState
- وضعیت بوت تأیید شده دستگاه
-
verifiedBootHash
- خلاصه ای از تمام داده های محافظت شده توسط Verified Boot . برای دستگاههایی که از پیادهسازی مرجع Android Verified Boot استفاده میکنند، این قسمت حاوی خلاصه VBMeta است.
مقادیر VerifiedBootState
ارزش | وضعیت بوت مربوطه | معنی |
---|---|---|
Verified | GREEN | یک زنجیره کامل از اعتماد از یک ریشه اعتماد محافظت شده توسط سخت افزار تا بوت لودر و تمام پارتیشن های تایید شده توسط Verified Boot گسترش می یابد. در این حالت، فیلد verifiedBootKey حاوی هش ریشه اعتماد جاسازی شده است، که گواهی تعبیه شده در رام دستگاه توسط سازنده دستگاه در کارخانه است. |
SelfSigned | YELLOW | مانند Verified ، با این تفاوت که تأیید با استفاده از ریشه اعتماد پیکربندی شده توسط کاربر به جای ریشه اعتماد تعبیه شده توسط سازنده در کارخانه انجام شد. در این حالت، فیلد verifiedBootKey حاوی هش کلید عمومی است که توسط کاربر پیکربندی شده است. |
Unverified | ORANGE | بوت لودر دستگاه باز است، بنابراین نمی توان زنجیره ای از اعتماد ایجاد کرد. دستگاه را می توان آزادانه تغییر داد، بنابراین یکپارچگی دستگاه باید توسط کاربر خارج از باند تأیید شود. در این حالت فیلد verifiedBootKey حاوی 32 بایت صفر است. |
Failed | RED | تأیید دستگاه ناموفق بود. در این حالت، هیچ تضمینی در مورد محتوای سایر فیلدهای RootOfTrust وجود ندارد. |
شناسه برنامه تایید
این فیلد منعکس کننده اعتقاد پلتفرم اندروید در مورد اینکه کدام برنامه ها مجاز به استفاده از مواد کلید مخفی تحت تأیید است. این می تواند حاوی چندین بسته باشد اگر و فقط در صورتی که چندین بسته یک 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]), ...}
شناسه منحصر به فرد
شناسه منحصر به فرد یک مقدار 128 بیتی است که دستگاه را شناسایی می کند، اما فقط برای مدت زمان محدود. مقدار با:
HMAC_SHA256(T || C || R, HBK)
کجا:
-
T
"مقدار شمارشگر زمانی" است که با تقسیم مقدارTag::CREATION_DATETIME
بر 2592000000 محاسبه می شود و باقی مانده را حذف می کند.T
هر 30 روز تغییر می کند (2592000000 = 30 * 24 * 60 * 60 * 1000). -
C
مقدارTag::APPLICATION_ID
است - اگر
Tag::RESET_SINCE_ID_ROTATION
در پارامتر attest_params برای فراخوانی attest_key وجود داشته باشد،R
برابر 1 است، یا اگر برچسب وجود نداشته باشد، 0 است. -
HBK
یک راز منحصربفرد سخت افزاری است که توسط Trusted Execution Environment شناخته شده و هرگز توسط آن فاش نشده است. راز حاوی حداقل 128 بیت آنتروپی است و برای هر دستگاه منحصر به فرد است (یکتایی احتمالی با توجه به 128 بیت آنتروپی قابل قبول است). HBK باید از مواد کلید ذوب شده از طریق HMAC یا AES_CMAC مشتق شود.
خروجی HMAC_SHA256 را به 128 بیت کوتاه کنید.
کلیدهای تصدیق و گواهی
دو کلید، یک RSA و یک ECDSA، و زنجیره های گواهی مربوطه، به طور ایمن در دستگاه قرار داده شده اند.
Android 12 Remote Key Provisioning را معرفی میکند و Android 13 نیازمند اجرای آن توسط دستگاهها است. Remote Key Provisioning دستگاه هایی را در این زمینه با هر برنامه، گواهی گواهی ECDSA P256 ارائه می دهد. این گواهی ها نسبت به گواهی های ارائه شده در کارخانه عمر کوتاه تری دارند.
چندین IMEI
اندروید 14 پشتیبانی از چندین IMEI را در رکورد تأیید کلید اندروید اضافه می کند. OEM ها می توانند این ویژگی را با افزودن یک تگ KeyMint برای IMEI دوم پیاده سازی کنند. به طور فزاینده ای رایج می شود که دستگاه ها چندین رادیو سلولی داشته باشند و OEM ها اکنون می توانند دستگاه هایی با دو IMEI را پشتیبانی کنند.
OEM ها ملزم به داشتن یک IMEI ثانویه هستند، در صورت وجود در دستگاه هایشان، به پیاده سازی(های) KeyMint ارائه شود تا این پیاده سازی ها بتوانند آن را به همان روشی که به IMEI اول تأیید می کنند، تأیید کنند.
ارائه پسوند اطلاعات
پسوند اطلاعات تامین دارای OID 1.3.6.1.4.1.11129.2.1.30
است. برنامه افزودنی اطلاعاتی را ارائه می دهد که توسط سرور تأمین کننده درباره دستگاه شناخته شده است.
طرحواره
پسوند از طرح CDDL زیر پیروی می کند:
{ 1 : int, ; certificates issued }
نقشه بدون نسخه است و ممکن است فیلدهای اختیاری جدیدی اضافه شوند.
-
certs_issued
تعداد تقریبی گواهیهایی که در 30 روز گذشته برای دستگاه صادر شده است. این مقدار میتواند بهعنوان سیگنالی برای سوءاستفاده احتمالی استفاده شود، اگر مقدار با مقداری از مقدار از حد متوسط بیشتر باشد.
گواهی شناسایی
Android 8.0 شامل پشتیبانی اختیاری برای تأیید شناسه برای دستگاههای دارای Keymaster 3 میشود. تأیید ID به دستگاه اجازه میدهد تا مدرک شناسایی سختافزاری خود، مانند شماره سریال یا IMEI را ارائه دهد. اگرچه یک ویژگی اختیاری است، اما به شدت توصیه میشود که همه پیادهسازیهای Keymaster 3 از آن پشتیبانی کنند، زیرا توانایی اثبات هویت دستگاه، موارد استفاده مانند پیکربندی کنترل از راه دور صفر لمسی را ایمنتر میسازد (زیرا سمت راه دور میتواند از آن مطمئن باشد. با دستگاه مناسب صحبت می کند، نه دستگاهی که هویت آن را جعل می کند).
تأیید شناسه با ایجاد کپی از شناسههای سختافزاری دستگاه کار میکند که فقط محیط اجرای معتمد (TEE) میتواند قبل از خروج دستگاه از کارخانه به آنها دسترسی داشته باشد. کاربر می تواند بوت لودر دستگاه را باز کند و نرم افزار سیستم و شناسه های گزارش شده توسط فریمورک های اندروید را تغییر دهد. کپی شناسه هایی که توسط TEE نگهداری می شوند را نمی توان به این روش دستکاری کرد، اطمینان حاصل شود که گواهی شناسه دستگاه فقط شناسه های سخت افزاری اصلی دستگاه را تأیید می کند و در نتیجه تلاش های جعل را خنثی می کند.
سطح اصلی API برای تأیید شناسه بر روی مکانیزم تأیید کلید موجود که با Keymaster 2 معرفی شده است، ساخته میشود. هنگام درخواست گواهی تأیید برای کلیدی که توسط keymaster نگهداری میشود، تماسگیرنده میتواند درخواست کند که شناسههای سختافزار دستگاه در فراداده گواهی تأیید گنجانده شود. اگر کلید در TEE نگه داشته شود، گواهینامه به یک ریشه شناخته شده اعتماد باز می گردد. گیرنده چنین گواهی می تواند تأیید کند که گواهی و محتویات آن، از جمله شناسه های سخت افزاری، توسط TEE نوشته شده است. وقتی از TEE خواسته میشود که شناسههای سختافزاری را در گواهی تصدیق لحاظ کند، تنها شناسههایی را که در انبارش نگهداری میشود، همانطور که در طبقه کارخانه جمعآوری شده است، تأیید میکند.
خواص ذخیره سازی
فضای ذخیرهسازی که شناسههای دستگاه را در خود جای میدهد باید این ویژگیها را داشته باشد:
- مقادیر به دست آمده از شناسه های اصلی دستگاه قبل از خروج دستگاه از کارخانه در حافظه کپی می شود.
- متد
destroyAttestationIds()
می تواند این کپی از داده های مشتق شده از شناسه را برای همیشه از بین ببرد. تخریب دائمی به این معنی است که داده ها به طور کامل حذف می شوند، بنابراین نه بازنشانی کارخانه ای و نه هیچ روش دیگری که روی دستگاه انجام شده است نمی تواند آن را بازیابی کند. این به ویژه برای دستگاههایی که کاربر بوت لودر را باز کرده و نرمافزار سیستم را تغییر داده و شناسههای بازگردانده شده توسط فریمورکهای اندروید را تغییر داده است، بسیار مهم است. - امکانات RMA باید توانایی تولید کپی های تازه از داده های مشتق شده از شناسه سخت افزار را داشته باشند. به این ترتیب، دستگاهی که از RMA عبور می کند می تواند دوباره گواهی ID را انجام دهد. مکانیسم مورد استفاده توسط تسهیلات RMA باید محافظت شود تا کاربران نتوانند خودشان آن را فراخوانی کنند، زیرا این امکان را به آنها می دهد تا گواهی شناسه های جعلی را دریافت کنند.
- هیچ کد دیگری به جز برنامه قابل اعتماد Keymaster در TEE قادر به خواندن داده های مشتق شده از شناسه نگهداری شده در حافظه نیست.
- ذخیرهسازی غیرقابل دستکاری است: اگر محتوای ذخیرهسازی اصلاح شده باشد، TEE با آن بهگونهای برخورد میکند که گویی کپیهای محتوا از بین رفتهاند و تمام تلاشهای تأیید هویت را رد میکند. این کار با امضا کردن یا MAC کردن فضای ذخیره سازی همانطور که در زیر توضیح داده شده است اجرا می شود.
- ذخیره سازی شناسه های اصلی را نگه نمی دارد. از آنجا که تأیید شناسه شامل یک چالش است، تماس گیرنده همیشه شناسه هایی را که باید تأیید شوند را ارائه می دهد. TEE فقط باید تأیید کند که این مقادیر با مقادیر اولیه مطابقت دارند. ذخیره هش های ایمن مقادیر اصلی به جای مقادیر، این تأیید را فعال می کند.
ساخت و ساز
برای ایجاد پیادهسازی که دارای ویژگیهای فهرستشده در بالا باشد، مقادیر مشتقشده از ID را در ساختار S ذخیره کنید. کپیهای دیگری از مقادیر ID را ذخیره نکنید، به جز مکانهای عادی در سیستم، که صاحب دستگاه میتواند با روت کردن آنها را تغییر دهد:
S = D || HMAC(HBK, D)
کجا:
-
D = HMAC(HBK, ID 1 ) || HMAC(HBK, ID 2 ) || ... || HMAC(HBK, ID n )
-
HMAC
ساختار HMAC با هش امن مناسب است (SHA-256 توصیه می شود) -
HBK
یک کلید سخت افزاری است که برای هیچ هدف دیگری استفاده نمی شود -
ID 1 ...ID n
مقادیر ID اصلی هستند. ارتباط یک مقدار خاص با یک شاخص خاص به پیاده سازی بستگی دارد، زیرا دستگاه های مختلف تعداد شناسه های متفاوتی دارند. -
||
الحاق را نشان می دهد
از آنجایی که خروجیهای HMAC اندازه ثابتی دارند، هیچ هدر یا ساختار دیگری برای یافتن هشهای ID یا HMAC از D لازم نیست. علاوه بر بررسی مقادیر ارائهشده برای انجام تأیید، پیادهسازیها باید S را با استخراج D از S تأیید کنند. ، محاسبه HMAC(HBK, D) و مقایسه آن با مقدار S برای تأیید اینکه هیچ شناسه فردی تغییر یا خراب نشده است. همچنین، پیادهسازیها باید از مقایسههای زمان ثابت برای همه عناصر ID استفاده کنند و اعتبار S. زمان مقایسه باید بدون توجه به تعداد شناسههای ارائهشده و تطابق صحیح هر بخش از آزمون ثابت باشد.
شناسه های سخت افزاری
گواهی شناسه از شناسه های سخت افزاری زیر پشتیبانی می کند:
- نام تجاری، همانطور که توسط
Build.BRAND
در Android برگردانده شده است - نام دستگاه، همانطور که توسط
Build.DEVICE
در Android برگردانده شده است - نام محصول، همانطور که توسط
Build.PRODUCT
در Android بازگردانده شده است - نام سازنده، همانطور که
Build.MANUFACTURER
در Android برگردانده است - نام مدل، همانطور که توسط
Build.MODEL
در Android برگردانده شده است - شماره سریال
- 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 پررنگ ، همراه با نظرات است.
Java API
این بخش فقط اطلاعاتی است. پیادهسازهای Keymaster نه API جاوا را پیادهسازی میکنند و نه استفاده میکنند. این برای کمک به پیادهسازان برای درک نحوه استفاده از این ویژگی توسط برنامهها ارائه شده است. اجزای سیستم ممکن است متفاوت از آن استفاده کنند، به همین دلیل بسیار مهم است که این بخش به عنوان هنجاری در نظر گرفته نشود.
،Keystore مکان امن تری برای ایجاد، ذخیره و استفاده از کلیدهای رمزنگاری به روشی کنترل شده فراهم می کند. هنگامی که ذخیرهسازی کلید با پشتوانه سختافزاری در دسترس است و استفاده میشود، مواد کلید در برابر استخراج از دستگاه ایمنتر هستند و Keymaster محدودیتهایی را اعمال میکند که به سختی میتوان آنها را برانداز کرد.
با این حال، این تنها در صورتی صادق است که کلیدهای ذخیرهسازی کلید در فضای ذخیرهسازی سختافزاری قرار داشته باشند. در Keymaster 1، هیچ راهی برای برنامه ها یا سرورهای راه دور وجود نداشت که به طور قابل اعتماد تأیید کنند که آیا چنین است. دیمون keystore، keymaster موجود HAL را بارگذاری کرد و هر آنچه که HAL در رابطه با پشتوانه سخت افزاری کلیدها می گفت، باور داشت.
برای رفع این مشکل، Keymaster گواهینامه کلید را در Android 7.0 (Keymaster 2) و گواهی ID را در Android 8.0 (Keymaster 3) معرفی کرد.
هدف تأیید کلید ارائه راهی برای تعیین قویاً تعیین اینکه آیا یک جفت کلید نامتقارن دارای پشتوانه سخت افزاری است، ویژگی های کلید چیست و چه محدودیت هایی برای استفاده از آن اعمال می شود.
گواهی شناسه به دستگاه اجازه می دهد تا مدرک شناسایی سخت افزاری خود، مانند شماره سریال یا IMEI را ارائه دهد.
گواهی کلیدی
برای پشتیبانی از گواهی کلید، اندروید 7.0 مجموعه ای از برچسب ها، نوع و روش را به 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
کی مستر 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
ساختار دستگاه کی مستر است. -
keyToAttest
حباب کلیدی است که ازgenerateKey
بازگردانده شده است که گواهی برای آن ایجاد شده است. -
attestParams
لیستی از پارامترهای لازم برای تأیید است. این شاملTag::ATTESTATION_CHALLENGE
و احتمالاًTag::RESET_SINCE_ID_ROTATION
، و همچنینTag::APPLICATION_ID
وTag::APPLICATION_DATA
است. دو مورد آخر برای رمزگشایی حباب کلید در صورتی که در طول تولید کلید مشخص شده باشند، ضروری هستند. -
certChain
پارامتر خروجی است که آرایه ای از گواهی ها را برمی گرداند. ورودی 0 گواهی گواهی است، به این معنی که کلید را ازkeyToAttest
تأیید می کند و حاوی پسوند گواهی است.
متد attestKey
یک عملیات کلید عمومی روی کلید تایید شده در نظر گرفته می شود، زیرا می توان آن را در هر زمان فراخوانی کرد و نیازی به رعایت محدودیت های مجوز ندارد. به عنوان مثال، اگر کلید تأیید شده برای استفاده نیاز به احراز هویت کاربر داشته باشد، میتوان بدون احراز هویت کاربر، یک تأییدیه تولید کرد.
گواهی تصدیق
گواهی تأیید یک گواهی استاندارد X.509 با پسوند گواهی اختیاری است که حاوی توضیحات کلید تأیید شده است. این گواهی با یک کلید گواهی تایید شده امضا شده است. کلید تأیید ممکن است از الگوریتم متفاوتی نسبت به کلید تأیید شده استفاده کند.
گواهی گواهی شامل فیلدهای جدول زیر است و نمی تواند حاوی فیلدهای اضافی باشد. برخی از فیلدها مقدار فیلد ثابتی را مشخص می کنند. آزمونهای CTS تأیید میکنند که محتوای گواهی دقیقاً مطابق تعریف است.
SEQUENCE گواهی
نام فیلد (به RFC 5280 مراجعه کنید) | ارزش |
---|---|
گواهی tbs | SEQUENCE گواهی TBSC |
الگوریتم امضا | AlgorithmIdentifier الگوریتم مورد استفاده برای علامت گذاری کلید: ECDSA برای کلیدهای EC، RSA برای کلیدهای RSA. |
signatureValue | BIT STRING، امضای محاسبه شده در ASN.1 DER-encoded tbsCertificate. |
SEQUENCE گواهی TBSC
نام فیلد (به RFC 5280 مراجعه کنید) | ارزش |
---|---|
version | INTEGER 2 (به معنای گواهی v3) |
serialNumber | INTEGER 1 (مقدار ثابت: در همه گواهی ها یکسان است) |
signature | AlgorithmIdentifier الگوریتم مورد استفاده برای علامت گذاری کلید: ECDSA برای کلیدهای EC، RSA برای کلیدهای RSA. |
issuer | مانند فیلد موضوع کلید تأیید دسته ای. |
validity | SEQUENCE از دو تاریخ، حاوی مقادیر 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 | ارزش TBD |
extensions/"attestation" | OID 1.3.6.1.4.1.11129.2.1.17 است. محتوا در بخش پسوند گواهی در زیر تعریف شده است. مانند تمام پسوندهای گواهی X.509، محتوا به صورت OCTET_STRING حاوی رمزگذاری DER از SEQUENCE گواهی نمایش داده می شود. |
تمدید تصدیق
پسوند attestation
دارای OID 1.3.6.1.4.1.11129.2.1.17
است. حاوی اطلاعاتی درباره جفت کلید مورد تایید و وضعیت دستگاه در زمان تولید کلید است.
انواع برچسب Keymaster/KeyMint تعریف شده در مشخصات رابط AIDL به انواع ASN.1 به صورت زیر ترجمه می شوند:
نوع Keymaster/KeyMint | نوع 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 GMT. |
BOOL | NULL | تگ حضور به معنای واقعی است، غیبت به معنای نادرست است. |
BIGNUM | هیچ برچسبی این نوع را ندارد، بنابراین هیچ نقشه برداری تعریف نشده است. | |
BYTES | OCTET_STRING |
طرحواره
محتوای پسوند گواهی با طرح ASN.1 زیر توصیف می شود:
نسخه 300
KeyDescription ::= SEQUENCE { attestationVersion 300, attestationSecurityLevel SecurityLevel, keyMintVersion INTEGER, keyMintSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, mgfDigest [203] EXPLICIT SET OF INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, usageCountLimit [405] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [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 200, attestationSecurityLevel SecurityLevel, keyMintVersion INTEGER, keyMintSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, mgfDigest [203] EXPLICIT SET OF INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, usageCountLimit [405] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [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 100, attestationSecurityLevel SecurityLevel, keyMintVersion INTEGER, keyMintSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, mgfDigest [203] EXPLICIT SET OF INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, usageCountLimit [405] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [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 4, attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, 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, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT 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, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, allApplications [600] 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 3, attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, 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, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, allApplications [600] 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 2, attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, 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 1, attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, 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.
ارزش نسخه Keymaster/KeyMint 1 کی مستر نسخه 2.0 2 کی مستر نسخه 3.0 3 کی مستر نسخه 4.0 4 کی مستر نسخه 4.1 100 KeyMint نسخه 1.0 200 KeyMint نسخه 2.0 300 KeyMint نسخه 3.0 -
attestationSecurityLevel
سطح امنیتی مکانی که کلید تأیید شده در آن ذخیره می شود.
-
keymasterVersion
/keyMintVersion
- نسخه اجرای لایه انتزاعی سخت افزاری Keymaster/KeyMint (HAL).
ارزش نسخه Keymaster/KeyMint 2 کی مستر نسخه 2.0 3 کی مستر نسخه 3.0 4 کی مستر نسخه 4.0 41 کی مستر نسخه 4.1 100 KeyMint نسخه 1.0 200 KeyMint نسخه 2.0 300 KeyMint نسخه 3.0 -
keymasterSecurityLevel
/keyMintSecurityLevel
- سطح امنیتی اجرای Keymaster/KeyMint.
-
attestationChallenge
- چالش ارائه شده در زمان تولید کلید.
-
uniqueId
- یک شناسه دستگاه حساس به حریم خصوصی که برنامههای سیستم میتوانند در زمان تولید کلید درخواست کنند. اگر شناسه منحصر به فرد درخواست نشود، این قسمت خالی است. برای جزئیات، بخش شناسه منحصر به فرد را ببینید.
-
softwareEnforced
- لیست مجوزهای Keymaster/KeyMint که توسط سیستم Android اعمال می شود. این اطلاعات توسط کد در پلتفرم جمع آوری یا تولید می شود و در پارتیشن سیستم دستگاه ذخیره می شود. تا زمانی که دستگاه دارای سیستم عاملی است که با مدل امنیتی پلتفرم Android مطابقت دارد (یعنی بوت لودر دستگاه قفل شده و
verifiedBootState
Verified
باشد) قابل اعتماد است. -
hardwareEnforced
- لیست مجوز Keymaster/KeyMint که توسط Trusted Execution Environment (TEE) یا StrongBox دستگاه اعمال میشود. این اطلاعات با کد موجود در سخت افزار امن جمع آوری یا تولید می شود و توسط پلتفرم کنترل نمی شود. به عنوان مثال، اطلاعات می تواند از بوت لودر یا از طریق یک کانال ارتباطی امن که شامل اعتماد به پلت فرم نیست، به دست آید.
مقادیر SecurityLevel
مقدار SecurityLevel
میزان انعطاف پذیری یک عنصر مرتبط با Keystore (به عنوان مثال، جفت کلید و گواهی) را در برابر حمله نشان می دهد.
ارزش | معنی |
---|---|
Software | تا زمانی که سیستم اندروید دستگاه با مدل امنیتی پلتفرم Android مطابقت داشته باشد (یعنی بوت لودر دستگاه قفل شده و verifiedBootState Verified است) ایمن باشد. |
TrustedEnvironment | تا زمانی که محیط اجرای مورد اعتماد (TEE) به خطر نیفتد، ایمن باشید. الزامات جداسازی برای TEE ها در بخش های 9.11 [C-1-1] تا [C-1-4] سند تعریف سازگاری Android تعریف شده است. TEE ها در برابر نفوذ از راه دور بسیار مقاوم هستند و در برابر حمله مستقیم سخت افزاری نسبتاً مقاوم هستند. |
StrongBox | تا زمانی که StrongBox به خطر نیفتد، ایمن باشید. StrongBox در یک عنصر امن شبیه به یک ماژول امنیتی سخت افزاری پیاده سازی شده است. الزامات پیاده سازی StrongBox در بخش 9.11.2 سند تعریف سازگاری اندروید تعریف شده است. StrongBox در برابر سازش از راه دور و به خطر افتادن با حمله مستقیم سخت افزاری (به عنوان مثال، دستکاری فیزیکی و حملات کانال جانبی) بسیار مقاوم است. |
فیلدهای AuthorizationList
هر فیلد مربوط به برچسب مجوز Keymaster/KeyMint از مشخصات رابط AIDL است. مشخصات منبع حقیقت در مورد تگ های مجوز است: معنای آنها، قالب محتوای آنها، اینکه آیا انتظار می رود در فیلدهای softwareEnforced
یا hardwareEnforced
در شی KeyDescription
ظاهر شوند، اینکه آیا آنها متقابلاً با برچسب های دیگر منحصر به فرد هستند، و غیره. All AuthorizationList
فیلدها اختیاری هستند
هر فیلد دارای یک تگ متن خاص EXPLICIT
برابر با شماره برچسب Keymaster/KeyMint است که نمایش فشرده تری از داده ها را در AuthorizationList
امکان پذیر می کند. بنابراین تجزیه کننده ASN.1 باید نوع داده مورد انتظار برای هر تگ زمینه خاص را بداند. به عنوان مثال، Tag::USER_AUTH_TYPE
به عنوان ENUM | 504
تعریف می شود ENUM | 504
. در طرح توسعه گواهی، فیلد purpose
در AuthorizationList
به عنوان userAuthType [504] EXPLICIT INTEGER OPTIONAL
مشخص شده است. بنابراین رمزگذاری ASN.1 آن به جای تگ کلاس UNIVERSAL
برای نوع ASN.1 INTEGER
، که 10
است، حاوی تگ 504
برای زمینه خاص خواهد بود.
-
purpose
- مربوط به
Tag::PURPOSE
است که از مقدار شناسه برچسب 1 استفاده می کند. -
algorithm
مربوط به تگ مجوز
Tag::ALGORITHM
است که از مقدار شناسه برچسب 2 استفاده می کند.در یک شیء تاییدیه
AuthorizationList
، مقدار الگوریتم همیشهRSA
یاEC
است.-
keySize
- مربوط به برچسب مجوز
Tag::KEY_SIZE
است که از مقدار شناسه برچسب 3 استفاده می کند. -
digest
- مربوط به تگ مجوز
Tag::DIGEST
است که از مقدار شناسه برچسب 5 استفاده می کند. -
padding
- مربوط به برچسب مجوز
Tag::PADDING
است که از مقدار شناسه برچسب 6 استفاده می کند. -
ecCurve
مربوط به برچسب مجوز
Tag::EC_CURVE
است که از مقدار شناسه برچسب 10 استفاده می کند.مجموعه پارامترهای مورد استفاده برای تولید یک جفت کلید منحنی بیضوی (EC) که از ECDSA برای امضا و تأیید در فروشگاه کلید سیستم اندروید استفاده میکند.
-
rsaPublicExponent
- مربوط به برچسب مجوز
Tag::RSA_PUBLIC_EXPONENT
است که از مقدار شناسه برچسب 200 استفاده می کند. -
mgfDigest
فقط در نسخه گواهی کلیدی >= 100 ارائه شود.
مربوط بهTag::RSA_OAEP_MGF_DIGEST
مجوز KeyMint است که از مقدار شناسه برچسب 203 استفاده می کند.-
rollbackResistance
فقط در نسخه گواهی کلیدی >= 3 ارائه شود.
مربوط به برچسب مجوز
Tag::ROLLBACK_RESISTANCE
است که از مقدار شناسه برچسب 303 استفاده می کند.-
earlyBootOnly
فقط در نسخه گواهی کلیدی >= 4 ارائه شود.
مربوط به برچسب مجوز
Tag::EARLY_BOOT_ONLY
است که از مقدار شناسه برچسب 305 استفاده می کند.-
activeDateTime
- مربوط به برچسب مجوز
Tag::ACTIVE_DATETIME
است که از مقدار شناسه برچسب 400 استفاده می کند. -
originationExpireDateTime
- مربوط به
Tag::ORIGINATION_EXPIRE_DATETIME
مجوز Keymaster است که از مقدار شناسه برچسب 401 استفاده می کند. -
usageExpireDateTime
- مربوط به برچسب مجوز
Tag::USAGE_EXPIRE_DATETIME
است که از مقدار شناسه برچسب 402 استفاده می کند. -
usageCountLimit
- مربوط به
Tag::USAGE_COUNT_LIMIT
است که از مقدار شناسه برچسب 405 استفاده می کند. -
noAuthRequired
مربوط به برچسب مجوز
Tag::NO_AUTH_REQUIRED
است که از مقدار شناسه برچسب 503 استفاده می کند.-
userAuthType
- مربوط به برچسب مجوز
Tag::USER_AUTH_TYPE
است که از مقدار شناسه برچسب 504 استفاده می کند. -
authTimeout
- مربوط به برچسب مجوز
Tag::AUTH_TIMEOUT
است که از مقدار شناسه برچسب 505 استفاده می کند. -
allowWhileOnBody
مربوط به برچسب مجوز
Tag::ALLOW_WHILE_ON_BODY
است که از مقدار شناسه برچسب 506 استفاده می کند.در صورتی که کاربر همچنان دستگاه را روی بدن خود میپوشد، به کلید اجازه میدهد پس از مدت زمان وقفه تأیید اعتبار استفاده شود. توجه داشته باشید که یک سنسور روی بدنه ایمن تعیین می کند که آیا دستگاه بر روی بدن کاربر پوشیده شده است یا خیر.
-
trustedUserPresenceRequired
فقط در نسخه گواهی کلیدی >= 3 ارائه شود.
مربوط به
Tag::TRUSTED_USER_PRESENCE_REQUIRED
است که از مقدار شناسه برچسب 507 استفاده می کند.مشخص می کند که این کلید فقط در صورتی قابل استفاده است که کاربر مدرک حضور فیزیکی ارائه کرده باشد. چندین مثال شامل موارد زیر است:
- برای یک کلید StrongBox، یک دکمه سخت افزاری به یک پین در دستگاه StrongBox متصل شده است.
- برای یک کلید TEE، تا زمانی که TEE کنترل انحصاری اسکنر را داشته باشد و فرآیند تطبیق اثر انگشت را انجام دهد، احراز هویت اثر انگشت اثبات حضور را ارائه میکند.
-
trustedConfirmationRequired
فقط در نسخه گواهی کلیدی >= 3 ارائه شود.
مربوط به
Tag::TRUSTED_CONFIRMATION_REQUIRED
است که از مقدار شناسه برچسب 508 استفاده می کند.مشخص میکند که کلید فقط در صورتی قابل استفاده است که کاربر تأییدیه دادههایی را که باید امضا میشود با استفاده از یک نشانه تأیید ارائه کند. برای اطلاعات بیشتر درباره نحوه دریافت تأییدیه کاربر، به تأیید محافظت شده Android مراجعه کنید.
توجه: این تگ فقط برای کلیدهایی که از هدف
SIGN
استفاده می کنند قابل استفاده است.-
unlockedDeviceRequired
فقط در نسخه گواهی کلیدی >= 3 ارائه شود.
مربوط به
Tag::UNLOCKED_DEVICE_REQUIRED
است که از مقدار شناسه برچسب 509 استفاده می کند.-
allApplications
مربوط به برچسب مجوز
Tag::ALL_APPLICATIONS
است که از مقدار شناسه برچسب 600 استفاده می کند.نشان می دهد که آیا همه برنامه های یک دستگاه می توانند به جفت کلید دسترسی داشته باشند یا خیر.
-
applicationId
- مربوط به تگ مجوز
Tag::APPLICATION_ID
است که از مقدار شناسه برچسب 601 استفاده می کند. -
creationDateTime
- مربوط به برچسب مجوز
Tag::CREATION_DATETIME
است که از مقدار شناسه برچسب 701 استفاده می کند. -
origin
مربوط به تگ مجوز
Tag::ORIGIN
است که از مقدار شناسه برچسب 702 استفاده می کند.-
rollbackResistant
فقط در گواهینامه های کلیدی نسخه های 1 و 2 ارائه شود.
مربوط به برچسب مجوز
Tag::ROLLBACK_RESISTANT
است که از مقدار شناسه برچسب 703 استفاده می کند.-
rootOfTrust
مربوط به تگ مجوز
Tag::ROOT_OF_TRUST
است که از مقدار شناسه برچسب 704 استفاده می کند.برای جزئیات بیشتر، به بخش توصیف ساختار داده RootOfTrust مراجعه کنید.
-
osVersion
مربوط به تگ مجوز
Tag::OS_VERSION
است که از مقدار شناسه برچسب 705 استفاده می کند.نسخه سیستم عامل اندروید مرتبط با Keymaster که به عنوان یک عدد صحیح شش رقمی مشخص شده است. به عنوان مثال، نسخه 8.1.0 به عنوان 080100 نشان داده شده است.
فقط Keymaster نسخه 1.0 یا بالاتر شامل این مقدار در لیست مجوزها است.
-
osPatchLevel
مربوط به برچسب مجوز
Tag::PATCHLEVEL
است که از مقدار شناسه برچسب 706 استفاده می کند.ماه و سال مرتبط با وصله امنیتی که در Keymaster استفاده می شود، به عنوان یک عدد صحیح شش رقمی مشخص شده است. به عنوان مثال، پچ آگوست 2018 به عنوان 201808 نشان داده شده است.
فقط Keymaster نسخه 1.0 یا بالاتر شامل این مقدار در لیست مجوزها است.
-
attestationApplicationId
فقط در نسخه های گواهی کلیدی >= 2 ارائه شود.
مربوط به
Tag::ATTESTATION_APPLICATION_ID
مجوز Keymaster است که از مقدار شناسه برچسب 709 استفاده می کند.برای جزئیات بیشتر، به بخش توصیف ساختار داده AttestationApplicationId مراجعه کنید.
-
attestationIdBrand
فقط در نسخه های گواهی کلیدی >= 2 ارائه شود.
مربوط به
Tag::ATTESTATION_ID_BRAND
Keymaster است که از مقدار شناسه برچسب 710 استفاده می کند.-
attestationIdDevice
فقط در نسخه های گواهی کلیدی >= 2 ارائه شود.
مربوط به
Tag::ATTESTATION_ID_DEVICE
Keymaster است که از مقدار شناسه برچسب 711 استفاده می کند.-
attestationIdProduct
فقط در نسخه های گواهی کلیدی >= 2 ارائه شود.
مربوط به
Tag::ATTESTATION_ID_PRODUCT
Keymaster است که از مقدار شناسه برچسب 712 استفاده می کند.-
attestationIdSerial
فقط در نسخه های گواهی کلیدی >= 2 ارائه شود.
مربوط به تگ
Tag::ATTESTATION_ID_SERIAL
Keymaster است که از مقدار شناسه برچسب 713 استفاده می کند.-
attestationIdImei
فقط در نسخه های گواهی کلیدی >= 2 ارائه شود.
مربوط به برچسب مجوز
Tag::ATTESTATION_ID_IMEI
است که از مقدار شناسه برچسب 714 استفاده می کند.-
attestationIdMeid
فقط در نسخه های گواهی کلیدی >= 2 ارائه شود.
مربوط به برچسب مجوز
Tag::ATTESTATION_ID_MEID
است که از مقدار شناسه برچسب 715 استفاده می کند.-
attestationIdManufacturer
فقط در نسخه های گواهی کلیدی >= 2 ارائه شود.
مربوط به
Tag::ATTESTATION_ID_MANUFACTURER
است که از مقدار شناسه برچسب 716 استفاده می کند.-
attestationIdModel
فقط در نسخه های گواهی کلیدی >= 2 ارائه شود.
مربوط به برچسب مجوز
Tag::ATTESTATION_ID_MODEL
است که از مقدار شناسه برچسب 717 استفاده می کند.-
vendorPatchLevel
فقط در نسخه های گواهی کلیدی >= 3 ارائه شود.
مربوط به برچسب مجوز
Tag::VENDOR_PATCHLEVEL
است که از مقدار شناسه برچسب 718 استفاده می کند.سطح وصله امنیتی تصویر فروشنده را که برای استفاده از این کلید باید روی دستگاه نصب شود، مشخص می کند. مقدار به شکل YYYYMMDD ظاهر می شود که نشان دهنده تاریخ وصله امنیتی فروشنده است. به عنوان مثال، اگر کلیدی در یک دستگاه اندرویدی با نصب وصله امنیتی 1 آگوست 2018 فروشنده تولید شود، این مقدار 20180801 خواهد بود.
-
bootPatchLevel
فقط در نسخه های گواهی کلیدی >= 3 ارائه شود.
مربوط به برچسب مجوز
Tag::BOOT_PATCHLEVEL
است که از مقدار شناسه برچسب 719 استفاده می کند.سطح وصله امنیتی تصویر هسته را مشخص می کند که برای استفاده از این کلید باید روی دستگاه نصب شود. مقدار به شکل YYYYMMDD ظاهر می شود که نشان دهنده تاریخ وصله امنیتی سیستم است. به عنوان مثال، اگر کلیدی در دستگاه اندرویدی با نصب وصله امنیتی 5 آگوست 2018 سیستم تولید شود، این مقدار 20180805 خواهد بود.
-
deviceUniqueAttestation
فقط در نسخه های گواهی کلیدی >= 4 ارائه شود.
مربوط به
Tag::DEVICE_UNIQUE_ATTESTATION
است که از مقدار شناسه برچسب 720 استفاده می کند.-
attestationIdSecondImei
فقط در نسخه های گواهی کلیدی >= 300 ارائه شود.
مربوط به برچسب مجوز
Tag::ATTESTATION_ID_SECOND_IMEI
است که از مقدار شناسه برچسب 723 استفاده می کند.
فیلدهای RootOfTrust
-
verifiedBootKey
- یک هش ایمن از کلید عمومی که برای تأیید یکپارچگی و صحت همه کدهایی که در هنگام راهاندازی دستگاه به عنوان بخشی از Boot تأیید شده اجرا میشوند، استفاده میشود. SHA-256 توصیه می شود.
-
deviceLocked
- اینکه آیا بوت لودر دستگاه قفل است یا خیر.
true
به این معنی است که دستگاه یک تصویر امضا شده را بوت کرده است که با موفقیت توسط Verified Boot تأیید شده است. -
verifiedBootState
- وضعیت بوت تأیید شده دستگاه
-
verifiedBootHash
- خلاصه ای از تمام داده های محافظت شده توسط Verified Boot . برای دستگاههایی که از پیادهسازی مرجع Android Verified Boot استفاده میکنند، این قسمت حاوی خلاصه VBMeta است.
مقادیر VerifiedBootState
ارزش | وضعیت بوت مربوطه | معنی |
---|---|---|
Verified | GREEN | یک زنجیره کامل از اعتماد از یک ریشه اعتماد محافظت شده توسط سخت افزار تا بوت لودر و تمام پارتیشن های تایید شده توسط Verified Boot گسترش می یابد. در این حالت، فیلد verifiedBootKey حاوی هش ریشه اعتماد جاسازی شده است، که گواهی تعبیه شده در رام دستگاه توسط سازنده دستگاه در کارخانه است. |
SelfSigned | YELLOW | مانند Verified ، با این تفاوت که تأیید با استفاده از ریشه اعتماد پیکربندی شده توسط کاربر به جای ریشه اعتماد تعبیه شده توسط سازنده در کارخانه انجام شد. در این حالت، فیلد verifiedBootKey حاوی هش کلید عمومی است که توسط کاربر پیکربندی شده است. |
Unverified | ORANGE | بوت لودر دستگاه باز است، بنابراین نمی توان زنجیره ای از اعتماد ایجاد کرد. دستگاه را می توان آزادانه تغییر داد، بنابراین یکپارچگی دستگاه باید توسط کاربر خارج از باند تأیید شود. در این حالت فیلد verifiedBootKey حاوی 32 بایت صفر است. |
Failed | RED | تأیید دستگاه ناموفق بود. در این حالت، هیچ تضمینی در مورد محتوای سایر فیلدهای RootOfTrust وجود ندارد. |
شناسه برنامه تایید
این فیلد منعکس کننده اعتقاد پلتفرم اندروید در مورد اینکه کدام برنامه ها مجاز به استفاده از مواد کلید مخفی تحت تأیید است. این می تواند حاوی چندین بسته باشد اگر و فقط در صورتی که چندین بسته یک 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]), ...}
شناسه منحصر به فرد
شناسه منحصر به فرد یک مقدار 128 بیتی است که دستگاه را شناسایی می کند، اما فقط برای مدت زمان محدود. مقدار با:
HMAC_SHA256(T || C || R, HBK)
کجا:
-
T
"مقدار شمارشگر زمانی" است که با تقسیم مقدارTag::CREATION_DATETIME
بر 2592000000 محاسبه می شود و باقی مانده را حذف می کند.T
هر 30 روز تغییر می کند (2592000000 = 30 * 24 * 60 * 60 * 1000). -
C
مقدارTag::APPLICATION_ID
است - اگر
Tag::RESET_SINCE_ID_ROTATION
در پارامتر attest_params برای فراخوانی attest_key وجود داشته باشد،R
برابر 1 است، یا اگر برچسب وجود نداشته باشد، 0 است. -
HBK
یک راز منحصربفرد سخت افزاری است که توسط Trusted Execution Environment شناخته شده و هرگز توسط آن فاش نشده است. راز حاوی حداقل 128 بیت آنتروپی است و برای هر دستگاه منحصر به فرد است (یکتایی احتمالی با توجه به 128 بیت آنتروپی قابل قبول است). HBK باید از مواد کلید ذوب شده از طریق HMAC یا AES_CMAC مشتق شود.
خروجی HMAC_SHA256 را به 128 بیت کوتاه کنید.
کلیدهای تصدیق و گواهی
دو کلید، یک RSA و یک ECDSA، و زنجیره های گواهی مربوطه، به طور ایمن در دستگاه قرار داده شده اند.
Android 12 Remote Key Provisioning را معرفی میکند و Android 13 نیازمند اجرای آن توسط دستگاهها است. Remote Key Provisioning دستگاه هایی را در این زمینه با هر برنامه، گواهی گواهی ECDSA P256 ارائه می دهد. این گواهی ها نسبت به گواهی های ارائه شده در کارخانه عمر کوتاه تری دارند.
چندین IMEI
اندروید 14 پشتیبانی از چندین IMEI را در رکورد تأیید کلید اندروید اضافه می کند. OEM ها می توانند این ویژگی را با افزودن یک تگ KeyMint برای IMEI دوم پیاده سازی کنند. به طور فزاینده ای رایج می شود که دستگاه ها چندین رادیو سلولی داشته باشند و OEM ها اکنون می توانند دستگاه هایی با دو IMEI را پشتیبانی کنند.
OEM ها ملزم به داشتن یک IMEI ثانویه هستند، در صورت وجود در دستگاه هایشان، به پیاده سازی(های) KeyMint ارائه شود تا این پیاده سازی ها بتوانند آن را به همان روشی که به IMEI اول تأیید می کنند، تأیید کنند.
ارائه پسوند اطلاعات
پسوند اطلاعات تامین دارای OID 1.3.6.1.4.1.11129.2.1.30
است. برنامه افزودنی اطلاعاتی را ارائه می دهد که توسط سرور تأمین کننده درباره دستگاه شناخته شده است.
طرحواره
پسوند از طرح CDDL زیر پیروی می کند:
{ 1 : int, ; certificates issued }
نقشه بدون نسخه است و ممکن است فیلدهای اختیاری جدیدی اضافه شوند.
-
certs_issued
تعداد تقریبی گواهیهایی که در 30 روز گذشته برای دستگاه صادر شده است. این مقدار میتواند بهعنوان سیگنالی برای سوءاستفاده احتمالی استفاده شود، اگر مقدار با مقداری از مقدار از حد متوسط بیشتر باشد.
گواهی شناسایی
Android 8.0 شامل پشتیبانی اختیاری برای تأیید شناسه برای دستگاههای دارای Keymaster 3 میشود. تأیید ID به دستگاه اجازه میدهد تا مدرک شناسایی سختافزاری خود، مانند شماره سریال یا IMEI را ارائه دهد. اگرچه یک ویژگی اختیاری است، اما به شدت توصیه میشود که همه پیادهسازیهای Keymaster 3 از آن پشتیبانی کنند، زیرا توانایی اثبات هویت دستگاه، موارد استفاده مانند پیکربندی کنترل از راه دور صفر لمسی را ایمنتر میسازد (زیرا سمت راه دور میتواند از آن مطمئن باشد. با دستگاه مناسب صحبت می کند، نه دستگاهی که هویت آن را جعل می کند).
تأیید شناسه با ایجاد کپی از شناسههای سختافزاری دستگاه کار میکند که فقط محیط اجرای معتمد (TEE) میتواند قبل از خروج دستگاه از کارخانه به آنها دسترسی داشته باشد. کاربر می تواند بوت لودر دستگاه را باز کند و نرم افزار سیستم و شناسه های گزارش شده توسط فریمورک های اندروید را تغییر دهد. کپی شناسه هایی که توسط TEE نگهداری می شوند را نمی توان به این روش دستکاری کرد، اطمینان حاصل شود که گواهی شناسه دستگاه فقط شناسه های سخت افزاری اصلی دستگاه را تأیید می کند و در نتیجه تلاش های جعل را خنثی می کند.
سطح اصلی API برای تأیید شناسه بر روی مکانیزم تأیید کلید موجود که با Keymaster 2 معرفی شده است، ساخته میشود. هنگام درخواست گواهی تأیید برای کلیدی که توسط keymaster نگهداری میشود، تماسگیرنده میتواند درخواست کند که شناسههای سختافزار دستگاه در فراداده گواهی تأیید گنجانده شود. اگر کلید در TEE نگه داشته شود، گواهینامه به یک ریشه شناخته شده اعتماد باز می گردد. گیرنده چنین گواهی می تواند تأیید کند که گواهی و محتویات آن، از جمله شناسه های سخت افزاری، توسط TEE نوشته شده است. وقتی از TEE خواسته میشود که شناسههای سختافزاری را در گواهی تصدیق لحاظ کند، تنها شناسههایی را که در انبارش نگهداری میشود، همانطور که در طبقه کارخانه جمعآوری شده است، تأیید میکند.
خواص ذخیره سازی
فضای ذخیرهسازی که شناسههای دستگاه را در خود جای میدهد باید این ویژگیها را داشته باشد:
- مقادیر به دست آمده از شناسه های اصلی دستگاه قبل از خروج دستگاه از کارخانه در حافظه کپی می شود.
- متد
destroyAttestationIds()
می تواند این کپی از داده های مشتق شده از شناسه را برای همیشه از بین ببرد. تخریب دائمی به این معنی است که داده ها به طور کامل حذف می شوند، بنابراین نه بازنشانی کارخانه ای و نه هیچ روش دیگری که روی دستگاه انجام شده است نمی تواند آن را بازیابی کند. این به ویژه برای دستگاههایی که کاربر بوت لودر را باز کرده و نرمافزار سیستم را تغییر داده و شناسههای بازگردانده شده توسط فریمورکهای اندروید را تغییر داده است، بسیار مهم است. - امکانات RMA باید توانایی تولید کپی های تازه از داده های مشتق شده از شناسه سخت افزار را داشته باشند. به این ترتیب، دستگاهی که از RMA عبور می کند می تواند دوباره گواهی ID را انجام دهد. مکانیسم مورد استفاده توسط تسهیلات RMA باید محافظت شود تا کاربران نتوانند خودشان آن را فراخوانی کنند، زیرا این امکان را به آنها می دهد تا گواهی شناسه های جعلی را دریافت کنند.
- هیچ کد دیگری به جز برنامه قابل اعتماد Keymaster در TEE قادر به خواندن داده های مشتق شده از شناسه نگهداری شده در حافظه نیست.
- ذخیرهسازی غیرقابل دستکاری است: اگر محتوای ذخیرهسازی اصلاح شده باشد، TEE با آن بهگونهای برخورد میکند که گویی کپیهای محتوا از بین رفتهاند و تمام تلاشهای تأیید هویت را رد میکند. این کار با امضا کردن یا MAC کردن فضای ذخیره سازی همانطور که در زیر توضیح داده شده است اجرا می شود.
- ذخیره سازی شناسه های اصلی را نگه نمی دارد. از آنجا که تأیید شناسه شامل یک چالش است، تماس گیرنده همیشه شناسه هایی را که باید تأیید شوند را ارائه می دهد. TEE فقط باید تأیید کند که این مقادیر با مقادیر اولیه مطابقت دارند. ذخیره هش های ایمن مقادیر اصلی به جای مقادیر، این تأیید را فعال می کند.
ساخت و ساز
برای ایجاد پیادهسازی که دارای ویژگیهای فهرستشده در بالا باشد، مقادیر مشتقشده از ID را در ساختار S ذخیره کنید. کپیهای دیگری از مقادیر ID را ذخیره نکنید، به جز مکانهای عادی در سیستم، که صاحب دستگاه میتواند با روت کردن آنها را تغییر دهد:
S = D || HMAC(HBK, D)
کجا:
-
D = HMAC(HBK, ID 1 ) || HMAC(HBK, ID 2 ) || ... || HMAC(HBK, ID n )
-
HMAC
ساختار HMAC با هش امن مناسب است (SHA-256 توصیه می شود) -
HBK
یک کلید سخت افزاری است که برای هیچ هدف دیگری استفاده نمی شود -
ID 1 ...ID n
مقادیر ID اصلی هستند. ارتباط یک مقدار خاص با یک شاخص خاص به پیاده سازی بستگی دارد، زیرا دستگاه های مختلف تعداد شناسه های متفاوتی دارند. -
||
الحاق را نشان می دهد
از آنجایی که خروجیهای HMAC اندازه ثابتی دارند، هیچ هدر یا ساختار دیگری برای یافتن هشهای ID یا HMAC از D لازم نیست. علاوه بر بررسی مقادیر ارائهشده برای انجام تأیید، پیادهسازیها باید S را با استخراج D از S تأیید کنند. ، محاسبه HMAC(HBK, D) و مقایسه آن با مقدار S برای تأیید اینکه هیچ شناسه فردی تغییر یا خراب نشده است. همچنین، پیادهسازیها باید از مقایسههای زمان ثابت برای همه عناصر ID استفاده کنند و اعتبار S. زمان مقایسه باید بدون توجه به تعداد شناسههای ارائهشده و تطابق صحیح هر بخش از آزمون ثابت باشد.
شناسه های سخت افزاری
گواهی شناسه از شناسه های سخت افزاری زیر پشتیبانی می کند:
- نام تجاری، همانطور که توسط
Build.BRAND
در Android برگردانده شده است - نام دستگاه، همانطور که توسط
Build.DEVICE
در Android برگردانده شده است - نام محصول، همانطور که توسط
Build.PRODUCT
در Android بازگردانده شده است - نام سازنده، همانطور که
Build.MANUFACTURER
در Android برگردانده است - نام مدل، همانطور که توسط
Build.MODEL
در Android برگردانده شده است - شماره سریال
- 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 پررنگ ، همراه با نظرات است.
Java API
این بخش فقط اطلاعاتی است. پیادهسازهای Keymaster نه API جاوا را پیادهسازی میکنند و نه استفاده میکنند. این برای کمک به پیادهسازان برای درک نحوه استفاده از این ویژگی توسط برنامهها ارائه شده است. اجزای سیستم ممکن است متفاوت از آن استفاده کنند، به همین دلیل بسیار مهم است که این بخش به عنوان هنجاری در نظر گرفته نشود.