Kho khoá cung cấp một nơi an toàn hơn để tạo, lưu trữ và sử dụng các khoá mã hoá theo cách có kiểm soát. Khi có sẵn và được sử dụng bộ nhớ khoá dựa trên phần cứng, nội dung khoá sẽ an toàn hơn trước hoạt động trích xuất từ thiết bị và KeyMint (trước đây là Keymaster) sẽ thực thi các hạn chế khó lật đổ.
Tuy nhiên, điều này chỉ đúng nếu các khoá trong Kho khoá được lưu trữ trong bộ nhớ dựa trên phần cứng. Trong Keymaster 1, không có cách nào để các ứng dụng hoặc máy chủ từ xa xác minh một cách đáng tin cậy xem có phải trường hợp này hay không. Trình nền kho khoá đã tải lớp trừu tượng phần cứng (HAL) Keymaster có sẵn và tin tưởng mọi thứ mà HAL nói liên quan đến việc hỗ trợ phần cứng của các khoá.
Để khắc phục vấn đề này, chứng thực khoá đã được ra mắt trong Android 7.0 (Keymaster 2) và chứng thực mã nhận dạng đã được ra mắt trong Android 8.0 (Keymaster 3).
Chứng thực khoá nhằm cung cấp một cách thức để xác định chắc chắn xem một cặp khoá bất đối xứng có được hỗ trợ bằng phần cứng hay không, các thuộc tính của khoá là gì và những hạn chế nào được áp dụng cho việc sử dụng khoá đó.
Chứng thực mã nhận dạng cho phép thiết bị cung cấp bằng chứng về giá trị nhận dạng phần cứng của thiết bị, chẳng hạn như số sê-ri hoặc IMEI.
Chứng thực khoá
Để hỗ trợ chứng thực khoá, Android 7.0 đã giới thiệu một bộ thẻ, loại và phương thức cho HAL.
Thẻ (từ khoá)
Tag::ATTESTATION_CHALLENGE
Tag::INCLUDE_UNIQUE_ID
Tag::RESET_SINCE_ID_ROTATION
Loại
Keymaster 2 trở xuống
typedef struct { keymaster_blob_t* entries; size_t entry_count; } keymaster_cert_chain_t;
Phương thức AttestKey
Keymaster 3
attestKey(vec<uint8_t> keyToAttest, vec<KeyParameter> attestParams) generates(ErrorCode error, vec<vec<uint8_t>> certChain);
Keymaster 2 trở xuống
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
là cấu trúc thiết bị Keymaster.keyToAttest
là blob khoá dogenerateKey
trả về mà chứng thực được tạo cho blob đó.attestParams
là danh sách mọi thông số cần thiết cho chứng thực. Trong đó cóTag::ATTESTATION_CHALLENGE
và có thể làTag::RESET_SINCE_ID_ROTATION
, cũng nhưTag::APPLICATION_ID
vàTag::APPLICATION_DATA
. Hai khoá sau là cần thiết để giải mã blob khoá nếu chúng được chỉ định trong quá trình tạo khoá.certChain
là tham số đầu ra, trả về một mảng gồm các chứng chỉ. Mục 0 là chứng chỉ chứng thực, tức là chứng chỉ này chứng nhận khoá từkeyToAttest
và chứa tiện ích chứng thực.
Phương thức attestKey
được coi là một thao tác khoá công khai trên khoá được chứng thực, vì có thể được gọi bất cứ lúc nào và không cần đáp ứng các ràng buộc về việc uỷ quyền. Ví dụ: nếu khoá được chứng thực cần xác thực người dùng để sử dụng, thì bạn có thể tạo một chứng thực mà không cần xác thực người dùng.
Chứng chỉ chứng thực
Chứng chỉ chứng thực là một chứng chỉ X.509 tiêu chuẩn, có tiện ích chứng thực không bắt buộc chứa nội dung mô tả về khoá được chứng thực. Chứng chỉ được ký bằng một khoá chứng thực đã được chứng nhận. Khoá chứng thực có thể sử dụng một thuật toán khác với khoá đang được chứng thực.
Chứng chỉ chứng thực chứa các trường trong bảng bên dưới và không được chứa bất kỳ trường bổ sung nào. Một số trường chỉ định một giá trị trường cố định. Các bài kiểm tra CTS xác thực rằng nội dung chứng chỉ hoàn toàn giống như được xác định.
SEQUENCE chứng chỉ
Tên trường (xem RFC 5280) | Giá trị |
---|---|
tbsCertificate | TBSCertificate SEQUENCE |
signatureAlgorithm | AlgorithmIdentifier của thuật toán dùng để ký khoá: ECDSA cho khoá EC, RSA cho khoá RSA. |
signatureValue | BIT STRING, chữ ký được tính toán trên tbsCertificate được mã hoá ASN.1 DER. |
TBSCertificate SEQUENCE
Tên trường (xem RFC 5280) | Giá trị |
---|---|
version |
INTEGER 2 (có nghĩa là chứng chỉ v3) |
serialNumber |
INTEGER 1 (giá trị cố định: giống nhau trên tất cả các chứng chỉ) |
signature |
AlgorithmIdentifier của thuật toán dùng để ký khoá: ECDSA cho khoá EC, RSA cho khoá RSA. |
issuer |
Giống với trường chủ đề của khoá chứng thực hàng loạt. |
validity |
SEQUENCE của hai ngày, chứa các giá trị của Tag::ACTIVE_DATETIME và Tag::USAGE_EXPIRE_DATETIME .
Những giá trị đó tính bằng mili giây kể từ ngày 1 tháng 1 năm 1970.
Hãy xem RFC 5280 để biết cách biểu thị ngày chính xác trong chứng chỉ.Nếu Tag::ACTIVE_DATETIME không có, hãy dùng giá trị của Tag::CREATION_DATETIME . Nếu không có Tag::USAGE_EXPIRE_DATETIME , hãy sử dụng ngày hết hạn của chứng chỉ khoá chứng thực hàng loạt. |
subject |
CN = "Android Keystore Key" (giá trị cố định: giống nhau trên tất cả các chứng chỉ) |
subjectPublicKeyInfo |
SubjectPublicKeyInfo chứa khoá công khai được chứng thực. |
extensions/Key Usage |
digitalSignature: đặt nếu khoá có mục đích KeyPurpose::SIGN hoặc KeyPurpose::VERIFY . Tất cả các bit khác đều chưa được đặt. |
extensions/CRL Distribution Points |
Giá trị CXĐ |
extensions/"attestation" |
OID là 1.3.6.1.4.1.11129.2.1.17; nội dung được xác định trong phần Tiện ích chứng thực bên dưới. Giống như tất cả các tiện ích chứng chỉ X.509, nội dung được biểu thị dưới dạng OCTET_STRING chứa một mã hoá DER của SEQUENCE chứng thực. |
Tiện ích chứng thực
Tiện ích attestation
có OID 1.3.6.1.4.1.11129.2.1.17
. Nội dung này chứa thông tin về cặp khoá đang được chứng thực và trạng thái của thiết bị tại thời điểm tạo khoá.
Các loại thẻ Keymaster/KeyMint được xác định trong quy cách giao diện AIDL được dịch sang các loại ASN.1 như sau:
Loại KeyMint hoặc Keymaster | Loại ASN.1 | Ghi chú |
---|---|---|
ENUM |
INTEGER |
|
ENUM_REP |
SET of INTEGER |
|
UINT |
INTEGER |
|
UINT_REP |
SET of INTEGER |
|
ULONG |
INTEGER |
|
ULONG_REP |
SET of INTEGER |
|
DATE |
INTEGER |
Số mili giây kể từ 00:00:00 ngày 1 tháng 1 năm 1970 (theo giờ GMT). |
BOOL |
NULL |
Sự hiện diện của thẻ có nghĩa là true, sự vắng mặt có nghĩa là false. |
BIGNUM |
Không có thẻ nào thuộc loại này, nên không có mối liên kết nào được xác định. | |
BYTES |
OCTET_STRING |
Lược đồ
Nội dung của tiện ích chứng thực được mô tả bằng giản đồ ASN.1 sau đây:
Phiên bản 400
KeyDescription ::= SEQUENCE { attestationVersion 400, 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, moduleHash [724] 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), }
Phiên bản 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), }
Phiên bản 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), }
Phiên bản 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), }
Phiên bản 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), }
Phiên bản 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), }
Phiên bản 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), }
Phiên bản 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), }
Trường KeyDescription
-
attestationVersion
-
Phiên bản giản đồ ASN.1.
Giá trị Phiên bản KeyMint hoặc Keymaster 1 Keymaster phiên bản 2.0 2 Keymaster phiên bản 3.0 3 Keymaster phiên bản 4.0 4 Keymaster phiên bản 4.1 100 KeyMint phiên bản 1.0 200 KeyMint phiên bản 2.0 300 KeyMint phiên bản 3.0 400 KeyMint phiên bản 4.0 -
attestationSecurityLevel
-
Mức bảo mật của vị trí lưu trữ khoá đã chứng thực.
-
keymasterVersion
/keyMintVersion
- Phiên bản của quy trình triển khai HAL KeyMint hoặc Keymaster.
Giá trị Phiên bản KeyMint hoặc Keymaster 2 Keymaster phiên bản 2.0 3 Keymaster phiên bản 3.0 4 Keymaster phiên bản 4.0 41 Keymaster phiên bản 4.1 100 KeyMint phiên bản 1.0 200 KeyMint phiên bản 2.0 300 KeyMint phiên bản 3.0 400 KeyMint phiên bản 4.0 -
keymasterSecurityLevel
/keyMintSecurityLevel
- Cấp độ bảo mật của quy trình triển khai KeyMint hoặc Keymaster.
-
attestationChallenge
- Thử thách được đưa ra tại thời điểm tạo khoá.
-
uniqueId
- Giá trị nhận dạng thiết bị nhạy cảm về quyền riêng tư mà các ứng dụng hệ thống có thể yêu cầu tại thời điểm tạo khoá. Nếu không yêu cầu mã nhận dạng duy nhất, thì trường này sẽ trống. Để biết thông tin chi tiết, hãy xem phần Mã nhận dạng duy nhất.
-
softwareEnforced
-
Danh sách uỷ quyền KeyMint hoặc Keymaster do hệ thống Android thực thi. Thông tin này được thu thập hoặc tạo ra bằng mã trong nền tảng. Bạn có thể tin tưởng vào khoá này miễn là thiết bị đang chạy một hệ điều hành tuân thủ Mô hình bảo mật nền tảng Android (tức là trình tải khởi động của thiết bị bị khoá và
verifiedBootState
làVerified
). -
hardwareEnforced
- Danh sách uỷ quyền KeyMint hoặc Keymaster do Môi trường thực thi đáng tin cậy (TEE) hoặc StrongBox của thiết bị thực thi. Thông tin này được thu thập hoặc tạo bởi mã trong phần cứng bảo mật và không do nền tảng kiểm soát. Ví dụ: thông tin có thể đến từ trình tải khởi động hoặc thông qua một kênh liên lạc bảo mật không liên quan đến việc tin tưởng nền tảng.
Giá trị SecurityLevel
Giá trị SecurityLevel
cho biết mức độ mà một phần tử liên quan đến Keystore (ví dụ: cặp khoá và chứng thực) có khả năng chống lại các cuộc tấn công.
Giá trị | Ý nghĩa |
---|---|
Software |
Bảo mật miễn là hệ thống Android của thiết bị tuân thủ Mô hình bảo mật nền tảng Android (tức là trình tải khởi động của thiết bị bị khoá và verifiedBootState là Verified ). |
TrustedEnvironment |
Bảo mật miễn là TEE không bị xâm phạm. Các yêu cầu về việc cô lập đối với TEE được xác định trong mục 9.11 [C-1-1] đến [C-1-4] của Tài liệu định nghĩa về khả năng tương thích với Android. TEE có khả năng chống xâm nhập từ xa rất cao và có khả năng chống xâm nhập ở mức trung bình bằng cách tấn công trực tiếp vào phần cứng. |
StrongBox |
Bảo mật miễn là StrongBox không bị xâm nhập. StrongBox được triển khai trong một Secure Element tương tự như mô-đun bảo mật phần cứng. Các yêu cầu triển khai đối với StrongBox được xác định trong mục 9.11.2 của Tài liệu định nghĩa về khả năng tương thích với Android. StrongBox có khả năng chống xâm nhập từ xa và xâm nhập bằng cách tấn công trực tiếp vào phần cứng (ví dụ: giả mạo thực tế và tấn công kênh bên) rất cao. |
Các trường AuthorizationList
Mỗi trường tương ứng với một thẻ uỷ quyền Keymaster/KeyMint trong quy cách giao diện AIDL.
Quy cách này là nguồn đáng tin cậy về thẻ uỷ quyền: ý nghĩa của thẻ, định dạng nội dung, liệu thẻ có xuất hiện trong các trường softwareEnforced
hoặc hardwareEnforced
trong đối tượng KeyDescription
hay không, liệu thẻ có loại trừ lẫn nhau với các thẻ khác hay không, v.v. Tất cả các trường AuthorizationList
đều không bắt buộc.
Mỗi trường đều có một thẻ EXPLICIT
dành riêng cho bối cảnh, bằng với số thẻ KeyMint hoặc Keymaster, cho phép biểu thị dữ liệu một cách cô đọng hơn trong AuthorizationList
. Do đó, trình phân tích cú pháp ASN.1 phải biết kiểu dữ liệu dự kiến cho từng thẻ dành riêng cho bối cảnh. Ví dụ: Tag::USER_AUTH_TYPE
được xác định là ENUM | 504
. Trong giản đồ tiện ích chứng thực, trường purpose
trong AuthorizationList
được chỉ định là userAuthType [504] EXPLICIT INTEGER OPTIONAL
. Do đó, quá trình mã hoá ASN.1 sẽ chứa thẻ dành riêng cho bối cảnh 504
thay vì thẻ lớp UNIVERSAL
cho loại ASN.1 INTEGER
, tức là 10
.
-
purpose
-
Tương ứng với thẻ uỷ quyền
Tag::PURPOSE
. Thẻ này dùng giá trị mã nhận dạng thẻ là 1. -
algorithm
-
Tương ứng với thẻ uỷ quyền
Tag::ALGORITHM
. Thẻ này dùng giá trị mã nhận dạng thẻ là 2.Trong đối tượng
AuthorizationList
chứng thực, giá trị thuật toán luôn làRSA
hoặcEC
. -
keySize
-
Tương ứng với thẻ uỷ quyền
Tag::KEY_SIZE
. Thẻ này dùng giá trị mã nhận dạng thẻ là 3. -
blockMode
-
Tương ứng với thẻ uỷ quyền
Tag::BLOCK_MODE
. Thẻ này dùng giá trị mã nhận dạng thẻ là 4. -
digest
-
Tương ứng với thẻ uỷ quyền
Tag::DIGEST
. Thẻ này dùng giá trị mã nhận dạng thẻ là 5. -
padding
-
Tương ứng với thẻ uỷ quyền
Tag::PADDING
. Thẻ này dùng giá trị mã nhận dạng thẻ là 6. -
callerNonce
-
Tương ứng với thẻ uỷ quyền
Tag::CALLER_NONCE
. Thẻ này dùng giá trị mã nhận dạng thẻ là 7. -
minMacLength
-
Tương ứng với thẻ uỷ quyền
Tag::MIN_MAC_LENGTH
. Thẻ này dùng giá trị mã nhận dạng thẻ là 8. -
ecCurve
-
Tương ứng với thẻ uỷ quyền
Tag::EC_CURVE
. Thẻ này dùng giá trị mã nhận dạng thẻ là 10.Tập hợp các tham số dùng để tạo cặp khoá đường cong elip (EC), sử dụng ECDSA để ký và xác minh, trong kho khoá của hệ thống Android.
-
rsaPublicExponent
-
Tương ứng với thẻ uỷ quyền
Tag::RSA_PUBLIC_EXPONENT
. Thẻ này dùng giá trị mã nhận dạng thẻ là 200. -
mgfDigest
-
Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 100.
Tương ứng với thẻ uỷ quyền KeyMintTag::RSA_OAEP_MGF_DIGEST
. Thẻ này dùng giá trị mã nhận dạng thẻ là 203. -
rollbackResistance
-
Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 3.
Tương ứng với thẻ uỷ quyền
Tag::ROLLBACK_RESISTANCE
. Thẻ này dùng giá trị mã nhận dạng thẻ là 303. -
earlyBootOnly
-
Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 4.
Tương ứng với thẻ uỷ quyền
Tag::EARLY_BOOT_ONLY
. Thẻ này dùng giá trị mã nhận dạng thẻ là 305. -
activeDateTime
-
Tương ứng với thẻ uỷ quyền
Tag::ACTIVE_DATETIME
. Thẻ này dùng giá trị mã nhận dạng thẻ là 400. -
originationExpireDateTime
-
Tương ứng với thẻ uỷ quyền
Tag::ORIGINATION_EXPIRE_DATETIME
. Thẻ này dùng giá trị mã nhận dạng thẻ là 401. -
usageExpireDateTime
-
Tương ứng với thẻ uỷ quyền
Tag::USAGE_EXPIRE_DATETIME
. Thẻ này dùng giá trị mã nhận dạng thẻ là 402. -
usageCountLimit
-
Tương ứng với thẻ uỷ quyền
Tag::USAGE_COUNT_LIMIT
. Thẻ này dùng giá trị mã nhận dạng thẻ là 405. -
userSecureId
-
Tương ứng với thẻ uỷ quyền
Tag::USER_SECURE_ID
. Thẻ này dùng giá trị mã nhận dạng thẻ là 502. -
noAuthRequired
-
Tương ứng với thẻ uỷ quyền
Tag::NO_AUTH_REQUIRED
. Thẻ này dùng giá trị mã nhận dạng thẻ là 503. -
userAuthType
-
Tương ứng với thẻ uỷ quyền
Tag::USER_AUTH_TYPE
. Thẻ này dùng giá trị mã nhận dạng thẻ là 504. -
authTimeout
-
Tương ứng với thẻ uỷ quyền
Tag::AUTH_TIMEOUT
. Thẻ này dùng giá trị mã nhận dạng thẻ là 505. -
allowWhileOnBody
-
Tương ứng với thẻ uỷ quyền
Tag::ALLOW_WHILE_ON_BODY
. Thẻ này dùng giá trị mã nhận dạng thẻ là 506.Cho phép sử dụng khoá sau khoảng thời gian chờ xác thực nếu người dùng vẫn đeo thiết bị trên người. Lưu ý rằng cảm biến an toàn trên cơ thể sẽ xác định xem người dùng có mang thiết bị trên cơ thể hay không.
-
trustedUserPresenceReq
-
Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 3.
Tương ứng với thẻ uỷ quyền
Tag::TRUSTED_USER_PRESENCE_REQUIRED
. Thẻ này dùng giá trị mã nhận dạng thẻ là 507.Chỉ định rằng khoá này chỉ sử dụng được nếu người dùng đã cung cấp bằng chứng về sự hiện diện thực tế. Sau đây là một số ví dụ:
- Đối với khoá StrongBox, nút phần cứng được gắn cứng vào một ghim trên thiết bị StrongBox.
- Đối với khoá TEE, quy trình xác thực vân tay sẽ cung cấp bằng chứng về sự hiện diện, miễn là TEE có quyền kiểm soát độc quyền đối với trình quét và thực hiện quy trình so khớp vân tay.
-
trustedConfirmationReq
-
Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 3.
Tương ứng với thẻ uỷ quyền
Tag::TRUSTED_CONFIRMATION_REQUIRED
. Thẻ này dùng giá trị mã nhận dạng thẻ là 508.Chỉ định rằng khoá này chỉ sử dụng được nếu người dùng xác nhận dữ liệu đã được ký bằng mã xác thực phê duyệt. Để biết thêm thông tin về cách yêu cầu người dùng xác nhận, hãy xem bài viết Xác nhận bảo vệ của Android.
Lưu ý: Thẻ này chỉ áp dụng cho các khoá sử dụng mục đích
SIGN
. -
unlockedDeviceReq
-
Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 3.
Tương ứng với thẻ uỷ quyền
Tag::UNLOCKED_DEVICE_REQUIRED
. Thẻ này dùng giá trị mã nhận dạng thẻ là 509. -
creationDateTime
-
Tương ứng với thẻ uỷ quyền
Tag::CREATION_DATETIME
. Thẻ này dùng giá trị mã nhận dạng thẻ là 701. -
origin
-
Tương ứng với thẻ uỷ quyền
Tag::ORIGIN
. Thẻ này dùng giá trị mã nhận dạng thẻ là 702. -
rootOfTrust
-
Tương ứng với thẻ uỷ quyền
Tag::ROOT_OF_TRUST
. Thẻ này dùng giá trị mã nhận dạng thẻ là 704.Để biết thêm thông tin, hãy xem phần mô tả cấu trúc dữ liệu RootOfTrust.
-
osVersion
-
Tương ứng với thẻ uỷ quyền
Tag::OS_VERSION
. Thẻ này dùng giá trị mã nhận dạng thẻ là 705.Phiên bản hệ điều hành Android liên kết với Keymaster, được chỉ định dưới dạng số nguyên gồm 6 chữ số. Ví dụ: phiên bản 8.1.0 được biểu thị là 080100.
Chỉ Keymaster phiên bản 1.0 trở lên mới có giá trị này trong danh sách uỷ quyền.
-
osPatchLevel
-
Tương ứng với thẻ uỷ quyền
Tag::PATCHLEVEL
. Thẻ này dùng giá trị mã nhận dạng thẻ là 706.Tháng và năm liên quan đến bản vá bảo mật đang được sử dụng trong Keymaster, được chỉ định dưới dạng số nguyên gồm 6 chữ số. Ví dụ: bản vá tháng 8/2018 được biểu thị là 201808.
Chỉ Keymaster phiên bản 1.0 trở lên mới có giá trị này trong danh sách uỷ quyền.
-
attestationApplicationId
-
Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 2.
Tương ứng với thẻ uỷ quyền
Tag::ATTESTATION_APPLICATION_ID
. Thẻ này dùng giá trị mã nhận dạng thẻ là 709.Để biết thêm thông tin, hãy xem phần mô tả cấu trúc dữ liệu AttestationApplicationId.
-
attestationIdBrand
-
Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 2.
Tương ứng với thẻ uỷ quyền
Tag::ATTESTATION_ID_BRAND
. Thẻ này dùng giá trị mã nhận dạng thẻ là 710. -
attestationIdDevice
-
Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 2.
Tương ứng với thẻ uỷ quyền
Tag::ATTESTATION_ID_DEVICE
. Thẻ này dùng giá trị mã nhận dạng thẻ là 711. -
attestationIdProduct
-
Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 2.
Tương ứng với thẻ uỷ quyền
Tag::ATTESTATION_ID_PRODUCT
. Thẻ này dùng giá trị mã nhận dạng thẻ là 712. -
attestationIdSerial
-
Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 2.
Tương ứng với thẻ uỷ quyền
Tag::ATTESTATION_ID_SERIAL
. Thẻ này dùng giá trị mã nhận dạng thẻ là 713. -
attestationIdImei
-
Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 2.
Tương ứng với thẻ uỷ quyền
Tag::ATTESTATION_ID_IMEI
. Thẻ này dùng giá trị mã nhận dạng thẻ là 714. -
attestationIdMeid
-
Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 2.
Tương ứng với thẻ uỷ quyền
Tag::ATTESTATION_ID_MEID
. Thẻ này dùng giá trị mã nhận dạng thẻ là 715. -
attestationIdManufacturer
-
Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 2.
Tương ứng với thẻ uỷ quyền
Tag::ATTESTATION_ID_MANUFACTURER
. Thẻ này dùng giá trị mã nhận dạng thẻ là 716. -
attestationIdModel
-
Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 2.
Tương ứng với thẻ uỷ quyền
Tag::ATTESTATION_ID_MODEL
. Thẻ này dùng giá trị mã nhận dạng thẻ là 717. -
vendorPatchLevel
-
Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 3.
Tương ứng với thẻ uỷ quyền
Tag::VENDOR_PATCHLEVEL
. Thẻ này dùng giá trị mã nhận dạng thẻ là 718.Chỉ định cấp bản vá bảo mật hình ảnh nhà cung cấp phải được cài đặt trên thiết bị để sử dụng khoá này. Giá trị xuất hiện ở dạng YYYYMMDD, biểu thị ngày của bản vá bảo mật nhà cung cấp. Ví dụ: nếu khoá được tạo trên một thiết bị Android đã cài đặt bản vá bảo mật ngày 1/8/2018 của nhà cung cấp, thì giá trị này sẽ là 20180801.
-
bootPatchLevel
-
Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 3.
Tương ứng với thẻ uỷ quyền
Tag::BOOT_PATCHLEVEL
. Thẻ này dùng giá trị mã nhận dạng thẻ là 719.Chỉ định cấp bản vá bảo mật hình ảnh nhân hệ điều hành phải được cài đặt trên thiết bị để sử dụng khoá này. Giá trị xuất hiện ở dạng YYYYMMDD, biểu thị ngày của bản vá bảo mật hệ thống. Ví dụ: nếu khoá được tạo trên một thiết bị Android đã cài đặt bản vá bảo mật ngày 5/8/2018 của hệ thống, thì giá trị này sẽ là 20180805.
-
deviceUniqueAttestation
-
Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 4.
Tương ứng với thẻ uỷ quyền
Tag::DEVICE_UNIQUE_ATTESTATION
. Thẻ này dùng giá trị mã nhận dạng thẻ là 720. -
attestationIdSecondImei
-
Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 300.
Tương ứng với thẻ uỷ quyền
Tag::ATTESTATION_ID_SECOND_IMEI
. Thẻ này dùng giá trị mã nhận dạng thẻ là 723. -
moduleHash
-
Chỉ trình bày trong quy trình chứng thực khoá phiên bản >= 400.
Tương ứng với thẻ uỷ quyền
Tag::MODULE_HASH
. Thẻ này dùng giá trị mã nhận dạng thẻ là 724.
Các trường RootOfTrust
-
verifiedBootKey
- Một hàm băm bảo mật của khoá công khai dùng để xác minh tính toàn vẹn và tính xác thực của tất cả mã thực thi trong quá trình khởi động thiết bị như một phần của tính năng Khởi động đã xác minh. Bạn nên sử dụng SHA-256.
-
deviceLocked
-
Trình tải khởi động của thiết bị có bị khoá hay không.
true
có nghĩa là thiết bị đã khởi động một hình ảnh đã ký mà Xác minh quy trình khởi động đã xác minh thành công. -
verifiedBootState
- Trạng thái Xác minh quy trình khởi động của thiết bị.
-
verifiedBootHash
- Chuỗi đại diện của tất cả dữ liệu được bảo vệ bằng tính năng Xác minh quy trình khởi động. Đối với các thiết bị sử dụng chế độ triển khai tham chiếu Xác minh quy trình khởi động trên Android, trường này chứa chuỗi đại diện VBMeta.
Giá trị VerifiedBootState
Giá trị | Trạng thái khởi động tương ứng | Ý nghĩa |
---|---|---|
Verified |
GREEN |
Toàn bộ chuỗi tin cậy mở rộng từ một gốc tin cậy được bảo vệ bằng phần cứng đến trình tải khởi động và tất cả các phân vùng được Xác minh quy trình khởi động xác minh.
Ở trạng thái này, trường verifiedBootKey chứa hàm băm của gốc tin cậy được nhúng, đây là chứng chỉ được nhà sản xuất thiết bị nhúng vào ROM của thiết bị tại nhà máy. |
SelfSigned |
YELLOW |
Tương tự như Verified , ngoại trừ việc quy trình xác minh được thực hiện bằng cách sử dụng gốc tin cậy do người dùng định cấu hình thay vì gốc tin cậy do nhà sản xuất nhúng trong nhà máy.
Ở trạng thái này, trường verifiedBootKey chứa hàm băm của khoá công khai do người dùng định cấu hình. |
Unverified |
ORANGE |
Trình tải khởi động của thiết bị đã mở khoá nên không thể thiết lập chuỗi tin cậy. Người dùng có thể tuỳ ý sửa đổi thiết bị, vì vậy, người dùng phải xác minh tính toàn vẹn của thiết bị theo cách khác. Ở trạng thái này, trường verifiedBootKey chứa 32 byte số 0. |
Failed |
RED |
Không xác minh được thiết bị. Ở trạng thái này, không có gì đảm bảo về nội dung của các trường RootOfTrust khác. |
AttestationApplicationId
Trường này phản ánh niềm tin của nền tảng Android đối với việc ứng dụng nào được phép sử dụng tài liệu khoá bí mật theo quy trình chứng thực. Mã nhận dạng có thể chứa nhiều gói khi và chỉ khi nhiều gói dùng chung một UID. Trường AttestationApplicationId
trong AuthorizationList
thuộc loại OCTET_STRING
và được định dạng theo giản đồ ASN.1 sau đây:
AttestationApplicationId ::= SEQUENCE { package_infos SET OF AttestationPackageInfo, signature_digests SET OF OCTET_STRING, } AttestationPackageInfo ::= SEQUENCE { package_name OCTET_STRING, version INTEGER, }
package_infos
-
Một tập hợp gồm các đối tượng
AttestationPackageInfo
, mỗi đối tượng cung cấp số phiên bản và tên của gói. signature_digests
-
Một tập hợp gồm các chuỗi đại diện SHA-256 về chứng chỉ ký của ứng dụng. Một ứng dụng có thể có nhiều chuỗi chứng chỉ khoá ký. Đối với mỗi chuỗi, leaf certificate sẽ được phân tích và đặt vào trường
signature_digests
. Tên trường này gây nhầm lẫn vì dữ liệu được phân tích là chứng chỉ ký của ứng dụng chứ không phải chữ ký ứng dụng, vì trường này được đặt tên cho lớpSignature
do một lệnh gọi đếngetPackageInfo()
trả về. Đoạn mã sau đây cho thấy một tập ví dụ:{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}
Tiện ích thông tin cấp phép
Tiện ích thông tin cấp phép có OID 1.3.6.1.4.1.11129.2.1.30
. Tiện ích này cung cấp thông tin mà máy chủ cấp phép biết được về thiết bị.
Lược đồ
Tiện ích này tuân theo giản đồ CDDL sau đây:
{ 1 : int, ; certificates issued 4 : string, ; validated attested entity (STRONG_BOX/TEE) }
Bản đồ này không được tạo phiên bản và có thể thêm các trường tuỳ chọn mới.
-
certs_issued
-
Số lượng chứng chỉ ước tính được cấp cho thiết bị trong 30 ngày qua. Giá trị này có thể dùng làm dấu hiệu cho hành vi có thể xảy ra nếu giá trị đó lớn hơn mức trung bình theo một số thứ tự về cường độ.
-
validated_attested_entity
-
Thực thể được chứng thực đã xác thực là một chuỗi mô tả loại thiết bị mà máy chủ cung cấp đã xác nhận là được chứng thực. Ví dụ:
STRONG_BOX
hoặcTEE
.
Khoá chứng thực
Hai khoá (một khoá RSA và một khoá ECDSA) cùng các chuỗi chứng chỉ tương ứng được cấp phép an toàn vào thiết bị.
Android 12 giới thiệu tính năng Cung cấp khoá từ xa và Android 13 yêu cầu các thiết bị triển khai tính năng này. Remote Key Provisioning cung cấp cho các thiết bị tại hiện trường chứng chỉ chứng thực ECDSA P256 cho mỗi ứng dụng. Các chứng chỉ này có thời hạn ngắn hơn so với chứng chỉ được cấp phép tại nhà máy.
Giá trị nhận dạng duy nhất
Mã nhận dạng duy nhất là một giá trị 128 bit giúp xác định thiết bị, nhưng chỉ trong một khoảng thời gian giới hạn. Giá trị được tính bằng:
HMAC_SHA256(T || C || R, HBK)
Trong trường hợp:
T
là "giá trị bộ đếm tạm thời", được tính bằng cách chia giá trị củaTag::CREATION_DATETIME
cho 2592000000, loại bỏ mọi số dư.T
thay đổi sau mỗi 30 ngày (2592000000 = 30 * 24 * 60 * 60 * 1000).C
là giá trị củaTag::APPLICATION_ID
R
là 1 nếuTag::RESET_SINCE_ID_ROTATION
có trong tham số attest_params cho lệnh gọi attest_key hoặc 0 nếu thẻ không có.HBK
là một bí mật duy nhất được liên kết với phần cứng mà Môi trường thực thi đáng tin cậy biết và không bao giờ tiết lộ. Khoá bí mật chứa ít nhất 128 bit entropy và là duy nhất đối với từng thiết bị (có thể chấp nhận tính duy nhất xác suất với 128 bit entropy). HBK phải được lấy từ khoá kết hợp thông qua HMAC hoặc AES_CMAC.
Cắt ngắn đầu ra HMAC_SHA256 thành 128 bit.
Nhiều số IMEI
Android 14 bổ sung chế độ hỗ trợ cho nhiều mã nhận dạng thiết bị di động quốc tế (IMEI) trong bản ghi Chứng thực khoá Android. OEM có thể triển khai tính năng này bằng cách thêm một thẻ KeyMint cho IMEI thứ hai. Ngày càng có nhiều thiết bị có nhiều đài phát sóng di động và các OEM hiện có thể hỗ trợ những thiết bị có 2 số IMEI.
Các OEM phải có một số IMEI thứ hai (nếu có trên thiết bị của họ) để được cung cấp cho (các) quy trình triển khai KeyMint để các quy trình triển khai đó có thể chứng thực số IMEI thứ hai theo cách mà chúng chứng thực số IMEI đầu tiên.
Chứng thực danh tính
Android 8.0 có hỗ trợ không bắt buộc cho chứng thực mã nhận dạng đối với các thiết bị có Keymaster 3. Chứng thực mã nhận dạng cho phép thiết bị cung cấp bằng chứng về giá trị nhận dạng phần cứng, chẳng hạn như số sê-ri hoặc IMEI. Mặc dù là một tính năng không bắt buộc, nhưng bạn nên cung cấp khả năng hỗ trợ cho tất cả các quy trình triển khai Keymaster 3 vì khả năng chứng minh danh tính của thiết bị cho phép các trường hợp sử dụng như cấu hình từ xa không cần thao tác thực sự an toàn hơn (vì phía từ xa có thể chắc chắn rằng đang giao tiếp với đúng thiết bị, chứ không phải thiết bị giả mạo danh tính).
Chứng thực mã nhận dạng hoạt động bằng cách tạo bản sao của giá trị nhận dạng phần cứng của thiết bị mà chỉ TEE mới có thể truy cập trước khi thiết bị rời khỏi nhà máy. Người dùng có thể mở khoá trình tải khởi động của thiết bị và thay đổi phần mềm hệ thống cũng như các giá trị nhận dạng do các khung Android báo cáo. Các bản sao của giá trị nhận dạng do TEE nắm giữ không thể bị thao túng theo cách này, đảm bảo rằng quy trình chứng thực mã thiết bị chỉ chứng thực giá trị nhận dạng phần cứng ban đầu của thiết bị, từ đó ngăn chặn các nỗ lực giả mạo.
Giao diện API chính để chứng thực mã nhận dạng được xây dựng dựa trên cơ chế chứng thực khoá hiện có được giới thiệu cùng với Keymaster 2. Khi yêu cầu một chứng chỉ chứng thực cho khoá do Keymaster nắm giữ, phương thức gọi có thể yêu cầu đưa các giá trị nhận dạng phần cứng của thiết bị vào siêu dữ liệu của chứng chỉ chứng thực. Nếu khoá được giữ trong TEE, thì chứng chỉ sẽ liên kết trở lại một gốc tin cậy đã biết. Người nhận chứng chỉ như vậy có thể xác minh rằng chứng chỉ và nội dung của chứng chỉ (bao gồm cả mã nhận dạng phần cứng) được TEE ghi. Khi được yêu cầu đưa mã nhận dạng phần cứng vào chứng chỉ chứng thực, TEE chỉ chứng thực cho các mã nhận dạng được lưu trữ trong bộ nhớ của nó, như được điền sẵn tại nhà máy.
Thuộc tính bộ nhớ
Bộ nhớ lưu trữ mã nhận dạng của thiết bị cần có các thuộc tính sau:
- Các giá trị bắt nguồn từ giá trị nhận dạng ban đầu của thiết bị sẽ được sao chép vào bộ nhớ trước khi thiết bị rời khỏi nhà máy.
- Phương thức
destroyAttestationIds()
có thể huỷ vĩnh viễn bản sao này của dữ liệu bắt nguồn từ mã nhận dạng. Huỷ vĩnh viễn có nghĩa là dữ liệu sẽ bị xoá hoàn toàn nên không có quy trình nào khác được thực hiện trên thiết bị (kể cả đặt lại về trạng thái ban đầu) có thể khôi phục dữ liệu đó. Điều này đặc biệt quan trọng đối với những thiết bị mà người dùng đã mở khoá trình tải khởi động và thay đổi phần mềm hệ thống cũng như sửa đổi các giá trị nhận dạng do các khung Android trả về. - Các cơ sở RMA phải có khả năng tạo bản sao mới của dữ liệu bắt nguồn từ mã nhận dạng phần cứng. Bằng cách này, thiết bị trải qua quy trình RMA có thể thực hiện chứng thực mã nhận dạng một lần nữa. Cơ chế mà các cơ sở RMA sử dụng phải được bảo vệ để người dùng không thể tự gọi cơ chế đó, vì điều này sẽ cho phép họ nhận được chứng thực về các mã nhận dạng giả mạo.
- Không có mã nào khác ngoài ứng dụng đáng tin cậy Keymaster trong TEE có thể đọc dữ liệu bắt nguồn từ mã nhận dạng được lưu trữ.
- Bộ nhớ có khả năng chống giả mạo: Nếu nội dung của bộ nhớ đã bị sửa đổi, TEE sẽ coi nội dung đó như thể các bản sao của nội dung đã bị phá huỷ và từ chối mọi nỗ lực chứng thực mã nhận dạng. Điều này được triển khai bằng cách ký hoặc MAC bộ nhớ như mô tả bên dưới.
- Bộ nhớ này không lưu trữ giá trị nhận dạng ban đầu. Vì chứng thực mã nhận dạng liên quan đến một thử thách, nên phương thức gọi luôn cung cấp các giá trị nhận dạng cần được chứng thực. TEE chỉ cần xác minh rằng các giá trị này khớp với các giá trị ban đầu. Việc lưu trữ các hàm băm bảo mật của các giá trị ban đầu thay vì các giá trị cho phép xác minh này.
Xây dựng
Để tạo một phương thức triển khai có các thuộc tính được liệt kê ở trên, hãy lưu trữ các giá trị có nguồn gốc từ mã nhận dạng trong cấu trúc S sau. Không lưu trữ các bản sao khác của giá trị nhận dạng, ngoại trừ những nơi thông thường trong hệ thống mà chủ sở hữu thiết bị có thể sửa đổi bằng cách root:
S = D || HMAC(HBK, D)
trong đó:
D = HMAC(HBK, ID1) || HMAC(HBK, ID2) || ... || HMAC(HBK, IDn)
HMAC
là cấu trúc HMAC có hàm băm bảo mật thích hợp (nên dùng SHA-256)HBK
là một khoá liên kết với phần cứng và không được dùng cho bất kỳ mục đích nào khácID1...IDn
là các giá trị mã nhận dạng ban đầu; mối liên kết của một giá trị cụ thể với một chỉ mục cụ thể phụ thuộc vào quá trình triển khai, vì các thiết bị khác nhau có số lượng giá trị nhận dạng khác nhau||
biểu thị phép nối
Vì đầu ra HMAC có kích thước cố định, nên không cần tiêu đề hoặc cấu trúc nào khác để có thể tìm thấy các hàm băm mã nhận dạng riêng lẻ hoặc HMAC của D. Ngoài việc kiểm tra các giá trị được cung cấp để thực hiện chứng thực, các hoạt động triển khai cần xác thực S bằng cách trích xuất D từ S, tính toán HMAC(HBK, D) và so sánh với giá trị trong S để xác minh rằng không có mã nhận dạng riêng lẻ nào bị sửa đổi/hỏng. Ngoài ra, các quy trình triển khai phải sử dụng các phép so sánh thời gian không đổi cho tất cả các phần tử mã nhận dạng riêng lẻ và quy trình xác thực S. Thời gian so sánh phải không đổi, bất kể số lượng mã nhận dạng được cung cấp và kết quả khớp chính xác của bất kỳ phần nào trong bài kiểm thử.
Giá trị nhận dạng phần cứng
Quy trình chứng thực mã nhận dạng hỗ trợ các mã nhận dạng phần cứng sau:
- Tên thương hiệu, do
Build.BRAND
trả về trong Android - Tên thiết bị, do
Build.DEVICE
trả về trong Android - Tên sản phẩm, do
Build.PRODUCT
trả về trong Android - Tên nhà sản xuất, do
Build.MANUFACTURER
trả về trong Android - Tên kiểu thiết bị, do
Build.MODEL
trả về trong Android - Số sê-ri
- Số IMEI của tất cả các thiết bị vô tuyến
- MEID của tất cả các đài phát
Để hỗ trợ chứng thực mã nhận dạng thiết bị, thiết bị sẽ chứng thực các giá trị nhận dạng này. Tất cả các thiết bị chạy Android đều có 6 API đầu tiên và đây là những API cần thiết để tính năng này hoạt động. Nếu có bất kỳ đài vô tuyến di động tích hợp nào, thiết bị cũng phải hỗ trợ chứng thực cho số IMEI và/hoặc MEID của đài vô tuyến.
Bạn có thể yêu cầu chứng thực mã nhận dạng bằng cách thực hiện chứng thực khoá và đưa giá trị nhận dạng thiết bị vào để chứng thực trong yêu cầu. Giá trị nhận dạng được gắn thẻ là:
ATTESTATION_ID_BRAND
ATTESTATION_ID_DEVICE
ATTESTATION_ID_PRODUCT
ATTESTATION_ID_MANUFACTURER
ATTESTATION_ID_MODEL
ATTESTATION_ID_SERIAL
ATTESTATION_ID_IMEI
ATTESTATION_ID_MEID
Giá trị nhận dạng cần chứng thực là một chuỗi byte được mã hoá UTF-8. Định dạng này cũng áp dụng cho mã nhận dạng bằng số. Mỗi giá trị nhận dạng cần chứng thực được biểu thị dưới dạng một chuỗi được mã hoá UTF-8.
Nếu thiết bị không hỗ trợ chứng thực mã nhận dạng (hoặc destroyAttestationIds()
đã được gọi trước đó và thiết bị không thể chứng thực mã nhận dạng của mình nữa), thì mọi yêu cầu chứng thực khoá bao gồm một hoặc nhiều thẻ này sẽ không thành công với ErrorCode::CANNOT_ATTEST_IDS
.
Nếu thiết bị hỗ trợ chứng thực mã nhận dạng và một hoặc nhiều thẻ nêu trên đã được đưa vào yêu cầu chứng thực khoá, thì TEE sẽ xác minh mã nhận dạng được cung cấp cùng với từng thẻ khớp với bản sao mã nhận dạng phần cứng của thẻ đó. Nếu một hoặc nhiều giá trị nhận dạng không khớp, toàn bộ chứng thực sẽ thất bại với ErrorCode::CANNOT_ATTEST_IDS
. Bạn có thể cung cấp cùng một thẻ nhiều lần. Ví dụ: điều này có thể hữu ích khi chứng thực IMEI: Một thiết bị có thể có nhiều đài phát với nhiều IMEI. Yêu cầu chứng thực sẽ hợp lệ nếu giá trị được cung cấp cho mỗi ATTESTATION_ID_IMEI
khớp với một trong các đài phát của thiết bị. Điều này cũng áp dụng cho tất cả các thẻ khác.
Nếu chứng thực thành công, các mã nhận dạng được chứng thực sẽ được thêm vào tiện ích chứng thực (OID 1.3.6.1.4.1.11129.2.1.17) của chứng chỉ chứng thực đã phát hành, bằng cách sử dụng sơ đồ từ trên. Các thay đổi trong giản đồ chứng thực Keymaster 2 được in đậm, kèm theo bình luận.
Java API
Phần này chỉ mang tính chất cung cấp thông tin. Người triển khai Keymaster không triển khai cũng như không sử dụng API Java. Thông tin này được cung cấp để giúp người triển khai hiểu cách các ứng dụng sử dụng tính năng này. Các thành phần hệ thống có thể sử dụng nó theo cách khác, đó là lý do tại sao phần này không được coi là chuẩn mực.